checkpoint
[sbp.git] / tests / tibdoc.g
1 // interactions between !=> and &~ mean that I need to rethink the chartage
2 // indentation styling...
3 // literal blocks [[need to ignore bracing]] double-colon style?
4 // definition -- by prior line indentation, like headings in the original structured text
5 // tables
6 // dropcap
7 // output formats: latex, contex, ps, pdf, html, man, txt, rfc
8
9 // escapification
10 // comment
11 // math
12 // image
13 // figures
14
15 // "reference-style" links
16 //
17 //   this[1] is fun
18 //
19 //   [1] http://...
20 //
21
22 // nonbreaking text?
23 // degree: 15^o
24 // Arrows: <- -> => <= <->
25
26 // textblocks:
27 //  - attention, caution, danger, error, hint, important, note, tip, warning
28 // definition
29 // sidebar
30 // figure-with-caption
31 // epigraph (end-of-chapter note)
32 // compound paragraph (??)
33 // csv-table?
34 // table of contents
35 // header, footer
36 // #include
37
38 // simple macros (#define) (\define)
39
40 // table representation
41 //  
42 //  \table
43 //     a bbb c
44 //     ddd   e
45 //
46 //     [a] ...
47 //     [b] ...
48 //     [c] ...
49
50 // FIXME: these have to go at the top so they have their dropAll bit set before PreSequence.build...
51 ws         = w**
52 w          =  [\r\n\ ]
53 nw         = ~[\r\n\ ]
54
55 //////////////////////////////////////////////////////////////////////////////
56
57 s                   = Doc
58
59 Doc                 = head:{Header} body:Body  /ws
60 Header              = "header" attrs:{ KeyVal */ ws }  /ws
61 Body                = {Section}*/ws
62 Section             = SectionHeader Paragraph* /ws
63 SectionHeader       = "==" SectionHeaderBody "=="
64 SectionHeaderBody   =  "=" SectionHeaderBody "="
65                     >      !ws alphanum++ !ws
66
67 sp       = " "**
68 blank    = !sp "\n" !sp "\n" !ws
69
70 KeyVal       = key:word "=" val:text /ws
71 wp           = w++
72 num          = [0-9]++
73
74 Paragraph   = Blockquote:: { "\"\" "    text }
75             > HR::         { "---" "-"*      }
76             > P::          { text            }
77
78 onums        = nums !(". "|") ")
79 any          = ~[]*
80
81 uli          =  "* "         (!ws text &~ any !(oli|uli))
82 oli          = !("# "|onums) (!ws text &~ any !(oli|uli))
83
84 text         = Item
85 Itemx        = !ws Item
86              | ()
87 Item         = "[]":: blockquote                 Itemx
88              > "[]":: { UL:: uli+/ws }           Itemx
89              | "[]":: { OL:: oli+/ws }           Itemx
90              > "[]":: pre                        Itemx
91              > "[]":: link                       Itemx
92              > "[]":: structured                 Itemx
93              > "[]":: styled                     Itemx
94              > "[]":: (Chars:: alphanum++)       Itemx
95              > "[]":: "\"" text "\""             Itemx
96              > "[]":: (Symbol:: sym++)           Itemx
97              > "[]":: { Block:: text }           Itemx
98
99 blockquote   = Blockquote:: "\"\"" (block | text "\"\"")
100              
101 pre          = Verbatim:: "[verbatim]" { ~[]+ } /ws   // FIXME doesn't work
102
103 styled       = Underline::     "__" text "__"      
104              | Footnote::      "((" text "))"      
105              | TT::            "[[" text "]]"
106              | Citation::       "[" word "]"
107              | Strikethrough:: "!!" text "!!"      
108              | Superscript::   "^^" (word|block)   
109              | Subscript::     ",," (word|block)   
110              | Smallcap::      "\\sc" block        
111              | Bold::           "++" text "++"
112              | Keyword::         "!" (word|block)    
113              | Italic::         "**" text "**"
114
115 block         = { text }
116
117 link          = LinkText:: text:({ text })      "->" href:(url|email)
118               > LinkChars:: text:alphanum++  !ws "->" href:(url|email)
119
120 structured    = command & "\\" !([a-zA-Z0-9]++) block?
121               > glyph
122               > email
123               > url
124
125 glyph        = Euro:: "(e)" | "(r)" | "(c)" | "(tm)" | emdash:: "--" | "..."
126
127 command      = Today::     "\\today"
128              | LineBreak:: "\\br"
129
130 // URLs //////////////////////////////////////////////////////////////////////////////
131
132 // interesting opportunity to show off boolean grammars here: define other
133 // subtypes of url (ftp, etc) as conjunctions, but the "master pattern"
134 // only gets parsed once
135
136 urlpath      = urlchar*
137 username     = [a-zA-Z0-9;/?:&=$\-_.+]++
138 password     = [a-zA-Z0-9;/?:&=$\-_.+]++
139 urlc         = [a-zA-Z0-9;/?:&=$\-_.+@]
140 urlv         = urlc | [%]
141 urlchar      = urlc
142              | urlescape:: "%" [0-9] [0-9]
143 url          = Mailto:: "mailto" ":"   email -> ~urlv
144              > URL::
145                   method:method 
146                   "://"
147                   login:url_login?
148                   host:host
149                   port:(":" nums)?
150                   path:("/" urlpath)?
151                      -> ~urlv
152 url_login    = Login:: username:username password:(":" password) "@"
153 method       = [+\-.a-z0-9]+
154 domain       = (part +/ ".") -> ~"."
155 part         = [a-zA-Z0-9\-]++
156 // interesting use of boolean grammars
157 //            &~ ([\-0-9] ~[]* | ~[]* [\-0-9])
158
159 email        = Email:: user:username "@" host:host -> ~[.]
160 nums         = [0-9]++
161 host         = IP::  nums "." nums "." nums "." nums
162              | DNS:: domain
163
164
165
166 // Tokens ///////////////////////////////////////////////////////////////////
167
168 word       = alphanum++
169            | quoted
170
171 quoted     = "\"" ((~[\"\\] | escaped)+) "\""
172            | "\"\"":: "\"\""
173 escaped    = lf:: "\\n"
174            | cr:: "\\r"
175            | "\\" ~[nr]
176
177
178 // Chars ///////////////////////////////////////////////////////////////
179
180 alpha      = [a-zA-Z]
181 alphanum   = [a-zA-Z0-9]
182 sym        = ~[a-zA-Z0-9\ \r\n=\">]
183
184