@dogsbay/format-hugo 0.2.0-beta.101
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/builtins.d.ts +12 -0
- package/dist/builtins.d.ts.map +1 -0
- package/dist/builtins.js +207 -0
- package/dist/builtins.js.map +1 -0
- package/dist/cli.d.ts +33 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +190 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +72 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +191 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/kubernetes.d.ts +14 -0
- package/dist/kubernetes.d.ts.map +1 -0
- package/dist/kubernetes.js +186 -0
- package/dist/kubernetes.js.map +1 -0
- package/dist/nav.d.ts +88 -0
- package/dist/nav.d.ts.map +1 -0
- package/dist/nav.js +381 -0
- package/dist/nav.js.map +1 -0
- package/dist/registry.d.ts +79 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +41 -0
- package/dist/registry.js.map +1 -0
- package/dist/resolve.d.ts +26 -0
- package/dist/resolve.d.ts.map +1 -0
- package/dist/resolve.js +81 -0
- package/dist/resolve.js.map +1 -0
- package/dist/shortcodes.d.ts +66 -0
- package/dist/shortcodes.d.ts.map +1 -0
- package/dist/shortcodes.js +216 -0
- package/dist/shortcodes.js.map +1 -0
- package/dist/translate.d.ts +19 -0
- package/dist/translate.d.ts.map +1 -0
- package/dist/translate.js +99 -0
- package/dist/translate.js.map +1 -0
- package/package.json +39 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hugo builtin + Docsy theme shortcodes.
|
|
3
|
+
*
|
|
4
|
+
* Every mapping here is evidence-backed: the counts in the comments are
|
|
5
|
+
* measured occurrences in `kubernetes/website/content/en`. A shortcode whose
|
|
6
|
+
* semantics could not be verified from real content is deliberately NOT mapped
|
|
7
|
+
* — an unmapped shortcode is preserved verbatim with a ledger entry, which is
|
|
8
|
+
* honest, whereas a guessed mapping silently misrepresents the source.
|
|
9
|
+
*/
|
|
10
|
+
import { type ShortcodeRegistry } from "./registry.js";
|
|
11
|
+
export declare const BUILTIN_SHORTCODES: ShortcodeRegistry;
|
|
12
|
+
//# sourceMappingURL=builtins.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builtins.d.ts","sourceRoot":"","sources":["../src/builtins.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAA6B,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAgBlF,eAAO,MAAM,kBAAkB,EAAE,iBAuMhC,CAAC"}
|
package/dist/builtins.js
ADDED
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hugo builtin + Docsy theme shortcodes.
|
|
3
|
+
*
|
|
4
|
+
* Every mapping here is evidence-backed: the counts in the comments are
|
|
5
|
+
* measured occurrences in `kubernetes/website/content/en`. A shortcode whose
|
|
6
|
+
* semantics could not be verified from real content is deliberately NOT mapped
|
|
7
|
+
* — an unmapped shortcode is preserved verbatim with a ledger entry, which is
|
|
8
|
+
* honest, whereas a guessed mapping silently misrepresents the source.
|
|
9
|
+
*/
|
|
10
|
+
import { arg, attrBlock, directive } from "./registry.js";
|
|
11
|
+
import { lookupParam } from "./config.js";
|
|
12
|
+
import { looksLikeFile } from "./resolve.js";
|
|
13
|
+
/** Docsy `alert` colours → Dogsbay callout types. */
|
|
14
|
+
const ALERT_COLOURS = {
|
|
15
|
+
primary: "info",
|
|
16
|
+
secondary: "note",
|
|
17
|
+
info: "info",
|
|
18
|
+
success: "success",
|
|
19
|
+
warning: "warning",
|
|
20
|
+
danger: "danger",
|
|
21
|
+
dark: "note",
|
|
22
|
+
light: "note",
|
|
23
|
+
};
|
|
24
|
+
export const BUILTIN_SHORTCODES = {
|
|
25
|
+
// ── Hugo builtins ───────────────────────────────────────
|
|
26
|
+
//
|
|
27
|
+
// `{{< highlight go "linenos=table" >}}` — a code block with a language and
|
|
28
|
+
// Chroma options. 29 uses. The options are Chroma-specific and have no
|
|
29
|
+
// Dogsbay equivalent, so they are recorded rather than guessed at.
|
|
30
|
+
highlight: (node, ctx) => {
|
|
31
|
+
const lang = node.args.positional[0] ?? "";
|
|
32
|
+
const options = node.args.positional.slice(1).join(" ");
|
|
33
|
+
if (options) {
|
|
34
|
+
ctx.report({
|
|
35
|
+
shortcode: "highlight",
|
|
36
|
+
action: "degraded",
|
|
37
|
+
note: `Chroma options dropped (${options}) — no equivalent outside Hugo`,
|
|
38
|
+
line: node.line,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
const body = node.inner.replace(/^\n+|\n+$/g, "");
|
|
42
|
+
const fence = "`".repeat(Math.max(3, ...[...body.matchAll(/`{3,}/g)].map((m) => m[0].length + 1)));
|
|
43
|
+
return `${fence}${lang}\n${body}\n${fence}`;
|
|
44
|
+
},
|
|
45
|
+
// `{{< figure src="x.png" alt="…" caption="…" >}}` — 232 uses.
|
|
46
|
+
figure: (node) => {
|
|
47
|
+
const src = arg(node.args, "src") ?? "";
|
|
48
|
+
const alt = node.args.named.alt ?? node.args.named.title ?? "";
|
|
49
|
+
const caption = node.args.named.caption;
|
|
50
|
+
const image = ``;
|
|
51
|
+
return caption ? directive("figure", attrBlock({ caption }), image) : image;
|
|
52
|
+
},
|
|
53
|
+
// `{{< youtube dQw4w9WgXcQ >}}` — 15 uses. `id=` is also accepted.
|
|
54
|
+
youtube: (node) => {
|
|
55
|
+
const id = arg(node.args, "id") ?? "";
|
|
56
|
+
return id ? directive("youtube", attrBlock({ id }), "") : null;
|
|
57
|
+
},
|
|
58
|
+
// `{{< param "version" >}}` / `{{< param version.next >}}` — 120 uses.
|
|
59
|
+
// Substitutes from site params. An unresolved param must be RECORDED, never
|
|
60
|
+
// written out as the string "undefined".
|
|
61
|
+
param: (node, ctx) => {
|
|
62
|
+
const key = arg(node.args, "name") ?? "";
|
|
63
|
+
const value = lookupParam(ctx.config.params, key);
|
|
64
|
+
if (value === undefined) {
|
|
65
|
+
ctx.report({
|
|
66
|
+
shortcode: "param",
|
|
67
|
+
action: "degraded",
|
|
68
|
+
note: `site param "${key}" is not defined in the Hugo config — substituted as empty`,
|
|
69
|
+
line: node.line,
|
|
70
|
+
});
|
|
71
|
+
return "";
|
|
72
|
+
}
|
|
73
|
+
return value;
|
|
74
|
+
},
|
|
75
|
+
// `{{< ref "docs/concepts/_index.md" >}}` — 2570 uses, by far the most
|
|
76
|
+
// common shortcode in the corpus. It resolves a page reference to its URL.
|
|
77
|
+
// Unresolved, every one of these becomes a broken link, so the resolver is
|
|
78
|
+
// wired from the page set rather than guessed from the path.
|
|
79
|
+
ref: (node, ctx) => {
|
|
80
|
+
const target = arg(node.args, "path") ?? "";
|
|
81
|
+
const href = ctx.resolveRef?.(target, ctx.file);
|
|
82
|
+
if (href !== undefined)
|
|
83
|
+
return href;
|
|
84
|
+
ctx.report({
|
|
85
|
+
shortcode: "ref",
|
|
86
|
+
action: "degraded",
|
|
87
|
+
note: `could not resolve reference "${target}" — emitted as a relative path`,
|
|
88
|
+
line: node.line,
|
|
89
|
+
});
|
|
90
|
+
// Better a path than nothing: the link still points somewhere plausible
|
|
91
|
+
// and a link checker can find it.
|
|
92
|
+
return `/${target.replace(/^\//, "").replace(/(?:\/_?index)?\.md$/, "")}`;
|
|
93
|
+
},
|
|
94
|
+
// `{{< relref "other.md" >}}` — 13 uses. Same resolution, relative result.
|
|
95
|
+
relref: (node, ctx) => {
|
|
96
|
+
const target = arg(node.args, "path") ?? "";
|
|
97
|
+
const href = ctx.resolveRef?.(target, ctx.file);
|
|
98
|
+
if (href !== undefined)
|
|
99
|
+
return href;
|
|
100
|
+
ctx.report({
|
|
101
|
+
shortcode: "relref",
|
|
102
|
+
action: "degraded",
|
|
103
|
+
note: `could not resolve reference "${target}" — emitted as a relative path`,
|
|
104
|
+
line: node.line,
|
|
105
|
+
});
|
|
106
|
+
return target.replace(/(?:\/_?index)?\.md$/, "");
|
|
107
|
+
},
|
|
108
|
+
// ── Callouts ────────────────────────────────────────────
|
|
109
|
+
//
|
|
110
|
+
// Hugo/Docsy sites all grow the same three, and Kubernetes uses them 1,071
|
|
111
|
+
// times between them. The body may be markdown (`{{% note %}}`) or raw
|
|
112
|
+
// (`{{< note >}}`); either way it is content and gets translated.
|
|
113
|
+
note: (node, ctx) => directive("note", "", ctx.translate(node.inner)),
|
|
114
|
+
caution: (node, ctx) => directive("caution", "", ctx.translate(node.inner)),
|
|
115
|
+
warning: (node, ctx) => directive("warning", "", ctx.translate(node.inner)),
|
|
116
|
+
// Docsy's own callout. 91 uses. `color=` selects the variant and `title=`
|
|
117
|
+
// is a heading on the box.
|
|
118
|
+
alert: (node, ctx) => {
|
|
119
|
+
const colour = (node.args.named.color ?? "").toLowerCase();
|
|
120
|
+
const type = ALERT_COLOURS[colour] ?? "note";
|
|
121
|
+
if (colour && !ALERT_COLOURS[colour]) {
|
|
122
|
+
ctx.report({
|
|
123
|
+
shortcode: "alert",
|
|
124
|
+
action: "degraded",
|
|
125
|
+
note: `unknown alert colour "${colour}" → :::note`,
|
|
126
|
+
line: node.line,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
return directive(type, attrBlock({ title: node.args.named.title }), ctx.translate(node.inner));
|
|
130
|
+
},
|
|
131
|
+
// Docsy `pageinfo` — a page-level banner. Same shape as an alert.
|
|
132
|
+
pageinfo: (node, ctx) => directive(ALERT_COLOURS[(node.args.named.color ?? "").toLowerCase()] ?? "info", "", ctx.translate(node.inner)),
|
|
133
|
+
// ── Tabs ────────────────────────────────────────────────
|
|
134
|
+
//
|
|
135
|
+
// `{{< tabs name="x" >}}` wrapping `{{% tab name="Linux" %}}`. 117 groups,
|
|
136
|
+
// 287 tabs. Note the delimiter mix: the wrapper is angle, the tabs are
|
|
137
|
+
// percent, which is exactly why the scanner has to handle both.
|
|
138
|
+
tabs: (node, ctx) => directive("tabs", "", ctx.translate(node.inner)),
|
|
139
|
+
tab: (node, ctx) => {
|
|
140
|
+
const title = arg(node.args, "name", "header", "title") ?? "";
|
|
141
|
+
// `{{< tab name="x" include="file.md" />}}` — the kubeadm reference pages
|
|
142
|
+
// use this 118 times to pull in generated content.
|
|
143
|
+
// `include=` is not always a path: `{{< feature-gate-table include="alpha,beta" >}}`
|
|
144
|
+
// uses the same attribute name as a FILTER, and treating that as a file
|
|
145
|
+
// produced a guaranteed-failing read plus a misleading ledger entry.
|
|
146
|
+
const include = node.args.named.include;
|
|
147
|
+
if (looksLikeFile(include)) {
|
|
148
|
+
const content = ctx.readContentFile?.(include, ctx.file);
|
|
149
|
+
if (content !== undefined) {
|
|
150
|
+
return directive("tab", attrBlock({ title }), ctx.translate(content));
|
|
151
|
+
}
|
|
152
|
+
ctx.report({
|
|
153
|
+
shortcode: "tab",
|
|
154
|
+
action: "degraded",
|
|
155
|
+
note: `could not read included file "${include}" — tab is empty`,
|
|
156
|
+
line: node.line,
|
|
157
|
+
});
|
|
158
|
+
return directive("tab", attrBlock({ title }), "");
|
|
159
|
+
}
|
|
160
|
+
return directive("tab", attrBlock({ title }), ctx.translate(node.inner));
|
|
161
|
+
},
|
|
162
|
+
// Docsy's newer tab syntax.
|
|
163
|
+
tabpane: (node, ctx) => directive("tabs", "", ctx.translate(node.inner)),
|
|
164
|
+
"tab-pane": (node, ctx) => directive("tab", attrBlock({ title: arg(node.args, "header", "title", "name") }), ctx.translate(node.inner)),
|
|
165
|
+
// ── Other block constructs ──────────────────────────────
|
|
166
|
+
//
|
|
167
|
+
// 53 uses. A mermaid diagram is a code block with a `mermaid` language
|
|
168
|
+
// everywhere outside Hugo.
|
|
169
|
+
mermaid: (node) => {
|
|
170
|
+
const body = node.inner.replace(/^\n+|\n+$/g, "");
|
|
171
|
+
return `\`\`\`mermaid\n${body}\n\`\`\``;
|
|
172
|
+
},
|
|
173
|
+
// 59 uses. `{{< table caption="…" >}}` wraps a markdown table to caption it.
|
|
174
|
+
table: (node, ctx) => {
|
|
175
|
+
const caption = node.args.named.caption;
|
|
176
|
+
const body = ctx.translate(node.inner).replace(/^\n+|\n+$/g, "");
|
|
177
|
+
// Dogsbay-MD captions a table with a trailing `{caption}` line.
|
|
178
|
+
return caption ? `${body}\n{${caption}}` : body;
|
|
179
|
+
},
|
|
180
|
+
// `{{< include "file.md" >}}` — 171 uses. Pulls in another content file.
|
|
181
|
+
include: (node, ctx) => {
|
|
182
|
+
const target = arg(node.args, "file", "path") ?? "";
|
|
183
|
+
const content = ctx.readContentFile?.(target, ctx.file);
|
|
184
|
+
if (content === undefined) {
|
|
185
|
+
ctx.report({
|
|
186
|
+
shortcode: "include",
|
|
187
|
+
action: "degraded",
|
|
188
|
+
note: `could not read included file "${target}"`,
|
|
189
|
+
line: node.line,
|
|
190
|
+
});
|
|
191
|
+
return "";
|
|
192
|
+
}
|
|
193
|
+
return ctx.translate(content);
|
|
194
|
+
},
|
|
195
|
+
// 12 uses. An author note that never renders — dropping it is correct, and
|
|
196
|
+
// recording the drop is what makes it not-silent.
|
|
197
|
+
comment: (node, ctx) => {
|
|
198
|
+
ctx.report({
|
|
199
|
+
shortcode: "comment",
|
|
200
|
+
action: "stripped",
|
|
201
|
+
note: "author comment — not rendered by Hugo either",
|
|
202
|
+
line: node.line,
|
|
203
|
+
});
|
|
204
|
+
return null;
|
|
205
|
+
},
|
|
206
|
+
};
|
|
207
|
+
//# sourceMappingURL=builtins.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builtins.js","sourceRoot":"","sources":["../src/builtins.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { FormatPlugin, ExportPage, NavItem } from "@dogsbay/types";
|
|
2
|
+
import type { HugoLedgerEntry } from "./registry.js";
|
|
3
|
+
export interface HugoImportResult {
|
|
4
|
+
pages: ExportPage[];
|
|
5
|
+
nav: NavItem[];
|
|
6
|
+
/** What could not be carried across, per shortcode. */
|
|
7
|
+
ledger: HugoLedgerEntry[];
|
|
8
|
+
/** Site title from the Hugo config, when it declared one. */
|
|
9
|
+
siteTitle?: string;
|
|
10
|
+
/** Languages the site declares — the choices for `--lang`. */
|
|
11
|
+
languages: string[];
|
|
12
|
+
/**
|
|
13
|
+
* Absolute directory the page slugs are relative to: the content dir,
|
|
14
|
+
* narrowed by `--lang` and `--section`. Recomputing it from the config
|
|
15
|
+
* alone drops both narrowings and resolves includes to the wrong file.
|
|
16
|
+
*/
|
|
17
|
+
contentRoot: string;
|
|
18
|
+
/** Docs roots to mirror non-`.md` assets from (dir + slug prefix). */
|
|
19
|
+
assetRoots: {
|
|
20
|
+
dir: string;
|
|
21
|
+
prefix: string;
|
|
22
|
+
}[];
|
|
23
|
+
}
|
|
24
|
+
export declare function importHugo(source: string, opts: Record<string, unknown>): Promise<HugoImportResult>;
|
|
25
|
+
/** Group the ledger for a human-readable report. */
|
|
26
|
+
export declare function summariseHugoLedger(ledger: HugoLedgerEntry[]): Array<{
|
|
27
|
+
shortcode: string;
|
|
28
|
+
action: string;
|
|
29
|
+
count: number;
|
|
30
|
+
note?: string;
|
|
31
|
+
}>;
|
|
32
|
+
export declare const plugin: FormatPlugin;
|
|
33
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAMxE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,GAAG,EAAE,OAAO,EAAE,CAAC;IACf,uDAAuD;IACvD,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8DAA8D;IAC9D,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB;;;;OAIG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,UAAU,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC/C;AAED,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,gBAAgB,CAAC,CA2I3B;AAED,oDAAoD;AACpD,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,eAAe,EAAE,GACxB,KAAK,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAS5E;AAED,eAAO,MAAM,MAAM,EAAE,YAyBpB,CAAC"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FormatPlugin for Hugo as a source format.
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates: detect site → load config → collect pages → build nav and the
|
|
5
|
+
* ref resolver from the page set → translate each page → parse to TreeNode.
|
|
6
|
+
*
|
|
7
|
+
* The ref resolver has to exist BEFORE any page is translated, because
|
|
8
|
+
* `{{< ref >}}` is the most common shortcode in a real Hugo corpus (2,570 uses
|
|
9
|
+
* on kubernetes/website) and resolving it needs the whole page set. That is
|
|
10
|
+
* why this is two passes, not one.
|
|
11
|
+
*/
|
|
12
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
13
|
+
import { join, resolve } from "node:path";
|
|
14
|
+
import { dogsbayMdToTree, extractHeadings } from "@dogsbay/format-dogsbay-md";
|
|
15
|
+
import { detectHugo, loadHugoConfig, contentDirFor } from "./config.js";
|
|
16
|
+
import { collectHugoPages, buildHugoNav, makeRefResolver, splitFrontmatter } from "./nav.js";
|
|
17
|
+
import { makeContentResolver } from "./resolve.js";
|
|
18
|
+
import { translateHugo } from "./translate.js";
|
|
19
|
+
export async function importHugo(source, opts) {
|
|
20
|
+
if (!existsSync(source)) {
|
|
21
|
+
throw new Error(`Source directory not found: ${source}`);
|
|
22
|
+
}
|
|
23
|
+
const config = loadHugoConfig(source);
|
|
24
|
+
if (config.parseErrors.length > 0) {
|
|
25
|
+
// Not fatal, but never silent: params feed `{{< param >}}` and
|
|
26
|
+
// `{{< skew >}}`, so a config we fell back on turns those into nothing.
|
|
27
|
+
for (const e of config.parseErrors) {
|
|
28
|
+
console.warn(` warning: could not parse ${e.file} — ${e.message}`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
const lang = typeof opts.lang === "string" ? opts.lang : undefined;
|
|
32
|
+
const section = typeof opts.section === "string" ? opts.section.replace(/^\/+|\/+$/g, "") : undefined;
|
|
33
|
+
const hrefPrefix = typeof opts.hrefPrefix === "string" ? opts.hrefPrefix : "";
|
|
34
|
+
const langRoot = resolve(source, contentDirFor(config, lang));
|
|
35
|
+
// `--section docs` imports one subtree. On a site like kubernetes the blog
|
|
36
|
+
// is ~1,500 dated pages that Hugo renders through a SEPARATE layout, so
|
|
37
|
+
// pulling everything into one docs sidebar is faithful to the file tree and
|
|
38
|
+
// useless to a reader.
|
|
39
|
+
const contentRoot = section ? resolve(langRoot, section) : langRoot;
|
|
40
|
+
if (!existsSync(contentRoot)) {
|
|
41
|
+
const choices = config.languages.map((l) => l.code).join(", ");
|
|
42
|
+
throw new Error(`Content directory not found: ${contentRoot}` +
|
|
43
|
+
(section ? `\n(--section ${section} resolved against ${langRoot})` : "") +
|
|
44
|
+
(choices ? `\nDeclared languages: ${choices}` : ""));
|
|
45
|
+
}
|
|
46
|
+
// PASS 1 — the page set. Nav and ref resolution both need all of it before
|
|
47
|
+
// any page can be translated.
|
|
48
|
+
const hugoPages = collectHugoPages(contentRoot, config.permalinks, config.sectionPermalinks);
|
|
49
|
+
const nav = buildHugoNav(hugoPages, hrefPrefix);
|
|
50
|
+
const resolveRef = makeRefResolver(hugoPages, hrefPrefix);
|
|
51
|
+
const readContentFile = makeContentResolver({ contentRoot });
|
|
52
|
+
// PASS 2 — translate and parse.
|
|
53
|
+
const ledger = [];
|
|
54
|
+
const pages = [];
|
|
55
|
+
const seen = new Set();
|
|
56
|
+
for (const page of hugoPages) {
|
|
57
|
+
if (page.hidden && opts.includeDrafts !== true)
|
|
58
|
+
continue;
|
|
59
|
+
// An `.html` content page is a Go template, not markdown. It is still a
|
|
60
|
+
// page — it has a title, a slug and a place in the nav — so it is emitted
|
|
61
|
+
// as a stub and RECORDED, rather than skipped. Skipping left kubernetes
|
|
62
|
+
// with no home page at all (its home is `content/en/_index.html`) and the
|
|
63
|
+
// site root redirecting to whatever sorted first.
|
|
64
|
+
if (page.unrenderable) {
|
|
65
|
+
ledger.push({
|
|
66
|
+
shortcode: "(page)",
|
|
67
|
+
action: "degraded",
|
|
68
|
+
note: `${page.rel} is an HTML content page (Go template, no markdown) — emitted as a titled stub`,
|
|
69
|
+
line: 0,
|
|
70
|
+
file: page.rel,
|
|
71
|
+
});
|
|
72
|
+
pages.push({
|
|
73
|
+
slug: page.slug,
|
|
74
|
+
title: page.title,
|
|
75
|
+
tree: [],
|
|
76
|
+
headings: [],
|
|
77
|
+
frontmatter: page.frontmatter,
|
|
78
|
+
});
|
|
79
|
+
seen.add(page.slug);
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
const source_ = readFileSync(page.file, "utf-8");
|
|
83
|
+
const { body } = splitFrontmatter(source_);
|
|
84
|
+
const { markdown, ledger: entries } = translateHugo(body, {
|
|
85
|
+
config,
|
|
86
|
+
file: page.rel,
|
|
87
|
+
resolveRef,
|
|
88
|
+
readContentFile,
|
|
89
|
+
kubernetes: opts.kubernetes !== false,
|
|
90
|
+
});
|
|
91
|
+
ledger.push(...entries);
|
|
92
|
+
let tree;
|
|
93
|
+
try {
|
|
94
|
+
({ tree } = dogsbayMdToTree(markdown));
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
// A page that will not parse must be REPORTED, not dropped: it is the
|
|
98
|
+
// one failure mode a page count cannot show.
|
|
99
|
+
ledger.push({
|
|
100
|
+
shortcode: "(page)",
|
|
101
|
+
action: "degraded",
|
|
102
|
+
note: `could not parse the translated markdown — ${err instanceof Error ? err.message : String(err)}`,
|
|
103
|
+
line: 0,
|
|
104
|
+
file: page.rel,
|
|
105
|
+
});
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
// Two source files can resolve to one slug (a `url:` override colliding
|
|
109
|
+
// with a real path). Silently overwriting one with the other loses a page.
|
|
110
|
+
let slug = page.slug;
|
|
111
|
+
if (seen.has(slug)) {
|
|
112
|
+
let n = 2;
|
|
113
|
+
while (seen.has(`${slug}-${n}`))
|
|
114
|
+
n++;
|
|
115
|
+
ledger.push({
|
|
116
|
+
shortcode: "(page)",
|
|
117
|
+
action: "degraded",
|
|
118
|
+
note: `slug "${slug}" is claimed by more than one source file — emitted as "${slug}-${n}"`,
|
|
119
|
+
line: 0,
|
|
120
|
+
file: page.rel,
|
|
121
|
+
});
|
|
122
|
+
slug = `${slug}-${n}`;
|
|
123
|
+
}
|
|
124
|
+
seen.add(slug);
|
|
125
|
+
pages.push({
|
|
126
|
+
slug,
|
|
127
|
+
title: page.title,
|
|
128
|
+
tree,
|
|
129
|
+
headings: extractHeadings(tree),
|
|
130
|
+
frontmatter: page.frontmatter,
|
|
131
|
+
// Include fragments are emitted so their text is not lost, but marked so
|
|
132
|
+
// the CLI writes them as include targets rather than routable pages.
|
|
133
|
+
...(page.fragment ? { fragment: true } : {}),
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
return {
|
|
137
|
+
pages,
|
|
138
|
+
nav,
|
|
139
|
+
ledger,
|
|
140
|
+
// The root slugs are relative to — `content/`, narrowed by `--lang` and
|
|
141
|
+
// `--section`. Callers must use THIS, not recompute it: an include
|
|
142
|
+
// resolved against a recomputed `content/` while the pages came from
|
|
143
|
+
// `content/docs/` silently found a DIFFERENT file of the same name.
|
|
144
|
+
contentRoot,
|
|
145
|
+
siteTitle: config.title,
|
|
146
|
+
languages: config.languages.map((l) => l.code),
|
|
147
|
+
assetRoots: [{ dir: contentRoot, prefix: "" }],
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
/** Group the ledger for a human-readable report. */
|
|
151
|
+
export function summariseHugoLedger(ledger) {
|
|
152
|
+
const rows = new Map();
|
|
153
|
+
for (const entry of ledger) {
|
|
154
|
+
const key = `${entry.shortcode}\t${entry.action}`;
|
|
155
|
+
const row = rows.get(key);
|
|
156
|
+
if (row)
|
|
157
|
+
row.count++;
|
|
158
|
+
else
|
|
159
|
+
rows.set(key, { shortcode: entry.shortcode, action: entry.action, count: 1, note: entry.note });
|
|
160
|
+
}
|
|
161
|
+
return [...rows.values()].sort((a, b) => b.count - a.count);
|
|
162
|
+
}
|
|
163
|
+
export const plugin = {
|
|
164
|
+
name: "hugo",
|
|
165
|
+
canImport: true,
|
|
166
|
+
canExport: false,
|
|
167
|
+
detectSource: (path) => {
|
|
168
|
+
if (!detectHugo(path))
|
|
169
|
+
return false;
|
|
170
|
+
// A Hugo site must also have content; a bare `hugo.toml` in a tools repo
|
|
171
|
+
// is not a docs corpus.
|
|
172
|
+
const config = loadHugoConfig(path);
|
|
173
|
+
return existsSync(join(path, config.contentDir)) || existsSync(join(path, "content"));
|
|
174
|
+
},
|
|
175
|
+
importOptions: [
|
|
176
|
+
{ flags: "--lang <code>", description: "language directory to import (multilingual sites)" },
|
|
177
|
+
{ flags: "--section <path>", description: "import only this subtree, e.g. docs" },
|
|
178
|
+
{ flags: "--include-drafts", description: "import pages marked draft/headless" },
|
|
179
|
+
{ flags: "--no-kubernetes", description: "disable the kubernetes.io shortcode layer" },
|
|
180
|
+
],
|
|
181
|
+
async import(source, opts) {
|
|
182
|
+
const result = await importHugo(source, opts);
|
|
183
|
+
return {
|
|
184
|
+
pages: result.pages,
|
|
185
|
+
nav: result.nav,
|
|
186
|
+
contentRoot: result.contentRoot,
|
|
187
|
+
};
|
|
188
|
+
},
|
|
189
|
+
};
|
|
190
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
export interface HugoLanguage {
|
|
2
|
+
code: string;
|
|
3
|
+
/** Content directory for this language, relative to the site root. */
|
|
4
|
+
contentDir: string;
|
|
5
|
+
title?: string;
|
|
6
|
+
weight?: number;
|
|
7
|
+
}
|
|
8
|
+
export interface HugoConfig {
|
|
9
|
+
title?: string;
|
|
10
|
+
baseURL?: string;
|
|
11
|
+
/** Default content directory, relative to the site root. */
|
|
12
|
+
contentDir: string;
|
|
13
|
+
/** Site params — the substitution source for `{{< param >}}` / `{{< skew >}}`. */
|
|
14
|
+
params: Record<string, unknown>;
|
|
15
|
+
/** Declared languages, empty when the site is monolingual. */
|
|
16
|
+
languages: HugoLanguage[];
|
|
17
|
+
/** Theme names, in order. `docsy` here is what selects the Docsy mappings. */
|
|
18
|
+
themes: string[];
|
|
19
|
+
/**
|
|
20
|
+
* `[permalinks]` — per-section URL patterns.
|
|
21
|
+
*
|
|
22
|
+
* NOT cosmetic. kubernetes maps `blog = "/:section/:year/:month/:day/:slug/"`,
|
|
23
|
+
* so `blog/_posts/2018/coredns-ga.md` is served at
|
|
24
|
+
* `/blog/2018/07/10/coredns-ga/` and the `_posts/2018` directories never
|
|
25
|
+
* appear in the URL at all. Ignoring this produced slugs containing
|
|
26
|
+
* `_posts`, which Docusaurus then refused entirely — it reserves a leading
|
|
27
|
+
* `_` for partials — and the build failed on 400+ "sidebar document ids do
|
|
28
|
+
* not exist".
|
|
29
|
+
*/
|
|
30
|
+
permalinks: Record<string, string>;
|
|
31
|
+
/**
|
|
32
|
+
* `[permalinks.section]` — patterns for SECTION pages (`_index.md`).
|
|
33
|
+
*
|
|
34
|
+
* Kept separate because Hugo keeps them separate, and conflating them is a
|
|
35
|
+
* real bug: kubernetes declares only `[permalinks.page]`, so applying its
|
|
36
|
+
* blog pattern to `blog/_index.md` turned the section's own slug into
|
|
37
|
+
* `blog/blog` and dropped "Blog" to the bottom of the nav.
|
|
38
|
+
*/
|
|
39
|
+
sectionPermalinks: Record<string, string>;
|
|
40
|
+
/** Files the config was assembled from, for diagnostics. */
|
|
41
|
+
sources: string[];
|
|
42
|
+
/**
|
|
43
|
+
* Configs that could not be parsed, with the reason.
|
|
44
|
+
*
|
|
45
|
+
* This must be SURFACED, not swallowed: `{{< param >}}` and `{{< skew >}}`
|
|
46
|
+
* substitute from `[params]`, so a config we silently fall back on turns
|
|
47
|
+
* hundreds of content substitutions into nothing while the import reports
|
|
48
|
+
* success.
|
|
49
|
+
*/
|
|
50
|
+
parseErrors: Array<{
|
|
51
|
+
file: string;
|
|
52
|
+
message: string;
|
|
53
|
+
}>;
|
|
54
|
+
}
|
|
55
|
+
/** Detect whether a directory looks like a Hugo site. */
|
|
56
|
+
export declare function detectHugo(dir: string): boolean;
|
|
57
|
+
export declare function loadHugoConfig(dir: string): HugoConfig;
|
|
58
|
+
/**
|
|
59
|
+
* Resolve a dotted param path against the site params, the way
|
|
60
|
+
* `{{< param "version.next" >}}` does. Returns undefined when absent, so the
|
|
61
|
+
* caller can record the unresolved reference rather than emitting "undefined".
|
|
62
|
+
*/
|
|
63
|
+
export declare function lookupParam(params: Record<string, unknown>, path: string): string | undefined;
|
|
64
|
+
/**
|
|
65
|
+
* The content directory to import for a given language.
|
|
66
|
+
*
|
|
67
|
+
* A multilingual Hugo site keeps one directory per language
|
|
68
|
+
* (`content/en`, `content/ja`, …). Kubernetes declares 18. One language per
|
|
69
|
+
* import run: mixing them produces a page set with colliding slugs.
|
|
70
|
+
*/
|
|
71
|
+
export declare function contentDirFor(config: HugoConfig, lang?: string): string;
|
|
72
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,UAAU,EAAE,MAAM,CAAC;IACnB,kFAAkF;IAClF,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,8DAA8D;IAC9D,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,8EAA8E;IAC9E,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB;;;;;;;;;;OAUG;IACH,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC;;;;;;;OAOG;IACH,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,4DAA4D;IAC5D,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB;;;;;;;OAOG;IACH,WAAW,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACvD;AAyCD,yDAAyD;AACzD,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAQ/C;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAoFtD;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,IAAI,EAAE,MAAM,GACX,MAAM,GAAG,SAAS,CAgBpB;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAWvE"}
|