doc/rst2html: some few fixes for enumerated and bullet lists (#16295)
* fix bullet/enumarated lists with many blank lines * fix enumerated list parsing * fix parse failure when next line after list empty * implement arbitrary start of enumerator * check that enumerators are in order * remove redundant start=x if x=1 or a * add some doc on implemented features * update start in rst_examples.rst * allow upper-case letters + more docs
This commit is contained in:
parent
2728711dd3
commit
e843492b13
6 changed files with 309 additions and 37 deletions
|
|
@ -1029,6 +1029,56 @@ proc renderField(d: PDoc, n: PRstNode, result: var string) =
|
|||
if not b:
|
||||
renderAux(d, n, "<tr>$1</tr>\n", "$1", result)
|
||||
|
||||
proc renderEnumList(d: PDoc, n: PRstNode, result: var string) =
|
||||
var
|
||||
specifier = ""
|
||||
specStart = ""
|
||||
i1 = 0
|
||||
pre = ""
|
||||
i2 = n.text.len-1
|
||||
post = ""
|
||||
if n.text[0] == '(':
|
||||
i1 = 1
|
||||
pre = "("
|
||||
if n.text[^1] == ')' or n.text[^1] == '.':
|
||||
i2 = n.text.len-2
|
||||
post = $n.text[^1]
|
||||
let enumR = i1 .. i2 # enumerator range without surrounding (, ), .
|
||||
if d.target == outLatex:
|
||||
result.add ("\n%"&n.text&"\n")
|
||||
# use enumerate parameters from package enumitem
|
||||
if n.text[i1].isDigit:
|
||||
var labelDef = ""
|
||||
if pre != "" or post != "":
|
||||
labelDef = "label=" & pre & "\\arabic*" & post & ","
|
||||
if n.text[enumR] != "1":
|
||||
specStart = "start=$1" % [n.text[enumR]]
|
||||
if labelDef != "" or specStart != "":
|
||||
specifier = "[$1$2]" % [labelDef, specStart]
|
||||
else:
|
||||
let (first, labelDef) =
|
||||
if n.text[i1].isUpperAscii: ('A', "label=" & pre & "\\Alph*" & post)
|
||||
else: ('a', "label=" & pre & "\\alph*" & post)
|
||||
if n.text[i1] != first:
|
||||
specStart = ",start=" & $(ord(n.text[i1]) - ord(first) + 1)
|
||||
specifier = "[$1$2]" % [labelDef, specStart]
|
||||
else: # HTML
|
||||
# TODO: implement enumerator formatting using pre and post ( and ) for HTML
|
||||
if n.text[i1].isDigit:
|
||||
if n.text[enumR] != "1":
|
||||
specStart = " start=\"$1\"" % [n.text[enumR]]
|
||||
specifier = "class=\"simple\"" & specStart
|
||||
else:
|
||||
let (first, labelDef) =
|
||||
if n.text[i1].isUpperAscii: ('A', "class=\"upperalpha simple\"")
|
||||
else: ('a', "class=\"loweralpha simple\"")
|
||||
if n.text[i1] != first:
|
||||
specStart = " start=\"$1\"" % [ $(ord(n.text[i1]) - ord(first) + 1) ]
|
||||
specifier = labelDef & specStart
|
||||
renderAux(d, n, "<ol " & specifier & ">$1</ol>\n",
|
||||
"\\begin{enumerate}" & specifier & "$1\\end{enumerate}\n",
|
||||
result)
|
||||
|
||||
proc renderRstToOut(d: PDoc, n: PRstNode, result: var string) =
|
||||
if n == nil: return
|
||||
case n.kind
|
||||
|
|
@ -1042,9 +1092,7 @@ proc renderRstToOut(d: PDoc, n: PRstNode, result: var string) =
|
|||
"\\begin{itemize}$1\\end{itemize}\n", result)
|
||||
of rnBulletItem, rnEnumItem:
|
||||
renderAux(d, n, "<li>$1</li>\n", "\\item $1\n", result)
|
||||
of rnEnumList:
|
||||
renderAux(d, n, "<ol class=\"simple\">$1</ol>\n",
|
||||
"\\begin{enumerate}$1\\end{enumerate}\n", result)
|
||||
of rnEnumList: renderEnumList(d, n, result)
|
||||
of rnDefList:
|
||||
renderAux(d, n, "<dl class=\"docutils\">$1</dl>\n",
|
||||
"\\begin{description}$1\\end{description}\n", result)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue