wlang 0.8.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. data/LICENCE.rdoc +25 -0
  2. data/README.rdoc +111 -0
  3. data/bin/wlang +24 -0
  4. data/doc/specification/about.rdoc +61 -0
  5. data/doc/specification/dialects.wtpl +0 -0
  6. data/doc/specification/examples.rb +3 -0
  7. data/doc/specification/glossary.wtpl +14 -0
  8. data/doc/specification/hosting.rdoc +0 -0
  9. data/doc/specification/overview.rdoc +116 -0
  10. data/doc/specification/rulesets.wtpl +87 -0
  11. data/doc/specification/specification.css +52 -0
  12. data/doc/specification/specification.html +1361 -0
  13. data/doc/specification/specification.js +8 -0
  14. data/doc/specification/specification.wtpl +41 -0
  15. data/doc/specification/specification.yml +430 -0
  16. data/doc/specification/symbols.wtpl +16 -0
  17. data/lib/wlang.rb +186 -0
  18. data/lib/wlang/basic_object.rb +19 -0
  19. data/lib/wlang/dialect.rb +230 -0
  20. data/lib/wlang/dialect_dsl.rb +136 -0
  21. data/lib/wlang/dialect_loader.rb +69 -0
  22. data/lib/wlang/dialects/coderay_dialect.rb +35 -0
  23. data/lib/wlang/dialects/plain_text_dialect.rb +75 -0
  24. data/lib/wlang/dialects/rdoc_dialect.rb +33 -0
  25. data/lib/wlang/dialects/ruby_dialect.rb +35 -0
  26. data/lib/wlang/dialects/sql_dialect.rb +38 -0
  27. data/lib/wlang/dialects/standard_dialects.rb +113 -0
  28. data/lib/wlang/dialects/xhtml_dialect.rb +40 -0
  29. data/lib/wlang/encoder.rb +66 -0
  30. data/lib/wlang/encoder_set.rb +117 -0
  31. data/lib/wlang/errors.rb +37 -0
  32. data/lib/wlang/intelligent_buffer.rb +94 -0
  33. data/lib/wlang/parser.rb +251 -0
  34. data/lib/wlang/parser_context.rb +146 -0
  35. data/lib/wlang/ruby_extensions.rb +21 -0
  36. data/lib/wlang/rule.rb +66 -0
  37. data/lib/wlang/rule_set.rb +93 -0
  38. data/lib/wlang/rulesets/basic_ruleset.rb +75 -0
  39. data/lib/wlang/rulesets/buffering_ruleset.rb +103 -0
  40. data/lib/wlang/rulesets/context_ruleset.rb +115 -0
  41. data/lib/wlang/rulesets/encoding_ruleset.rb +73 -0
  42. data/lib/wlang/rulesets/imperative_ruleset.rb +132 -0
  43. data/lib/wlang/rulesets/ruleset_utils.rb +296 -0
  44. data/lib/wlang/template.rb +79 -0
  45. data/lib/wlang/wlang_command.rb +54 -0
  46. data/lib/wlang/wlang_command_options.rb +158 -0
  47. data/test/sandbox.rb +1 -0
  48. data/test/test_all.rb +8 -0
  49. data/test/wlang/anagram_bugs_test.rb +111 -0
  50. data/test/wlang/basic_ruleset_test.rb +52 -0
  51. data/test/wlang/buffering_ruleset_test.rb +102 -0
  52. data/test/wlang/buffering_template1.wtpl +1 -0
  53. data/test/wlang/buffering_template2.wtpl +1 -0
  54. data/test/wlang/buffering_template3.wtpl +1 -0
  55. data/test/wlang/buffering_template4.wtpl +1 -0
  56. data/test/wlang/buffering_template5.wtpl +1 -0
  57. data/test/wlang/context_ruleset_test.rb +32 -0
  58. data/test/wlang/data.rb +3 -0
  59. data/test/wlang/encoder_set_test.rb +42 -0
  60. data/test/wlang/imperative_ruleset_test.rb +107 -0
  61. data/test/wlang/intelligent_buffer_test.rb +194 -0
  62. data/test/wlang/othersymbols_test.rb +16 -0
  63. data/test/wlang/parser_context_test.rb +29 -0
  64. data/test/wlang/parser_test.rb +89 -0
  65. data/test/wlang/plain_text_dialect_test.rb +21 -0
  66. data/test/wlang/ruby_dialect_test.rb +100 -0
  67. data/test/wlang/ruby_expected.rb +3 -0
  68. data/test/wlang/ruby_template.wrb +3 -0
  69. data/test/wlang/ruleset_utils_test.rb +245 -0
  70. data/test/wlang/specification_examples_test.rb +52 -0
  71. data/test/wlang/test_utils.rb +25 -0
  72. data/test/wlang/wlang_test.rb +80 -0
  73. metadata +136 -0
@@ -0,0 +1,8 @@
1
+ var current = 'about'
2
+ function show(who) {
3
+ document.getElementById(current).style.display = "none";
4
+ document.getElementById(current + 'focus').className = "unfocus";
5
+ document.getElementById(who).style.display = "block";
6
+ document.getElementById(who + 'focus').className = "focus";
7
+ current = who;
8
+ }
@@ -0,0 +1,41 @@
1
+ <<={specification.yml as spec}
2
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
+ <head>
5
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
6
+ <title>${spec/title} (version ${spec/version})</title>
7
+ <style type="text/css">
8
+ <<{specification.css}
9
+ </style>
10
+ <script type="text/javascript" language="JavaScript"><!--
11
+ <<{specification.js}
12
+ //--></script>
13
+ </head>
14
+ <body onload="show('about')">
15
+ <h1 id="title">${spec/title} (version ${spec/version})</h1>
16
+ <ul id="tabs">
17
+ *{spec["sections"].reverse as section}{
18
+ <li id="+{section/id}focus" onclick="show('{section/id}')">${section/name}</li>
19
+ }
20
+ </ul>
21
+ <div class="clear"></div>
22
+ *{spec/sections as section}{
23
+ <div id="{section/id}" style="display: none;">
24
+ <div class="header">
25
+ <h2>${section/name}</h2>
26
+ ?{section/links}{
27
+ <ul class="links">
28
+ *{+{section/links} as link}{<li><a href="#${link/name}">${link/name}</a></li>}
29
+ </ul>
30
+ }
31
+ <div class="clear"></div>
32
+ </div>
33
+ ?{/rdoc$/ =~ "{section/file}"}{
34
+ ^{rdoc/div}{<<{+{section/file}}}
35
+ }{
36
+ <<+{+{section/file} with spec: spec}
37
+ }
38
+ </div>
39
+ }
40
+ </body>
41
+ </html>
@@ -0,0 +1,430 @@
1
+ ---
2
+ title: WLang
3
+ version: 0.8.4
4
+ sections:
5
+ - id: about
6
+ name: About
7
+ file: about.rdoc
8
+ - id: overview
9
+ name: Overview
10
+ file: overview.rdoc
11
+ - id: rulesets
12
+ name: Rulesets
13
+ file: rulesets.wtpl
14
+ links: 'spec["rulesets"].reverse'
15
+ - id: dialects
16
+ name: Dialects
17
+ file: dialects.wtpl
18
+ - id: hosting
19
+ name: Hosting language
20
+ file: hosting.rdoc
21
+ - id: glossary
22
+ name: Glossary
23
+ file: glossary.wtpl
24
+ - id: symbols
25
+ name: Tag symbols
26
+ file: symbols.wtpl
27
+ glossary:
28
+ - term: template
29
+ definition: |-
30
+ Source code respecting the wlang grammar, and attached to a given <em>wlang
31
+ dialect</em>.
32
+ example: |-
33
+ <tt>Hello ${name}</tt>
34
+ - term: dialect
35
+ definition: |-
36
+ Basically, <em>dialect</em> is used as a synonym for (programming) <em>language</em>.
37
+ However _wlang_ uses a tree of dialects, allowing specializations: <tt>sql/sybase</tt>
38
+ for example is the qualified name of a sub-dialect 'sybase' of the 'sql' dialect.
39
+ Dialects come with associated _encoders_.
40
+ example: |-
41
+ <tt>sql/sybase</tt>
42
+ - term: wlang dialect
43
+ definition: |-
44
+ When we talk about a <em>wlang dialect</em>, we are actually refering to some
45
+ specialization of the wlang tag-based grammar: <tt>wlang/xhtml</tt> for example
46
+ is the templating language _wlang_ proposes to generate xhtml pages. An
47
+ example of source code in that dialect has been shown before.
48
+ In addition to its encoders a <em>wlang dialect</em> comes with its sets of _tags_
49
+ and associated _rules_.
50
+ example: |-
51
+ <tt>wlang/xhtml</tt>
52
+ - term: encoder
53
+ definition: |-
54
+ Text transformation (algorithm) applying some encoding conventions of a portion
55
+ of a the target language generated by a dialect. HTML entities-encoding, SQL's back-quoting
56
+ are examples of encoders. Encoders are accessible through their qualified name (dialect/encoder).
57
+ example: |-
58
+ <tt>xhtml/entities-encoding</tt><br/><tt>sql/single-quoting</tt>
59
+ - term: ruleset
60
+ definition: |-
61
+ Reusable set of <em>tags</em> associated to <em>rule</em>s.
62
+ example: |-
63
+ <tt>Imperative ruleset</tt><br/><tt>Encoding rulset</tt>
64
+ - term: wlang tag
65
+ definition: |-
66
+ Special tags in the template, starting with wlang symbols and a number of wlang
67
+ blocks. A tag is associated with a wlang rule.
68
+ example: |-
69
+ <tt>${...}</tt><br/><tt>?{...}{...}{...}</tt>
70
+ - term: rule
71
+ definition: |-
72
+ Transformation semantics of a given <em>tag</em>. When wlang instantiates a
73
+ template it simply replaces <em>wlang tags</em> by some <em>replacement value</em>
74
+ (which is always a string). This value is computed by the rule attached to
75
+ the tag. Rule definition (see Rulesets tab on top of the page)
76
+ explicitly describes the number of blocks it expects, in which dialect they
77
+ are parsed and instantiated and the way the replacement value is computed.
78
+ example: |-
79
+ <tt>^{wlang/active-string}{...}</tt><br/>
80
+ Instantiates #1, looking for an encoder qualified name. Instantiates #2 in
81
+ the current dialect. Encode #2's instantiation using encoder found in (#1)
82
+ and return the result as replacement value.
83
+ - term: context
84
+ definition: |-
85
+ Some rules allow code to be executed in the <em>hosting language</em> (the
86
+ definition explicitly announce it by putting <tt>wlang/hosted</tt> in the corresponding
87
+ block). When doing so, this code is in fact executed in a given context that
88
+ provides the execution semantics.
89
+ - term: hosting language
90
+ definition: |-
91
+ language (or framework) that executes wlang. More precisely, the hosting language
92
+ is the one that rules what is considered as an executable expression in tags that
93
+ relies on some execution semantics (like !{...} for example). See the 'Hosting language'
94
+ section to learn more.
95
+ example: |-
96
+ ruby
97
+ rulesets:
98
+ - name: Basic
99
+ description: |-
100
+ The Basic ruleset is commonly installed on any dialect and provides access to _wlang_
101
+ foundations inside your template: requesting the hosting language to execute some expression,
102
+ changing the current dialect and encoding text.
103
+ examples:
104
+ - ["wlang/active-string", "Hello !{name}", "Hello O'Neil"]
105
+ - ["wlang/active-string", "Hello %{wlang/dummy}{!{name}}", "Hello !{name}"]
106
+ - ["wlang/dummy", "Hello %{wlang/dummy}{!{name}}", "Hello %{wlang/dummy}{!{name}}"]
107
+ - ["wlang/active-string", "Hello ^{plain-text/upcase}{${name}}", "Hello O'NEIL"]
108
+ rules:
109
+ # !{wlang/hosted}
110
+ - name: "execution"
111
+ symbol: "!"
112
+ signature: "!{wlang/hosted}"
113
+ definition: |-
114
+ Instantiates #1, looking for an expression of the hosting language. Evaluates it,
115
+ looking for any object. Converts it to a string (using to_s for example if Ruby is
116
+ the hosting language) and returns the result as replacement value.
117
+
118
+ # %{wlang/active-string}{...}
119
+ - name: "modulation"
120
+ symbol: "%"
121
+ signature: "%{wlang/active-string}{...}"
122
+ definition: |-
123
+ Instantiates #1, looking for a dialect qualified name. Instantiates #2
124
+ according to the rules defined by that dialect and returns the #2's
125
+ instantiation as replacement value.
126
+
127
+ # ^{wlang/active-string}{...}
128
+ - name: "encoding"
129
+ symbol: "^"
130
+ signature: "^{wlang/active-string}{...}"
131
+ definition: |-
132
+ Instantiates #1, looking for an encoder qualified name. Instantiates #2 in
133
+ the current dialect. Encode #2's instantiation using encoder found in (#1) and
134
+ returns encoding as replacement value.
135
+
136
+ # %!{wlang/active-string using ... with ...}{...}
137
+ - name: "recursive-application"
138
+ symbol: "%!"
139
+ signature: "%!{wlang/active-string <using>? <with>?}{...}"
140
+ definition: |-
141
+ Instantiates #1, looking for a dialect qualified name. Instantiates #2
142
+ in the current dialect. Instantiates #2's instantiation in the dialect found
143
+ in #1, using context installed by 'using ...' and 'with ...'. Returns this
144
+ instantiation as replacement value (this really advanced rule allows
145
+ metaprogramming).
146
+
147
+ # ${wlang/hosted}
148
+ - name: "injection"
149
+ symbol: "$"
150
+ signature: "${wlang/hosted}"
151
+ definition: Same semantics as execution (intended to be overrided).
152
+
153
+ # +{wlang/hosted}
154
+ - name: "inclusion"
155
+ symbol: "+"
156
+ signature: "+{wlang/hosted}"
157
+ definition: Same semantics as execution (intended to be overrided).
158
+
159
+ - name: Encoding
160
+ description: |-
161
+ Almost all languages require escaping/encoding in specific situations: quoted string literals
162
+ always come with an escaping mechanism (unfortunately different from one language to another),
163
+ html requires entities-encoding, etc. The Encoding ruleset proposes shortcut tags for encoding.
164
+ Note that these shortcuts are written in such a way that they don't depend on the effective
165
+ dialect. _wlang_ hides language and vendors differences!
166
+ examples:
167
+ - ["wlang/xhtml", "Hello &{name}", "Hello name"]
168
+ - ["wlang/xhtml", "Hello &{<script>}", "Hello &lt;script&gt;"]
169
+ - ["wlang/xhtml", "Hello &;{<script>}", "Hello &lt;script&gt;"]
170
+ - ["wlang/ruby", "puts 'Hello &'{name}'", "puts 'Hello name'"]
171
+ - ["wlang/ruby", "puts 'Hello &'{!{name}}'", "puts 'Hello O\'Neil'"]
172
+ - ["wlang/ruby", "puts 'Hello ' << '{name}'", "puts 'Hello ' << 'O\'Neil'"]
173
+ - ["wlang/sql", "... WHERE name='{name}'", "... WHERE name='O\'Neil'"]
174
+ - ["wlang/sql/sybase", "... WHERE name='{name}'", "... WHERE name='O''Neil'"]
175
+ rules:
176
+ # &{...}
177
+ - name: "main-encoding"
178
+ symbol: "&"
179
+ signature: "&{...}"
180
+ definition: "<tt>^{+{@parser.current_dialect}/main-encoding}{#1}</tt>"
181
+
182
+ # &;{...}
183
+ - name: "entities-encoding"
184
+ symbol: "&;"
185
+ signature: "&;{...}"
186
+ definition: "<tt>^{+{@parser.current_dialect}/entities-encoding}{#1}</tt>"
187
+
188
+ # &'{...}
189
+ - name: "single-quoting"
190
+ symbol: "&'"
191
+ signature: "&'{...}"
192
+ definition: "<tt>^{+{@parser.current_dialect}/single-quoting}{#1}</tt>"
193
+
194
+ # &;{...}
195
+ - name: "double-quoting"
196
+ symbol: '&"'
197
+ signature: '&"{...}'
198
+ definition: "<tt>^{+{@parser.current_dialect}/double-quoting}{#1}</tt>"
199
+
200
+ # ${wlang/hosted}
201
+ - name: "injection"
202
+ symbol: "$"
203
+ signature: "${wlang/hosted}"
204
+ definition: "<tt>&{+{#1}}</tt>"
205
+
206
+ # '{wlang/hosted}
207
+ - name: "single-quoted"
208
+ symbol: "'"
209
+ signature: "'{wlang/hosted}"
210
+ definition: |-
211
+ <tt>'&'{+{#1}}</tt> (first single quote is kept in the result)
212
+
213
+ # "{wlang/hosted}
214
+ - name: "double-quoted"
215
+ symbol: '"'
216
+ signature: '"{wlang/hosted}'
217
+ definition: |-
218
+ <tt>"&"{+{#1}}</tt> (first double quote is kept in the result)
219
+
220
+ - name: Imperative
221
+ description: |-
222
+ Instantiating conditionally and iterating collection elements are common code generation tasks.
223
+ The Imperative dialect provides these features.
224
+ examples:
225
+ - ["wlang/*", '?{true}{then}{else}', 'then']
226
+ - ["wlang/*", '?{/th/ =~ "not tat"}{then}{else}', 'else']
227
+ - ["wlang/*", '?{authors.include? "blambeau"}{yes}{no}', 'yes']
228
+ - ["wlang/*", '[*{authors as a}{"{a}"}{, }]', '["blambeau", "llambeau", "ancailliau"]']
229
+ rules:
230
+ # ?{wlang/hosted}{...}{...}
231
+ - name: "conditional<br/>(third block is optional)"
232
+ symbol: "?"
233
+ signature: "?{wlang/hosted}{...}{...}"
234
+ definition: |-
235
+ Instantiates #1, looking for an expression in the hosting language.
236
+ Evaluates it, looking for a boolean value (according to boolean semantics
237
+ of the hosting language). If true, instantiates #2, otherwise instantiates
238
+ #3 if present, returning instantiation as replacement value.
239
+
240
+ # *{wlang/hosted as x}{...}{...}
241
+ - name: "enumeration<br/>(third block is optional)"
242
+ symbol: "*"
243
+ signature: "*{wlang/hosted <as x>?}{...}{...}"
244
+ definition: |-
245
+ Instantiates #1, looking for an expression in the hosting language. Evaluates
246
+ it, looking for an enumerable. Iterates all its elements, instantiating #2 for
247
+ each of them (the iterated value is set under name x in the scope). If #3 is
248
+ present, it is instantiated between elements. Replacement is the concatenation
249
+ of all these instantiations.
250
+
251
+ - name: Context
252
+ description: |-
253
+ Complex templates come with specific needs. The ability to manipulate the context and the current
254
+ scope is provided by the Context ruleset. All are variants of 'saving previous instantiations' in
255
+ scope variables...
256
+ examples:
257
+ - ["wlang/*", '={name as n}{Hello +{n}}', "Hello O'Neil"]
258
+ - ["wlang/*", '={name as n}Hello +{n}', "Hello O'Neil"]
259
+ - ["wlang/*", '#={name}{blambeau}{Hello +{name}} and +{name}', "Hello blambeau and O'Neil"]
260
+ - ["wlang/*", '#={name}{blambeau}Hello +{name} and +{name}', "Hello blambeau and blambeau"]
261
+ - ["wlang/*", '={author as name}{Hello +{name}} and +{name}', "Hello blambeau and O'Neil"]
262
+ - ["wlang/*", '={author as name}Hello +{name} and +{name}', "Hello blambeau and blambeau"]
263
+ - ["wlang/*", '%={wlang/dummy as hello}{Hello +{name}}{+{hello}}', "Hello +{name}"]
264
+ - ["wlang/*", '^={plain-text/upcase as name}{+{author}}{Hello +{name}} and +{name}', "Hello BLAMBEAU and O'Neil"]
265
+ - ["wlang/*", '^={plain-text/upcase as name}{+{author}}Hello +{name} and +{name}', "Hello BLAMBEAU and BLAMBEAU"]
266
+
267
+ rules:
268
+ # ={wlang/hosted as x}{...}
269
+ - name: "assignment<br/>(second block is optional)"
270
+ symbol: "="
271
+ signature: "={wlang/hosted <as x>}{...}"
272
+ definition: |-
273
+ Instantiates #1, looking for an expression in the hosting language. Evaluates
274
+ it, looking for any object. Without second block, expands the current scope with
275
+ 'x' being bound to evaluation result. Otherwise, branches the current scope for
276
+ the second block instantiation only and bind 'x' the same way (i.e. x will not be
277
+ available outside the second block). Returns an empty string as replacement value.
278
+ # %={wlang/active-string as x}{...}{...}
279
+ - name: "modulo-assignment<br/>(third block is optional)"
280
+ symbol: "%="
281
+ signature: "%={wlang/active-string <as x>}{...}{...}"
282
+ definition: |-
283
+ Instantiates #1, looking for a dialect qualified name. Instantiates #2 according
284
+ to the rules defined by that dialect. Without third block, expands the current
285
+ scope with 'x' being bound to #2's instantiation. Otherwise, branches the current
286
+ scope for the third block instantiation only and binds 'x' the same way (i.e. x will
287
+ not be available outside the third block). Returns an empty string as replacement
288
+ value.
289
+ # #={wlang/active-string}{...}{...}
290
+ - name: "block-assignment<br/>(third block is optional)"
291
+ symbol: "="
292
+ signature: "#={wlang/active-string <as x>}{...}{...}"
293
+ definition: |-
294
+ <tt>%={+{@parser.current_dialect} as #1}{#2}{#3}</tt>
295
+ # ^={wlang/active-string as x}{...}{...}
296
+ - name: "encoding-assignment<br/>(third block is optional)"
297
+ symbol: "^="
298
+ signature: "^={wlang/active-string <as x>}{...}{...}"
299
+ definition: |-
300
+ <tt>%={+{@parser.current_dialect} as x}{^{#1}{#2}}{#3}</tt>
301
+
302
+ - name: Buffering
303
+ description: |-
304
+ The Buffering ruleset is probably one of the more useful. It allows you to load text and data files,
305
+ to change the current output buffer (for generating multiple files for example) and even to start
306
+ the instantiation on other templates.
307
+ rules:
308
+ # <<{wlang/uri}
309
+ - name: "input"
310
+ symbol: "<<"
311
+ signature: "<<{wlang/uri}"
312
+ definition: |-
313
+ Instantiates #1, looking for an uri. Returns the text content of the found
314
+ uri (#1) as replacement value.
315
+ # >>{wlang/uri}
316
+ - name: "output"
317
+ symbol: ">>"
318
+ signature: ">>{wlang/uri}{...}"
319
+ definition: |-
320
+ Instantiates #1, looking for an uri. Instantiates #2 in the current dialect,
321
+ using the file found in #1 as output buffer. Returns an empty string as replacement
322
+ value.
323
+ # <<={wlang/uri as x}{...}
324
+ - name: "data-assignment"
325
+ symbol: "<<="
326
+ signature: "<<={wlang/uri <as x>}{...}"
327
+ definition: |-
328
+ Instantiates #1, looking for an uri. Loads data provided by this uri, based on the
329
+ file extension (typically .yml or .rb). Without second block, expands the current scope
330
+ with 'x' being bound to the data. Otherwise, branches the current scope for the second
331
+ block instantiation only and binds 'x' the same way (i.e. x will not be available outside
332
+ the second block). Returns an empty string as replacement value.
333
+ # <<+{wlang/uri with ...}
334
+ - name: "input-inclusion"
335
+ symbol: "<<+"
336
+ signature: "<<+{wlang/uri <using>? <with>?}"
337
+ definition: |-
338
+ Instantiates #1, looking for an uri. Instantiates the _wlang_ template at this location
339
+ (the dialect is infered from the file extension) in a fresh new scope built from the _with_
340
+ expression. Returns this instantiation as replacement value.
341
+
342
+ symbols:
343
+ - name: exclamation mark
344
+ symbol: '!'
345
+ meaning: execution
346
+ remark: should never be overrided as single
347
+ - name: 'caret/circumflex'
348
+ symbol: '^'
349
+ meaning: explicit encoding
350
+ remark: should never be overrided as single
351
+ - name: percent
352
+ symbol: '%'
353
+ meaning: modulation
354
+ remark: should never be overrided as single
355
+ - name: double quote
356
+ symbol: '"'
357
+ meaning: double-quoting
358
+ - name: dollar
359
+ symbol: '$'
360
+ meaning: 'main-encoding'
361
+ - name: ampersand
362
+ symbol: '&'
363
+ meaning: encoding
364
+ - name: single quote
365
+ symbol: "'"
366
+ meaning: single-quoting
367
+ - name: asterisk
368
+ symbol: '*'
369
+ meaning: iteration
370
+ - name: plus
371
+ symbol: '+'
372
+ meaning: inclusion
373
+ - name: question mark
374
+ symbol: '?'
375
+ meaning: condition
376
+ - name: at symbol
377
+ symbol: '@'
378
+ meaning: linking
379
+ - name: tilde
380
+ symbol: '~'
381
+ meaning: matching
382
+ - name: number sign
383
+ symbol: '#'
384
+ - name: comma
385
+ symbol: ','
386
+ - name: minus (dash)
387
+ symbol: '-'
388
+ - name: dot
389
+ symbol: '.'
390
+ - name: forward slash
391
+ symbol: '/'
392
+ - name: colon
393
+ symbol: ':'
394
+ - name: 'semi-colon'
395
+ symbol: ';'
396
+ - name: equal sign
397
+ symbol: '='
398
+ - name: less than
399
+ symbol: '<'
400
+ - name: greater than
401
+ symbol: '>'
402
+ - name: vertical bar
403
+ symbol: '|'
404
+ - name: underscore
405
+ symbol: '_'
406
+ remark: cannot be used as tag symbol; reserved for escaping in future versions
407
+ - name: back slash
408
+ symbol: \
409
+ remark: cannot be used as tag symbol; reserved for escaping in current version
410
+ - name: left parenthesis
411
+ symbol: '('
412
+ remark: cannot be used as tag symbol; reserved for block delimiter
413
+ - name: right parenthesis
414
+ symbol: ')'
415
+ remark: cannot be used as tag symbol; reserved for block delimiter
416
+ - name: left bracket
417
+ symbol: '['
418
+ remark: cannot be used as tag symbol; reserved for block delimiter
419
+ - name: right bracket
420
+ symbol: ']'
421
+ remark: cannot be used as tag symbol; reserved for block delimiter
422
+ - name: left brace
423
+ symbol: '{'
424
+ remark: cannot be used as tag symbol; reserved for block delimiter
425
+ - name: right brace
426
+ symbol: '}'
427
+ remark: cannot be used as tag symbol; reserved for block delimiter
428
+
429
+
430
+