wlang 0.10.2 → 2.0.0.beta

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (269) hide show
  1. data/CHANGELOG.md +3 -121
  2. data/Gemfile +23 -1
  3. data/Gemfile.lock +32 -28
  4. data/LICENCE.md +18 -21
  5. data/Manifest.txt +4 -5
  6. data/README.md +100 -174
  7. data/Rakefile +1 -13
  8. data/bin/wlang +3 -29
  9. data/lib/wlang.rb +21 -394
  10. data/lib/wlang/command.rb +94 -0
  11. data/lib/wlang/compiler.rb +78 -0
  12. data/lib/wlang/compiler/autospacing.rb +60 -0
  13. data/lib/wlang/compiler/dialect_enforcer.rb +91 -0
  14. data/lib/wlang/compiler/filter.rb +32 -0
  15. data/lib/wlang/compiler/grammar.citrus +67 -0
  16. data/lib/wlang/compiler/parser.rb +26 -0
  17. data/lib/wlang/compiler/proc_call_removal.rb +15 -0
  18. data/lib/wlang/compiler/static_merger.rb +28 -0
  19. data/lib/wlang/compiler/strconcat_flattener.rb +25 -0
  20. data/lib/wlang/compiler/to_ruby_abstraction.rb +22 -0
  21. data/lib/wlang/compiler/to_ruby_code.rb +55 -0
  22. data/lib/wlang/dialect.rb +40 -237
  23. data/lib/wlang/dialect/dispatching.rb +51 -0
  24. data/lib/wlang/dialect/evaluation.rb +30 -0
  25. data/lib/wlang/dialect/tags.rb +50 -0
  26. data/lib/wlang/dummy.rb +32 -0
  27. data/lib/wlang/html.rb +106 -0
  28. data/lib/wlang/loader.rb +6 -0
  29. data/lib/wlang/mustang.rb +90 -0
  30. data/lib/wlang/scope.rb +57 -0
  31. data/lib/wlang/scope/binding_scope.rb +18 -0
  32. data/lib/wlang/scope/object_scope.rb +25 -0
  33. data/lib/wlang/scope/proxy_scope.rb +18 -0
  34. data/lib/wlang/scope/root_scope.rb +24 -0
  35. data/lib/wlang/template.rb +16 -86
  36. data/lib/wlang/version.rb +9 -8
  37. data/spec/fixtures/dialect/foobar.rb +31 -0
  38. data/spec/fixtures/dialect/upcasing.rb +13 -0
  39. data/spec/fixtures/templates/hello.tpl +1 -0
  40. data/spec/integration/examples/1-basics.txt +65 -0
  41. data/spec/integration/examples/2-imperative.txt +51 -0
  42. data/spec/integration/examples/3-partials.txt +76 -0
  43. data/spec/integration/examples/4-recursion.txt +16 -0
  44. data/spec/integration/html/test_ampersand.rb +15 -0
  45. data/spec/integration/html/test_bang.rb +38 -0
  46. data/spec/integration/html/test_caret.rb +33 -0
  47. data/spec/integration/html/test_dollar.rb +16 -0
  48. data/spec/integration/html/test_greater.rb +23 -0
  49. data/spec/integration/html/test_modulo.rb +16 -0
  50. data/spec/integration/html/test_plus.rb +48 -0
  51. data/spec/integration/html/test_question.rb +33 -0
  52. data/spec/integration/html/test_sharp.rb +21 -0
  53. data/spec/integration/html/test_slash.rb +16 -0
  54. data/spec/integration/html/test_star.rb +37 -0
  55. data/spec/integration/test_dummy.rb +51 -0
  56. data/spec/integration/test_examples.rb +29 -0
  57. data/spec/integration/test_mustang.rb +120 -0
  58. data/spec/integration/test_readme.rb +56 -0
  59. data/spec/integration/test_upcasing.rb +22 -0
  60. data/spec/spec_helper.rb +62 -1
  61. data/spec/test_wlang.rb +101 -0
  62. data/spec/unit/compiler/autospacing/test_right_strip.rb +30 -0
  63. data/spec/unit/compiler/autospacing/test_unindent.rb +30 -0
  64. data/spec/unit/compiler/test_dialect_enforcer.rb +168 -0
  65. data/spec/unit/compiler/test_grammar.rb +207 -0
  66. data/spec/unit/compiler/test_parser.rb +69 -0
  67. data/spec/unit/compiler/test_proc_call_removal.rb +24 -0
  68. data/spec/unit/compiler/test_static_merger.rb +29 -0
  69. data/spec/unit/compiler/test_strconcat_flattener.rb +30 -0
  70. data/spec/unit/compiler/test_to_ruby_abstraction.rb +59 -0
  71. data/spec/unit/compiler/test_to_ruby_code.rb +24 -0
  72. data/spec/unit/dialect/test_compile.rb +52 -0
  73. data/spec/unit/dialect/test_dispatching.rb +19 -0
  74. data/spec/unit/dialect/test_evaluate.rb +41 -0
  75. data/spec/unit/dialect/test_render.rb +33 -0
  76. data/spec/unit/dialect/test_tags.rb +32 -0
  77. data/spec/unit/dialect/test_with_scope.rb +18 -0
  78. data/spec/unit/scope/test_binding_scope.rb +27 -0
  79. data/spec/unit/scope/test_coerce.rb +22 -0
  80. data/spec/unit/scope/test_object_scope.rb +38 -0
  81. data/spec/unit/scope/test_proxy_scope.rb +22 -0
  82. data/spec/unit/scope/test_root_scope.rb +22 -0
  83. data/spec/unit/test_assumptions.rb +29 -0
  84. data/spec/unit/test_scope.rb +57 -0
  85. data/tasks/debug_mail.rake +42 -45
  86. data/tasks/gem.rake +22 -17
  87. data/tasks/spec_test.rake +9 -17
  88. data/tasks/unit_test.rake +11 -12
  89. data/tasks/yard.rake +13 -13
  90. data/wlang.gemspec +36 -32
  91. data/wlang.noespec +27 -35
  92. metadata +268 -451
  93. data/doc/specification/about.rdoc +0 -61
  94. data/doc/specification/analytics.wtpl +0 -13
  95. data/doc/specification/dialect.wtpl +0 -14
  96. data/doc/specification/dialects.wtpl +0 -3
  97. data/doc/specification/examples.rb +0 -3
  98. data/doc/specification/glossary.wtpl +0 -14
  99. data/doc/specification/hosting.rdoc +0 -0
  100. data/doc/specification/overview.rdoc +0 -116
  101. data/doc/specification/rulesets.wtpl +0 -87
  102. data/doc/specification/specification.css +0 -53
  103. data/doc/specification/specification.html +0 -1690
  104. data/doc/specification/specification.js +0 -8
  105. data/doc/specification/specification.wtpl +0 -42
  106. data/doc/specification/specification.yml +0 -432
  107. data/doc/specification/symbols.wtpl +0 -16
  108. data/lib/wlang/dialect_dsl.rb +0 -141
  109. data/lib/wlang/dialect_loader.rb +0 -74
  110. data/lib/wlang/dialects/bluecloth_dialect.rb +0 -16
  111. data/lib/wlang/dialects/coderay_dialect.rb +0 -45
  112. data/lib/wlang/dialects/hosted_dialect.rb +0 -50
  113. data/lib/wlang/dialects/plain_text_dialect.rb +0 -69
  114. data/lib/wlang/dialects/rdoc_dialect.rb +0 -33
  115. data/lib/wlang/dialects/redcloth_dialect.rb +0 -16
  116. data/lib/wlang/dialects/ruby_dialect.rb +0 -118
  117. data/lib/wlang/dialects/sql_dialect.rb +0 -38
  118. data/lib/wlang/dialects/standard_dialects.rb +0 -181
  119. data/lib/wlang/dialects/xhtml_dialect.rb +0 -63
  120. data/lib/wlang/dialects/yaml_dialect.rb +0 -30
  121. data/lib/wlang/encoder.rb +0 -62
  122. data/lib/wlang/encoder_set.rb +0 -122
  123. data/lib/wlang/errors.rb +0 -80
  124. data/lib/wlang/ext/hash_methodize.rb +0 -13
  125. data/lib/wlang/ext/string.rb +0 -44
  126. data/lib/wlang/hash_scope.rb +0 -89
  127. data/lib/wlang/hosted_language.rb +0 -146
  128. data/lib/wlang/intelligent_buffer.rb +0 -94
  129. data/lib/wlang/parser.rb +0 -332
  130. data/lib/wlang/parser_state.rb +0 -94
  131. data/lib/wlang/rule.rb +0 -66
  132. data/lib/wlang/rule_set.rb +0 -106
  133. data/lib/wlang/rulesets/basic_ruleset.rb +0 -83
  134. data/lib/wlang/rulesets/buffering_ruleset.rb +0 -115
  135. data/lib/wlang/rulesets/context_ruleset.rb +0 -111
  136. data/lib/wlang/rulesets/encoding_ruleset.rb +0 -73
  137. data/lib/wlang/rulesets/imperative_ruleset.rb +0 -132
  138. data/lib/wlang/rulesets/ruleset_utils.rb +0 -317
  139. data/lib/wlang/wlang_command.rb +0 -51
  140. data/lib/wlang/wlang_command_options.rb +0 -163
  141. data/spec/basic_object.spec +0 -40
  142. data/spec/coderay_dialect.spec +0 -8
  143. data/spec/dialect/apply_post_transform.spec +0 -16
  144. data/spec/global_extensions.rb +0 -2
  145. data/spec/hash_scope.spec +0 -76
  146. data/spec/redcloth_dialect.spec +0 -24
  147. data/spec/test_all.rb +0 -8
  148. data/spec/wlang.spec +0 -53
  149. data/spec/wlang_spec.rb +0 -8
  150. data/spec/xhtml_dialect.spec +0 -22
  151. data/tasks/genspec.rake +0 -5
  152. data/test/blackbox/basic/execution_1.exp +0 -1
  153. data/test/blackbox/basic/execution_1.tpl +0 -1
  154. data/test/blackbox/basic/execution_2.exp +0 -1
  155. data/test/blackbox/basic/execution_2.tpl +0 -1
  156. data/test/blackbox/basic/execution_3.exp +0 -1
  157. data/test/blackbox/basic/execution_3.tpl +0 -1
  158. data/test/blackbox/basic/execution_4.exp +0 -1
  159. data/test/blackbox/basic/execution_4.tpl +0 -1
  160. data/test/blackbox/basic/inclusion_1.exp +0 -1
  161. data/test/blackbox/basic/inclusion_1.tpl +0 -1
  162. data/test/blackbox/basic/inclusion_2.exp +0 -1
  163. data/test/blackbox/basic/inclusion_2.tpl +0 -1
  164. data/test/blackbox/basic/injection_1.exp +0 -1
  165. data/test/blackbox/basic/injection_1.tpl +0 -1
  166. data/test/blackbox/basic/injection_2.exp +0 -1
  167. data/test/blackbox/basic/injection_2.tpl +0 -1
  168. data/test/blackbox/basic/modulation_1.exp +0 -1
  169. data/test/blackbox/basic/modulation_1.tpl +0 -1
  170. data/test/blackbox/basic/modulation_2.exp +0 -1
  171. data/test/blackbox/basic/modulation_2.tpl +0 -1
  172. data/test/blackbox/basic/recursive_app_1.exp +0 -1
  173. data/test/blackbox/basic/recursive_app_1.tpl +0 -1
  174. data/test/blackbox/basic/recursive_app_2.exp +0 -1
  175. data/test/blackbox/basic/recursive_app_2.tpl +0 -1
  176. data/test/blackbox/buffering/data_1.rb +0 -1
  177. data/test/blackbox/buffering/data_assignment_1.exp +0 -1
  178. data/test/blackbox/buffering/data_assignment_1.tpl +0 -1
  179. data/test/blackbox/buffering/data_assignment_2.exp +0 -1
  180. data/test/blackbox/buffering/data_assignment_2.tpl +0 -1
  181. data/test/blackbox/buffering/data_assignment_3.exp +0 -1
  182. data/test/blackbox/buffering/data_assignment_3.tpl +0 -1
  183. data/test/blackbox/buffering/data_assignment_4.exp +0 -1
  184. data/test/blackbox/buffering/data_assignment_4.tpl +0 -1
  185. data/test/blackbox/buffering/input_1.exp +0 -1
  186. data/test/blackbox/buffering/input_1.tpl +0 -1
  187. data/test/blackbox/buffering/input_2.exp +0 -1
  188. data/test/blackbox/buffering/input_2.tpl +0 -1
  189. data/test/blackbox/buffering/input_3.exp +0 -1
  190. data/test/blackbox/buffering/input_3.tpl +0 -1
  191. data/test/blackbox/buffering/input_inclusion.exp +0 -1
  192. data/test/blackbox/buffering/input_inclusion.tpl +0 -1
  193. data/test/blackbox/buffering/input_inclusion_1.exp +0 -0
  194. data/test/blackbox/buffering/input_inclusion_1.tpl +0 -1
  195. data/test/blackbox/buffering/input_inclusion_2.exp +0 -1
  196. data/test/blackbox/buffering/input_inclusion_2.tpl +0 -1
  197. data/test/blackbox/buffering/input_inclusion_3.exp +0 -1
  198. data/test/blackbox/buffering/input_inclusion_3.tpl +0 -1
  199. data/test/blackbox/buffering/input_inclusion_4.exp +0 -0
  200. data/test/blackbox/buffering/input_inclusion_4.tpl +0 -1
  201. data/test/blackbox/buffering/input_inclusion_5.exp +0 -1
  202. data/test/blackbox/buffering/input_inclusion_5.tpl +0 -1
  203. data/test/blackbox/buffering/input_inclusion_6.exp +0 -1
  204. data/test/blackbox/buffering/input_inclusion_6.tpl +0 -1
  205. data/test/blackbox/buffering/input_inclusion_7.exp +0 -0
  206. data/test/blackbox/buffering/input_inclusion_7.tpl +0 -1
  207. data/test/blackbox/buffering/text_1.txt +0 -1
  208. data/test/blackbox/buffering/wlang.txt +0 -1
  209. data/test/blackbox/context/assignment_1.exp +0 -1
  210. data/test/blackbox/context/assignment_1.tpl +0 -1
  211. data/test/blackbox/context/assignment_2.exp +0 -1
  212. data/test/blackbox/context/assignment_2.tpl +0 -1
  213. data/test/blackbox/context/assignment_3.exp +0 -2
  214. data/test/blackbox/context/assignment_3.tpl +0 -2
  215. data/test/blackbox/context/assignment_4.exp +0 -1
  216. data/test/blackbox/context/assignment_4.tpl +0 -1
  217. data/test/blackbox/context/block_assignment_1.exp +0 -1
  218. data/test/blackbox/context/block_assignment_1.tpl +0 -1
  219. data/test/blackbox/context/block_assignment_2.exp +0 -1
  220. data/test/blackbox/context/block_assignment_2.tpl +0 -1
  221. data/test/blackbox/context/modulo_assignment_1.exp +0 -1
  222. data/test/blackbox/context/modulo_assignment_1.tpl +0 -1
  223. data/test/blackbox/context/modulo_assignment_2.exp +0 -1
  224. data/test/blackbox/context/modulo_assignment_2.tpl +0 -1
  225. data/test/blackbox/data_1.rb +0 -1
  226. data/test/blackbox/postblock/hello.exp +0 -1
  227. data/test/blackbox/postblock/hello.pre +0 -1
  228. data/test/blackbox/postblock/hello.tpl +0 -1
  229. data/test/blackbox/postblock/hello_input_inclusion.exp +0 -1
  230. data/test/blackbox/postblock/hello_input_inclusion.tpl +0 -1
  231. data/test/blackbox/postblock/hello_to_authors.exp +0 -1
  232. data/test/blackbox/postblock/hello_to_authors.tpl +0 -1
  233. data/test/blackbox/poststring/hello.exp +0 -1
  234. data/test/blackbox/poststring/hello.tpl +0 -1
  235. data/test/blackbox/test_all.rb +0 -70
  236. data/test/standard_dialects/ruby/data.rb +0 -7
  237. data/test/standard_dialects/ruby/inclusion.exp +0 -6
  238. data/test/standard_dialects/ruby/inclusion.tpl +0 -6
  239. data/test/standard_dialects/test_all.rb +0 -29
  240. data/test/standard_dialects/yaml/assumptions_test.rb +0 -13
  241. data/test/standard_dialects/yaml/data.rb +0 -3
  242. data/test/standard_dialects/yaml/inclusion_1.exp +0 -7
  243. data/test/standard_dialects/yaml/inclusion_1.tpl +0 -2
  244. data/test/standard_dialects/yaml/inclusion_2.exp +0 -5
  245. data/test/standard_dialects/yaml/inclusion_2.tpl +0 -3
  246. data/test/unit/test_all.rb +0 -9
  247. data/test/unit/wlang/anagram_bugs_test.rb +0 -111
  248. data/test/unit/wlang/basic_ruleset_test.rb +0 -52
  249. data/test/unit/wlang/buffering_ruleset_test.rb +0 -102
  250. data/test/unit/wlang/buffering_template1.wtpl +0 -1
  251. data/test/unit/wlang/buffering_template2.wtpl +0 -1
  252. data/test/unit/wlang/buffering_template3.wtpl +0 -1
  253. data/test/unit/wlang/buffering_template4.wtpl +0 -1
  254. data/test/unit/wlang/buffering_template5.wtpl +0 -1
  255. data/test/unit/wlang/context_ruleset_test.rb +0 -32
  256. data/test/unit/wlang/data.rb +0 -3
  257. data/test/unit/wlang/encoder_set_test.rb +0 -42
  258. data/test/unit/wlang/imperative_ruleset_test.rb +0 -107
  259. data/test/unit/wlang/intelligent_buffer_test.rb +0 -194
  260. data/test/unit/wlang/othersymbols_test.rb +0 -16
  261. data/test/unit/wlang/parser_test.rb +0 -88
  262. data/test/unit/wlang/plain_text_dialect_test.rb +0 -21
  263. data/test/unit/wlang/ruby_dialect_test.rb +0 -100
  264. data/test/unit/wlang/ruby_expected.rb +0 -3
  265. data/test/unit/wlang/ruby_template.wrb +0 -3
  266. data/test/unit/wlang/ruleset_utils_test.rb +0 -245
  267. data/test/unit/wlang/specification_examples_test.rb +0 -54
  268. data/test/unit/wlang/test_utils.rb +0 -25
  269. data/test/unit/wlang/wlang_test.rb +0 -80
@@ -1,8 +0,0 @@
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
- }
@@ -1,42 +0,0 @@
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.identifier}focus" onclick="show('{section.identifier}')">${section.name}</li>
19
- }
20
- </ul>
21
- <div class="clear"></div>
22
- *{spec.sections as section}{
23
- <div id="{section.identifier}" 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
- <<{analytics.wtpl}
41
- </body>
42
- </html>
@@ -1,432 +0,0 @@
1
- ---
2
- title: WLang
3
- version: 0.10.1
4
- sections:
5
- - identifier: about
6
- name: About
7
- file: about.rdoc
8
- - identifier: overview
9
- name: Overview
10
- file: overview.rdoc
11
- - identifier: rulesets
12
- name: Rulesets
13
- file: rulesets.wtpl
14
- links: 'spec["rulesets"].reverse'
15
- - identifier: dialects
16
- name: Dialects
17
- file: dialects.wtpl
18
- - identifier: hosting
19
- name: Hosting language
20
- file: hosting.rdoc
21
- - identifier: glossary
22
- name: Glossary
23
- file: glossary.wtpl
24
- - identifier: 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
- - ["wlang/ruby", "puts +{name}", "puts \"O'Neil\""]
109
- - ["wlang/ruby", "puts +{authors}", "puts [\"blambeau\", \"llambeau\", \"ancailliau\"]"]
110
- rules:
111
- # !{wlang/hosted}
112
- - name: "execution"
113
- symbol: "!"
114
- signature: "!{wlang/hosted}"
115
- definition: |-
116
- Instantiates #1, looking for an expression of the hosting language. Evaluates it,
117
- looking for any object. Converts it to a string (using to_s for example if Ruby is
118
- the hosting language) and returns the result as replacement value.
119
-
120
- # %{wlang/active-string}{...}
121
- - name: "modulation"
122
- symbol: "%"
123
- signature: "%{wlang/active-string}{...}"
124
- definition: |-
125
- Instantiates #1, looking for a dialect qualified name. Instantiates #2
126
- according to the rules defined by that dialect and returns the #2's
127
- instantiation as replacement value.
128
-
129
- # ^{wlang/active-string}{...}
130
- - name: "encoding"
131
- symbol: "^"
132
- signature: "^{wlang/active-string}{...}"
133
- definition: |-
134
- Instantiates #1, looking for an encoder qualified name. Instantiates #2 in
135
- the current dialect. Encode #2's instantiation using encoder found in (#1) and
136
- returns encoding as replacement value.
137
-
138
- # %!{wlang/active-string using ... with ...}{...}
139
- - name: "recursive-application"
140
- symbol: "%!"
141
- signature: "%!{wlang/active-string <using>? <with>?}{...}"
142
- definition: |-
143
- Instantiates #1, looking for a dialect qualified name. Instantiates #2
144
- in the current dialect. Instantiates #2's instantiation in the dialect found
145
- in #1, using context installed by 'using ...' and 'with ...'. Returns this
146
- instantiation as replacement value (this really advanced rule allows
147
- metaprogramming).
148
-
149
- # ${wlang/hosted}
150
- - name: "injection"
151
- symbol: "$"
152
- signature: "${wlang/hosted}"
153
- definition: Same semantics as execution (intended to be overrided).
154
-
155
- # +{wlang/hosted}
156
- - name: "inclusion"
157
- symbol: "+"
158
- signature: "+{wlang/hosted}"
159
- definition: Same semantics as execution (intended to be overrided).
160
-
161
- - name: Encoding
162
- description: |-
163
- Almost all languages require escaping/encoding in specific situations: quoted string literals
164
- always come with an escaping mechanism (unfortunately different from one language to another),
165
- html requires entities-encoding, etc. The Encoding ruleset proposes shortcut tags for encoding.
166
- Note that these shortcuts are written in such a way that they don't depend on the effective
167
- dialect. _wlang_ hides language and vendors differences!
168
- examples:
169
- - ["wlang/xhtml", "Hello &{name}", "Hello name"]
170
- - ["wlang/xhtml", "Hello &{<script>}", "Hello &lt;script&gt;"]
171
- - ["wlang/xhtml", "Hello &;{<script>}", "Hello &lt;script&gt;"]
172
- - ["wlang/ruby", "puts 'Hello &'{name}'", "puts 'Hello name'"]
173
- - ["wlang/ruby", "puts 'Hello &'{!{name}}'", "puts 'Hello O\'Neil'"]
174
- - ["wlang/ruby", "puts 'Hello ' << '{name}'", "puts 'Hello ' << 'O\'Neil'"]
175
- - ["wlang/sql", "... WHERE name='{name}'", "... WHERE name='O\'Neil'"]
176
- - ["wlang/sql/sybase", "... WHERE name='{name}'", "... WHERE name='O''Neil'"]
177
- rules:
178
- # &{...}
179
- - name: "main-encoding"
180
- symbol: "&"
181
- signature: "&{...}"
182
- definition: "<tt>^{+{@parser.current_dialect}/main-encoding}{#1}</tt>"
183
-
184
- # &;{...}
185
- - name: "entities-encoding"
186
- symbol: "&;"
187
- signature: "&;{...}"
188
- definition: "<tt>^{+{@parser.current_dialect}/entities-encoding}{#1}</tt>"
189
-
190
- # &'{...}
191
- - name: "single-quoting"
192
- symbol: "&'"
193
- signature: "&'{...}"
194
- definition: "<tt>^{+{@parser.current_dialect}/single-quoting}{#1}</tt>"
195
-
196
- # &;{...}
197
- - name: "double-quoting"
198
- symbol: '&"'
199
- signature: '&"{...}'
200
- definition: "<tt>^{+{@parser.current_dialect}/double-quoting}{#1}</tt>"
201
-
202
- # ${wlang/hosted}
203
- - name: "injection"
204
- symbol: "$"
205
- signature: "${wlang/hosted}"
206
- definition: "<tt>&{+{#1}}</tt>"
207
-
208
- # '{wlang/hosted}
209
- - name: "single-quoted"
210
- symbol: "'"
211
- signature: "'{wlang/hosted}"
212
- definition: |-
213
- <tt>'&'{+{#1}}</tt> (first single quote is kept in the result)
214
-
215
- # "{wlang/hosted}
216
- - name: "double-quoted"
217
- symbol: '"'
218
- signature: '"{wlang/hosted}'
219
- definition: |-
220
- <tt>"&"{+{#1}}</tt> (first double quote is kept in the result)
221
-
222
- - name: Imperative
223
- description: |-
224
- Instantiating conditionally and iterating collection elements are common code generation tasks.
225
- The Imperative dialect provides these features.
226
- examples:
227
- - ["wlang/*", '?{true}{then}{else}', 'then']
228
- - ["wlang/*", '?{/th/ =~ "not tat"}{then}{else}', 'else']
229
- - ["wlang/*", '?{authors.include? "blambeau"}{yes}{no}', 'yes']
230
- - ["wlang/*", '[*{authors as a}{"{a}"}{, }]', '["blambeau", "llambeau", "ancailliau"]']
231
- rules:
232
- # ?{wlang/hosted}{...}{...}
233
- - name: "conditional<br/>(third block is optional)"
234
- symbol: "?"
235
- signature: "?{wlang/hosted}{...}{...}"
236
- definition: |-
237
- Instantiates #1, looking for an expression in the hosting language.
238
- Evaluates it, looking for a boolean value (according to boolean semantics
239
- of the hosting language). If true, instantiates #2, otherwise instantiates
240
- #3 if present, returning instantiation as replacement value.
241
-
242
- # *{wlang/hosted as x}{...}{...}
243
- - name: "enumeration<br/>(third block is optional)"
244
- symbol: "*"
245
- signature: "*{wlang/hosted <as x>?}{...}{...}"
246
- definition: |-
247
- Instantiates #1, looking for an expression in the hosting language. Evaluates
248
- it, looking for an enumerable. Iterates all its elements, instantiating #2 for
249
- each of them (the iterated value is set under name x in the scope). If #3 is
250
- present, it is instantiated between elements. Replacement is the concatenation
251
- of all these instantiations.
252
-
253
- - name: Context
254
- description: |-
255
- Complex templates come with specific needs. The ability to manipulate the context and the current
256
- scope is provided by the Context ruleset. All are variants of 'saving previous instantiations' in
257
- scope variables...
258
- examples:
259
- - ["wlang/*", '={name as n}{Hello !{n}}', "Hello O'Neil"]
260
- - ["wlang/*", '={name as n}Hello !{n}', "Hello O'Neil"]
261
- - ["wlang/*", '#={name}{blambeau}{Hello !{name}} and !{name}', "Hello blambeau and O'Neil"]
262
- - ["wlang/*", '#={name}{blambeau}Hello !{name} and !{name}', "Hello blambeau and blambeau"]
263
- - ["wlang/*", '={author as name}{Hello !{name}} and !{name}', "Hello blambeau and O'Neil"]
264
- - ["wlang/*", '={author as name}Hello !{name} and !{name}', "Hello blambeau and blambeau"]
265
- - ["wlang/*", '%={wlang/dummy as hello}{Hello !{name}}{!{hello}}', "Hello !{name}"]
266
- - ["wlang/*", '^={plain-text/upcase as name}{!{author}}{Hello !{name}} and !{name}', "Hello BLAMBEAU and O'Neil"]
267
- - ["wlang/*", '^={plain-text/upcase as name}{!{author}}Hello !{name} and !{name}', "Hello BLAMBEAU and BLAMBEAU"]
268
-
269
- rules:
270
- # ={wlang/hosted as x}{...}
271
- - name: "assignment<br/>(second block is optional)"
272
- symbol: "="
273
- signature: "={wlang/hosted <as x>}{...}"
274
- definition: |-
275
- Instantiates #1, looking for an expression in the hosting language. Evaluates
276
- it, looking for any object. Without second block, expands the current scope with
277
- 'x' being bound to evaluation result. Otherwise, branches the current scope for
278
- the second block instantiation only and bind 'x' the same way (i.e. x will not be
279
- available outside the second block). Returns an empty string as replacement value.
280
- # %={wlang/active-string as x}{...}{...}
281
- - name: "modulo-assignment<br/>(third block is optional)"
282
- symbol: "%="
283
- signature: "%={wlang/active-string <as x>}{...}{...}"
284
- definition: |-
285
- Instantiates #1, looking for a dialect qualified name. Instantiates #2 according
286
- to the rules defined by that dialect. Without third block, expands the current
287
- scope with 'x' being bound to #2's instantiation. Otherwise, branches the current
288
- scope for the third block instantiation only and binds 'x' the same way (i.e. x will
289
- not be available outside the third block). Returns an empty string as replacement
290
- value.
291
- # #={wlang/active-string}{...}{...}
292
- - name: "block-assignment<br/>(third block is optional)"
293
- symbol: "="
294
- signature: "#={wlang/active-string}{...}{...}"
295
- definition: |-
296
- <tt>%={+{@parser.current_dialect} as #1}{#2}{#3}</tt>
297
- # ^={wlang/active-string as x}{...}{...}
298
- - name: "encoding-assignment<br/>(third block is optional)"
299
- symbol: "^="
300
- signature: "^={wlang/active-string <as x>}{...}{...}"
301
- definition: |-
302
- <tt>%={+{@parser.current_dialect} as x}{^{#1}{#2}}{#3}</tt>
303
-
304
- - name: Buffering
305
- description: |-
306
- The Buffering ruleset is probably one of the more useful. It allows you to load text and data files,
307
- to change the current output buffer (for generating multiple files for example) and even to start
308
- the instantiation on other templates.
309
- rules:
310
- # <<{wlang/uri}
311
- - name: "input"
312
- symbol: "<<"
313
- signature: "<<{wlang/uri}"
314
- definition: |-
315
- Instantiates #1, looking for an uri. Returns the text content of the found
316
- uri (#1) as replacement value.
317
- # >>{wlang/uri}
318
- - name: "output"
319
- symbol: ">>"
320
- signature: ">>{wlang/uri}{...}"
321
- definition: |-
322
- Instantiates #1, looking for an uri. Instantiates #2 in the current dialect,
323
- using the file found in #1 as output buffer. Returns an empty string as replacement
324
- value.
325
- # <<={wlang/uri as x}{...}
326
- - name: "data-assignment"
327
- symbol: "<<="
328
- signature: "<<={wlang/uri <as x>}{...}"
329
- definition: |-
330
- Instantiates #1, looking for an uri. Loads data provided by this uri, based on the
331
- file extension (typically .yml or .rb). Without second block, expands the current scope
332
- with 'x' being bound to the data. Otherwise, branches the current scope for the second
333
- block instantiation only and binds 'x' the same way (i.e. x will not be available outside
334
- the second block). Returns an empty string as replacement value.
335
- # <<+{wlang/uri with ...}
336
- - name: "input-inclusion"
337
- symbol: "<<+"
338
- signature: "<<+{wlang/uri <using>? <with>?}"
339
- definition: |-
340
- Instantiates #1, looking for an uri. Instantiates the _wlang_ template at this location
341
- (the dialect is infered from the file extension) in a fresh new scope built from the _with_
342
- expression. Returns this instantiation as replacement value.
343
-
344
- symbols:
345
- - name: exclamation mark
346
- symbol: '!'
347
- meaning: execution
348
- remark: should never be overrided as single
349
- - name: 'caret/circumflex'
350
- symbol: '^'
351
- meaning: explicit encoding
352
- remark: should never be overrided as single
353
- - name: percent
354
- symbol: '%'
355
- meaning: modulation
356
- remark: should never be overrided as single
357
- - name: double quote
358
- symbol: '"'
359
- meaning: double-quoting
360
- - name: dollar
361
- symbol: '$'
362
- meaning: 'main-encoding'
363
- - name: ampersand
364
- symbol: '&'
365
- meaning: encoding
366
- - name: single quote
367
- symbol: "'"
368
- meaning: single-quoting
369
- - name: asterisk
370
- symbol: '*'
371
- meaning: iteration
372
- - name: plus
373
- symbol: '+'
374
- meaning: inclusion
375
- - name: question mark
376
- symbol: '?'
377
- meaning: condition
378
- - name: at symbol
379
- symbol: '@'
380
- meaning: linking
381
- - name: tilde
382
- symbol: '~'
383
- meaning: matching
384
- - name: number sign
385
- symbol: '#'
386
- - name: comma
387
- symbol: ','
388
- - name: minus (dash)
389
- symbol: '-'
390
- - name: dot
391
- symbol: '.'
392
- - name: forward slash
393
- symbol: '/'
394
- - name: colon
395
- symbol: ':'
396
- - name: 'semi-colon'
397
- symbol: ';'
398
- - name: equal sign
399
- symbol: '='
400
- - name: less than
401
- symbol: '<'
402
- - name: greater than
403
- symbol: '>'
404
- - name: vertical bar
405
- symbol: '|'
406
- - name: underscore
407
- symbol: '_'
408
- remark: cannot be used as tag symbol; reserved for escaping in future versions
409
- - name: back slash
410
- symbol: \
411
- remark: cannot be used as tag symbol; reserved for escaping in current version
412
- - name: left parenthesis
413
- symbol: '('
414
- remark: cannot be used as tag symbol; reserved for block delimiter
415
- - name: right parenthesis
416
- symbol: ')'
417
- remark: cannot be used as tag symbol; reserved for block delimiter
418
- - name: left bracket
419
- symbol: '['
420
- remark: cannot be used as tag symbol; reserved for block delimiter
421
- - name: right bracket
422
- symbol: ']'
423
- remark: cannot be used as tag symbol; reserved for block delimiter
424
- - name: left brace
425
- symbol: '{'
426
- remark: cannot be used as tag symbol; reserved for block delimiter
427
- - name: right brace
428
- symbol: '}'
429
- remark: cannot be used as tag symbol; reserved for block delimiter
430
-
431
-
432
-