Doc = Doc:: head:{Header} body:Body /ws
Header = Header:: "header" attrs:{ kv */ ws } /ws
-Body = sections:Section*/ws
-Section = { section:: SectionHeader Paragraph* /ws }
+Body = Body:: sections:(Section*/ws)
+Section = { Section:: header:SectionHeader paragraphs:Paragraph* /ws }
SectionHeader = "==" SectionHeaderBody "=="
SectionHeaderBody = "=" SectionHeaderBody "="
- > !ws text !ws
+ > !ws (Chars:: text:alphanum++) !ws
sp = " "**
blank = !sp "\n" !sp "\n" !ws
+
kv = kv:: key:word "=" val:text /ws
wp = w++
num = [0-9]++
-Paragraph = blockquote:: { "\"\"" !ws text }
- > hr:: { "---" "-"* }
- > p:: { text }
+Paragraph = Blockquote:: { "\"\" " text }
+ > HR:: { "---" "-"* }
+ > { P:: t:text }
onums = nums !(". "|") ")
any = ~[]*
-uli = li:: "* " (!ws text &~ any (oli|uli))
-oli = li:: ("# "|onums) (!ws text &~ any (oli|uli))
+uli = "* " (!ws text &~ any (oli|uli))
+oli = !("# "|onums) (!ws text &~ any (oli|uli))
text = Item
Itemx = !ws Item
| ()
Item = blockquote
- > "[]":: { ul:: uli+/ws } Itemx
- | "[]":: { ol:: oli+/ws } Itemx
+ > "[]":: { UL:: uli+/ws } Itemx
+ | "[]":: { OL:: oli+/ws } Itemx
> "[]":: pre Itemx
> "[]":: link Itemx
> "[]":: structured Itemx
> "[]":: styled Itemx
- > "[]":: (Chars:: alphanum++) Itemx
- > "[]":: qtext Itemx
+ > "[]":: (Chars:: text:alphanum++) Itemx
+ > "[]":: "\"" text "\"" Itemx
> "[]":: symbol Itemx
> "[]":: (Symbol:: sym++) Itemx
> "[]":: Paragraph Itemx
-blockquote = blockquote:: "\"\"" text "\"\""
- | blockquote:: "\"\"" block
+blockquote = Blockquote:: "\"\"" text "\"\""
+ | Blockquote:: "\"\"" block
-qtext = quoted:: "\"" text "\""
-pre = verbatim:: "[verbatim]" { ~[]+ } /ws // FIXME doesn't work
-
-styled = underline:: "__" text "__"
- | footnote:: "((" text "))"
- | tt:: "[[" text "]]"
- | citation:: "[" word "]"
- | strikethrough:: "!!" text "!!"
- | superscript:: "^^" (word|block)
- | subscript:: ",," (word|block)
- | smallcap:: "\\sc" block
- | bold:: "++" text "++"
- | keyword:: "!" (word|block)
+pre = Verbatim:: "[verbatim]" { ~[]+ } /ws // FIXME doesn't work
+
+styled = Underline:: "__" text "__"
+ | Footnote:: "((" text "))"
+ | TT:: "[[" text "]]"
+ | Citation:: "[" word "]"
+ | Strikethrough:: "!!" text "!!"
+ | Superscript:: "^^" (word|block)
+ | Subscript:: ",," (word|block)
+ | Smallcap:: "\\sc" block
+ | Bold:: "++" text "++"
+ | Keyword:: "!" (word|block)
| Italic:: "**" text "**"
block = { text }
-link = link:: text:({ text }) "->" href:(url|email)
- > link:: text:alphanum++ !ws "->" href:(url|email)
+link = Link:: text:({ text }) "->" href:(url|email)
+ > Link:: text:alphanum++ !ws "->" href:(url|email)
structured = command & "\\" [a-zA-Z0-9]++ block?
> glyph
> email
> url
-glyph = euro:: "(e)" | "(r)" | "(c)" | "(tm)" | "--" | "..."
+glyph = Euro:: "(e)" | "(r)" | "(c)" | "(tm)" | "--" | "..."
-command = today:: "\\today"
- | bre:: "\\br"
+command = Today:: "\\today"
+ | LineBreak:: "\\br"
// URLs //////////////////////////////////////////////////////////////////////////////
urlc = [a-zA-Z0-9;/?:&=$\-_.+@]
urlv = urlc | [%]
urlchar = urlc
- | "%":: "%" [0-9] [0-9]
+ | urlescape:: "%" [0-9] [0-9]
url = "mailto" ":" email -> ~urlv
- > method:method "://" url_login? host:host port:(":" nums)? path:("/" urlpath)? -> ~urlv
-url_login = login:: username (":" password) "@"
+ > URL:: method:method "://" login:url_login? host:host port:(":" nums)? path:("/" urlpath)? -> ~urlv
+url_login = Login:: username:username password:(":" password) "@"
method = [+\-.a-z0-9]+
domain = (part +/ ".") -> ~"."
part = [a-zA-Z0-9\-]++
// interesting use of boolean grammars
// &~ ([\-0-9] ~[]* | ~[]* [\-0-9])
-email = user:username "@" host:host -> ~[.]
+email = Email:: user:username "@" host:host -> ~[.]
nums = [0-9]++
host = IP:: nums "." nums "." nums "." nums
| DNS:: domain
quoted = "\"" ((~[\"\\] | escaped)+) "\""
| "":: "\"\""
-escaped = "\n":: "\\n"
- | "\r":: "\\r"
+escaped = lf:: "\\n"
+ | cr:: "\\r"
| "\\" ~[nr]