// 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 = Doc:: head:{Header} body:Body /ws Header = Header:: "header" attrs:{ kv */ ws } /ws Body = Body:: sections:(Section*/ws) Section = { Section:: header:SectionHeader paragraphs:Paragraph* /ws } SectionHeader = "==" SectionHeaderBody "==" SectionHeaderBody = "=" SectionHeaderBody "=" > !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:: { "\"\" " text } > HR:: { "---" "-"* } > { P:: t:text } onums = nums !(". "|") ") any = ~[]* 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 > "[]":: pre Itemx > "[]":: link Itemx > "[]":: structured Itemx > "[]":: styled Itemx > "[]":: (Chars:: text:alphanum++) Itemx > "[]":: "\"" text "\"" Itemx > "[]":: symbol Itemx > "[]":: (Symbol:: sym++) Itemx > "[]":: Paragraph Itemx blockquote = Blockquote:: "\"\"" text "\"\"" | Blockquote:: "\"\"" 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) 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" ":" 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 = 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] //num = [0-9] alphanum = [a-zA-Z0-9] sym = ~[a-zA-Z0-9\ \r\n=\">]