X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=tests%2Ftibdoc.g;h=b3b107eb01a52e48a89e53ebdef0b148172a7b1c;hp=4a57992c91a84656583c074375a770fd63d62975;hb=22a2ca7685dcf29e9ddcc6e26443ea0277385fca;hpb=142b31e063c97d2d6dc141a9e687d49b7f2ab826 diff --git a/tests/tibdoc.g b/tests/tibdoc.g index 4a57992..b3b107e 100644 --- a/tests/tibdoc.g +++ b/tests/tibdoc.g @@ -19,10 +19,7 @@ // [1] http://... // -// consider ++bold++ and **italic**? -// \br // nonbreaking text? -// ellipsis detection (...) // degree: 15^o // Arrows: <- -> => <= <-> @@ -39,7 +36,6 @@ // #include // simple macros (#define) (\define) -// today's date // table representation // @@ -52,86 +48,97 @@ // [c] ... // FIXME: these have to go at the top so they have their dropAll bit set before PreSequence.build... -ws = w** -w = [\r\n\ ] +w = " " | "\n" | "\r" +ws = "()":: w** +// | "()":: w** "#" (~[\n])* "\n" ws nw = ~[\r\n\ ] ////////////////////////////////////////////////////////////////////////////// -s = top:: Doc +s = Doc -Doc = doc:: {Header} Body /ws -Header = header:: "header" { kv */ ws } /ws -Body = body:: Section*/ws -Section = { section:: SectionHeader Paragraph* /ws } +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 + > ws! text ws! sp = " "** -blank = !sp "\n" !sp "\n" !ws +blank = sp! "\n" sp! "\n" ws! -kv = kv1:: word "=" text /ws +KeyVal = key:bareword "=" val:text /ws wp = w++ num = [0-9]++ -Paragraph = blockquote:: { "\"\"" !ws text } - > hr:: { "---" "-"* } - > p:: { text } -onums = nums !(". "|") ") +Paragraph = { Blockquote:: "\"\" " text } + > HR:: { "---" "-"* } + > { OL:: (text &~ (text! ws! {oli}+)) ws! {oli}+ } + > P:: { text } + +onums = nums (". "|") ")! any = ~[]* -uli = li:: "* " (!ws text &~ any (oli|uli)) -oli = li:: ("# "|onums) (!ws text &~ any (oli|uli)) +uli = "* " (ws! text &~ any (oli|uli)!) +oli = onums! (ws! text &~ any (oli|uli)!) -// +text = Item -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 "*" +Item*/ws = + blockquote +// > ^"#" ws! { ~[]* } + > Verbatim + > InlineGrammar + > link + > structured + > styled + > (Chars:: alphanum++) + > Quotes:: "\"" text "\"" + > (Symbol:: sym++) + > { Block:: text } -// +word = Chars:: bareword -block = { text } -structured = link:: { text } "->" (url|email) - //> alphanum++ "->" (url|email) => link -structuredx = glyph +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 = "(r)" | "(c)" | "(tm)" | "--" // euro symbol? - | today:: "\\today" -> ~[a-z] +glyph = euro:: "(e)" + | r:: "(r)" + | c:: "(c)" + | tm:: "(tm)" + | emdash:: "--" + | ellipses:: "..." + | cent:: "\\cent" + +command = "\\" [a-z]++ // URLs ////////////////////////////////////////////////////////////////////////////// @@ -140,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 = 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\-]++ +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 = emailaddr:: username "@" host -> ~[.] -nums = stringify:: [0-9]++ -host = ip:: nums "." nums "." nums "." nums - | domain +email = user:username "@" host:host -> ~[.] +nums = [0-9]++ +host = IP:: nums "." nums "." nums "." nums + | DNS:: domain // Tokens /////////////////////////////////////////////////////////////////// -word = stringify:: alphanum++ +bareword = alphanum++ | quoted quoted = "\"" ((~[\"\\] | escaped)+) "\"" - | "":: "\"\"" -escaped = "\n":: "\\n" - | "\r":: "\\r" + | "\"\"":: "\"\"" +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=\">] +//sym = [,()]