X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=tests%2Ftibdoc.g;h=7841855bf13bbbafab769f6ab9b70341fca04f1e;hb=45d799349e635f1a99e3974e4504a43d5a7aaf33;hp=99bab8349118b1c9a94d930b941e5f342a742cbe;hpb=f33c05adc5aa3dd324c5352cdbd6f4b55359acad;p=sbp.git diff --git a/tests/tibdoc.g b/tests/tibdoc.g index 99bab83..7841855 100644 --- a/tests/tibdoc.g +++ b/tests/tibdoc.g @@ -1,4 +1,4 @@ -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 @@ -6,80 +6,128 @@ x::="x" // dropcap // output formats: latex, contex, ps, pdf, html, man, txt, rfc -// URGENT: why does swapping [a-zA-Z0-9] for alphanum in "item" cause severe breakage? -// URGENT: why does enabling "url" cause severe breakage? (probably same cause) -// ... something to do with unit productions - -// output formats: latex, contex, ps, pdf, html, man, txt, rfc -// bullet list -// numbered list -// horizontal rule -// dropcap -// smallcap -// strikethrough -// link +// escapification +// comment // math // image -// today's date, last edit date -// blockquote -// superscript -// subscript -// citations/references -// typewriter-text // 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\ ] +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 - -Paragraph ::= { "\"\"" ws text } => "blockquote" - > { "*" " " ws text } => "ul" - > { "#" " " ws text } => "ol" - > { num " " ws text => "ol" } - > { "---" "-"* } => "hr" - > { text } => "p" - -text ::= item */ ws -pre ::= "[verbatim]" { ~[]+ } /ws => "verbatim" // FIXME doesn't work -item ::= pre - > email - > structured - > styled - > "\"" text "\"" => quoted - > alphanum++ => "stringify" - > symbol - -symbol ::= symbolx & sym++ -symbolx ::= "--" => emdash - | "," - | ":" - | ";" - -styled ::= "**" text "**" => bold - | "__" text "__" => ul - | "~~" text "~~" => it // hard to type - | "((" text "))" => footnote - -structured ::= glyph -// | url - -glyph ::= "(r)" | "(c)" | "(tm)" // euro symbol? - +s = Doc + +Doc = Doc:: head:{Header} body:Body /ws +Header = Header:: "header" attrs:{ kv */ ws } /ws +Body = sections:Section*/ws +Section = { section:: SectionHeader Paragraph* /ws } +SectionHeader = "==" SectionHeaderBody "==" +SectionHeaderBody = "=" SectionHeaderBody "=" + > !ws text !ws + +sp = " "** +blank = !sp "\n" !sp "\n" !ws + +kv = kv:: key:word "=" val: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 = Item +Itemx = !ws Item + | () +Item = blockquote + > "[]":: { ul:: uli+/ws } Itemx + | "[]":: { ol:: oli+/ws } Itemx + > "[]":: pre Itemx + > "[]":: link Itemx + > "[]":: structured Itemx + > "[]":: styled Itemx + > "[]":: (Chars:: alphanum++) Itemx + > "[]":: qtext Itemx + > "[]":: symbol Itemx + > "[]":: (Symbol:: 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:: "[" 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)" | "--" | "..." + +command = today:: "\\today" + | bre:: "\\br" // URLs ////////////////////////////////////////////////////////////////////////////// @@ -87,45 +135,46 @@ glyph ::= "(r)" | "(c)" | "(tm)" // euro symbol? // subtypes of url (ftp, etc) as conjunctions, but the "master pattern" // only gets parsed once -urlpath ::= urlchar* -username ::= [a-zA-Z0-9;/?:&=$\-_.+]++ => "stringify" -password ::= [a-zA-Z0-9;/?:&=$\-_.+]++ => "stringify" -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\-]++ => "stringify" +urlpath = urlchar* +username = [a-zA-Z0-9;/?:&=$\-_.+]++ +password = [a-zA-Z0-9;/?:&=$\-_.+]++ +urlc = [a-zA-Z0-9;/?:&=$\-_.+@] +urlv = urlc | [%] +urlchar = urlc + | "%":: "%" [0-9] [0-9] +url = "mailto" ":" email -> ~urlv + > method:method "://" url_login? host:host port:(":" nums)? path:("/" urlpath)? -> ~urlv +url_login = login:: username (":" password) "@" +method = [+\-.a-z0-9]+ +domain = (part +/ ".") -> ~"." +part = [a-zA-Z0-9\-]++ +// interesting use of boolean grammars // &~ ([\-0-9] ~[]* | ~[]* [\-0-9]) -email ::= username "@" host => email -host ::= domain - | [0-9]+ "." [0-9]+ "." [0-9]+ "." [0-9]+ => "ip" +email = user:username "@" host:host -> ~[.] +nums = [0-9]++ +host = IP:: nums "." nums "." nums "." nums + | DNS:: domain // Tokens /////////////////////////////////////////////////////////////////// -word ::= alphanum++ => "stringify" +word = alphanum++ | quoted -quoted ::= "\"" ((~[\"\\] | escaped)+) "\"" - | "\"\"" => "" -escaped ::= "\\n" => "\n" - | "\\r" => "\r" +quoted = "\"" ((~[\"\\] | escaped)+) "\"" + | "":: "\"\"" +escaped = "\n":: "\\n" + | "\r":: "\\r" | "\\" ~[nr] // Chars /////////////////////////////////////////////////////////////// -alpha ::= [a-zA-Z] -num !::= [0-9]++ => "stringify" -//num ::= [0-9] -alphanum ::= [a-zA-Z0-9] -sym ::= ~[a-zA-Z0-9\ \r\n] +alpha = [a-zA-Z] +//num = [0-9] +alphanum = [a-zA-Z0-9] +sym = ~[a-zA-Z0-9\ \r\n=\">]