From 7c03c82444220a4d1425cf801fa6a5d3d253b835 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Thu, 6 Oct 2022 17:26:21 +0900 Subject: [PATCH] [ruby/rdoc] Allow escaped pipes in cells https://github.com/ruby/rdoc/commit/333952a62d --- lib/rdoc/markdown.rb | 86 +++++++-------------------------- test/rdoc/test_rdoc_markdown.rb | 4 +- 2 files changed, 21 insertions(+), 69 deletions(-) diff --git a/lib/rdoc/markdown.rb b/lib/rdoc/markdown.rb index aa7b1b800c2c7b..e76d1d98888249 100644 --- a/lib/rdoc/markdown.rb +++ b/lib/rdoc/markdown.rb @@ -16132,73 +16132,13 @@ def _TableItem2 return _tmp end - # TableItem = < (!"|" !@Newline .)+ > { text.strip } + # TableItem = < /(?:\\.|[^|\n])+/ > { text.strip.gsub(/\\(.)/, '\1') } def _TableItem _save = self.pos while true # sequence _text_start = self.pos - _save1 = self.pos - - _save2 = self.pos - while true # sequence - _save3 = self.pos - _tmp = match_string("|") - _tmp = _tmp ? nil : true - self.pos = _save3 - unless _tmp - self.pos = _save2 - break - end - _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 - end - 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 - - break unless _tmp - end - _tmp = true - else - self.pos = _save1 - end + _tmp = scan(/\G(?-mix:(?:\\.|[^|\n])+)/) if _tmp text = get_text(_text_start) end @@ -16206,7 +16146,7 @@ def _TableItem self.pos = _save break end - @result = begin; text.strip ; end + @result = begin; text.strip.gsub(/\\(.)/, '\1') ; end _tmp = true unless _tmp self.pos = _save @@ -16311,7 +16251,7 @@ def _TableLine return _tmp end - # TableAlign2 = "|" TableAlign + # TableAlign2 = "|" @Sp TableAlign def _TableAlign2 _save = self.pos @@ -16321,6 +16261,11 @@ def _TableAlign2 self.pos = _save break end + _tmp = _Sp() + unless _tmp + self.pos = _save + break + end _tmp = apply(:_TableAlign) unless _tmp self.pos = _save @@ -16332,7 +16277,7 @@ def _TableAlign2 return _tmp end - # TableAlign = < /:?-+:?/ > { text.start_with?(":") ? :left : text.end_with?(":") ? :right : nil } + # TableAlign = < /:?-+:?/ > @Sp { text.start_with?(":") ? :left : text.end_with?(":") ? :right : nil } def _TableAlign _save = self.pos @@ -16346,6 +16291,11 @@ def _TableAlign self.pos = _save break end + _tmp = _Sp() + unless _tmp + self.pos = _save + break + end @result = begin; text.start_with?(":") ? :left : text.end_with?(":") ? :right : nil ; end @@ -16796,10 +16746,10 @@ def _DefinitionListDefinition 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", "< (!\"|\" !@Newline .)+ > { text.strip }") + 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", "\"|\" TableAlign") - Rules[:_TableAlign] = rule_info("TableAlign", "< /:?-+:?/ > { text.start_with?(\":\") ? :left : text.end_with?(\":\") ? :right : nil }") + Rules[:_TableAlign2] = rule_info("TableAlign2", "\"|\" @Sp TableAlign") + Rules[:_TableAlign] = rule_info("TableAlign", "< /:?-+:?/ > @Sp { text.start_with?(\":\") ? :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 }") diff --git a/test/rdoc/test_rdoc_markdown.rb b/test/rdoc/test_rdoc_markdown.rb index 1b13e2e7e6e546..a02ff7c8ccde13 100644 --- a/test/rdoc/test_rdoc_markdown.rb +++ b/test/rdoc/test_rdoc_markdown.rb @@ -1063,11 +1063,12 @@ def test_gfm_table end def test_gfm_table_2 - doc = parse <<~MD + doc = parse <<~'MD' | Cmd | Returns | Meaning ------|---------|-------- |"b" | boolean | True if file1 is a block device "c" | boolean | True if file1 is a character device + |"\|" | boolean | escaped bar \| test MD head = %w[Cmd Returns Meaning] @@ -1075,6 +1076,7 @@ def test_gfm_table_2 body = [ ['"b"', 'boolean', 'True if file1 is a block device'], ['"c"', 'boolean', 'True if file1 is a character device'], + ['"|"', 'boolean', 'escaped bar | test'], ] expected = doc(@RM::Table.new(head, align, body))