@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,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inline rule: matches $...$ for inline math.
|
|
3
|
+
* Does not match $$ (that's block math handled by block rule).
|
|
4
|
+
*/
|
|
5
|
+
function mathInlineRule(state, silent) {
|
|
6
|
+
const src = state.src;
|
|
7
|
+
const pos = state.pos;
|
|
8
|
+
// Must start with $
|
|
9
|
+
if (src.charCodeAt(pos) !== 0x24 /* $ */)
|
|
10
|
+
return false;
|
|
11
|
+
// Must not be $$ (block math)
|
|
12
|
+
if (pos + 1 < src.length && src.charCodeAt(pos + 1) === 0x24)
|
|
13
|
+
return false;
|
|
14
|
+
// Must not be escaped
|
|
15
|
+
if (pos > 0 && src.charCodeAt(pos - 1) === 0x5C /* \ */)
|
|
16
|
+
return false;
|
|
17
|
+
// Find closing $ (not escaped, not $$)
|
|
18
|
+
let closeIdx = -1;
|
|
19
|
+
for (let j = pos + 1; j < src.length; j++) {
|
|
20
|
+
if (src.charCodeAt(j) === 0x24 /* $ */) {
|
|
21
|
+
// Check it's not escaped
|
|
22
|
+
if (src.charCodeAt(j - 1) !== 0x5C /* \ */) {
|
|
23
|
+
closeIdx = j;
|
|
24
|
+
break;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
// Don't cross newlines
|
|
28
|
+
if (src.charCodeAt(j) === 0x0A /* \n */)
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
31
|
+
if (closeIdx < 0)
|
|
32
|
+
return false;
|
|
33
|
+
const latex = src.slice(pos + 1, closeIdx);
|
|
34
|
+
if (!latex.trim())
|
|
35
|
+
return false;
|
|
36
|
+
if (silent) {
|
|
37
|
+
state.pos = closeIdx + 1;
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
const token = state.push("math_inline", "math", 0);
|
|
41
|
+
token.content = latex;
|
|
42
|
+
token.meta = { latex };
|
|
43
|
+
state.pos = closeIdx + 1;
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Block rule: matches $$...$$ on separate lines.
|
|
48
|
+
*
|
|
49
|
+
* Pattern:
|
|
50
|
+
* $$
|
|
51
|
+
* latex content
|
|
52
|
+
* $$
|
|
53
|
+
*/
|
|
54
|
+
function mathBlockRule(state, startLine, endLine, silent) {
|
|
55
|
+
const startPos = state.bMarks[startLine] + state.tShift[startLine];
|
|
56
|
+
const maxPos = state.eMarks[startLine];
|
|
57
|
+
const lineText = state.src.slice(startPos, maxPos).trim();
|
|
58
|
+
// Must start with $$
|
|
59
|
+
if (!lineText.startsWith("$$"))
|
|
60
|
+
return false;
|
|
61
|
+
// Check if it's a single-line block: $$ latex $$
|
|
62
|
+
if (lineText.length > 2 && lineText.endsWith("$$") && lineText.length > 4) {
|
|
63
|
+
if (silent)
|
|
64
|
+
return true;
|
|
65
|
+
const latex = lineText.slice(2, -2).trim();
|
|
66
|
+
const token = state.push("math_block", "div", 0);
|
|
67
|
+
token.content = latex;
|
|
68
|
+
token.meta = { latex };
|
|
69
|
+
token.map = [startLine, startLine + 1];
|
|
70
|
+
state.line = startLine + 1;
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
// Multi-line: find closing $$
|
|
74
|
+
let nextLine = startLine + 1;
|
|
75
|
+
let found = false;
|
|
76
|
+
while (nextLine < endLine) {
|
|
77
|
+
const nPos = state.bMarks[nextLine] + state.tShift[nextLine];
|
|
78
|
+
const nMax = state.eMarks[nextLine];
|
|
79
|
+
const nText = state.src.slice(nPos, nMax).trim();
|
|
80
|
+
if (nText === "$$") {
|
|
81
|
+
found = true;
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
nextLine++;
|
|
85
|
+
}
|
|
86
|
+
if (!found)
|
|
87
|
+
return false;
|
|
88
|
+
if (silent)
|
|
89
|
+
return true;
|
|
90
|
+
// Collect content between $$ markers
|
|
91
|
+
const contentLines = [];
|
|
92
|
+
for (let line = startLine + 1; line < nextLine; line++) {
|
|
93
|
+
const lPos = state.bMarks[line] + state.tShift[line];
|
|
94
|
+
const lMax = state.eMarks[line];
|
|
95
|
+
contentLines.push(state.src.slice(lPos, lMax));
|
|
96
|
+
}
|
|
97
|
+
const latex = contentLines.join("\n").trim();
|
|
98
|
+
const token = state.push("math_block", "div", 0);
|
|
99
|
+
token.content = latex;
|
|
100
|
+
token.meta = { latex };
|
|
101
|
+
token.map = [startLine, nextLine + 1];
|
|
102
|
+
state.line = nextLine + 1;
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Register math rules with markdown-it.
|
|
107
|
+
*/
|
|
108
|
+
export function mathPlugin(md) {
|
|
109
|
+
md.inline.ruler.after("escape", "math_inline", mathInlineRule);
|
|
110
|
+
md.block.ruler.before("fence", "math_block", mathBlockRule, {
|
|
111
|
+
alt: ["paragraph", "reference", "blockquote"],
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=math.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"math.js","sourceRoot":"","sources":["../../src/rules/math.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"md-in-html.d.ts","sourceRoot":"","sources":["../../src/rules/md-in-html.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,aAAa,CAAC;AA8J1C;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,UAAU,GAAG,IAAI,CAEnD"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Matches an opening HTML tag with a `markdown` attribute.
|
|
3
|
+
* Captures: tag name, all attributes, markdown value.
|
|
4
|
+
*/
|
|
5
|
+
const OPEN_TAG_RE = /^<(\w+)((?:\s+[^>]*?)?)(?:\s+markdown(?:="([^"]*)")?)((?:\s+[^>]*?)?)\s*>/i;
|
|
6
|
+
/**
|
|
7
|
+
* Matches a closing HTML tag.
|
|
8
|
+
*/
|
|
9
|
+
function closingTagRe(tag) {
|
|
10
|
+
return new RegExp(`^</${tag}\\s*>`, "i");
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Parse an HTML opening tag string, extract tag name, attributes (without markdown), and markdown mode.
|
|
14
|
+
*/
|
|
15
|
+
function parseOpenTag(html) {
|
|
16
|
+
const match = OPEN_TAG_RE.exec(html.trim());
|
|
17
|
+
if (!match)
|
|
18
|
+
return null;
|
|
19
|
+
const tag = match[1].toLowerCase();
|
|
20
|
+
const attrsBefore = match[2] || "";
|
|
21
|
+
const markdownValue = match[3]; // undefined for bare `markdown`, or "1", "block", "span"
|
|
22
|
+
const attrsAfter = match[4] || "";
|
|
23
|
+
const mode = markdownValue === "span" ? "span" : "block";
|
|
24
|
+
// Reconstruct opening tag without markdown attribute
|
|
25
|
+
const cleanedOpen = `<${tag}${attrsBefore}${attrsAfter}>`.replace(/\s+>/g, ">");
|
|
26
|
+
// Check if this is a self-contained block (has closing tag in same string)
|
|
27
|
+
const afterOpen = html.slice(html.indexOf(">") + 1);
|
|
28
|
+
const innerEnd = afterOpen.lastIndexOf(`</${tag}`);
|
|
29
|
+
if (innerEnd >= 0) {
|
|
30
|
+
// Self-contained: <div markdown>content</div>
|
|
31
|
+
const innerContent = afterOpen.slice(0, innerEnd);
|
|
32
|
+
return { tag, cleanedOpen, mode, innerContent, closingTag: `</${tag}>` };
|
|
33
|
+
}
|
|
34
|
+
return { tag, cleanedOpen, mode, innerContent: null, closingTag: null };
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Extract attributes from a cleaned opening tag as a Record.
|
|
38
|
+
*/
|
|
39
|
+
function extractAttrs(cleanedOpen) {
|
|
40
|
+
const attrs = {};
|
|
41
|
+
const attrRe = /(\w[\w-]*)(?:="([^"]*)")?/g;
|
|
42
|
+
// Skip the tag name
|
|
43
|
+
const inner = cleanedOpen.replace(/^<\w+\s*/, "").replace(/\s*>$/, "");
|
|
44
|
+
let m;
|
|
45
|
+
while ((m = attrRe.exec(inner)) !== null) {
|
|
46
|
+
attrs[m[1]] = m[2] ?? "";
|
|
47
|
+
}
|
|
48
|
+
return attrs;
|
|
49
|
+
}
|
|
50
|
+
function mdInHtmlRule(state) {
|
|
51
|
+
const tokens = state.tokens;
|
|
52
|
+
let i = 0;
|
|
53
|
+
while (i < tokens.length) {
|
|
54
|
+
if (tokens[i].type !== "html_block") {
|
|
55
|
+
i++;
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
const parsed = parseOpenTag(tokens[i].content);
|
|
59
|
+
if (!parsed) {
|
|
60
|
+
i++;
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
const { tag, cleanedOpen, mode, innerContent } = parsed;
|
|
64
|
+
const attrs = extractAttrs(cleanedOpen);
|
|
65
|
+
// Case 1: Self-contained block (open + content + close in one token)
|
|
66
|
+
if (innerContent !== null) {
|
|
67
|
+
const openToken = new state.Token("html_container_open", "", 1);
|
|
68
|
+
openToken.meta = { tag, attrs };
|
|
69
|
+
openToken.block = true;
|
|
70
|
+
const closeToken = new state.Token("html_container_close", "", -1);
|
|
71
|
+
closeToken.meta = { tag };
|
|
72
|
+
closeToken.block = true;
|
|
73
|
+
if (mode === "span") {
|
|
74
|
+
// Inline-only parsing
|
|
75
|
+
const inlineToken = new state.Token("inline", "", 0);
|
|
76
|
+
inlineToken.content = innerContent.trim();
|
|
77
|
+
inlineToken.children = [];
|
|
78
|
+
tokens.splice(i, 1, openToken, inlineToken, closeToken);
|
|
79
|
+
i += 3;
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
// Block-level: re-parse inner content
|
|
83
|
+
const innerTokens = state.md.parse(innerContent, state.env);
|
|
84
|
+
tokens.splice(i, 1, openToken, ...innerTokens, closeToken);
|
|
85
|
+
i += innerTokens.length + 2;
|
|
86
|
+
}
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
// Case 2: Multi-token block (open tag, then parsed tokens, then close tag)
|
|
90
|
+
// Find matching closing html_block
|
|
91
|
+
const closeRe = closingTagRe(tag);
|
|
92
|
+
let depth = 1;
|
|
93
|
+
let j = i + 1;
|
|
94
|
+
const openRe = new RegExp(`^<${tag}[\\s>]`, "i");
|
|
95
|
+
while (j < tokens.length && depth > 0) {
|
|
96
|
+
if (tokens[j].type === "html_block") {
|
|
97
|
+
const content = tokens[j].content.trim();
|
|
98
|
+
if (openRe.test(content)) {
|
|
99
|
+
depth++;
|
|
100
|
+
}
|
|
101
|
+
else if (closeRe.test(content)) {
|
|
102
|
+
depth--;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
if (depth > 0)
|
|
106
|
+
j++;
|
|
107
|
+
}
|
|
108
|
+
if (depth !== 0) {
|
|
109
|
+
// No matching close found — skip
|
|
110
|
+
i++;
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
// j is now at the closing html_block token
|
|
114
|
+
// Tokens between i and j are already parsed by markdown-it
|
|
115
|
+
const openToken = new state.Token("html_container_open", "", 1);
|
|
116
|
+
openToken.meta = { tag, attrs };
|
|
117
|
+
openToken.block = true;
|
|
118
|
+
const closeToken = new state.Token("html_container_close", "", -1);
|
|
119
|
+
closeToken.meta = { tag };
|
|
120
|
+
closeToken.block = true;
|
|
121
|
+
// Replace: open html_block → html_container_open, close html_block → html_container_close
|
|
122
|
+
// Tokens between stay as-is (already parsed)
|
|
123
|
+
tokens.splice(j, 1, closeToken);
|
|
124
|
+
tokens.splice(i, 1, openToken);
|
|
125
|
+
// Continue from i+1 to process any nested markdown containers inside
|
|
126
|
+
i++;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Register the md_in_html core rule with markdown-it.
|
|
131
|
+
*/
|
|
132
|
+
export function mdInHtmlPlugin(md) {
|
|
133
|
+
md.core.ruler.push("md_in_html", mdInHtmlRule);
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=md-in-html.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"md-in-html.js","sourceRoot":"","sources":["../../src/rules/md-in-html.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type MarkdownIt from "markdown-it";
|
|
2
|
+
export interface SnippetsOptions {
|
|
3
|
+
root: string;
|
|
4
|
+
autoAppend?: string[];
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Register the snippets core rule with markdown-it.
|
|
8
|
+
*/
|
|
9
|
+
export declare function snippetsPlugin(md: MarkdownIt, options: SnippetsOptions): void;
|
|
10
|
+
//# sourceMappingURL=snippets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snippets.d.ts","sourceRoot":"","sources":["../../src/rules/snippets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,aAAa,CAAC;AAK1C,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAgHD;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,eAAe,GAAG,IAAI,CAE7E"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
/**
|
|
4
|
+
* Single-line snippet: --8<-- "path/to/file.md"
|
|
5
|
+
*/
|
|
6
|
+
const SINGLE_RE = /^--8<--\s+"([^"]+)"\s*$/;
|
|
7
|
+
/**
|
|
8
|
+
* Multi-line snippet block start/end: --8<-- (on its own line)
|
|
9
|
+
*/
|
|
10
|
+
const BLOCK_FENCE_RE = /^--8<--\s*$/;
|
|
11
|
+
/**
|
|
12
|
+
* Line inside a multi-line snippet block: "path/to/file.md"
|
|
13
|
+
*/
|
|
14
|
+
const BLOCK_ENTRY_RE = /^\s+"([^"]+)"\s*$/;
|
|
15
|
+
function createSnippetsRule(options) {
|
|
16
|
+
return function snippetsRule(state) {
|
|
17
|
+
// Skip during renderInline — snippets only apply to full document parsing
|
|
18
|
+
if (state.inlineMode)
|
|
19
|
+
return;
|
|
20
|
+
const lines = state.src.split("\n");
|
|
21
|
+
let changed = false;
|
|
22
|
+
const includes = [];
|
|
23
|
+
let i = 0;
|
|
24
|
+
while (i < lines.length) {
|
|
25
|
+
// Single-line snippet
|
|
26
|
+
const singleMatch = SINGLE_RE.exec(lines[i]);
|
|
27
|
+
if (singleMatch) {
|
|
28
|
+
const filePath = resolve(options.root, singleMatch[1]);
|
|
29
|
+
try {
|
|
30
|
+
const content = readFileSync(filePath, "utf-8");
|
|
31
|
+
lines[i] = content.replace(/\n$/, ""); // trim trailing newline
|
|
32
|
+
includes.push(filePath);
|
|
33
|
+
changed = true;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
// Leave line as-is if file not found
|
|
37
|
+
}
|
|
38
|
+
i++;
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
// Multi-line snippet block
|
|
42
|
+
if (BLOCK_FENCE_RE.test(lines[i])) {
|
|
43
|
+
const blockStart = i;
|
|
44
|
+
i++;
|
|
45
|
+
const filePaths = [];
|
|
46
|
+
while (i < lines.length && !BLOCK_FENCE_RE.test(lines[i])) {
|
|
47
|
+
const entryMatch = BLOCK_ENTRY_RE.exec(lines[i]);
|
|
48
|
+
if (entryMatch) {
|
|
49
|
+
filePaths.push(entryMatch[1]);
|
|
50
|
+
}
|
|
51
|
+
i++;
|
|
52
|
+
}
|
|
53
|
+
// If we found the closing fence
|
|
54
|
+
if (i < lines.length) {
|
|
55
|
+
const contents = [];
|
|
56
|
+
for (const fp of filePaths) {
|
|
57
|
+
const absPath = resolve(options.root, fp);
|
|
58
|
+
try {
|
|
59
|
+
contents.push(readFileSync(absPath, "utf-8").replace(/\n$/, ""));
|
|
60
|
+
includes.push(absPath);
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
// Skip missing files
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// Replace the block with concatenated contents
|
|
67
|
+
const replacement = contents.join("\n");
|
|
68
|
+
lines.splice(blockStart, i - blockStart + 1, replacement);
|
|
69
|
+
i = blockStart + 1;
|
|
70
|
+
changed = true;
|
|
71
|
+
}
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
i++;
|
|
75
|
+
}
|
|
76
|
+
// Auto-append files (like pymdownx.snippets auto_append)
|
|
77
|
+
if (options.autoAppend) {
|
|
78
|
+
for (const appendPath of options.autoAppend) {
|
|
79
|
+
const absPath = resolve(options.root, appendPath);
|
|
80
|
+
try {
|
|
81
|
+
const content = readFileSync(absPath, "utf-8").replace(/\n$/, "");
|
|
82
|
+
lines.push("", content);
|
|
83
|
+
includes.push(absPath);
|
|
84
|
+
changed = true;
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
// Skip missing files
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
if (changed) {
|
|
92
|
+
state.src = lines.join("\n");
|
|
93
|
+
}
|
|
94
|
+
// Track includes for HMR
|
|
95
|
+
if (includes.length > 0) {
|
|
96
|
+
if (!state.env.includes) {
|
|
97
|
+
state.env.includes = [];
|
|
98
|
+
}
|
|
99
|
+
state.env.includes.push(...includes);
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Register the snippets core rule with markdown-it.
|
|
105
|
+
*/
|
|
106
|
+
export function snippetsPlugin(md, options) {
|
|
107
|
+
md.core.ruler.before("normalize", "snippets", createSnippetsRule(options));
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=snippets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snippets.js","sourceRoot":"","sources":["../../src/rules/snippets.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type MarkdownIt from "markdown-it";
|
|
2
|
+
export interface TemplatesOptions {
|
|
3
|
+
/** Named data files to load as template variables: { varName: "path/to/file.yml" } */
|
|
4
|
+
dataFiles?: Record<string, string>;
|
|
5
|
+
/** Directory of YAML/JSON files — each file becomes a variable (filename without extension) */
|
|
6
|
+
dataDir?: string;
|
|
7
|
+
/** Inline data (merged with loaded files, lowest priority) */
|
|
8
|
+
data?: Record<string, unknown>;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Register the templates preprocessor as a markdown-it core rule.
|
|
12
|
+
* Must run BEFORE all other core rules (templates expand first).
|
|
13
|
+
*/
|
|
14
|
+
export declare function templatesPlugin(md: MarkdownIt, options: TemplatesOptions): void;
|
|
15
|
+
//# sourceMappingURL=templates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/rules/templates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,aAAa,CAAC;AAO1C,MAAM,WAAW,gBAAgB;IAC/B,sFAAsF;IACtF,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,+FAA+F;IAC/F,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8DAA8D;IAC9D,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AA2GD;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,EAAE,EAAE,UAAU,EACd,OAAO,EAAE,gBAAgB,GACxB,IAAI,CAEN"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import nunjucks from "nunjucks";
|
|
2
|
+
import { readFileSync, existsSync, readdirSync } from "node:fs";
|
|
3
|
+
import { join, extname } from "node:path";
|
|
4
|
+
import YAML from "yaml";
|
|
5
|
+
function loadDataFile(filePath) {
|
|
6
|
+
const content = readFileSync(filePath, "utf-8");
|
|
7
|
+
const ext = extname(filePath).toLowerCase();
|
|
8
|
+
if (ext === ".json") {
|
|
9
|
+
return JSON.parse(content);
|
|
10
|
+
}
|
|
11
|
+
return YAML.parse(content);
|
|
12
|
+
}
|
|
13
|
+
function loadContext(options) {
|
|
14
|
+
const context = { ...options.data };
|
|
15
|
+
// Load named data files
|
|
16
|
+
if (options.dataFiles) {
|
|
17
|
+
for (const [name, filePath] of Object.entries(options.dataFiles)) {
|
|
18
|
+
try {
|
|
19
|
+
context[name] = loadDataFile(filePath);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
// Skip missing or invalid files
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
// Load all files from data directory
|
|
27
|
+
if (options.dataDir && existsSync(options.dataDir)) {
|
|
28
|
+
try {
|
|
29
|
+
for (const entry of readdirSync(options.dataDir)) {
|
|
30
|
+
const ext = extname(entry).toLowerCase();
|
|
31
|
+
if (ext === ".yml" || ext === ".yaml" || ext === ".json") {
|
|
32
|
+
const name = entry.replace(/\.[^.]+$/, "");
|
|
33
|
+
if (!(name in context)) {
|
|
34
|
+
try {
|
|
35
|
+
context[name] = loadDataFile(join(options.dataDir, entry));
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
// Skip invalid files
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
// Skip unreadable directory
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return context;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Convert Python-specific Jinja2 syntax to nunjucks-compatible syntax.
|
|
52
|
+
* - `list[:10]` → `list | slice(0, 10) | first` (nunjucks slice returns chunks)
|
|
53
|
+
* - `dict.values() | list` → dict handling via custom filter
|
|
54
|
+
*/
|
|
55
|
+
function patchPythonSyntax(src) {
|
|
56
|
+
// Convert Python slice [:N] to nunjucks-compatible slice filter
|
|
57
|
+
// e.g. `people.experts[:50]` → `people.experts[:50]` needs custom handling
|
|
58
|
+
// Simplest: use a regex to rewrite `expr[:N]` to `(expr)[:N]` is not valid in nunjucks
|
|
59
|
+
// Instead, we'll use a custom approach with a preprocess regex
|
|
60
|
+
// Step 1: `(dict.values() | list)[:N]` → `dict | dictValues | truncateList(N)`
|
|
61
|
+
src = src.replace(/\(([\w.]+)\.values\(\)\s*\|\s*list\)\[:(\d+)\]/g, "$1 | dictValues | truncateList($2)");
|
|
62
|
+
// Step 2: `dict.values() | list` (without slice) → `dict | dictValues`
|
|
63
|
+
src = src.replace(/([\w.]+)\.values\(\)\s*\|\s*list/g, "$1 | dictValues");
|
|
64
|
+
// Step 3: `list[:N]` → `list | truncateList(N)`
|
|
65
|
+
src = src.replace(/([\w.]+)\[:(\d+)\]/g, "$1 | truncateList($2)");
|
|
66
|
+
return src;
|
|
67
|
+
}
|
|
68
|
+
function createTemplatesRule(options) {
|
|
69
|
+
const context = loadContext(options);
|
|
70
|
+
const env = new nunjucks.Environment(null, { autoescape: false });
|
|
71
|
+
// Custom filter: truncate list to N items (replaces Python [:N] slicing)
|
|
72
|
+
env.addFilter("truncateList", (arr, n) => {
|
|
73
|
+
if (!Array.isArray(arr))
|
|
74
|
+
return arr;
|
|
75
|
+
return arr.slice(0, n);
|
|
76
|
+
});
|
|
77
|
+
// Custom filter: get dict values as array (replaces Python .values() | list)
|
|
78
|
+
env.addFilter("dictValues", (obj) => {
|
|
79
|
+
if (!obj || typeof obj !== "object")
|
|
80
|
+
return [];
|
|
81
|
+
return Object.values(obj);
|
|
82
|
+
});
|
|
83
|
+
return function templatesRule(state) {
|
|
84
|
+
if (state.inlineMode)
|
|
85
|
+
return;
|
|
86
|
+
// Skip files without template syntax (performance)
|
|
87
|
+
if (!state.src.includes("{%") && !state.src.includes("{{"))
|
|
88
|
+
return;
|
|
89
|
+
try {
|
|
90
|
+
const patched = patchPythonSyntax(state.src);
|
|
91
|
+
state.src = env.renderString(patched, context);
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
// Leave source as-is on render failure
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Register the templates preprocessor as a markdown-it core rule.
|
|
100
|
+
* Must run BEFORE all other core rules (templates expand first).
|
|
101
|
+
*/
|
|
102
|
+
export function templatesPlugin(md, options) {
|
|
103
|
+
md.core.ruler.before("normalize", "templates", createTemplatesRule(options));
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/rules/templates.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type MarkdownIt from "markdown-it";
|
|
2
|
+
export interface VariantsOptions {
|
|
3
|
+
/** Root directory for resolving {* *} paths (same as fileInclude.docsDir) */
|
|
4
|
+
docsDir: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Register the variants preprocessor as a markdown-it core rule.
|
|
8
|
+
* Must run BEFORE file_include so that expanded tab blocks
|
|
9
|
+
* get their {* *} includes resolved.
|
|
10
|
+
*/
|
|
11
|
+
export declare function variantsPlugin(md: MarkdownIt, options: VariantsOptions): void;
|
|
12
|
+
//# sourceMappingURL=variants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"variants.d.ts","sourceRoot":"","sources":["../../src/rules/variants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,aAAa,CAAC;AAK1C,MAAM,WAAW,eAAe;IAC9B,6EAA6E;IAC7E,OAAO,EAAE,MAAM,CAAC;CACjB;AAyJD;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,EAAE,EAAE,UAAU,EACd,OAAO,EAAE,eAAe,GACvB,IAAI,CAEN"}
|