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.
Files changed (65) hide show
  1. package/dist/directory.d.ts +11 -0
  2. package/dist/directory.d.ts.map +1 -1
  3. package/dist/directory.js +31 -115
  4. package/dist/directory.js.map +1 -1
  5. package/dist/generators/feed.d.ts.map +1 -1
  6. package/dist/generators/feed.js +8 -1
  7. package/dist/generators/feed.js.map +1 -1
  8. package/dist/generators/search-index.d.ts.map +1 -1
  9. package/dist/generators/search-index.js +5 -4
  10. package/dist/generators/search-index.js.map +1 -1
  11. package/dist/generators/sitemap.js +5 -1
  12. package/dist/generators/sitemap.js.map +1 -1
  13. package/dist/generators/static-export.d.ts.map +1 -1
  14. package/dist/generators/static-export.js +5 -5
  15. package/dist/generators/static-export.js.map +1 -1
  16. package/dist/link-transform.d.ts +37 -5
  17. package/dist/link-transform.d.ts.map +1 -1
  18. package/dist/link-transform.js +120 -13
  19. package/dist/link-transform.js.map +1 -1
  20. package/dist/render-page.d.ts +0 -1
  21. package/dist/render-page.d.ts.map +1 -1
  22. package/dist/render-page.js +52 -34
  23. package/dist/render-page.js.map +1 -1
  24. package/dist/renderer/markdown.d.ts.map +1 -1
  25. package/dist/renderer/markdown.js +6 -7
  26. package/dist/renderer/markdown.js.map +1 -1
  27. package/dist/seo/extract.d.ts +4 -2
  28. package/dist/seo/extract.d.ts.map +1 -1
  29. package/dist/seo/extract.js +42 -15
  30. package/dist/seo/extract.js.map +1 -1
  31. package/dist/seo/jsonld.d.ts.map +1 -1
  32. package/dist/seo/jsonld.js +11 -0
  33. package/dist/seo/jsonld.js.map +1 -1
  34. package/dist/seo/metadata.d.ts +3 -0
  35. package/dist/seo/metadata.d.ts.map +1 -1
  36. package/dist/seo/metadata.js +8 -2
  37. package/dist/seo/metadata.js.map +1 -1
  38. package/dist/settings/index.d.ts.map +1 -1
  39. package/dist/settings/index.js +14 -0
  40. package/dist/settings/index.js.map +1 -1
  41. package/dist/settings/schema.d.ts +241 -0
  42. package/dist/settings/schema.d.ts.map +1 -1
  43. package/dist/settings/schema.js +36 -0
  44. package/dist/settings/schema.js.map +1 -1
  45. package/dist/template/analytics.d.ts +18 -0
  46. package/dist/template/analytics.d.ts.map +1 -0
  47. package/dist/template/analytics.js +83 -0
  48. package/dist/template/analytics.js.map +1 -0
  49. package/dist/template/index.d.ts.map +1 -1
  50. package/dist/template/index.js +45 -19
  51. package/dist/template/index.js.map +1 -1
  52. package/dist/template/search.d.ts.map +1 -1
  53. package/dist/template/search.js +9 -2
  54. package/dist/template/search.js.map +1 -1
  55. package/dist/template/seo.d.ts.map +1 -1
  56. package/dist/template/seo.js +16 -0
  57. package/dist/template/seo.js.map +1 -1
  58. package/dist/template/sidebar.d.ts.map +1 -1
  59. package/dist/template/sidebar.js +10 -7
  60. package/dist/template/sidebar.js.map +1 -1
  61. package/dist/validator/index.d.ts +1 -1
  62. package/dist/validator/index.d.ts.map +1 -1
  63. package/dist/validator/index.js +21 -0
  64. package/dist/validator/index.js.map +1 -1
  65. package/package.json +1 -1
@@ -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
- // Skip mailto, tel, and other protocols (but keep #anchors)
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)(#|$)/i, (_m, _ext, suffix) => suffix === "#" ? "#" : "");
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
- * Works on rendered HTML (href attributes) as well as raw markdown
19
- * [text](url) syntax.
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
- // Rewrite HTML href attributes pointing at .md/.mdx files
23
- let result = html.replace(/href="([^"]+)"/g, (match, url) => isExternalOrSpecial(url) ? match : `href="${stripMarkdownExt(url)}"`);
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: ![text](path) - but we skip those
26
- result = result.replace(/(?<!\!)\[([^\]]+)\]\(([^)]+)\)/g, (match, text, url) => isExternalOrSpecial(url) ? match : `[${text}](${stripMarkdownExt(url)})`);
27
- return result;
121
+ // Also match image links: ![text](path) - 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,4DAA4D;IAC5D,OAAO,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAW;IACnC,OAAO,GAAG,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,MAAc,EAAE,EAAE,CAClE,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAC1B,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,0DAA0D;IAC1D,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC,KAAK,EAAE,GAAW,EAAE,EAAE,CAClE,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,gBAAgB,CAAC,GAAG,CAAC,GAAG,CACrE,CAAC;IAEF,6DAA6D;IAC7D,4DAA4D;IAC5D,MAAM,GAAG,MAAM,CAAC,OAAO,CACrB,iCAAiC,EACjC,CAAC,KAAK,EAAE,IAAI,EAAE,GAAW,EAAE,EAAE,CAC3B,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,KAAK,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAC3E,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"link-transform.js","sourceRoot":"","sources":["../src/link-transform.ts"],"names":[],"mappings":"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"}
@@ -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,EAAkB,KAAK,MAAM,EAAE,MAAM,SAAS,CAAC;AAEtD,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,CAqDvB;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;AAEvD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMzD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CA2BnE"}
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"}
@@ -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
- body = convertMarkdownLinks(fixAssetPaths(body, urlPath));
32
- }
33
- else if (settings.generate.cleanUrls) {
34
- // Preview static-export output: rewrite .md/.mdx links to clean URLs
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
@@ -1 +1 @@
1
- {"version":3,"file":"render-page.js","sourceRoot":"","sources":["../src/render-page.ts"],"names":[],"mappings":"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"}
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;AA4GD,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,QAAQ,GACjB,cAAc,CAgBhB;AAiBD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAiE5D"}
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 `<pre class="code-block-wrapper"><div class="code-block-container">
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
- <pre class="code-block-raw" style="display:none;"><code>${escapedRaw}</code></pre>
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, "&lt;").replace(/>/g, "&gt;");
90
- return `<pre class="mermaid-wrapper"><div class="mermaid-container">
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></pre>\n`;
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, "&lt;").replace(/>/g, "&gt;");
164
- return `<pre class="mermaid-wrapper"><div class="mermaid-container">
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></pre>\n`;
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":"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"}
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/renderer/markdown.ts"],"names":[],"mappings":"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"}
@@ -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; collapses whitespace;
14
- * cuts at ~160 chars on a word boundary (hard cap 200).
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;AA6EH;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAIlE;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAsBpE;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"}
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"}
@@ -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; collapses whitespace;
97
- * cuts at ~160 chars on a word boundary (hard cap 200).
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
- const paraLines = [];
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
- if (paraLines.length > 0)
108
- break; // paragraph ends at first blank line
109
- continue;
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
- if (paraLines.length === 0)
119
- return null;
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.
@@ -1 +1 @@
1
- {"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/seo/extract.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/seo/extract.ts"],"names":[],"mappings":"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"}
@@ -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,CA+DpE"}
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"}
@@ -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") {
@@ -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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"}
@@ -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. */