-x::="x"
+x ="x"
// interactions between !=> and &~ mean that I need to rethink the chartage
// indentation styling...
// literal blocks [[need to ignore bracing]] double-colon style?
// image
// figures
+// "reference-style" links
+//
+// this[1] is fun
+//
+// [1] http://...
+//
+
+// consider ++bold++ and **italic**?
+// \br
+// nonbreaking text?
+// ellipsis detection (...)
+// degree: 15^o
+// Arrows: <- -> => <= <->
+
+// textblocks:
+// - attention, caution, danger, error, hint, important, note, tip, warning
+// definition
+// sidebar
+// figure-with-caption
+// epigraph (end-of-chapter note)
+// compound paragraph (??)
+// csv-table?
+// table of contents
+// header, footer
+// #include
+
+// simple macros (#define) (\define)
+// today's date
+
+// table representation
+//
+// \table
+// a bbb c
+// ddd e
+//
+// [a] ...
+// [b] ...
+// [c] ...
+
// FIXME: these have to go at the top so they have their dropAll bit set before PreSequence.build...
-ws !::= w**
-w !::= [\r\n\ ]
-nw ::= ~[\r\n\ ]
+ws ! = w**
+w ! = [\r\n\ ]
+nw = ~[\r\n\ ]
//////////////////////////////////////////////////////////////////////////////
-s ::= Doc => top
+s = Doc => top
-Doc ::= {Header} Body /ws => doc
-Header ::= "header" { kv */ ws } /ws => header
-Body ::= Section*/ws => body
-Section ::= { SectionHeader Paragraph* /ws => section }
-SectionHeader ::= "==" SectionHeaderBody "=="
-SectionHeaderBody ::= "=" SectionHeaderBody "="
+Doc = {Header} Body /ws => doc
+Header = "header" { kv */ ws } /ws => header
+Body = Section*/ws => body
+Section = { SectionHeader Paragraph* /ws => section }
+SectionHeader = "==" SectionHeaderBody "=="
+SectionHeaderBody = "=" SectionHeaderBody "="
> ws text ws
-sp !::= " "**
-blank ::= sp "\n" sp "\n" ws
+sp ! = " "**
+blank = sp "\n" sp "\n" ws
-kv ::= word "=" text /ws => kv1
-wp !::= w++
-num !::= [0-9]++
-Paragraph ::= { "\"\"" ws text } => "blockquote"
- > uli+/ws => "ul"
- > { "# " text } => "ol"
- > { num " " ws text } => "ol"
+kv = word "=" text /ws => kv1
+wp ! = w++
+num ! = [0-9]++
+Paragraph = { "\"\"" ws text } => "blockquote"
> { "---" "-"* } => "hr"
> { text } => "p"
-uli ::= { "* " text } => "li"
-text ::= Item => text
-Itemx ::= ws Item
+onums ! = nums (". "|") ")
+any ! = ~[]*
+
+uli = "* " (ws text &~ any (oli|uli)) => "li"
+oli = ("# "|onums) (ws text &~ any (oli|uli)) => "li"
+
+text = Item => text
+Itemx = ws Item
| ()
-Item ::= blockquote
- > pre Itemx => []
- > structured Itemx => []
- > structuredx Itemx => []
- > styled Itemx => []
- > qtext Itemx => []
- > (alphanum++ => stringify) Itemx => []
- > symbol Itemx => []
- > (sym++ => stringify) Itemx => []
- > Paragraph => ""
- > Paragraph Itemx => []
-
-blockquote ::= "\"\"" text "\"\"" => "blockquote"
+Item = blockquote
+ > { uli+/ws => "ul" } Itemx => []
+ | { oli+/ws => "ol" } Itemx => []
+ > pre Itemx => []
+ > structured Itemx => []
+ > structuredx Itemx => []
+ > styled Itemx => []
+ > qtext Itemx => []
+ > (alphanum++ => stringify) Itemx => []
+ > symbol Itemx => []
+ > (sym++ => stringify) Itemx => []
+ > Paragraph Itemx => []
+
+blockquote = "\"\"" text "\"\"" => "blockquote"
| "\"\"" block => "blockquote"
-qtext ::= "\"" text "\"" => "quoted"
-pre ::= "[verbatim]" { ~[]+ } /ws => "verbatim" // FIXME doesn't work
+qtext = "\"" text "\"" => "quoted"
+pre = "[verbatim]" { ~[]+ } /ws => "verbatim" // FIXME doesn't work
-styled ::= "__" text "__" => underline
+styled = "__" text "__" => underline
| "((" text "))" => footnote
| ( "[[" text "]]" => tt
> "[" word "]" => citation
| "!" (word|block) => keyword
> "*" text "*" => it
-block ::= { text }
-structured ::= { text } "->" (url|email) => link
+block = { text }
+structured = { text } "->" (url|email) => link
//> alphanum++ "->" (url|email) => link
-structuredx ::= glyph
+structuredx = glyph
> email
> url
-glyph ::= "(r)" | "(c)" | "(tm)" | "--" // euro symbol?
+glyph = "(r)" | "(c)" | "(tm)" | "--" // euro symbol?
| "\\today" -> ~[a-z] => today
// subtypes of url (ftp, etc) as conjunctions, but the "master pattern"
// only gets parsed once
-urlpath ::= urlchar*
-username ::= [a-zA-Z0-9;/?:&=$\-_.+]++ => stringify
-password ::= [a-zA-Z0-9;/?:&=$\-_.+]++ => stringify
-urlchar ::= [a-zA-Z0-9;/?:&=$\-_.+@]
+urlpath = urlchar*
+username = [a-zA-Z0-9;/?:&=$\-_.+]++ => stringify
+password = [a-zA-Z0-9;/?:&=$\-_.+]++ => stringify
+urlchar = [a-zA-Z0-9;/?:&=$\-_.+@]
| "%" [0-9] [0-9] => "%"
-url ::= "mailto" ":" email
+url = "mailto" ":" email
> method "://" url_login? host (":" nums)? ("/" urlpath)? => "url"
-url_login ::= username (":" password) "@" => "login"
-method ::= [+\-.a-z0-9]+ => stringify
-domain ::= (part +/ ".") -> ~"." => domain
-part ::= [a-zA-Z0-9\-]++ => stringify
+url_login = username (":" password) "@" => "login"
+method = [+\-.a-z0-9]+ => stringify
+domain = (part +/ ".") -> ~"." => domain
+part = [a-zA-Z0-9\-]++ => stringify
// interesting use of boolean grammars
// &~ ([\-0-9] ~[]* | ~[]* [\-0-9])
-email ::= username "@" host -> ~[.] => emailaddr
-nums ::= [0-9]++ => stringify
-host ::= nums "." nums "." nums "." nums => "ip"
+email = username "@" host -> ~[.] => emailaddr
+nums = [0-9]++ => stringify
+host = nums "." nums "." nums "." nums => "ip"
| domain
// Tokens ///////////////////////////////////////////////////////////////////
-word ::= alphanum++ => stringify
+word = alphanum++ => stringify
| quoted
-quoted ::= "\"" ((~[\"\\] | escaped)+) "\""
+quoted = "\"" ((~[\"\\] | escaped)+) "\""
| "\"\"" => ""
-escaped ::= "\\n" => "\n"
+escaped = "\\n" => "\n"
| "\\r" => "\r"
| "\\" ~[nr]
// Chars ///////////////////////////////////////////////////////////////
-alpha ::= [a-zA-Z]
-//num ::= [0-9]
-alphanum ::= [a-zA-Z0-9]
-sym ::= ~[a-zA-Z0-9\ \r\n=\">]
+alpha = [a-zA-Z]
+//num = [0-9]
+alphanum = [a-zA-Z0-9]
+sym = ~[a-zA-Z0-9\ \r\n=\">]