Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions lib/rdoc/markdown.kpeg
Original file line number Diff line number Diff line change
Expand Up @@ -1270,13 +1270,13 @@ Table = &{ github? }
TableHead = TableItem2+:items "|"? @Newline
{ items }

TableRow = ( ( TableItem:item1 TableItem2*:items { [item1, *items] } ):row | TableItem2+:row ) "|"? @Newline
TableRow = ( ( TableItem:item1 TableItem2+:items { [item1, *items] } ):row | TableItem2+:row ) "|"? @Newline
{ row }
TableItem2 = "|" TableItem
TableItem = < /(?:\\.|[^|\n])+/ >
{ text.strip.gsub(/\\([|])/, '\1') }

TableLine = ( ( TableAlign:align1 TableAlign2*:aligns {[align1, *aligns] } ):line | TableAlign2+:line ) "|"? @Newline
TableLine = ( ( TableAlign:align1 TableAlign2+:aligns {[align1, *aligns] } ):line | TableAlign2+:line ) "|"? @Newline
{ line }
TableAlign2 = "|" @Sp TableAlign
TableAlign = < /:?-+:?/ > @Sp
Expand Down
46 changes: 30 additions & 16 deletions lib/rdoc/markdown.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15937,7 +15937,7 @@ def _TableHead
return _tmp
end

# TableRow = ((TableItem:item1 TableItem2*:items { [item1, *items] }):row | TableItem2+:row) "|"? @Newline { row }
# TableRow = ((TableItem:item1 TableItem2+:items { [item1, *items] }):row | TableItem2+:row) "|"? @Newline { row }
def _TableRow

_save = self.pos
Expand All @@ -15954,14 +15954,21 @@ def _TableRow
self.pos = _save2
break
end
_save3 = self.pos
_ary = []
while true
_tmp = apply(:_TableItem2)
_ary << @result if _tmp
break unless _tmp
_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 = _save3
end
_tmp = true
@result = _ary
items = @result
unless _tmp
self.pos = _save2
Expand Down Expand Up @@ -16077,7 +16084,7 @@ def _TableItem
return _tmp
end

# TableLine = ((TableAlign:align1 TableAlign2*:aligns {[align1, *aligns] }):line | TableAlign2+:line) "|"? @Newline { line }
# TableLine = ((TableAlign:align1 TableAlign2+:aligns {[align1, *aligns] }):line | TableAlign2+:line) "|"? @Newline { line }
def _TableLine

_save = self.pos
Expand All @@ -16094,14 +16101,21 @@ def _TableLine
self.pos = _save2
break
end
_save3 = self.pos
_ary = []
while true
_tmp = apply(:_TableAlign2)
_ary << @result if _tmp
break unless _tmp
_tmp = apply(:_TableAlign2)
if _tmp
_ary << @result
while true
_tmp = apply(:_TableAlign2)
_ary << @result if _tmp
break unless _tmp
end
_tmp = true
@result = _ary
else
self.pos = _save3
end
_tmp = true
@result = _ary
aligns = @result
unless _tmp
self.pos = _save2
Expand Down Expand Up @@ -16666,10 +16680,10 @@ def _DefinitionListDefinition
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? } TableHead:header TableLine:line TableRow+:body { table = RDoc::Markup::Table.new(header, line, body) parse_table_cells(table) }")
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[:_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[:_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 }")
Expand Down
37 changes: 37 additions & 0 deletions test/rdoc/rdoc_markdown_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -1310,6 +1310,43 @@ def test_gfm_table_with_links_and_code
assert_equal expected, doc
end

def test_gfm_table_does_not_consume_following_line_without_pipe
doc = parse <<~MD
| Command | Shows |
|---------|-------|
| ri File | Document for Ruby class File. |
<br>

Following paragraph.
MD

head = %w[Command Shows]
align = [nil, nil]
body = [
['ri File', 'Document for Ruby class File.'],
]
expected = doc(
@RM::Table.new(head, align, body),
para('<br>'),
para('Following paragraph.')
)

assert_equal expected, doc
end

def test_gfm_table_separator_without_pipe_does_not_form_table
doc = parse <<~MD
| Command | Shows |
---------
| ri File | Document for Ruby class File. |
MD

# The separator line has no pipe, so this should NOT parse as a table.
# "| Command | Shows |" becomes a paragraph, "---" becomes a paragraph,
# and "| ri File | ..." becomes a paragraph.
assert(doc.parts.none? { |part| part.is_a?(@RM::Table) })
end

def test_gfm_table_with_backslashes_in_code_spans
doc = parse <<~MD
Plain text: `$\\\\` and `$\\\\ ` should work.
Expand Down