mirror of
https://github.com/nim-lang/Nim.git
synced 2026-04-19 05:50:30 +00:00
rst: allow comment to continue on second line (#18338)
This commit is contained in:
@@ -1615,24 +1615,16 @@ proc getDirective(p: var RstParser): string =
|
||||
"too many colons for a directive (should be ::)",
|
||||
p.tok[afterIdx].line, p.tok[afterIdx].col)
|
||||
|
||||
proc parseComment(p: var RstParser): PRstNode =
|
||||
case currentTok(p).kind
|
||||
of tkIndent, tkEof:
|
||||
if currentTok(p).kind != tkEof and nextTok(p).kind == tkIndent:
|
||||
inc p.idx # empty comment
|
||||
else:
|
||||
var indent = currentTok(p).ival
|
||||
while true:
|
||||
case currentTok(p).kind
|
||||
of tkEof:
|
||||
break
|
||||
of tkIndent:
|
||||
if currentTok(p).ival < indent: break
|
||||
else:
|
||||
discard
|
||||
inc p.idx
|
||||
proc parseComment(p: var RstParser, col: int): PRstNode =
|
||||
if currentTok(p).kind != tkEof and nextTok(p).kind == tkIndent:
|
||||
inc p.idx # empty comment
|
||||
else:
|
||||
while currentTok(p).kind notin {tkIndent, tkEof}: inc p.idx
|
||||
while currentTok(p).kind != tkEof:
|
||||
if currentTok(p).kind == tkIndent and currentTok(p).ival > col or
|
||||
currentTok(p).kind != tkIndent and currentTok(p).col > col:
|
||||
inc p.idx
|
||||
else:
|
||||
break
|
||||
result = nil
|
||||
|
||||
proc parseLine(p: var RstParser, father: PRstNode) =
|
||||
@@ -2841,7 +2833,7 @@ proc parseDotDot(p: var RstParser): PRstNode =
|
||||
(n = parseFootnote(p); n != nil):
|
||||
result = n
|
||||
else:
|
||||
result = parseComment(p)
|
||||
result = parseComment(p, col)
|
||||
|
||||
proc rstParsePass1*(fragment, filename: string,
|
||||
line, column: int,
|
||||
|
||||
@@ -83,6 +83,72 @@ suite "RST parsing":
|
||||
rnLeaf 'set'
|
||||
""")
|
||||
|
||||
test "RST comment":
|
||||
check(dedent"""
|
||||
.. comment1
|
||||
comment2
|
||||
someParagraph""".toAst ==
|
||||
dedent"""
|
||||
rnLeaf 'someParagraph'
|
||||
""")
|
||||
|
||||
check(dedent"""
|
||||
..
|
||||
comment1
|
||||
comment2
|
||||
someParagraph""".toAst ==
|
||||
dedent"""
|
||||
rnLeaf 'someParagraph'
|
||||
""")
|
||||
|
||||
test "check that additional line right after .. ends comment":
|
||||
check(dedent"""
|
||||
..
|
||||
|
||||
notAcomment1
|
||||
notAcomment2
|
||||
someParagraph""".toAst ==
|
||||
dedent"""
|
||||
rnInner
|
||||
rnBlockQuote
|
||||
rnInner
|
||||
rnLeaf 'notAcomment1'
|
||||
rnLeaf ' '
|
||||
rnLeaf 'notAcomment2'
|
||||
rnParagraph
|
||||
rnLeaf 'someParagraph'
|
||||
""")
|
||||
|
||||
test "but blank lines after 2nd non-empty line don't end the comment":
|
||||
check(dedent"""
|
||||
..
|
||||
comment1
|
||||
|
||||
|
||||
comment2
|
||||
someParagraph""".toAst ==
|
||||
dedent"""
|
||||
rnLeaf 'someParagraph'
|
||||
""")
|
||||
|
||||
test "using .. as separator b/w directives and block quotes":
|
||||
check(dedent"""
|
||||
.. note:: someNote
|
||||
|
||||
..
|
||||
|
||||
someBlockQuote""".toAst ==
|
||||
dedent"""
|
||||
rnInner
|
||||
rnAdmonition adType=note
|
||||
[nil]
|
||||
[nil]
|
||||
rnLeaf 'someNote'
|
||||
rnBlockQuote
|
||||
rnInner
|
||||
rnLeaf 'someBlockQuote'
|
||||
""")
|
||||
|
||||
suite "RST indentation":
|
||||
test "nested bullet lists":
|
||||
let input = dedent """
|
||||
|
||||
Reference in New Issue
Block a user