@dogsbay/format-mkdocs 0.2.0-beta.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/autodoc/markdown-generator.d.ts +6 -0
- package/dist/autodoc/markdown-generator.d.ts.map +1 -0
- package/dist/autodoc/markdown-generator.js +242 -0
- package/dist/autodoc/markdown-generator.js.map +1 -0
- package/dist/autodoc/module-resolver.d.ts +8 -0
- package/dist/autodoc/module-resolver.d.ts.map +1 -0
- package/dist/autodoc/module-resolver.js +218 -0
- package/dist/autodoc/module-resolver.js.map +1 -0
- package/dist/autodoc/python-docstring.d.ts +7 -0
- package/dist/autodoc/python-docstring.d.ts.map +1 -0
- package/dist/autodoc/python-docstring.js +324 -0
- package/dist/autodoc/python-docstring.js.map +1 -0
- package/dist/autodoc/python-parser.d.ts +10 -0
- package/dist/autodoc/python-parser.d.ts.map +1 -0
- package/dist/autodoc/python-parser.js +541 -0
- package/dist/autodoc/python-parser.js.map +1 -0
- package/dist/autodoc/tree-builder.d.ts +9 -0
- package/dist/autodoc/tree-builder.d.ts.map +1 -0
- package/dist/autodoc/tree-builder.js +279 -0
- package/dist/autodoc/tree-builder.js.map +1 -0
- package/dist/autodoc/types.d.ts +128 -0
- package/dist/autodoc/types.d.ts.map +1 -0
- package/dist/autodoc/types.js +2 -0
- package/dist/autodoc/types.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +32 -0
- package/dist/cli.js.map +1 -0
- package/dist/export/to-astro.d.ts +26 -0
- package/dist/export/to-astro.d.ts.map +1 -0
- package/dist/export/to-astro.js +551 -0
- package/dist/export/to-astro.js.map +1 -0
- package/dist/export/to-mkdocs-project.d.ts +27 -0
- package/dist/export/to-mkdocs-project.d.ts.map +1 -0
- package/dist/export/to-mkdocs-project.js +192 -0
- package/dist/export/to-mkdocs-project.js.map +1 -0
- package/dist/export/to-mkdocs.d.ts +6 -0
- package/dist/export/to-mkdocs.d.ts.map +1 -0
- package/dist/export/to-mkdocs.js +178 -0
- package/dist/export/to-mkdocs.js.map +1 -0
- package/dist/importer.d.ts +30 -0
- package/dist/importer.d.ts.map +1 -0
- package/dist/importer.js +376 -0
- package/dist/importer.js.map +1 -0
- package/dist/index.d.ts +57 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +170 -0
- package/dist/index.js.map +1 -0
- package/dist/inline-walker.d.ts +17 -0
- package/dist/inline-walker.d.ts.map +1 -0
- package/dist/inline-walker.js +167 -0
- package/dist/inline-walker.js.map +1 -0
- package/dist/loader.d.ts +42 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +765 -0
- package/dist/loader.js.map +1 -0
- package/dist/parse.d.ts +12 -0
- package/dist/parse.d.ts.map +1 -0
- package/dist/parse.js +46 -0
- package/dist/parse.js.map +1 -0
- package/dist/renderers/mermaid.d.ts +9 -0
- package/dist/renderers/mermaid.d.ts.map +1 -0
- package/dist/renderers/mermaid.js +117 -0
- package/dist/renderers/mermaid.js.map +1 -0
- package/dist/rules/admonition.d.ts +6 -0
- package/dist/rules/admonition.d.ts.map +1 -0
- package/dist/rules/admonition.js +73 -0
- package/dist/rules/admonition.js.map +1 -0
- package/dist/rules/annotations.d.ts +6 -0
- package/dist/rules/annotations.d.ts.map +1 -0
- package/dist/rules/annotations.js +57 -0
- package/dist/rules/annotations.js.map +1 -0
- package/dist/rules/autodoc.d.ts +7 -0
- package/dist/rules/autodoc.d.ts.map +1 -0
- package/dist/rules/autodoc.js +102 -0
- package/dist/rules/autodoc.js.map +1 -0
- package/dist/rules/blocks.d.ts +6 -0
- package/dist/rules/blocks.d.ts.map +1 -0
- package/dist/rules/blocks.js +172 -0
- package/dist/rules/blocks.js.map +1 -0
- package/dist/rules/content-tabs.d.ts +6 -0
- package/dist/rules/content-tabs.d.ts.map +1 -0
- package/dist/rules/content-tabs.js +67 -0
- package/dist/rules/content-tabs.js.map +1 -0
- package/dist/rules/docusaurus-admonitions.d.ts +7 -0
- package/dist/rules/docusaurus-admonitions.d.ts.map +1 -0
- package/dist/rules/docusaurus-admonitions.js +101 -0
- package/dist/rules/docusaurus-admonitions.js.map +1 -0
- package/dist/rules/file-include.d.ts +28 -0
- package/dist/rules/file-include.d.ts.map +1 -0
- package/dist/rules/file-include.js +198 -0
- package/dist/rules/file-include.js.map +1 -0
- package/dist/rules/footnotes.d.ts +6 -0
- package/dist/rules/footnotes.d.ts.map +1 -0
- package/dist/rules/footnotes.js +161 -0
- package/dist/rules/footnotes.js.map +1 -0
- package/dist/rules/icon-shortcode.d.ts +30 -0
- package/dist/rules/icon-shortcode.d.ts.map +1 -0
- package/dist/rules/icon-shortcode.js +169 -0
- package/dist/rules/icon-shortcode.js.map +1 -0
- package/dist/rules/keys.d.ts +6 -0
- package/dist/rules/keys.d.ts.map +1 -0
- package/dist/rules/keys.js +30 -0
- package/dist/rules/keys.js.map +1 -0
- package/dist/rules/link-rewrite.d.ts +7 -0
- package/dist/rules/link-rewrite.d.ts.map +1 -0
- package/dist/rules/link-rewrite.js +93 -0
- package/dist/rules/link-rewrite.js.map +1 -0
- package/dist/rules/math.d.ts +14 -0
- package/dist/rules/math.d.ts.map +1 -0
- package/dist/rules/math.js +114 -0
- package/dist/rules/math.js.map +1 -0
- package/dist/rules/md-in-html.d.ts +6 -0
- package/dist/rules/md-in-html.d.ts.map +1 -0
- package/dist/rules/md-in-html.js +135 -0
- package/dist/rules/md-in-html.js.map +1 -0
- package/dist/rules/snippets.d.ts +10 -0
- package/dist/rules/snippets.d.ts.map +1 -0
- package/dist/rules/snippets.js +109 -0
- package/dist/rules/snippets.js.map +1 -0
- package/dist/rules/templates.d.ts +15 -0
- package/dist/rules/templates.d.ts.map +1 -0
- package/dist/rules/templates.js +105 -0
- package/dist/rules/templates.js.map +1 -0
- package/dist/rules/variants.d.ts +12 -0
- package/dist/rules/variants.d.ts.map +1 -0
- package/dist/rules/variants.js +148 -0
- package/dist/rules/variants.js.map +1 -0
- package/dist/tree.d.ts +2 -0
- package/dist/tree.d.ts.map +1 -0
- package/dist/tree.js +2 -0
- package/dist/tree.js.map +1 -0
- package/dist/utils/indent.d.ts +18 -0
- package/dist/utils/indent.d.ts.map +1 -0
- package/dist/utils/indent.js +56 -0
- package/dist/utils/indent.js.map +1 -0
- package/dist/utils/types.d.ts +19 -0
- package/dist/utils/types.d.ts.map +1 -0
- package/dist/utils/types.js +63 -0
- package/dist/utils/types.js.map +1 -0
- package/dist/walker.d.ts +8 -0
- package/dist/walker.d.ts.map +1 -0
- package/dist/walker.js +193 -0
- package/dist/walker.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Footnote definition: [^label]: content
|
|
3
|
+
* Continuation lines indented by 4 spaces.
|
|
4
|
+
*/
|
|
5
|
+
function footnoteDefBlock(state, startLine, endLine, silent) {
|
|
6
|
+
const start = state.bMarks[startLine] + state.tShift[startLine];
|
|
7
|
+
const max = state.eMarks[startLine];
|
|
8
|
+
// Must start with [^
|
|
9
|
+
if (start + 4 > max)
|
|
10
|
+
return false;
|
|
11
|
+
if (state.src.charCodeAt(start) !== 0x5B /* [ */)
|
|
12
|
+
return false;
|
|
13
|
+
if (state.src.charCodeAt(start + 1) !== 0x5E /* ^ */)
|
|
14
|
+
return false;
|
|
15
|
+
// Find closing ]:
|
|
16
|
+
let pos = start + 2;
|
|
17
|
+
while (pos < max) {
|
|
18
|
+
if (state.src.charCodeAt(pos) === 0x5D /* ] */)
|
|
19
|
+
break;
|
|
20
|
+
// No spaces/newlines in label
|
|
21
|
+
if (state.src.charCodeAt(pos) === 0x20)
|
|
22
|
+
return false;
|
|
23
|
+
pos++;
|
|
24
|
+
}
|
|
25
|
+
if (pos >= max)
|
|
26
|
+
return false;
|
|
27
|
+
if (pos + 1 >= max || state.src.charCodeAt(pos + 1) !== 0x3A /* : */)
|
|
28
|
+
return false;
|
|
29
|
+
const label = state.src.slice(start + 2, pos);
|
|
30
|
+
if (!label)
|
|
31
|
+
return false;
|
|
32
|
+
if (silent)
|
|
33
|
+
return true;
|
|
34
|
+
// Content starts after "]: "
|
|
35
|
+
const contentStart = pos + 2;
|
|
36
|
+
const firstLineContent = state.src.slice(contentStart, max).trim();
|
|
37
|
+
// Collect continuation lines (indented by 4+ spaces or empty)
|
|
38
|
+
const contentLines = [firstLineContent];
|
|
39
|
+
let nextLine = startLine + 1;
|
|
40
|
+
while (nextLine < endLine) {
|
|
41
|
+
const lineStart = state.bMarks[nextLine] + state.tShift[nextLine];
|
|
42
|
+
const lineMax = state.eMarks[nextLine];
|
|
43
|
+
const lineContent = state.src.slice(state.bMarks[nextLine], lineMax);
|
|
44
|
+
// Continuation: 4+ spaces indent or empty line within block
|
|
45
|
+
if (lineContent.trim() === "") {
|
|
46
|
+
contentLines.push("");
|
|
47
|
+
nextLine++;
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
// Check for 4-space indent
|
|
51
|
+
const indent = state.sCount[nextLine];
|
|
52
|
+
if (indent < 4)
|
|
53
|
+
break;
|
|
54
|
+
contentLines.push(state.src.slice(lineStart, lineMax));
|
|
55
|
+
nextLine++;
|
|
56
|
+
}
|
|
57
|
+
// Trim trailing empty lines
|
|
58
|
+
while (contentLines.length > 0 && contentLines[contentLines.length - 1] === "") {
|
|
59
|
+
contentLines.pop();
|
|
60
|
+
}
|
|
61
|
+
const content = contentLines.join("\n");
|
|
62
|
+
// Emit tokens
|
|
63
|
+
const openToken = state.push("footnote_def_open", "", 1);
|
|
64
|
+
openToken.meta = { label };
|
|
65
|
+
openToken.map = [startLine, nextLine];
|
|
66
|
+
// Parse content as inline markdown
|
|
67
|
+
const contentToken = state.push("inline", "", 0);
|
|
68
|
+
contentToken.content = content;
|
|
69
|
+
contentToken.map = [startLine, nextLine];
|
|
70
|
+
contentToken.children = [];
|
|
71
|
+
state.push("footnote_def_close", "", -1);
|
|
72
|
+
state.line = nextLine;
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Inline footnote reference: [^label]
|
|
77
|
+
*/
|
|
78
|
+
function footnoteRefInline(state, silent) {
|
|
79
|
+
const start = state.pos;
|
|
80
|
+
const max = state.posMax;
|
|
81
|
+
// Must start with [^
|
|
82
|
+
if (start + 3 > max)
|
|
83
|
+
return false;
|
|
84
|
+
if (state.src.charCodeAt(start) !== 0x5B /* [ */)
|
|
85
|
+
return false;
|
|
86
|
+
if (state.src.charCodeAt(start + 1) !== 0x5E /* ^ */)
|
|
87
|
+
return false;
|
|
88
|
+
// Find closing ]
|
|
89
|
+
let pos = start + 2;
|
|
90
|
+
while (pos < max) {
|
|
91
|
+
if (state.src.charCodeAt(pos) === 0x5D /* ] */)
|
|
92
|
+
break;
|
|
93
|
+
if (state.src.charCodeAt(pos) === 0x20 /* space */)
|
|
94
|
+
return false;
|
|
95
|
+
if (state.src.charCodeAt(pos) === 0x0A /* newline */)
|
|
96
|
+
return false;
|
|
97
|
+
pos++;
|
|
98
|
+
}
|
|
99
|
+
if (pos >= max)
|
|
100
|
+
return false;
|
|
101
|
+
const label = state.src.slice(start + 2, pos);
|
|
102
|
+
if (!label)
|
|
103
|
+
return false;
|
|
104
|
+
if (silent)
|
|
105
|
+
return true;
|
|
106
|
+
const token = state.push("footnote_ref", "", 0);
|
|
107
|
+
token.meta = { label };
|
|
108
|
+
state.pos = pos + 1;
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Core rule: collect footnote definitions from the token stream,
|
|
113
|
+
* store them in env.footnotes, and remove the definition tokens.
|
|
114
|
+
*/
|
|
115
|
+
function footnoteCollect(state) {
|
|
116
|
+
if (state.inlineMode)
|
|
117
|
+
return;
|
|
118
|
+
const footnotes = {};
|
|
119
|
+
const newTokens = [];
|
|
120
|
+
let i = 0;
|
|
121
|
+
while (i < state.tokens.length) {
|
|
122
|
+
const token = state.tokens[i];
|
|
123
|
+
if (token.type === "footnote_def_open") {
|
|
124
|
+
const label = token.meta.label;
|
|
125
|
+
// Next token should be inline with the content
|
|
126
|
+
i++;
|
|
127
|
+
if (i < state.tokens.length && state.tokens[i].type === "inline") {
|
|
128
|
+
footnotes[label] = state.tokens[i].content;
|
|
129
|
+
}
|
|
130
|
+
// Skip to footnote_def_close
|
|
131
|
+
while (i < state.tokens.length && state.tokens[i].type !== "footnote_def_close") {
|
|
132
|
+
i++;
|
|
133
|
+
}
|
|
134
|
+
i++; // skip the close token
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
newTokens.push(token);
|
|
138
|
+
i++;
|
|
139
|
+
}
|
|
140
|
+
state.tokens = newTokens;
|
|
141
|
+
// Store in env for access by the tree builder
|
|
142
|
+
if (Object.keys(footnotes).length > 0) {
|
|
143
|
+
state.env.footnotes = footnotes;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Register footnote block + inline rules with markdown-it.
|
|
148
|
+
*/
|
|
149
|
+
export function footnotesPlugin(md) {
|
|
150
|
+
md.block.ruler.before("reference", "footnote_def", footnoteDefBlock, {
|
|
151
|
+
alt: ["paragraph", "reference"],
|
|
152
|
+
});
|
|
153
|
+
md.inline.ruler.after("image", "footnote_ref", footnoteRefInline);
|
|
154
|
+
md.core.ruler.after("inline", "footnote_collect", footnoteCollect);
|
|
155
|
+
// Custom renderer: output a placeholder tag that ContentRenderer can handle
|
|
156
|
+
md.renderer.rules.footnote_ref = (tokens, idx) => {
|
|
157
|
+
const label = tokens[idx].meta?.label ?? "";
|
|
158
|
+
return `<fn-ref data-label="${label}"></fn-ref>`;
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=footnotes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"footnotes.js","sourceRoot":"","sources":["../../src/rules/footnotes.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,SAAS,gBAAgB,CACvB,KAAiB,EACjB,SAAiB,EACjB,OAAe,EACf,MAAe;IAEf,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAChE,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAEpC,qBAAqB;IACrB,IAAI,KAAK,GAAG,CAAC,GAAG,GAAG;QAAE,OAAO,KAAK,CAAC;IAClC,IAAI,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC/D,IAAI,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAEnE,kBAAkB;IAClB,IAAI,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC;IACpB,OAAO,GAAG,GAAG,GAAG,EAAE,CAAC;QACjB,IAAI,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,OAAO;YAAE,MAAM;QACtD,8BAA8B;QAC9B,IAAI,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC;QACrD,GAAG,EAAE,CAAC;IACR,CAAC;IACD,IAAI,GAAG,IAAI,GAAG;QAAE,OAAO,KAAK,CAAC;IAC7B,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAEnF,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IAC9C,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IAEzB,IAAI,MAAM;QAAE,OAAO,IAAI,CAAC;IAExB,6BAA6B;IAC7B,MAAM,YAAY,GAAG,GAAG,GAAG,CAAC,CAAC;IAC7B,MAAM,gBAAgB,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAEnE,8DAA8D;IAC9D,MAAM,YAAY,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACxC,IAAI,QAAQ,GAAG,SAAS,GAAG,CAAC,CAAC;IAC7B,OAAO,QAAQ,GAAG,OAAO,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAClE,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvC,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;QAErE,4DAA4D;QAC5D,IAAI,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC9B,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACtB,QAAQ,EAAE,CAAC;YACX,SAAS;QACX,CAAC;QAED,2BAA2B;QAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,MAAM,GAAG,CAAC;YAAE,MAAM;QAEtB,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;QACvD,QAAQ,EAAE,CAAC;IACb,CAAC;IAED,4BAA4B;IAC5B,OAAO,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;QAC/E,YAAY,CAAC,GAAG,EAAE,CAAC;IACrB,CAAC;IAED,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAExC,cAAc;IACd,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IACzD,SAAS,CAAC,IAAI,GAAG,EAAE,KAAK,EAAE,CAAC;IAC3B,SAAS,CAAC,GAAG,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAEtC,mCAAmC;IACnC,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IACjD,YAAY,CAAC,OAAO,GAAG,OAAO,CAAC;IAC/B,YAAY,CAAC,GAAG,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACzC,YAAY,CAAC,QAAQ,GAAG,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAEzC,KAAK,CAAC,IAAI,GAAG,QAAQ,CAAC;IACtB,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,KAAkB,EAAE,MAAe;IAC5D,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC;IACxB,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC;IAEzB,qBAAqB;IACrB,IAAI,KAAK,GAAG,CAAC,GAAG,GAAG;QAAE,OAAO,KAAK,CAAC;IAClC,IAAI,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC/D,IAAI,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAEnE,iBAAiB;IACjB,IAAI,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC;IACpB,OAAO,GAAG,GAAG,GAAG,EAAE,CAAC;QACjB,IAAI,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,OAAO;YAAE,MAAM;QACtD,IAAI,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,WAAW;YAAE,OAAO,KAAK,CAAC;QACjE,IAAI,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,aAAa;YAAE,OAAO,KAAK,CAAC;QACnE,GAAG,EAAE,CAAC;IACR,CAAC;IACD,IAAI,GAAG,IAAI,GAAG;QAAE,OAAO,KAAK,CAAC;IAE7B,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IAC9C,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IAEzB,IAAI,MAAM;QAAE,OAAO,IAAI,CAAC;IAExB,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAChD,KAAK,CAAC,IAAI,GAAG,EAAE,KAAK,EAAE,CAAC;IAEvB,KAAK,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;IACpB,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CAAC,KAAgB;IACvC,IAAI,KAAK,CAAC,UAAU;QAAE,OAAO;IAE7B,MAAM,SAAS,GAA2B,EAAE,CAAC;IAC7C,MAAM,SAAS,GAAwB,EAAE,CAAC;IAE1C,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAE9B,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;YACvC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAe,CAAC;YAEzC,+CAA+C;YAC/C,CAAC,EAAE,CAAC;YACJ,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACjE,SAAS,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAC7C,CAAC;YAED,6BAA6B;YAC7B,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,oBAAoB,EAAE,CAAC;gBAChF,CAAC,EAAE,CAAC;YACN,CAAC;YACD,CAAC,EAAE,CAAC,CAAC,uBAAuB;YAC5B,SAAS;QACX,CAAC;QAED,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC,EAAE,CAAC;IACN,CAAC;IAED,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC;IAEzB,8CAA8C;IAC9C,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtC,KAAK,CAAC,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC;IAClC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,EAAc;IAC5C,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,cAAc,EAAE,gBAAgB,EAAE;QACnE,GAAG,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC;KAChC,CAAC,CAAC;IACH,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,cAAc,EAAE,iBAAiB,CAAC,CAAC;IAClE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,kBAAkB,EAAE,eAAe,CAAC,CAAC;IAEnE,4EAA4E;IAC5E,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;QAC/C,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;QAC5C,OAAO,uBAAuB,KAAK,aAAa,CAAC;IACnD,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inline rule: icon/emoji shortcode parser.
|
|
3
|
+
*
|
|
4
|
+
* Matches :shortcode: patterns and emits icon_shortcode tokens.
|
|
5
|
+
* Parses library, variant, name, and size from the shortcode.
|
|
6
|
+
*
|
|
7
|
+
* Patterns:
|
|
8
|
+
* :material-check: → { library: "material", name: "check" }
|
|
9
|
+
* :fontawesome-brands-github: → { library: "fontawesome", variant: "brands", name: "github" }
|
|
10
|
+
* :octicons-file-code-16: → { library: "octicons", name: "file-code", size: "16" }
|
|
11
|
+
* :simple-netlify: → { library: "simple", name: "netlify" }
|
|
12
|
+
* :smile: → { library: "emoji", name: "smile" }
|
|
13
|
+
*/
|
|
14
|
+
import type MarkdownIt from "markdown-it";
|
|
15
|
+
interface ParsedShortcode {
|
|
16
|
+
library: string;
|
|
17
|
+
variant?: string;
|
|
18
|
+
name: string;
|
|
19
|
+
size?: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Parse a shortcode string into library/variant/name/size.
|
|
23
|
+
*/
|
|
24
|
+
export declare function parseShortcode(raw: string): ParsedShortcode;
|
|
25
|
+
/**
|
|
26
|
+
* Register the icon shortcode inline rule with markdown-it.
|
|
27
|
+
*/
|
|
28
|
+
export declare function iconShortcodePlugin(md: MarkdownIt): void;
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=icon-shortcode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icon-shortcode.d.ts","sourceRoot":"","sources":["../../src/rules/icon-shortcode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,UAAU,MAAM,aAAa,CAAC;AA8B1C,UAAU,eAAe;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CA2C3D;AA0GD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,UAAU,GAAG,IAAI,CAExD"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/** Known emoji shortcodes (single word, no hyphen) */
|
|
2
|
+
const KNOWN_EMOJI = new Set([
|
|
3
|
+
"smile", "grinning", "laughing", "rofl", "joy", "wink", "blush", "thinking",
|
|
4
|
+
"thumbsup", "thumbsdown", "clap", "wave", "pray", "handshake",
|
|
5
|
+
"rocket", "star", "fire", "sparkles", "bulb", "wrench", "hammer", "gear",
|
|
6
|
+
"lock", "key", "link", "paperclip", "bookmark", "pushpin", "clipboard",
|
|
7
|
+
"warning", "question", "exclamation", "heart",
|
|
8
|
+
"sun", "moon", "cloud", "zap", "snowflake", "rainbow",
|
|
9
|
+
"computer", "iphone", "email", "globe",
|
|
10
|
+
"eyes", "memo", "books", "package", "tada", "trophy", "medal", "crown",
|
|
11
|
+
"image",
|
|
12
|
+
]);
|
|
13
|
+
/** Known icon library prefixes */
|
|
14
|
+
const LIBRARY_PREFIXES = new Set([
|
|
15
|
+
"material",
|
|
16
|
+
"fontawesome",
|
|
17
|
+
"octicons",
|
|
18
|
+
"simple",
|
|
19
|
+
]);
|
|
20
|
+
/** FontAwesome sub-variants */
|
|
21
|
+
const FA_VARIANTS = new Set(["brands", "solid", "regular"]);
|
|
22
|
+
/** Octicons size suffix pattern */
|
|
23
|
+
const OCTICONS_SIZE_RE = /-(\d+)$/;
|
|
24
|
+
/**
|
|
25
|
+
* Parse a shortcode string into library/variant/name/size.
|
|
26
|
+
*/
|
|
27
|
+
export function parseShortcode(raw) {
|
|
28
|
+
// Try each known library prefix
|
|
29
|
+
for (const prefix of LIBRARY_PREFIXES) {
|
|
30
|
+
if (raw.startsWith(prefix + "-")) {
|
|
31
|
+
const rest = raw.slice(prefix.length + 1);
|
|
32
|
+
if (prefix === "fontawesome") {
|
|
33
|
+
// fontawesome-brands-github, fontawesome-solid-trash
|
|
34
|
+
const dashIdx = rest.indexOf("-");
|
|
35
|
+
if (dashIdx > 0) {
|
|
36
|
+
const maybeVariant = rest.slice(0, dashIdx);
|
|
37
|
+
if (FA_VARIANTS.has(maybeVariant)) {
|
|
38
|
+
return {
|
|
39
|
+
library: "fontawesome",
|
|
40
|
+
variant: maybeVariant,
|
|
41
|
+
name: rest.slice(dashIdx + 1),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// No variant match — treat rest as name
|
|
46
|
+
return { library: "fontawesome", name: rest };
|
|
47
|
+
}
|
|
48
|
+
if (prefix === "octicons") {
|
|
49
|
+
// octicons-file-code-16 — strip trailing size
|
|
50
|
+
const sizeMatch = OCTICONS_SIZE_RE.exec(rest);
|
|
51
|
+
if (sizeMatch) {
|
|
52
|
+
return {
|
|
53
|
+
library: "octicons",
|
|
54
|
+
name: rest.slice(0, -sizeMatch[0].length),
|
|
55
|
+
size: sizeMatch[1],
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
return { library: "octicons", name: rest };
|
|
59
|
+
}
|
|
60
|
+
// material, simple — straightforward
|
|
61
|
+
return { library: prefix, name: rest };
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// No known prefix — treat as emoji shortcode
|
|
65
|
+
return { library: "emoji", name: raw };
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Parse optional attr_list { .class style="..." } after a shortcode.
|
|
69
|
+
* Returns parsed attributes and the number of characters consumed.
|
|
70
|
+
*/
|
|
71
|
+
function parseAttrList(src, pos) {
|
|
72
|
+
if (pos >= src.length || src.charCodeAt(pos) !== 0x7B /* { */)
|
|
73
|
+
return null;
|
|
74
|
+
const closeIdx = src.indexOf("}", pos);
|
|
75
|
+
if (closeIdx < 0)
|
|
76
|
+
return null;
|
|
77
|
+
const inner = src.slice(pos + 1, closeIdx).trim();
|
|
78
|
+
if (!inner)
|
|
79
|
+
return null;
|
|
80
|
+
const attrs = {};
|
|
81
|
+
// Parse .class tokens
|
|
82
|
+
const classMatches = inner.match(/\.[\w-]+/g);
|
|
83
|
+
if (classMatches) {
|
|
84
|
+
attrs.class = classMatches.map((c) => c.slice(1)).join(" ");
|
|
85
|
+
}
|
|
86
|
+
// Parse key="value" pairs
|
|
87
|
+
const kvMatches = inner.matchAll(/([\w-]+)="([^"]*)"/g);
|
|
88
|
+
for (const m of kvMatches) {
|
|
89
|
+
attrs[m[1]] = m[2];
|
|
90
|
+
}
|
|
91
|
+
// Parse #id (only from non-quoted parts to avoid matching hex colors)
|
|
92
|
+
const stripped = inner.replace(/"[^"]*"/g, "");
|
|
93
|
+
const idMatch = stripped.match(/#([\w-]+)/);
|
|
94
|
+
if (idMatch) {
|
|
95
|
+
attrs.id = idMatch[1];
|
|
96
|
+
}
|
|
97
|
+
return { attrs, consumed: closeIdx - pos + 1 };
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* markdown-it inline rule for icon shortcodes.
|
|
101
|
+
*/
|
|
102
|
+
function iconShortcodeRule(state, silent) {
|
|
103
|
+
const src = state.src;
|
|
104
|
+
const pos = state.pos;
|
|
105
|
+
// Must start with :
|
|
106
|
+
if (src.charCodeAt(pos) !== 0x3A /* : */)
|
|
107
|
+
return false;
|
|
108
|
+
// Find closing : — must come before any ] or newline (to avoid interfering with link parser)
|
|
109
|
+
let closeIdx = -1;
|
|
110
|
+
for (let j = pos + 1; j < src.length; j++) {
|
|
111
|
+
const ch = src.charCodeAt(j);
|
|
112
|
+
if (ch === 0x3A /* : */) {
|
|
113
|
+
closeIdx = j;
|
|
114
|
+
break;
|
|
115
|
+
}
|
|
116
|
+
if (ch === 0x5D /* ] */ || ch === 0x0A /* \n */)
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
if (closeIdx < 0)
|
|
120
|
+
return false;
|
|
121
|
+
// Extract shortcode content
|
|
122
|
+
const content = src.slice(pos + 1, closeIdx);
|
|
123
|
+
// Must be a valid shortcode: lowercase letters, digits, hyphens, underscores
|
|
124
|
+
if (!content || !/^[a-z][a-z0-9_-]*$/.test(content))
|
|
125
|
+
return false;
|
|
126
|
+
if (content.length < 2)
|
|
127
|
+
return false;
|
|
128
|
+
// Must contain a hyphen (all icon library shortcodes do) OR be a known emoji
|
|
129
|
+
const hasHyphen = content.includes("-");
|
|
130
|
+
if (!hasHyphen && !KNOWN_EMOJI.has(content))
|
|
131
|
+
return false;
|
|
132
|
+
// Don't match inside words — previous char must be whitespace, start of line, or punctuation
|
|
133
|
+
if (pos > 0) {
|
|
134
|
+
const prevChar = src.charCodeAt(pos - 1);
|
|
135
|
+
// Allow after: space, tab, newline, (, [, {, start of string
|
|
136
|
+
if (prevChar > 0x20 && prevChar !== 0x28 && prevChar !== 0x5B && prevChar !== 0x7B)
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
// Check for optional attr_list after closing :
|
|
140
|
+
let nextPos = closeIdx + 1;
|
|
141
|
+
const attrResult = parseAttrList(src, nextPos);
|
|
142
|
+
if (attrResult) {
|
|
143
|
+
nextPos += attrResult.consumed;
|
|
144
|
+
}
|
|
145
|
+
if (silent) {
|
|
146
|
+
state.pos = nextPos;
|
|
147
|
+
return true;
|
|
148
|
+
}
|
|
149
|
+
const parsed = parseShortcode(content);
|
|
150
|
+
const attrs = attrResult?.attrs;
|
|
151
|
+
const token = state.push("icon_shortcode", "", 0);
|
|
152
|
+
token.meta = {
|
|
153
|
+
raw: content,
|
|
154
|
+
library: parsed.library,
|
|
155
|
+
variant: parsed.variant,
|
|
156
|
+
name: parsed.name,
|
|
157
|
+
size: parsed.size,
|
|
158
|
+
attrs,
|
|
159
|
+
};
|
|
160
|
+
state.pos = nextPos;
|
|
161
|
+
return true;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Register the icon shortcode inline rule with markdown-it.
|
|
165
|
+
*/
|
|
166
|
+
export function iconShortcodePlugin(md) {
|
|
167
|
+
md.inline.ruler.after("image", "icon_shortcode", iconShortcodeRule);
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=icon-shortcode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icon-shortcode.js","sourceRoot":"","sources":["../../src/rules/icon-shortcode.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../src/rules/keys.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,aAAa,CAAC;AA6B1C;;GAEG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,UAAU,GAAG,IAAI,CAE/C"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Matches ++key++ or ++key1+key2++ patterns.
|
|
3
|
+
* The content between ++ delimiters is split on + to get individual keys.
|
|
4
|
+
*/
|
|
5
|
+
const KEYS_RE = /^\+\+([^+]+(?:\+[^+]+)*)\+\+/;
|
|
6
|
+
function keysRule(state, silent) {
|
|
7
|
+
if (state.src.charCodeAt(state.pos) !== 0x2b /* + */)
|
|
8
|
+
return false;
|
|
9
|
+
if (state.src.charCodeAt(state.pos + 1) !== 0x2b /* + */)
|
|
10
|
+
return false;
|
|
11
|
+
const tail = state.src.slice(state.pos);
|
|
12
|
+
const match = KEYS_RE.exec(tail);
|
|
13
|
+
if (!match)
|
|
14
|
+
return false;
|
|
15
|
+
if (!silent) {
|
|
16
|
+
const keys = match[1].split("+");
|
|
17
|
+
const html = keys.map((k) => `<kbd>${k.trim()}</kbd>`).join("+");
|
|
18
|
+
const token = state.push("html_inline", "", 0);
|
|
19
|
+
token.content = html;
|
|
20
|
+
}
|
|
21
|
+
state.pos += match[0].length;
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Register the keyboard keys inline rule with markdown-it.
|
|
26
|
+
*/
|
|
27
|
+
export function keysPlugin(md) {
|
|
28
|
+
md.inline.ruler.before("escape", "keys", keysRule);
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=keys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/rules/keys.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,OAAO,GAAG,8BAA8B,CAAC;AAE/C,SAAS,QAAQ,CAAC,KAAkB,EAAE,MAAe;IACnD,IAAI,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IACnE,IAAI,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAEvE,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IAEzB,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEjE,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QAC/C,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC7B,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,EAAc;IACvC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type MarkdownIt from "markdown-it";
|
|
2
|
+
export interface LinkRewriteOptions {
|
|
3
|
+
/** Base prefix for docs routes (default: "/docs") */
|
|
4
|
+
baseUrl?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function linkRewritePlugin(md: MarkdownIt, options?: LinkRewriteOptions): void;
|
|
7
|
+
//# sourceMappingURL=link-rewrite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link-rewrite.d.ts","sourceRoot":"","sources":["../../src/rules/link-rewrite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,aAAa,CAAC;AAI1C,MAAM,WAAW,kBAAkB;IACjC,qDAAqD;IACrD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAsGD,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,UAAU,EAAE,OAAO,GAAE,kBAAuB,GAAG,IAAI,CAExF"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { posix } from "node:path";
|
|
2
|
+
/**
|
|
3
|
+
* Rewrite .md links to /docs/ routes.
|
|
4
|
+
*
|
|
5
|
+
* Converts relative markdown links like `../setup/foo.md#anchor`
|
|
6
|
+
* to absolute routes like `/docs/setup/foo#anchor`.
|
|
7
|
+
*
|
|
8
|
+
* The current file's path must be set in `env.filePath`
|
|
9
|
+
* (relative to docs root, e.g. "reference/admonitions.md").
|
|
10
|
+
*/
|
|
11
|
+
function createLinkRewriteRule(options) {
|
|
12
|
+
const baseUrl = options.baseUrl ?? "/docs";
|
|
13
|
+
return function linkRewriteRule(state) {
|
|
14
|
+
const filePath = state.env?.filePath;
|
|
15
|
+
if (!filePath)
|
|
16
|
+
return;
|
|
17
|
+
// Directory of the current file relative to docs root
|
|
18
|
+
const fileDir = posix.dirname(filePath.replace(/\\/g, "/"));
|
|
19
|
+
for (const token of state.tokens) {
|
|
20
|
+
if (token.children) {
|
|
21
|
+
rewriteTokens(token.children, fileDir, baseUrl);
|
|
22
|
+
}
|
|
23
|
+
// Also check inline tokens at the block level
|
|
24
|
+
if (token.type === "inline" && token.children) {
|
|
25
|
+
rewriteTokens(token.children, fileDir, baseUrl);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function rewriteTokens(tokens, fileDir, baseUrl) {
|
|
31
|
+
for (const token of tokens) {
|
|
32
|
+
if (token.type === "link_open") {
|
|
33
|
+
const hrefIdx = token.attrIndex("href");
|
|
34
|
+
if (hrefIdx >= 0) {
|
|
35
|
+
const href = token.attrs[hrefIdx][1];
|
|
36
|
+
const rewritten = rewriteHref(href, fileDir, baseUrl);
|
|
37
|
+
if (rewritten !== href) {
|
|
38
|
+
token.attrs[hrefIdx][1] = rewritten;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (token.type === "image") {
|
|
43
|
+
const srcIdx = token.attrIndex("src");
|
|
44
|
+
if (srcIdx >= 0) {
|
|
45
|
+
const src = token.attrs[srcIdx][1];
|
|
46
|
+
const rewritten = rewriteAssetPath(src, fileDir);
|
|
47
|
+
if (rewritten !== src) {
|
|
48
|
+
token.attrs[srcIdx][1] = rewritten;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (token.children) {
|
|
53
|
+
rewriteTokens(token.children, fileDir, baseUrl);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function rewriteHref(href, fileDir, baseUrl) {
|
|
58
|
+
// Skip external URLs, anchors-only, mailto, etc.
|
|
59
|
+
if (href.startsWith("http://") || href.startsWith("https://") ||
|
|
60
|
+
href.startsWith("#") || href.startsWith("mailto:") ||
|
|
61
|
+
href.startsWith("tel:") || href.startsWith("javascript:")) {
|
|
62
|
+
return href;
|
|
63
|
+
}
|
|
64
|
+
// Only rewrite .md links
|
|
65
|
+
if (!href.includes(".md"))
|
|
66
|
+
return href;
|
|
67
|
+
// Split anchor
|
|
68
|
+
const [path, anchor] = href.split("#", 2);
|
|
69
|
+
// Resolve relative path
|
|
70
|
+
const resolved = posix.normalize(posix.join(fileDir, path));
|
|
71
|
+
// Convert to route: strip .md, strip /index suffix
|
|
72
|
+
let route = resolved
|
|
73
|
+
.replace(/\.md$/, "")
|
|
74
|
+
.replace(/\/index$/, "");
|
|
75
|
+
// Clean up leading dots or slashes
|
|
76
|
+
route = route.replace(/^\.?\/?/, "");
|
|
77
|
+
const fullRoute = route ? `${baseUrl}/${route}` : baseUrl;
|
|
78
|
+
return anchor ? `${fullRoute}#${anchor}` : fullRoute;
|
|
79
|
+
}
|
|
80
|
+
function rewriteAssetPath(src, fileDir) {
|
|
81
|
+
// Skip external URLs and absolute paths
|
|
82
|
+
if (src.startsWith("http://") || src.startsWith("https://") ||
|
|
83
|
+
src.startsWith("/") || src.startsWith("data:")) {
|
|
84
|
+
return src;
|
|
85
|
+
}
|
|
86
|
+
// Resolve relative path to absolute from docs root
|
|
87
|
+
const resolved = posix.normalize(posix.join(fileDir, src));
|
|
88
|
+
return `/${resolved.replace(/^\.?\/?/, "")}`;
|
|
89
|
+
}
|
|
90
|
+
export function linkRewritePlugin(md, options = {}) {
|
|
91
|
+
md.core.ruler.push("link_rewrite", createLinkRewriteRule(options));
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=link-rewrite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"link-rewrite.js","sourceRoot":"","sources":["../../src/rules/link-rewrite.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Math rules for markdown-it.
|
|
3
|
+
*
|
|
4
|
+
* Inline: $...$ (single dollar, not escaped)
|
|
5
|
+
* Block: $$...$$ on separate lines
|
|
6
|
+
*
|
|
7
|
+
* Emits math_inline and math_block tokens with meta.latex.
|
|
8
|
+
*/
|
|
9
|
+
import type MarkdownIt from "markdown-it";
|
|
10
|
+
/**
|
|
11
|
+
* Register math rules with markdown-it.
|
|
12
|
+
*/
|
|
13
|
+
export declare function mathPlugin(md: MarkdownIt): void;
|
|
14
|
+
//# sourceMappingURL=math.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"math.d.ts","sourceRoot":"","sources":["../../src/rules/math.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,UAAU,MAAM,aAAa,CAAC;AA2H1C;;GAEG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,UAAU,GAAG,IAAI,CAK/C"}
|