diff options
Diffstat (limited to 'lib/rdoc/markdown.rb')
-rw-r--r-- | lib/rdoc/markdown.rb | 638 |
1 files changed, 368 insertions, 270 deletions
diff --git a/lib/rdoc/markdown.rb b/lib/rdoc/markdown.rb index 15beaefcca..5c72a5f224 100644 --- a/lib/rdoc/markdown.rb +++ b/lib/rdoc/markdown.rb @@ -175,7 +175,7 @@ # [dingus]: http://daringfireball.net/projects/markdown/dingus # [GFM]: https://github.github.com/gfm/ # [pegmarkdown]: https://github.com/jgm/peg-markdown -# [PHPE]: http://michelf.com/projects/php-markdown/extra/#def-list +# [PHPE]: https://michelf.ca/projects/php-markdown/extra/#def-list # [syntax]: http://daringfireball.net/projects/markdown/syntax #-- # Last updated to jgm/peg-markdown commit 8f8fc22ef0 @@ -199,6 +199,7 @@ class RDoc::Markdown @result = nil @failed_rule = nil @failing_rule_offset = -1 + @line_offsets = nil setup_foreign_grammar end @@ -208,30 +209,75 @@ class RDoc::Markdown attr_accessor :result, :pos def current_column(target=pos) - if c = string.rindex("\n", target-1) - return target - c - 1 + if string[target] == "\n" && (c = string.rindex("\n", target-1) || -1) + return target - c + elsif c = string.rindex("\n", target) + return target - c end target + 1 end - def current_line(target=pos) - cur_offset = 0 - cur_line = 0 + def position_line_offsets + unless @position_line_offsets + @position_line_offsets = [] + total = 0 + string.each_line do |line| + total += line.size + @position_line_offsets << total + end + end + @position_line_offsets + end + + if [].respond_to? :bsearch_index + def current_line(target=pos) + if line = position_line_offsets.bsearch_index {|x| x > target } + return line + 1 + end + raise "Target position #{target} is outside of string" + end + else + def current_line(target=pos) + if line = position_line_offsets.index {|x| x > target } + return line + 1 + end - string.each_line do |line| - cur_line += 1 - cur_offset += line.size - return cur_line if cur_offset >= target + raise "Target position #{target} is outside of string" end + end - -1 + def current_character(target=pos) + if target < 0 || target >= string.size + raise "Target position #{target} is outside of string" + end + string[target, 1] + end + + KpegPosInfo = Struct.new(:pos, :lno, :col, :line, :char) + + def current_pos_info(target=pos) + l = current_line target + c = current_column target + ln = get_line(l-1) + chr = string[target,1] + KpegPosInfo.new(target, l, c, ln, chr) end def lines - lines = [] - string.each_line { |l| lines << l } - lines + string.lines + end + + def get_line(no) + loff = position_line_offsets + if no < 0 + raise "Line No is out of range: #{no} < 0" + elsif no >= loff.size + raise "Line No is out of range: #{no} >= #{loff.size}" + end + lend = loff[no]-1 + lstart = no > 0 ? loff[no-1] : 0 + string[lstart..lend] end @@ -245,6 +291,7 @@ class RDoc::Markdown @string = string @string_size = string ? string.size : 0 @pos = pos + @position_line_offsets = nil end def show_pos @@ -269,30 +316,22 @@ class RDoc::Markdown end def failure_caret - l = current_line @failing_rule_offset - c = current_column @failing_rule_offset - - line = lines[l-1] - "#{line}\n#{' ' * (c - 1)}^" + p = current_pos_info @failing_rule_offset + "#{p.line.chomp}\n#{' ' * (p.col - 1)}^" end def failure_character - l = current_line @failing_rule_offset - c = current_column @failing_rule_offset - lines[l-1][c-1, 1] + current_character @failing_rule_offset end def failure_oneline - l = current_line @failing_rule_offset - c = current_column @failing_rule_offset - - char = lines[l-1][c-1, 1] + p = current_pos_info @failing_rule_offset if @failed_rule.kind_of? Symbol info = self.class::Rules[@failed_rule] - "@#{l}:#{c} failed rule '#{info.name}', got '#{char}'" + "@#{p.lno}:#{p.col} failed rule '#{info.name}', got '#{p.char}'" else - "@#{l}:#{c} failed rule '#{@failed_rule}', got '#{char}'" + "@#{p.lno}:#{p.col} failed rule '#{@failed_rule}', got '#{p.char}'" end end @@ -305,10 +344,9 @@ class RDoc::Markdown def show_error(io=STDOUT) error_pos = @failing_rule_offset - line_no = current_line(error_pos) - col_no = current_column(error_pos) + p = current_pos_info(error_pos) - io.puts "On line #{line_no}, column #{col_no}:" + io.puts "On line #{p.lno}, column #{p.col}:" if @failed_rule.kind_of? Symbol info = self.class::Rules[@failed_rule] @@ -317,10 +355,9 @@ class RDoc::Markdown io.puts "Failed to match rule '#{@failed_rule}'" end - io.puts "Got: #{string[error_pos,1].inspect}" - line = lines[line_no-1] - io.puts "=> #{line}" - io.print(" " * (col_no + 3)) + io.puts "Got: #{p.char.inspect}" + io.puts "=> #{p.line}" + io.print(" " * (p.col + 2)) io.puts "^" end @@ -344,9 +381,8 @@ class RDoc::Markdown end def scan(reg) - if m = reg.match(@string[@pos..-1]) - width = m.end(0) - @pos += width + if m = reg.match(@string, @pos) + @pos = m.end(0) return true end @@ -430,6 +466,7 @@ class RDoc::Markdown end def apply_with_args(rule, *args) + @result = nil memo_key = [rule, args] if m = @memoizations[memo_key][@pos] @pos = m.pos @@ -463,6 +500,7 @@ class RDoc::Markdown end def apply(rule) + @result = nil if m = @memoizations[rule][@pos] @pos = m.pos if !m.set @@ -534,11 +572,11 @@ class RDoc::Markdown - require 'rdoc' - require 'rdoc/markup/to_joined_paragraph' - require 'rdoc/markdown/entities' + require_relative '../rdoc' + require_relative 'markup/to_joined_paragraph' + require_relative 'markdown/entities' - require 'rdoc/markdown/literals' + require_relative 'markdown/literals' ## # Supported extensions @@ -796,7 +834,7 @@ class RDoc::Markdown @note_order.each_with_index do |ref, index| label = index + 1 - note = @footnotes[ref] + note = @footnotes[ref] or raise ParseError, "footnote [^#{ref}] not found" link = "{^#{label}}[rdoc-label:footmark-#{label}:foottext-#{label}] " note.parts.unshift link @@ -1060,7 +1098,7 @@ class RDoc::Markdown self.pos = _save3 break end - _tmp = scan(/\A(?-mix:#*)/) + _tmp = scan(/\G(?-mix:#*)/) unless _tmp self.pos = _save3 break @@ -1100,7 +1138,7 @@ class RDoc::Markdown _save = self.pos while true # sequence _text_start = self.pos - _tmp = scan(/\A(?-mix:\#{1,6})/) + _tmp = scan(/\G(?-mix:\#{1,6})/) if _tmp text = get_text(_text_start) end @@ -1165,7 +1203,7 @@ class RDoc::Markdown self.pos = _save3 break end - _tmp = scan(/\A(?-mix:#*)/) + _tmp = scan(/\G(?-mix:#*)/) unless _tmp self.pos = _save3 break @@ -1225,7 +1263,7 @@ class RDoc::Markdown _save = self.pos while true # sequence - _tmp = scan(/\A(?-mix:={1,})/) + _tmp = scan(/\G(?-mix:={1,})/) unless _tmp self.pos = _save break @@ -1246,7 +1284,7 @@ class RDoc::Markdown _save = self.pos while true # sequence - _tmp = scan(/\A(?-mix:-{1,})/) + _tmp = scan(/\G(?-mix:-{1,})/) unless _tmp self.pos = _save break @@ -2130,7 +2168,7 @@ class RDoc::Markdown self.pos = _save break end - _tmp = scan(/\A(?-mix:[+*-])/) + _tmp = scan(/\G(?-mix:[+*-])/) unless _tmp self.pos = _save break @@ -9385,7 +9423,7 @@ class RDoc::Markdown self.pos = _save7 break end - _tmp = scan(/\A(?-mix:[^`\n]*$)/) + _tmp = scan(/\G(?-mix:[^`\n]*$)/) unless _tmp self.pos = _save7 end @@ -9476,7 +9514,7 @@ class RDoc::Markdown self.pos = _save15 break end - _tmp = scan(/\A(?-mix:[^`\n]*$)/) + _tmp = scan(/\G(?-mix:[^`\n]*$)/) unless _tmp self.pos = _save15 end @@ -9725,7 +9763,7 @@ class RDoc::Markdown _save3 = self.pos while true # sequence - _tmp = scan(/\A(?-mix:_+)/) + _tmp = scan(/\G(?-mix:_+)/) unless _tmp self.pos = _save3 break @@ -9755,7 +9793,7 @@ class RDoc::Markdown _save6 = self.pos while true # sequence - _tmp = scan(/\A(?-mix:_+)/) + _tmp = scan(/\G(?-mix:_+)/) unless _tmp self.pos = _save6 break @@ -9818,7 +9856,7 @@ class RDoc::Markdown break end _text_start = self.pos - _tmp = scan(/\A(?-mix:[:\\`|*_{}\[\]()#+.!><-])/) + _tmp = scan(/\G(?-mix:[:\\`|*_{}\[\]()#+.!><-])/) if _tmp text = get_text(_text_start) end @@ -9944,7 +9982,7 @@ class RDoc::Markdown self.pos = _save5 break end - _tmp = scan(/\A(?-mix:={1,}|-{1,})/) + _tmp = scan(/\G(?-mix:={1,}|-{1,})/) unless _tmp self.pos = _save5 break @@ -10096,7 +10134,7 @@ class RDoc::Markdown _save1 = self.pos while true # sequence _text_start = self.pos - _tmp = scan(/\A(?-mix:\*{4,})/) + _tmp = scan(/\G(?-mix:\*{4,})/) if _tmp text = get_text(_text_start) end @@ -10126,7 +10164,7 @@ class RDoc::Markdown self.pos = _save3 break end - _tmp = scan(/\A(?-mix:\*+)/) + _tmp = scan(/\G(?-mix:\*+)/) unless _tmp self.pos = _save3 break @@ -10173,7 +10211,7 @@ class RDoc::Markdown _save1 = self.pos while true # sequence _text_start = self.pos - _tmp = scan(/\A(?-mix:_{4,})/) + _tmp = scan(/\G(?-mix:_{4,})/) if _tmp text = get_text(_text_start) end @@ -10203,7 +10241,7 @@ class RDoc::Markdown self.pos = _save3 break end - _tmp = scan(/\A(?-mix:_+)/) + _tmp = scan(/\G(?-mix:_+)/) unless _tmp self.pos = _save3 break @@ -11564,7 +11602,7 @@ class RDoc::Markdown _save1 = self.pos while true # sequence - _tmp = scan(/\A(?-mix:[A-Za-z]+)/) + _tmp = scan(/\G(?-mix:[A-Za-z]+)/) unless _tmp self.pos = _save1 break @@ -11689,7 +11727,7 @@ class RDoc::Markdown _save2 = self.pos while true # sequence - _tmp = scan(/\A(?i-mx:[\w+.\/!%~$-]+)/) + _tmp = scan(/\G(?i-mx:[\w+.\/!%~$-]+)/) unless _tmp self.pos = _save2 break @@ -12553,7 +12591,7 @@ class RDoc::Markdown self.pos = _save10 break end - _tmp = scan(/\A(?-mix:`+)/) + _tmp = scan(/\G(?-mix:`+)/) unless _tmp self.pos = _save10 end @@ -12690,7 +12728,7 @@ class RDoc::Markdown self.pos = _save24 break end - _tmp = scan(/\A(?-mix:`+)/) + _tmp = scan(/\G(?-mix:`+)/) unless _tmp self.pos = _save24 end @@ -12867,7 +12905,7 @@ class RDoc::Markdown self.pos = _save40 break end - _tmp = scan(/\A(?-mix:`+)/) + _tmp = scan(/\G(?-mix:`+)/) unless _tmp self.pos = _save40 end @@ -13004,7 +13042,7 @@ class RDoc::Markdown self.pos = _save54 break end - _tmp = scan(/\A(?-mix:`+)/) + _tmp = scan(/\G(?-mix:`+)/) unless _tmp self.pos = _save54 end @@ -13181,7 +13219,7 @@ class RDoc::Markdown self.pos = _save70 break end - _tmp = scan(/\A(?-mix:`+)/) + _tmp = scan(/\G(?-mix:`+)/) unless _tmp self.pos = _save70 end @@ -13318,7 +13356,7 @@ class RDoc::Markdown self.pos = _save84 break end - _tmp = scan(/\A(?-mix:`+)/) + _tmp = scan(/\G(?-mix:`+)/) unless _tmp self.pos = _save84 end @@ -13495,7 +13533,7 @@ class RDoc::Markdown self.pos = _save100 break end - _tmp = scan(/\A(?-mix:`+)/) + _tmp = scan(/\G(?-mix:`+)/) unless _tmp self.pos = _save100 end @@ -13632,7 +13670,7 @@ class RDoc::Markdown self.pos = _save114 break end - _tmp = scan(/\A(?-mix:`+)/) + _tmp = scan(/\G(?-mix:`+)/) unless _tmp self.pos = _save114 end @@ -13809,7 +13847,7 @@ class RDoc::Markdown self.pos = _save130 break end - _tmp = scan(/\A(?-mix:`+)/) + _tmp = scan(/\G(?-mix:`+)/) unless _tmp self.pos = _save130 end @@ -13946,7 +13984,7 @@ class RDoc::Markdown self.pos = _save144 break end - _tmp = scan(/\A(?-mix:`+)/) + _tmp = scan(/\G(?-mix:`+)/) unless _tmp self.pos = _save144 end @@ -14598,7 +14636,7 @@ class RDoc::Markdown _save = self.pos while true # choice - _tmp = scan(/\A(?-mix:[~*_`&\[\]()<!#\\'"])/) + _tmp = scan(/\G(?-mix:[~*_`&\[\]()<!#\\'"])/) break if _tmp self.pos = _save _tmp = _ExtendedSpecialChar() @@ -14703,13 +14741,13 @@ class RDoc::Markdown _save = self.pos while true # sequence - _tmp = scan(/\A(?i-mx:&#x)/) + _tmp = scan(/\G(?i-mx:&#x)/) unless _tmp self.pos = _save break end _text_start = self.pos - _tmp = scan(/\A(?-mix:[0-9a-fA-F]+)/) + _tmp = scan(/\G(?-mix:[0-9a-fA-F]+)/) if _tmp text = get_text(_text_start) end @@ -14745,7 +14783,7 @@ class RDoc::Markdown break end _text_start = self.pos - _tmp = scan(/\A(?-mix:[0-9]+)/) + _tmp = scan(/\G(?-mix:[0-9]+)/) if _tmp text = get_text(_text_start) end @@ -14781,7 +14819,7 @@ class RDoc::Markdown break end _text_start = self.pos - _tmp = scan(/\A(?-mix:[A-Za-z0-9]+)/) + _tmp = scan(/\G(?-mix:[A-Za-z0-9]+)/) if _tmp text = get_text(_text_start) end @@ -14813,14 +14851,14 @@ class RDoc::Markdown # NonindentSpace = / {0,3}/ def _NonindentSpace - _tmp = scan(/\A(?-mix: {0,3})/) + _tmp = scan(/\G(?-mix: {0,3})/) set_failed_rule :_NonindentSpace unless _tmp return _tmp end # Indent = /\t| / def _Indent - _tmp = scan(/\A(?-mix:\t| )/) + _tmp = scan(/\G(?-mix:\t| )/) set_failed_rule :_Indent unless _tmp return _tmp end @@ -14919,7 +14957,7 @@ class RDoc::Markdown return _tmp end - # RawLine = (< (!"\r" !"\n" .)* @Newline > | < .+ > @Eof) { text } + # RawLine = (< /[^\r\n]*/ @Newline > | < .+ > @Eof) { text } def _RawLine _save = self.pos @@ -14931,36 +14969,7 @@ class RDoc::Markdown _save2 = self.pos while true # sequence - while true - - _save4 = self.pos - while true # sequence - _save5 = self.pos - _tmp = match_string("\r") - _tmp = _tmp ? nil : true - self.pos = _save5 - unless _tmp - self.pos = _save4 - break - end - _save6 = self.pos - _tmp = match_string("\n") - _tmp = _tmp ? nil : true - self.pos = _save6 - unless _tmp - self.pos = _save4 - break - end - _tmp = get_byte - unless _tmp - self.pos = _save4 - end - break - end # end sequence - - break unless _tmp - end - _tmp = true + _tmp = scan(/\G(?-mix:[^\r\n]*)/) unless _tmp self.pos = _save2 break @@ -14978,10 +14987,10 @@ class RDoc::Markdown break if _tmp self.pos = _save1 - _save7 = self.pos + _save3 = self.pos while true # sequence _text_start = self.pos - _save8 = self.pos + _save4 = self.pos _tmp = get_byte if _tmp while true @@ -14990,18 +14999,18 @@ class RDoc::Markdown end _tmp = true else - self.pos = _save8 + self.pos = _save4 end if _tmp text = get_text(_text_start) end unless _tmp - self.pos = _save7 + self.pos = _save3 break end _tmp = _Eof() unless _tmp - self.pos = _save7 + self.pos = _save3 end break end # end sequence @@ -15547,7 +15556,7 @@ class RDoc::Markdown return _tmp end - # RawNoteBlock = @StartList:a (!@BlankLine OptionallyIndentedLine:l { a << l })+ < @BlankLine* > { a << text } { a } + # RawNoteBlock = @StartList:a (!@BlankLine !RawNoteReference OptionallyIndentedLine:l { a << l })+ < @BlankLine* > { a << text } { a } def _RawNoteBlock _save = self.pos @@ -15570,6 +15579,14 @@ class RDoc::Markdown self.pos = _save2 break end + _save4 = self.pos + _tmp = apply(:_RawNoteReference) + _tmp = _tmp ? nil : true + self.pos = _save4 + unless _tmp + self.pos = _save2 + break + end _tmp = apply(:_OptionallyIndentedLine) l = @result unless _tmp @@ -15587,26 +15604,34 @@ class RDoc::Markdown if _tmp while true - _save4 = self.pos + _save5 = self.pos while true # sequence - _save5 = self.pos + _save6 = self.pos _tmp = _BlankLine() _tmp = _tmp ? nil : true - self.pos = _save5 + self.pos = _save6 unless _tmp - self.pos = _save4 + self.pos = _save5 + break + end + _save7 = self.pos + _tmp = apply(:_RawNoteReference) + _tmp = _tmp ? nil : true + self.pos = _save7 + unless _tmp + self.pos = _save5 break end _tmp = apply(:_OptionallyIndentedLine) l = @result unless _tmp - self.pos = _save4 + self.pos = _save5 break end @result = begin; a << l ; end _tmp = true unless _tmp - self.pos = _save4 + self.pos = _save5 end break end # end sequence @@ -15762,7 +15787,7 @@ class RDoc::Markdown self.pos = _save11 break end - _tmp = scan(/\A(?-mix:`+)/) + _tmp = scan(/\G(?-mix:`+)/) unless _tmp self.pos = _save11 end @@ -15843,7 +15868,7 @@ class RDoc::Markdown self.pos = _save19 break end - _tmp = scan(/\A(?-mix:`+)/) + _tmp = scan(/\G(?-mix:`+)/) unless _tmp self.pos = _save19 end @@ -15908,7 +15933,7 @@ class RDoc::Markdown return _tmp end - # Table = &{ github? } TableRow:header TableLine:line TableRow+:body { table = RDoc::Markup::Table.new(header, line, body) } + # Table = &{ github? } TableHead:header TableLine:line TableRow+:body { table = RDoc::Markup::Table.new(header, line, body) } def _Table _save = self.pos @@ -15920,7 +15945,7 @@ class RDoc::Markdown self.pos = _save break end - _tmp = apply(:_TableRow) + _tmp = apply(:_TableHead) header = @result unless _tmp self.pos = _save @@ -15964,18 +15989,18 @@ class RDoc::Markdown return _tmp end - # TableRow = TableItem+:row "|" @Newline { row } - def _TableRow + # TableHead = TableItem2+:items "|"? @Newline { items } + def _TableHead _save = self.pos while true # sequence _save1 = self.pos _ary = [] - _tmp = apply(:_TableItem) + _tmp = apply(:_TableItem2) if _tmp _ary << @result while true - _tmp = apply(:_TableItem) + _tmp = apply(:_TableItem2) _ary << @result if _tmp break unless _tmp end @@ -15984,13 +16009,18 @@ class RDoc::Markdown else self.pos = _save1 end - row = @result + items = @result unless _tmp self.pos = _save break end + _save2 = self.pos _tmp = match_string("|") unless _tmp + _tmp = true + self.pos = _save2 + end + unless _tmp self.pos = _save break end @@ -15999,7 +16029,7 @@ class RDoc::Markdown self.pos = _save break end - @result = begin; row ; end + @result = begin; items ; end _tmp = true unless _tmp self.pos = _save @@ -16007,90 +16037,92 @@ class RDoc::Markdown break end # end sequence - set_failed_rule :_TableRow unless _tmp + set_failed_rule :_TableHead unless _tmp return _tmp end - # TableItem = "|" < (!"|" !@Newline .)+ > { text.strip } - def _TableItem + # TableRow = ((TableItem:item1 TableItem2*:items { [item1, *items] }):row | TableItem2+:row) "|"? @Newline { row } + def _TableRow _save = self.pos while true # sequence - _tmp = match_string("|") - unless _tmp - self.pos = _save - break - end - _text_start = self.pos + _save1 = self.pos + while true # choice - _save2 = self.pos - while true # sequence - _save3 = self.pos - _tmp = match_string("|") - _tmp = _tmp ? nil : true - self.pos = _save3 - unless _tmp - self.pos = _save2 + _save2 = self.pos + while true # sequence + _tmp = apply(:_TableItem) + item1 = @result + unless _tmp + self.pos = _save2 + break + end + _ary = [] + while true + _tmp = apply(:_TableItem2) + _ary << @result if _tmp + break unless _tmp + end + _tmp = true + @result = _ary + items = @result + unless _tmp + self.pos = _save2 + break + end + @result = begin; [item1, *items] ; end + _tmp = true + unless _tmp + self.pos = _save2 + end break - end + end # end sequence + + row = @result + break if _tmp + self.pos = _save1 _save4 = self.pos - _tmp = _Newline() - _tmp = _tmp ? nil : true - self.pos = _save4 - unless _tmp - self.pos = _save2 - break - end - _tmp = get_byte - unless _tmp - self.pos = _save2 + _ary = [] + _tmp = apply(:_TableItem2) + if _tmp + _ary << @result + while true + _tmp = apply(:_TableItem2) + _ary << @result if _tmp + break unless _tmp + end + _tmp = true + @result = _ary + else + self.pos = _save4 end + row = @result + break if _tmp + self.pos = _save1 break - end # end sequence - - if _tmp - while true - - _save5 = self.pos - while true # sequence - _save6 = self.pos - _tmp = match_string("|") - _tmp = _tmp ? nil : true - self.pos = _save6 - unless _tmp - self.pos = _save5 - break - end - _save7 = self.pos - _tmp = _Newline() - _tmp = _tmp ? nil : true - self.pos = _save7 - unless _tmp - self.pos = _save5 - break - end - _tmp = get_byte - unless _tmp - self.pos = _save5 - end - break - end # end sequence + end # end choice - break unless _tmp - end + unless _tmp + self.pos = _save + break + end + _save5 = self.pos + _tmp = match_string("|") + unless _tmp _tmp = true - else - self.pos = _save1 + self.pos = _save5 end - if _tmp - text = get_text(_text_start) + unless _tmp + self.pos = _save + break end + _tmp = _Newline() unless _tmp self.pos = _save break end - @result = begin; text.strip ; end + @result = begin; row ; end _tmp = true unless _tmp self.pos = _save @@ -16098,46 +16130,46 @@ class RDoc::Markdown break end # end sequence - set_failed_rule :_TableItem unless _tmp + set_failed_rule :_TableRow unless _tmp return _tmp end - # TableLine = TableColumn+:line "|" @Newline { line } - def _TableLine + # TableItem2 = "|" TableItem + def _TableItem2 _save = self.pos while true # sequence - _save1 = self.pos - _ary = [] - _tmp = apply(:_TableColumn) - if _tmp - _ary << @result - while true - _tmp = apply(:_TableColumn) - _ary << @result if _tmp - break unless _tmp - end - _tmp = true - @result = _ary - else - self.pos = _save1 - end - line = @result + _tmp = match_string("|") unless _tmp self.pos = _save break end - _tmp = match_string("|") + _tmp = apply(:_TableItem) unless _tmp self.pos = _save - break end - _tmp = _Newline() + break + end # end sequence + + set_failed_rule :_TableItem2 unless _tmp + return _tmp + end + + # TableItem = < /(?:\\.|[^|\n])+/ > { text.strip.gsub(/\\(.)/, '\1') } + def _TableItem + + _save = self.pos + while true # sequence + _text_start = self.pos + _tmp = scan(/\G(?-mix:(?:\\.|[^|\n])+)/) + if _tmp + text = get_text(_text_start) + end unless _tmp self.pos = _save break end - @result = begin; line ; end + @result = begin; text.strip.gsub(/\\(.)/, '\1') ; end _tmp = true unless _tmp self.pos = _save @@ -16145,80 +16177,136 @@ class RDoc::Markdown break end # end sequence - set_failed_rule :_TableLine unless _tmp + set_failed_rule :_TableItem unless _tmp return _tmp end - # TableColumn = "|" < ("-"+ ":"? | ":" "-"*) > { text.start_with?(":") ? :left : text.end_with?(":") ? :right : nil } - def _TableColumn + # TableLine = ((TableAlign:align1 TableAlign2*:aligns {[align1, *aligns] }):line | TableAlign2+:line) "|"? @Newline { line } + def _TableLine _save = self.pos while true # sequence - _tmp = match_string("|") - unless _tmp - self.pos = _save - break - end - _text_start = self.pos _save1 = self.pos while true # choice _save2 = self.pos while true # sequence - _save3 = self.pos - _tmp = match_string("-") - if _tmp - while true - _tmp = match_string("-") - break unless _tmp - end - _tmp = true - else - self.pos = _save3 - end + _tmp = apply(:_TableAlign) + align1 = @result unless _tmp self.pos = _save2 break end - _save4 = self.pos - _tmp = match_string(":") + _ary = [] + while true + _tmp = apply(:_TableAlign2) + _ary << @result if _tmp + break unless _tmp + end + _tmp = true + @result = _ary + aligns = @result unless _tmp - _tmp = true - self.pos = _save4 + self.pos = _save2 + break end + @result = begin; [align1, *aligns] ; end + _tmp = true unless _tmp self.pos = _save2 end break end # end sequence + line = @result break if _tmp self.pos = _save1 - - _save5 = self.pos - while true # sequence - _tmp = match_string(":") - unless _tmp - self.pos = _save5 - break - end + _save4 = self.pos + _ary = [] + _tmp = apply(:_TableAlign2) + if _tmp + _ary << @result while true - _tmp = match_string("-") + _tmp = apply(:_TableAlign2) + _ary << @result if _tmp break unless _tmp end _tmp = true - unless _tmp - self.pos = _save5 - end - break - end # end sequence - + @result = _ary + else + self.pos = _save4 + end + line = @result break if _tmp self.pos = _save1 break end # end choice + unless _tmp + self.pos = _save + break + end + _save5 = self.pos + _tmp = match_string("|") + unless _tmp + _tmp = true + self.pos = _save5 + end + unless _tmp + self.pos = _save + break + end + _tmp = _Newline() + unless _tmp + self.pos = _save + break + end + @result = begin; line ; end + _tmp = true + unless _tmp + self.pos = _save + end + break + end # end sequence + + set_failed_rule :_TableLine unless _tmp + return _tmp + end + + # TableAlign2 = "|" @Sp TableAlign + def _TableAlign2 + + _save = self.pos + while true # sequence + _tmp = match_string("|") + unless _tmp + self.pos = _save + break + end + _tmp = _Sp() + unless _tmp + self.pos = _save + break + end + _tmp = apply(:_TableAlign) + unless _tmp + self.pos = _save + end + break + end # end sequence + + set_failed_rule :_TableAlign2 unless _tmp + return _tmp + end + + # TableAlign = < /:?-+:?/ > @Sp { text.start_with?(":") ? (text.end_with?(":") ? :center : :left) : (text.end_with?(":") ? :right : nil) } + def _TableAlign + + _save = self.pos + while true # sequence + _text_start = self.pos + _tmp = scan(/\G(?-mix::?-+:?)/) if _tmp text = get_text(_text_start) end @@ -16226,8 +16314,15 @@ class RDoc::Markdown self.pos = _save break end - @result = begin; text.start_with?(":") ? :left : - text.end_with?(":") ? :right : nil + _tmp = _Sp() + unless _tmp + self.pos = _save + break + end + @result = begin; + text.start_with?(":") ? + (text.end_with?(":") ? :center : :left) : + (text.end_with?(":") ? :right : nil) ; end _tmp = true unless _tmp @@ -16236,7 +16331,7 @@ class RDoc::Markdown break end # end sequence - set_failed_rule :_TableColumn unless _tmp + set_failed_rule :_TableAlign unless _tmp return _tmp end @@ -16350,12 +16445,12 @@ class RDoc::Markdown return _tmp end - # DefinitionListLabel = StrChunk:label @Sp @Newline { label } + # DefinitionListLabel = Inline:label @Sp @Newline { label } def _DefinitionListLabel _save = self.pos while true # sequence - _tmp = apply(:_StrChunk) + _tmp = apply(:_Inline) label = @result unless _tmp self.pos = _save @@ -16662,7 +16757,7 @@ class RDoc::Markdown Rules[:_OptionallyIndentedLine] = rule_info("OptionallyIndentedLine", "Indent? Line") Rules[:_StartList] = rule_info("StartList", "&. { [] }") Rules[:_Line] = rule_info("Line", "@RawLine:a { a }") - Rules[:_RawLine] = rule_info("RawLine", "(< (!\"\\r\" !\"\\n\" .)* @Newline > | < .+ > @Eof) { text }") + Rules[:_RawLine] = rule_info("RawLine", "(< /[^\\r\\n]*/ @Newline > | < .+ > @Eof) { text }") Rules[:_SkipBlock] = rule_info("SkipBlock", "(HtmlBlock | (!\"\#\" !SetextBottom1 !SetextBottom2 !@BlankLine @RawLine)+ @BlankLine* | @BlankLine+ | @RawLine)") Rules[:_ExtendedSpecialChar] = rule_info("ExtendedSpecialChar", "&{ notes? } \"^\"") Rules[:_NoteReference] = rule_info("NoteReference", "&{ notes? } RawNoteReference:ref { note_for ref }") @@ -16670,16 +16765,19 @@ class RDoc::Markdown Rules[:_Note] = rule_info("Note", "&{ notes? } @NonindentSpace RawNoteReference:ref \":\" @Sp @StartList:a RawNoteBlock:i { a.concat i } (&Indent RawNoteBlock:i { a.concat i })* { @footnotes[ref] = paragraph a nil }") Rules[:_InlineNote] = rule_info("InlineNote", "&{ notes? } \"^[\" @StartList:a (!\"]\" Inline:l { a << l })+ \"]\" { ref = [:inline, @note_order.length] @footnotes[ref] = paragraph a note_for ref }") Rules[:_Notes] = rule_info("Notes", "(Note | SkipBlock)*") - Rules[:_RawNoteBlock] = rule_info("RawNoteBlock", "@StartList:a (!@BlankLine OptionallyIndentedLine:l { a << l })+ < @BlankLine* > { a << text } { a }") + Rules[:_RawNoteBlock] = rule_info("RawNoteBlock", "@StartList:a (!@BlankLine !RawNoteReference OptionallyIndentedLine:l { a << l })+ < @BlankLine* > { a << text } { a }") Rules[:_CodeFence] = rule_info("CodeFence", "&{ github? } Ticks3 (@Sp StrChunk:format)? Spnl < ((!\"`\" Nonspacechar)+ | !Ticks3 /`+/ | Spacechar | @Newline)+ > Ticks3 @Sp @Newline* { verbatim = RDoc::Markup::Verbatim.new text verbatim.format = format.intern if format.instance_of?(String) verbatim }") - Rules[:_Table] = rule_info("Table", "&{ github? } TableRow:header TableLine:line TableRow+:body { table = RDoc::Markup::Table.new(header, line, body) }") - Rules[:_TableRow] = rule_info("TableRow", "TableItem+:row \"|\" @Newline { row }") - Rules[:_TableItem] = rule_info("TableItem", "\"|\" < (!\"|\" !@Newline .)+ > { text.strip }") - Rules[:_TableLine] = rule_info("TableLine", "TableColumn+:line \"|\" @Newline { line }") - Rules[:_TableColumn] = rule_info("TableColumn", "\"|\" < (\"-\"+ \":\"? | \":\" \"-\"*) > { text.start_with?(\":\") ? :left : text.end_with?(\":\") ? :right : nil }") + Rules[:_Table] = rule_info("Table", "&{ github? } TableHead:header TableLine:line TableRow+:body { table = RDoc::Markup::Table.new(header, line, body) }") + Rules[:_TableHead] = rule_info("TableHead", "TableItem2+:items \"|\"? @Newline { items }") + Rules[:_TableRow] = rule_info("TableRow", "((TableItem:item1 TableItem2*:items { [item1, *items] }):row | TableItem2+:row) \"|\"? @Newline { row }") + Rules[:_TableItem2] = rule_info("TableItem2", "\"|\" TableItem") + Rules[:_TableItem] = rule_info("TableItem", "< /(?:\\\\.|[^|\\n])+/ > { text.strip.gsub(/\\\\(.)/, '\\1') }") + Rules[:_TableLine] = rule_info("TableLine", "((TableAlign:align1 TableAlign2*:aligns {[align1, *aligns] }):line | TableAlign2+:line) \"|\"? @Newline { line }") + Rules[:_TableAlign2] = rule_info("TableAlign2", "\"|\" @Sp TableAlign") + Rules[:_TableAlign] = rule_info("TableAlign", "< /:?-+:?/ > @Sp { text.start_with?(\":\") ? (text.end_with?(\":\") ? :center : :left) : (text.end_with?(\":\") ? :right : nil) }") Rules[:_DefinitionList] = rule_info("DefinitionList", "&{ definition_lists? } DefinitionListItem+:list { RDoc::Markup::List.new :NOTE, *list.flatten }") Rules[:_DefinitionListItem] = rule_info("DefinitionListItem", "DefinitionListLabel+:label DefinitionListDefinition+:defns { list_items = [] list_items << RDoc::Markup::ListItem.new(label, defns.shift) list_items.concat defns.map { |defn| RDoc::Markup::ListItem.new nil, defn } unless list_items.empty? list_items }") - Rules[:_DefinitionListLabel] = rule_info("DefinitionListLabel", "StrChunk:label @Sp @Newline { label }") + Rules[:_DefinitionListLabel] = rule_info("DefinitionListLabel", "Inline:label @Sp @Newline { label }") Rules[:_DefinitionListDefinition] = rule_info("DefinitionListDefinition", "@NonindentSpace \":\" @Space Inlines:a @BlankLine+ { paragraph a }") # :startdoc: end |