summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--lib/packages/docutils/rst.nim25
-rw-r--r--tests/stdlib/trstgen.nim42
2 files changed, 57 insertions, 10 deletions
diff --git a/lib/packages/docutils/rst.nim b/lib/packages/docutils/rst.nim
index 709173526..0d86edcdb 100644
--- a/lib/packages/docutils/rst.nim
+++ b/lib/packages/docutils/rst.nim
@@ -48,6 +48,10 @@
 ## * markdown code blocks
 ## * markdown links
 ## * markdown headlines
+## * using ``1`` as auto-enumerator in enumerated lists like RST ``#``
+##   (auto-enumerator ``1`` can not be used with ``#`` in the same list)
+##
+## **Note:** By default nim has ``roSupportMarkdown`` turned **on**.
 ##
 ## Limitations:
 ##
@@ -1195,7 +1199,8 @@ proc whichSection(p: RstParser): RstNodeKind =
     elif match(p, p.idx, ":w:") and predNL(p):
       # (currentTok(p).symbol == ":")
       result = rnFieldList
-    elif match(p, p.idx, "(e) ") or match(p, p.idx, "e. "):
+    elif match(p, p.idx, "(e) ") or match(p, p.idx, "e) ") or
+         match(p, p.idx, "e. "):
       result = rnEnumList
     elif isDefList(p):
       result = rnDefList
@@ -1537,8 +1542,12 @@ proc parseEnumList(p: var RstParser): PRstNode =
     if match(p, p.idx, wildcards[w]): break
     inc w
   assert w < wildcards.len
+  let autoEnums = if roSupportMarkdown in p.s.options: @["#", "1"] else: @["#"]
+  var prevAE = ""  # so as not allow mixing auto-enumerators `1` and `#`
+  var curEnum = 1
   for i in 0 ..< wildToken[w]-1:  # add first enumerator with (, ), and .
     if p.tok[p.idx + i].symbol == "#":
+      prevAE = "#"
       result.text.add "1"
     else:
       result.text.add p.tok[p.idx + i].symbol
@@ -1556,17 +1565,19 @@ proc parseEnumList(p: var RstParser): PRstNode =
       # check that it's in sequence: enumerator == next(prevEnum)
       if "n" in wildcards[w]:  # arabic numeral
         let prevEnumI = try: parseInt(prevEnum) except: 1
-        let curEnum =
-          if enumerator == "#": prevEnumI + 1
-          else: (try: parseInt(enumerator) except: 1)
+        if enumerator in autoEnums:
+          if prevAE != "" and enumerator != prevAE:
+            break
+          prevAE = enumerator
+          curEnum = prevEnumI + 1
+        else: curEnum = (try: parseInt(enumerator) except: 1)
         if curEnum - prevEnumI != 1:
           break
         prevEnum = enumerator
       else:  # a..z
         let prevEnumI = ord(prevEnum[0])
-        let curEnum =
-          if enumerator == "#": prevEnumI + 1
-          else: ord(enumerator[0])
+        if enumerator == "#": curEnum = prevEnumI + 1
+        else: curEnum = ord(enumerator[0])
         if curEnum - prevEnumI != 1:
           break
         prevEnum = $chr(curEnum)
diff --git a/tests/stdlib/trstgen.nim b/tests/stdlib/trstgen.nim
index f3a8aa59a..85a96056a 100644
--- a/tests/stdlib/trstgen.nim
+++ b/tests/stdlib/trstgen.nim
@@ -440,13 +440,30 @@ Test1
       Check that auto-numbered enumeration lists work.
 
       #. string1
+
       #. string2
+
       #. string3
+
+      #) string5
+      #) string6
       """
     let output5 = rstToHtml(input5, {roSupportMarkdown}, defaultConfig())
-    assert count(output5, "<ol ") == 1
-    assert count(output5, "</ol>") == 1
-    assert count(output5, "<li>") == 3
+    assert count(output5, "<ol ") == 2
+    assert count(output5, "</ol>") == 2
+    assert count(output5, "<li>") == 5
+
+    let input5a = dedent """
+      Auto-numbered RST list can start with 1 even when Markdown support is on.
+
+      1. string1
+      #. string2
+      #. string3
+      """
+    let output5a = rstToHtml(input5a, {roSupportMarkdown}, defaultConfig())
+    assert count(output5a, "<ol ") == 1
+    assert count(output5a, "</ol>") == 1
+    assert count(output5a, "<li>") == 3
 
     let input6 = dedent """
       ... And for alphabetic enumerators too!
@@ -474,6 +491,25 @@ Test1
     assert count(output7, "<li>") == 3
     assert "start=\"3\"" in output7 and "class=\"upperalpha simple\"" in output7
 
+  test "Markdown enumerated lists":
+    let input1 = dedent """
+      Below are 2 enumerated lists: Markdown-style (5 items) and RST (1 item)
+      1. line1
+      1. line2
+      1. line3
+      1. line4
+
+      1. line5
+
+      #. lineA
+      """
+    let output1 = rstToHtml(input1, {roSupportMarkdown}, defaultConfig())
+    for i in 1..5:
+      assert ($i & ". line" & $i) notin output1
+      assert ("<li>line" & $i & "</li>") in output1
+    assert count(output1, "<ol ") == 2
+    assert count(output1, "</ol>") == 2
+
   test "RST bullet lists":
     let input1 = dedent """
       * line1