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