Skip to content

Commit

Permalink
Don't require blank line before Markdown code
Browse files Browse the repository at this point in the history
Fixes bug reported in nim-lang#20189
affecting nimforum.
  • Loading branch information
a-mr committed Aug 13, 2022
1 parent 1a7b339 commit 78b1f2c
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 9 deletions.
3 changes: 1 addition & 2 deletions compiler/ic/rodfiles.nim
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,7 @@ when defined(nimPreviewSlimSystem):
##
## Now read the bits below to understand what's missing.
##
## Issues with the Example
## ```````````````````````
## ### Issues with the Example
## Missing Sections:
## This is a low level API, so headers and sections need to be stored and
## loaded by the user, see `storeHeader` & `loadHeader` and `storeSection` &
Expand Down
16 changes: 11 additions & 5 deletions lib/packages/docutils/rst.nim
Original file line number Diff line number Diff line change
Expand Up @@ -1833,14 +1833,18 @@ proc parseFootnoteName(p: var RstParser, reference: bool): PRstNode =
inc i
p.idx = i

proc isMarkdownCodeBlock(p: RstParser): bool =
proc isMarkdownCodeBlock(p: RstParser, idx: int): bool =
let tok = p.tok[idx]
template allowedSymbol: bool =
(currentTok(p).symbol[0] == '`' or
roPreferMarkdown in p.s.options and currentTok(p).symbol[0] == '~')
(tok.symbol[0] == '`' or
roPreferMarkdown in p.s.options and tok.symbol[0] == '~')
result = (roSupportMarkdown in p.s.options and
currentTok(p).kind in {tkPunct, tkAdornment} and
tok.kind in {tkPunct, tkAdornment} and
allowedSymbol and
currentTok(p).symbol.len >= 3)
tok.symbol.len >= 3)

proc isMarkdownCodeBlock(p: RstParser): bool =
isMarkdownCodeBlock(p, p.idx)

proc parseInline(p: var RstParser, father: PRstNode) =
var n: PRstNode # to be used in `if` condition
Expand Down Expand Up @@ -2200,6 +2204,8 @@ proc isAdornmentHeadline(p: RstParser, adornmentIdx: int): bool =
## No support for Unicode.
if p.tok[adornmentIdx].symbol in ["::", "..", "|"]:
return false
if isMarkdownCodeBlock(p, adornmentIdx):
return false
var headlineLen = 0
var failure = ""
if p.idx < adornmentIdx: # check for underline
Expand Down
39 changes: 39 additions & 0 deletions tests/stdlib/trst.nim
Original file line number Diff line number Diff line change
Expand Up @@ -576,6 +576,45 @@ suite "RST parsing":
# | |
# | \ indentation of exactly two spaces before 'let a = 1'

test "no blank line is required before or after Markdown code block":
let inputBacktick = dedent"""
Some text
```
CodeBlock()
```
Other text"""
let inputTilde = dedent"""
Some text
~~~~~~~~~
CodeBlock()
~~~~~~~~~
Other text"""
let expected = dedent"""
rnInner
rnParagraph
rnLeaf 'Some'
rnLeaf ' '
rnLeaf 'text'
rnParagraph
rnCodeBlock
[nil]
rnFieldList
rnField
rnFieldName
rnLeaf 'default-language'
rnFieldBody
rnLeaf 'Nim'
rnLiteralBlock
rnLeaf '
CodeBlock()'
rnLeaf ' '
rnLeaf 'Other'
rnLeaf ' '
rnLeaf 'text'
"""
check inputBacktick.toAst == expected
check inputTilde.toAst == expected

test "option list has priority over definition list":
check(dedent"""
--defusages
Expand Down
4 changes: 2 additions & 2 deletions tests/stdlib/trstgen.nim
Original file line number Diff line number Diff line change
Expand Up @@ -389,7 +389,7 @@ Some chapter
~~~~~
"""
let output9good = input9good.toHtml
let output9good = input9good.toHtml(preferRst)
doAssert "<h1 id=\"level1\">Level1</h1>" in output9good
doAssert "<h2 id=\"level2\">Level2</h2>" in output9good
doAssert "<h3 id=\"level3\">Level3</h3>" in output9good
Expand Down Expand Up @@ -419,7 +419,7 @@ Some chapter
"""
var error9Bad = new string
let output9Bad = input9Bad.toHtml(error=error9Bad)
let output9Bad = input9Bad.toHtml(preferRst, error=error9Bad)
check(error9Bad[] == "input(15, 1) Error: new section expected (section " &
"level inconsistent: underline ~~~~~ unexpectedly found, while " &
"the following intermediate section level(s) are missing on " &
Expand Down

0 comments on commit 78b1f2c

Please sign in to comment.