mdsvr 2.4.1 → 2.5.0
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/directory.d.ts +11 -0
- package/dist/directory.d.ts.map +1 -1
- package/dist/directory.js +31 -115
- package/dist/directory.js.map +1 -1
- package/dist/generators/feed.d.ts.map +1 -1
- package/dist/generators/feed.js +8 -1
- package/dist/generators/feed.js.map +1 -1
- package/dist/generators/search-index.d.ts.map +1 -1
- package/dist/generators/search-index.js +5 -4
- package/dist/generators/search-index.js.map +1 -1
- package/dist/generators/sitemap.js +5 -1
- package/dist/generators/sitemap.js.map +1 -1
- package/dist/generators/static-export.d.ts.map +1 -1
- package/dist/generators/static-export.js +5 -5
- package/dist/generators/static-export.js.map +1 -1
- package/dist/link-transform.d.ts +37 -5
- package/dist/link-transform.d.ts.map +1 -1
- package/dist/link-transform.js +120 -13
- package/dist/link-transform.js.map +1 -1
- package/dist/render-page.d.ts +0 -1
- package/dist/render-page.d.ts.map +1 -1
- package/dist/render-page.js +52 -34
- package/dist/render-page.js.map +1 -1
- package/dist/renderer/markdown.d.ts.map +1 -1
- package/dist/renderer/markdown.js +6 -7
- package/dist/renderer/markdown.js.map +1 -1
- package/dist/seo/extract.d.ts +4 -2
- package/dist/seo/extract.d.ts.map +1 -1
- package/dist/seo/extract.js +42 -15
- package/dist/seo/extract.js.map +1 -1
- package/dist/seo/jsonld.d.ts.map +1 -1
- package/dist/seo/jsonld.js +11 -0
- package/dist/seo/jsonld.js.map +1 -1
- package/dist/seo/metadata.d.ts +3 -0
- package/dist/seo/metadata.d.ts.map +1 -1
- package/dist/seo/metadata.js +8 -2
- package/dist/seo/metadata.js.map +1 -1
- package/dist/settings/index.d.ts.map +1 -1
- package/dist/settings/index.js +14 -0
- package/dist/settings/index.js.map +1 -1
- package/dist/settings/schema.d.ts +241 -0
- package/dist/settings/schema.d.ts.map +1 -1
- package/dist/settings/schema.js +36 -0
- package/dist/settings/schema.js.map +1 -1
- package/dist/template/analytics.d.ts +18 -0
- package/dist/template/analytics.d.ts.map +1 -0
- package/dist/template/analytics.js +83 -0
- package/dist/template/analytics.js.map +1 -0
- package/dist/template/index.d.ts.map +1 -1
- package/dist/template/index.js +45 -19
- package/dist/template/index.js.map +1 -1
- package/dist/template/search.d.ts.map +1 -1
- package/dist/template/search.js +9 -2
- package/dist/template/search.js.map +1 -1
- package/dist/template/seo.d.ts.map +1 -1
- package/dist/template/seo.js +16 -0
- package/dist/template/seo.js.map +1 -1
- package/dist/template/sidebar.d.ts.map +1 -1
- package/dist/template/sidebar.js +10 -7
- package/dist/template/sidebar.js.map +1 -1
- package/dist/validator/index.d.ts +1 -1
- package/dist/validator/index.d.ts.map +1 -1
- package/dist/validator/index.js +21 -0
- package/dist/validator/index.js.map +1 -1
- package/package.json +1 -1
package/dist/link-transform.js
CHANGED
|
@@ -1,29 +1,136 @@
|
|
|
1
|
+
import { existsSync, statSync } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { normalizeUrlPath } from "./seo/url.js";
|
|
1
4
|
function isExternalOrSpecial(url) {
|
|
5
|
+
// Anchor-only, query-only, protocol-relative, absolute URLs, and any
|
|
6
|
+
// scheme-prefixed URL (mailto:, tel:, data:, javascript:, ...) stay as-is.
|
|
7
|
+
if (url.startsWith("#") || url.startsWith("?"))
|
|
8
|
+
return true;
|
|
2
9
|
if (url.startsWith("http://") ||
|
|
3
10
|
url.startsWith("https://") ||
|
|
4
11
|
url.startsWith("//")) {
|
|
5
12
|
return true;
|
|
6
13
|
}
|
|
7
|
-
|
|
8
|
-
return /^[a-z]+:/i.test(url) && !url.startsWith("#");
|
|
14
|
+
return /^[a-z]+:/i.test(url);
|
|
9
15
|
}
|
|
10
16
|
function stripMarkdownExt(url) {
|
|
11
|
-
return url.replace(/\.(md|mdx)(
|
|
17
|
+
return url.replace(/\.(md|mdx)(?=[?#]|$)/i, "");
|
|
18
|
+
}
|
|
19
|
+
/** Split `?query`/`#anchor` suffix off a URL path. */
|
|
20
|
+
function splitUrlSuffix(url) {
|
|
21
|
+
const idx = url.search(/[?#]/);
|
|
22
|
+
if (idx === -1)
|
|
23
|
+
return { pathPart: url, suffix: "" };
|
|
24
|
+
return { pathPart: url.slice(0, idx), suffix: url.slice(idx) };
|
|
25
|
+
}
|
|
26
|
+
function decodeUrlPath(p) {
|
|
27
|
+
try {
|
|
28
|
+
return decodeURIComponent(p);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
return p;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/** Percent-encode every path segment (leading `/` is preserved). */
|
|
35
|
+
function encodeUrlPath(p) {
|
|
36
|
+
return p.split("/").map(encodeURIComponent).join("/");
|
|
37
|
+
}
|
|
38
|
+
function isWithinRoot(rootDir, absPath) {
|
|
39
|
+
const rel = path.relative(rootDir, absPath);
|
|
40
|
+
return (rel !== ".." && !rel.startsWith(`..${path.sep}`) && !path.isAbsolute(rel));
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Filesystem-backed link resolver shared by static export and `cleanUrls`
|
|
44
|
+
* serve mode, so both produce identical output.
|
|
45
|
+
*/
|
|
46
|
+
export function createLinkResolver() {
|
|
47
|
+
return (absPath) => {
|
|
48
|
+
try {
|
|
49
|
+
const st = statSync(absPath);
|
|
50
|
+
// Directories resolve to an index page or an auto-index listing
|
|
51
|
+
if (st.isDirectory())
|
|
52
|
+
return "doc";
|
|
53
|
+
return /\.(md|mdx)$/i.test(absPath) ? "doc" : "asset";
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
// Path does not exist as-is
|
|
57
|
+
}
|
|
58
|
+
if (!/\.(md|mdx)$/i.test(absPath)) {
|
|
59
|
+
if (existsSync(`${absPath}.md`) || existsSync(`${absPath}.mdx`)) {
|
|
60
|
+
return "doc";
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return "missing";
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Resolve one URL against the source file's directory and emit the canonical
|
|
68
|
+
* site-relative route. Returns the original URL when the target cannot be
|
|
69
|
+
* resolved (warnings are collected on the result instead).
|
|
70
|
+
*/
|
|
71
|
+
function rebaseUrl(url, ctx, warnings) {
|
|
72
|
+
if (isExternalOrSpecial(url))
|
|
73
|
+
return url;
|
|
74
|
+
const { pathPart, suffix } = splitUrlSuffix(url);
|
|
75
|
+
if (!pathPart)
|
|
76
|
+
return url;
|
|
77
|
+
// Candidate site-relative route (decoded so filesystem lookup works)
|
|
78
|
+
const decoded = decodeUrlPath(pathPart);
|
|
79
|
+
const route = pathPart.startsWith("/")
|
|
80
|
+
? decoded
|
|
81
|
+
: path.posix.resolve("/", ctx.sourceDirUrlPath, decoded);
|
|
82
|
+
const absPath = path.resolve(ctx.rootDir, `.${route}`);
|
|
83
|
+
if (!isWithinRoot(ctx.rootDir, absPath)) {
|
|
84
|
+
warnings.push({ url, resolvedUrlPath: route, reason: "outside-root" });
|
|
85
|
+
return url;
|
|
86
|
+
}
|
|
87
|
+
const kind = ctx.resolveFile(absPath);
|
|
88
|
+
if (kind === "doc")
|
|
89
|
+
return `${normalizeUrlPath(route)}${suffix}`;
|
|
90
|
+
if (kind === "asset")
|
|
91
|
+
return `${encodeUrlPath(route)}${suffix}`;
|
|
92
|
+
warnings.push({ url, resolvedUrlPath: route, reason: "missing" });
|
|
93
|
+
return url;
|
|
12
94
|
}
|
|
13
95
|
/**
|
|
14
96
|
* Convert .md/.mdx links to clean URLs.
|
|
15
|
-
* Source content uses GitHub-compatible .md/.mdx links; this rewrites them
|
|
16
|
-
* for outputs where clean URLs are canonical (static export, cleanUrls serve).
|
|
17
97
|
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
98
|
+
* Without a context, only `.md`/`.mdx` extensions are stripped (legacy
|
|
99
|
+
* behavior). With a `LinkTransformContext`, every relative `href`/`src` is
|
|
100
|
+
* rebased against the source file's directory and emitted as the canonical
|
|
101
|
+
* site-relative route (trailing-slash form for doc pages), which fixes
|
|
102
|
+
* relative links resolving one level too deep on exported clean-URL pages.
|
|
103
|
+
*
|
|
104
|
+
* Works on rendered HTML (`href`/`src` attributes) as well as raw markdown
|
|
105
|
+
* `[text](url)` syntax.
|
|
20
106
|
*/
|
|
21
|
-
export function convertMarkdownLinks(html) {
|
|
22
|
-
|
|
23
|
-
|
|
107
|
+
export function convertMarkdownLinks(html, ctx) {
|
|
108
|
+
const warnings = [];
|
|
109
|
+
const rewrite = (url) => {
|
|
110
|
+
if (!ctx) {
|
|
111
|
+
return isExternalOrSpecial(url) ? url : stripMarkdownExt(url);
|
|
112
|
+
}
|
|
113
|
+
return rebaseUrl(url, ctx, warnings);
|
|
114
|
+
};
|
|
115
|
+
// Rewrite HTML href/src/data-src/poster attributes
|
|
116
|
+
let result = html.replace(/(?<![\w-])(href|src|data-src|poster)="([^"]+)"/g, (match, attr, url) => {
|
|
117
|
+
const next = rewrite(url);
|
|
118
|
+
return next === url ? match : `${attr}="${next}"`;
|
|
119
|
+
});
|
|
24
120
|
// Match markdown links: [text](path) and [text](path#anchor)
|
|
25
|
-
// Also match image links:  - but we skip those
|
|
26
|
-
|
|
27
|
-
|
|
121
|
+
// Also match image links:  - but we skip those.
|
|
122
|
+
// Skip <pre>…</pre> regions: rendered code blocks may contain literal
|
|
123
|
+
// markdown-link examples that must not be rewritten.
|
|
124
|
+
const mdLinkRe = /(?<!\!)\[([^\]]+)\]\(([^)]+)\)/g;
|
|
125
|
+
result = result
|
|
126
|
+
.split(/(<pre[\s>][\s\S]*?<\/pre>)/i)
|
|
127
|
+
.map((segment) => /^<pre[\s>]/i.test(segment)
|
|
128
|
+
? segment
|
|
129
|
+
: segment.replace(mdLinkRe, (match, text, url) => {
|
|
130
|
+
const next = rewrite(url);
|
|
131
|
+
return next === url ? match : `[${text}](${next})`;
|
|
132
|
+
}))
|
|
133
|
+
.join("");
|
|
134
|
+
return { html: result, warnings };
|
|
28
135
|
}
|
|
29
136
|
//# sourceMappingURL=link-transform.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link-transform.js","sourceRoot":"","sources":["../src/link-transform.ts"],"names":[],"mappings":"AAAA,SAAS,mBAAmB,CAAC,GAAW;IACtC,IACE,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC;QACzB,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;QAC1B,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EACpB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,
|
|
1
|
+
{"version":3,"file":"link-transform.js","sourceRoot":"","sources":["../src/link-transform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AA6BhD,SAAS,mBAAmB,CAAC,GAAW;IACtC,qEAAqE;IACrE,2EAA2E;IAC3E,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5D,IACE,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC;QACzB,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;QAC1B,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EACpB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAW;IACnC,OAAO,GAAG,CAAC,OAAO,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAC;AAClD,CAAC;AAED,sDAAsD;AACtD,SAAS,cAAc,CAAC,GAAW;IACjC,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/B,IAAI,GAAG,KAAK,CAAC,CAAC;QAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACrD,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;AACjE,CAAC;AAED,SAAS,aAAa,CAAC,CAAS;IAC9B,IAAI,CAAC;QACH,OAAO,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,oEAAoE;AACpE,SAAS,aAAa,CAAC,CAAS;IAC9B,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,YAAY,CAAC,OAAe,EAAE,OAAe;IACpD,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC5C,OAAO,CACL,GAAG,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAC1E,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO,CAAC,OAAe,EAAoB,EAAE;QAC3C,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC7B,gEAAgE;YAChE,IAAI,EAAE,CAAC,WAAW,EAAE;gBAAE,OAAO,KAAK,CAAC;YACnC,OAAO,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;QACxD,CAAC;QAAC,MAAM,CAAC;YACP,4BAA4B;QAC9B,CAAC;QACD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAClC,IAAI,UAAU,CAAC,GAAG,OAAO,KAAK,CAAC,IAAI,UAAU,CAAC,GAAG,OAAO,MAAM,CAAC,EAAE,CAAC;gBAChE,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,SAAS,CAChB,GAAW,EACX,GAAyB,EACzB,QAAuB;IAEvB,IAAI,mBAAmB,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IAEzC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IACjD,IAAI,CAAC,QAAQ;QAAE,OAAO,GAAG,CAAC;IAE1B,qEAAqE;IACrE,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC;QACpC,CAAC,CAAC,OAAO;QACT,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;IAE3D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,KAAK,EAAE,CAAC,CAAC;IACvD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;QACxC,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC;QACvE,OAAO,GAAG,CAAC;IACb,CAAC;IAED,MAAM,IAAI,GAAG,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACtC,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC;IACjE,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC;IAEhE,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAClE,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,oBAAoB,CAClC,IAAY,EACZ,GAA0B;IAE1B,MAAM,QAAQ,GAAkB,EAAE,CAAC;IAEnC,MAAM,OAAO,GAAG,CAAC,GAAW,EAAU,EAAE;QACtC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;IACvC,CAAC,CAAC;IAEF,mDAAmD;IACnD,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CACvB,iDAAiD,EACjD,CAAC,KAAK,EAAE,IAAY,EAAE,GAAW,EAAE,EAAE;QACnC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC1B,OAAO,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,IAAI,GAAG,CAAC;IACpD,CAAC,CACF,CAAC;IAEF,6DAA6D;IAC7D,6DAA6D;IAC7D,sEAAsE;IACtE,qDAAqD;IACrD,MAAM,QAAQ,GAAG,iCAAiC,CAAC;IACnD,MAAM,GAAG,MAAM;SACZ,KAAK,CAAC,6BAA6B,CAAC;SACpC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CACf,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC;QACzB,CAAC,CAAC,OAAO;QACT,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,GAAW,EAAE,EAAE;YACrD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;YAC1B,OAAO,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,KAAK,IAAI,GAAG,CAAC;QACrD,CAAC,CAAC,CACP;SACA,IAAI,CAAC,EAAE,CAAC,CAAC;IAEZ,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AACpC,CAAC"}
|
package/dist/render-page.d.ts
CHANGED
|
@@ -41,5 +41,4 @@ export declare function isBlocked(ext: string, settings: Settings): boolean;
|
|
|
41
41
|
export declare function isAllowedExtension(ext: string, settings: Settings): boolean;
|
|
42
42
|
export { extractFirstHeading } from "./seo/extract.js";
|
|
43
43
|
export declare function humanizeFilename(filename: string): string;
|
|
44
|
-
export declare function fixAssetPaths(html: string, urlPath: string): string;
|
|
45
44
|
//# sourceMappingURL=render-page.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-page.d.ts","sourceRoot":"","sources":["../src/render-page.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"render-page.d.ts","sourceRoot":"","sources":["../src/render-page.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,MAAM,EACZ,MAAM,SAAS,CAAC;AAEjB,OAAO,EAGL,KAAK,OAAO,EACb,MAAM,wBAAwB,CAAC;AAOhC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEpD;;;;;GAKG;AACH,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE9C,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,QAAQ,CAAC;IACnB,IAAI,EAAE,UAAU,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,GAAG,EAAE,OAAO,EAAE,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,eAAe,GACrB,OAAO,CAAC,YAAY,CAAC,CAqDvB;AAED,MAAM,WAAW,wBAAwB;IACvC,4FAA4F;IAC5F,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,QAAQ,CAAC;IACnB,IAAI,EAAE,UAAU,CAAC;IACjB,4DAA4D;IAC5D,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IAC5C,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,wBAAwB,GAC9B,OAAO,CAAC,YAAY,CAAC,CAuDvB;AAED,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAQtE;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAElE;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAE3E;AAED,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAsDvD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMzD"}
|
package/dist/render-page.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { promises as fs } from "node:fs";
|
|
1
|
+
import { promises as fs, realpathSync as fsRealpathSync, } from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { renderMarkdown, } from "./renderer/markdown.js";
|
|
4
4
|
import { renderMdx } from "./renderer/mdx.js";
|
|
@@ -6,7 +6,7 @@ import { extractFirstHeading } from "./seo/extract.js";
|
|
|
6
6
|
import { renderPage } from "./template/index.js";
|
|
7
7
|
import { buildSidebar } from "./template/sidebar.js";
|
|
8
8
|
import { renderDirectory } from "./directory.js";
|
|
9
|
-
import { convertMarkdownLinks } from "./link-transform.js";
|
|
9
|
+
import { convertMarkdownLinks, createLinkResolver } from "./link-transform.js";
|
|
10
10
|
export async function renderPageService(input) {
|
|
11
11
|
const { sourcePath, urlPath, rootDir, settings, mode } = input;
|
|
12
12
|
const isStatic = mode === "static";
|
|
@@ -27,12 +27,11 @@ export async function renderPageService(input) {
|
|
|
27
27
|
sidebar = await buildSidebar(rootDir, urlPath, settings, isStatic);
|
|
28
28
|
}
|
|
29
29
|
let body = result.html;
|
|
30
|
-
if (isStatic) {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
body = convertMarkdownLinks(body);
|
|
30
|
+
if (isStatic || settings.generate.cleanUrls) {
|
|
31
|
+
// Rebase relative links/assets against the source file's directory and
|
|
32
|
+
// emit canonical site-relative routes (clean URLs). Dynamic serve
|
|
33
|
+
// without cleanUrls keeps .md links untouched — they resolve directly.
|
|
34
|
+
body = transformLinks(body, sourcePath, rootDir);
|
|
36
35
|
}
|
|
37
36
|
const html = renderPage({
|
|
38
37
|
title,
|
|
@@ -76,17 +75,19 @@ export async function renderDirectoryPage(input) {
|
|
|
76
75
|
? path.basename(urlPath.replace(/\/+$/, "")) || urlPath
|
|
77
76
|
: "";
|
|
78
77
|
const title = titleOverride ?? (dirName ? humanizeFilename(dirName) : "Index");
|
|
78
|
+
const description = `Directory listing for ${title}`;
|
|
79
79
|
const html = renderPage({
|
|
80
80
|
title,
|
|
81
|
-
body: renderDirectory({ urlPath, entries: entriesWithSize }),
|
|
81
|
+
body: renderDirectory({ urlPath, entries: entriesWithSize, title }),
|
|
82
82
|
filePath: urlPath,
|
|
83
83
|
settings,
|
|
84
|
+
frontmatter: { description },
|
|
84
85
|
kind: "directory",
|
|
85
86
|
urlPath,
|
|
86
87
|
sidebar,
|
|
87
88
|
isStaticExport: isStatic,
|
|
88
89
|
});
|
|
89
|
-
return { html, title, frontmatter: {}, toc: [] };
|
|
90
|
+
return { html, title, frontmatter: {}, toc: [], description };
|
|
90
91
|
}
|
|
91
92
|
export function isHidden(filename, settings) {
|
|
92
93
|
for (const pattern of settings.files.extensions.hidden) {
|
|
@@ -106,6 +107,47 @@ export function isAllowedExtension(ext, settings) {
|
|
|
106
107
|
return settings.files.extensions.serve.includes(ext);
|
|
107
108
|
}
|
|
108
109
|
export { extractFirstHeading } from "./seo/extract.js";
|
|
110
|
+
/**
|
|
111
|
+
* Rebase every relative href/src in rendered body HTML against the source
|
|
112
|
+
* file's directory, emitting canonical site-relative routes. Unresolvable
|
|
113
|
+
* links are kept as-is and logged (they surface in --validate-md too).
|
|
114
|
+
*/
|
|
115
|
+
function transformLinks(html, sourcePath, rootDir) {
|
|
116
|
+
// Resolve symlinks on both sides so path.relative works even when the
|
|
117
|
+
// caller passed a symlinked rootDir (e.g. /var → /private/var on macOS)
|
|
118
|
+
// while the router resolved the source file to its real path.
|
|
119
|
+
const realRoot = realpathSyncSafe(rootDir);
|
|
120
|
+
const realSource = realpathSyncSafe(sourcePath);
|
|
121
|
+
const relDir = path
|
|
122
|
+
.relative(realRoot, path.dirname(realSource))
|
|
123
|
+
.replace(/\\/g, "/");
|
|
124
|
+
if (relDir.startsWith("..") || path.isAbsolute(relDir)) {
|
|
125
|
+
console.warn(`[mdsvr] ${path.basename(sourcePath)}: source file is outside the docs root — links left unchanged`);
|
|
126
|
+
return html;
|
|
127
|
+
}
|
|
128
|
+
const result = convertMarkdownLinks(html, {
|
|
129
|
+
sourceDirUrlPath: relDir ? `/${relDir}` : "/",
|
|
130
|
+
rootDir,
|
|
131
|
+
resolveFile: createLinkResolver(),
|
|
132
|
+
});
|
|
133
|
+
if (result.warnings.length > 0) {
|
|
134
|
+
const relSource = path.relative(rootDir, sourcePath);
|
|
135
|
+
for (const w of result.warnings) {
|
|
136
|
+
console.warn(`[mdsvr] ${relSource}: link "${w.url}" ${w.reason === "outside-root"
|
|
137
|
+
? "resolves outside the docs root"
|
|
138
|
+
: `target not found (${w.resolvedUrlPath})`}`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return result.html;
|
|
142
|
+
}
|
|
143
|
+
function realpathSyncSafe(p) {
|
|
144
|
+
try {
|
|
145
|
+
return fsRealpathSync(p);
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
return p;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
109
151
|
export function humanizeFilename(filename) {
|
|
110
152
|
return filename
|
|
111
153
|
.replace(/^\d+\./, "")
|
|
@@ -113,28 +155,4 @@ export function humanizeFilename(filename) {
|
|
|
113
155
|
.trim()
|
|
114
156
|
.replace(/^\w/, (c) => c.toUpperCase());
|
|
115
157
|
}
|
|
116
|
-
export function fixAssetPaths(html, urlPath) {
|
|
117
|
-
// Calculate the root path for assets (everything up to the current directory)
|
|
118
|
-
const pathSegments = urlPath.split("/").filter(Boolean);
|
|
119
|
-
// Build the absolute assets path based on the current directory structure
|
|
120
|
-
let absoluteAssetsPath = "";
|
|
121
|
-
if (pathSegments.length === 0) {
|
|
122
|
-
// Root level: /assets/
|
|
123
|
-
absoluteAssetsPath = "/assets/";
|
|
124
|
-
}
|
|
125
|
-
else {
|
|
126
|
-
// Subdirectory: assets are at the root level of the project
|
|
127
|
-
// Use all segments except the last one to build the path to assets
|
|
128
|
-
// For /k8s/LFS158-docs/12/, assets should be at /k8s/LFS158-docs/assets/
|
|
129
|
-
const rootSegments = pathSegments.slice(0, -1);
|
|
130
|
-
if (rootSegments.length > 0) {
|
|
131
|
-
absoluteAssetsPath = "/" + rootSegments.join("/") + "/assets/";
|
|
132
|
-
}
|
|
133
|
-
else {
|
|
134
|
-
absoluteAssetsPath = "/assets/";
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
// Replace all relative assets/ paths with absolute paths
|
|
138
|
-
return html.replace(/(src|href|data-src|poster|content)="assets\//g, `$1="${absoluteAssetsPath}`);
|
|
139
|
-
}
|
|
140
158
|
//# sourceMappingURL=render-page.js.map
|
package/dist/render-page.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-page.js","sourceRoot":"","sources":["../src/render-page.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"render-page.js","sourceRoot":"","sources":["../src/render-page.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/renderer/markdown.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAoDrD,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,GAAG,EAAE,OAAO,EAAE,CAAC;CAChB;
|
|
1
|
+
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../src/renderer/markdown.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAoDrD,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,GAAG,EAAE,OAAO,EAAE,CAAC;CAChB;AA2GD,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,QAAQ,GACjB,cAAc,CAgBhB;AAiBD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAiE5D"}
|
|
@@ -44,7 +44,7 @@ function convertGithubCallouts(html) {
|
|
|
44
44
|
function renderCodeBlockWithToolbar(codeHtml, lang, rawCode, escapeHtml) {
|
|
45
45
|
const langClass = lang ? ` class="hljs language-${lang}"` : ' class="hljs"';
|
|
46
46
|
const escapedRaw = escapeHtml(rawCode);
|
|
47
|
-
return `<
|
|
47
|
+
return `<div class="code-block-wrapper"><div class="code-block-container" data-code="${escapedRaw}">
|
|
48
48
|
<div class="code-block-toolbar">
|
|
49
49
|
<button class="code-block-btn code-block-btn-copy" title="Copy code" aria-label="Copy code">
|
|
50
50
|
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
|
@@ -74,8 +74,7 @@ function renderCodeBlockWithToolbar(codeHtml, lang, rawCode, escapeHtml) {
|
|
|
74
74
|
</button>
|
|
75
75
|
</div>
|
|
76
76
|
<pre><code${langClass}>${codeHtml}</code></pre>
|
|
77
|
-
|
|
78
|
-
</div></pre>\n`;
|
|
77
|
+
</div></div>\n`;
|
|
79
78
|
}
|
|
80
79
|
// Create markdown-it instance with settings
|
|
81
80
|
function createMarkdownIt(settings) {
|
|
@@ -87,7 +86,7 @@ function createMarkdownIt(settings) {
|
|
|
87
86
|
// ADD: intercept mermaid blocks
|
|
88
87
|
if (lang === "mermaid") {
|
|
89
88
|
const escaped = str.trim().replace(/</g, "<").replace(/>/g, ">");
|
|
90
|
-
return `<
|
|
89
|
+
return `<div class="mermaid-wrapper"><div class="mermaid-container">
|
|
91
90
|
<div class="mermaid-toolbar">
|
|
92
91
|
<button class="mermaid-btn mermaid-btn-chart" title="Chart view"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 12c.552 0 1.005-.449.95-.998a10 10 0 0 0-8.953-8.951c-.55-.055-.998.398-.998.95v8a1 1 0 0 0 1 1z"/><path d="M21.21 15.89A10 10 0 1 1 8 2.83"/></svg></button>
|
|
93
92
|
<button class="mermaid-btn mermaid-btn-code" title="Show code"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="m18 16 4-4-4-4"/><path d="m6 8-4 4 4 4"/><path d="m14.5 4-5 16"/></svg></button>
|
|
@@ -101,7 +100,7 @@ function createMarkdownIt(settings) {
|
|
|
101
100
|
<div class="mermaid">${str.trim()}</div>
|
|
102
101
|
</div>
|
|
103
102
|
<pre class="mermaid-source"><code>${escaped}</code></pre>
|
|
104
|
-
</div></
|
|
103
|
+
</div></div>\n`;
|
|
105
104
|
}
|
|
106
105
|
// existing hljs logic — KEEP AS IS
|
|
107
106
|
if (lang && hljs.getLanguage(lang)) {
|
|
@@ -161,7 +160,7 @@ export function renderMarkdownSimple(content) {
|
|
|
161
160
|
// ADD: intercept mermaid blocks
|
|
162
161
|
if (lang === "mermaid") {
|
|
163
162
|
const escaped = str.trim().replace(/</g, "<").replace(/>/g, ">");
|
|
164
|
-
return `<
|
|
163
|
+
return `<div class="mermaid-wrapper"><div class="mermaid-container">
|
|
165
164
|
<div class="mermaid-toolbar">
|
|
166
165
|
<button class="mermaid-btn mermaid-btn-chart" title="Chart view"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 12c.552 0 1.005-.449.95-.998a10 10 0 0 0-8.953-8.951c-.55-.055-.998.398-.998.95v8a1 1 0 0 0 1 1z"/><path d="M21.21 15.89A10 10 0 1 1 8 2.83"/></svg></button>
|
|
167
166
|
<button class="mermaid-btn mermaid-btn-code" title="Show code"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="m18 16 4-4-4-4"/><path d="m6 8-4 4 4 4"/><path d="m14.5 4-5 16"/></svg></button>
|
|
@@ -175,7 +174,7 @@ export function renderMarkdownSimple(content) {
|
|
|
175
174
|
<div class="mermaid">${str.trim()}</div>
|
|
176
175
|
</div>
|
|
177
176
|
<pre class="mermaid-source"><code>${escaped}</code></pre>
|
|
178
|
-
</div></
|
|
177
|
+
</div></div>\n`;
|
|
179
178
|
}
|
|
180
179
|
// existing hljs logic — KEEP AS IS
|
|
181
180
|
if (lang && hljs.getLanguage(lang)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/renderer/markdown.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,aAAa,CAAC;AACrC,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAClD,OAAO,IAAI,MAAM,cAAc,CAAC;AAChC,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,kFAAkF;AAClF,SAAS,qBAAqB,CAAC,IAAY;IACzC,MAAM,OAAO,GAA2B;QACtC,IAAI,EAAE,MAAM;QACZ,GAAG,EAAE,KAAK;QACV,SAAS,EAAE,MAAM;QACjB,OAAO,EAAE,SAAS;QAClB,OAAO,EAAE,QAAQ;QACjB,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE,MAAM;QACZ,MAAM,EAAE,QAAQ;KACjB,CAAC;IAEF,MAAM,MAAM,GAA2B;QACrC,IAAI,EAAE,SAAS;QACf,GAAG,EAAE,QAAQ;QACb,SAAS,EAAE,aAAa;QACxB,OAAO,EAAE,YAAY;QACrB,OAAO,EAAE,YAAY;QACrB,OAAO,EAAE,WAAW;QACpB,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,WAAW;KACpB,CAAC;IAEF,0CAA0C;IAC1C,IAAI,GAAG,IAAI,CAAC,OAAO,CACjB,0HAA0H,EAC1H,CAAC,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE;QAC/B,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,MAAM,CAAC;QAC1D,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,SAAS,CAAC;QAC7D,MAAM,OAAO,GAAG,CAAC,SAAS,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAClD,OAAO,+BAA+B,WAAW,yDAAyD,YAAY,iBAAiB,OAAO,cAAc,CAAC;IAC/J,CAAC,CACF,CAAC;IAEF,iDAAiD;IACjD,IAAI,GAAG,IAAI,CAAC,OAAO,CACjB,4FAA4F,EAC5F,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;QACvB,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,MAAM,CAAC;QAC1D,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,SAAS,CAAC;QAC7D,OAAO,+BAA+B,WAAW,yDAAyD,YAAY,iBAAiB,OAAO,cAAc,CAAC;IAC/J,CAAC,CACF,CAAC;IAEF,OAAO,IAAI,CAAC;AACd,CAAC;AAeD,SAAS,0BAA0B,CACjC,QAAgB,EAChB,IAAmB,EACnB,OAAe,EACf,UAAmC;IAEnC,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,yBAAyB,IAAI,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC;IAC5E,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IACvC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/renderer/markdown.ts"],"names":[],"mappings":"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"}
|
package/dist/seo/extract.d.ts
CHANGED
|
@@ -10,8 +10,10 @@ export declare function extractFirstHeading(content: string): string | null;
|
|
|
10
10
|
/**
|
|
11
11
|
* Extract the first meaningful paragraph from markdown content
|
|
12
12
|
* (for the meta description fallback). Skips frontmatter, code blocks,
|
|
13
|
-
* headings, HTML, comments, and nav-like lines;
|
|
14
|
-
*
|
|
13
|
+
* headings, HTML, comments, and nav-like lines; drops label-only lines;
|
|
14
|
+
* requires ~40 chars of real prose (shorter paragraphs are kept only as a
|
|
15
|
+
* last resort); collapses whitespace; cuts at ~160 chars on a word
|
|
16
|
+
* boundary (hard cap 200).
|
|
15
17
|
*/
|
|
16
18
|
export declare function extractFirstParagraph(content: string): string | null;
|
|
17
19
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../src/seo/extract.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../src/seo/extract.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA+EH;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAIlE;AAkBD;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiCpE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG;IAC/C,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,CAKA"}
|
package/dist/seo/extract.js
CHANGED
|
@@ -32,6 +32,8 @@ function cleanInline(text) {
|
|
|
32
32
|
.replace(/<[^>]+>/g, "") // HTML tags
|
|
33
33
|
.replace(/(\*\*|__)(.*?)\1/g, "$2") // bold
|
|
34
34
|
.replace(/\*([^*]+)\*/g, "$1") // italic
|
|
35
|
+
// _italic_ — only at word boundaries so SNAKE_CASE identifiers survive
|
|
36
|
+
.replace(/(^|\W)_([^_]+)_(?=\W|$)/g, "$1$2")
|
|
35
37
|
.replace(/~~([^~]+)~~/g, "$1") // strikethrough
|
|
36
38
|
.replace(/`([^`]+)`/g, "$1") // inline code
|
|
37
39
|
.replace(/\s+/g, " ")
|
|
@@ -90,35 +92,60 @@ export function extractFirstHeading(content) {
|
|
|
90
92
|
const match = body.match(/^#[ \t]+(.+?)[ \t]*#*[ \t]*$/m);
|
|
91
93
|
return match ? cleanInline(match[1]) || null : null;
|
|
92
94
|
}
|
|
95
|
+
/** Descriptions shorter than this are treated as degenerate — keep scanning. */
|
|
96
|
+
const MIN_DESCRIPTION_LENGTH = 40;
|
|
97
|
+
/**
|
|
98
|
+
* Whether a line is a bare label like `**Làm gì:**` or `Functional:` —
|
|
99
|
+
* markdown emphasis that cleans to a short colon-terminated string.
|
|
100
|
+
*/
|
|
101
|
+
function isLabelOnly(line) {
|
|
102
|
+
const text = cleanInline(line);
|
|
103
|
+
return (text.length > 0 &&
|
|
104
|
+
text.length <= MIN_DESCRIPTION_LENGTH &&
|
|
105
|
+
text.endsWith(":"));
|
|
106
|
+
}
|
|
93
107
|
/**
|
|
94
108
|
* Extract the first meaningful paragraph from markdown content
|
|
95
109
|
* (for the meta description fallback). Skips frontmatter, code blocks,
|
|
96
|
-
* headings, HTML, comments, and nav-like lines;
|
|
97
|
-
*
|
|
110
|
+
* headings, HTML, comments, and nav-like lines; drops label-only lines;
|
|
111
|
+
* requires ~40 chars of real prose (shorter paragraphs are kept only as a
|
|
112
|
+
* last resort); collapses whitespace; cuts at ~160 chars on a word
|
|
113
|
+
* boundary (hard cap 200).
|
|
98
114
|
*/
|
|
99
115
|
export function extractFirstParagraph(content) {
|
|
100
116
|
let body = stripFrontmatter(content);
|
|
101
117
|
body = stripFencedCode(body);
|
|
102
118
|
body = body.replace(/<!--[\s\S]*?-->/g, "");
|
|
103
|
-
|
|
119
|
+
let fallback = null;
|
|
120
|
+
let paraLines = [];
|
|
121
|
+
// Evaluate the accumulated paragraph: returns a qualifying description,
|
|
122
|
+
// records a shorter candidate as fallback, or null if the block is empty.
|
|
123
|
+
const flush = () => {
|
|
124
|
+
if (paraLines.length === 0)
|
|
125
|
+
return null;
|
|
126
|
+
const kept = paraLines.filter((l) => !isLabelOnly(l));
|
|
127
|
+
paraLines = [];
|
|
128
|
+
const text = cleanInline(kept.join(" "));
|
|
129
|
+
if (!text)
|
|
130
|
+
return null;
|
|
131
|
+
if (text.length >= MIN_DESCRIPTION_LENGTH)
|
|
132
|
+
return truncate(text, 160, 200);
|
|
133
|
+
if (!fallback || text.length > fallback.length)
|
|
134
|
+
fallback = text;
|
|
135
|
+
return null;
|
|
136
|
+
};
|
|
104
137
|
for (const rawLine of body.split("\n")) {
|
|
105
138
|
const line = rawLine.trim();
|
|
106
|
-
if (!line) {
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
}
|
|
111
|
-
if (isSkippableLine(line)) {
|
|
112
|
-
if (paraLines.length > 0)
|
|
113
|
-
break; // stop at non-prose content
|
|
139
|
+
if (!line || isSkippableLine(line)) {
|
|
140
|
+
const result = flush();
|
|
141
|
+
if (result)
|
|
142
|
+
return result;
|
|
114
143
|
continue;
|
|
115
144
|
}
|
|
116
145
|
paraLines.push(line);
|
|
117
146
|
}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
const text = cleanInline(paraLines.join(" "));
|
|
121
|
-
return text ? truncate(text, 160, 200) : null;
|
|
147
|
+
const result = flush();
|
|
148
|
+
return result ?? (fallback ? truncate(fallback, 160, 200) : null);
|
|
122
149
|
}
|
|
123
150
|
/**
|
|
124
151
|
* Extract SEO data (title + description) from markdown content.
|
package/dist/seo/extract.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/seo/extract.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,SAAS,gBAAgB,CAAC,OAAe;IACvC,OAAO,OAAO,CAAC,OAAO,CAAC,2BAA2B,EAAE,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,eAAe,CAAC,OAAe;IACtC,OAAO,OAAO;SACX,OAAO,CAAC,yCAAyC,EAAE,EAAE,CAAC;SACtD,OAAO,CAAC,0BAA0B,EAAE,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,MAAM,QAAQ,GAA2B;QACvC,OAAO,EAAE,GAAG;QACZ,MAAM,EAAE,GAAG;QACX,MAAM,EAAE,GAAG;QACX,QAAQ,EAAE,GAAG;QACb,OAAO,EAAE,GAAG;QACZ,QAAQ,EAAE,GAAG;QACb,QAAQ,EAAE,GAAG;KACd,CAAC;IACF,OAAO,IAAI,CAAC,OAAO,CACjB,mCAAmC,EACnC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CACxB,CAAC;AACJ,CAAC;AAED,6DAA6D;AAC7D,SAAS,WAAW,CAAC,IAAY;IAC/B,OAAO,cAAc,CACnB,IAAI;SACD,OAAO,CAAC,yBAAyB,EAAE,IAAI,CAAC,CAAC,oBAAoB;SAC7D,OAAO,CAAC,wBAAwB,EAAE,IAAI,CAAC,CAAC,eAAe;SACvD,OAAO,CAAC,yBAAyB,EAAE,IAAI,CAAC,CAAC,mBAAmB;SAC5D,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,YAAY;SACpC,OAAO,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC,OAAO;SAC1C,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC,SAAS;
|
|
1
|
+
{"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/seo/extract.ts"],"names":[],"mappings":"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"}
|
package/dist/seo/jsonld.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonld.d.ts","sourceRoot":"","sources":["../../src/seo/jsonld.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAG7C;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"jsonld.d.ts","sourceRoot":"","sources":["../../src/seo/jsonld.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAG7C;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,GAAG,MAAM,CA0EpE"}
|
package/dist/seo/jsonld.js
CHANGED
|
@@ -25,6 +25,17 @@ export function buildJsonLd(seo, settings) {
|
|
|
25
25
|
const description = seo.description || settings.site.description;
|
|
26
26
|
if (description)
|
|
27
27
|
site.description = description;
|
|
28
|
+
// Sitelinks search box — client-side search reads the `q` query param.
|
|
29
|
+
if (settings.search.enabled && url) {
|
|
30
|
+
site.potentialAction = {
|
|
31
|
+
"@type": "SearchAction",
|
|
32
|
+
target: {
|
|
33
|
+
"@type": "EntryPoint",
|
|
34
|
+
urlTemplate: `${url.replace(/\/+$/, "")}/?q={search_term_string}`,
|
|
35
|
+
},
|
|
36
|
+
"query-input": "required name=search_term_string",
|
|
37
|
+
};
|
|
38
|
+
}
|
|
28
39
|
graph.push(site);
|
|
29
40
|
}
|
|
30
41
|
else if (seo.kind === "document" && seo.type === "article") {
|
package/dist/seo/jsonld.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonld.js","sourceRoot":"","sources":["../../src/seo/jsonld.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"jsonld.js","sourceRoot":"","sources":["../../src/seo/jsonld.ts"],"names":[],"mappings":"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"}
|
package/dist/seo/metadata.d.ts
CHANGED
|
@@ -15,6 +15,9 @@ export interface SeoData {
|
|
|
15
15
|
title: string;
|
|
16
16
|
description?: string;
|
|
17
17
|
image?: string;
|
|
18
|
+
/** Pixel dimensions, set only for generated OG images (known size). */
|
|
19
|
+
imageWidth?: number;
|
|
20
|
+
imageHeight?: number;
|
|
18
21
|
/** Absolute canonical URL, or null when no `site.baseUrl` is configured. */
|
|
19
22
|
absoluteUrl: string | null;
|
|
20
23
|
/** Normalized trailing-slash route. */
|