// interactions between !=> and &~ mean that I need to rethink the chartage // indentation styling... // literal blocks [[need to ignore bracing]] double-colon style? // definition -- by prior line indentation, like headings in the original structured text // tables // dropcap // output formats: latex, contex, ps, pdf, html, man, txt, rfc // escapification // comment // math // image // figures // "reference-style" links // // this[1] is fun // // [1] http://... // // nonbreaking text? // 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) // 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\ ] ////////////////////////////////////////////////////////////////////////////// s = Doc Doc = head:Header body:Body /ws Header = H:: { "header" { KeyVal */ ws } /ws } Body = B:: {Section}*/ws Section = SectionHeader ws! (Paragraph Paragraph) SectionHeader = "==" SectionHeaderBody "==" SectionHeaderBody = "=" SectionHeaderBody "=" > ws! alphanum++ ws! sp = " "** blank = sp! "\n" sp! "\n" ws! KeyVal = key:word "=" val:text /ws wp = w++ num = [0-9]++ Paragraph = Blockquote:: { "\"\" " text } > HR:: { "---" "-"* } > P:: { text } onums = nums (". "|") ")! any = ~[]* uli = "* " (ws! text &~ any (oli|uli)!) oli = ("# "|onums)! (ws! text &~ any (oli|uli)!) text = Item Item*/ws = blockquote > { UL:: uli+/ws } | { OL:: oli+/ws } > pre > link > structured > styled > (Chars:: alphanum++) > "\"" text "\"" > (Symbol:: sym++) // > { Block:: text } blockquote = "adsfafewag" //blockquote = Blockquote:: "\"\"" (block | 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) | Italic:: "**" text "**" block = { text } link = LinkText:: text:({ text }) "->" href:(url|email) > LinkChars:: text:alphanum++ ws! "->" href:(url|email) structured = command & "\\" ([a-zA-Z0-9]++)! block? > glyph > email > url glyph = Euro:: "(e)" | "(r)" | "(c)" | "(tm)" | emdash:: "--" | "..." command = Today:: "\\today" | LineBreak:: "\\br" // URLs ////////////////////////////////////////////////////////////////////////////// // interesting opportunity to show off boolean grammars here: define other // subtypes of url (ftp, etc) as conjunctions, but the "master pattern" // only gets parsed once urlpath = urlchar* username = [a-zA-Z0-9;/?:&=$\-_.+]++ password = [a-zA-Z0-9;/?:&=$\-_.+]++ urlc = [a-zA-Z0-9;/?:&=$\-_.+@] urlv = urlc | [%] urlchar = urlc | urlescape:: "%" [0-9] [0-9] url = Mailto:: "mailto" ":" email -> ~urlv > 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 -> ~[.] nums = [0-9]++ host = IP:: nums "." nums "." nums "." nums | DNS:: domain // Tokens /////////////////////////////////////////////////////////////////// word = alphanum++ | quoted quoted = "\"" ((~[\"\\] | escaped)+) "\"" | "\"\"":: "\"\"" escaped = lf:: "\\n" | cr:: "\\r" | "\\" ~[nr] // Chars /////////////////////////////////////////////////////////////// alpha = [a-zA-Z] alphanum = [a-zA-Z0-9] sym = ~[a-zA-Z0-9\ \r\n=\">]