dang 1.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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