vanilla 1.2 → 1.9.9

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 (106) hide show
  1. data/Rakefile +61 -60
  2. data/bin/vanilla +6 -35
  3. data/config.example.yml +6 -0
  4. data/config.ru +10 -0
  5. data/lib/defensio.rb +59 -0
  6. data/lib/tasks/vanilla.rake +173 -0
  7. data/lib/vanilla.rb +3 -10
  8. data/lib/vanilla/app.rb +48 -104
  9. data/lib/vanilla/console.rb +5 -19
  10. data/lib/vanilla/dynasnips/comments.rb +108 -0
  11. data/lib/vanilla/dynasnips/current_snip.rb +32 -0
  12. data/{pristine_app/soups → lib/vanilla}/dynasnips/debug.rb +3 -5
  13. data/lib/vanilla/dynasnips/edit.rb +60 -0
  14. data/lib/vanilla/dynasnips/edit_link.rb +20 -0
  15. data/{pristine_app/soups → lib/vanilla}/dynasnips/index.rb +2 -4
  16. data/{pristine_app/soups/extras → lib/vanilla/dynasnips}/kind.rb +12 -14
  17. data/{pristine_app/soups → lib/vanilla}/dynasnips/link_to.rb +0 -2
  18. data/lib/vanilla/dynasnips/link_to_current_snip.rb +16 -0
  19. data/lib/vanilla/dynasnips/login.rb +56 -0
  20. data/lib/vanilla/dynasnips/new.rb +14 -0
  21. data/lib/vanilla/dynasnips/notes.rb +42 -0
  22. data/{pristine_app/soups → lib/vanilla}/dynasnips/pre.rb +4 -6
  23. data/{pristine_app/soups/extras → lib/vanilla/dynasnips}/rand.rb +0 -2
  24. data/{pristine_app/soups → lib/vanilla}/dynasnips/raw.rb +5 -8
  25. data/{pristine_app/soups/extras → lib/vanilla/dynasnips}/url_to.rb +0 -0
  26. data/lib/vanilla/renderers/base.rb +22 -32
  27. data/lib/vanilla/renderers/bold.rb +2 -0
  28. data/lib/vanilla/renderers/erb.rb +2 -0
  29. data/lib/vanilla/renderers/markdown.rb +2 -0
  30. data/lib/vanilla/renderers/raw.rb +2 -0
  31. data/lib/vanilla/renderers/ruby.rb +5 -9
  32. data/lib/vanilla/renderers/textile.rb +2 -0
  33. data/lib/vanilla/request.rb +15 -16
  34. data/lib/vanilla/routes.rb +18 -5
  35. data/lib/vanilla/snip_reference.rb +534 -0
  36. data/lib/vanilla/snip_reference.treetop +48 -0
  37. data/lib/vanilla/snip_reference_parser.rb +99 -82
  38. data/lib/vanilla/snips/start.rb +28 -0
  39. data/lib/vanilla/snips/system.rb +77 -0
  40. data/lib/vanilla/snips/tutorial.rb +244 -0
  41. data/lib/vanilla/soup_with_timestamps.rb +21 -0
  42. data/public/hatch.png +0 -0
  43. data/public/javascripts/jquery.autogrow-textarea.js +54 -0
  44. data/public/javascripts/jquery.js +4376 -0
  45. data/public/javascripts/vanilla.js +22 -0
  46. data/spec/dynasnip_spec.rb +28 -0
  47. data/spec/renderers/base_renderer_spec.rb +40 -0
  48. data/spec/renderers/erb_renderer_spec.rb +27 -0
  49. data/spec/renderers/markdown_renderer_spec.rb +29 -0
  50. data/spec/renderers/raw_renderer_spec.rb +21 -0
  51. data/spec/renderers/ruby_renderer_spec.rb +59 -0
  52. data/spec/renderers/vanilla_app_detecting_renderer_spec.rb +35 -0
  53. data/spec/spec_helper.rb +70 -0
  54. data/spec/tmp/config.yml +2 -0
  55. data/spec/tmp/soup/current_snip.yml +15 -0
  56. data/spec/tmp/soup/system.yml +5 -0
  57. data/spec/vanilla_app_spec.rb +38 -0
  58. data/spec/vanilla_presenting_spec.rb +84 -0
  59. data/spec/vanilla_request_spec.rb +73 -0
  60. metadata +79 -170
  61. data/lib/vanilla/renderers.rb +0 -12
  62. data/lib/vanilla/renderers/haml.rb +0 -13
  63. data/lib/vanilla/static.rb +0 -28
  64. data/pristine_app/Gemfile +0 -3
  65. data/pristine_app/Gemfile.lock +0 -32
  66. data/pristine_app/README +0 -47
  67. data/pristine_app/config.ru +0 -26
  68. data/pristine_app/public/vanilla.css +0 -15
  69. data/pristine_app/soups/base/layout.snip +0 -18
  70. data/pristine_app/soups/base/start.snip +0 -19
  71. data/pristine_app/soups/dynasnips/current_snip.rb +0 -29
  72. data/pristine_app/soups/dynasnips/link_to_current_snip.rb +0 -14
  73. data/pristine_app/soups/dynasnips/page_title.rb +0 -9
  74. data/pristine_app/soups/extras/comments.rb +0 -78
  75. data/pristine_app/soups/tutorial/bad_dynasnip.snip +0 -8
  76. data/pristine_app/soups/tutorial/hello_world.snip +0 -20
  77. data/pristine_app/soups/tutorial/markdown_example.snip +0 -13
  78. data/pristine_app/soups/tutorial/snip.snip +0 -9
  79. data/pristine_app/soups/tutorial/soup.snip +0 -3
  80. data/pristine_app/soups/tutorial/test.snip +0 -30
  81. data/pristine_app/soups/tutorial/textile_example.snip +0 -11
  82. data/pristine_app/soups/tutorial/tutorial-another-snip.snip +0 -1
  83. data/pristine_app/soups/tutorial/tutorial-basic-snip-inclusion.snip +0 -1
  84. data/pristine_app/soups/tutorial/tutorial-dynasnips.snip.markdown +0 -56
  85. data/pristine_app/soups/tutorial/tutorial-layout.snip +0 -56
  86. data/pristine_app/soups/tutorial/tutorial-links.snip +0 -4
  87. data/pristine_app/soups/tutorial/tutorial-renderers.snip.markdown +0 -77
  88. data/pristine_app/soups/tutorial/tutorial.snip.markdown +0 -69
  89. data/pristine_app/soups/tutorial/vanilla-rb.snip +0 -16
  90. data/pristine_app/soups/tutorial/vanilla.snip +0 -8
  91. data/test/dynasnip_test.rb +0 -42
  92. data/test/dynasnips/link_to_current_snip_test.rb +0 -19
  93. data/test/dynasnips/link_to_test.rb +0 -27
  94. data/test/dynasnips/page_title_test.rb +0 -19
  95. data/test/renderers/base_renderer_test.rb +0 -43
  96. data/test/renderers/erb_renderer_test.rb +0 -29
  97. data/test/renderers/haml_renderer_test.rb +0 -35
  98. data/test/renderers/markdown_renderer_test.rb +0 -31
  99. data/test/renderers/raw_renderer_test.rb +0 -23
  100. data/test/renderers/ruby_renderer_test.rb +0 -59
  101. data/test/snip_inclusion_test.rb +0 -56
  102. data/test/snip_reference_parser_test.rb +0 -123
  103. data/test/test_helper.rb +0 -75
  104. data/test/vanilla_app_test.rb +0 -83
  105. data/test/vanilla_presenting_test.rb +0 -125
  106. data/test/vanilla_request_test.rb +0 -87
@@ -1,3 +1,5 @@
1
+ require 'vanilla/renderers/base'
2
+
1
3
  module Vanilla::Renderers
2
4
  # Snips that render_as "Ruby" should define a class.
3
5
  # The class should have instance methods for any HTTP request methods that the dynasnip
@@ -25,16 +27,10 @@ module Vanilla::Renderers
25
27
  handler_klass.new
26
28
  end
27
29
  instance.enclosing_snip = @enclosing_snip if instance.respond_to?(:enclosing_snip)
28
-
29
- if app.request && (method = app.request.method) && instance.respond_to?(method)
30
- message = method
31
- else
32
- message = :handle
33
- end
34
- if @args.is_a?(Array)
35
- instance.send(message, *@args).to_s
30
+ if (method = app.request.method) && instance.respond_to?(method)
31
+ instance.send(method, *@args).to_s
36
32
  else
37
- instance.send(message, @args).to_s
33
+ instance.handle(*@args).to_s
38
34
  end
39
35
  end
40
36
  end
@@ -1,3 +1,5 @@
1
+ require 'vanilla/renderers/base'
2
+
1
3
  require 'rubygems'
2
4
  gem 'RedCloth'
3
5
  require 'redcloth'
@@ -4,10 +4,9 @@ module Vanilla
4
4
  # Create a request with symbolised access to the params, and some special
5
5
  # accessors to the snip, part and format based on our routing.
6
6
  class Request
7
- attr_reader :snip_name, :part, :format, :method, :env
8
-
7
+ attr_reader :snip_name, :part, :format, :method
8
+
9
9
  def initialize(env, app)
10
- @env = env
11
10
  @rack_request = Rack::Request.new(env)
12
11
  @app = app
13
12
  determine_request_uri_parts
@@ -17,46 +16,46 @@ module Vanilla
17
16
  # Don't you just love how terse functional programming tends to look like maths?
18
17
  @symbolised_params ||= @rack_request.params.inject({}) { |p, (k,v)| p[k.to_sym] = v; p }
19
18
  end
20
-
19
+
21
20
  # Returns the snip referenced by the request's URL. Performs no exception
22
21
  # handling, so if the snip does not exist, an exception will be thrown.
23
22
  def snip
24
23
  @app.soup[snip_name]
25
24
  end
26
-
25
+
27
26
  def cookies
28
27
  @rack_request.cookies
29
28
  end
30
-
29
+
31
30
  def ip
32
31
  @rack_request.env["REMOTE_ADDR"]
33
32
  end
34
-
33
+
35
34
  def session
36
35
  @rack_request.env["rack.session"]
37
36
  end
38
-
37
+
39
38
  private
40
-
39
+
41
40
  def determine_request_uri_parts
42
41
  @snip_name, @part, @format = request_uri_parts(@rack_request)
43
42
  @format ||= 'html'
44
43
  @method = (params.delete(:_method) || @rack_request.request_method).downcase
45
44
  end
46
-
45
+
47
46
  def uri_path(request)
48
47
  request.path_info
49
48
  end
50
-
51
- URL_ROOT = /\A\/?\Z/ # i.e. / or nothing
49
+
50
+ URL_ROOT = /\A\/\Z/ # i.e. /
52
51
  URL_SNIP = /\A\/([\w\-\s]+)(\/|\.(\w+))?\Z/ # i.e. /start, /start.html
53
52
  URL_SNIP_AND_PART = /\A\/([\w\-\s]+)\/([\w\-\s]+)(\/|\.(\w+))?\Z/ # i.e. /blah/part, /blah/part.raw
54
-
53
+
55
54
  # Returns an array of the requested snip, part and format
56
55
  def request_uri_parts(request)
57
56
  case CGI.unescape(uri_path(request))
58
57
  when URL_ROOT
59
- [@app.config[:root_snip] || 'start', nil, 'html']
58
+ ['start', nil, 'html']
60
59
  when URL_SNIP
61
60
  [$1, nil, $3]
62
61
  when URL_SNIP_AND_PART
@@ -65,6 +64,6 @@ module Vanilla
65
64
  []
66
65
  end
67
66
  end
68
-
67
+
69
68
  end
70
- end
69
+ end
@@ -2,11 +2,7 @@ module Vanilla
2
2
  # Expects to be able to call 'soup' on whatever it is included into
3
3
  module Routes
4
4
  def link_to(link_text, snip_name=link_text, part=nil)
5
- if soup[snip_name]
6
- %{<a href="#{url_to(snip_name, part)}">#{link_text}</a>}
7
- else
8
- %{<a class="missing" href="#{url_to(snip_name, part)}">#{link_text}</a>}
9
- end
5
+ soup[snip_name] ? existing_link(link_text, snip_name, part) : new_link(snip_name)
10
6
  end
11
7
 
12
8
  def url_to(snip_name, part=nil)
@@ -14,5 +10,22 @@ module Vanilla
14
10
  url += "/#{part}" if part
15
11
  url
16
12
  end
13
+
14
+ def url_to_raw(snip_name, part=nil)
15
+ url = url_to(snip_name, part)
16
+ url += ".raw"
17
+ end
18
+
19
+ def existing_link(link_text, snip_name=link_text, part=nil)
20
+ %{<a href="#{url_to(snip_name, part)}">#{link_text}</a>}
21
+ end
22
+
23
+ def edit_link(snip_name, link_text)
24
+ %[<a href="/edit?name=#{snip_name.gsub(" ", "+")}">#{link_text}</a>]
25
+ end
26
+
27
+ def new_link(snip_name="New")
28
+ %[<a href="/new?name=#{snip_name ? snip_name.gsub(" ", "+") : nil}" class="new">#{snip_name}</a>]
29
+ end
17
30
  end
18
31
  end
@@ -0,0 +1,534 @@
1
+ module SnipReference
2
+ include Treetop::Runtime
3
+
4
+ def root
5
+ @root || :snip_call
6
+ end
7
+
8
+ module SnipCall0
9
+ def spaces
10
+ elements[0]
11
+ end
12
+
13
+ def argument_list
14
+ elements[1]
15
+ end
16
+ end
17
+
18
+ module SnipCall1
19
+ end
20
+
21
+ def _nt_snip_call
22
+ start_index = index
23
+ if node_cache[:snip_call].has_key?(index)
24
+ cached = node_cache[:snip_call][index]
25
+ @index = cached.interval.end if cached
26
+ return cached
27
+ end
28
+
29
+ i0, s0 = index, []
30
+ if has_terminal?("{", false, index)
31
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
32
+ @index += 1
33
+ else
34
+ terminal_parse_failure("{")
35
+ r1 = nil
36
+ end
37
+ s0 << r1
38
+ if r1
39
+ r2 = _nt_snip_name
40
+ s0 << r2
41
+ if r2
42
+ i4, s4 = index, []
43
+ r5 = _nt_spaces
44
+ s4 << r5
45
+ if r5
46
+ r6 = _nt_argument_list
47
+ s4 << r6
48
+ end
49
+ if s4.last
50
+ r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
51
+ r4.extend(SnipCall0)
52
+ else
53
+ @index = i4
54
+ r4 = nil
55
+ end
56
+ if r4
57
+ r3 = r4
58
+ else
59
+ r3 = instantiate_node(SyntaxNode,input, index...index)
60
+ end
61
+ s0 << r3
62
+ if r3
63
+ if has_terminal?("}", false, index)
64
+ r7 = instantiate_node(SyntaxNode,input, index...(index + 1))
65
+ @index += 1
66
+ else
67
+ terminal_parse_failure("}")
68
+ r7 = nil
69
+ end
70
+ s0 << r7
71
+ end
72
+ end
73
+ end
74
+ if s0.last
75
+ r0 = instantiate_node(SnipCall,input, i0...index, s0)
76
+ r0.extend(SnipCall1)
77
+ else
78
+ @index = i0
79
+ r0 = nil
80
+ end
81
+
82
+ node_cache[:snip_call][start_index] = r0
83
+
84
+ r0
85
+ end
86
+
87
+ module SnipName0
88
+ def word
89
+ elements[0]
90
+ end
91
+
92
+ def word
93
+ elements[2]
94
+ end
95
+ end
96
+
97
+ def _nt_snip_name
98
+ start_index = index
99
+ if node_cache[:snip_name].has_key?(index)
100
+ cached = node_cache[:snip_name][index]
101
+ @index = cached.interval.end if cached
102
+ return cached
103
+ end
104
+
105
+ i0 = index
106
+ i1, s1 = index, []
107
+ r2 = _nt_word
108
+ s1 << r2
109
+ if r2
110
+ if has_terminal?(".", false, index)
111
+ r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
112
+ @index += 1
113
+ else
114
+ terminal_parse_failure(".")
115
+ r3 = nil
116
+ end
117
+ s1 << r3
118
+ if r3
119
+ r4 = _nt_word
120
+ s1 << r4
121
+ end
122
+ end
123
+ if s1.last
124
+ r1 = instantiate_node(SnipNameWithAttribute,input, i1...index, s1)
125
+ r1.extend(SnipName0)
126
+ else
127
+ @index = i1
128
+ r1 = nil
129
+ end
130
+ if r1
131
+ r0 = r1
132
+ else
133
+ r5 = _nt_word
134
+ r5.extend(SnipName)
135
+ if r5
136
+ r0 = r5
137
+ else
138
+ @index = i0
139
+ r0 = nil
140
+ end
141
+ end
142
+
143
+ node_cache[:snip_name][start_index] = r0
144
+
145
+ r0
146
+ end
147
+
148
+ module ArgumentList0
149
+ def argument_separator
150
+ elements[0]
151
+ end
152
+
153
+ def argument_list
154
+ elements[1]
155
+ end
156
+ end
157
+
158
+ module ArgumentList1
159
+ def argument
160
+ elements[0]
161
+ end
162
+
163
+ end
164
+
165
+ def _nt_argument_list
166
+ start_index = index
167
+ if node_cache[:argument_list].has_key?(index)
168
+ cached = node_cache[:argument_list][index]
169
+ @index = cached.interval.end if cached
170
+ return cached
171
+ end
172
+
173
+ i0, s0 = index, []
174
+ r1 = _nt_argument
175
+ s0 << r1
176
+ if r1
177
+ i3, s3 = index, []
178
+ r4 = _nt_argument_separator
179
+ s3 << r4
180
+ if r4
181
+ r5 = _nt_argument_list
182
+ s3 << r5
183
+ end
184
+ if s3.last
185
+ r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
186
+ r3.extend(ArgumentList0)
187
+ else
188
+ @index = i3
189
+ r3 = nil
190
+ end
191
+ if r3
192
+ r2 = r3
193
+ else
194
+ r2 = instantiate_node(SyntaxNode,input, index...index)
195
+ end
196
+ s0 << r2
197
+ end
198
+ if s0.last
199
+ r0 = instantiate_node(ArgumentList,input, i0...index, s0)
200
+ r0.extend(ArgumentList1)
201
+ else
202
+ @index = i0
203
+ r0 = nil
204
+ end
205
+
206
+ node_cache[:argument_list][start_index] = r0
207
+
208
+ r0
209
+ end
210
+
211
+ def _nt_argument
212
+ start_index = index
213
+ if node_cache[:argument].has_key?(index)
214
+ cached = node_cache[:argument][index]
215
+ @index = cached.interval.end if cached
216
+ return cached
217
+ end
218
+
219
+ i0 = index
220
+ r1 = _nt_unquoted_words
221
+ r1.extend(NormalArgument)
222
+ if r1
223
+ r0 = r1
224
+ else
225
+ r2 = _nt_quoted_word
226
+ r2.extend(NormalArgument)
227
+ if r2
228
+ r0 = r2
229
+ else
230
+ @index = i0
231
+ r0 = nil
232
+ end
233
+ end
234
+
235
+ node_cache[:argument][start_index] = r0
236
+
237
+ r0
238
+ end
239
+
240
+ module ArgumentSeparator0
241
+ def optional_spaces
242
+ elements[1]
243
+ end
244
+ end
245
+
246
+ def _nt_argument_separator
247
+ start_index = index
248
+ if node_cache[:argument_separator].has_key?(index)
249
+ cached = node_cache[:argument_separator][index]
250
+ @index = cached.interval.end if cached
251
+ return cached
252
+ end
253
+
254
+ i0, s0 = index, []
255
+ if has_terminal?(",", false, index)
256
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
257
+ @index += 1
258
+ else
259
+ terminal_parse_failure(",")
260
+ r1 = nil
261
+ end
262
+ s0 << r1
263
+ if r1
264
+ r2 = _nt_optional_spaces
265
+ s0 << r2
266
+ end
267
+ if s0.last
268
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
269
+ r0.extend(ArgumentSeparator0)
270
+ else
271
+ @index = i0
272
+ r0 = nil
273
+ end
274
+
275
+ node_cache[:argument_separator][start_index] = r0
276
+
277
+ r0
278
+ end
279
+
280
+ def _nt_word
281
+ start_index = index
282
+ if node_cache[:word].has_key?(index)
283
+ cached = node_cache[:word][index]
284
+ @index = cached.interval.end if cached
285
+ return cached
286
+ end
287
+
288
+ i0 = index
289
+ r1 = _nt_unquoted_word
290
+ if r1
291
+ r0 = r1
292
+ else
293
+ r2 = _nt_quoted_word
294
+ if r2
295
+ r0 = r2
296
+ else
297
+ @index = i0
298
+ r0 = nil
299
+ end
300
+ end
301
+
302
+ node_cache[:word][start_index] = r0
303
+
304
+ r0
305
+ end
306
+
307
+ def _nt_unquoted_word
308
+ start_index = index
309
+ if node_cache[:unquoted_word].has_key?(index)
310
+ cached = node_cache[:unquoted_word][index]
311
+ @index = cached.interval.end if cached
312
+ return cached
313
+ end
314
+
315
+ s0, i0 = [], index
316
+ loop do
317
+ if has_terminal?('\G[a-zA-Z0-9_\\-]', true, index)
318
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
319
+ @index += 1
320
+ else
321
+ r1 = nil
322
+ end
323
+ if r1
324
+ s0 << r1
325
+ else
326
+ break
327
+ end
328
+ end
329
+ if s0.empty?
330
+ @index = i0
331
+ r0 = nil
332
+ else
333
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
334
+ end
335
+
336
+ node_cache[:unquoted_word][start_index] = r0
337
+
338
+ r0
339
+ end
340
+
341
+ module QuotedWord0
342
+ end
343
+
344
+ module QuotedWord1
345
+ end
346
+
347
+ def _nt_quoted_word
348
+ start_index = index
349
+ if node_cache[:quoted_word].has_key?(index)
350
+ cached = node_cache[:quoted_word][index]
351
+ @index = cached.interval.end if cached
352
+ return cached
353
+ end
354
+
355
+ i0 = index
356
+ i1, s1 = index, []
357
+ if has_terminal?("\"", false, index)
358
+ r2 = instantiate_node(SyntaxNode,input, index...(index + 1))
359
+ @index += 1
360
+ else
361
+ terminal_parse_failure("\"")
362
+ r2 = nil
363
+ end
364
+ s1 << r2
365
+ if r2
366
+ r3 = _nt_unquoted_words
367
+ s1 << r3
368
+ if r3
369
+ if has_terminal?("\"", false, index)
370
+ r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
371
+ @index += 1
372
+ else
373
+ terminal_parse_failure("\"")
374
+ r4 = nil
375
+ end
376
+ s1 << r4
377
+ end
378
+ end
379
+ if s1.last
380
+ r1 = instantiate_node(QuotedWord,input, i1...index, s1)
381
+ r1.extend(QuotedWord0)
382
+ else
383
+ @index = i1
384
+ r1 = nil
385
+ end
386
+ if r1
387
+ r0 = r1
388
+ else
389
+ i5, s5 = index, []
390
+ if has_terminal?("'", false, index)
391
+ r6 = instantiate_node(SyntaxNode,input, index...(index + 1))
392
+ @index += 1
393
+ else
394
+ terminal_parse_failure("'")
395
+ r6 = nil
396
+ end
397
+ s5 << r6
398
+ if r6
399
+ r7 = _nt_unquoted_words
400
+ s5 << r7
401
+ if r7
402
+ if has_terminal?("'", false, index)
403
+ r8 = instantiate_node(SyntaxNode,input, index...(index + 1))
404
+ @index += 1
405
+ else
406
+ terminal_parse_failure("'")
407
+ r8 = nil
408
+ end
409
+ s5 << r8
410
+ end
411
+ end
412
+ if s5.last
413
+ r5 = instantiate_node(QuotedWord,input, i5...index, s5)
414
+ r5.extend(QuotedWord1)
415
+ else
416
+ @index = i5
417
+ r5 = nil
418
+ end
419
+ if r5
420
+ r0 = r5
421
+ else
422
+ @index = i0
423
+ r0 = nil
424
+ end
425
+ end
426
+
427
+ node_cache[:quoted_word][start_index] = r0
428
+
429
+ r0
430
+ end
431
+
432
+ def _nt_unquoted_words
433
+ start_index = index
434
+ if node_cache[:unquoted_words].has_key?(index)
435
+ cached = node_cache[:unquoted_words][index]
436
+ @index = cached.interval.end if cached
437
+ return cached
438
+ end
439
+
440
+ s0, i0 = [], index
441
+ loop do
442
+ if has_terminal?('\G[a-zA-Z0-9_\\- ]', true, index)
443
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
444
+ @index += 1
445
+ else
446
+ r1 = nil
447
+ end
448
+ if r1
449
+ s0 << r1
450
+ else
451
+ break
452
+ end
453
+ end
454
+ if s0.empty?
455
+ @index = i0
456
+ r0 = nil
457
+ else
458
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
459
+ end
460
+
461
+ node_cache[:unquoted_words][start_index] = r0
462
+
463
+ r0
464
+ end
465
+
466
+ def _nt_optional_spaces
467
+ start_index = index
468
+ if node_cache[:optional_spaces].has_key?(index)
469
+ cached = node_cache[:optional_spaces][index]
470
+ @index = cached.interval.end if cached
471
+ return cached
472
+ end
473
+
474
+ s0, i0 = [], index
475
+ loop do
476
+ if has_terminal?('\G[ ]', true, index)
477
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
478
+ @index += 1
479
+ else
480
+ r1 = nil
481
+ end
482
+ if r1
483
+ s0 << r1
484
+ else
485
+ break
486
+ end
487
+ end
488
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
489
+
490
+ node_cache[:optional_spaces][start_index] = r0
491
+
492
+ r0
493
+ end
494
+
495
+ def _nt_spaces
496
+ start_index = index
497
+ if node_cache[:spaces].has_key?(index)
498
+ cached = node_cache[:spaces][index]
499
+ @index = cached.interval.end if cached
500
+ return cached
501
+ end
502
+
503
+ s0, i0 = [], index
504
+ loop do
505
+ if has_terminal?('\G[ ]', true, index)
506
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
507
+ @index += 1
508
+ else
509
+ r1 = nil
510
+ end
511
+ if r1
512
+ s0 << r1
513
+ else
514
+ break
515
+ end
516
+ end
517
+ if s0.empty?
518
+ @index = i0
519
+ r0 = nil
520
+ else
521
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
522
+ end
523
+
524
+ node_cache[:spaces][start_index] = r0
525
+
526
+ r0
527
+ end
528
+
529
+ end
530
+
531
+ class SnipReferenceParser < Treetop::Runtime::CompiledParser
532
+ include SnipReference
533
+ end
534
+