Skip to content

Commit cf54e90

Browse files
committed
Fix Markdown blockquote lazy continuation parsing
- Headings (`# foo`), bullet lists, ordered lists, and code fences now break out of a blockquote instead of being lazily continued. - Unquoted blank lines end the blockquote; only `>`-prefixed blank lines continue it. - Heading lookahead uses `!(AtxStart @Spacechar)` so `#no-space` text (not a valid heading) is correctly kept inside the blockquote. - Code fence lookahead is gated behind `&{ github? }` so it only applies when the GitHub extension is enabled, matching `CodeFence`. Ref: #1627
1 parent caad3b9 commit cf54e90

File tree

3 files changed

+246
-29
lines changed

3 files changed

+246
-29
lines changed

lib/rdoc/markdown.kpeg

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -617,8 +617,8 @@ BlockQuote = BlockQuoteRaw:a
617617

618618
BlockQuoteRaw = @StartList:a
619619
(( ">" " "? Line:l { a << l } )
620-
( !">" !@BlankLine Line:c { a << c } )*
621-
( @BlankLine:n { a << n } )*
620+
( !">" !@BlankLine !(AtxStart @Spacechar) !Bullet !Enumerator !( &{ github? } Ticks3 ) Line:c { a << c } )*
621+
( ">" @BlankLine:n { a << n } )*
622622
)+
623623
{ inner_parse a.join }
624624

lib/rdoc/markdown.rb

Lines changed: 160 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1656,7 +1656,7 @@ def _BlockQuote
16561656
return _tmp
16571657
end
16581658

1659-
# BlockQuoteRaw = @StartList:a (">" " "? Line:l { a << l } (!">" !@BlankLine Line:c { a << c })* (@BlankLine:n { a << n })*)+ { inner_parse a.join }
1659+
# BlockQuoteRaw = @StartList:a (">" " "? Line:l { a << l } (!">" !@BlankLine !(AtxStart @Spacechar) !Bullet !Enumerator !(&{ github? } Ticks3) Line:c { a << c })* (">" @BlankLine:n { a << n })*)+ { inner_parse a.join }
16601660
def _BlockQuoteRaw
16611661

16621662
_save = self.pos
@@ -1718,6 +1718,68 @@ def _BlockQuoteRaw
17181718
self.pos = _save5
17191719
break
17201720
end
1721+
_save8 = self.pos
1722+
1723+
_save9 = self.pos
1724+
while true # sequence
1725+
_tmp = apply(:_AtxStart)
1726+
unless _tmp
1727+
self.pos = _save9
1728+
break
1729+
end
1730+
_tmp = _Spacechar()
1731+
unless _tmp
1732+
self.pos = _save9
1733+
end
1734+
break
1735+
end # end sequence
1736+
1737+
_tmp = _tmp ? nil : true
1738+
self.pos = _save8
1739+
unless _tmp
1740+
self.pos = _save5
1741+
break
1742+
end
1743+
_save10 = self.pos
1744+
_tmp = apply(:_Bullet)
1745+
_tmp = _tmp ? nil : true
1746+
self.pos = _save10
1747+
unless _tmp
1748+
self.pos = _save5
1749+
break
1750+
end
1751+
_save11 = self.pos
1752+
_tmp = apply(:_Enumerator)
1753+
_tmp = _tmp ? nil : true
1754+
self.pos = _save11
1755+
unless _tmp
1756+
self.pos = _save5
1757+
break
1758+
end
1759+
_save12 = self.pos
1760+
1761+
_save13 = self.pos
1762+
while true # sequence
1763+
_save14 = self.pos
1764+
_tmp = begin; github? ; end
1765+
self.pos = _save14
1766+
unless _tmp
1767+
self.pos = _save13
1768+
break
1769+
end
1770+
_tmp = apply(:_Ticks3)
1771+
unless _tmp
1772+
self.pos = _save13
1773+
end
1774+
break
1775+
end # end sequence
1776+
1777+
_tmp = _tmp ? nil : true
1778+
self.pos = _save12
1779+
unless _tmp
1780+
self.pos = _save5
1781+
break
1782+
end
17211783
_tmp = apply(:_Line)
17221784
c = @result
17231785
unless _tmp
@@ -1741,18 +1803,23 @@ def _BlockQuoteRaw
17411803
end
17421804
while true
17431805

1744-
_save9 = self.pos
1806+
_save16 = self.pos
17451807
while true # sequence
1808+
_tmp = match_string(">")
1809+
unless _tmp
1810+
self.pos = _save16
1811+
break
1812+
end
17461813
_tmp = _BlankLine()
17471814
n = @result
17481815
unless _tmp
1749-
self.pos = _save9
1816+
self.pos = _save16
17501817
break
17511818
end
17521819
@result = begin; a << n ; end
17531820
_tmp = true
17541821
unless _tmp
1755-
self.pos = _save9
1822+
self.pos = _save16
17561823
end
17571824
break
17581825
end # end sequence
@@ -1769,65 +1836,127 @@ def _BlockQuoteRaw
17691836
if _tmp
17701837
while true
17711838

1772-
_save10 = self.pos
1839+
_save17 = self.pos
17731840
while true # sequence
17741841
_tmp = match_string(">")
17751842
unless _tmp
1776-
self.pos = _save10
1843+
self.pos = _save17
17771844
break
17781845
end
1779-
_save11 = self.pos
1846+
_save18 = self.pos
17801847
_tmp = match_string(" ")
17811848
unless _tmp
17821849
_tmp = true
1783-
self.pos = _save11
1850+
self.pos = _save18
17841851
end
17851852
unless _tmp
1786-
self.pos = _save10
1853+
self.pos = _save17
17871854
break
17881855
end
17891856
_tmp = apply(:_Line)
17901857
l = @result
17911858
unless _tmp
1792-
self.pos = _save10
1859+
self.pos = _save17
17931860
break
17941861
end
17951862
@result = begin; a << l ; end
17961863
_tmp = true
17971864
unless _tmp
1798-
self.pos = _save10
1865+
self.pos = _save17
17991866
break
18001867
end
18011868
while true
18021869

1803-
_save13 = self.pos
1870+
_save20 = self.pos
18041871
while true # sequence
1805-
_save14 = self.pos
1872+
_save21 = self.pos
18061873
_tmp = match_string(">")
18071874
_tmp = _tmp ? nil : true
1808-
self.pos = _save14
1875+
self.pos = _save21
18091876
unless _tmp
1810-
self.pos = _save13
1877+
self.pos = _save20
18111878
break
18121879
end
1813-
_save15 = self.pos
1880+
_save22 = self.pos
18141881
_tmp = _BlankLine()
18151882
_tmp = _tmp ? nil : true
1816-
self.pos = _save15
1883+
self.pos = _save22
1884+
unless _tmp
1885+
self.pos = _save20
1886+
break
1887+
end
1888+
_save23 = self.pos
1889+
1890+
_save24 = self.pos
1891+
while true # sequence
1892+
_tmp = apply(:_AtxStart)
1893+
unless _tmp
1894+
self.pos = _save24
1895+
break
1896+
end
1897+
_tmp = _Spacechar()
1898+
unless _tmp
1899+
self.pos = _save24
1900+
end
1901+
break
1902+
end # end sequence
1903+
1904+
_tmp = _tmp ? nil : true
1905+
self.pos = _save23
1906+
unless _tmp
1907+
self.pos = _save20
1908+
break
1909+
end
1910+
_save25 = self.pos
1911+
_tmp = apply(:_Bullet)
1912+
_tmp = _tmp ? nil : true
1913+
self.pos = _save25
18171914
unless _tmp
1818-
self.pos = _save13
1915+
self.pos = _save20
1916+
break
1917+
end
1918+
_save26 = self.pos
1919+
_tmp = apply(:_Enumerator)
1920+
_tmp = _tmp ? nil : true
1921+
self.pos = _save26
1922+
unless _tmp
1923+
self.pos = _save20
1924+
break
1925+
end
1926+
_save27 = self.pos
1927+
1928+
_save28 = self.pos
1929+
while true # sequence
1930+
_save29 = self.pos
1931+
_tmp = begin; github? ; end
1932+
self.pos = _save29
1933+
unless _tmp
1934+
self.pos = _save28
1935+
break
1936+
end
1937+
_tmp = apply(:_Ticks3)
1938+
unless _tmp
1939+
self.pos = _save28
1940+
end
1941+
break
1942+
end # end sequence
1943+
1944+
_tmp = _tmp ? nil : true
1945+
self.pos = _save27
1946+
unless _tmp
1947+
self.pos = _save20
18191948
break
18201949
end
18211950
_tmp = apply(:_Line)
18221951
c = @result
18231952
unless _tmp
1824-
self.pos = _save13
1953+
self.pos = _save20
18251954
break
18261955
end
18271956
@result = begin; a << c ; end
18281957
_tmp = true
18291958
unless _tmp
1830-
self.pos = _save13
1959+
self.pos = _save20
18311960
end
18321961
break
18331962
end # end sequence
@@ -1836,23 +1965,28 @@ def _BlockQuoteRaw
18361965
end
18371966
_tmp = true
18381967
unless _tmp
1839-
self.pos = _save10
1968+
self.pos = _save17
18401969
break
18411970
end
18421971
while true
18431972

1844-
_save17 = self.pos
1973+
_save31 = self.pos
18451974
while true # sequence
1975+
_tmp = match_string(">")
1976+
unless _tmp
1977+
self.pos = _save31
1978+
break
1979+
end
18461980
_tmp = _BlankLine()
18471981
n = @result
18481982
unless _tmp
1849-
self.pos = _save17
1983+
self.pos = _save31
18501984
break
18511985
end
18521986
@result = begin; a << n ; end
18531987
_tmp = true
18541988
unless _tmp
1855-
self.pos = _save17
1989+
self.pos = _save31
18561990
end
18571991
break
18581992
end # end sequence
@@ -1861,7 +1995,7 @@ def _BlockQuoteRaw
18611995
end
18621996
_tmp = true
18631997
unless _tmp
1864-
self.pos = _save10
1998+
self.pos = _save17
18651999
end
18662000
break
18672001
end # end sequence
@@ -16467,7 +16601,7 @@ def _DefinitionListDefinition
1646716601
Rules[:_SetextHeading2] = rule_info("SetextHeading2", "&(@RawLine SetextBottom2) @StartList:a (!@Endline Inline:b { a << b })+ @Sp @Newline SetextBottom2 { RDoc::Markup::Heading.new(2, a.join) }")
1646816602
Rules[:_Heading] = rule_info("Heading", "(SetextHeading | AtxHeading)")
1646916603
Rules[:_BlockQuote] = rule_info("BlockQuote", "BlockQuoteRaw:a { RDoc::Markup::BlockQuote.new(*a) }")
16470-
Rules[:_BlockQuoteRaw] = rule_info("BlockQuoteRaw", "@StartList:a (\">\" \" \"? Line:l { a << l } (!\">\" !@BlankLine Line:c { a << c })* (@BlankLine:n { a << n })*)+ { inner_parse a.join }")
16604+
Rules[:_BlockQuoteRaw] = rule_info("BlockQuoteRaw", "@StartList:a (\">\" \" \"? Line:l { a << l } (!\">\" !@BlankLine !(AtxStart @Spacechar) !Bullet !Enumerator !(&{ github? } Ticks3) Line:c { a << c })* (\">\" @BlankLine:n { a << n })*)+ { inner_parse a.join }")
1647116605
Rules[:_NonblankIndentedLine] = rule_info("NonblankIndentedLine", "!@BlankLine IndentedLine")
1647216606
Rules[:_VerbatimChunk] = rule_info("VerbatimChunk", "@BlankLine*:a NonblankIndentedLine+:b { a.concat b }")
1647316607
Rules[:_Verbatim] = rule_info("Verbatim", "VerbatimChunk+:a { RDoc::Markup::Verbatim.new(*a.flatten) }")

0 commit comments

Comments
 (0)