diff options
-rw-r--r-- | compiler/ic/rodfiles.nim | 3 | ||||
-rw-r--r-- | lib/packages/docutils/rst.nim | 16 | ||||
-rw-r--r-- | tests/stdlib/trst.nim | 39 | ||||
-rw-r--r-- | tests/stdlib/trstgen.nim | 4 |
4 files changed, 53 insertions, 9 deletions
diff --git a/compiler/ic/rodfiles.nim b/compiler/ic/rodfiles.nim index d811b9b99..496db0564 100644 --- a/compiler/ic/rodfiles.nim +++ b/compiler/ic/rodfiles.nim @@ -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` & diff --git a/lib/packages/docutils/rst.nim b/lib/packages/docutils/rst.nim index 91076bbee..b3adbf9de 100644 --- a/lib/packages/docutils/rst.nim +++ b/lib/packages/docutils/rst.nim @@ -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 @@ -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 diff --git a/tests/stdlib/trst.nim b/tests/stdlib/trst.nim index 70d992166..d1d7a3f00 100644 --- a/tests/stdlib/trst.nim +++ b/tests/stdlib/trst.nim @@ -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 diff --git a/tests/stdlib/trstgen.nim b/tests/stdlib/trstgen.nim index 42e463a04..a70b3f699 100644 --- a/tests/stdlib/trstgen.nim +++ b/tests/stdlib/trstgen.nim @@ -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 @@ -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 " & |