diff options
author | Andrey Makarov <ph.makarov@gmail.com> | 2022-08-28 00:28:26 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-08-27 17:28:26 -0400 |
commit | de9cbf6af1b3e67ceb78c4fd02c88b48fe762fa8 (patch) | |
tree | 5dfb0b2b90b3f6814ef2a36df650d90dacf39af9 /compiler | |
parent | 9ca63451227c879c573c280e582ca51af034be9d (diff) | |
download | Nim-de9cbf6af1b3e67ceb78c4fd02c88b48fe762fa8.tar.gz |
Fix auto links to subheader when TOC is present (#20279)
Fix links to subheader when TOC is present It was observed (in https://github.com/nim-lang/Nim/pull/20112) that links to 2nd- (and subsequent) -level headings fail if TOC is present, e.g.: ```nim .. contents:: Type relations ============== Convertible relation -------------------- Ref. `Convertible relation`_ ``` The problem here is that links are resolved in `rst.nim` but later `rstgen.nim` fixes ("fixes") anchors to make them unique so that TOC always works (if e.g. there was another sub-section like "Convertible relation"). The solution implemented in this PR is to move that fix-up of anchors into `rst.nim`, so that link resolution could know final anchors. The bug seems to be added in https://github.com/nim-lang/Nim/pull/2332 in 2015, that is it is present in Nim 1.0.
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/docgen.nim | 19 | ||||
-rw-r--r-- | compiler/docgen2.nim | 3 |
2 files changed, 10 insertions, 12 deletions
diff --git a/compiler/docgen.nim b/compiler/docgen.nim index 875089c49..4a914b0e7 100644 --- a/compiler/docgen.nim +++ b/compiler/docgen.nim @@ -281,7 +281,8 @@ proc isLatexCmd(conf: ConfigRef): bool = conf.cmd in {cmdRst2tex, cmdDoc2tex} proc newDocumentor*(filename: AbsoluteFile; cache: IdentCache; conf: ConfigRef, outExt: string = HtmlExt, module: PSym = nil, - standaloneDoc = false, preferMarkdown = true): PDoc = + standaloneDoc = false, preferMarkdown = true, + hasToc = true): PDoc = declareClosures() new(result) result.module = module @@ -294,9 +295,10 @@ proc newDocumentor*(filename: AbsoluteFile; cache: IdentCache; conf: ConfigRef, options.incl roPreferMarkdown if not standaloneDoc: options.incl roNimFile # (options can be changed dynamically in `setDoctype` by `{.doctype.}`) + result.hasToc = hasToc result.sharedState = newRstSharedState( options, filename.string, - docgenFindFile, compilerMsgHandler) + docgenFindFile, compilerMsgHandler, hasToc) initRstGenerator(result[], (if conf.isLatexCmd: outLatex else: outHtml), conf.configVars, filename.string, docgenFindFile, compilerMsgHandler) @@ -1339,6 +1341,7 @@ proc finishGenerateDoc*(d: var PDoc) = if fragment.isRst: firstRst = fragment.rst break + d.hasToc = d.hasToc or d.sharedState.hasToc preparePass2(d.sharedState, firstRst) # add anchors to overload groups before RST resolution @@ -1396,7 +1399,6 @@ proc finishGenerateDoc*(d: var PDoc) = d.section[k].secItems.clear renderItemPre(d, d.modDescPre, d.modDescFinal) d.modDescPre.setLen 0 - d.hasToc = d.hasToc or d.sharedState.hasToc # Finalize fragments of ``.json`` file for i, entry in d.jEntriesPre: @@ -1685,8 +1687,7 @@ proc commandDoc*(cache: IdentCache, conf: ConfigRef) = handleDocOutputOptions conf var ast = parseFile(conf.projectMainIdx, cache, conf) if ast == nil: return - var d = newDocumentor(conf.projectFull, cache, conf) - d.hasToc = true + var d = newDocumentor(conf.projectFull, cache, conf, hasToc = true) generateDoc(d, ast, ast) finishGenerateDoc(d) writeOutput(d) @@ -1697,7 +1698,7 @@ proc commandRstAux(cache: IdentCache, conf: ConfigRef; preferMarkdown: bool) = var filen = addFileExt(filename, "txt") var d = newDocumentor(filen, cache, conf, outExt, standaloneDoc = true, - preferMarkdown = preferMarkdown) + preferMarkdown = preferMarkdown, hasToc = false) let rst = parseRst(readFile(filen.string), line=LineRstInit, column=ColRstInit, conf, d.sharedState) @@ -1718,12 +1719,11 @@ proc commandJson*(cache: IdentCache, conf: ConfigRef) = ## implementation of a deprecated jsondoc0 command var ast = parseFile(conf.projectMainIdx, cache, conf) if ast == nil: return - var d = newDocumentor(conf.projectFull, cache, conf) + var d = newDocumentor(conf.projectFull, cache, conf, hasToc = true) d.onTestSnippet = proc (d: var RstGenerator; filename, cmd: string; status: int; content: string) = localError(conf, newLineInfo(conf, AbsoluteFile d.filename, -1, -1), warnUser, "the ':test:' attribute is not supported by this backend") - d.hasToc = true generateJson(d, ast) finishGenerateDoc(d) let json = d.jEntriesFinal @@ -1742,12 +1742,11 @@ proc commandJson*(cache: IdentCache, conf: ConfigRef) = proc commandTags*(cache: IdentCache, conf: ConfigRef) = var ast = parseFile(conf.projectMainIdx, cache, conf) if ast == nil: return - var d = newDocumentor(conf.projectFull, cache, conf) + var d = newDocumentor(conf.projectFull, cache, conf, hasToc = true) d.onTestSnippet = proc (d: var RstGenerator; filename, cmd: string; status: int; content: string) = localError(conf, newLineInfo(conf, AbsoluteFile d.filename, -1, -1), warnUser, "the ':test:' attribute is not supported by this backend") - d.hasToc = true var content = "" generateTags(d, ast, content) diff --git a/compiler/docgen2.nim b/compiler/docgen2.nim index 9abde9f52..ea3253a2c 100644 --- a/compiler/docgen2.nim +++ b/compiler/docgen2.nim @@ -64,8 +64,7 @@ template myOpenImpl(ext: untyped) {.dirty.} = g.module = module g.config = graph.config var d = newDocumentor(AbsoluteFile toFullPath(graph.config, FileIndex module.position), - graph.cache, graph.config, ext, module) - d.hasToc = true + graph.cache, graph.config, ext, module, hasToc = true) g.doc = d result = g |