X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=tests%2Ftibdoc.g;h=b3b107eb01a52e48a89e53ebdef0b148172a7b1c;hp=a2f5cacac3fad3e838888e932aad54ee3c5fd85b;hb=22a2ca7685dcf29e9ddcc6e26443ea0277385fca;hpb=f7f669e438822dd46922e3d3b1c880fdec998a9b diff --git a/tests/tibdoc.g b/tests/tibdoc.g index a2f5cac..b3b107e 100644 --- a/tests/tibdoc.g +++ b/tests/tibdoc.g @@ -1,4 +1,3 @@ -x::="x" // interactions between !=> and &~ mean that I need to rethink the chartage // indentation styling... // literal blocks [[need to ignore bracing]] double-colon style? @@ -13,83 +12,133 @@ x::="x" // 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\ ] +w = " " | "\n" | "\r" +ws = "()":: w** +// | "()":: w** "#" (~[\n])* "\n" ws +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 => section } -SectionHeader ::= "==" SectionHeaderBody "==" -SectionHeaderBody ::= "=" SectionHeaderBody "=" - > ws text ws - -sp !::= " "** -blank ::= sp "\n" sp "\n" ws - -kv ::= word "=" text /ws => kv1 -wp !::= w++ -num !::= [0-9]++ -Paragraph ::= { "\"\"" ws text } => "blockquote" - > { "---" "-"* } => "hr" - > { text } => "p" - -onums !::= nums (". "|") ") -any !::= ~[]* - -uli ::= "* " (ws text &~ any (oli|uli)) => "li" -oli ::= ("# "|onums) (ws text &~ any (oli|uli)) => "li" - -text ::= Item => text -Itemx ::= ws Item - | () -Item ::= blockquote - > { uli+/ws => "ul" } Itemx => [] - | { oli+/ws => "ol" } Itemx => [] - > pre Itemx => [] - > structured Itemx => [] - > structuredx Itemx => [] - > styled Itemx => [] - > qtext Itemx => [] - > (alphanum++ => stringify) Itemx => [] - > symbol Itemx => [] - > (sym++ => stringify) Itemx => [] - > Paragraph Itemx => [] - -blockquote ::= "\"\"" text "\"\"" => "blockquote" - | "\"\"" block => "blockquote" +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 "\"\"") -qtext ::= "\"" text "\"" => "quoted" -pre ::= "[verbatim]" { ~[]+ } /ws => "verbatim" // FIXME doesn't work - -styled ::= "__" text "__" => underline - | "((" 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 +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 ::= "(r)" | "(c)" | "(tm)" | "--" // euro symbol? - | "\\today" -> ~[a-z] => today +glyph = euro:: "(e)" + | r:: "(r)" + | c:: "(c)" + | tm:: "(tm)" + | emdash:: "--" + | ellipses:: "..." + | cent:: "\\cent" + +command = "\\" [a-z]++ // URLs ////////////////////////////////////////////////////////////////////////////// @@ -98,44 +147,54 @@ 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 (":" nums)? ("/" urlpath)? => "url" -url_login ::= username (":" password) "@" => "login" -method ::= [+\-.a-z0-9]+ => stringify -domain ::= (part +/ ".") -> ~"." => domain -part ::= [a-zA-Z0-9\-]++ => stringify +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 ::= username "@" host -> ~[.] => emailaddr -nums ::= [0-9]++ => stringify -host ::= nums "." nums "." nums "." nums => "ip" - | domain +email = user:username "@" host:host -> ~[.] +nums = [0-9]++ +host = IP:: nums "." nums "." nums "." nums + | DNS:: domain // Tokens /////////////////////////////////////////////////////////////////// -word ::= alphanum++ => stringify +bareword = alphanum++ | quoted -quoted ::= "\"" ((~[\"\\] | escaped)+) "\"" - | "\"\"" => "" -escaped ::= "\\n" => "\n" - | "\\r" => "\r" +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=\">] +alpha = [a-zA-Z] +alphanum = [a-zA-Z0-9] +sym = ~[a-zA-Z0-9\ \r\n=\">] +//sym = [,()]