diff options
author | ringabout <43030857+ringabout@users.noreply.github.com> | 2022-09-07 03:23:33 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-09-06 21:23:33 +0200 |
commit | 557d79e7a2303f439d297655e3feb7219ef98fc6 (patch) | |
tree | eb0b54b2d3fdf4854bcb973ed45d6aff2ce03c9e | |
parent | 5ebd1248dfe517fd932c401f71d1e5aeb023b0e4 (diff) | |
download | Nim-557d79e7a2303f439d297655e3feb7219ef98fc6.tar.gz |
fixes #9462; jsondoc --index can generate a theindex.json (#20205)
-rw-r--r-- | compiler/docgen.nim | 16 | ||||
-rw-r--r-- | compiler/main.nim | 6 | ||||
-rw-r--r-- | lib/packages/docutils/rstgen.nim | 17 |
3 files changed, 29 insertions, 10 deletions
diff --git a/compiler/docgen.nim b/compiler/docgen.nim index a93dc01cf..bd973b211 100644 --- a/compiler/docgen.nim +++ b/compiler/docgen.nim @@ -1124,6 +1124,8 @@ proc genJsonItem(d: PDoc, n, nameNode: PNode, k: TSymKind): JsonItem = for kind in genericParam.sym.typ.sons: param["types"].add %($kind) result.json["signature"]["genericParams"].add param + if optGenIndex in d.conf.globalOptions: + genItem(d, n, nameNode, k, kForceExport) proc setDoctype(d: PDoc, n: PNode) = ## Processes `{.doctype.}` pragma changing Markdown/RST parsing options. @@ -1782,3 +1784,17 @@ proc commandBuildIndex*(conf: ConfigRef, dir: string, outFile = RelativeFile"") writeFile(filename, code) except: rawMessage(conf, errCannotOpenFile, filename.string) + +proc commandBuildIndexJson*(conf: ConfigRef, dir: string, outFile = RelativeFile"") = + var (modules, symbols, docs) = readIndexDir(dir) + let documents = toSeq(keys(Table[IndexEntry, seq[IndexEntry]](docs))) + let body = %*({"documents": documents, "modules": modules, "symbols": symbols}) + + var outFile = outFile + if outFile.isEmpty: outFile = theindexFname.RelativeFile.changeFileExt("") + let filename = getOutFile(conf, outFile, JsonExt) + + try: + writeFile(filename, $body) + except: + rawMessage(conf, errCannotOpenFile, filename.string) diff --git a/compiler/main.nim b/compiler/main.nim index 0354bec9c..171521c7a 100644 --- a/compiler/main.nim +++ b/compiler/main.nim @@ -325,7 +325,11 @@ proc mainCommand*(graph: ModuleGraph) = else: docLikeCmd commandDoc2(graph, TexExt) of cmdJsondoc0: docLikeCmd commandJson(cache, conf) - of cmdJsondoc: docLikeCmd commandDoc2(graph, JsonExt) + of cmdJsondoc: + docLikeCmd(): + commandDoc2(graph, JsonExt) + if optGenIndex in conf.globalOptions and optWholeProject in conf.globalOptions: + commandBuildIndexJson(conf, $conf.outDir) of cmdCtags: docLikeCmd commandTags(cache, conf) of cmdBuildindex: docLikeCmd commandBuildIndex(conf, $conf.projectFull, conf.outFile) of cmdGendepend: commandGenDepend(graph) diff --git a/lib/packages/docutils/rstgen.nim b/lib/packages/docutils/rstgen.nim index 00f1ac19d..1b5f9e78c 100644 --- a/lib/packages/docutils/rstgen.nim +++ b/lib/packages/docutils/rstgen.nim @@ -417,13 +417,13 @@ proc renderIndexTerm*(d: PDoc, n: PRstNode, result: var string) = [id, term]) type - IndexEntry = object - keyword: string - link: string - linkTitle: string ## contains a prettier text for the href - linkDesc: string ## the title attribute of the final href + IndexEntry* = object + keyword*: string + link*: string + linkTitle*: string ## contains a prettier text for the href + linkDesc*: string ## the title attribute of the final href - IndexedDocs = Table[IndexEntry, seq[IndexEntry]] ## \ + IndexedDocs* = Table[IndexEntry, seq[IndexEntry]] ## \ ## Contains the index sequences for doc types. ## ## The key is a *fake* IndexEntry which will contain the title of the @@ -625,7 +625,7 @@ proc generateModuleJumps(modules: seq[string]): string = result.add(chunks.join(", ") & ".<br/>") -proc readIndexDir(dir: string): +proc readIndexDir*(dir: string): tuple[modules: seq[string], symbols: seq[IndexEntry], docs: IndexedDocs] = ## Walks `dir` reading ``.idx`` files converting them in IndexEntry items. ## @@ -691,8 +691,6 @@ proc readIndexDir(dir: string): title.linkTitle = "doc_toc_" & $result.docs.len result.docs[title] = fileEntries - sort(result.modules, system.cmp) - proc mergeIndexes*(dir: string): string = ## Merges all index files in `dir` and returns the generated index as HTML. ## @@ -722,6 +720,7 @@ proc mergeIndexes*(dir: string): string = ## Returns the merged and sorted indices into a single HTML block which can ## be further embedded into nimdoc templates. var (modules, symbols, docs) = readIndexDir(dir) + sort(modules, system.cmp) result = "" # Generate a quick jump list of documents. |