@farming-labs/nuxt 0.0.2-beta.17
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/content.d.ts +54 -0
- package/dist/content.d.ts.map +1 -0
- package/dist/content.js +204 -0
- package/dist/content.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/markdown.d.ts +18 -0
- package/dist/markdown.d.ts.map +1 -0
- package/dist/markdown.js +281 -0
- package/dist/markdown.js.map +1 -0
- package/dist/server.d.ts +82 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +571 -0
- package/dist/server.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Content loading utilities for Nuxt docs.
|
|
3
|
+
*
|
|
4
|
+
* Scans the filesystem for `.md` / `.mdx` content files,
|
|
5
|
+
* extracts frontmatter, and builds a navigation tree compatible
|
|
6
|
+
* with @farming-labs/docs DocsConfig.
|
|
7
|
+
*/
|
|
8
|
+
import type { OrderingItem } from "@farming-labs/docs";
|
|
9
|
+
export interface PageNode {
|
|
10
|
+
type: "page";
|
|
11
|
+
name: string;
|
|
12
|
+
url: string;
|
|
13
|
+
icon?: string;
|
|
14
|
+
description?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface FolderNode {
|
|
17
|
+
type: "folder";
|
|
18
|
+
name: string;
|
|
19
|
+
icon?: string;
|
|
20
|
+
index?: PageNode;
|
|
21
|
+
children: NavNode[];
|
|
22
|
+
}
|
|
23
|
+
export type NavNode = PageNode | FolderNode;
|
|
24
|
+
export interface NavTree {
|
|
25
|
+
name: string;
|
|
26
|
+
children: NavNode[];
|
|
27
|
+
}
|
|
28
|
+
export interface ContentPage {
|
|
29
|
+
slug: string;
|
|
30
|
+
url: string;
|
|
31
|
+
title: string;
|
|
32
|
+
description?: string;
|
|
33
|
+
icon?: string;
|
|
34
|
+
content: string;
|
|
35
|
+
rawContent: string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Scan a content directory and return all docs pages.
|
|
39
|
+
* Expects a flat or nested structure of `.md` files:
|
|
40
|
+
* content/docs/index.md → /docs
|
|
41
|
+
* content/docs/installation.md → /docs/installation
|
|
42
|
+
* content/docs/guides/auth.md → /docs/guides/auth
|
|
43
|
+
*/
|
|
44
|
+
export declare function loadDocsContent(contentDir: string, entry?: string): ContentPage[];
|
|
45
|
+
/**
|
|
46
|
+
* Build a navigation tree from a content directory.
|
|
47
|
+
*/
|
|
48
|
+
export declare function loadDocsNavTree(contentDir: string, entry?: string, ordering?: "alphabetical" | "numeric" | OrderingItem[]): NavTree;
|
|
49
|
+
/**
|
|
50
|
+
* Flatten a navigation tree into an ordered list of pages.
|
|
51
|
+
* Useful for computing previous/next page links.
|
|
52
|
+
*/
|
|
53
|
+
export declare function flattenNavTree(tree: NavTree): PageNode[];
|
|
54
|
+
//# sourceMappingURL=content.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../src/content.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AAED,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG,UAAU,CAAC;AAE5C,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,MAAM,EAClB,KAAK,GAAE,MAAe,GACrB,WAAW,EAAE,CAiDf;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,MAAM,EAClB,KAAK,GAAE,MAAe,EACtB,QAAQ,CAAC,EAAE,cAAc,GAAG,SAAS,GAAG,YAAY,EAAE,GACrD,OAAO,CAkBT;AAiGD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,EAAE,CAgBxD"}
|
package/dist/content.js
ADDED
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Content loading utilities for Nuxt docs.
|
|
3
|
+
*
|
|
4
|
+
* Scans the filesystem for `.md` / `.mdx` content files,
|
|
5
|
+
* extracts frontmatter, and builds a navigation tree compatible
|
|
6
|
+
* with @farming-labs/docs DocsConfig.
|
|
7
|
+
*/
|
|
8
|
+
import fs from "node:fs";
|
|
9
|
+
import path from "node:path";
|
|
10
|
+
import matter from "gray-matter";
|
|
11
|
+
/**
|
|
12
|
+
* Scan a content directory and return all docs pages.
|
|
13
|
+
* Expects a flat or nested structure of `.md` files:
|
|
14
|
+
* content/docs/index.md → /docs
|
|
15
|
+
* content/docs/installation.md → /docs/installation
|
|
16
|
+
* content/docs/guides/auth.md → /docs/guides/auth
|
|
17
|
+
*/
|
|
18
|
+
export function loadDocsContent(contentDir, entry = "docs") {
|
|
19
|
+
const pages = [];
|
|
20
|
+
const absDir = path.resolve(contentDir);
|
|
21
|
+
function scan(dir, slugParts) {
|
|
22
|
+
if (!fs.existsSync(dir))
|
|
23
|
+
return;
|
|
24
|
+
const entries = fs.readdirSync(dir).sort();
|
|
25
|
+
for (const name of entries) {
|
|
26
|
+
const full = path.join(dir, name);
|
|
27
|
+
const stat = fs.statSync(full);
|
|
28
|
+
if (stat.isDirectory()) {
|
|
29
|
+
scan(full, [...slugParts, name]);
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
if (!name.endsWith(".md") && !name.endsWith(".mdx") && !name.endsWith(".svx"))
|
|
33
|
+
continue;
|
|
34
|
+
const raw = fs.readFileSync(full, "utf-8");
|
|
35
|
+
const { data, content } = matter(raw);
|
|
36
|
+
const baseName = name.replace(/\.(md|mdx|svx)$/, "");
|
|
37
|
+
const isIndex = baseName === "index" || baseName === "page" || baseName === "+page";
|
|
38
|
+
const slug = isIndex
|
|
39
|
+
? slugParts.join("/")
|
|
40
|
+
: [...slugParts, baseName].join("/");
|
|
41
|
+
const url = slug ? `/${entry}/${slug}` : `/${entry}`;
|
|
42
|
+
const title = data.title ??
|
|
43
|
+
baseName.replace(/-/g, " ").replace(/\b\w/g, (c) => c.toUpperCase());
|
|
44
|
+
pages.push({
|
|
45
|
+
slug,
|
|
46
|
+
url,
|
|
47
|
+
title,
|
|
48
|
+
description: data.description,
|
|
49
|
+
icon: data.icon,
|
|
50
|
+
content: stripMarkdown(content),
|
|
51
|
+
rawContent: content,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
scan(absDir, []);
|
|
56
|
+
return pages;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Build a navigation tree from a content directory.
|
|
60
|
+
*/
|
|
61
|
+
export function loadDocsNavTree(contentDir, entry = "docs", ordering) {
|
|
62
|
+
const absDir = path.resolve(contentDir);
|
|
63
|
+
const children = [];
|
|
64
|
+
const indexPath = findIndex(absDir);
|
|
65
|
+
if (indexPath) {
|
|
66
|
+
const { data } = matter(fs.readFileSync(indexPath, "utf-8"));
|
|
67
|
+
children.push({
|
|
68
|
+
type: "page",
|
|
69
|
+
name: data.title ?? "Documentation",
|
|
70
|
+
url: `/${entry}`,
|
|
71
|
+
icon: data.icon,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
const rootSlugOrder = Array.isArray(ordering) ? ordering : undefined;
|
|
75
|
+
children.push(...scanDir(absDir, [], entry, ordering, rootSlugOrder));
|
|
76
|
+
return { name: "Docs", children };
|
|
77
|
+
}
|
|
78
|
+
function buildNavNode(dir, name, slugParts, entry, ordering, childSlugOrder) {
|
|
79
|
+
const full = path.join(dir, name);
|
|
80
|
+
if (!fs.statSync(full).isDirectory())
|
|
81
|
+
return null;
|
|
82
|
+
const indexPath = findIndex(full);
|
|
83
|
+
if (!indexPath)
|
|
84
|
+
return null;
|
|
85
|
+
const { data } = matter(fs.readFileSync(indexPath, "utf-8"));
|
|
86
|
+
const slug = [...slugParts, name];
|
|
87
|
+
const url = `/${entry}/${slug.join("/")}`;
|
|
88
|
+
const displayName = data.title ?? name.replace(/-/g, " ").replace(/\b\w/g, (c) => c.toUpperCase());
|
|
89
|
+
const icon = data.icon;
|
|
90
|
+
const childDirs = fs.readdirSync(full).filter((n) => {
|
|
91
|
+
const p = path.join(full, n);
|
|
92
|
+
return fs.statSync(p).isDirectory() && findIndex(p) !== null;
|
|
93
|
+
});
|
|
94
|
+
if (childDirs.length > 0) {
|
|
95
|
+
return {
|
|
96
|
+
type: "folder",
|
|
97
|
+
name: displayName,
|
|
98
|
+
icon,
|
|
99
|
+
index: { type: "page", name: displayName, url, icon },
|
|
100
|
+
children: scanDir(full, slug, entry, ordering, childSlugOrder),
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
return { type: "page", name: displayName, url, icon };
|
|
104
|
+
}
|
|
105
|
+
function scanDir(dir, slugParts, entry, ordering, slugOrder) {
|
|
106
|
+
if (!fs.existsSync(dir))
|
|
107
|
+
return [];
|
|
108
|
+
const entries = fs.readdirSync(dir).sort();
|
|
109
|
+
if (slugOrder) {
|
|
110
|
+
const nodes = [];
|
|
111
|
+
const slugMap = new Set(slugOrder.map((i) => i.slug));
|
|
112
|
+
for (const item of slugOrder) {
|
|
113
|
+
if (!entries.includes(item.slug))
|
|
114
|
+
continue;
|
|
115
|
+
const node = buildNavNode(dir, item.slug, slugParts, entry, ordering, item.children);
|
|
116
|
+
if (node)
|
|
117
|
+
nodes.push(node);
|
|
118
|
+
}
|
|
119
|
+
for (const name of entries) {
|
|
120
|
+
if (slugMap.has(name))
|
|
121
|
+
continue;
|
|
122
|
+
const node = buildNavNode(dir, name, slugParts, entry, ordering);
|
|
123
|
+
if (node)
|
|
124
|
+
nodes.push(node);
|
|
125
|
+
}
|
|
126
|
+
return nodes;
|
|
127
|
+
}
|
|
128
|
+
if (ordering === "numeric") {
|
|
129
|
+
const nodes = [];
|
|
130
|
+
for (const name of entries) {
|
|
131
|
+
const full = path.join(dir, name);
|
|
132
|
+
if (!fs.statSync(full).isDirectory())
|
|
133
|
+
continue;
|
|
134
|
+
const indexPath = findIndex(full);
|
|
135
|
+
if (!indexPath)
|
|
136
|
+
continue;
|
|
137
|
+
const { data } = matter(fs.readFileSync(indexPath, "utf-8"));
|
|
138
|
+
const order = typeof data.order === "number" ? data.order : Infinity;
|
|
139
|
+
const node = buildNavNode(dir, name, slugParts, entry, ordering);
|
|
140
|
+
if (node)
|
|
141
|
+
nodes.push({ order, node });
|
|
142
|
+
}
|
|
143
|
+
nodes.sort((a, b) => {
|
|
144
|
+
if (a.order === b.order)
|
|
145
|
+
return 0;
|
|
146
|
+
return a.order - b.order;
|
|
147
|
+
});
|
|
148
|
+
return nodes.map((n) => n.node);
|
|
149
|
+
}
|
|
150
|
+
const nodes = [];
|
|
151
|
+
for (const name of entries) {
|
|
152
|
+
const node = buildNavNode(dir, name, slugParts, entry, ordering);
|
|
153
|
+
if (node)
|
|
154
|
+
nodes.push(node);
|
|
155
|
+
}
|
|
156
|
+
return nodes;
|
|
157
|
+
}
|
|
158
|
+
function findIndex(dir) {
|
|
159
|
+
for (const name of ["page.md", "page.mdx", "index.md", "index.svx", "+page.md", "+page.svx"]) {
|
|
160
|
+
const p = path.join(dir, name);
|
|
161
|
+
if (fs.existsSync(p))
|
|
162
|
+
return p;
|
|
163
|
+
}
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Flatten a navigation tree into an ordered list of pages.
|
|
168
|
+
* Useful for computing previous/next page links.
|
|
169
|
+
*/
|
|
170
|
+
export function flattenNavTree(tree) {
|
|
171
|
+
const pages = [];
|
|
172
|
+
function walk(nodes) {
|
|
173
|
+
for (const node of nodes) {
|
|
174
|
+
if (node.type === "page") {
|
|
175
|
+
pages.push(node);
|
|
176
|
+
}
|
|
177
|
+
else if (node.type === "folder") {
|
|
178
|
+
if (node.index)
|
|
179
|
+
pages.push(node.index);
|
|
180
|
+
walk(node.children);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
walk(tree.children);
|
|
185
|
+
return pages;
|
|
186
|
+
}
|
|
187
|
+
function stripMarkdown(content) {
|
|
188
|
+
return content
|
|
189
|
+
.replace(/^(import|export)\s.*$/gm, "")
|
|
190
|
+
.replace(/<[^>]+\/>/g, "")
|
|
191
|
+
.replace(/<\/?[A-Z][^>]*>/g, "")
|
|
192
|
+
.replace(/<\/?[a-z][^>]*>/g, "")
|
|
193
|
+
.replace(/\[([^\]]+)\]\([^)]+\)/g, "$1")
|
|
194
|
+
.replace(/!\[([^\]]*)\]\([^)]+\)/g, "$1")
|
|
195
|
+
.replace(/^#{1,6}\s+/gm, "")
|
|
196
|
+
.replace(/(\*{1,3}|_{1,3})(.*?)\1/g, "$2")
|
|
197
|
+
.replace(/```[\s\S]*?```/g, "")
|
|
198
|
+
.replace(/`([^`]+)`/g, "$1")
|
|
199
|
+
.replace(/^>\s+/gm, "")
|
|
200
|
+
.replace(/^[-*_]{3,}\s*$/gm, "")
|
|
201
|
+
.replace(/\n{3,}/g, "\n\n")
|
|
202
|
+
.trim();
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=content.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content.js","sourceRoot":"","sources":["../src/content.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @farming-labs/nuxt
|
|
3
|
+
*
|
|
4
|
+
* Nuxt adapter for the @farming-labs/docs framework.
|
|
5
|
+
* Provides content loading, navigation tree building, search,
|
|
6
|
+
* and server-side markdown rendering for Nuxt-based documentation sites.
|
|
7
|
+
*/
|
|
8
|
+
export { loadDocsContent, loadDocsNavTree, flattenNavTree, type NavNode, type NavTree, type PageNode, type FolderNode, } from "./content.js";
|
|
9
|
+
export { renderMarkdown } from "./markdown.js";
|
|
10
|
+
export { createDocsServer, defineDocsHandler, type DocsServer } from "./server.js";
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,eAAe,EACf,eAAe,EACf,cAAc,EACd,KAAK,OAAO,EACZ,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,KAAK,UAAU,GAChB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @farming-labs/nuxt
|
|
3
|
+
*
|
|
4
|
+
* Nuxt adapter for the @farming-labs/docs framework.
|
|
5
|
+
* Provides content loading, navigation tree building, search,
|
|
6
|
+
* and server-side markdown rendering for Nuxt-based documentation sites.
|
|
7
|
+
*/
|
|
8
|
+
export { loadDocsContent, loadDocsNavTree, flattenNavTree, } from "./content.js";
|
|
9
|
+
export { renderMarkdown } from "./markdown.js";
|
|
10
|
+
export { createDocsServer, defineDocsHandler } from "./server.js";
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,eAAe,EACf,eAAe,EACf,cAAc,GAKf,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAmB,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server-side markdown rendering with Shiki syntax highlighting.
|
|
3
|
+
*
|
|
4
|
+
* Converts raw markdown content to HTML, supporting:
|
|
5
|
+
* - Fenced code blocks with dual-theme syntax highlighting
|
|
6
|
+
* - Copy-to-clipboard buttons on code blocks
|
|
7
|
+
* - Tabbed code blocks (`<Tabs>` / `<Tab>` syntax)
|
|
8
|
+
* - Callouts / admonitions (GitHub `[!NOTE]` and `**Note:**` styles)
|
|
9
|
+
* - Tables, lists, inline formatting, headings with anchor IDs
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Render a markdown string to HTML with full syntax highlighting,
|
|
13
|
+
* callouts, tables, tabs, and copy-to-clipboard support.
|
|
14
|
+
*
|
|
15
|
+
* Designed for server-side use in Astro page loaders.
|
|
16
|
+
*/
|
|
17
|
+
export declare function renderMarkdown(content: string): Promise<string>;
|
|
18
|
+
//# sourceMappingURL=markdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA2HH;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAqMrE"}
|
package/dist/markdown.js
ADDED
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server-side markdown rendering with Shiki syntax highlighting.
|
|
3
|
+
*
|
|
4
|
+
* Converts raw markdown content to HTML, supporting:
|
|
5
|
+
* - Fenced code blocks with dual-theme syntax highlighting
|
|
6
|
+
* - Copy-to-clipboard buttons on code blocks
|
|
7
|
+
* - Tabbed code blocks (`<Tabs>` / `<Tab>` syntax)
|
|
8
|
+
* - Callouts / admonitions (GitHub `[!NOTE]` and `**Note:**` styles)
|
|
9
|
+
* - Tables, lists, inline formatting, headings with anchor IDs
|
|
10
|
+
*/
|
|
11
|
+
import { createHighlighter } from "shiki";
|
|
12
|
+
let highlighterPromise = null;
|
|
13
|
+
function getHighlighter() {
|
|
14
|
+
if (!highlighterPromise) {
|
|
15
|
+
highlighterPromise = createHighlighter({
|
|
16
|
+
themes: ["github-light", "github-dark"],
|
|
17
|
+
langs: [
|
|
18
|
+
"javascript",
|
|
19
|
+
"typescript",
|
|
20
|
+
"jsx",
|
|
21
|
+
"tsx",
|
|
22
|
+
"json",
|
|
23
|
+
"bash",
|
|
24
|
+
"shellscript",
|
|
25
|
+
"html",
|
|
26
|
+
"css",
|
|
27
|
+
"markdown",
|
|
28
|
+
"yaml",
|
|
29
|
+
"sql",
|
|
30
|
+
"python",
|
|
31
|
+
"dotenv",
|
|
32
|
+
],
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
return highlighterPromise;
|
|
36
|
+
}
|
|
37
|
+
function slugify(text) {
|
|
38
|
+
return text
|
|
39
|
+
.toLowerCase()
|
|
40
|
+
.replace(/<[^>]+>/g, "")
|
|
41
|
+
.replace(/[^\w\s-]/g, "")
|
|
42
|
+
.replace(/\s+/g, "-")
|
|
43
|
+
.replace(/-+/g, "-")
|
|
44
|
+
.trim();
|
|
45
|
+
}
|
|
46
|
+
const calloutIcons = {
|
|
47
|
+
note: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="12" y1="16" x2="12" y2="12"/><line x1="12" y1="8" x2="12.01" y2="8"/></svg>',
|
|
48
|
+
warning: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0z"/><line x1="12" y1="9" x2="12" y2="13"/><line x1="12" y1="17" x2="12.01" y2="17"/></svg>',
|
|
49
|
+
tip: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9 18h6"/><path d="M10 22h4"/><path d="M15.09 14c.18-.98.65-1.74 1.41-2.5A4.65 4.65 0 0018 8 6 6 0 006 8c0 1 .23 2.23 1.5 3.5A4.61 4.61 0 019 14"/></svg>',
|
|
50
|
+
important: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15a2 2 0 01-2 2H7l-4 4V5a2 2 0 012-2h14a2 2 0 012 2z"/></svg>',
|
|
51
|
+
caution: '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="15" y1="9" x2="9" y2="15"/><line x1="9" y1="9" x2="15" y2="15"/></svg>',
|
|
52
|
+
};
|
|
53
|
+
function renderCallout(type, content) {
|
|
54
|
+
const icon = calloutIcons[type] || calloutIcons.note;
|
|
55
|
+
const label = type.charAt(0).toUpperCase() + type.slice(1);
|
|
56
|
+
return `<div class="fd-callout fd-callout-${type}" role="note"><div class="fd-callout-indicator" role="none"></div><div class="fd-callout-icon">${icon}</div><div class="fd-callout-content"><p class="fd-callout-title">${label}</p><p>${content}</p></div></div>`;
|
|
57
|
+
}
|
|
58
|
+
function highlightCode(hl, code, lang) {
|
|
59
|
+
if (lang === "sh" || lang === "shell")
|
|
60
|
+
lang = "bash";
|
|
61
|
+
if (lang === "env")
|
|
62
|
+
lang = "dotenv";
|
|
63
|
+
const supported = hl.getLoadedLanguages();
|
|
64
|
+
if (!supported.includes(lang))
|
|
65
|
+
lang = "text";
|
|
66
|
+
const trimmedCode = code.replace(/\n$/, "");
|
|
67
|
+
try {
|
|
68
|
+
return {
|
|
69
|
+
html: hl.codeToHtml(trimmedCode, {
|
|
70
|
+
lang,
|
|
71
|
+
themes: { light: "github-light", dark: "github-dark" },
|
|
72
|
+
}),
|
|
73
|
+
raw: trimmedCode,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
const escaped = trimmedCode
|
|
78
|
+
.replace(/&/g, "&")
|
|
79
|
+
.replace(/</g, "<")
|
|
80
|
+
.replace(/>/g, ">");
|
|
81
|
+
return {
|
|
82
|
+
html: `<pre class="shiki"><code>${escaped}</code></pre>`,
|
|
83
|
+
raw: trimmedCode,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
function parseMeta(meta) {
|
|
88
|
+
const lang = (meta.split(/\s/)[0] || "text").toLowerCase();
|
|
89
|
+
const titleMatch = meta.match(/title=["']([^"']+)["']/);
|
|
90
|
+
return { lang, title: titleMatch ? titleMatch[1] : null };
|
|
91
|
+
}
|
|
92
|
+
function wrapCodeWithCopy(html, rawCode, title) {
|
|
93
|
+
const escapedRaw = rawCode
|
|
94
|
+
.replace(/&/g, "&")
|
|
95
|
+
.replace(/"/g, """)
|
|
96
|
+
.replace(/</g, "<")
|
|
97
|
+
.replace(/>/g, ">");
|
|
98
|
+
const copyBtn = `<button class="fd-copy-btn" data-code="${escapedRaw}" title="Copy code"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg></button>`;
|
|
99
|
+
if (title) {
|
|
100
|
+
return `<div class="fd-codeblock fd-codeblock--titled"><div class="fd-codeblock-title"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z"/><path d="M14 2v4a2 2 0 0 0 2 2h4"/></svg><span class="fd-codeblock-title-text">${title}</span>${copyBtn}</div><div class="fd-codeblock-content">${html}</div></div>`;
|
|
101
|
+
}
|
|
102
|
+
return `<div class="fd-codeblock">${copyBtn}<div class="fd-codeblock-content">${html}</div></div>`;
|
|
103
|
+
}
|
|
104
|
+
function dedentCode(raw) {
|
|
105
|
+
const lines = raw.replace(/\n$/, "").split("\n");
|
|
106
|
+
const indent = lines.reduce((min, l) => {
|
|
107
|
+
if (!l.trim())
|
|
108
|
+
return min;
|
|
109
|
+
const spaces = l.match(/^(\s*)/)?.[1].length ?? 0;
|
|
110
|
+
return Math.min(min, spaces);
|
|
111
|
+
}, Infinity);
|
|
112
|
+
if (indent > 0 && indent < Infinity) {
|
|
113
|
+
return lines.map((l) => l.slice(indent)).join("\n");
|
|
114
|
+
}
|
|
115
|
+
return raw;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Render a markdown string to HTML with full syntax highlighting,
|
|
119
|
+
* callouts, tables, tabs, and copy-to-clipboard support.
|
|
120
|
+
*
|
|
121
|
+
* Designed for server-side use in Astro page loaders.
|
|
122
|
+
*/
|
|
123
|
+
export async function renderMarkdown(content) {
|
|
124
|
+
if (!content)
|
|
125
|
+
return "";
|
|
126
|
+
const hl = await getHighlighter();
|
|
127
|
+
let result = content;
|
|
128
|
+
// ── Tabs blocks: <Tabs items={[...]}> ... </Tabs> ──
|
|
129
|
+
const tabsBlocks = [];
|
|
130
|
+
result = result.replace(/<Tabs\s+items=\{?\[([^\]]+)\]\}?>([\s\S]*?)<\/Tabs>/g, (_, itemsStr, body) => {
|
|
131
|
+
const items = itemsStr
|
|
132
|
+
.split(",")
|
|
133
|
+
.map((s) => s.trim().replace(/^["']|["']$/g, ""));
|
|
134
|
+
const panels = [];
|
|
135
|
+
const tabRegex = /<Tab\s+value=["']([^"']+)["']>([\s\S]*?)<\/Tab>/g;
|
|
136
|
+
let tabMatch;
|
|
137
|
+
while ((tabMatch = tabRegex.exec(body)) !== null) {
|
|
138
|
+
const tabValue = tabMatch[1];
|
|
139
|
+
const tabContent = tabMatch[2].trim();
|
|
140
|
+
const codeMatch = tabContent.match(/```([^\n]*)\n([\s\S]*?)```/);
|
|
141
|
+
if (codeMatch) {
|
|
142
|
+
const { lang, title } = parseMeta(codeMatch[1]);
|
|
143
|
+
const dedented = dedentCode(codeMatch[2]);
|
|
144
|
+
const { html, raw } = highlightCode(hl, dedented, lang);
|
|
145
|
+
panels.push({ value: tabValue, html: wrapCodeWithCopy(html, raw, title) });
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
panels.push({ value: tabValue, html: `<p>${tabContent}</p>` });
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
let tabsHtml = `<div class="fd-tabs" data-tabs>`;
|
|
152
|
+
tabsHtml += `<div class="fd-tabs-list" role="tablist">`;
|
|
153
|
+
for (let i = 0; i < items.length; i++) {
|
|
154
|
+
tabsHtml += `<button role="tab" class="fd-tab-trigger${i === 0 ? " fd-tab-active" : ""}" data-tab-value="${items[i]}" aria-selected="${i === 0}">${items[i]}</button>`;
|
|
155
|
+
}
|
|
156
|
+
tabsHtml += `</div>`;
|
|
157
|
+
for (let i = 0; i < panels.length; i++) {
|
|
158
|
+
tabsHtml += `<div class="fd-tab-panel${i === 0 ? " fd-tab-panel-active" : ""}" data-tab-panel="${panels[i].value}" role="tabpanel">${panels[i].html}</div>`;
|
|
159
|
+
}
|
|
160
|
+
tabsHtml += `</div>`;
|
|
161
|
+
const placeholder = `%%TABS_${tabsBlocks.length}%%`;
|
|
162
|
+
tabsBlocks.push(tabsHtml);
|
|
163
|
+
return placeholder;
|
|
164
|
+
});
|
|
165
|
+
// ── Fenced code blocks ──
|
|
166
|
+
const codeBlocks = [];
|
|
167
|
+
result = result.replace(/```([^\n]*)\n([\s\S]*?)```/g, (_, meta, code) => {
|
|
168
|
+
const { lang, title } = parseMeta(meta);
|
|
169
|
+
const { html, raw } = highlightCode(hl, code, lang);
|
|
170
|
+
const placeholder = `%%CODEBLOCK_${codeBlocks.length}%%`;
|
|
171
|
+
codeBlocks.push(wrapCodeWithCopy(html, raw, title));
|
|
172
|
+
return placeholder;
|
|
173
|
+
});
|
|
174
|
+
// Inline code
|
|
175
|
+
result = result.replace(/`([^`]+)`/g, "<code>$1</code>");
|
|
176
|
+
// Headings (h4 → h1 order to avoid prefix collisions)
|
|
177
|
+
result = result.replace(/^#### (.+)$/gm, (_, text) => {
|
|
178
|
+
return `<h4 id="${slugify(text)}">${text}</h4>`;
|
|
179
|
+
});
|
|
180
|
+
result = result.replace(/^### (.+)$/gm, (_, text) => {
|
|
181
|
+
return `<h3 id="${slugify(text)}">${text}</h3>`;
|
|
182
|
+
});
|
|
183
|
+
result = result.replace(/^## (.+)$/gm, (_, text) => {
|
|
184
|
+
return `<h2 id="${slugify(text)}">${text}</h2>`;
|
|
185
|
+
});
|
|
186
|
+
result = result.replace(/^# (.+)$/gm, "<h1>$1</h1>");
|
|
187
|
+
// ── Callouts / blockquotes (before inline formatting) ──
|
|
188
|
+
const calloutBlocks = [];
|
|
189
|
+
result = result.replace(/(?:^>\s*.+\n?)+/gm, (block) => {
|
|
190
|
+
const lines = block.split("\n").filter(Boolean);
|
|
191
|
+
const inner = lines.map((l) => l.replace(/^>\s?/, "")).join("\n");
|
|
192
|
+
const ghMatch = inner.match(/^\[!(NOTE|WARNING|TIP|IMPORTANT|CAUTION)\]\s*\n?([\s\S]*)/i);
|
|
193
|
+
if (ghMatch) {
|
|
194
|
+
const type = ghMatch[1].toLowerCase();
|
|
195
|
+
const calloutContent = ghMatch[2].trim();
|
|
196
|
+
const placeholder = `%%CALLOUT_${calloutBlocks.length}%%`;
|
|
197
|
+
calloutBlocks.push(renderCallout(type, calloutContent));
|
|
198
|
+
return placeholder;
|
|
199
|
+
}
|
|
200
|
+
const boldMatch = inner.match(/^\*\*(Note|Warning|Tip|Important|Caution):\*\*\s*([\s\S]*)/i);
|
|
201
|
+
if (boldMatch) {
|
|
202
|
+
const type = boldMatch[1].toLowerCase();
|
|
203
|
+
const calloutContent = boldMatch[2].trim();
|
|
204
|
+
const placeholder = `%%CALLOUT_${calloutBlocks.length}%%`;
|
|
205
|
+
calloutBlocks.push(renderCallout(type, calloutContent));
|
|
206
|
+
return placeholder;
|
|
207
|
+
}
|
|
208
|
+
return `<blockquote><p>${inner}</p></blockquote>`;
|
|
209
|
+
});
|
|
210
|
+
// Inline formatting
|
|
211
|
+
result = result.replace(/\*\*\*(.+?)\*\*\*/g, "<strong><em>$1</em></strong>");
|
|
212
|
+
result = result.replace(/\*\*(.+?)\*\*/g, "<strong>$1</strong>");
|
|
213
|
+
result = result.replace(/\*(.+?)\*/g, "<em>$1</em>");
|
|
214
|
+
// Links
|
|
215
|
+
result = result.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2">$1</a>');
|
|
216
|
+
// Horizontal rules
|
|
217
|
+
result = result.replace(/^---$/gm, "<hr />");
|
|
218
|
+
// Tables
|
|
219
|
+
result = result.replace(/^\|(.+)\|\n\|[-| ]+\|\n((?:\|.+\|\n?)+)/gm, (_, headerRow, bodyRows) => {
|
|
220
|
+
const headers = headerRow
|
|
221
|
+
.split("|")
|
|
222
|
+
.map((h) => h.trim())
|
|
223
|
+
.filter(Boolean);
|
|
224
|
+
const rows = bodyRows
|
|
225
|
+
.trim()
|
|
226
|
+
.split("\n")
|
|
227
|
+
.map((row) => row
|
|
228
|
+
.split("|")
|
|
229
|
+
.map((c) => c.trim())
|
|
230
|
+
.filter(Boolean));
|
|
231
|
+
const headerHtml = headers.map((h) => `<th>${h}</th>`).join("");
|
|
232
|
+
const rowsHtml = rows
|
|
233
|
+
.map((row) => `<tr>${row.map((c) => `<td>${c}</td>`).join("")}</tr>`)
|
|
234
|
+
.join("");
|
|
235
|
+
return `<div class="fd-table-wrapper"><table><thead><tr>${headerHtml}</tr></thead><tbody>${rowsHtml}</tbody></table></div>`;
|
|
236
|
+
});
|
|
237
|
+
// Unordered lists
|
|
238
|
+
result = result.replace(/(?:^- .+\n?)+/gm, (block) => {
|
|
239
|
+
const items = block
|
|
240
|
+
.split("\n")
|
|
241
|
+
.filter((l) => l.startsWith("- "))
|
|
242
|
+
.map((l) => `<li>${l.slice(2)}</li>`)
|
|
243
|
+
.join("");
|
|
244
|
+
return `<ul>${items}</ul>`;
|
|
245
|
+
});
|
|
246
|
+
// Ordered lists
|
|
247
|
+
result = result.replace(/(?:^\d+\. .+\n?)+/gm, (block) => {
|
|
248
|
+
const items = block
|
|
249
|
+
.split("\n")
|
|
250
|
+
.filter((l) => /^\d+\. /.test(l))
|
|
251
|
+
.map((l) => `<li>${l.replace(/^\d+\. /, "")}</li>`)
|
|
252
|
+
.join("");
|
|
253
|
+
return `<ol>${items}</ol>`;
|
|
254
|
+
});
|
|
255
|
+
// Wrap remaining bare text in <p> tags
|
|
256
|
+
result = result
|
|
257
|
+
.split("\n\n")
|
|
258
|
+
.map((block) => {
|
|
259
|
+
block = block.trim();
|
|
260
|
+
if (!block)
|
|
261
|
+
return "";
|
|
262
|
+
if (/^<(h[1-6]|pre|ul|ol|blockquote|hr|table|div)/.test(block))
|
|
263
|
+
return block;
|
|
264
|
+
if (/^%%(CODEBLOCK|CALLOUT|TABS)_\d+%%$/.test(block))
|
|
265
|
+
return block;
|
|
266
|
+
return `<p>${block}</p>`;
|
|
267
|
+
})
|
|
268
|
+
.join("\n");
|
|
269
|
+
// Restore placeholders
|
|
270
|
+
for (let i = 0; i < codeBlocks.length; i++) {
|
|
271
|
+
result = result.replace(`%%CODEBLOCK_${i}%%`, codeBlocks[i]);
|
|
272
|
+
}
|
|
273
|
+
for (let i = 0; i < calloutBlocks.length; i++) {
|
|
274
|
+
result = result.replace(`%%CALLOUT_${i}%%`, calloutBlocks[i]);
|
|
275
|
+
}
|
|
276
|
+
for (let i = 0; i < tabsBlocks.length; i++) {
|
|
277
|
+
result = result.replace(`%%TABS_${i}%%`, tabsBlocks[i]);
|
|
278
|
+
}
|
|
279
|
+
return result;
|
|
280
|
+
}
|
|
281
|
+
//# sourceMappingURL=markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"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"}
|