// 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://... // // 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\ ] ////////////////////////////////////////////////////////////////////////////// s = top:: Doc Doc = doc:: {Header} Body /ws Header = header:: "header" { kv */ ws } /ws Body = body:: Section*/ws Section = { section:: SectionHeader Paragraph* /ws } SectionHeader = "==" SectionHeaderBody "==" SectionHeaderBody = "=" SectionHeaderBody "=" > !ws text !ws sp = " "** blank = !sp "\n" !sp "\n" !ws kv = kv1:: word "=" text /ws wp = w++ num = [0-9]++ Paragraph = blockquote:: { "\"\"" !ws text } > hr:: { "---" "-"* } > p:: { text } onums = nums !(". "|") ") any = ~[]* uli = li:: "* " (!ws text &~ any (oli|uli)) oli = li:: ("# "|onums) (!ws text &~ any (oli|uli)) // text = text:: Item Itemx = !ws Item | () Item = blockquote > "[]":: { ul:: uli+/ws } Itemx | "[]":: { ol:: oli+/ws } Itemx > "[]":: pre Itemx > "[]":: structured Itemx > "[]":: structuredx Itemx > "[]":: styled Itemx > "[]":: qtext Itemx > "[]":: (stringify:: alphanum++) Itemx > "[]":: symbol Itemx > "[]":: (stringify:: sym++) Itemx > "[]":: Paragraph Itemx blockquote = blockquote:: "\"\"" text "\"\"" | blockquote:: "\"\"" block qtext = quoted:: "\"" text "\"" pre = verbatim:: "[verbatim]" { ~[]+ } /ws // FIXME doesn't work styled = underline:: "__" text "__" | footnote:: "((" text "))" | ( tt:: "[[" text "]]" | citation:: "[" text "]" ) | strikethrough:: "!!" text "!!" | superscript:: "^^" (word|block) | subscript:: ",," (word|block) | smallcap:: "\\sc" block | bold:: "**" text "**" | keyword:: "!" (word|block) > it:: "*" text "*" // block = { text } structured = link:: { text } "->" (url|email) //> alphanum++ "->" (url|email) => link structuredx = glyph > email > url glyph = "(r)" | "(c)" | "(tm)" | "--" // euro symbol? | today:: "\\today" -> ~[a-z] // 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 = stringify:: [a-zA-Z0-9;/?:&=$\-_.+]++ password = stringify:: [a-zA-Z0-9;/?:&=$\-_.+]++ urlchar = [a-zA-Z0-9;/?:&=$\-_.+@] | "%":: "%" [0-9] [0-9] url = "mailto" ":" email > url:: method "://" url_login? host (":" nums)? ("/" urlpath)? url_login = login:: username (":" password) "@" method = stringify:: [+\-.a-z0-9]+ domain = domain:: (part +/ ".") -> ~"." part = stringify:: [a-zA-Z0-9\-]++ // interesting use of boolean grammars // &~ ([\-0-9] ~[]* | ~[]* [\-0-9]) email = emailaddr:: username "@" host -> ~[.] nums = stringify:: [0-9]++ host = ip:: nums "." nums "." nums "." nums | domain // Tokens /////////////////////////////////////////////////////////////////// word = stringify:: alphanum++ | quoted quoted = "\"" ((~[\"\\] | escaped)+) "\"" | "":: "\"\"" 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=\">]