doc2tex: generate docs to Latex (#17997)

* `doc2tex`: generate docs to Latex

* address some comments
This commit is contained in:
Andrey Makarov 2021-05-14 08:30:47 +03:00 • committed by GitHub
commit 97970d9dcc
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
12 changed files with 171 additions and 161 deletions

View file

@ -26,7 +26,8 @@
## .. [#html] commands `nim doc`:cmd: for ``*.nim`` files and
## `nim rst2html`:cmd: for ``*.rst`` files
##
## .. [#latex] command `nim rst2tex`:cmd: for ``*.rst``.
## .. [#latex] commands `nim doc2tex`:cmd: for ``*.nim`` and
## `nim rst2tex`:cmd: for ``*.rst``.
##
## If you are new to RST please consider reading the following:
##

View file

@ -179,7 +179,9 @@ proc writeIndexFile*(g: var RstGenerator, outfile: string) =
## If the index is empty the file won't be created.
if g.theIndex.len > 0: writeFile(outfile, g.theIndex)
proc addXmlChar(dest: var string, c: char) =
proc addHtmlChar(dest: var string, c: char) =
# Escapes HTML characters. Note that single quote ' is not escaped as
# ' -- unlike XML (for standards pre HTML5 it was even forbidden).
case c
of '&': add(dest, "&")
of '<': add(dest, "&lt;")
@ -195,26 +197,19 @@ proc addRtfChar(dest: var string, c: char) =
else: add(dest, c)
proc addTexChar(dest: var string, c: char) =
# Escapes 10 special Latex characters. Note that [, ], and ` are not
# considered as such. TODO: neither is @, am I wrong?
case c
of '_': add(dest, "\\_")
of '{': add(dest, "\\symbol{123}")
of '}': add(dest, "\\symbol{125}")
of '[': add(dest, "\\symbol{91}")
of ']': add(dest, "\\symbol{93}")
of '\\': add(dest, "\\symbol{92}")
of '$': add(dest, "\\$")
of '&': add(dest, "\\&")
of '#': add(dest, "\\#")
of '%': add(dest, "\\%")
of '~': add(dest, "\\symbol{126}")
of '@': add(dest, "\\symbol{64}")
of '^': add(dest, "\\symbol{94}")
of '`': add(dest, "\\symbol{96}")
of '_', '{', '}', '$', '&', '#', '%': add(dest, "\\" & c)
# \~ and \^ have a special meaning unless they are followed by {}
of '~', '^': add(dest, "\\" & c & "{}")
# add {} to avoid gobbling up space by \textbackslash
of '\\': add(dest, "\\textbackslash{}")
else: add(dest, c)
proc escChar*(target: OutputTarget, dest: var string, c: char) {.inline.} =
case target
of outHtml: addXmlChar(dest, c)
of outHtml: addHtmlChar(dest, c)
of outLatex: addTexChar(dest, c)
proc addSplitter(target: OutputTarget; dest: var string) {.inline.} =
@ -987,6 +982,25 @@ proc buildLinesHtmlTable(d: PDoc; params: CodeBlockParams, code: string,
"</td></tr></tbody></table>" & (
d.config.getOrDefault"doc.listing_button" % id)
proc renderCodeLang*(result: var string, lang: SourceLanguage, code: string,
target: OutputTarget) =
var g: GeneralTokenizer
initGeneralTokenizer(g, code)
while true:
getNextToken(g, lang)
case g.kind
of gtEof: break
of gtNone, gtWhitespace:
add(result, substr(code, g.start, g.length + g.start - 1))
else:
dispA(target, result, "<span class=\"$2\">$1</span>", "\\span$2{$1}", [
esc(target, substr(code, g.start, g.length+g.start-1)),
tokenClassToStr[g.kind]])
deinitGeneralTokenizer(g)
proc renderNimCode*(result: var string, code: string, target: OutputTarget) =
renderCodeLang(result, langNim, code, target)
proc renderCode(d: PDoc, n: PRstNode, result: var string) =
## Renders a code (code block or inline code), appending it to `result`.
##
@ -1028,19 +1042,7 @@ proc renderCode(d: PDoc, n: PRstNode, result: var string) =
d.msgHandler(d.filename, 1, 0, mwUnsupportedLanguage, params.langStr)
for letter in m.text: escChar(d.target, result, letter)
else:
var g: GeneralTokenizer
initGeneralTokenizer(g, m.text)
while true:
getNextToken(g, params.lang)
case g.kind
of gtEof: break
of gtNone, gtWhitespace:
add(result, substr(m.text, g.start, g.length + g.start - 1))
else:
dispA(d.target, result, "<span class=\"$2\">$1</span>", "\\span$2{$1}", [
esc(d.target, substr(m.text, g.start, g.length+g.start-1)),
tokenClassToStr[g.kind]])
deinitGeneralTokenizer(g)
renderCodeLang(result, params.lang, m.text, d.target)
dispA(d.target, result, blockEnd, blockEnd)
proc renderContainer(d: PDoc, n: PRstNode, result: var string) =