// 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... w = " " | "\n" | "\r" ws = "()":: w** // | "()":: w** "#" (~[\n])* "\n" ws nw = ~[\r\n\ ] ////////////////////////////////////////////////////////////////////////////// s = Doc Doc = head:Header ws! body:Body Header = { "\\header" { KeyVal */ ws } /ws } Body = { Section } */ws Section = SectionHeader ws! Paragraph* SectionHeader = "==" SectionHeaderBody "==" SectionHeaderBody = "=" SectionHeaderBody "=" > ws! text ws! sp = " "** blank = sp! "\n" sp! "\n" ws! KeyVal = key:bareword "=" val:text /ws wp = w++ num = [0-9]++ Paragraph = { Blockquote:: "\"\" " text } > HR:: { "---" "-"* } > { OL:: (text &~ (text! ws! {oli}+)) ws! {oli}+ } > P:: { text } onums = nums (". "|") ")! any = ~[]* uli = "* " (ws! text &~ any (oli|uli)!) oli = onums! (ws! text &~ any (oli|uli)!) text = Item Item*/ws = blockquote // > ^"#" ws! { ~[]* } > Verbatim > InlineGrammar > link > structured > styled > (Chars:: alphanum++) > Quotes:: "\"" text "\"" > (Symbol:: sym++) > { Block:: text } word = Chars:: bareword blockquote = "adsfafewag" //blockquote = Blockquote:: "\"\"" (block | text "\"\"") Verbatim = "[verbatim]" ws! { (~[])++ } #import meta.g as meta InlineGrammar = "\grammar" ws! { meta.Grammar } 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 = text:({ text }|word) "->" ws! href:href href = url | email | {href} structured = command & "\\" ([a-zA-Z0-9]++)! block? > glyph > email > url glyph = euro:: "(e)" | r:: "(r)" | c:: "(c)" | tm:: "(tm)" | emdash:: "--" | ellipses:: "..." | cent:: "\\cent" command = "\\" [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* -> ~urlv // this ~urlv should be handled by url! bug! 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)? ref:("#" 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 /////////////////////////////////////////////////////////////////// bareword = 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=\">] //sym = [,()]