From f4e49d49889d270481acf132d1cacbf7e921a983 Mon Sep 17 00:00:00 2001 From: Steve Landey Date: Thu, 29 Aug 2024 22:18:25 -0700 Subject: [PATCH 1/8] 0.1.1 --- docs/djockey.yaml | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/djockey.yaml b/docs/djockey.yaml index 307582e..11fbb21 100644 --- a/docs/djockey.yaml +++ b/docs/djockey.yaml @@ -7,7 +7,7 @@ output_dir: gfm: out/gfm project_info: - version: 0.1.0 + version: 0.1.1 github_url: https://github.com/irskep/djockey gfm: diff --git a/package.json b/package.json index 9044996..78d0964 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "djockey", - "version": "0.1.0", + "version": "0.1.1", "packageManager": "yarn@3.5.0", "engines": { "node": ">=17.0.0" From 6a5895aaedc86e677bc8cc58fdc6e3f08024f069 Mon Sep 17 00:00:00 2001 From: Steve Landey Date: Sat, 31 Aug 2024 15:41:10 -0700 Subject: [PATCH 2/8] Export LogCollector type --- src/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/index.ts b/src/index.ts index 0ed219e..8e8c09c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -13,3 +13,4 @@ export type { DocSet } from "./engine/docset.js"; export type { DocTree, DocTreeSection } from "./engine/doctree.js"; export { applyFilter } from "./engine/djotFiltersPlus.js"; +export { LogCollector } from "./utils/logUtils.js"; From 534d1d3cf0d78fda41a6ce57b3e8802eb1cdf7e5 Mon Sep 17 00:00:00 2001 From: Steve Landey Date: Sat, 31 Aug 2024 17:17:19 -0700 Subject: [PATCH 3/8] Add types & dependencies for link maps --- Makefile | 3 + bun.lockb | Bin 210665 -> 211163 bytes docs/djockey.yaml | 3 + docs/src/typescript_link_mapping.json | 622 +++++ docs/types.json | 3335 ------------------------- package.json | 1 + src/index.ts | 2 + src/types.ts | 15 + yarn.lock | 15 + 9 files changed, 661 insertions(+), 3335 deletions(-) create mode 100644 docs/src/typescript_link_mapping.json delete mode 100644 docs/types.json diff --git a/Makefile b/Makefile index ae1b9e9..2011e92 100644 --- a/Makefile +++ b/Makefile @@ -11,6 +11,9 @@ client: templates/html/static/client.js typedoc: bunx typedoc +typedoc-linkmap: + bunx linkmapper-typedoc docs/src/types.json docs/src/typescript_link_mapping.json + docs: templates/html/static/client.js bun --bun src/cli.ts docs --local diff --git a/bun.lockb b/bun.lockb index 2c5a0e1fa1f5f98eff8f7c33898c34e4af88fea9..deb8ccecb907631894af9994e1248f8405c8599d 100755 GIT binary patch delta 30709 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 delta 29783 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 fb?;c`_&VuDLK{(bgVFd DjockeyPlugin; }; + +/* LINK MAPPINGS */ + +export type DjockeyLinkMapping = { + linkDestination: string; + relativeURL: string; +}; + +export type DjockeyLinkMappingDoc = { + version: number; + namespaces: string[]; + linkMappings: DjockeyLinkMapping[]; +}; diff --git a/yarn.lock b/yarn.lock index a5e203f..e045e19 100644 --- a/yarn.lock +++ b/yarn.lock @@ -413,6 +413,20 @@ __metadata: languageName: node linkType: hard +"@djockey/linkmapper-typedoc@npm:^0.0.3": + version: 0.0.3 + resolution: "@djockey/linkmapper-typedoc@npm:0.0.3" + dependencies: + argparse: ^2.0.1 + typedoc: ^0.26.6 + peerDependencies: + typescript: ^5.0.0 + bin: + linkmapper-typedoc: index.js + checksum: 78ff72166def7b91b12e1f8ff4468bc92a98d0aec2d10120083ca3db245f3d3123ec46b9f08bacbd6fb31e977d195a9b3ef9c059eaa2100532bbe1b6457e9d70 + languageName: node + linkType: hard + "@djot/djot@npm:^0.3.1": version: 0.3.1 resolution: "@djot/djot@npm:0.3.1" @@ -2446,6 +2460,7 @@ __metadata: version: 0.0.0-use.local resolution: "djockey@workspace:." dependencies: + "@djockey/linkmapper-typedoc": ^0.0.3 "@djot/djot": ^0.3.1 "@jest/globals": ^29.7.0 "@types/argparse": ^2.0.16 From ae2fe8a0590ec42c9fc40970ea4de9ddf3f17199 Mon Sep 17 00:00:00 2001 From: Steve Landey Date: Sun, 1 Sep 2024 08:49:22 -0700 Subject: [PATCH 4/8] Richer representation of link maps --- docs/djockey.yaml | 3 ++- src/config.ts | 8 ++++++++ src/types.ts | 5 ++++- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/docs/djockey.yaml b/docs/djockey.yaml index d17cac7..87e91f0 100644 --- a/docs/djockey.yaml +++ b/docs/djockey.yaml @@ -11,7 +11,8 @@ project_info: github_url: https://github.com/irskep/djockey link_mappings: - - typescript_link_mapping.json + - path: typescript_link_mapping.json + url_root: api/ gfm: ignore_static: diff --git a/src/config.ts b/src/config.ts index b6d407e..494d15b 100644 --- a/src/config.ts +++ b/src/config.ts @@ -30,6 +30,7 @@ export function getConfigDefaults(): DjockeyConfig { site_name: "", plugins: [], + link_mappings: [], gfm: { ignore_static: ["**/*.css", "**/*.js", "**/*.html"], @@ -78,9 +79,16 @@ export function resolveConfig( ...getExtensionForInputFormat(format), ]; } + + const resolvedLinkMappings = (config.link_mappings ?? []).map((mapping) => ({ + path: absify(rootPath, mapping.path), + url_root: mapping.url_root, + })); + const result = { ...config, rootPath, + link_mappings: resolvedLinkMappings, input_dir: absify(rootPath, config.input_dir), output_dir: { html: absify(rootPath, config.output_dir.html), diff --git a/src/types.ts b/src/types.ts index 7f7a91d..fbd8122 100644 --- a/src/types.ts +++ b/src/types.ts @@ -2,6 +2,8 @@ import { Doc, Inline } from "@djot/djot"; import { Environment } from "nunjucks"; import { LogCollector } from "./utils/logUtils.js"; +export type LinkMappingConfig = { path: string; url_root: string }; + export type DjockeyConfig = { input_dir: string; output_dir: Record; @@ -21,7 +23,7 @@ export type DjockeyConfig = { ignore_static: string[]; }; - link_mappings?: string[]; + link_mappings?: LinkMappingConfig[]; html: { footer_text: string; @@ -43,6 +45,7 @@ export type DjockeyConfigResolved = DjockeyConfig & { rootPath: string; fileList: string[]; url_root: string; + link_mappings: LinkMappingConfig[]; }; export type DjockeyDoc = { From 82837e057c6538f313827ffe4f83793b4cd594d7 Mon Sep 17 00:00:00 2001 From: Steve Landey Date: Sun, 1 Sep 2024 13:31:15 -0700 Subject: [PATCH 5/8] Proof of concept link mapping works --- docs/djockey.yaml | 2 +- docs/src/typescript_link_mapping.json | 561 ++++------------------ src/engine/executeConfig.ts | 6 +- src/plugins/autoTitlePlugin.test.ts | 2 + src/plugins/linkRewritingPlugin.ts | 64 ++- src/plugins/tableOfContentsPlugin.test.ts | 1 + src/types.ts | 3 +- 7 files changed, 169 insertions(+), 470 deletions(-) diff --git a/docs/djockey.yaml b/docs/djockey.yaml index 87e91f0..5f8e4d2 100644 --- a/docs/djockey.yaml +++ b/docs/djockey.yaml @@ -11,7 +11,7 @@ project_info: github_url: https://github.com/irskep/djockey link_mappings: - - path: typescript_link_mapping.json + - path: src/typescript_link_mapping.json url_root: api/ gfm: diff --git a/docs/src/typescript_link_mapping.json b/docs/src/typescript_link_mapping.json index 10d7c0f..63a0c03 100644 --- a/docs/src/typescript_link_mapping.json +++ b/docs/src/typescript_link_mapping.json @@ -8,615 +8,258 @@ "linkMappings": [ { "linkDestination": "DocSet", - "relativeURL": "classes/DocSet.html" + "relativeURL": "classes/DocSet.html", + "defaultLabel": "DocSet" }, { "linkDestination": "DocSet.constructor", - "relativeURL": "classes/DocSet.html#constructor" + "relativeURL": "classes/DocSet.html#constructor", + "defaultLabel": "constructor" }, { "linkDestination": "DocSet.config", - "relativeURL": "classes/DocSet.html#config" + "relativeURL": "classes/DocSet.html#config", + "defaultLabel": "config" }, { "linkDestination": "config", - "relativeURL": "classes/DocSet.html#config" + "relativeURL": "classes/DocSet.html#config", + "defaultLabel": "config" }, { "linkDestination": "DocSet.docs", - "relativeURL": "classes/DocSet.html#docs" + "relativeURL": "classes/DocSet.html#docs", + "defaultLabel": "docs" }, { "linkDestination": "docs", - "relativeURL": "classes/DocSet.html#docs" + "relativeURL": "classes/DocSet.html#docs", + "defaultLabel": "docs" }, { "linkDestination": "DocSet.plugins", - "relativeURL": "classes/DocSet.html#plugins" + "relativeURL": "classes/DocSet.html#plugins", + "defaultLabel": "plugins" }, { "linkDestination": "plugins", - "relativeURL": "classes/DocSet.html#plugins" + "relativeURL": "classes/DocSet.html#plugins", + "defaultLabel": "plugins" }, { "linkDestination": "DocSet.tree", - "relativeURL": "classes/DocSet.html#tree" + "relativeURL": "classes/DocSet.html#tree", + "defaultLabel": "tree" }, { "linkDestination": "tree", - "relativeURL": "classes/DocSet.html#tree" + "relativeURL": "classes/DocSet.html#tree", + "defaultLabel": "tree" }, { "linkDestination": "DocSet.getDoc", - "relativeURL": "classes/DocSet.html#getDoc" + "relativeURL": "classes/DocSet.html#getDoc", + "defaultLabel": "getDoc" }, { "linkDestination": "getDoc", - "relativeURL": "classes/DocSet.html#getDoc" + "relativeURL": "classes/DocSet.html#getDoc", + "defaultLabel": "getDoc" }, { "linkDestination": "DocSet.makeRenderableCopy", - "relativeURL": "classes/DocSet.html#makeRenderableCopy" + "relativeURL": "classes/DocSet.html#makeRenderableCopy", + "defaultLabel": "makeRenderableCopy" }, { "linkDestination": "makeRenderableCopy", - "relativeURL": "classes/DocSet.html#makeRenderableCopy" + "relativeURL": "classes/DocSet.html#makeRenderableCopy", + "defaultLabel": "makeRenderableCopy" }, { "linkDestination": "DocSet.runPasses", - "relativeURL": "classes/DocSet.html#runPasses" + "relativeURL": "classes/DocSet.html#runPasses", + "defaultLabel": "runPasses" }, { "linkDestination": "runPasses", - "relativeURL": "classes/DocSet.html#runPasses" + "relativeURL": "classes/DocSet.html#runPasses", + "defaultLabel": "runPasses" }, { "linkDestination": "LogCollector", - "relativeURL": "classes/LogCollector.html" + "relativeURL": "classes/LogCollector.html", + "defaultLabel": "LogCollector" }, { "linkDestination": "LogCollector.constructor", - "relativeURL": "classes/LogCollector.html#constructor" + "relativeURL": "classes/LogCollector.html#constructor", + "defaultLabel": "constructor" }, { "linkDestination": "LogCollector.label", - "relativeURL": "classes/LogCollector.html#label" + "relativeURL": "classes/LogCollector.html#label", + "defaultLabel": "label" }, { "linkDestination": "label", - "relativeURL": "classes/LogCollector.html#label" + "relativeURL": "classes/LogCollector.html#label", + "defaultLabel": "label" }, { "linkDestination": "LogCollector.lines", - "relativeURL": "classes/LogCollector.html#lines" + "relativeURL": "classes/LogCollector.html#lines", + "defaultLabel": "lines" }, { "linkDestination": "lines", - "relativeURL": "classes/LogCollector.html#lines" + "relativeURL": "classes/LogCollector.html#lines", + "defaultLabel": "lines" }, { "linkDestination": "LogCollector.loader", - "relativeURL": "classes/LogCollector.html#loader" + "relativeURL": "classes/LogCollector.html#loader", + "defaultLabel": "loader" }, { "linkDestination": "loader", - "relativeURL": "classes/LogCollector.html#loader" + "relativeURL": "classes/LogCollector.html#loader", + "defaultLabel": "loader" }, { "linkDestination": "LogCollector.debug", - "relativeURL": "classes/LogCollector.html#debug" + "relativeURL": "classes/LogCollector.html#debug", + "defaultLabel": "debug" }, { "linkDestination": "debug", - "relativeURL": "classes/LogCollector.html#debug" + "relativeURL": "classes/LogCollector.html#debug", + "defaultLabel": "debug" }, { "linkDestination": "LogCollector.dump", - "relativeURL": "classes/LogCollector.html#dump" + "relativeURL": "classes/LogCollector.html#dump", + "defaultLabel": "dump" }, { "linkDestination": "dump", - "relativeURL": "classes/LogCollector.html#dump" + "relativeURL": "classes/LogCollector.html#dump", + "defaultLabel": "dump" }, { "linkDestination": "LogCollector.error", - "relativeURL": "classes/LogCollector.html#error" + "relativeURL": "classes/LogCollector.html#error", + "defaultLabel": "error" }, { "linkDestination": "error", - "relativeURL": "classes/LogCollector.html#error" + "relativeURL": "classes/LogCollector.html#error", + "defaultLabel": "error" }, { "linkDestination": "LogCollector.fail", - "relativeURL": "classes/LogCollector.html#fail" + "relativeURL": "classes/LogCollector.html#fail", + "defaultLabel": "fail" }, { "linkDestination": "fail", - "relativeURL": "classes/LogCollector.html#fail" + "relativeURL": "classes/LogCollector.html#fail", + "defaultLabel": "fail" }, { "linkDestination": "LogCollector.info", - "relativeURL": "classes/LogCollector.html#info" + "relativeURL": "classes/LogCollector.html#info", + "defaultLabel": "info" }, { "linkDestination": "info", - "relativeURL": "classes/LogCollector.html#info" + "relativeURL": "classes/LogCollector.html#info", + "defaultLabel": "info" }, { "linkDestination": "LogCollector.succeed", - "relativeURL": "classes/LogCollector.html#succeed" + "relativeURL": "classes/LogCollector.html#succeed", + "defaultLabel": "succeed" }, { "linkDestination": "succeed", - "relativeURL": "classes/LogCollector.html#succeed" + "relativeURL": "classes/LogCollector.html#succeed", + "defaultLabel": "succeed" }, { "linkDestination": "LogCollector.warning", - "relativeURL": "classes/LogCollector.html#warning" + "relativeURL": "classes/LogCollector.html#warning", + "defaultLabel": "warning" }, { "linkDestination": "warning", - "relativeURL": "classes/LogCollector.html#warning" + "relativeURL": "classes/LogCollector.html#warning", + "defaultLabel": "warning" }, { "linkDestination": "DjockeyConfig", - "relativeURL": "types/DjockeyConfig.html" + "relativeURL": "types/DjockeyConfig.html", + "defaultLabel": "DjockeyConfig" }, { "linkDestination": "DjockeyConfigResolved", - "relativeURL": "types/DjockeyConfigResolved.html" + "relativeURL": "types/DjockeyConfigResolved.html", + "defaultLabel": "DjockeyConfigResolved" }, { "linkDestination": "DjockeyDoc", - "relativeURL": "types/DjockeyDoc.html" + "relativeURL": "types/DjockeyDoc.html", + "defaultLabel": "DjockeyDoc" }, { "linkDestination": "DjockeyInputFormat", - "relativeURL": "types/DjockeyInputFormat.html" + "relativeURL": "types/DjockeyInputFormat.html", + "defaultLabel": "DjockeyInputFormat" }, { "linkDestination": "DjockeyLinkMapping", - "relativeURL": "types/DjockeyLinkMapping.html" + "relativeURL": "types/DjockeyLinkMapping.html", + "defaultLabel": "DjockeyLinkMapping" }, { "linkDestination": "DjockeyLinkMappingDoc", - "relativeURL": "types/DjockeyLinkMappingDoc.html" + "relativeURL": "types/DjockeyLinkMappingDoc.html", + "defaultLabel": "DjockeyLinkMappingDoc" }, { "linkDestination": "DjockeyOutputFormat", - "relativeURL": "types/DjockeyOutputFormat.html" + "relativeURL": "types/DjockeyOutputFormat.html", + "defaultLabel": "DjockeyOutputFormat" }, { "linkDestination": "DjockeyPlugin", - "relativeURL": "types/DjockeyPlugin.html" + "relativeURL": "types/DjockeyPlugin.html", + "defaultLabel": "DjockeyPlugin" }, { "linkDestination": "DjockeyPluginModule", - "relativeURL": "types/DjockeyPluginModule.html" + "relativeURL": "types/DjockeyPluginModule.html", + "defaultLabel": "DjockeyPluginModule" }, { "linkDestination": "DjockeyRenderer", - "relativeURL": "types/DjockeyRenderer.html" + "relativeURL": "types/DjockeyRenderer.html", + "defaultLabel": "DjockeyRenderer" }, { "linkDestination": "DocTree", - "relativeURL": "types/DocTree.html" + "relativeURL": "types/DocTree.html", + "defaultLabel": "DocTree" }, { "linkDestination": "DocTreeSection", - "relativeURL": "types/DocTreeSection.html" + "relativeURL": "types/DocTreeSection.html", + "defaultLabel": "DocTreeSection" }, { "linkDestination": "applyFilter", - "relativeURL": "functions/applyFilter.html" - }, - { - "linkDestination": "DocSet", - "relativeURL": "classes/DocSet.html" - }, - { - "linkDestination": "DocSet.constructor", - "relativeURL": "classes/DocSet.html#constructor" - }, - { - "linkDestination": "DocSet.config", - "relativeURL": "classes/DocSet.html#config" - }, - { - "linkDestination": "config", - "relativeURL": "classes/DocSet.html#config" - }, - { - "linkDestination": "DocSet.docs", - "relativeURL": "classes/DocSet.html#docs" - }, - { - "linkDestination": "docs", - "relativeURL": "classes/DocSet.html#docs" - }, - { - "linkDestination": "DocSet.plugins", - "relativeURL": "classes/DocSet.html#plugins" - }, - { - "linkDestination": "plugins", - "relativeURL": "classes/DocSet.html#plugins" - }, - { - "linkDestination": "DocSet.tree", - "relativeURL": "classes/DocSet.html#tree" - }, - { - "linkDestination": "tree", - "relativeURL": "classes/DocSet.html#tree" - }, - { - "linkDestination": "DocSet.getDoc", - "relativeURL": "classes/DocSet.html#getDoc" - }, - { - "linkDestination": "getDoc", - "relativeURL": "classes/DocSet.html#getDoc" - }, - { - "linkDestination": "DocSet.makeRenderableCopy", - "relativeURL": "classes/DocSet.html#makeRenderableCopy" - }, - { - "linkDestination": "makeRenderableCopy", - "relativeURL": "classes/DocSet.html#makeRenderableCopy" - }, - { - "linkDestination": "DocSet.runPasses", - "relativeURL": "classes/DocSet.html#runPasses" - }, - { - "linkDestination": "runPasses", - "relativeURL": "classes/DocSet.html#runPasses" - }, - { - "linkDestination": "LogCollector", - "relativeURL": "classes/LogCollector.html" - }, - { - "linkDestination": "LogCollector.constructor", - "relativeURL": "classes/LogCollector.html#constructor" - }, - { - "linkDestination": "LogCollector.label", - "relativeURL": "classes/LogCollector.html#label" - }, - { - "linkDestination": "label", - "relativeURL": "classes/LogCollector.html#label" - }, - { - "linkDestination": "LogCollector.lines", - "relativeURL": "classes/LogCollector.html#lines" - }, - { - "linkDestination": "lines", - "relativeURL": "classes/LogCollector.html#lines" - }, - { - "linkDestination": "LogCollector.loader", - "relativeURL": "classes/LogCollector.html#loader" - }, - { - "linkDestination": "loader", - "relativeURL": "classes/LogCollector.html#loader" - }, - { - "linkDestination": "LogCollector.debug", - "relativeURL": "classes/LogCollector.html#debug" - }, - { - "linkDestination": "debug", - "relativeURL": "classes/LogCollector.html#debug" - }, - { - "linkDestination": "LogCollector.dump", - "relativeURL": "classes/LogCollector.html#dump" - }, - { - "linkDestination": "dump", - "relativeURL": "classes/LogCollector.html#dump" - }, - { - "linkDestination": "LogCollector.error", - "relativeURL": "classes/LogCollector.html#error" - }, - { - "linkDestination": "error", - "relativeURL": "classes/LogCollector.html#error" - }, - { - "linkDestination": "LogCollector.fail", - "relativeURL": "classes/LogCollector.html#fail" - }, - { - "linkDestination": "fail", - "relativeURL": "classes/LogCollector.html#fail" - }, - { - "linkDestination": "LogCollector.info", - "relativeURL": "classes/LogCollector.html#info" - }, - { - "linkDestination": "info", - "relativeURL": "classes/LogCollector.html#info" - }, - { - "linkDestination": "LogCollector.succeed", - "relativeURL": "classes/LogCollector.html#succeed" - }, - { - "linkDestination": "succeed", - "relativeURL": "classes/LogCollector.html#succeed" - }, - { - "linkDestination": "LogCollector.warning", - "relativeURL": "classes/LogCollector.html#warning" - }, - { - "linkDestination": "warning", - "relativeURL": "classes/LogCollector.html#warning" - }, - { - "linkDestination": "DjockeyConfig", - "relativeURL": "types/DjockeyConfig.html" - }, - { - "linkDestination": "DjockeyConfigResolved", - "relativeURL": "types/DjockeyConfigResolved.html" - }, - { - "linkDestination": "DjockeyDoc", - "relativeURL": "types/DjockeyDoc.html" - }, - { - "linkDestination": "DjockeyInputFormat", - "relativeURL": "types/DjockeyInputFormat.html" - }, - { - "linkDestination": "DjockeyLinkMapping", - "relativeURL": "types/DjockeyLinkMapping.html" - }, - { - "linkDestination": "DjockeyLinkMappingDoc", - "relativeURL": "types/DjockeyLinkMappingDoc.html" - }, - { - "linkDestination": "DjockeyOutputFormat", - "relativeURL": "types/DjockeyOutputFormat.html" - }, - { - "linkDestination": "DjockeyPlugin", - "relativeURL": "types/DjockeyPlugin.html" - }, - { - "linkDestination": "DjockeyPluginModule", - "relativeURL": "types/DjockeyPluginModule.html" - }, - { - "linkDestination": "DjockeyRenderer", - "relativeURL": "types/DjockeyRenderer.html" - }, - { - "linkDestination": "DocTree", - "relativeURL": "types/DocTree.html" - }, - { - "linkDestination": "DocTreeSection", - "relativeURL": "types/DocTreeSection.html" - }, - { - "linkDestination": "applyFilter", - "relativeURL": "functions/applyFilter.html" - }, - { - "linkDestination": "DocSet", - "relativeURL": "classes/DocSet.html" - }, - { - "linkDestination": "DocSet.constructor", - "relativeURL": "classes/DocSet.html#constructor" - }, - { - "linkDestination": "DocSet.config", - "relativeURL": "classes/DocSet.html#config" - }, - { - "linkDestination": "config", - "relativeURL": "classes/DocSet.html#config" - }, - { - "linkDestination": "DocSet.docs", - "relativeURL": "classes/DocSet.html#docs" - }, - { - "linkDestination": "docs", - "relativeURL": "classes/DocSet.html#docs" - }, - { - "linkDestination": "DocSet.plugins", - "relativeURL": "classes/DocSet.html#plugins" - }, - { - "linkDestination": "plugins", - "relativeURL": "classes/DocSet.html#plugins" - }, - { - "linkDestination": "DocSet.tree", - "relativeURL": "classes/DocSet.html#tree" - }, - { - "linkDestination": "tree", - "relativeURL": "classes/DocSet.html#tree" - }, - { - "linkDestination": "DocSet.getDoc", - "relativeURL": "classes/DocSet.html#getDoc" - }, - { - "linkDestination": "getDoc", - "relativeURL": "classes/DocSet.html#getDoc" - }, - { - "linkDestination": "DocSet.makeRenderableCopy", - "relativeURL": "classes/DocSet.html#makeRenderableCopy" - }, - { - "linkDestination": "makeRenderableCopy", - "relativeURL": "classes/DocSet.html#makeRenderableCopy" - }, - { - "linkDestination": "DocSet.runPasses", - "relativeURL": "classes/DocSet.html#runPasses" - }, - { - "linkDestination": "runPasses", - "relativeURL": "classes/DocSet.html#runPasses" - }, - { - "linkDestination": "LogCollector", - "relativeURL": "classes/LogCollector.html" - }, - { - "linkDestination": "LogCollector.constructor", - "relativeURL": "classes/LogCollector.html#constructor" - }, - { - "linkDestination": "LogCollector.label", - "relativeURL": "classes/LogCollector.html#label" - }, - { - "linkDestination": "label", - "relativeURL": "classes/LogCollector.html#label" - }, - { - "linkDestination": "LogCollector.lines", - "relativeURL": "classes/LogCollector.html#lines" - }, - { - "linkDestination": "lines", - "relativeURL": "classes/LogCollector.html#lines" - }, - { - "linkDestination": "LogCollector.loader", - "relativeURL": "classes/LogCollector.html#loader" - }, - { - "linkDestination": "loader", - "relativeURL": "classes/LogCollector.html#loader" - }, - { - "linkDestination": "LogCollector.debug", - "relativeURL": "classes/LogCollector.html#debug" - }, - { - "linkDestination": "debug", - "relativeURL": "classes/LogCollector.html#debug" - }, - { - "linkDestination": "LogCollector.dump", - "relativeURL": "classes/LogCollector.html#dump" - }, - { - "linkDestination": "dump", - "relativeURL": "classes/LogCollector.html#dump" - }, - { - "linkDestination": "LogCollector.error", - "relativeURL": "classes/LogCollector.html#error" - }, - { - "linkDestination": "error", - "relativeURL": "classes/LogCollector.html#error" - }, - { - "linkDestination": "LogCollector.fail", - "relativeURL": "classes/LogCollector.html#fail" - }, - { - "linkDestination": "fail", - "relativeURL": "classes/LogCollector.html#fail" - }, - { - "linkDestination": "LogCollector.info", - "relativeURL": "classes/LogCollector.html#info" - }, - { - "linkDestination": "info", - "relativeURL": "classes/LogCollector.html#info" - }, - { - "linkDestination": "LogCollector.succeed", - "relativeURL": "classes/LogCollector.html#succeed" - }, - { - "linkDestination": "succeed", - "relativeURL": "classes/LogCollector.html#succeed" - }, - { - "linkDestination": "LogCollector.warning", - "relativeURL": "classes/LogCollector.html#warning" - }, - { - "linkDestination": "warning", - "relativeURL": "classes/LogCollector.html#warning" - }, - { - "linkDestination": "DjockeyConfig", - "relativeURL": "types/DjockeyConfig.html" - }, - { - "linkDestination": "DjockeyConfigResolved", - "relativeURL": "types/DjockeyConfigResolved.html" - }, - { - "linkDestination": "DjockeyDoc", - "relativeURL": "types/DjockeyDoc.html" - }, - { - "linkDestination": "DjockeyInputFormat", - "relativeURL": "types/DjockeyInputFormat.html" - }, - { - "linkDestination": "DjockeyLinkMapping", - "relativeURL": "types/DjockeyLinkMapping.html" - }, - { - "linkDestination": "DjockeyLinkMappingDoc", - "relativeURL": "types/DjockeyLinkMappingDoc.html" - }, - { - "linkDestination": "DjockeyOutputFormat", - "relativeURL": "types/DjockeyOutputFormat.html" - }, - { - "linkDestination": "DjockeyPlugin", - "relativeURL": "types/DjockeyPlugin.html" - }, - { - "linkDestination": "DjockeyPluginModule", - "relativeURL": "types/DjockeyPluginModule.html" - }, - { - "linkDestination": "DjockeyRenderer", - "relativeURL": "types/DjockeyRenderer.html" - }, - { - "linkDestination": "DocTree", - "relativeURL": "types/DocTree.html" - }, - { - "linkDestination": "DocTreeSection", - "relativeURL": "types/DocTreeSection.html" - }, - { - "linkDestination": "applyFilter", - "relativeURL": "functions/applyFilter.html" + "relativeURL": "functions/applyFilter.html", + "defaultLabel": "applyFilter" } ] } \ No newline at end of file diff --git a/src/engine/executeConfig.ts b/src/engine/executeConfig.ts index 65be263..7a4a9df 100644 --- a/src/engine/executeConfig.ts +++ b/src/engine/executeConfig.ts @@ -63,14 +63,14 @@ export async function readDocSet( } } - const loader = print.spin("Setting up plugins"); + const logCollectorPluginSetup = new LogCollector("Setting up plugins"); const plugins = [...makeBuiltinPlugins(config), ...userPlugins]; for (const plugin of plugins) { if (plugin.setup) { - await plugin.setup(); + await plugin.setup({ logCollector: logCollectorPluginSetup }); } } - loader.succeed(); + logCollectorPluginSetup.succeed("warning"); return new DocSet(config, plugins, docs); } diff --git a/src/plugins/autoTitlePlugin.test.ts b/src/plugins/autoTitlePlugin.test.ts index 546bda7..f179e49 100644 --- a/src/plugins/autoTitlePlugin.test.ts +++ b/src/plugins/autoTitlePlugin.test.ts @@ -31,6 +31,7 @@ test("Title is set to first heading by default", () => { const config: DjockeyConfigResolved = { ...getConfigDefaults(), + link_mappings: [], input_dir: ".", rootPath: ".", output_dir: { html: "./dist/html", gfm: "./dist/gfm" }, @@ -70,6 +71,7 @@ test("Title is set to frontMatter.title if present", () => { const config: DjockeyConfigResolved = { ...getConfigDefaults(), + link_mappings: [], input_dir: ".", rootPath: ".", output_dir: { html: "./dist/html", gfm: "./dist/gfm" }, diff --git a/src/plugins/linkRewritingPlugin.ts b/src/plugins/linkRewritingPlugin.ts index 4da6e72..0b8903e 100644 --- a/src/plugins/linkRewritingPlugin.ts +++ b/src/plugins/linkRewritingPlugin.ts @@ -4,6 +4,7 @@ import path from "path"; import { DjockeyConfigResolved, DjockeyDoc, + DjockeyLinkMappingDoc, DjockeyPlugin, DjockeyRenderer, } from "../types.js"; @@ -16,8 +17,38 @@ export class LinkRewritingPlugin implements DjockeyPlugin { private _linkTargets: Record = {}; + private _mappedLinkDestinations: Record = {}; + private _defaultLinkLabels: Record = {}; + constructor(public config: DjockeyConfigResolved) {} + async setup(args: { logCollector: LogCollector }) { + for (const mappingDoc of this.config.link_mappings) { + const data: DjockeyLinkMappingDoc = JSON.parse( + fs.readFileSync(mappingDoc.path, "utf8") + ); + const urlRoot = mappingDoc.url_root.endsWith("/") + ? mappingDoc.url_root + : `${mappingDoc.url_root}/`; + for (const mapping of data.linkMappings) { + for (const ns of data.namespaces) { + const dest = `:${ns}:${mapping.linkDestination}`; + const url = `${urlRoot}/${mapping.relativeURL}`; + if ( + this._mappedLinkDestinations[dest] && + // Silently ignore duplicate entries of the same thing + this._mappedLinkDestinations[dest] !== url + ) { + args.logCollector.warning(`Duplicate mapped link: ${dest}`); + } else { + this._mappedLinkDestinations[dest] = url; + this._defaultLinkLabels[dest] = mapping.defaultLabel; + } + } + } + } + } + onPass_read(doc: DjockeyDoc) { const registerLinkTarget = (t: LinkTarget) => { t.aliases.forEach((alias) => @@ -52,6 +83,9 @@ export class LinkRewritingPlugin implements DjockeyPlugin { applyFilter(djotDoc, () => ({ "*": (node) => { if (!node.destination) return; + + const defaultLabel = this._defaultLinkLabels[node.destination]; + const newDestination = this.transformNodeDestination( doc.relativePath, config.input_dir, @@ -63,7 +97,12 @@ export class LinkRewritingPlugin implements DjockeyPlugin { logCollector, } ); - return { ...node, destination: newDestination }; + + const children = [...(node.children ?? [])]; + if (!children.length && defaultLabel) + children.push({ tag: "str", text: defaultLabel }); + + return { ...node, destination: newDestination, children }; }, })); } @@ -80,23 +119,33 @@ export class LinkRewritingPlugin implements DjockeyPlugin { return unresolvedNodeDestination; } - const nodeDestination = resolveRelativePath( - sourcePath, + const nodeDestination = this._mappedLinkDestinations[ unresolvedNodeDestination - ); + ] + ? this._mappedLinkDestinations[unresolvedNodeDestination] + : resolveRelativePath(sourcePath, unresolvedNodeDestination); const values = this._linkTargets[nodeDestination]; if (!values || !values.length) { - const prefixlessNodeDestination = nodeDestination.startsWith("/") + const prefixlessNodeDestinationWithHash = nodeDestination.startsWith("/") ? nodeDestination.slice(1) : nodeDestination; + const prefixlessNodeDestination = + prefixlessNodeDestinationWithHash.split("#")[0]; + const anchorWithoutHash = + prefixlessNodeDestination === prefixlessNodeDestinationWithHash + ? null + : prefixlessNodeDestinationWithHash.slice( + prefixlessNodeDestination.length + 1 + ); + const staticFilePath = `${inputRoot}/${prefixlessNodeDestination}`; if (fs.existsSync(staticFilePath)) { return renderArgs.renderer.transformLink({ config: renderArgs.config, sourcePath: renderArgs.sourcePath, - anchorWithoutHash: null, + anchorWithoutHash, docOriginalExtension: path.parse(nodeDestination).ext, docRelativePath: prefixlessNodeDestination, isLinkToStaticFile: true, @@ -106,6 +155,9 @@ export class LinkRewritingPlugin implements DjockeyPlugin { renderArgs.logCollector.warning( `Not sure what to do with link ${nodeDestination} in ${renderArgs.sourcePath}` ); + renderArgs.logCollector.warning( + ` Looked for but did not find a static file at ${staticFilePath}` + ); } return nodeDestination; } diff --git a/src/plugins/tableOfContentsPlugin.test.ts b/src/plugins/tableOfContentsPlugin.test.ts index 0669420..929035a 100644 --- a/src/plugins/tableOfContentsPlugin.test.ts +++ b/src/plugins/tableOfContentsPlugin.test.ts @@ -82,6 +82,7 @@ test("Works end-to-end with LinkRewritingPlugin", async () => { }; const config: DjockeyConfigResolved = { ...getConfigDefaults(), + link_mappings: [], input_dir: ".", output_dir: { html: "./dist/html", gfm: "./dist/gfm" }, fileList: ["Test Doc.dj"], diff --git a/src/types.ts b/src/types.ts index fbd8122..4521e53 100644 --- a/src/types.ts +++ b/src/types.ts @@ -111,7 +111,7 @@ export type DjockeyRenderer = { export type DjockeyPlugin = { name: string; - setup?: () => Promise; + setup?: (args: { logCollector: LogCollector }) => Promise; onPass_read?: (doc: DjockeyDoc) => void; @@ -136,6 +136,7 @@ export type DjockeyPluginModule = { export type DjockeyLinkMapping = { linkDestination: string; relativeURL: string; + defaultLabel: string; }; export type DjockeyLinkMappingDoc = { From c07a79dd32eab985609ff336f7d99b201d5006ec Mon Sep 17 00:00:00 2001 From: Steve Landey Date: Sun, 1 Sep 2024 19:34:33 -0700 Subject: [PATCH 6/8] Docs for the TypeDoc integration --- docs/src/changelog.dj | 4 +++ docs/src/features/typedoc.dj | 40 +++++++++++++++++++++++++ docs/src/features/version_directives.dj | 6 +++- 3 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 docs/src/features/typedoc.dj diff --git a/docs/src/changelog.dj b/docs/src/changelog.dj index 1c0b05f..323599f 100644 --- a/docs/src/changelog.dj +++ b/docs/src/changelog.dj @@ -4,6 +4,10 @@ order: -1 # Changelog +## 0.2 (unreleased) + +- [Typedoc integration](#typedoc-integration) + ## 0.1 ### 0.1.1 - 2024-08-30 diff --git a/docs/src/features/typedoc.dj b/docs/src/features/typedoc.dj new file mode 100644 index 0000000..4697ca3 --- /dev/null +++ b/docs/src/features/typedoc.dj @@ -0,0 +1,40 @@ +{#typedoc-integration} +# Typedoc integration + +{added-in-version=0.2} +::: +::: + +Djockey can integrate with [TypeDoc](https://typedoc.org) to create an integrated documentation experience that combines the authoring power of Djockey with rich API references. For example, here in the Djockey docs, we can type `[](:ts:DjockeyPlugin)` and get [](:ts:DjockeyPlugin). + +The core concept is to render TypeDoc normally inside your docs directory, treat its output as static files, and then create convenient link aliases into it. + +## 1. Run TypeDoc + +First, run TypeDoc on your project with JSON and HTML output. The JSON output can go anywhere, but the HTML must go inside your docs source directory next to your markup. + +```sh +npx typedoc src/index.ts --json docs/src/types.json --out docs/src/api +``` + +## 2. Generate a link map + +Djockey uses a _link map file_ to figure out where to point links to. You generate a link map using a separate program called `linkmapper-typedoc`. + +```sh +npm install --dev @djockey/linkmapper-typedoc +npx linkmapper-typedoc docs/src/types.json docs/src/typescript_link_mapping.json +``` + +## 3. Configure Djockey + +Assuming your `djockey.yaml` is under `docs`... + +{filename="docs/djockey.yaml"} +```yaml +link_mappings: + - path: src/typescript_link_mapping.json + url_root: api/ +``` + +The path is relative to `djockey.yaml`{.language-sh}. `url_root` should be the place you rendered TypeDoc's HTML output to. \ No newline at end of file diff --git a/docs/src/features/version_directives.dj b/docs/src/features/version_directives.dj index 9f36c5f..bcd28f9 100644 --- a/docs/src/features/version_directives.dj +++ b/docs/src/features/version_directives.dj @@ -40,4 +40,8 @@ Output: {added-in-version="10.0"} ::: We're really excited about this feature! -::: \ No newline at end of file +::: + +## Other options + +You can also use `changed-in-version`, `removed-in-version`, and `deprecated-in-version`. \ No newline at end of file From b2e52f42f85e6fe5ef4b9bb99ea96404c95dbee1 Mon Sep 17 00:00:00 2001 From: Steve Landey Date: Sun, 1 Sep 2024 19:41:33 -0700 Subject: [PATCH 7/8] Doc fixes --- docs/src/features/typedoc.dj | 27 ++++++++++++++++----- templates/html/static/dj-markupfeatures.css | 6 ++--- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/docs/src/features/typedoc.dj b/docs/src/features/typedoc.dj index 4697ca3..0c5bb99 100644 --- a/docs/src/features/typedoc.dj +++ b/docs/src/features/typedoc.dj @@ -1,11 +1,16 @@ {#typedoc-integration} # Typedoc integration -{added-in-version=0.2} +{added-in-version="0.2"} ::: ::: -Djockey can integrate with [TypeDoc](https://typedoc.org) to create an integrated documentation experience that combines the authoring power of Djockey with rich API references. For example, here in the Djockey docs, we can type `[](:ts:DjockeyPlugin)` and get [](:ts:DjockeyPlugin). +{tag=aside .caution} +::: +TypeDoc integration hasn't been tested broadly. Please [create an issue on GitHub](https://github.com/irskep/djockey/issues/new) if you run into any trouble. +::: + +Djockey can integrate with [TypeDoc](https://typedoc.org) to create an integrated documentation experience that combines the authoring power of Djockey with rich API references. For example, here in the Djockey docs, we can type `[](:ts:DjockeyPlugin)`{.language-djot} and get [](:ts:DjockeyPlugin). The core concept is to render TypeDoc normally inside your docs directory, treat its output as static files, and then create convenient link aliases into it. @@ -14,7 +19,9 @@ The core concept is to render TypeDoc normally inside your docs directory, treat First, run TypeDoc on your project with JSON and HTML output. The JSON output can go anywhere, but the HTML must go inside your docs source directory next to your markup. ```sh -npx typedoc src/index.ts --json docs/src/types.json --out docs/src/api +npx typedoc src/index.ts \ + --json docs/src/types.json \ + --out docs/src/api ``` ## 2. Generate a link map @@ -23,7 +30,9 @@ Djockey uses a _link map file_ to figure out where to point links to. You genera ```sh npm install --dev @djockey/linkmapper-typedoc -npx linkmapper-typedoc docs/src/types.json docs/src/typescript_link_mapping.json +npx linkmapper-typedoc \ + docs/src/types.json \ + docs/src/typescript_link_map.json ``` ## 3. Configure Djockey @@ -33,8 +42,14 @@ Assuming your `djockey.yaml` is under `docs`... {filename="docs/djockey.yaml"} ```yaml link_mappings: - - path: src/typescript_link_mapping.json + - path: src/typescript_link_map.json url_root: api/ ``` -The path is relative to `djockey.yaml`{.language-sh}. `url_root` should be the place you rendered TypeDoc's HTML output to. \ No newline at end of file +The path is relative to `djockey.yaml`{.language-sh}. `url_root` should be the place you rendered TypeDoc's HTML output to. + +## 4. Link to your API docs + +From here, you can write `:ts:symbolName` as a link destination to get a link into your TypeDoc API reference. If you need to disambiguate, for example to refer to a method on a specific class, you can add parent types like `:ts:SomeClass.someMethod` or `:ts:namespace.SomeClass.someMethod`. + +If your link doesn't have any text, the text will be populated automatically. So you can say `[API reference for DjockeyPlugin](:ts:DjockeyPlugin)`{.language-djot} to customize the link text, or just `[](:ts:DjockeyPlugin)`{.language-djot} to use the symbol name. \ No newline at end of file diff --git a/templates/html/static/dj-markupfeatures.css b/templates/html/static/dj-markupfeatures.css index 30bda50..2d0d49f 100644 --- a/templates/html/static/dj-markupfeatures.css +++ b/templates/html/static/dj-markupfeatures.css @@ -56,10 +56,10 @@ aside.important { border-color: var(--aside-color-border-important); } -/* Warning */ +/* Caution */ aside.caution::before { - content: "Warning"; + content: "Caution"; background-color: var(--aside-title-color-bg-warning); } @@ -70,7 +70,7 @@ aside.caution { /* Danger */ aside.warning::before { - content: "Danger"; + content: "Warning"; background-color: var(--aside-title-color-bg-danger); } From e1692155374ab507c12358406628e2daa60f6405 Mon Sep 17 00:00:00 2001 From: Steve Landey Date: Sun, 1 Sep 2024 19:44:23 -0700 Subject: [PATCH 8/8] Update lockfiles --- package-lock.json | 21 +++++++++++++++++++-- yarn.lock | 10 +++++----- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 828530d..5b787d4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "djockey", - "version": "0.0.4", + "version": "0.1.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "djockey", - "version": "0.0.4", + "version": "0.1.1", "license": "MIT", "dependencies": { "@djot/djot": "^0.3.1", @@ -24,6 +24,7 @@ "djockey": "dist/cli.js" }, "devDependencies": { + "@djockey/linkmapper-typedoc": "^0.0.5", "@jest/globals": "^29.7.0", "@types/argparse": "^2.0.16", "@types/d3": "^7.4.3", @@ -636,6 +637,22 @@ "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz", "integrity": "sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==" }, + "node_modules/@djockey/linkmapper-typedoc": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/@djockey/linkmapper-typedoc/-/linkmapper-typedoc-0.0.5.tgz", + "integrity": "sha512-xy6sZ5gKTv08I2WPeMTaZ2/E77+Lzl0wr3+BTDPYYLruRA46lkq5eEMN6kmDux7ZaBqdNyKdkYa9UufS3l8mKg==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1", + "typedoc": "^0.26.6" + }, + "bin": { + "linkmapper-typedoc": "index.js" + }, + "peerDependencies": { + "typescript": "^5.0.0" + } + }, "node_modules/@djot/djot": { "version": "0.3.1", "license": "MIT", diff --git a/yarn.lock b/yarn.lock index e045e19..e90d0ce 100644 --- a/yarn.lock +++ b/yarn.lock @@ -413,9 +413,9 @@ __metadata: languageName: node linkType: hard -"@djockey/linkmapper-typedoc@npm:^0.0.3": - version: 0.0.3 - resolution: "@djockey/linkmapper-typedoc@npm:0.0.3" +"@djockey/linkmapper-typedoc@npm:^0.0.5": + version: 0.0.5 + resolution: "@djockey/linkmapper-typedoc@npm:0.0.5" dependencies: argparse: ^2.0.1 typedoc: ^0.26.6 @@ -423,7 +423,7 @@ __metadata: typescript: ^5.0.0 bin: linkmapper-typedoc: index.js - checksum: 78ff72166def7b91b12e1f8ff4468bc92a98d0aec2d10120083ca3db245f3d3123ec46b9f08bacbd6fb31e977d195a9b3ef9c059eaa2100532bbe1b6457e9d70 + checksum: cb415e257f25ad6c34b147c0780ae358a04f626fa3f3be503ca066a4bd771e73891c13f7014b02e01ec95dec7f63e270ef862aaf63c1731c6eeca4fff63842f8 languageName: node linkType: hard @@ -2460,7 +2460,7 @@ __metadata: version: 0.0.0-use.local resolution: "djockey@workspace:." dependencies: - "@djockey/linkmapper-typedoc": ^0.0.3 + "@djockey/linkmapper-typedoc": ^0.0.5 "@djot/djot": ^0.3.1 "@jest/globals": ^29.7.0 "@types/argparse": ^2.0.16