dang 1.0.0.rc1
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.
- checksums.yaml +7 -0
- data/.autotest +12 -0
- data/History.md +5 -0
- data/Manifest.txt +10 -0
- data/README.md +95 -0
- data/Rakefile +30 -0
- data/bin/dang +26 -0
- data/lib/dang.rb +4 -0
- data/lib/dang/dang.rb +40 -0
- data/lib/dang/parser.kpeg +240 -0
- data/lib/dang/parser.rb +2664 -0
- metadata +95 -0
data/lib/dang/parser.rb
ADDED
@@ -0,0 +1,2664 @@
|
|
1
|
+
class Dang::Parser
|
2
|
+
# :stopdoc:
|
3
|
+
|
4
|
+
# This is distinct from setup_parser so that a standalone parser
|
5
|
+
# can redefine #initialize and still have access to the proper
|
6
|
+
# parser setup code.
|
7
|
+
def initialize(str, debug=false)
|
8
|
+
setup_parser(str, debug)
|
9
|
+
end
|
10
|
+
|
11
|
+
|
12
|
+
|
13
|
+
# Prepares for parsing +str+. If you define a custom initialize you must
|
14
|
+
# call this method before #parse
|
15
|
+
def setup_parser(str, debug=false)
|
16
|
+
@string = str
|
17
|
+
@pos = 0
|
18
|
+
@memoizations = Hash.new { |h,k| h[k] = {} }
|
19
|
+
@result = nil
|
20
|
+
@failed_rule = nil
|
21
|
+
@failing_rule_offset = -1
|
22
|
+
|
23
|
+
setup_foreign_grammar
|
24
|
+
end
|
25
|
+
|
26
|
+
attr_reader :string
|
27
|
+
attr_reader :failing_rule_offset
|
28
|
+
attr_accessor :result, :pos
|
29
|
+
|
30
|
+
|
31
|
+
def current_column(target=pos)
|
32
|
+
if c = string.rindex("\n", target-1)
|
33
|
+
return target - c - 1
|
34
|
+
end
|
35
|
+
|
36
|
+
target + 1
|
37
|
+
end
|
38
|
+
|
39
|
+
def current_line(target=pos)
|
40
|
+
cur_offset = 0
|
41
|
+
cur_line = 0
|
42
|
+
|
43
|
+
string.each_line do |line|
|
44
|
+
cur_line += 1
|
45
|
+
cur_offset += line.size
|
46
|
+
return cur_line if cur_offset >= target
|
47
|
+
end
|
48
|
+
|
49
|
+
-1
|
50
|
+
end
|
51
|
+
|
52
|
+
def lines
|
53
|
+
lines = []
|
54
|
+
string.each_line { |l| lines << l }
|
55
|
+
lines
|
56
|
+
end
|
57
|
+
|
58
|
+
|
59
|
+
|
60
|
+
def get_text(start)
|
61
|
+
@string[start..@pos-1]
|
62
|
+
end
|
63
|
+
|
64
|
+
def show_pos
|
65
|
+
width = 10
|
66
|
+
if @pos < width
|
67
|
+
"#{@pos} (\"#{@string[0,@pos]}\" @ \"#{@string[@pos,width]}\")"
|
68
|
+
else
|
69
|
+
"#{@pos} (\"... #{@string[@pos - width, width]}\" @ \"#{@string[@pos,width]}\")"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def failure_info
|
74
|
+
l = current_line @failing_rule_offset
|
75
|
+
c = current_column @failing_rule_offset
|
76
|
+
|
77
|
+
if @failed_rule.kind_of? Symbol
|
78
|
+
info = self.class::Rules[@failed_rule]
|
79
|
+
"line #{l}, column #{c}: failed rule '#{info.name}' = '#{info.rendered}'"
|
80
|
+
else
|
81
|
+
"line #{l}, column #{c}: failed rule '#{@failed_rule}'"
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def failure_caret
|
86
|
+
l = current_line @failing_rule_offset
|
87
|
+
c = current_column @failing_rule_offset
|
88
|
+
|
89
|
+
line = lines[l-1]
|
90
|
+
"#{line}\n#{' ' * (c - 1)}^"
|
91
|
+
end
|
92
|
+
|
93
|
+
def failure_character
|
94
|
+
l = current_line @failing_rule_offset
|
95
|
+
c = current_column @failing_rule_offset
|
96
|
+
lines[l-1][c-1, 1]
|
97
|
+
end
|
98
|
+
|
99
|
+
def failure_oneline
|
100
|
+
l = current_line @failing_rule_offset
|
101
|
+
c = current_column @failing_rule_offset
|
102
|
+
|
103
|
+
char = lines[l-1][c-1, 1]
|
104
|
+
|
105
|
+
if @failed_rule.kind_of? Symbol
|
106
|
+
info = self.class::Rules[@failed_rule]
|
107
|
+
"@#{l}:#{c} failed rule '#{info.name}', got '#{char}'"
|
108
|
+
else
|
109
|
+
"@#{l}:#{c} failed rule '#{@failed_rule}', got '#{char}'"
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
class ParseError < RuntimeError
|
114
|
+
end
|
115
|
+
|
116
|
+
def raise_error
|
117
|
+
raise ParseError, failure_oneline
|
118
|
+
end
|
119
|
+
|
120
|
+
def show_error(io=STDOUT)
|
121
|
+
error_pos = @failing_rule_offset
|
122
|
+
line_no = current_line(error_pos)
|
123
|
+
col_no = current_column(error_pos)
|
124
|
+
|
125
|
+
io.puts "On line #{line_no}, column #{col_no}:"
|
126
|
+
|
127
|
+
if @failed_rule.kind_of? Symbol
|
128
|
+
info = self.class::Rules[@failed_rule]
|
129
|
+
io.puts "Failed to match '#{info.rendered}' (rule '#{info.name}')"
|
130
|
+
else
|
131
|
+
io.puts "Failed to match rule '#{@failed_rule}'"
|
132
|
+
end
|
133
|
+
|
134
|
+
io.puts "Got: #{string[error_pos,1].inspect}"
|
135
|
+
line = lines[line_no-1]
|
136
|
+
io.puts "=> #{line}"
|
137
|
+
io.print(" " * (col_no + 3))
|
138
|
+
io.puts "^"
|
139
|
+
end
|
140
|
+
|
141
|
+
def set_failed_rule(name)
|
142
|
+
if @pos > @failing_rule_offset
|
143
|
+
@failed_rule = name
|
144
|
+
@failing_rule_offset = @pos
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
attr_reader :failed_rule
|
149
|
+
|
150
|
+
def match_string(str)
|
151
|
+
len = str.size
|
152
|
+
if @string[pos,len] == str
|
153
|
+
@pos += len
|
154
|
+
return str
|
155
|
+
end
|
156
|
+
|
157
|
+
return nil
|
158
|
+
end
|
159
|
+
|
160
|
+
def scan(reg)
|
161
|
+
if m = reg.match(@string[@pos..-1])
|
162
|
+
width = m.end(0)
|
163
|
+
@pos += width
|
164
|
+
return true
|
165
|
+
end
|
166
|
+
|
167
|
+
return nil
|
168
|
+
end
|
169
|
+
|
170
|
+
if "".respond_to? :getbyte
|
171
|
+
def get_byte
|
172
|
+
if @pos >= @string.size
|
173
|
+
return nil
|
174
|
+
end
|
175
|
+
|
176
|
+
s = @string.getbyte @pos
|
177
|
+
@pos += 1
|
178
|
+
s
|
179
|
+
end
|
180
|
+
else
|
181
|
+
def get_byte
|
182
|
+
if @pos >= @string.size
|
183
|
+
return nil
|
184
|
+
end
|
185
|
+
|
186
|
+
s = @string[@pos]
|
187
|
+
@pos += 1
|
188
|
+
s
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
def parse(rule=nil)
|
193
|
+
# We invoke the rules indirectly via apply
|
194
|
+
# instead of by just calling them as methods because
|
195
|
+
# if the rules use left recursion, apply needs to
|
196
|
+
# manage that.
|
197
|
+
|
198
|
+
if !rule
|
199
|
+
apply(:_root)
|
200
|
+
else
|
201
|
+
method = rule.gsub("-","_hyphen_")
|
202
|
+
apply :"_#{method}"
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
class MemoEntry
|
207
|
+
def initialize(ans, pos)
|
208
|
+
@ans = ans
|
209
|
+
@pos = pos
|
210
|
+
@result = nil
|
211
|
+
@set = false
|
212
|
+
@left_rec = false
|
213
|
+
end
|
214
|
+
|
215
|
+
attr_reader :ans, :pos, :result, :set
|
216
|
+
attr_accessor :left_rec
|
217
|
+
|
218
|
+
def move!(ans, pos, result)
|
219
|
+
@ans = ans
|
220
|
+
@pos = pos
|
221
|
+
@result = result
|
222
|
+
@set = true
|
223
|
+
@left_rec = false
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
def external_invoke(other, rule, *args)
|
228
|
+
old_pos = @pos
|
229
|
+
old_string = @string
|
230
|
+
|
231
|
+
@pos = other.pos
|
232
|
+
@string = other.string
|
233
|
+
|
234
|
+
begin
|
235
|
+
if val = __send__(rule, *args)
|
236
|
+
other.pos = @pos
|
237
|
+
other.result = @result
|
238
|
+
else
|
239
|
+
other.set_failed_rule "#{self.class}##{rule}"
|
240
|
+
end
|
241
|
+
val
|
242
|
+
ensure
|
243
|
+
@pos = old_pos
|
244
|
+
@string = old_string
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
248
|
+
def apply_with_args(rule, *args)
|
249
|
+
memo_key = [rule, args]
|
250
|
+
if m = @memoizations[memo_key][@pos]
|
251
|
+
@pos = m.pos
|
252
|
+
if !m.set
|
253
|
+
m.left_rec = true
|
254
|
+
return nil
|
255
|
+
end
|
256
|
+
|
257
|
+
@result = m.result
|
258
|
+
|
259
|
+
return m.ans
|
260
|
+
else
|
261
|
+
m = MemoEntry.new(nil, @pos)
|
262
|
+
@memoizations[memo_key][@pos] = m
|
263
|
+
start_pos = @pos
|
264
|
+
|
265
|
+
ans = __send__ rule, *args
|
266
|
+
|
267
|
+
lr = m.left_rec
|
268
|
+
|
269
|
+
m.move! ans, @pos, @result
|
270
|
+
|
271
|
+
# Don't bother trying to grow the left recursion
|
272
|
+
# if it's failing straight away (thus there is no seed)
|
273
|
+
if ans and lr
|
274
|
+
return grow_lr(rule, args, start_pos, m)
|
275
|
+
else
|
276
|
+
return ans
|
277
|
+
end
|
278
|
+
|
279
|
+
return ans
|
280
|
+
end
|
281
|
+
end
|
282
|
+
|
283
|
+
def apply(rule)
|
284
|
+
if m = @memoizations[rule][@pos]
|
285
|
+
@pos = m.pos
|
286
|
+
if !m.set
|
287
|
+
m.left_rec = true
|
288
|
+
return nil
|
289
|
+
end
|
290
|
+
|
291
|
+
@result = m.result
|
292
|
+
|
293
|
+
return m.ans
|
294
|
+
else
|
295
|
+
m = MemoEntry.new(nil, @pos)
|
296
|
+
@memoizations[rule][@pos] = m
|
297
|
+
start_pos = @pos
|
298
|
+
|
299
|
+
ans = __send__ rule
|
300
|
+
|
301
|
+
lr = m.left_rec
|
302
|
+
|
303
|
+
m.move! ans, @pos, @result
|
304
|
+
|
305
|
+
# Don't bother trying to grow the left recursion
|
306
|
+
# if it's failing straight away (thus there is no seed)
|
307
|
+
if ans and lr
|
308
|
+
return grow_lr(rule, nil, start_pos, m)
|
309
|
+
else
|
310
|
+
return ans
|
311
|
+
end
|
312
|
+
|
313
|
+
return ans
|
314
|
+
end
|
315
|
+
end
|
316
|
+
|
317
|
+
def grow_lr(rule, args, start_pos, m)
|
318
|
+
while true
|
319
|
+
@pos = start_pos
|
320
|
+
@result = m.result
|
321
|
+
|
322
|
+
if args
|
323
|
+
ans = __send__ rule, *args
|
324
|
+
else
|
325
|
+
ans = __send__ rule
|
326
|
+
end
|
327
|
+
return nil unless ans
|
328
|
+
|
329
|
+
break if @pos <= m.pos
|
330
|
+
|
331
|
+
m.move! ans, @pos, @result
|
332
|
+
end
|
333
|
+
|
334
|
+
@result = m.result
|
335
|
+
@pos = m.pos
|
336
|
+
return m.ans
|
337
|
+
end
|
338
|
+
|
339
|
+
class RuleInfo
|
340
|
+
def initialize(name, rendered)
|
341
|
+
@name = name
|
342
|
+
@rendered = rendered
|
343
|
+
end
|
344
|
+
|
345
|
+
attr_reader :name, :rendered
|
346
|
+
end
|
347
|
+
|
348
|
+
def self.rule_info(name, rendered)
|
349
|
+
RuleInfo.new(name, rendered)
|
350
|
+
end
|
351
|
+
|
352
|
+
|
353
|
+
# :startdoc:
|
354
|
+
|
355
|
+
|
356
|
+
def initialize(str, debug=false)
|
357
|
+
setup_parser(str, debug)
|
358
|
+
@doctype = nil
|
359
|
+
@output = ""
|
360
|
+
end
|
361
|
+
|
362
|
+
DOC_TYPES = {
|
363
|
+
"html" => "<!doctype html>",
|
364
|
+
"html5" => "<!doctype html>",
|
365
|
+
"html4" => '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">',
|
366
|
+
"html4 transitional" => '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">',
|
367
|
+
"html4 strict" => '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">',
|
368
|
+
"html4 frameset" => '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">',
|
369
|
+
|
370
|
+
"xhtml 1" => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">',
|
371
|
+
"xhtml 1 transitional" => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">',
|
372
|
+
"xhtml 1 strict" => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">',
|
373
|
+
"xhtml 1 frameset" => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">',
|
374
|
+
"xhtml 1.1" => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">',
|
375
|
+
"xhtml 1.1 basic" => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd">',
|
376
|
+
"xhtml 1.2 mobile" => '<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.2//EN" "http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd">',
|
377
|
+
"xhtml rdfa" => '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd">',
|
378
|
+
"xhtml 5" => '<!DOCTYPE html>',
|
379
|
+
|
380
|
+
"xml iso-8859-1" => "<?xml version='1.0' encoding='iso-8859-1' ?>"
|
381
|
+
}
|
382
|
+
|
383
|
+
def html_doctype
|
384
|
+
return "" unless @doctype
|
385
|
+
|
386
|
+
unless DOC_TYPES.key? @doctype
|
387
|
+
warn "doctype '#{@doctype}' not understood, using 'html'"
|
388
|
+
@doctype = "html"
|
389
|
+
end
|
390
|
+
|
391
|
+
DOC_TYPES[@doctype].dup
|
392
|
+
end
|
393
|
+
|
394
|
+
def output(env=nil)
|
395
|
+
doctype = html_doctype
|
396
|
+
|
397
|
+
strings = @output.flatten.map do |i|
|
398
|
+
case i
|
399
|
+
when Literal
|
400
|
+
"_out << #{i.str.dump}"
|
401
|
+
when Code
|
402
|
+
if i.print
|
403
|
+
"_out << (#{i.str}).to_s"
|
404
|
+
else
|
405
|
+
i.str
|
406
|
+
end
|
407
|
+
when Filter
|
408
|
+
"_out << Dang.run_filter('#{i.name}', #{i.str.dump}).to_s"
|
409
|
+
end
|
410
|
+
end
|
411
|
+
|
412
|
+
code = "_out = '';\n" + strings.join(";") + ";_out"
|
413
|
+
|
414
|
+
out = eval(code, env || binding).strip
|
415
|
+
|
416
|
+
if doctype.empty?
|
417
|
+
str = out
|
418
|
+
else
|
419
|
+
if out.empty?
|
420
|
+
str = doctype
|
421
|
+
else
|
422
|
+
str = doctype << "\n" << out
|
423
|
+
end
|
424
|
+
end
|
425
|
+
|
426
|
+
str
|
427
|
+
end
|
428
|
+
|
429
|
+
def attrs(at,sel=[])
|
430
|
+
out = []
|
431
|
+
classes = []
|
432
|
+
|
433
|
+
(at+sel).each do |key,val|
|
434
|
+
if key == "class"
|
435
|
+
classes.unshift val
|
436
|
+
elsif val == true
|
437
|
+
out << "#{key}"
|
438
|
+
else
|
439
|
+
out << "#{key}='#{val}'"
|
440
|
+
end
|
441
|
+
end
|
442
|
+
|
443
|
+
unless classes.empty?
|
444
|
+
out.unshift "class='#{classes.join(' ')}'"
|
445
|
+
end
|
446
|
+
|
447
|
+
out.join(' ')
|
448
|
+
end
|
449
|
+
|
450
|
+
class Literal
|
451
|
+
def initialize(str)
|
452
|
+
@str = str
|
453
|
+
end
|
454
|
+
|
455
|
+
attr_reader :str
|
456
|
+
end
|
457
|
+
|
458
|
+
class Code
|
459
|
+
def initialize(str, print)
|
460
|
+
@str = str
|
461
|
+
@print = print
|
462
|
+
end
|
463
|
+
|
464
|
+
attr_reader :str, :print
|
465
|
+
end
|
466
|
+
|
467
|
+
class Filter
|
468
|
+
def initialize(name, str)
|
469
|
+
@name = name
|
470
|
+
@str = str
|
471
|
+
end
|
472
|
+
|
473
|
+
attr_reader :name, :str
|
474
|
+
end
|
475
|
+
|
476
|
+
def joinm(*elems)
|
477
|
+
elems.map do |i|
|
478
|
+
if i.kind_of? String
|
479
|
+
Literal.new(i)
|
480
|
+
else
|
481
|
+
i
|
482
|
+
end
|
483
|
+
end
|
484
|
+
end
|
485
|
+
|
486
|
+
def join(f,b)
|
487
|
+
f = Literal.new(f) if f.kind_of? String
|
488
|
+
b = Literal.new(b) if b.kind_of? String
|
489
|
+
|
490
|
+
if b.kind_of? Array
|
491
|
+
[f] + b
|
492
|
+
else
|
493
|
+
[f,b]
|
494
|
+
end
|
495
|
+
end
|
496
|
+
|
497
|
+
def code(str, print=true)
|
498
|
+
Code.new(str, print)
|
499
|
+
end
|
500
|
+
|
501
|
+
|
502
|
+
# :stopdoc:
|
503
|
+
def setup_foreign_grammar; end
|
504
|
+
|
505
|
+
# space = (" " | "\t")
|
506
|
+
def _space
|
507
|
+
|
508
|
+
_save = self.pos
|
509
|
+
while true # choice
|
510
|
+
_tmp = match_string(" ")
|
511
|
+
break if _tmp
|
512
|
+
self.pos = _save
|
513
|
+
_tmp = match_string("\t")
|
514
|
+
break if _tmp
|
515
|
+
self.pos = _save
|
516
|
+
break
|
517
|
+
end # end choice
|
518
|
+
|
519
|
+
set_failed_rule :_space unless _tmp
|
520
|
+
return _tmp
|
521
|
+
end
|
522
|
+
|
523
|
+
# bs = (" " | "\t" | "\n")
|
524
|
+
def _bs
|
525
|
+
|
526
|
+
_save = self.pos
|
527
|
+
while true # choice
|
528
|
+
_tmp = match_string(" ")
|
529
|
+
break if _tmp
|
530
|
+
self.pos = _save
|
531
|
+
_tmp = match_string("\t")
|
532
|
+
break if _tmp
|
533
|
+
self.pos = _save
|
534
|
+
_tmp = match_string("\n")
|
535
|
+
break if _tmp
|
536
|
+
self.pos = _save
|
537
|
+
break
|
538
|
+
end # end choice
|
539
|
+
|
540
|
+
set_failed_rule :_bs unless _tmp
|
541
|
+
return _tmp
|
542
|
+
end
|
543
|
+
|
544
|
+
# - = bs+
|
545
|
+
def __hyphen_
|
546
|
+
_save = self.pos
|
547
|
+
_tmp = apply(:_bs)
|
548
|
+
if _tmp
|
549
|
+
while true
|
550
|
+
_tmp = apply(:_bs)
|
551
|
+
break unless _tmp
|
552
|
+
end
|
553
|
+
_tmp = true
|
554
|
+
else
|
555
|
+
self.pos = _save
|
556
|
+
end
|
557
|
+
set_failed_rule :__hyphen_ unless _tmp
|
558
|
+
return _tmp
|
559
|
+
end
|
560
|
+
|
561
|
+
# eol = "\n"
|
562
|
+
def _eol
|
563
|
+
_tmp = match_string("\n")
|
564
|
+
set_failed_rule :_eol unless _tmp
|
565
|
+
return _tmp
|
566
|
+
end
|
567
|
+
|
568
|
+
# eof = !.
|
569
|
+
def _eof
|
570
|
+
_save = self.pos
|
571
|
+
_tmp = get_byte
|
572
|
+
_tmp = _tmp ? nil : true
|
573
|
+
self.pos = _save
|
574
|
+
set_failed_rule :_eof unless _tmp
|
575
|
+
return _tmp
|
576
|
+
end
|
577
|
+
|
578
|
+
# rest = < (!eol .)* > (eol | eof) { text }
|
579
|
+
def _rest
|
580
|
+
|
581
|
+
_save = self.pos
|
582
|
+
while true # sequence
|
583
|
+
_text_start = self.pos
|
584
|
+
while true
|
585
|
+
|
586
|
+
_save2 = self.pos
|
587
|
+
while true # sequence
|
588
|
+
_save3 = self.pos
|
589
|
+
_tmp = apply(:_eol)
|
590
|
+
_tmp = _tmp ? nil : true
|
591
|
+
self.pos = _save3
|
592
|
+
unless _tmp
|
593
|
+
self.pos = _save2
|
594
|
+
break
|
595
|
+
end
|
596
|
+
_tmp = get_byte
|
597
|
+
unless _tmp
|
598
|
+
self.pos = _save2
|
599
|
+
end
|
600
|
+
break
|
601
|
+
end # end sequence
|
602
|
+
|
603
|
+
break unless _tmp
|
604
|
+
end
|
605
|
+
_tmp = true
|
606
|
+
if _tmp
|
607
|
+
text = get_text(_text_start)
|
608
|
+
end
|
609
|
+
unless _tmp
|
610
|
+
self.pos = _save
|
611
|
+
break
|
612
|
+
end
|
613
|
+
|
614
|
+
_save4 = self.pos
|
615
|
+
while true # choice
|
616
|
+
_tmp = apply(:_eol)
|
617
|
+
break if _tmp
|
618
|
+
self.pos = _save4
|
619
|
+
_tmp = apply(:_eof)
|
620
|
+
break if _tmp
|
621
|
+
self.pos = _save4
|
622
|
+
break
|
623
|
+
end # end choice
|
624
|
+
|
625
|
+
unless _tmp
|
626
|
+
self.pos = _save
|
627
|
+
break
|
628
|
+
end
|
629
|
+
@result = begin; text ; end
|
630
|
+
_tmp = true
|
631
|
+
unless _tmp
|
632
|
+
self.pos = _save
|
633
|
+
end
|
634
|
+
break
|
635
|
+
end # end sequence
|
636
|
+
|
637
|
+
set_failed_rule :_rest unless _tmp
|
638
|
+
return _tmp
|
639
|
+
end
|
640
|
+
|
641
|
+
# doctype = "!!!" space* rest:r { @doctype = r.empty? ? "html" : r }
|
642
|
+
def _doctype
|
643
|
+
|
644
|
+
_save = self.pos
|
645
|
+
while true # sequence
|
646
|
+
_tmp = match_string("!!!")
|
647
|
+
unless _tmp
|
648
|
+
self.pos = _save
|
649
|
+
break
|
650
|
+
end
|
651
|
+
while true
|
652
|
+
_tmp = apply(:_space)
|
653
|
+
break unless _tmp
|
654
|
+
end
|
655
|
+
_tmp = true
|
656
|
+
unless _tmp
|
657
|
+
self.pos = _save
|
658
|
+
break
|
659
|
+
end
|
660
|
+
_tmp = apply(:_rest)
|
661
|
+
r = @result
|
662
|
+
unless _tmp
|
663
|
+
self.pos = _save
|
664
|
+
break
|
665
|
+
end
|
666
|
+
@result = begin; @doctype = r.empty? ? "html" : r ; end
|
667
|
+
_tmp = true
|
668
|
+
unless _tmp
|
669
|
+
self.pos = _save
|
670
|
+
end
|
671
|
+
break
|
672
|
+
end # end sequence
|
673
|
+
|
674
|
+
set_failed_rule :_doctype unless _tmp
|
675
|
+
return _tmp
|
676
|
+
end
|
677
|
+
|
678
|
+
# name = < /[a-zA-Z0-9_\-:]+/ > { text }
|
679
|
+
def _name
|
680
|
+
|
681
|
+
_save = self.pos
|
682
|
+
while true # sequence
|
683
|
+
_text_start = self.pos
|
684
|
+
_tmp = scan(/\A(?-mix:[a-zA-Z0-9_\-:]+)/)
|
685
|
+
if _tmp
|
686
|
+
text = get_text(_text_start)
|
687
|
+
end
|
688
|
+
unless _tmp
|
689
|
+
self.pos = _save
|
690
|
+
break
|
691
|
+
end
|
692
|
+
@result = begin; text ; end
|
693
|
+
_tmp = true
|
694
|
+
unless _tmp
|
695
|
+
self.pos = _save
|
696
|
+
end
|
697
|
+
break
|
698
|
+
end # end sequence
|
699
|
+
|
700
|
+
set_failed_rule :_name unless _tmp
|
701
|
+
return _tmp
|
702
|
+
end
|
703
|
+
|
704
|
+
# start = "<" name:n { n }
|
705
|
+
def _start
|
706
|
+
|
707
|
+
_save = self.pos
|
708
|
+
while true # sequence
|
709
|
+
_tmp = match_string("<")
|
710
|
+
unless _tmp
|
711
|
+
self.pos = _save
|
712
|
+
break
|
713
|
+
end
|
714
|
+
_tmp = apply(:_name)
|
715
|
+
n = @result
|
716
|
+
unless _tmp
|
717
|
+
self.pos = _save
|
718
|
+
break
|
719
|
+
end
|
720
|
+
@result = begin; n ; end
|
721
|
+
_tmp = true
|
722
|
+
unless _tmp
|
723
|
+
self.pos = _save
|
724
|
+
end
|
725
|
+
break
|
726
|
+
end # end sequence
|
727
|
+
|
728
|
+
set_failed_rule :_start unless _tmp
|
729
|
+
return _tmp
|
730
|
+
end
|
731
|
+
|
732
|
+
# pts = (space+ { "" } | < eol bs* > { text })
|
733
|
+
def _pts
|
734
|
+
|
735
|
+
_save = self.pos
|
736
|
+
while true # choice
|
737
|
+
|
738
|
+
_save1 = self.pos
|
739
|
+
while true # sequence
|
740
|
+
_save2 = self.pos
|
741
|
+
_tmp = apply(:_space)
|
742
|
+
if _tmp
|
743
|
+
while true
|
744
|
+
_tmp = apply(:_space)
|
745
|
+
break unless _tmp
|
746
|
+
end
|
747
|
+
_tmp = true
|
748
|
+
else
|
749
|
+
self.pos = _save2
|
750
|
+
end
|
751
|
+
unless _tmp
|
752
|
+
self.pos = _save1
|
753
|
+
break
|
754
|
+
end
|
755
|
+
@result = begin; "" ; end
|
756
|
+
_tmp = true
|
757
|
+
unless _tmp
|
758
|
+
self.pos = _save1
|
759
|
+
end
|
760
|
+
break
|
761
|
+
end # end sequence
|
762
|
+
|
763
|
+
break if _tmp
|
764
|
+
self.pos = _save
|
765
|
+
|
766
|
+
_save3 = self.pos
|
767
|
+
while true # sequence
|
768
|
+
_text_start = self.pos
|
769
|
+
|
770
|
+
_save4 = self.pos
|
771
|
+
while true # sequence
|
772
|
+
_tmp = apply(:_eol)
|
773
|
+
unless _tmp
|
774
|
+
self.pos = _save4
|
775
|
+
break
|
776
|
+
end
|
777
|
+
while true
|
778
|
+
_tmp = apply(:_bs)
|
779
|
+
break unless _tmp
|
780
|
+
end
|
781
|
+
_tmp = true
|
782
|
+
unless _tmp
|
783
|
+
self.pos = _save4
|
784
|
+
end
|
785
|
+
break
|
786
|
+
end # end sequence
|
787
|
+
|
788
|
+
if _tmp
|
789
|
+
text = get_text(_text_start)
|
790
|
+
end
|
791
|
+
unless _tmp
|
792
|
+
self.pos = _save3
|
793
|
+
break
|
794
|
+
end
|
795
|
+
@result = begin; text ; end
|
796
|
+
_tmp = true
|
797
|
+
unless _tmp
|
798
|
+
self.pos = _save3
|
799
|
+
end
|
800
|
+
break
|
801
|
+
end # end sequence
|
802
|
+
|
803
|
+
break if _tmp
|
804
|
+
self.pos = _save
|
805
|
+
break
|
806
|
+
end # end choice
|
807
|
+
|
808
|
+
set_failed_rule :_pts unless _tmp
|
809
|
+
return _tmp
|
810
|
+
end
|
811
|
+
|
812
|
+
# end = name:n ">" { n }
|
813
|
+
def _end
|
814
|
+
|
815
|
+
_save = self.pos
|
816
|
+
while true # sequence
|
817
|
+
_tmp = apply(:_name)
|
818
|
+
n = @result
|
819
|
+
unless _tmp
|
820
|
+
self.pos = _save
|
821
|
+
break
|
822
|
+
end
|
823
|
+
_tmp = match_string(">")
|
824
|
+
unless _tmp
|
825
|
+
self.pos = _save
|
826
|
+
break
|
827
|
+
end
|
828
|
+
@result = begin; n ; end
|
829
|
+
_tmp = true
|
830
|
+
unless _tmp
|
831
|
+
self.pos = _save
|
832
|
+
end
|
833
|
+
break
|
834
|
+
end # end sequence
|
835
|
+
|
836
|
+
set_failed_rule :_end unless _tmp
|
837
|
+
return _tmp
|
838
|
+
end
|
839
|
+
|
840
|
+
# slash = - "/>"
|
841
|
+
def _slash
|
842
|
+
|
843
|
+
_save = self.pos
|
844
|
+
while true # sequence
|
845
|
+
_tmp = apply(:__hyphen_)
|
846
|
+
unless _tmp
|
847
|
+
self.pos = _save
|
848
|
+
break
|
849
|
+
end
|
850
|
+
_tmp = match_string("/>")
|
851
|
+
unless _tmp
|
852
|
+
self.pos = _save
|
853
|
+
end
|
854
|
+
break
|
855
|
+
end # end sequence
|
856
|
+
|
857
|
+
set_failed_rule :_slash unless _tmp
|
858
|
+
return _tmp
|
859
|
+
end
|
860
|
+
|
861
|
+
# marker = (start | "<!" | - end)
|
862
|
+
def _marker
|
863
|
+
|
864
|
+
_save = self.pos
|
865
|
+
while true # choice
|
866
|
+
_tmp = apply(:_start)
|
867
|
+
break if _tmp
|
868
|
+
self.pos = _save
|
869
|
+
_tmp = match_string("<!")
|
870
|
+
break if _tmp
|
871
|
+
self.pos = _save
|
872
|
+
|
873
|
+
_save1 = self.pos
|
874
|
+
while true # sequence
|
875
|
+
_tmp = apply(:__hyphen_)
|
876
|
+
unless _tmp
|
877
|
+
self.pos = _save1
|
878
|
+
break
|
879
|
+
end
|
880
|
+
_tmp = apply(:_end)
|
881
|
+
unless _tmp
|
882
|
+
self.pos = _save1
|
883
|
+
end
|
884
|
+
break
|
885
|
+
end # end sequence
|
886
|
+
|
887
|
+
break if _tmp
|
888
|
+
self.pos = _save
|
889
|
+
break
|
890
|
+
end # end choice
|
891
|
+
|
892
|
+
set_failed_rule :_marker unless _tmp
|
893
|
+
return _tmp
|
894
|
+
end
|
895
|
+
|
896
|
+
# chunk = < (!marker .)* > { text }
|
897
|
+
def _chunk
|
898
|
+
|
899
|
+
_save = self.pos
|
900
|
+
while true # sequence
|
901
|
+
_text_start = self.pos
|
902
|
+
while true
|
903
|
+
|
904
|
+
_save2 = self.pos
|
905
|
+
while true # sequence
|
906
|
+
_save3 = self.pos
|
907
|
+
_tmp = apply(:_marker)
|
908
|
+
_tmp = _tmp ? nil : true
|
909
|
+
self.pos = _save3
|
910
|
+
unless _tmp
|
911
|
+
self.pos = _save2
|
912
|
+
break
|
913
|
+
end
|
914
|
+
_tmp = get_byte
|
915
|
+
unless _tmp
|
916
|
+
self.pos = _save2
|
917
|
+
end
|
918
|
+
break
|
919
|
+
end # end sequence
|
920
|
+
|
921
|
+
break unless _tmp
|
922
|
+
end
|
923
|
+
_tmp = true
|
924
|
+
if _tmp
|
925
|
+
text = get_text(_text_start)
|
926
|
+
end
|
927
|
+
unless _tmp
|
928
|
+
self.pos = _save
|
929
|
+
break
|
930
|
+
end
|
931
|
+
@result = begin; text ; end
|
932
|
+
_tmp = true
|
933
|
+
unless _tmp
|
934
|
+
self.pos = _save
|
935
|
+
end
|
936
|
+
break
|
937
|
+
end # end sequence
|
938
|
+
|
939
|
+
set_failed_rule :_chunk unless _tmp
|
940
|
+
return _tmp
|
941
|
+
end
|
942
|
+
|
943
|
+
# rclose = "->"
|
944
|
+
def _rclose
|
945
|
+
_tmp = match_string("->")
|
946
|
+
set_failed_rule :_rclose unless _tmp
|
947
|
+
return _tmp
|
948
|
+
end
|
949
|
+
|
950
|
+
# ruby = "<-" < (!rclose .)* > rclose { code(text, false) }
|
951
|
+
def _ruby
|
952
|
+
|
953
|
+
_save = self.pos
|
954
|
+
while true # sequence
|
955
|
+
_tmp = match_string("<-")
|
956
|
+
unless _tmp
|
957
|
+
self.pos = _save
|
958
|
+
break
|
959
|
+
end
|
960
|
+
_text_start = self.pos
|
961
|
+
while true
|
962
|
+
|
963
|
+
_save2 = self.pos
|
964
|
+
while true # sequence
|
965
|
+
_save3 = self.pos
|
966
|
+
_tmp = apply(:_rclose)
|
967
|
+
_tmp = _tmp ? nil : true
|
968
|
+
self.pos = _save3
|
969
|
+
unless _tmp
|
970
|
+
self.pos = _save2
|
971
|
+
break
|
972
|
+
end
|
973
|
+
_tmp = get_byte
|
974
|
+
unless _tmp
|
975
|
+
self.pos = _save2
|
976
|
+
end
|
977
|
+
break
|
978
|
+
end # end sequence
|
979
|
+
|
980
|
+
break unless _tmp
|
981
|
+
end
|
982
|
+
_tmp = true
|
983
|
+
if _tmp
|
984
|
+
text = get_text(_text_start)
|
985
|
+
end
|
986
|
+
unless _tmp
|
987
|
+
self.pos = _save
|
988
|
+
break
|
989
|
+
end
|
990
|
+
_tmp = apply(:_rclose)
|
991
|
+
unless _tmp
|
992
|
+
self.pos = _save
|
993
|
+
break
|
994
|
+
end
|
995
|
+
@result = begin; code(text, false) ; end
|
996
|
+
_tmp = true
|
997
|
+
unless _tmp
|
998
|
+
self.pos = _save
|
999
|
+
end
|
1000
|
+
break
|
1001
|
+
end # end sequence
|
1002
|
+
|
1003
|
+
set_failed_rule :_ruby unless _tmp
|
1004
|
+
return _tmp
|
1005
|
+
end
|
1006
|
+
|
1007
|
+
# pclose = "=>"
|
1008
|
+
def _pclose
|
1009
|
+
_tmp = match_string("=>")
|
1010
|
+
set_failed_rule :_pclose unless _tmp
|
1011
|
+
return _tmp
|
1012
|
+
end
|
1013
|
+
|
1014
|
+
# puby = "<=" < (!pclose .)* > pclose { code(text) }
|
1015
|
+
def _puby
|
1016
|
+
|
1017
|
+
_save = self.pos
|
1018
|
+
while true # sequence
|
1019
|
+
_tmp = match_string("<=")
|
1020
|
+
unless _tmp
|
1021
|
+
self.pos = _save
|
1022
|
+
break
|
1023
|
+
end
|
1024
|
+
_text_start = self.pos
|
1025
|
+
while true
|
1026
|
+
|
1027
|
+
_save2 = self.pos
|
1028
|
+
while true # sequence
|
1029
|
+
_save3 = self.pos
|
1030
|
+
_tmp = apply(:_pclose)
|
1031
|
+
_tmp = _tmp ? nil : true
|
1032
|
+
self.pos = _save3
|
1033
|
+
unless _tmp
|
1034
|
+
self.pos = _save2
|
1035
|
+
break
|
1036
|
+
end
|
1037
|
+
_tmp = get_byte
|
1038
|
+
unless _tmp
|
1039
|
+
self.pos = _save2
|
1040
|
+
end
|
1041
|
+
break
|
1042
|
+
end # end sequence
|
1043
|
+
|
1044
|
+
break unless _tmp
|
1045
|
+
end
|
1046
|
+
_tmp = true
|
1047
|
+
if _tmp
|
1048
|
+
text = get_text(_text_start)
|
1049
|
+
end
|
1050
|
+
unless _tmp
|
1051
|
+
self.pos = _save
|
1052
|
+
break
|
1053
|
+
end
|
1054
|
+
_tmp = apply(:_pclose)
|
1055
|
+
unless _tmp
|
1056
|
+
self.pos = _save
|
1057
|
+
break
|
1058
|
+
end
|
1059
|
+
@result = begin; code(text) ; end
|
1060
|
+
_tmp = true
|
1061
|
+
unless _tmp
|
1062
|
+
self.pos = _save
|
1063
|
+
end
|
1064
|
+
break
|
1065
|
+
end # end sequence
|
1066
|
+
|
1067
|
+
set_failed_rule :_puby unless _tmp
|
1068
|
+
return _tmp
|
1069
|
+
end
|
1070
|
+
|
1071
|
+
# part = (ruby | puby | filter | comment | tag | chunk)
|
1072
|
+
def _part
|
1073
|
+
|
1074
|
+
_save = self.pos
|
1075
|
+
while true # choice
|
1076
|
+
_tmp = apply(:_ruby)
|
1077
|
+
break if _tmp
|
1078
|
+
self.pos = _save
|
1079
|
+
_tmp = apply(:_puby)
|
1080
|
+
break if _tmp
|
1081
|
+
self.pos = _save
|
1082
|
+
_tmp = apply(:_filter)
|
1083
|
+
break if _tmp
|
1084
|
+
self.pos = _save
|
1085
|
+
_tmp = apply(:_comment)
|
1086
|
+
break if _tmp
|
1087
|
+
self.pos = _save
|
1088
|
+
_tmp = apply(:_tag)
|
1089
|
+
break if _tmp
|
1090
|
+
self.pos = _save
|
1091
|
+
_tmp = apply(:_chunk)
|
1092
|
+
break if _tmp
|
1093
|
+
self.pos = _save
|
1094
|
+
break
|
1095
|
+
end # end choice
|
1096
|
+
|
1097
|
+
set_failed_rule :_part unless _tmp
|
1098
|
+
return _tmp
|
1099
|
+
end
|
1100
|
+
|
1101
|
+
# body = (part:p body:b { join(p,b) } | part)
|
1102
|
+
def _body
|
1103
|
+
|
1104
|
+
_save = self.pos
|
1105
|
+
while true # choice
|
1106
|
+
|
1107
|
+
_save1 = self.pos
|
1108
|
+
while true # sequence
|
1109
|
+
_tmp = apply(:_part)
|
1110
|
+
p = @result
|
1111
|
+
unless _tmp
|
1112
|
+
self.pos = _save1
|
1113
|
+
break
|
1114
|
+
end
|
1115
|
+
_tmp = apply(:_body)
|
1116
|
+
b = @result
|
1117
|
+
unless _tmp
|
1118
|
+
self.pos = _save1
|
1119
|
+
break
|
1120
|
+
end
|
1121
|
+
@result = begin; join(p,b) ; end
|
1122
|
+
_tmp = true
|
1123
|
+
unless _tmp
|
1124
|
+
self.pos = _save1
|
1125
|
+
end
|
1126
|
+
break
|
1127
|
+
end # end sequence
|
1128
|
+
|
1129
|
+
break if _tmp
|
1130
|
+
self.pos = _save
|
1131
|
+
_tmp = apply(:_part)
|
1132
|
+
break if _tmp
|
1133
|
+
self.pos = _save
|
1134
|
+
break
|
1135
|
+
end # end choice
|
1136
|
+
|
1137
|
+
set_failed_rule :_body unless _tmp
|
1138
|
+
return _tmp
|
1139
|
+
end
|
1140
|
+
|
1141
|
+
# key = (name | "'" < /[^'\n]*/ > "'" { text })
|
1142
|
+
def _key
|
1143
|
+
|
1144
|
+
_save = self.pos
|
1145
|
+
while true # choice
|
1146
|
+
_tmp = apply(:_name)
|
1147
|
+
break if _tmp
|
1148
|
+
self.pos = _save
|
1149
|
+
|
1150
|
+
_save1 = self.pos
|
1151
|
+
while true # sequence
|
1152
|
+
_tmp = match_string("'")
|
1153
|
+
unless _tmp
|
1154
|
+
self.pos = _save1
|
1155
|
+
break
|
1156
|
+
end
|
1157
|
+
_text_start = self.pos
|
1158
|
+
_tmp = scan(/\A(?-mix:[^'\n]*)/)
|
1159
|
+
if _tmp
|
1160
|
+
text = get_text(_text_start)
|
1161
|
+
end
|
1162
|
+
unless _tmp
|
1163
|
+
self.pos = _save1
|
1164
|
+
break
|
1165
|
+
end
|
1166
|
+
_tmp = match_string("'")
|
1167
|
+
unless _tmp
|
1168
|
+
self.pos = _save1
|
1169
|
+
break
|
1170
|
+
end
|
1171
|
+
@result = begin; text ; end
|
1172
|
+
_tmp = true
|
1173
|
+
unless _tmp
|
1174
|
+
self.pos = _save1
|
1175
|
+
end
|
1176
|
+
break
|
1177
|
+
end # end sequence
|
1178
|
+
|
1179
|
+
break if _tmp
|
1180
|
+
self.pos = _save
|
1181
|
+
break
|
1182
|
+
end # end choice
|
1183
|
+
|
1184
|
+
set_failed_rule :_key unless _tmp
|
1185
|
+
return _tmp
|
1186
|
+
end
|
1187
|
+
|
1188
|
+
# val = ("'" < /[^'\n]*/ > "'" { text } | < (!"]" .)* > { text })
|
1189
|
+
def _val
|
1190
|
+
|
1191
|
+
_save = self.pos
|
1192
|
+
while true # choice
|
1193
|
+
|
1194
|
+
_save1 = self.pos
|
1195
|
+
while true # sequence
|
1196
|
+
_tmp = match_string("'")
|
1197
|
+
unless _tmp
|
1198
|
+
self.pos = _save1
|
1199
|
+
break
|
1200
|
+
end
|
1201
|
+
_text_start = self.pos
|
1202
|
+
_tmp = scan(/\A(?-mix:[^'\n]*)/)
|
1203
|
+
if _tmp
|
1204
|
+
text = get_text(_text_start)
|
1205
|
+
end
|
1206
|
+
unless _tmp
|
1207
|
+
self.pos = _save1
|
1208
|
+
break
|
1209
|
+
end
|
1210
|
+
_tmp = match_string("'")
|
1211
|
+
unless _tmp
|
1212
|
+
self.pos = _save1
|
1213
|
+
break
|
1214
|
+
end
|
1215
|
+
@result = begin; text ; end
|
1216
|
+
_tmp = true
|
1217
|
+
unless _tmp
|
1218
|
+
self.pos = _save1
|
1219
|
+
end
|
1220
|
+
break
|
1221
|
+
end # end sequence
|
1222
|
+
|
1223
|
+
break if _tmp
|
1224
|
+
self.pos = _save
|
1225
|
+
|
1226
|
+
_save2 = self.pos
|
1227
|
+
while true # sequence
|
1228
|
+
_text_start = self.pos
|
1229
|
+
while true
|
1230
|
+
|
1231
|
+
_save4 = self.pos
|
1232
|
+
while true # sequence
|
1233
|
+
_save5 = self.pos
|
1234
|
+
_tmp = match_string("]")
|
1235
|
+
_tmp = _tmp ? nil : true
|
1236
|
+
self.pos = _save5
|
1237
|
+
unless _tmp
|
1238
|
+
self.pos = _save4
|
1239
|
+
break
|
1240
|
+
end
|
1241
|
+
_tmp = get_byte
|
1242
|
+
unless _tmp
|
1243
|
+
self.pos = _save4
|
1244
|
+
end
|
1245
|
+
break
|
1246
|
+
end # end sequence
|
1247
|
+
|
1248
|
+
break unless _tmp
|
1249
|
+
end
|
1250
|
+
_tmp = true
|
1251
|
+
if _tmp
|
1252
|
+
text = get_text(_text_start)
|
1253
|
+
end
|
1254
|
+
unless _tmp
|
1255
|
+
self.pos = _save2
|
1256
|
+
break
|
1257
|
+
end
|
1258
|
+
@result = begin; text ; end
|
1259
|
+
_tmp = true
|
1260
|
+
unless _tmp
|
1261
|
+
self.pos = _save2
|
1262
|
+
end
|
1263
|
+
break
|
1264
|
+
end # end sequence
|
1265
|
+
|
1266
|
+
break if _tmp
|
1267
|
+
self.pos = _save
|
1268
|
+
break
|
1269
|
+
end # end choice
|
1270
|
+
|
1271
|
+
set_failed_rule :_val unless _tmp
|
1272
|
+
return _tmp
|
1273
|
+
end
|
1274
|
+
|
1275
|
+
# dattr = "[" key:k "=" val:v "]" { "data-#{k}='#{v}'" }
|
1276
|
+
def _dattr
|
1277
|
+
|
1278
|
+
_save = self.pos
|
1279
|
+
while true # sequence
|
1280
|
+
_tmp = match_string("[")
|
1281
|
+
unless _tmp
|
1282
|
+
self.pos = _save
|
1283
|
+
break
|
1284
|
+
end
|
1285
|
+
_tmp = apply(:_key)
|
1286
|
+
k = @result
|
1287
|
+
unless _tmp
|
1288
|
+
self.pos = _save
|
1289
|
+
break
|
1290
|
+
end
|
1291
|
+
_tmp = match_string("=")
|
1292
|
+
unless _tmp
|
1293
|
+
self.pos = _save
|
1294
|
+
break
|
1295
|
+
end
|
1296
|
+
_tmp = apply(:_val)
|
1297
|
+
v = @result
|
1298
|
+
unless _tmp
|
1299
|
+
self.pos = _save
|
1300
|
+
break
|
1301
|
+
end
|
1302
|
+
_tmp = match_string("]")
|
1303
|
+
unless _tmp
|
1304
|
+
self.pos = _save
|
1305
|
+
break
|
1306
|
+
end
|
1307
|
+
@result = begin; "data-#{k}='#{v}'" ; end
|
1308
|
+
_tmp = true
|
1309
|
+
unless _tmp
|
1310
|
+
self.pos = _save
|
1311
|
+
end
|
1312
|
+
break
|
1313
|
+
end # end sequence
|
1314
|
+
|
1315
|
+
set_failed_rule :_dattr unless _tmp
|
1316
|
+
return _tmp
|
1317
|
+
end
|
1318
|
+
|
1319
|
+
# dattrs = (dattr:a dattrs:l { "#{a} #{l}" } | dattr)
|
1320
|
+
def _dattrs
|
1321
|
+
|
1322
|
+
_save = self.pos
|
1323
|
+
while true # choice
|
1324
|
+
|
1325
|
+
_save1 = self.pos
|
1326
|
+
while true # sequence
|
1327
|
+
_tmp = apply(:_dattr)
|
1328
|
+
a = @result
|
1329
|
+
unless _tmp
|
1330
|
+
self.pos = _save1
|
1331
|
+
break
|
1332
|
+
end
|
1333
|
+
_tmp = apply(:_dattrs)
|
1334
|
+
l = @result
|
1335
|
+
unless _tmp
|
1336
|
+
self.pos = _save1
|
1337
|
+
break
|
1338
|
+
end
|
1339
|
+
@result = begin; "#{a} #{l}" ; end
|
1340
|
+
_tmp = true
|
1341
|
+
unless _tmp
|
1342
|
+
self.pos = _save1
|
1343
|
+
end
|
1344
|
+
break
|
1345
|
+
end # end sequence
|
1346
|
+
|
1347
|
+
break if _tmp
|
1348
|
+
self.pos = _save
|
1349
|
+
_tmp = apply(:_dattr)
|
1350
|
+
break if _tmp
|
1351
|
+
self.pos = _save
|
1352
|
+
break
|
1353
|
+
end # end choice
|
1354
|
+
|
1355
|
+
set_failed_rule :_dattrs unless _tmp
|
1356
|
+
return _tmp
|
1357
|
+
end
|
1358
|
+
|
1359
|
+
# attr = ("[data" dattrs:t "]" { [t,true] } | "[" key:k "=" val:v "]" { [k, v] } | "[" key:k "]" { [k,true] })
|
1360
|
+
def _attr
|
1361
|
+
|
1362
|
+
_save = self.pos
|
1363
|
+
while true # choice
|
1364
|
+
|
1365
|
+
_save1 = self.pos
|
1366
|
+
while true # sequence
|
1367
|
+
_tmp = match_string("[data")
|
1368
|
+
unless _tmp
|
1369
|
+
self.pos = _save1
|
1370
|
+
break
|
1371
|
+
end
|
1372
|
+
_tmp = apply(:_dattrs)
|
1373
|
+
t = @result
|
1374
|
+
unless _tmp
|
1375
|
+
self.pos = _save1
|
1376
|
+
break
|
1377
|
+
end
|
1378
|
+
_tmp = match_string("]")
|
1379
|
+
unless _tmp
|
1380
|
+
self.pos = _save1
|
1381
|
+
break
|
1382
|
+
end
|
1383
|
+
@result = begin; [t,true] ; end
|
1384
|
+
_tmp = true
|
1385
|
+
unless _tmp
|
1386
|
+
self.pos = _save1
|
1387
|
+
end
|
1388
|
+
break
|
1389
|
+
end # end sequence
|
1390
|
+
|
1391
|
+
break if _tmp
|
1392
|
+
self.pos = _save
|
1393
|
+
|
1394
|
+
_save2 = self.pos
|
1395
|
+
while true # sequence
|
1396
|
+
_tmp = match_string("[")
|
1397
|
+
unless _tmp
|
1398
|
+
self.pos = _save2
|
1399
|
+
break
|
1400
|
+
end
|
1401
|
+
_tmp = apply(:_key)
|
1402
|
+
k = @result
|
1403
|
+
unless _tmp
|
1404
|
+
self.pos = _save2
|
1405
|
+
break
|
1406
|
+
end
|
1407
|
+
_tmp = match_string("=")
|
1408
|
+
unless _tmp
|
1409
|
+
self.pos = _save2
|
1410
|
+
break
|
1411
|
+
end
|
1412
|
+
_tmp = apply(:_val)
|
1413
|
+
v = @result
|
1414
|
+
unless _tmp
|
1415
|
+
self.pos = _save2
|
1416
|
+
break
|
1417
|
+
end
|
1418
|
+
_tmp = match_string("]")
|
1419
|
+
unless _tmp
|
1420
|
+
self.pos = _save2
|
1421
|
+
break
|
1422
|
+
end
|
1423
|
+
@result = begin; [k, v] ; end
|
1424
|
+
_tmp = true
|
1425
|
+
unless _tmp
|
1426
|
+
self.pos = _save2
|
1427
|
+
end
|
1428
|
+
break
|
1429
|
+
end # end sequence
|
1430
|
+
|
1431
|
+
break if _tmp
|
1432
|
+
self.pos = _save
|
1433
|
+
|
1434
|
+
_save3 = self.pos
|
1435
|
+
while true # sequence
|
1436
|
+
_tmp = match_string("[")
|
1437
|
+
unless _tmp
|
1438
|
+
self.pos = _save3
|
1439
|
+
break
|
1440
|
+
end
|
1441
|
+
_tmp = apply(:_key)
|
1442
|
+
k = @result
|
1443
|
+
unless _tmp
|
1444
|
+
self.pos = _save3
|
1445
|
+
break
|
1446
|
+
end
|
1447
|
+
_tmp = match_string("]")
|
1448
|
+
unless _tmp
|
1449
|
+
self.pos = _save3
|
1450
|
+
break
|
1451
|
+
end
|
1452
|
+
@result = begin; [k,true] ; end
|
1453
|
+
_tmp = true
|
1454
|
+
unless _tmp
|
1455
|
+
self.pos = _save3
|
1456
|
+
end
|
1457
|
+
break
|
1458
|
+
end # end sequence
|
1459
|
+
|
1460
|
+
break if _tmp
|
1461
|
+
self.pos = _save
|
1462
|
+
break
|
1463
|
+
end # end choice
|
1464
|
+
|
1465
|
+
set_failed_rule :_attr unless _tmp
|
1466
|
+
return _tmp
|
1467
|
+
end
|
1468
|
+
|
1469
|
+
# attrs = (attr:a attrs:l { [a] + l } | attr:a { [a] })
|
1470
|
+
def _attrs
|
1471
|
+
|
1472
|
+
_save = self.pos
|
1473
|
+
while true # choice
|
1474
|
+
|
1475
|
+
_save1 = self.pos
|
1476
|
+
while true # sequence
|
1477
|
+
_tmp = apply(:_attr)
|
1478
|
+
a = @result
|
1479
|
+
unless _tmp
|
1480
|
+
self.pos = _save1
|
1481
|
+
break
|
1482
|
+
end
|
1483
|
+
_tmp = apply(:_attrs)
|
1484
|
+
l = @result
|
1485
|
+
unless _tmp
|
1486
|
+
self.pos = _save1
|
1487
|
+
break
|
1488
|
+
end
|
1489
|
+
@result = begin; [a] + l ; end
|
1490
|
+
_tmp = true
|
1491
|
+
unless _tmp
|
1492
|
+
self.pos = _save1
|
1493
|
+
end
|
1494
|
+
break
|
1495
|
+
end # end sequence
|
1496
|
+
|
1497
|
+
break if _tmp
|
1498
|
+
self.pos = _save
|
1499
|
+
|
1500
|
+
_save2 = self.pos
|
1501
|
+
while true # sequence
|
1502
|
+
_tmp = apply(:_attr)
|
1503
|
+
a = @result
|
1504
|
+
unless _tmp
|
1505
|
+
self.pos = _save2
|
1506
|
+
break
|
1507
|
+
end
|
1508
|
+
@result = begin; [a] ; end
|
1509
|
+
_tmp = true
|
1510
|
+
unless _tmp
|
1511
|
+
self.pos = _save2
|
1512
|
+
end
|
1513
|
+
break
|
1514
|
+
end # end sequence
|
1515
|
+
|
1516
|
+
break if _tmp
|
1517
|
+
self.pos = _save
|
1518
|
+
break
|
1519
|
+
end # end choice
|
1520
|
+
|
1521
|
+
set_failed_rule :_attrs unless _tmp
|
1522
|
+
return _tmp
|
1523
|
+
end
|
1524
|
+
|
1525
|
+
# cc_if = /[iI][fF]/
|
1526
|
+
def _cc_if
|
1527
|
+
_tmp = scan(/\A(?-mix:[iI][fF])/)
|
1528
|
+
set_failed_rule :_cc_if unless _tmp
|
1529
|
+
return _tmp
|
1530
|
+
end
|
1531
|
+
|
1532
|
+
# cc_end = /[eE][nN][dD][iI][fF]/
|
1533
|
+
def _cc_end
|
1534
|
+
_tmp = scan(/\A(?-mix:[eE][nN][dD][iI][fF])/)
|
1535
|
+
set_failed_rule :_cc_end unless _tmp
|
1536
|
+
return _tmp
|
1537
|
+
end
|
1538
|
+
|
1539
|
+
# comment = ("<!" space+ < "[" space* cc_if (!"]" .)* "]" > space+ "!>" { "<!--#{text}>" } | "<!" space+ < "[" space* cc_end (!"]" .)* "]" > space+ "!>" { "<!#{text}-->" } | "<!" < (!"!>" .)* > "!>" { "<!--#{text}-->" })
|
1540
|
+
def _comment
|
1541
|
+
|
1542
|
+
_save = self.pos
|
1543
|
+
while true # choice
|
1544
|
+
|
1545
|
+
_save1 = self.pos
|
1546
|
+
while true # sequence
|
1547
|
+
_tmp = match_string("<!")
|
1548
|
+
unless _tmp
|
1549
|
+
self.pos = _save1
|
1550
|
+
break
|
1551
|
+
end
|
1552
|
+
_save2 = self.pos
|
1553
|
+
_tmp = apply(:_space)
|
1554
|
+
if _tmp
|
1555
|
+
while true
|
1556
|
+
_tmp = apply(:_space)
|
1557
|
+
break unless _tmp
|
1558
|
+
end
|
1559
|
+
_tmp = true
|
1560
|
+
else
|
1561
|
+
self.pos = _save2
|
1562
|
+
end
|
1563
|
+
unless _tmp
|
1564
|
+
self.pos = _save1
|
1565
|
+
break
|
1566
|
+
end
|
1567
|
+
_text_start = self.pos
|
1568
|
+
|
1569
|
+
_save3 = self.pos
|
1570
|
+
while true # sequence
|
1571
|
+
_tmp = match_string("[")
|
1572
|
+
unless _tmp
|
1573
|
+
self.pos = _save3
|
1574
|
+
break
|
1575
|
+
end
|
1576
|
+
while true
|
1577
|
+
_tmp = apply(:_space)
|
1578
|
+
break unless _tmp
|
1579
|
+
end
|
1580
|
+
_tmp = true
|
1581
|
+
unless _tmp
|
1582
|
+
self.pos = _save3
|
1583
|
+
break
|
1584
|
+
end
|
1585
|
+
_tmp = apply(:_cc_if)
|
1586
|
+
unless _tmp
|
1587
|
+
self.pos = _save3
|
1588
|
+
break
|
1589
|
+
end
|
1590
|
+
while true
|
1591
|
+
|
1592
|
+
_save6 = self.pos
|
1593
|
+
while true # sequence
|
1594
|
+
_save7 = self.pos
|
1595
|
+
_tmp = match_string("]")
|
1596
|
+
_tmp = _tmp ? nil : true
|
1597
|
+
self.pos = _save7
|
1598
|
+
unless _tmp
|
1599
|
+
self.pos = _save6
|
1600
|
+
break
|
1601
|
+
end
|
1602
|
+
_tmp = get_byte
|
1603
|
+
unless _tmp
|
1604
|
+
self.pos = _save6
|
1605
|
+
end
|
1606
|
+
break
|
1607
|
+
end # end sequence
|
1608
|
+
|
1609
|
+
break unless _tmp
|
1610
|
+
end
|
1611
|
+
_tmp = true
|
1612
|
+
unless _tmp
|
1613
|
+
self.pos = _save3
|
1614
|
+
break
|
1615
|
+
end
|
1616
|
+
_tmp = match_string("]")
|
1617
|
+
unless _tmp
|
1618
|
+
self.pos = _save3
|
1619
|
+
end
|
1620
|
+
break
|
1621
|
+
end # end sequence
|
1622
|
+
|
1623
|
+
if _tmp
|
1624
|
+
text = get_text(_text_start)
|
1625
|
+
end
|
1626
|
+
unless _tmp
|
1627
|
+
self.pos = _save1
|
1628
|
+
break
|
1629
|
+
end
|
1630
|
+
_save8 = self.pos
|
1631
|
+
_tmp = apply(:_space)
|
1632
|
+
if _tmp
|
1633
|
+
while true
|
1634
|
+
_tmp = apply(:_space)
|
1635
|
+
break unless _tmp
|
1636
|
+
end
|
1637
|
+
_tmp = true
|
1638
|
+
else
|
1639
|
+
self.pos = _save8
|
1640
|
+
end
|
1641
|
+
unless _tmp
|
1642
|
+
self.pos = _save1
|
1643
|
+
break
|
1644
|
+
end
|
1645
|
+
_tmp = match_string("!>")
|
1646
|
+
unless _tmp
|
1647
|
+
self.pos = _save1
|
1648
|
+
break
|
1649
|
+
end
|
1650
|
+
@result = begin; "<!--#{text}>" ; end
|
1651
|
+
_tmp = true
|
1652
|
+
unless _tmp
|
1653
|
+
self.pos = _save1
|
1654
|
+
end
|
1655
|
+
break
|
1656
|
+
end # end sequence
|
1657
|
+
|
1658
|
+
break if _tmp
|
1659
|
+
self.pos = _save
|
1660
|
+
|
1661
|
+
_save9 = self.pos
|
1662
|
+
while true # sequence
|
1663
|
+
_tmp = match_string("<!")
|
1664
|
+
unless _tmp
|
1665
|
+
self.pos = _save9
|
1666
|
+
break
|
1667
|
+
end
|
1668
|
+
_save10 = self.pos
|
1669
|
+
_tmp = apply(:_space)
|
1670
|
+
if _tmp
|
1671
|
+
while true
|
1672
|
+
_tmp = apply(:_space)
|
1673
|
+
break unless _tmp
|
1674
|
+
end
|
1675
|
+
_tmp = true
|
1676
|
+
else
|
1677
|
+
self.pos = _save10
|
1678
|
+
end
|
1679
|
+
unless _tmp
|
1680
|
+
self.pos = _save9
|
1681
|
+
break
|
1682
|
+
end
|
1683
|
+
_text_start = self.pos
|
1684
|
+
|
1685
|
+
_save11 = self.pos
|
1686
|
+
while true # sequence
|
1687
|
+
_tmp = match_string("[")
|
1688
|
+
unless _tmp
|
1689
|
+
self.pos = _save11
|
1690
|
+
break
|
1691
|
+
end
|
1692
|
+
while true
|
1693
|
+
_tmp = apply(:_space)
|
1694
|
+
break unless _tmp
|
1695
|
+
end
|
1696
|
+
_tmp = true
|
1697
|
+
unless _tmp
|
1698
|
+
self.pos = _save11
|
1699
|
+
break
|
1700
|
+
end
|
1701
|
+
_tmp = apply(:_cc_end)
|
1702
|
+
unless _tmp
|
1703
|
+
self.pos = _save11
|
1704
|
+
break
|
1705
|
+
end
|
1706
|
+
while true
|
1707
|
+
|
1708
|
+
_save14 = self.pos
|
1709
|
+
while true # sequence
|
1710
|
+
_save15 = self.pos
|
1711
|
+
_tmp = match_string("]")
|
1712
|
+
_tmp = _tmp ? nil : true
|
1713
|
+
self.pos = _save15
|
1714
|
+
unless _tmp
|
1715
|
+
self.pos = _save14
|
1716
|
+
break
|
1717
|
+
end
|
1718
|
+
_tmp = get_byte
|
1719
|
+
unless _tmp
|
1720
|
+
self.pos = _save14
|
1721
|
+
end
|
1722
|
+
break
|
1723
|
+
end # end sequence
|
1724
|
+
|
1725
|
+
break unless _tmp
|
1726
|
+
end
|
1727
|
+
_tmp = true
|
1728
|
+
unless _tmp
|
1729
|
+
self.pos = _save11
|
1730
|
+
break
|
1731
|
+
end
|
1732
|
+
_tmp = match_string("]")
|
1733
|
+
unless _tmp
|
1734
|
+
self.pos = _save11
|
1735
|
+
end
|
1736
|
+
break
|
1737
|
+
end # end sequence
|
1738
|
+
|
1739
|
+
if _tmp
|
1740
|
+
text = get_text(_text_start)
|
1741
|
+
end
|
1742
|
+
unless _tmp
|
1743
|
+
self.pos = _save9
|
1744
|
+
break
|
1745
|
+
end
|
1746
|
+
_save16 = self.pos
|
1747
|
+
_tmp = apply(:_space)
|
1748
|
+
if _tmp
|
1749
|
+
while true
|
1750
|
+
_tmp = apply(:_space)
|
1751
|
+
break unless _tmp
|
1752
|
+
end
|
1753
|
+
_tmp = true
|
1754
|
+
else
|
1755
|
+
self.pos = _save16
|
1756
|
+
end
|
1757
|
+
unless _tmp
|
1758
|
+
self.pos = _save9
|
1759
|
+
break
|
1760
|
+
end
|
1761
|
+
_tmp = match_string("!>")
|
1762
|
+
unless _tmp
|
1763
|
+
self.pos = _save9
|
1764
|
+
break
|
1765
|
+
end
|
1766
|
+
@result = begin; "<!#{text}-->" ; end
|
1767
|
+
_tmp = true
|
1768
|
+
unless _tmp
|
1769
|
+
self.pos = _save9
|
1770
|
+
end
|
1771
|
+
break
|
1772
|
+
end # end sequence
|
1773
|
+
|
1774
|
+
break if _tmp
|
1775
|
+
self.pos = _save
|
1776
|
+
|
1777
|
+
_save17 = self.pos
|
1778
|
+
while true # sequence
|
1779
|
+
_tmp = match_string("<!")
|
1780
|
+
unless _tmp
|
1781
|
+
self.pos = _save17
|
1782
|
+
break
|
1783
|
+
end
|
1784
|
+
_text_start = self.pos
|
1785
|
+
while true
|
1786
|
+
|
1787
|
+
_save19 = self.pos
|
1788
|
+
while true # sequence
|
1789
|
+
_save20 = self.pos
|
1790
|
+
_tmp = match_string("!>")
|
1791
|
+
_tmp = _tmp ? nil : true
|
1792
|
+
self.pos = _save20
|
1793
|
+
unless _tmp
|
1794
|
+
self.pos = _save19
|
1795
|
+
break
|
1796
|
+
end
|
1797
|
+
_tmp = get_byte
|
1798
|
+
unless _tmp
|
1799
|
+
self.pos = _save19
|
1800
|
+
end
|
1801
|
+
break
|
1802
|
+
end # end sequence
|
1803
|
+
|
1804
|
+
break unless _tmp
|
1805
|
+
end
|
1806
|
+
_tmp = true
|
1807
|
+
if _tmp
|
1808
|
+
text = get_text(_text_start)
|
1809
|
+
end
|
1810
|
+
unless _tmp
|
1811
|
+
self.pos = _save17
|
1812
|
+
break
|
1813
|
+
end
|
1814
|
+
_tmp = match_string("!>")
|
1815
|
+
unless _tmp
|
1816
|
+
self.pos = _save17
|
1817
|
+
break
|
1818
|
+
end
|
1819
|
+
@result = begin; "<!--#{text}-->" ; end
|
1820
|
+
_tmp = true
|
1821
|
+
unless _tmp
|
1822
|
+
self.pos = _save17
|
1823
|
+
end
|
1824
|
+
break
|
1825
|
+
end # end sequence
|
1826
|
+
|
1827
|
+
break if _tmp
|
1828
|
+
self.pos = _save
|
1829
|
+
break
|
1830
|
+
end # end choice
|
1831
|
+
|
1832
|
+
set_failed_rule :_comment unless _tmp
|
1833
|
+
return _tmp
|
1834
|
+
end
|
1835
|
+
|
1836
|
+
# simple = /[a-zA-Z0-9_\-]+/
|
1837
|
+
def _simple
|
1838
|
+
_tmp = scan(/\A(?-mix:[a-zA-Z0-9_\-]+)/)
|
1839
|
+
set_failed_rule :_simple unless _tmp
|
1840
|
+
return _tmp
|
1841
|
+
end
|
1842
|
+
|
1843
|
+
# select = ("#" < simple > { ["id", text] } | "." < simple > { ["class", text] })
|
1844
|
+
def _select
|
1845
|
+
|
1846
|
+
_save = self.pos
|
1847
|
+
while true # choice
|
1848
|
+
|
1849
|
+
_save1 = self.pos
|
1850
|
+
while true # sequence
|
1851
|
+
_tmp = match_string("#")
|
1852
|
+
unless _tmp
|
1853
|
+
self.pos = _save1
|
1854
|
+
break
|
1855
|
+
end
|
1856
|
+
_text_start = self.pos
|
1857
|
+
_tmp = apply(:_simple)
|
1858
|
+
if _tmp
|
1859
|
+
text = get_text(_text_start)
|
1860
|
+
end
|
1861
|
+
unless _tmp
|
1862
|
+
self.pos = _save1
|
1863
|
+
break
|
1864
|
+
end
|
1865
|
+
@result = begin; ["id", text] ; end
|
1866
|
+
_tmp = true
|
1867
|
+
unless _tmp
|
1868
|
+
self.pos = _save1
|
1869
|
+
end
|
1870
|
+
break
|
1871
|
+
end # end sequence
|
1872
|
+
|
1873
|
+
break if _tmp
|
1874
|
+
self.pos = _save
|
1875
|
+
|
1876
|
+
_save2 = self.pos
|
1877
|
+
while true # sequence
|
1878
|
+
_tmp = match_string(".")
|
1879
|
+
unless _tmp
|
1880
|
+
self.pos = _save2
|
1881
|
+
break
|
1882
|
+
end
|
1883
|
+
_text_start = self.pos
|
1884
|
+
_tmp = apply(:_simple)
|
1885
|
+
if _tmp
|
1886
|
+
text = get_text(_text_start)
|
1887
|
+
end
|
1888
|
+
unless _tmp
|
1889
|
+
self.pos = _save2
|
1890
|
+
break
|
1891
|
+
end
|
1892
|
+
@result = begin; ["class", text] ; end
|
1893
|
+
_tmp = true
|
1894
|
+
unless _tmp
|
1895
|
+
self.pos = _save2
|
1896
|
+
end
|
1897
|
+
break
|
1898
|
+
end # end sequence
|
1899
|
+
|
1900
|
+
break if _tmp
|
1901
|
+
self.pos = _save
|
1902
|
+
break
|
1903
|
+
end # end choice
|
1904
|
+
|
1905
|
+
set_failed_rule :_select unless _tmp
|
1906
|
+
return _tmp
|
1907
|
+
end
|
1908
|
+
|
1909
|
+
# selects = (select:s selects:t { [s] + t } | select:s { [s] })
|
1910
|
+
def _selects
|
1911
|
+
|
1912
|
+
_save = self.pos
|
1913
|
+
while true # choice
|
1914
|
+
|
1915
|
+
_save1 = self.pos
|
1916
|
+
while true # sequence
|
1917
|
+
_tmp = apply(:_select)
|
1918
|
+
s = @result
|
1919
|
+
unless _tmp
|
1920
|
+
self.pos = _save1
|
1921
|
+
break
|
1922
|
+
end
|
1923
|
+
_tmp = apply(:_selects)
|
1924
|
+
t = @result
|
1925
|
+
unless _tmp
|
1926
|
+
self.pos = _save1
|
1927
|
+
break
|
1928
|
+
end
|
1929
|
+
@result = begin; [s] + t ; end
|
1930
|
+
_tmp = true
|
1931
|
+
unless _tmp
|
1932
|
+
self.pos = _save1
|
1933
|
+
end
|
1934
|
+
break
|
1935
|
+
end # end sequence
|
1936
|
+
|
1937
|
+
break if _tmp
|
1938
|
+
self.pos = _save
|
1939
|
+
|
1940
|
+
_save2 = self.pos
|
1941
|
+
while true # sequence
|
1942
|
+
_tmp = apply(:_select)
|
1943
|
+
s = @result
|
1944
|
+
unless _tmp
|
1945
|
+
self.pos = _save2
|
1946
|
+
break
|
1947
|
+
end
|
1948
|
+
@result = begin; [s] ; end
|
1949
|
+
_tmp = true
|
1950
|
+
unless _tmp
|
1951
|
+
self.pos = _save2
|
1952
|
+
end
|
1953
|
+
break
|
1954
|
+
end # end sequence
|
1955
|
+
|
1956
|
+
break if _tmp
|
1957
|
+
self.pos = _save
|
1958
|
+
break
|
1959
|
+
end # end choice
|
1960
|
+
|
1961
|
+
set_failed_rule :_selects unless _tmp
|
1962
|
+
return _tmp
|
1963
|
+
end
|
1964
|
+
|
1965
|
+
# end_filter = bs* < /[a-zA-Z]+/ > &{ n == text } ":>"
|
1966
|
+
def _end_filter(n)
|
1967
|
+
|
1968
|
+
_save = self.pos
|
1969
|
+
while true # sequence
|
1970
|
+
while true
|
1971
|
+
_tmp = apply(:_bs)
|
1972
|
+
break unless _tmp
|
1973
|
+
end
|
1974
|
+
_tmp = true
|
1975
|
+
unless _tmp
|
1976
|
+
self.pos = _save
|
1977
|
+
break
|
1978
|
+
end
|
1979
|
+
_text_start = self.pos
|
1980
|
+
_tmp = scan(/\A(?-mix:[a-zA-Z]+)/)
|
1981
|
+
if _tmp
|
1982
|
+
text = get_text(_text_start)
|
1983
|
+
end
|
1984
|
+
unless _tmp
|
1985
|
+
self.pos = _save
|
1986
|
+
break
|
1987
|
+
end
|
1988
|
+
_save2 = self.pos
|
1989
|
+
_tmp = begin; n == text ; end
|
1990
|
+
self.pos = _save2
|
1991
|
+
unless _tmp
|
1992
|
+
self.pos = _save
|
1993
|
+
break
|
1994
|
+
end
|
1995
|
+
_tmp = match_string(":>")
|
1996
|
+
unless _tmp
|
1997
|
+
self.pos = _save
|
1998
|
+
end
|
1999
|
+
break
|
2000
|
+
end # end sequence
|
2001
|
+
|
2002
|
+
set_failed_rule :_end_filter unless _tmp
|
2003
|
+
return _tmp
|
2004
|
+
end
|
2005
|
+
|
2006
|
+
# filter = "<:" name:n bs* < (!end_filter(n) .)* > end_filter(n) { Filter.new(n, text) }
|
2007
|
+
def _filter
|
2008
|
+
|
2009
|
+
_save = self.pos
|
2010
|
+
while true # sequence
|
2011
|
+
_tmp = match_string("<:")
|
2012
|
+
unless _tmp
|
2013
|
+
self.pos = _save
|
2014
|
+
break
|
2015
|
+
end
|
2016
|
+
_tmp = apply(:_name)
|
2017
|
+
n = @result
|
2018
|
+
unless _tmp
|
2019
|
+
self.pos = _save
|
2020
|
+
break
|
2021
|
+
end
|
2022
|
+
while true
|
2023
|
+
_tmp = apply(:_bs)
|
2024
|
+
break unless _tmp
|
2025
|
+
end
|
2026
|
+
_tmp = true
|
2027
|
+
unless _tmp
|
2028
|
+
self.pos = _save
|
2029
|
+
break
|
2030
|
+
end
|
2031
|
+
_text_start = self.pos
|
2032
|
+
while true
|
2033
|
+
|
2034
|
+
_save3 = self.pos
|
2035
|
+
while true # sequence
|
2036
|
+
_save4 = self.pos
|
2037
|
+
_tmp = apply_with_args(:_end_filter, n)
|
2038
|
+
_tmp = _tmp ? nil : true
|
2039
|
+
self.pos = _save4
|
2040
|
+
unless _tmp
|
2041
|
+
self.pos = _save3
|
2042
|
+
break
|
2043
|
+
end
|
2044
|
+
_tmp = get_byte
|
2045
|
+
unless _tmp
|
2046
|
+
self.pos = _save3
|
2047
|
+
end
|
2048
|
+
break
|
2049
|
+
end # end sequence
|
2050
|
+
|
2051
|
+
break unless _tmp
|
2052
|
+
end
|
2053
|
+
_tmp = true
|
2054
|
+
if _tmp
|
2055
|
+
text = get_text(_text_start)
|
2056
|
+
end
|
2057
|
+
unless _tmp
|
2058
|
+
self.pos = _save
|
2059
|
+
break
|
2060
|
+
end
|
2061
|
+
_tmp = apply_with_args(:_end_filter, n)
|
2062
|
+
unless _tmp
|
2063
|
+
self.pos = _save
|
2064
|
+
break
|
2065
|
+
end
|
2066
|
+
@result = begin; Filter.new(n, text) ; end
|
2067
|
+
_tmp = true
|
2068
|
+
unless _tmp
|
2069
|
+
self.pos = _save
|
2070
|
+
end
|
2071
|
+
break
|
2072
|
+
end # end sequence
|
2073
|
+
|
2074
|
+
set_failed_rule :_filter unless _tmp
|
2075
|
+
return _tmp
|
2076
|
+
end
|
2077
|
+
|
2078
|
+
# tag = (start:l slash { "<#{l} />" } | start:l space+ end:r { "<#{l}></#{r}>" } | start:l attrs:a slash { "<#{l} #{attrs(a)} />" } | start:l selects:t slash { "<#{l} #{attrs(t)} />" } | start:l selects:t attrs:a slash { "<#{l} #{attrs(t,a)} />" } | start:l attrs:a space+ end:r { "<#{l} #{attrs(a)}></#{r}>" } | start:l selects:t space+ end:r { "<#{l} #{attrs(t)}></#{r}>" } | start:l selects:t attrs:a space+ end:r { "<#{l} #{attrs(t,a)}></#{r}>" } | start:l selects:t attrs:a pts body:b pts:es end:r { joinm "<#{l} #{attrs(a,t)}>",b,es,"</#{r}>" } | start:l attrs:a pts body:b pts:es end:r { joinm "<#{l} #{attrs(a)}>", b, es, "</#{r}>" } | start:l selects:t pts:s body:b pts:es end:r { joinm "<#{l} #{attrs(t)}>",s, b, es, "</#{r}>" } | start:l pts:s body:b pts:es end:r { joinm "<#{l}>", s, b, es, "</#{r}>" })
|
2079
|
+
def _tag
|
2080
|
+
|
2081
|
+
_save = self.pos
|
2082
|
+
while true # choice
|
2083
|
+
|
2084
|
+
_save1 = self.pos
|
2085
|
+
while true # sequence
|
2086
|
+
_tmp = apply(:_start)
|
2087
|
+
l = @result
|
2088
|
+
unless _tmp
|
2089
|
+
self.pos = _save1
|
2090
|
+
break
|
2091
|
+
end
|
2092
|
+
_tmp = apply(:_slash)
|
2093
|
+
unless _tmp
|
2094
|
+
self.pos = _save1
|
2095
|
+
break
|
2096
|
+
end
|
2097
|
+
@result = begin; "<#{l} />" ; end
|
2098
|
+
_tmp = true
|
2099
|
+
unless _tmp
|
2100
|
+
self.pos = _save1
|
2101
|
+
end
|
2102
|
+
break
|
2103
|
+
end # end sequence
|
2104
|
+
|
2105
|
+
break if _tmp
|
2106
|
+
self.pos = _save
|
2107
|
+
|
2108
|
+
_save2 = self.pos
|
2109
|
+
while true # sequence
|
2110
|
+
_tmp = apply(:_start)
|
2111
|
+
l = @result
|
2112
|
+
unless _tmp
|
2113
|
+
self.pos = _save2
|
2114
|
+
break
|
2115
|
+
end
|
2116
|
+
_save3 = self.pos
|
2117
|
+
_tmp = apply(:_space)
|
2118
|
+
if _tmp
|
2119
|
+
while true
|
2120
|
+
_tmp = apply(:_space)
|
2121
|
+
break unless _tmp
|
2122
|
+
end
|
2123
|
+
_tmp = true
|
2124
|
+
else
|
2125
|
+
self.pos = _save3
|
2126
|
+
end
|
2127
|
+
unless _tmp
|
2128
|
+
self.pos = _save2
|
2129
|
+
break
|
2130
|
+
end
|
2131
|
+
_tmp = apply(:_end)
|
2132
|
+
r = @result
|
2133
|
+
unless _tmp
|
2134
|
+
self.pos = _save2
|
2135
|
+
break
|
2136
|
+
end
|
2137
|
+
@result = begin; "<#{l}></#{r}>" ; end
|
2138
|
+
_tmp = true
|
2139
|
+
unless _tmp
|
2140
|
+
self.pos = _save2
|
2141
|
+
end
|
2142
|
+
break
|
2143
|
+
end # end sequence
|
2144
|
+
|
2145
|
+
break if _tmp
|
2146
|
+
self.pos = _save
|
2147
|
+
|
2148
|
+
_save4 = self.pos
|
2149
|
+
while true # sequence
|
2150
|
+
_tmp = apply(:_start)
|
2151
|
+
l = @result
|
2152
|
+
unless _tmp
|
2153
|
+
self.pos = _save4
|
2154
|
+
break
|
2155
|
+
end
|
2156
|
+
_tmp = apply(:_attrs)
|
2157
|
+
a = @result
|
2158
|
+
unless _tmp
|
2159
|
+
self.pos = _save4
|
2160
|
+
break
|
2161
|
+
end
|
2162
|
+
_tmp = apply(:_slash)
|
2163
|
+
unless _tmp
|
2164
|
+
self.pos = _save4
|
2165
|
+
break
|
2166
|
+
end
|
2167
|
+
@result = begin; "<#{l} #{attrs(a)} />" ; end
|
2168
|
+
_tmp = true
|
2169
|
+
unless _tmp
|
2170
|
+
self.pos = _save4
|
2171
|
+
end
|
2172
|
+
break
|
2173
|
+
end # end sequence
|
2174
|
+
|
2175
|
+
break if _tmp
|
2176
|
+
self.pos = _save
|
2177
|
+
|
2178
|
+
_save5 = self.pos
|
2179
|
+
while true # sequence
|
2180
|
+
_tmp = apply(:_start)
|
2181
|
+
l = @result
|
2182
|
+
unless _tmp
|
2183
|
+
self.pos = _save5
|
2184
|
+
break
|
2185
|
+
end
|
2186
|
+
_tmp = apply(:_selects)
|
2187
|
+
t = @result
|
2188
|
+
unless _tmp
|
2189
|
+
self.pos = _save5
|
2190
|
+
break
|
2191
|
+
end
|
2192
|
+
_tmp = apply(:_slash)
|
2193
|
+
unless _tmp
|
2194
|
+
self.pos = _save5
|
2195
|
+
break
|
2196
|
+
end
|
2197
|
+
@result = begin; "<#{l} #{attrs(t)} />" ; end
|
2198
|
+
_tmp = true
|
2199
|
+
unless _tmp
|
2200
|
+
self.pos = _save5
|
2201
|
+
end
|
2202
|
+
break
|
2203
|
+
end # end sequence
|
2204
|
+
|
2205
|
+
break if _tmp
|
2206
|
+
self.pos = _save
|
2207
|
+
|
2208
|
+
_save6 = self.pos
|
2209
|
+
while true # sequence
|
2210
|
+
_tmp = apply(:_start)
|
2211
|
+
l = @result
|
2212
|
+
unless _tmp
|
2213
|
+
self.pos = _save6
|
2214
|
+
break
|
2215
|
+
end
|
2216
|
+
_tmp = apply(:_selects)
|
2217
|
+
t = @result
|
2218
|
+
unless _tmp
|
2219
|
+
self.pos = _save6
|
2220
|
+
break
|
2221
|
+
end
|
2222
|
+
_tmp = apply(:_attrs)
|
2223
|
+
a = @result
|
2224
|
+
unless _tmp
|
2225
|
+
self.pos = _save6
|
2226
|
+
break
|
2227
|
+
end
|
2228
|
+
_tmp = apply(:_slash)
|
2229
|
+
unless _tmp
|
2230
|
+
self.pos = _save6
|
2231
|
+
break
|
2232
|
+
end
|
2233
|
+
@result = begin; "<#{l} #{attrs(t,a)} />" ; end
|
2234
|
+
_tmp = true
|
2235
|
+
unless _tmp
|
2236
|
+
self.pos = _save6
|
2237
|
+
end
|
2238
|
+
break
|
2239
|
+
end # end sequence
|
2240
|
+
|
2241
|
+
break if _tmp
|
2242
|
+
self.pos = _save
|
2243
|
+
|
2244
|
+
_save7 = self.pos
|
2245
|
+
while true # sequence
|
2246
|
+
_tmp = apply(:_start)
|
2247
|
+
l = @result
|
2248
|
+
unless _tmp
|
2249
|
+
self.pos = _save7
|
2250
|
+
break
|
2251
|
+
end
|
2252
|
+
_tmp = apply(:_attrs)
|
2253
|
+
a = @result
|
2254
|
+
unless _tmp
|
2255
|
+
self.pos = _save7
|
2256
|
+
break
|
2257
|
+
end
|
2258
|
+
_save8 = self.pos
|
2259
|
+
_tmp = apply(:_space)
|
2260
|
+
if _tmp
|
2261
|
+
while true
|
2262
|
+
_tmp = apply(:_space)
|
2263
|
+
break unless _tmp
|
2264
|
+
end
|
2265
|
+
_tmp = true
|
2266
|
+
else
|
2267
|
+
self.pos = _save8
|
2268
|
+
end
|
2269
|
+
unless _tmp
|
2270
|
+
self.pos = _save7
|
2271
|
+
break
|
2272
|
+
end
|
2273
|
+
_tmp = apply(:_end)
|
2274
|
+
r = @result
|
2275
|
+
unless _tmp
|
2276
|
+
self.pos = _save7
|
2277
|
+
break
|
2278
|
+
end
|
2279
|
+
@result = begin; "<#{l} #{attrs(a)}></#{r}>" ; end
|
2280
|
+
_tmp = true
|
2281
|
+
unless _tmp
|
2282
|
+
self.pos = _save7
|
2283
|
+
end
|
2284
|
+
break
|
2285
|
+
end # end sequence
|
2286
|
+
|
2287
|
+
break if _tmp
|
2288
|
+
self.pos = _save
|
2289
|
+
|
2290
|
+
_save9 = self.pos
|
2291
|
+
while true # sequence
|
2292
|
+
_tmp = apply(:_start)
|
2293
|
+
l = @result
|
2294
|
+
unless _tmp
|
2295
|
+
self.pos = _save9
|
2296
|
+
break
|
2297
|
+
end
|
2298
|
+
_tmp = apply(:_selects)
|
2299
|
+
t = @result
|
2300
|
+
unless _tmp
|
2301
|
+
self.pos = _save9
|
2302
|
+
break
|
2303
|
+
end
|
2304
|
+
_save10 = self.pos
|
2305
|
+
_tmp = apply(:_space)
|
2306
|
+
if _tmp
|
2307
|
+
while true
|
2308
|
+
_tmp = apply(:_space)
|
2309
|
+
break unless _tmp
|
2310
|
+
end
|
2311
|
+
_tmp = true
|
2312
|
+
else
|
2313
|
+
self.pos = _save10
|
2314
|
+
end
|
2315
|
+
unless _tmp
|
2316
|
+
self.pos = _save9
|
2317
|
+
break
|
2318
|
+
end
|
2319
|
+
_tmp = apply(:_end)
|
2320
|
+
r = @result
|
2321
|
+
unless _tmp
|
2322
|
+
self.pos = _save9
|
2323
|
+
break
|
2324
|
+
end
|
2325
|
+
@result = begin; "<#{l} #{attrs(t)}></#{r}>" ; end
|
2326
|
+
_tmp = true
|
2327
|
+
unless _tmp
|
2328
|
+
self.pos = _save9
|
2329
|
+
end
|
2330
|
+
break
|
2331
|
+
end # end sequence
|
2332
|
+
|
2333
|
+
break if _tmp
|
2334
|
+
self.pos = _save
|
2335
|
+
|
2336
|
+
_save11 = self.pos
|
2337
|
+
while true # sequence
|
2338
|
+
_tmp = apply(:_start)
|
2339
|
+
l = @result
|
2340
|
+
unless _tmp
|
2341
|
+
self.pos = _save11
|
2342
|
+
break
|
2343
|
+
end
|
2344
|
+
_tmp = apply(:_selects)
|
2345
|
+
t = @result
|
2346
|
+
unless _tmp
|
2347
|
+
self.pos = _save11
|
2348
|
+
break
|
2349
|
+
end
|
2350
|
+
_tmp = apply(:_attrs)
|
2351
|
+
a = @result
|
2352
|
+
unless _tmp
|
2353
|
+
self.pos = _save11
|
2354
|
+
break
|
2355
|
+
end
|
2356
|
+
_save12 = self.pos
|
2357
|
+
_tmp = apply(:_space)
|
2358
|
+
if _tmp
|
2359
|
+
while true
|
2360
|
+
_tmp = apply(:_space)
|
2361
|
+
break unless _tmp
|
2362
|
+
end
|
2363
|
+
_tmp = true
|
2364
|
+
else
|
2365
|
+
self.pos = _save12
|
2366
|
+
end
|
2367
|
+
unless _tmp
|
2368
|
+
self.pos = _save11
|
2369
|
+
break
|
2370
|
+
end
|
2371
|
+
_tmp = apply(:_end)
|
2372
|
+
r = @result
|
2373
|
+
unless _tmp
|
2374
|
+
self.pos = _save11
|
2375
|
+
break
|
2376
|
+
end
|
2377
|
+
@result = begin; "<#{l} #{attrs(t,a)}></#{r}>" ; end
|
2378
|
+
_tmp = true
|
2379
|
+
unless _tmp
|
2380
|
+
self.pos = _save11
|
2381
|
+
end
|
2382
|
+
break
|
2383
|
+
end # end sequence
|
2384
|
+
|
2385
|
+
break if _tmp
|
2386
|
+
self.pos = _save
|
2387
|
+
|
2388
|
+
_save13 = self.pos
|
2389
|
+
while true # sequence
|
2390
|
+
_tmp = apply(:_start)
|
2391
|
+
l = @result
|
2392
|
+
unless _tmp
|
2393
|
+
self.pos = _save13
|
2394
|
+
break
|
2395
|
+
end
|
2396
|
+
_tmp = apply(:_selects)
|
2397
|
+
t = @result
|
2398
|
+
unless _tmp
|
2399
|
+
self.pos = _save13
|
2400
|
+
break
|
2401
|
+
end
|
2402
|
+
_tmp = apply(:_attrs)
|
2403
|
+
a = @result
|
2404
|
+
unless _tmp
|
2405
|
+
self.pos = _save13
|
2406
|
+
break
|
2407
|
+
end
|
2408
|
+
_tmp = apply(:_pts)
|
2409
|
+
unless _tmp
|
2410
|
+
self.pos = _save13
|
2411
|
+
break
|
2412
|
+
end
|
2413
|
+
_tmp = apply(:_body)
|
2414
|
+
b = @result
|
2415
|
+
unless _tmp
|
2416
|
+
self.pos = _save13
|
2417
|
+
break
|
2418
|
+
end
|
2419
|
+
_tmp = apply(:_pts)
|
2420
|
+
es = @result
|
2421
|
+
unless _tmp
|
2422
|
+
self.pos = _save13
|
2423
|
+
break
|
2424
|
+
end
|
2425
|
+
_tmp = apply(:_end)
|
2426
|
+
r = @result
|
2427
|
+
unless _tmp
|
2428
|
+
self.pos = _save13
|
2429
|
+
break
|
2430
|
+
end
|
2431
|
+
@result = begin; joinm "<#{l} #{attrs(a,t)}>",b,es,"</#{r}>" ; end
|
2432
|
+
_tmp = true
|
2433
|
+
unless _tmp
|
2434
|
+
self.pos = _save13
|
2435
|
+
end
|
2436
|
+
break
|
2437
|
+
end # end sequence
|
2438
|
+
|
2439
|
+
break if _tmp
|
2440
|
+
self.pos = _save
|
2441
|
+
|
2442
|
+
_save14 = self.pos
|
2443
|
+
while true # sequence
|
2444
|
+
_tmp = apply(:_start)
|
2445
|
+
l = @result
|
2446
|
+
unless _tmp
|
2447
|
+
self.pos = _save14
|
2448
|
+
break
|
2449
|
+
end
|
2450
|
+
_tmp = apply(:_attrs)
|
2451
|
+
a = @result
|
2452
|
+
unless _tmp
|
2453
|
+
self.pos = _save14
|
2454
|
+
break
|
2455
|
+
end
|
2456
|
+
_tmp = apply(:_pts)
|
2457
|
+
unless _tmp
|
2458
|
+
self.pos = _save14
|
2459
|
+
break
|
2460
|
+
end
|
2461
|
+
_tmp = apply(:_body)
|
2462
|
+
b = @result
|
2463
|
+
unless _tmp
|
2464
|
+
self.pos = _save14
|
2465
|
+
break
|
2466
|
+
end
|
2467
|
+
_tmp = apply(:_pts)
|
2468
|
+
es = @result
|
2469
|
+
unless _tmp
|
2470
|
+
self.pos = _save14
|
2471
|
+
break
|
2472
|
+
end
|
2473
|
+
_tmp = apply(:_end)
|
2474
|
+
r = @result
|
2475
|
+
unless _tmp
|
2476
|
+
self.pos = _save14
|
2477
|
+
break
|
2478
|
+
end
|
2479
|
+
@result = begin; joinm "<#{l} #{attrs(a)}>", b, es, "</#{r}>" ; end
|
2480
|
+
_tmp = true
|
2481
|
+
unless _tmp
|
2482
|
+
self.pos = _save14
|
2483
|
+
end
|
2484
|
+
break
|
2485
|
+
end # end sequence
|
2486
|
+
|
2487
|
+
break if _tmp
|
2488
|
+
self.pos = _save
|
2489
|
+
|
2490
|
+
_save15 = self.pos
|
2491
|
+
while true # sequence
|
2492
|
+
_tmp = apply(:_start)
|
2493
|
+
l = @result
|
2494
|
+
unless _tmp
|
2495
|
+
self.pos = _save15
|
2496
|
+
break
|
2497
|
+
end
|
2498
|
+
_tmp = apply(:_selects)
|
2499
|
+
t = @result
|
2500
|
+
unless _tmp
|
2501
|
+
self.pos = _save15
|
2502
|
+
break
|
2503
|
+
end
|
2504
|
+
_tmp = apply(:_pts)
|
2505
|
+
s = @result
|
2506
|
+
unless _tmp
|
2507
|
+
self.pos = _save15
|
2508
|
+
break
|
2509
|
+
end
|
2510
|
+
_tmp = apply(:_body)
|
2511
|
+
b = @result
|
2512
|
+
unless _tmp
|
2513
|
+
self.pos = _save15
|
2514
|
+
break
|
2515
|
+
end
|
2516
|
+
_tmp = apply(:_pts)
|
2517
|
+
es = @result
|
2518
|
+
unless _tmp
|
2519
|
+
self.pos = _save15
|
2520
|
+
break
|
2521
|
+
end
|
2522
|
+
_tmp = apply(:_end)
|
2523
|
+
r = @result
|
2524
|
+
unless _tmp
|
2525
|
+
self.pos = _save15
|
2526
|
+
break
|
2527
|
+
end
|
2528
|
+
@result = begin; joinm "<#{l} #{attrs(t)}>",s, b, es, "</#{r}>" ; end
|
2529
|
+
_tmp = true
|
2530
|
+
unless _tmp
|
2531
|
+
self.pos = _save15
|
2532
|
+
end
|
2533
|
+
break
|
2534
|
+
end # end sequence
|
2535
|
+
|
2536
|
+
break if _tmp
|
2537
|
+
self.pos = _save
|
2538
|
+
|
2539
|
+
_save16 = self.pos
|
2540
|
+
while true # sequence
|
2541
|
+
_tmp = apply(:_start)
|
2542
|
+
l = @result
|
2543
|
+
unless _tmp
|
2544
|
+
self.pos = _save16
|
2545
|
+
break
|
2546
|
+
end
|
2547
|
+
_tmp = apply(:_pts)
|
2548
|
+
s = @result
|
2549
|
+
unless _tmp
|
2550
|
+
self.pos = _save16
|
2551
|
+
break
|
2552
|
+
end
|
2553
|
+
_tmp = apply(:_body)
|
2554
|
+
b = @result
|
2555
|
+
unless _tmp
|
2556
|
+
self.pos = _save16
|
2557
|
+
break
|
2558
|
+
end
|
2559
|
+
_tmp = apply(:_pts)
|
2560
|
+
es = @result
|
2561
|
+
unless _tmp
|
2562
|
+
self.pos = _save16
|
2563
|
+
break
|
2564
|
+
end
|
2565
|
+
_tmp = apply(:_end)
|
2566
|
+
r = @result
|
2567
|
+
unless _tmp
|
2568
|
+
self.pos = _save16
|
2569
|
+
break
|
2570
|
+
end
|
2571
|
+
@result = begin; joinm "<#{l}>", s, b, es, "</#{r}>" ; end
|
2572
|
+
_tmp = true
|
2573
|
+
unless _tmp
|
2574
|
+
self.pos = _save16
|
2575
|
+
end
|
2576
|
+
break
|
2577
|
+
end # end sequence
|
2578
|
+
|
2579
|
+
break if _tmp
|
2580
|
+
self.pos = _save
|
2581
|
+
break
|
2582
|
+
end # end choice
|
2583
|
+
|
2584
|
+
set_failed_rule :_tag unless _tmp
|
2585
|
+
return _tmp
|
2586
|
+
end
|
2587
|
+
|
2588
|
+
# root = doctype? body:b eof { @output = join(b,"") }
|
2589
|
+
def _root
|
2590
|
+
|
2591
|
+
_save = self.pos
|
2592
|
+
while true # sequence
|
2593
|
+
_save1 = self.pos
|
2594
|
+
_tmp = apply(:_doctype)
|
2595
|
+
unless _tmp
|
2596
|
+
_tmp = true
|
2597
|
+
self.pos = _save1
|
2598
|
+
end
|
2599
|
+
unless _tmp
|
2600
|
+
self.pos = _save
|
2601
|
+
break
|
2602
|
+
end
|
2603
|
+
_tmp = apply(:_body)
|
2604
|
+
b = @result
|
2605
|
+
unless _tmp
|
2606
|
+
self.pos = _save
|
2607
|
+
break
|
2608
|
+
end
|
2609
|
+
_tmp = apply(:_eof)
|
2610
|
+
unless _tmp
|
2611
|
+
self.pos = _save
|
2612
|
+
break
|
2613
|
+
end
|
2614
|
+
@result = begin; @output = join(b,"") ; end
|
2615
|
+
_tmp = true
|
2616
|
+
unless _tmp
|
2617
|
+
self.pos = _save
|
2618
|
+
end
|
2619
|
+
break
|
2620
|
+
end # end sequence
|
2621
|
+
|
2622
|
+
set_failed_rule :_root unless _tmp
|
2623
|
+
return _tmp
|
2624
|
+
end
|
2625
|
+
|
2626
|
+
Rules = {}
|
2627
|
+
Rules[:_space] = rule_info("space", "(\" \" | \"\\t\")")
|
2628
|
+
Rules[:_bs] = rule_info("bs", "(\" \" | \"\\t\" | \"\\n\")")
|
2629
|
+
Rules[:__hyphen_] = rule_info("-", "bs+")
|
2630
|
+
Rules[:_eol] = rule_info("eol", "\"\\n\"")
|
2631
|
+
Rules[:_eof] = rule_info("eof", "!.")
|
2632
|
+
Rules[:_rest] = rule_info("rest", "< (!eol .)* > (eol | eof) { text }")
|
2633
|
+
Rules[:_doctype] = rule_info("doctype", "\"!!!\" space* rest:r { @doctype = r.empty? ? \"html\" : r }")
|
2634
|
+
Rules[:_name] = rule_info("name", "< /[a-zA-Z0-9_\\-:]+/ > { text }")
|
2635
|
+
Rules[:_start] = rule_info("start", "\"<\" name:n { n }")
|
2636
|
+
Rules[:_pts] = rule_info("pts", "(space+ { \"\" } | < eol bs* > { text })")
|
2637
|
+
Rules[:_end] = rule_info("end", "name:n \">\" { n }")
|
2638
|
+
Rules[:_slash] = rule_info("slash", "- \"/>\"")
|
2639
|
+
Rules[:_marker] = rule_info("marker", "(start | \"<!\" | - end)")
|
2640
|
+
Rules[:_chunk] = rule_info("chunk", "< (!marker .)* > { text }")
|
2641
|
+
Rules[:_rclose] = rule_info("rclose", "\"->\"")
|
2642
|
+
Rules[:_ruby] = rule_info("ruby", "\"<-\" < (!rclose .)* > rclose { code(text, false) }")
|
2643
|
+
Rules[:_pclose] = rule_info("pclose", "\"=>\"")
|
2644
|
+
Rules[:_puby] = rule_info("puby", "\"<=\" < (!pclose .)* > pclose { code(text) }")
|
2645
|
+
Rules[:_part] = rule_info("part", "(ruby | puby | filter | comment | tag | chunk)")
|
2646
|
+
Rules[:_body] = rule_info("body", "(part:p body:b { join(p,b) } | part)")
|
2647
|
+
Rules[:_key] = rule_info("key", "(name | \"'\" < /[^'\\n]*/ > \"'\" { text })")
|
2648
|
+
Rules[:_val] = rule_info("val", "(\"'\" < /[^'\\n]*/ > \"'\" { text } | < (!\"]\" .)* > { text })")
|
2649
|
+
Rules[:_dattr] = rule_info("dattr", "\"[\" key:k \"=\" val:v \"]\" { \"data-\#{k}='\#{v}'\" }")
|
2650
|
+
Rules[:_dattrs] = rule_info("dattrs", "(dattr:a dattrs:l { \"\#{a} \#{l}\" } | dattr)")
|
2651
|
+
Rules[:_attr] = rule_info("attr", "(\"[data\" dattrs:t \"]\" { [t,true] } | \"[\" key:k \"=\" val:v \"]\" { [k, v] } | \"[\" key:k \"]\" { [k,true] })")
|
2652
|
+
Rules[:_attrs] = rule_info("attrs", "(attr:a attrs:l { [a] + l } | attr:a { [a] })")
|
2653
|
+
Rules[:_cc_if] = rule_info("cc_if", "/[iI][fF]/")
|
2654
|
+
Rules[:_cc_end] = rule_info("cc_end", "/[eE][nN][dD][iI][fF]/")
|
2655
|
+
Rules[:_comment] = rule_info("comment", "(\"<!\" space+ < \"[\" space* cc_if (!\"]\" .)* \"]\" > space+ \"!>\" { \"<!--\#{text}>\" } | \"<!\" space+ < \"[\" space* cc_end (!\"]\" .)* \"]\" > space+ \"!>\" { \"<!\#{text}-->\" } | \"<!\" < (!\"!>\" .)* > \"!>\" { \"<!--\#{text}-->\" })")
|
2656
|
+
Rules[:_simple] = rule_info("simple", "/[a-zA-Z0-9_\\-]+/")
|
2657
|
+
Rules[:_select] = rule_info("select", "(\"\#\" < simple > { [\"id\", text] } | \".\" < simple > { [\"class\", text] })")
|
2658
|
+
Rules[:_selects] = rule_info("selects", "(select:s selects:t { [s] + t } | select:s { [s] })")
|
2659
|
+
Rules[:_end_filter] = rule_info("end_filter", "bs* < /[a-zA-Z]+/ > &{ n == text } \":>\"")
|
2660
|
+
Rules[:_filter] = rule_info("filter", "\"<:\" name:n bs* < (!end_filter(n) .)* > end_filter(n) { Filter.new(n, text) }")
|
2661
|
+
Rules[:_tag] = rule_info("tag", "(start:l slash { \"<\#{l} />\" } | start:l space+ end:r { \"<\#{l}></\#{r}>\" } | start:l attrs:a slash { \"<\#{l} \#{attrs(a)} />\" } | start:l selects:t slash { \"<\#{l} \#{attrs(t)} />\" } | start:l selects:t attrs:a slash { \"<\#{l} \#{attrs(t,a)} />\" } | start:l attrs:a space+ end:r { \"<\#{l} \#{attrs(a)}></\#{r}>\" } | start:l selects:t space+ end:r { \"<\#{l} \#{attrs(t)}></\#{r}>\" } | start:l selects:t attrs:a space+ end:r { \"<\#{l} \#{attrs(t,a)}></\#{r}>\" } | start:l selects:t attrs:a pts body:b pts:es end:r { joinm \"<\#{l} \#{attrs(a,t)}>\",b,es,\"</\#{r}>\" } | start:l attrs:a pts body:b pts:es end:r { joinm \"<\#{l} \#{attrs(a)}>\", b, es, \"</\#{r}>\" } | start:l selects:t pts:s body:b pts:es end:r { joinm \"<\#{l} \#{attrs(t)}>\",s, b, es, \"</\#{r}>\" } | start:l pts:s body:b pts:es end:r { joinm \"<\#{l}>\", s, b, es, \"</\#{r}>\" })")
|
2662
|
+
Rules[:_root] = rule_info("root", "doctype? body:b eof { @output = join(b,\"\") }")
|
2663
|
+
# :startdoc:
|
2664
|
+
end
|