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.
@@ -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