kosmas58-cucumber 0.1.16.6 → 0.1.99.21

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 (248) hide show
  1. data/History.txt +126 -2
  2. data/License.txt +1 -1
  3. data/Manifest.txt +0 -270
  4. data/Rakefile +1 -1
  5. data/bin/cucumber +2 -2
  6. data/config/hoe.rb +7 -2
  7. data/examples/cs/features/step_definitons/calculator_steps.rb +1 -1
  8. data/examples/i18n/README.textile +1 -1
  9. data/examples/i18n/Rakefile +3 -3
  10. data/examples/i18n/ar/features/step_definitons/calculator_steps.rb +1 -6
  11. data/examples/i18n/da/features/step_definitons/kalkulator_steps.rb +1 -1
  12. data/examples/i18n/de/features/addition.feature +6 -6
  13. data/examples/i18n/de/features/step_definitons/calculator_steps.rb +2 -2
  14. data/examples/i18n/en/features/addition.feature +6 -6
  15. data/examples/i18n/en/features/step_definitons/calculator_steps.rb +2 -2
  16. data/examples/i18n/es/features/adicion.feature +11 -12
  17. data/examples/i18n/es/features/step_definitons/calculador_steps.rb +7 -10
  18. data/examples/i18n/es/lib/calculador.rb +4 -1
  19. data/examples/i18n/et/features/liitmine.feature +7 -6
  20. data/examples/i18n/et/features/step_definitions/kalkulaator_steps.rb +1 -1
  21. data/examples/i18n/fi/features/step_definitons/laskin_steps.rb +1 -1
  22. data/examples/i18n/fi/features/yhteenlasku.feature +2 -2
  23. data/examples/i18n/fr/features/addition.feature +2 -2
  24. data/examples/i18n/fr/features/step_definitions/calculatrice_steps.rb +1 -1
  25. data/examples/i18n/id/features/addition.feature +6 -6
  26. data/examples/i18n/id/features/step_definitons/calculator_steps.rb +2 -2
  27. data/examples/i18n/it/features/step_definitons/calcolatrice_steps.rb +1 -1
  28. data/examples/i18n/ja/features/step_definitons/calculator_steps.rb +2 -3
  29. data/examples/i18n/ko/features/step_definitons/calculator_steps.rb +1 -1
  30. data/examples/i18n/lt/features/addition.feature +7 -6
  31. data/examples/i18n/lt/features/step_definitons/calculator_steps.rb +2 -2
  32. data/examples/i18n/no/features/step_definitons/kalkulator_steps.rb +7 -7
  33. data/examples/i18n/no/features/summering.feature +1 -0
  34. data/examples/i18n/pt/features/step_definitions/calculadora_steps.rb +1 -1
  35. data/examples/i18n/ro/features/step_definitons/calculator_steps.rb +1 -1
  36. data/examples/i18n/se/features/step_definitons/kalkulator_steps.rb +1 -1
  37. data/examples/i18n/zh-CN/features/step_definitons/calculator_steps.rb +2 -2
  38. data/examples/java/src/cucumber/demo/Hello.java +16 -0
  39. data/examples/jbehave/README.textile +17 -0
  40. data/examples/jbehave/features/support/env.rb +7 -0
  41. data/examples/jbehave/features/trading.feature +24 -0
  42. data/examples/jbehave/pom.xml +48 -0
  43. data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/converters/TraderConverter.java +32 -0
  44. data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/model/Stock.java +42 -0
  45. data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/model/Trader.java +29 -0
  46. data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/persistence/TraderPersister.java +22 -0
  47. data/examples/jbehave/src/main/java/cukes/jbehave/examples/trader/scenarios/TraderSteps.java +65 -0
  48. data/examples/self_test/README.textile +4 -1
  49. data/examples/{calculator_ruby_features → self_test}/Rakefile +3 -3
  50. data/examples/self_test/features/background/failing_background.feature +10 -0
  51. data/examples/self_test/features/background/failing_background_after_success.feature +11 -0
  52. data/examples/self_test/features/background/multiline_args_background.feature +32 -0
  53. data/examples/self_test/features/background/passing_background.feature +10 -0
  54. data/examples/self_test/features/background/pending_background.feature +10 -0
  55. data/examples/self_test/features/background/scenario_outline_failing_background.feature +16 -0
  56. data/examples/self_test/features/background/scenario_outline_passing_background.feature +16 -0
  57. data/examples/self_test/features/call_undefined_step_from_step_def.feature +7 -0
  58. data/examples/self_test/features/lots_of_undefined.feature +8 -0
  59. data/examples/self_test/features/outline_sample.feature +11 -5
  60. data/examples/self_test/features/sample.feature +8 -3
  61. data/examples/self_test/features/step_definitions/sample_steps.rb +53 -4
  62. data/examples/self_test/features/support/env.rb +1 -0
  63. data/examples/self_test/features/support/tag_count_formatter.rb +25 -0
  64. data/examples/tickets/features/172.feature +28 -0
  65. data/examples/tickets/features/177/1.feature +29 -0
  66. data/examples/tickets/features/177/2.feature +21 -0
  67. data/examples/tickets/features/177/3.feature +18 -0
  68. data/examples/tickets/features/180.feature +7 -0
  69. data/examples/tickets/features/scenario_outline.feature +6 -1
  70. data/examples/tickets/features/step_definitons/tickets_steps.rb +27 -3
  71. data/examples/tickets/features/tickets.feature +4 -0
  72. data/features/background.feature +223 -0
  73. data/features/cucumber_cli.feature +218 -98
  74. data/features/cucumber_cli_outlines.feature +54 -37
  75. data/features/custom_formatter.feature +11 -0
  76. data/features/report_called_undefined_steps.feature +32 -0
  77. data/features/step_definitions/cucumber_steps.rb +7 -3
  78. data/features/step_definitions/extra_steps.rb +1 -1
  79. data/features/support/env.rb +2 -1
  80. data/gem_tasks/flog.rake +1 -1
  81. data/gem_tasks/gemspec.rake +2 -2
  82. data/gem_tasks/jar.rake +67 -0
  83. data/lib/autotest/cucumber_mixin.rb +17 -23
  84. data/lib/cucumber.rb +63 -11
  85. data/lib/cucumber/ast.rb +29 -0
  86. data/lib/cucumber/ast/background.rb +88 -0
  87. data/lib/cucumber/ast/comment.rb +26 -0
  88. data/lib/cucumber/ast/examples.rb +26 -0
  89. data/lib/cucumber/ast/feature.rb +66 -0
  90. data/lib/cucumber/ast/features.rb +39 -0
  91. data/lib/cucumber/ast/filter.rb +22 -0
  92. data/lib/cucumber/ast/outline_table.rb +49 -0
  93. data/lib/cucumber/ast/py_string.rb +52 -0
  94. data/lib/cucumber/ast/scenario.rb +103 -0
  95. data/lib/cucumber/ast/scenario_outline.rb +92 -0
  96. data/lib/cucumber/ast/step.rb +161 -0
  97. data/lib/cucumber/ast/steps.rb +13 -0
  98. data/lib/cucumber/ast/table.rb +218 -0
  99. data/lib/cucumber/ast/tags.rb +40 -0
  100. data/lib/cucumber/ast/visitor.rb +109 -0
  101. data/lib/cucumber/broadcaster.rb +1 -6
  102. data/lib/cucumber/cli/configuration.rb +339 -0
  103. data/lib/cucumber/cli/language_help_formatter.rb +59 -0
  104. data/lib/cucumber/cli/main.rb +100 -0
  105. data/lib/cucumber/core_ext/exception.rb +41 -8
  106. data/lib/cucumber/core_ext/instance_exec.rb +54 -0
  107. data/lib/cucumber/core_ext/proc.rb +29 -65
  108. data/lib/cucumber/core_ext/string.rb +19 -0
  109. data/lib/cucumber/formatter.rb +1 -0
  110. data/lib/cucumber/{formatters → formatter}/ansicolor.rb +14 -16
  111. data/lib/cucumber/formatter/color_io.rb +17 -0
  112. data/lib/cucumber/formatter/console.rb +119 -0
  113. data/lib/cucumber/formatter/cucumber.css +55 -0
  114. data/lib/cucumber/formatter/cucumber.sass +49 -0
  115. data/lib/cucumber/formatter/html.rb +121 -0
  116. data/lib/cucumber/formatter/pretty.rb +167 -0
  117. data/lib/cucumber/formatter/profile.rb +77 -0
  118. data/lib/cucumber/formatter/progress.rb +68 -0
  119. data/lib/cucumber/formatter/rerun.rb +35 -0
  120. data/lib/cucumber/formatter/unicode.rb +35 -0
  121. data/lib/cucumber/formatters/unicode.rb +2 -35
  122. data/lib/cucumber/jbehave.rb +102 -0
  123. data/lib/cucumber/languages.yml +128 -75
  124. data/lib/cucumber/parser.rb +43 -0
  125. data/lib/cucumber/parser/basic.rb +0 -0
  126. data/lib/cucumber/parser/feature.rb +1490 -0
  127. data/lib/cucumber/parser/feature.tt +188 -0
  128. data/lib/cucumber/parser/i18n.tt +31 -0
  129. data/lib/cucumber/parser/table.rb +402 -0
  130. data/lib/cucumber/parser/table.tt +59 -0
  131. data/lib/cucumber/parser/treetop_ext.rb +75 -0
  132. data/lib/cucumber/platform.rb +3 -17
  133. data/lib/cucumber/rails/rspec.rb +5 -2
  134. data/lib/cucumber/step_definition.rb +87 -0
  135. data/lib/cucumber/step_mother.rb +151 -66
  136. data/lib/cucumber/version.rb +2 -2
  137. data/rails_generators/cucumber/USAGE +3 -2
  138. data/rails_generators/cucumber/cucumber_generator.rb +33 -23
  139. data/rails_generators/cucumber/templates/cucumber +2 -1
  140. data/rails_generators/cucumber/templates/cucumber.rake +6 -1
  141. data/rails_generators/cucumber/templates/env.rb +1 -1
  142. data/rails_generators/feature/USAGE +3 -0
  143. data/rails_generators/feature/feature_generator.rb +30 -6
  144. data/spec/cucumber/ast/background_spec.rb +58 -0
  145. data/spec/cucumber/ast/feature_factory.rb +54 -0
  146. data/spec/cucumber/ast/feature_spec.rb +60 -0
  147. data/spec/cucumber/ast/py_string_spec.rb +40 -0
  148. data/spec/cucumber/ast/scenario_outline_spec.rb +64 -0
  149. data/spec/cucumber/ast/scenario_spec.rb +82 -0
  150. data/spec/cucumber/ast/step_spec.rb +45 -0
  151. data/spec/cucumber/ast/table_spec.rb +81 -0
  152. data/spec/cucumber/ast/tags_spec.rb +23 -0
  153. data/spec/cucumber/broadcaster_spec.rb +4 -17
  154. data/spec/cucumber/cli/configuration_spec.rb +239 -0
  155. data/spec/cucumber/cli/main_spec.rb +164 -0
  156. data/spec/cucumber/core_ext/proc_spec.rb +27 -35
  157. data/spec/cucumber/core_ext/string_spec.rb +8 -0
  158. data/spec/cucumber/{formatters → formatter}/ansicolor_spec.rb +2 -2
  159. data/spec/cucumber/formatter/html/cucumber.css +37 -0
  160. data/spec/cucumber/formatter/html/cucumber.js +13 -0
  161. data/spec/cucumber/formatter/html/index.html +45 -0
  162. data/spec/cucumber/formatter/html/jquery-1.3.min.js +19 -0
  163. data/spec/cucumber/formatter/html/jquery.uitableedit.js +100 -0
  164. data/spec/cucumber/formatters/profile_formatter_spec.rb +17 -16
  165. data/spec/cucumber/parser/feature_parser_spec.rb +281 -0
  166. data/spec/cucumber/parser/table_parser_spec.rb +48 -0
  167. data/spec/cucumber/step_definition_spec.rb +62 -0
  168. data/spec/cucumber/step_mother_spec.rb +50 -51
  169. data/spec/cucumber/treetop_parser/empty_feature.feature +1 -1
  170. data/spec/cucumber/treetop_parser/scenario_outline.feature +1 -1
  171. data/spec/cucumber/treetop_parser/spaces.feature +3 -1
  172. data/spec/cucumber/treetop_parser/with_comments.feature +1 -1
  173. data/spec/cucumber/treetop_parser/with_tags.feature +18 -0
  174. data/spec/cucumber/world/pending_spec.rb +13 -12
  175. data/spec/spec_helper.rb +1 -1
  176. metadata +107 -79
  177. data/examples/calculator_ruby_features/features/addition.rb +0 -39
  178. data/examples/calculator_ruby_features/features/step_definitons/calculator_steps.rb +0 -43
  179. data/gem_tasks/treetop.rake +0 -41
  180. data/lib/cucumber/cli.rb +0 -355
  181. data/lib/cucumber/executor.rb +0 -205
  182. data/lib/cucumber/formatters.rb +0 -1
  183. data/lib/cucumber/formatters/autotest_formatter.rb +0 -23
  184. data/lib/cucumber/formatters/cucumber.css +0 -132
  185. data/lib/cucumber/formatters/cucumber.js +0 -11
  186. data/lib/cucumber/formatters/html_formatter.rb +0 -152
  187. data/lib/cucumber/formatters/jquery.js +0 -32
  188. data/lib/cucumber/formatters/pretty_formatter.rb +0 -285
  189. data/lib/cucumber/formatters/profile_formatter.rb +0 -92
  190. data/lib/cucumber/formatters/progress_formatter.rb +0 -61
  191. data/lib/cucumber/model.rb +0 -1
  192. data/lib/cucumber/model/table.rb +0 -32
  193. data/lib/cucumber/step_methods.rb +0 -49
  194. data/lib/cucumber/tree.rb +0 -16
  195. data/lib/cucumber/tree/feature.rb +0 -105
  196. data/lib/cucumber/tree/features.rb +0 -21
  197. data/lib/cucumber/tree/given_scenario.rb +0 -13
  198. data/lib/cucumber/tree/scenario.rb +0 -240
  199. data/lib/cucumber/tree/step.rb +0 -173
  200. data/lib/cucumber/tree/table.rb +0 -26
  201. data/lib/cucumber/tree/top_down_visitor.rb +0 -23
  202. data/lib/cucumber/treetop_parser/feature.treetop.erb +0 -254
  203. data/lib/cucumber/treetop_parser/feature_ar.rb +0 -1951
  204. data/lib/cucumber/treetop_parser/feature_cy.rb +0 -1951
  205. data/lib/cucumber/treetop_parser/feature_da.rb +0 -1951
  206. data/lib/cucumber/treetop_parser/feature_de.rb +0 -1951
  207. data/lib/cucumber/treetop_parser/feature_en-lol.rb +0 -1951
  208. data/lib/cucumber/treetop_parser/feature_en-tx.rb +0 -1951
  209. data/lib/cucumber/treetop_parser/feature_en.rb +0 -1951
  210. data/lib/cucumber/treetop_parser/feature_es.rb +0 -1951
  211. data/lib/cucumber/treetop_parser/feature_et.rb +0 -1951
  212. data/lib/cucumber/treetop_parser/feature_fi.rb +0 -1951
  213. data/lib/cucumber/treetop_parser/feature_fr.rb +0 -1951
  214. data/lib/cucumber/treetop_parser/feature_id.rb +0 -1951
  215. data/lib/cucumber/treetop_parser/feature_it.rb +0 -1951
  216. data/lib/cucumber/treetop_parser/feature_ja.rb +0 -1951
  217. data/lib/cucumber/treetop_parser/feature_ko.rb +0 -1951
  218. data/lib/cucumber/treetop_parser/feature_lt.rb +0 -1951
  219. data/lib/cucumber/treetop_parser/feature_nl.rb +0 -1951
  220. data/lib/cucumber/treetop_parser/feature_no.rb +0 -1951
  221. data/lib/cucumber/treetop_parser/feature_parser.rb +0 -36
  222. data/lib/cucumber/treetop_parser/feature_pl.rb +0 -1951
  223. data/lib/cucumber/treetop_parser/feature_pt.rb +0 -1951
  224. data/lib/cucumber/treetop_parser/feature_ro.rb +0 -1951
  225. data/lib/cucumber/treetop_parser/feature_ro2.rb +0 -1951
  226. data/lib/cucumber/treetop_parser/feature_ru.rb +0 -1951
  227. data/lib/cucumber/treetop_parser/feature_se.rb +0 -1951
  228. data/lib/cucumber/treetop_parser/feature_zh-CN.rb +0 -1951
  229. data/lib/cucumber/world.rb +0 -1
  230. data/lib/cucumber/world/pending.rb +0 -22
  231. data/setup.rb +0 -1585
  232. data/spec/cucumber/cli_spec.rb +0 -521
  233. data/spec/cucumber/executor_spec.rb +0 -382
  234. data/spec/cucumber/formatters/autotest_formatter_spec.rb +0 -26
  235. data/spec/cucumber/formatters/features.html +0 -269
  236. data/spec/cucumber/formatters/html_formatter_spec.rb +0 -110
  237. data/spec/cucumber/formatters/pretty_formatter_spec.rb +0 -410
  238. data/spec/cucumber/formatters/progress_formatter_spec.rb +0 -81
  239. data/spec/cucumber/model/table_spec.rb +0 -32
  240. data/spec/cucumber/tree/feature_spec.rb +0 -122
  241. data/spec/cucumber/tree/row_scenario_outline_spec.rb +0 -73
  242. data/spec/cucumber/tree/row_scenario_spec.rb +0 -55
  243. data/spec/cucumber/tree/row_step_outline_spec.rb +0 -38
  244. data/spec/cucumber/tree/scenario_outline_spec.rb +0 -50
  245. data/spec/cucumber/tree/scenario_spec.rb +0 -134
  246. data/spec/cucumber/tree/step_outline_spec.rb +0 -17
  247. data/spec/cucumber/tree/step_spec.rb +0 -59
  248. data/spec/cucumber/treetop_parser/feature_parser_spec.rb +0 -120
@@ -0,0 +1,188 @@
1
+ module Cucumber
2
+ module Parser
3
+ # TIP: When you hack on the grammar, just delete feature.rb in this directory.
4
+ # Also make sure you have uninstalled all cucumber gems (don't forget xxx-cucumber
5
+ # github gems).
6
+ #
7
+ # Treetop will then generate the parser in-memory. When you're happy, just generate
8
+ # the rb file with tt feature.tt
9
+ grammar Feature
10
+ include I18n
11
+ include Table
12
+
13
+ rule feature
14
+ white
15
+ comment
16
+ white
17
+ tags
18
+ white
19
+ header:(!(scenario_outline / scenario / background) .)*
20
+ background:(background)?
21
+ feature_elements
22
+ comment? {
23
+ def build
24
+ if background.respond_to?(:build)
25
+ Ast::Feature.new(comment.build, tags.build, header.text_value, feature_elements.build, background.build)
26
+ else
27
+ Ast::Feature.new(comment.build, tags.build, header.text_value, feature_elements.build)
28
+ end
29
+ end
30
+ }
31
+ end
32
+
33
+ rule tags
34
+ white ts:(tag (space/eol)+)* {
35
+ def build
36
+ tag_names = ts.elements.map{|e| e.tag.tag_name.text_value}
37
+ Ast::Tags.new(ts.line, tag_names)
38
+ end
39
+ }
40
+ end
41
+
42
+ rule tag
43
+ '@' tag_name:([a-z0-9])+
44
+ end
45
+
46
+ rule comment
47
+ (comment_line white)* {
48
+ def build
49
+ Ast::Comment.new(text_value)
50
+ end
51
+ }
52
+ end
53
+
54
+ rule comment_line
55
+ '#' line_to_eol
56
+ end
57
+
58
+ rule background
59
+ comment white background_keyword space* (eol+ / eof) steps {
60
+ def build
61
+ Ast::Background.new(
62
+ comment.build,
63
+ background_keyword.line,
64
+ background_keyword.text_value,
65
+ steps.build
66
+ )
67
+ end
68
+ }
69
+ end
70
+
71
+ rule feature_elements
72
+ (scenario / scenario_outline)* {
73
+ def build
74
+ elements.map{|s| s.build}
75
+ end
76
+ }
77
+ end
78
+
79
+ rule scenario
80
+ comment tags white scenario_keyword space* name:line_to_eol (white / eof) steps white {
81
+ def build
82
+ Ast::Scenario.new(
83
+ comment.build,
84
+ tags.build,
85
+ scenario_keyword.line,
86
+ scenario_keyword.text_value,
87
+ name.text_value,
88
+ steps.build
89
+ )
90
+ end
91
+ }
92
+ end
93
+
94
+ rule scenario_outline
95
+ comment tags white scenario_outline_keyword space* name:line_to_eol white steps examples_sections white {
96
+ def build
97
+ Ast::ScenarioOutline.new(
98
+ comment.build,
99
+ tags.build,
100
+ scenario_outline_keyword.line,
101
+ scenario_outline_keyword.text_value,
102
+ name.text_value,
103
+ steps.build,
104
+ examples_sections.build
105
+ )
106
+ end
107
+ }
108
+ end
109
+
110
+ rule steps
111
+ step* {
112
+ def build
113
+ elements.map{|e| e.build}
114
+ end
115
+ }
116
+ end
117
+
118
+ rule step
119
+ comment space* step_keyword space* name:line_to_eol (eol+ / eof) multi:multiline_arg? white {
120
+ def build
121
+ if multi.respond_to?(:build)
122
+ Ast::Step.new(step_keyword.line, step_keyword.text_value, name.text_value.strip, multi.build)
123
+ else
124
+ Ast::Step.new(step_keyword.line, step_keyword.text_value, name.text_value.strip)
125
+ end
126
+ end
127
+ }
128
+ end
129
+
130
+ rule examples_sections
131
+ examples* {
132
+ def build
133
+ elements.map{|e| e.build}
134
+ end
135
+ }
136
+ end
137
+
138
+ rule examples
139
+ space* examples_keyword space* name:line_to_eol? eol table white {
140
+ def build
141
+ [examples_keyword.line, examples_keyword.text_value, name.text_value, table.raw]
142
+ end
143
+ }
144
+ end
145
+
146
+ rule multiline_arg
147
+ table / py_string
148
+ end
149
+
150
+ rule line_to_eol
151
+ (!eol .)*
152
+ end
153
+
154
+ rule py_string
155
+ open_py_string s:(!close_py_string .)* close_py_string {
156
+ def build
157
+ Ast::PyString.new(open_py_string.line, close_py_string.line, s.text_value, open_py_string.indentation)
158
+ end
159
+ }
160
+ end
161
+
162
+ rule open_py_string
163
+ white '"""' space* eol {
164
+ def indentation
165
+ white.text_value.length
166
+ end
167
+
168
+ def line
169
+ white.line
170
+ end
171
+ }
172
+ end
173
+
174
+ rule close_py_string
175
+ eol space* quotes:'"""' white {
176
+ def line
177
+ quotes.line
178
+ end
179
+ }
180
+ end
181
+
182
+ rule white
183
+ (space / eol)*
184
+ end
185
+
186
+ end
187
+ end
188
+ end
@@ -0,0 +1,31 @@
1
+ module Cucumber
2
+ module Parser
3
+ grammar I18n
4
+
5
+ rule background_keyword
6
+ (<%= keywords('background') %>) ':'
7
+ end
8
+
9
+ rule scenario_keyword
10
+ (<%= keywords('scenario') %>) ':'
11
+ end
12
+
13
+ rule scenario_outline_keyword
14
+ (<%= keywords('scenario_outline') %>) ':'
15
+ end
16
+
17
+ rule step_keyword
18
+ (<%= keywords('given') %>) /
19
+ (<%= keywords('when') %>) /
20
+ (<%= keywords('then') %>) /
21
+ (<%= keywords('and') %>) /
22
+ (<%= keywords('but') %>)
23
+ end
24
+
25
+ rule examples_keyword
26
+ (<%= keywords('examples') %>) ':'?
27
+ end
28
+
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,402 @@
1
+ module Cucumber
2
+ module Parser
3
+ # TIP: When you hack on the grammar, just delete feature.rb in this directory.
4
+ # Also make sure you have uninstalled all cucumber gems (don't forget xxx-cucumber
5
+ # github gems).
6
+ #
7
+ # Treetop will then generate the parser in-memory. When you're happy, just generate
8
+ # the rb file with tt feature.tt
9
+ module Table
10
+ include Treetop::Runtime
11
+
12
+ def root
13
+ @root || :table
14
+ end
15
+
16
+ module Table0
17
+ def build
18
+ Ast::Table.new(raw)
19
+ end
20
+
21
+ def raw
22
+ elements.map{|e| e.build}
23
+ end
24
+ end
25
+
26
+ def _nt_table
27
+ start_index = index
28
+ if node_cache[:table].has_key?(index)
29
+ cached = node_cache[:table][index]
30
+ @index = cached.interval.end if cached
31
+ return cached
32
+ end
33
+
34
+ s0, i0 = [], index
35
+ loop do
36
+ r1 = _nt_table_row
37
+ if r1
38
+ s0 << r1
39
+ else
40
+ break
41
+ end
42
+ end
43
+ if s0.empty?
44
+ self.index = i0
45
+ r0 = nil
46
+ else
47
+ r0 = SyntaxNode.new(input, i0...index, s0)
48
+ r0.extend(Table0)
49
+ end
50
+
51
+ node_cache[:table][start_index] = r0
52
+
53
+ return r0
54
+ end
55
+
56
+ module TableRow0
57
+ def cell
58
+ elements[0]
59
+ end
60
+
61
+ end
62
+
63
+ module TableRow1
64
+ def cells
65
+ elements[2]
66
+ end
67
+
68
+ end
69
+
70
+ module TableRow2
71
+ def build
72
+ row = cells.elements.map do |elt|
73
+ value = elt.cell.text_value.strip
74
+ value.empty? ? nil : value
75
+ end
76
+
77
+ class << row
78
+ attr_accessor :line
79
+ end
80
+ row.line = cells.line
81
+
82
+ row
83
+ end
84
+ end
85
+
86
+ def _nt_table_row
87
+ start_index = index
88
+ if node_cache[:table_row].has_key?(index)
89
+ cached = node_cache[:table_row][index]
90
+ @index = cached.interval.end if cached
91
+ return cached
92
+ end
93
+
94
+ i0, s0 = index, []
95
+ s1, i1 = [], index
96
+ loop do
97
+ r2 = _nt_space
98
+ if r2
99
+ s1 << r2
100
+ else
101
+ break
102
+ end
103
+ end
104
+ r1 = SyntaxNode.new(input, i1...index, s1)
105
+ s0 << r1
106
+ if r1
107
+ if input.index('|', index) == index
108
+ r3 = (SyntaxNode).new(input, index...(index + 1))
109
+ @index += 1
110
+ else
111
+ terminal_parse_failure('|')
112
+ r3 = nil
113
+ end
114
+ s0 << r3
115
+ if r3
116
+ s4, i4 = [], index
117
+ loop do
118
+ i5, s5 = index, []
119
+ r6 = _nt_cell
120
+ s5 << r6
121
+ if r6
122
+ if input.index('|', index) == index
123
+ r7 = (SyntaxNode).new(input, index...(index + 1))
124
+ @index += 1
125
+ else
126
+ terminal_parse_failure('|')
127
+ r7 = nil
128
+ end
129
+ s5 << r7
130
+ end
131
+ if s5.last
132
+ r5 = (SyntaxNode).new(input, i5...index, s5)
133
+ r5.extend(TableRow0)
134
+ else
135
+ self.index = i5
136
+ r5 = nil
137
+ end
138
+ if r5
139
+ s4 << r5
140
+ else
141
+ break
142
+ end
143
+ end
144
+ if s4.empty?
145
+ self.index = i4
146
+ r4 = nil
147
+ else
148
+ r4 = SyntaxNode.new(input, i4...index, s4)
149
+ end
150
+ s0 << r4
151
+ if r4
152
+ s8, i8 = [], index
153
+ loop do
154
+ r9 = _nt_space
155
+ if r9
156
+ s8 << r9
157
+ else
158
+ break
159
+ end
160
+ end
161
+ r8 = SyntaxNode.new(input, i8...index, s8)
162
+ s0 << r8
163
+ if r8
164
+ i10 = index
165
+ s11, i11 = [], index
166
+ loop do
167
+ r12 = _nt_eol
168
+ if r12
169
+ s11 << r12
170
+ else
171
+ break
172
+ end
173
+ end
174
+ if s11.empty?
175
+ self.index = i11
176
+ r11 = nil
177
+ else
178
+ r11 = SyntaxNode.new(input, i11...index, s11)
179
+ end
180
+ if r11
181
+ r10 = r11
182
+ else
183
+ r13 = _nt_eof
184
+ if r13
185
+ r10 = r13
186
+ else
187
+ self.index = i10
188
+ r10 = nil
189
+ end
190
+ end
191
+ s0 << r10
192
+ end
193
+ end
194
+ end
195
+ end
196
+ if s0.last
197
+ r0 = (SyntaxNode).new(input, i0...index, s0)
198
+ r0.extend(TableRow1)
199
+ r0.extend(TableRow2)
200
+ else
201
+ self.index = i0
202
+ r0 = nil
203
+ end
204
+
205
+ node_cache[:table_row][start_index] = r0
206
+
207
+ return r0
208
+ end
209
+
210
+ module Cell0
211
+ end
212
+
213
+ def _nt_cell
214
+ start_index = index
215
+ if node_cache[:cell].has_key?(index)
216
+ cached = node_cache[:cell][index]
217
+ @index = cached.interval.end if cached
218
+ return cached
219
+ end
220
+
221
+ s0, i0 = [], index
222
+ loop do
223
+ i1, s1 = index, []
224
+ i2 = index
225
+ i3 = index
226
+ if input.index('|', index) == index
227
+ r4 = (SyntaxNode).new(input, index...(index + 1))
228
+ @index += 1
229
+ else
230
+ terminal_parse_failure('|')
231
+ r4 = nil
232
+ end
233
+ if r4
234
+ r3 = r4
235
+ else
236
+ r5 = _nt_eol
237
+ if r5
238
+ r3 = r5
239
+ else
240
+ self.index = i3
241
+ r3 = nil
242
+ end
243
+ end
244
+ if r3
245
+ r2 = nil
246
+ else
247
+ self.index = i2
248
+ r2 = SyntaxNode.new(input, index...index)
249
+ end
250
+ s1 << r2
251
+ if r2
252
+ if index < input_length
253
+ r6 = (SyntaxNode).new(input, index...(index + 1))
254
+ @index += 1
255
+ else
256
+ terminal_parse_failure("any character")
257
+ r6 = nil
258
+ end
259
+ s1 << r6
260
+ end
261
+ if s1.last
262
+ r1 = (SyntaxNode).new(input, i1...index, s1)
263
+ r1.extend(Cell0)
264
+ else
265
+ self.index = i1
266
+ r1 = nil
267
+ end
268
+ if r1
269
+ s0 << r1
270
+ else
271
+ break
272
+ end
273
+ end
274
+ r0 = SyntaxNode.new(input, i0...index, s0)
275
+
276
+ node_cache[:cell][start_index] = r0
277
+
278
+ return r0
279
+ end
280
+
281
+ def _nt_space
282
+ start_index = index
283
+ if node_cache[:space].has_key?(index)
284
+ cached = node_cache[:space][index]
285
+ @index = cached.interval.end if cached
286
+ return cached
287
+ end
288
+
289
+ if input.index(Regexp.new('[ \\t]'), index) == index
290
+ r0 = (SyntaxNode).new(input, index...(index + 1))
291
+ @index += 1
292
+ else
293
+ r0 = nil
294
+ end
295
+
296
+ node_cache[:space][start_index] = r0
297
+
298
+ return r0
299
+ end
300
+
301
+ module Eol0
302
+ end
303
+
304
+ def _nt_eol
305
+ start_index = index
306
+ if node_cache[:eol].has_key?(index)
307
+ cached = node_cache[:eol][index]
308
+ @index = cached.interval.end if cached
309
+ return cached
310
+ end
311
+
312
+ i0 = index
313
+ if input.index("\n", index) == index
314
+ r1 = (SyntaxNode).new(input, index...(index + 1))
315
+ @index += 1
316
+ else
317
+ terminal_parse_failure("\n")
318
+ r1 = nil
319
+ end
320
+ if r1
321
+ r0 = r1
322
+ else
323
+ i2, s2 = index, []
324
+ if input.index("\r", index) == index
325
+ r3 = (SyntaxNode).new(input, index...(index + 1))
326
+ @index += 1
327
+ else
328
+ terminal_parse_failure("\r")
329
+ r3 = nil
330
+ end
331
+ s2 << r3
332
+ if r3
333
+ if input.index("\n", index) == index
334
+ r5 = (SyntaxNode).new(input, index...(index + 1))
335
+ @index += 1
336
+ else
337
+ terminal_parse_failure("\n")
338
+ r5 = nil
339
+ end
340
+ if r5
341
+ r4 = r5
342
+ else
343
+ r4 = SyntaxNode.new(input, index...index)
344
+ end
345
+ s2 << r4
346
+ end
347
+ if s2.last
348
+ r2 = (SyntaxNode).new(input, i2...index, s2)
349
+ r2.extend(Eol0)
350
+ else
351
+ self.index = i2
352
+ r2 = nil
353
+ end
354
+ if r2
355
+ r0 = r2
356
+ else
357
+ self.index = i0
358
+ r0 = nil
359
+ end
360
+ end
361
+
362
+ node_cache[:eol][start_index] = r0
363
+
364
+ return r0
365
+ end
366
+
367
+ def _nt_eof
368
+ start_index = index
369
+ if node_cache[:eof].has_key?(index)
370
+ cached = node_cache[:eof][index]
371
+ @index = cached.interval.end if cached
372
+ return cached
373
+ end
374
+
375
+ i0 = index
376
+ if index < input_length
377
+ r1 = (SyntaxNode).new(input, index...(index + 1))
378
+ @index += 1
379
+ else
380
+ terminal_parse_failure("any character")
381
+ r1 = nil
382
+ end
383
+ if r1
384
+ r0 = nil
385
+ else
386
+ self.index = i0
387
+ r0 = SyntaxNode.new(input, index...index)
388
+ end
389
+
390
+ node_cache[:eof][start_index] = r0
391
+
392
+ return r0
393
+ end
394
+
395
+ end
396
+
397
+ class TableParser < Treetop::Runtime::CompiledParser
398
+ include Table
399
+ end
400
+
401
+ end
402
+ end