Skip to content

Commit b1f58b5

Browse files
committed
Fix indentation not being preserved on first line in code fences
1 parent 393c0e8 commit b1f58b5

File tree

3 files changed

+75
-50
lines changed

3 files changed

+75
-50
lines changed

lib/rdoc/markdown.kpeg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1249,7 +1249,7 @@ RawNoteBlock = @StartList:a
12491249
# Markdown extensions added by RDoc follow
12501250

12511251
CodeFence = &{ github? }
1252-
Ticks3 (@Sp StrChunk:format)? Spnl < (
1252+
Ticks3 (@Sp StrChunk:format)? @Sp @Newline? < (
12531253
( !"`" Nonspacechar )+ |
12541254
!Ticks3 /`+/ |
12551255
Spacechar |

lib/rdoc/markdown.rb

Lines changed: 59 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -15570,7 +15570,7 @@ def _RawNoteBlock
1557015570
return _tmp
1557115571
end
1557215572

15573-
# 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 }
15573+
# CodeFence = &{ github? } Ticks3 (@Sp StrChunk:format)? @Sp @Newline? < ((!"`" Nonspacechar)+ | !Ticks3 /`+/ | Spacechar | @Newline)+ > Ticks3 @Sp @Newline* { verbatim = RDoc::Markup::Verbatim.new text verbatim.format = format.intern if format.instance_of?(String) verbatim }
1557415574
def _CodeFence
1557515575

1557615576
_save = self.pos
@@ -15612,51 +15612,61 @@ def _CodeFence
1561215612
self.pos = _save
1561315613
break
1561415614
end
15615-
_tmp = apply(:_Spnl)
15615+
_tmp = _Sp()
1561615616
unless _tmp
1561715617
self.pos = _save
1561815618
break
1561915619
end
15620-
_text_start = self.pos
1562115620
_save4 = self.pos
15622-
15621+
_tmp = _Newline()
15622+
unless _tmp
15623+
_tmp = true
15624+
self.pos = _save4
15625+
end
15626+
unless _tmp
15627+
self.pos = _save
15628+
break
15629+
end
15630+
_text_start = self.pos
1562315631
_save5 = self.pos
15624-
while true # choice
15625-
_save6 = self.pos
1562615632

15633+
_save6 = self.pos
15634+
while true # choice
1562715635
_save7 = self.pos
15636+
15637+
_save8 = self.pos
1562815638
while true # sequence
15629-
_save8 = self.pos
15639+
_save9 = self.pos
1563015640
_tmp = match_string("`")
1563115641
_tmp = _tmp ? nil : true
15632-
self.pos = _save8
15642+
self.pos = _save9
1563315643
unless _tmp
15634-
self.pos = _save7
15644+
self.pos = _save8
1563515645
break
1563615646
end
1563715647
_tmp = apply(:_Nonspacechar)
1563815648
unless _tmp
15639-
self.pos = _save7
15649+
self.pos = _save8
1564015650
end
1564115651
break
1564215652
end # end sequence
1564315653

1564415654
if _tmp
1564515655
while true
1564615656

15647-
_save9 = self.pos
15657+
_save10 = self.pos
1564815658
while true # sequence
15649-
_save10 = self.pos
15659+
_save11 = self.pos
1565015660
_tmp = match_string("`")
1565115661
_tmp = _tmp ? nil : true
15652-
self.pos = _save10
15662+
self.pos = _save11
1565315663
unless _tmp
15654-
self.pos = _save9
15664+
self.pos = _save10
1565515665
break
1565615666
end
1565715667
_tmp = apply(:_Nonspacechar)
1565815668
unless _tmp
15659-
self.pos = _save9
15669+
self.pos = _save10
1566015670
end
1566115671
break
1566215672
end # end sequence
@@ -15665,79 +15675,79 @@ def _CodeFence
1566515675
end
1566615676
_tmp = true
1566715677
else
15668-
self.pos = _save6
15678+
self.pos = _save7
1566915679
end
1567015680
break if _tmp
15671-
self.pos = _save5
15681+
self.pos = _save6
1567215682

15673-
_save11 = self.pos
15683+
_save12 = self.pos
1567415684
while true # sequence
15675-
_save12 = self.pos
15685+
_save13 = self.pos
1567615686
_tmp = apply(:_Ticks3)
1567715687
_tmp = _tmp ? nil : true
15678-
self.pos = _save12
15688+
self.pos = _save13
1567915689
unless _tmp
15680-
self.pos = _save11
15690+
self.pos = _save12
1568115691
break
1568215692
end
1568315693
_tmp = scan(/\G(?-mix:`+)/)
1568415694
unless _tmp
15685-
self.pos = _save11
15695+
self.pos = _save12
1568615696
end
1568715697
break
1568815698
end # end sequence
1568915699

1569015700
break if _tmp
15691-
self.pos = _save5
15701+
self.pos = _save6
1569215702
_tmp = apply(:_Spacechar)
1569315703
break if _tmp
15694-
self.pos = _save5
15704+
self.pos = _save6
1569515705
_tmp = _Newline()
1569615706
break if _tmp
15697-
self.pos = _save5
15707+
self.pos = _save6
1569815708
break
1569915709
end # end choice
1570015710

1570115711
if _tmp
1570215712
while true
1570315713

15704-
_save13 = self.pos
15714+
_save14 = self.pos
1570515715
while true # choice
15706-
_save14 = self.pos
15707-
1570815716
_save15 = self.pos
15717+
15718+
_save16 = self.pos
1570915719
while true # sequence
15710-
_save16 = self.pos
15720+
_save17 = self.pos
1571115721
_tmp = match_string("`")
1571215722
_tmp = _tmp ? nil : true
15713-
self.pos = _save16
15723+
self.pos = _save17
1571415724
unless _tmp
15715-
self.pos = _save15
15725+
self.pos = _save16
1571615726
break
1571715727
end
1571815728
_tmp = apply(:_Nonspacechar)
1571915729
unless _tmp
15720-
self.pos = _save15
15730+
self.pos = _save16
1572115731
end
1572215732
break
1572315733
end # end sequence
1572415734

1572515735
if _tmp
1572615736
while true
1572715737

15728-
_save17 = self.pos
15738+
_save18 = self.pos
1572915739
while true # sequence
15730-
_save18 = self.pos
15740+
_save19 = self.pos
1573115741
_tmp = match_string("`")
1573215742
_tmp = _tmp ? nil : true
15733-
self.pos = _save18
15743+
self.pos = _save19
1573415744
unless _tmp
15735-
self.pos = _save17
15745+
self.pos = _save18
1573615746
break
1573715747
end
1573815748
_tmp = apply(:_Nonspacechar)
1573915749
unless _tmp
15740-
self.pos = _save17
15750+
self.pos = _save18
1574115751
end
1574215752
break
1574315753
end # end sequence
@@ -15746,44 +15756,44 @@ def _CodeFence
1574615756
end
1574715757
_tmp = true
1574815758
else
15749-
self.pos = _save14
15759+
self.pos = _save15
1575015760
end
1575115761
break if _tmp
15752-
self.pos = _save13
15762+
self.pos = _save14
1575315763

15754-
_save19 = self.pos
15764+
_save20 = self.pos
1575515765
while true # sequence
15756-
_save20 = self.pos
15766+
_save21 = self.pos
1575715767
_tmp = apply(:_Ticks3)
1575815768
_tmp = _tmp ? nil : true
15759-
self.pos = _save20
15769+
self.pos = _save21
1576015770
unless _tmp
15761-
self.pos = _save19
15771+
self.pos = _save20
1576215772
break
1576315773
end
1576415774
_tmp = scan(/\G(?-mix:`+)/)
1576515775
unless _tmp
15766-
self.pos = _save19
15776+
self.pos = _save20
1576715777
end
1576815778
break
1576915779
end # end sequence
1577015780

1577115781
break if _tmp
15772-
self.pos = _save13
15782+
self.pos = _save14
1577315783
_tmp = apply(:_Spacechar)
1577415784
break if _tmp
15775-
self.pos = _save13
15785+
self.pos = _save14
1577615786
_tmp = _Newline()
1577715787
break if _tmp
15778-
self.pos = _save13
15788+
self.pos = _save14
1577915789
break
1578015790
end # end choice
1578115791

1578215792
break unless _tmp
1578315793
end
1578415794
_tmp = true
1578515795
else
15786-
self.pos = _save4
15796+
self.pos = _save5
1578715797
end
1578815798
if _tmp
1578915799
text = get_text(_text_start)
@@ -16677,7 +16687,7 @@ def _DefinitionListDefinition
1667716687
Rules[:_InlineNote] = rule_info("InlineNote", "&{ notes? } \"^[\" @StartList:a (!\"]\" Inline:l { a << l })+ \"]\" { ref = [:inline, @note_order.length] @footnotes[ref] = paragraph a note_for ref }")
1667816688
Rules[:_Notes] = rule_info("Notes", "(Note | SkipBlock)*")
1667916689
Rules[:_RawNoteBlock] = rule_info("RawNoteBlock", "@StartList:a (!@BlankLine !RawNoteReference OptionallyIndentedLine:l { a << l })+ < @BlankLine* > { a << text } { a }")
16680-
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 }")
16690+
Rules[:_CodeFence] = rule_info("CodeFence", "&{ github? } Ticks3 (@Sp StrChunk:format)? @Sp @Newline? < ((!\"`\" Nonspacechar)+ | !Ticks3 /`+/ | Spacechar | @Newline)+ > Ticks3 @Sp @Newline* { verbatim = RDoc::Markup::Verbatim.new text verbatim.format = format.intern if format.instance_of?(String) verbatim }")
1668116691
Rules[:_Table] = rule_info("Table", "&{ github? } TableHead:header TableLine:line TableRow+:body { table = RDoc::Markup::Table.new(header, line, body) parse_table_cells(table) }")
1668216692
Rules[:_TableHead] = rule_info("TableHead", "TableItem2+:items \"|\"? @Newline { items }")
1668316693
Rules[:_TableRow] = rule_info("TableRow", "((TableItem:item1 TableItem2+:items { [item1, *items] }):row | TableItem2+:row) \"|\"? @Newline { row }")

test/rdoc/rdoc_markdown_test.rb

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1242,6 +1242,21 @@ def test_code_fence_with_unintended_array
12421242
assert_equal expected, doc
12431243
end
12441244

1245+
def test_code_fence_preserves_text_indentation
1246+
doc = parse <<~MD
1247+
```ruby
1248+
foo()
1249+
bar()
1250+
```
1251+
MD
1252+
1253+
expected = doc(
1254+
verb(" foo()\n bar()\n").tap { |v| v.format = :ruby }
1255+
)
1256+
1257+
assert_equal expected, doc
1258+
end
1259+
12451260
def test_gfm_table
12461261
doc = parse <<~MD
12471262
| | |compare-ruby|built-ruby|

0 commit comments

Comments
 (0)