@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,172 @@
|
|
|
1
|
+
import { resolveType, autoTitle } from "../utils/types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Opening line regex for PyMdownX blocks syntax.
|
|
4
|
+
*
|
|
5
|
+
* Group 1: Slash delimiter — `///`, `////`, etc.
|
|
6
|
+
* Group 2: Block type keyword — `note`, `details`, `tab`, etc.
|
|
7
|
+
* Group 3: Title (optional) — text after `|` separator
|
|
8
|
+
*/
|
|
9
|
+
const BLOCKS_OPEN_RE = /^(\/{3,})\s+([\w-]+)(?:\s*\|\s*(.+?))?\s*$/;
|
|
10
|
+
function getLineText(state, line) {
|
|
11
|
+
const pos = state.bMarks[line] + state.tShift[line];
|
|
12
|
+
const max = state.eMarks[line];
|
|
13
|
+
return state.src.slice(pos, max);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Find the closing delimiter line that matches the given slash count.
|
|
17
|
+
* Returns the line number of the closing delimiter, or -1 if not found.
|
|
18
|
+
*/
|
|
19
|
+
function findClosingDelimiter(state, startLine, endLine, slashCount) {
|
|
20
|
+
const closeRe = new RegExp(`^\\/{${slashCount}}\\s*$`);
|
|
21
|
+
for (let line = startLine; line < endLine; line++) {
|
|
22
|
+
const text = getLineText(state, line);
|
|
23
|
+
if (closeRe.test(text))
|
|
24
|
+
return line;
|
|
25
|
+
}
|
|
26
|
+
return -1;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Parse a single block (admonition or details) and emit tokens.
|
|
30
|
+
* Returns the line after the closing delimiter, or -1 if no closing found.
|
|
31
|
+
*/
|
|
32
|
+
function parseSingleBlock(state, startLine, endLine, slashCount, blockType, titleRaw) {
|
|
33
|
+
const contentStart = startLine + 1;
|
|
34
|
+
const closeLine = findClosingDelimiter(state, contentStart, endLine, slashCount);
|
|
35
|
+
if (closeLine === -1)
|
|
36
|
+
return -1;
|
|
37
|
+
const isDetails = blockType === "details";
|
|
38
|
+
const tokenType = isDetails ? "details" : "admonition";
|
|
39
|
+
const variant = isDetails ? "note" : resolveType(blockType);
|
|
40
|
+
// Title resolution
|
|
41
|
+
let title;
|
|
42
|
+
if (titleRaw !== null) {
|
|
43
|
+
title = titleRaw.trim();
|
|
44
|
+
}
|
|
45
|
+
else if (isDetails) {
|
|
46
|
+
title = "Details";
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
title = autoTitle(blockType);
|
|
50
|
+
}
|
|
51
|
+
// Emit opening token
|
|
52
|
+
const slashes = "/".repeat(slashCount);
|
|
53
|
+
const openToken = state.push(`${tokenType}_open`, "", 1);
|
|
54
|
+
openToken.info = variant;
|
|
55
|
+
openToken.meta = { title, inline: null, open: false };
|
|
56
|
+
openToken.markup = slashes;
|
|
57
|
+
openToken.map = [startLine, closeLine + 1];
|
|
58
|
+
openToken.block = true;
|
|
59
|
+
// Tokenize inner content (no dedent needed — content is at normal indent)
|
|
60
|
+
const contentEnd = closeLine;
|
|
61
|
+
if (contentEnd > contentStart) {
|
|
62
|
+
const oldParentType = state.parentType;
|
|
63
|
+
const oldLineMax = state.lineMax;
|
|
64
|
+
state.parentType = "admonition";
|
|
65
|
+
state.lineMax = contentEnd;
|
|
66
|
+
state.md.block.tokenize(state, contentStart, contentEnd);
|
|
67
|
+
state.parentType = oldParentType;
|
|
68
|
+
state.lineMax = oldLineMax;
|
|
69
|
+
}
|
|
70
|
+
// Emit closing token
|
|
71
|
+
const closeToken = state.push(`${tokenType}_close`, "", -1);
|
|
72
|
+
closeToken.markup = slashes;
|
|
73
|
+
closeToken.block = true;
|
|
74
|
+
return closeLine + 1;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Parse consecutive tab blocks and wrap in a tab set.
|
|
78
|
+
* Returns the line after the last tab's closing delimiter.
|
|
79
|
+
*/
|
|
80
|
+
function parseTabBlocks(state, startLine, endLine, slashCount, firstTitle) {
|
|
81
|
+
// Open tab set
|
|
82
|
+
const setOpen = state.push("tab_set_open", "", 1);
|
|
83
|
+
setOpen.map = [startLine, startLine]; // updated at end
|
|
84
|
+
setOpen.block = true;
|
|
85
|
+
const slashes = "/".repeat(slashCount);
|
|
86
|
+
let line = startLine;
|
|
87
|
+
let title = firstTitle;
|
|
88
|
+
while (line < endLine) {
|
|
89
|
+
const contentStart = line + 1;
|
|
90
|
+
const closeLine = findClosingDelimiter(state, contentStart, endLine, slashCount);
|
|
91
|
+
if (closeLine === -1) {
|
|
92
|
+
// No closing delimiter — roll back tab set and fail
|
|
93
|
+
// Remove the tab_set_open token we already pushed
|
|
94
|
+
state.tokens.pop();
|
|
95
|
+
return -1;
|
|
96
|
+
}
|
|
97
|
+
// Open tab panel
|
|
98
|
+
const panelOpen = state.push("tab_panel_open", "", 1);
|
|
99
|
+
panelOpen.info = title;
|
|
100
|
+
panelOpen.markup = slashes;
|
|
101
|
+
panelOpen.map = [line, closeLine + 1];
|
|
102
|
+
panelOpen.block = true;
|
|
103
|
+
// Tokenize inner content
|
|
104
|
+
const contentEnd = closeLine;
|
|
105
|
+
if (contentEnd > contentStart) {
|
|
106
|
+
const oldParentType = state.parentType;
|
|
107
|
+
const oldLineMax = state.lineMax;
|
|
108
|
+
state.parentType = "tab";
|
|
109
|
+
state.lineMax = contentEnd;
|
|
110
|
+
state.md.block.tokenize(state, contentStart, contentEnd);
|
|
111
|
+
state.parentType = oldParentType;
|
|
112
|
+
state.lineMax = oldLineMax;
|
|
113
|
+
}
|
|
114
|
+
// Close tab panel
|
|
115
|
+
const panelClose = state.push("tab_panel_close", "", -1);
|
|
116
|
+
panelClose.markup = slashes;
|
|
117
|
+
panelClose.block = true;
|
|
118
|
+
line = closeLine + 1;
|
|
119
|
+
// Skip blank lines between tab panels
|
|
120
|
+
while (line < endLine && state.isEmpty(line))
|
|
121
|
+
line++;
|
|
122
|
+
// Check if next line opens another tab with the same slash count
|
|
123
|
+
if (line < endLine) {
|
|
124
|
+
const nextLine = getLineText(state, line);
|
|
125
|
+
const match = BLOCKS_OPEN_RE.exec(nextLine);
|
|
126
|
+
if (match && match[1].length === slashCount && match[2] === "tab") {
|
|
127
|
+
title = match[3]?.trim() ?? "Tab";
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// No more consecutive tabs
|
|
132
|
+
break;
|
|
133
|
+
}
|
|
134
|
+
// Close tab set
|
|
135
|
+
const setClose = state.push("tab_set_close", "", -1);
|
|
136
|
+
setClose.block = true;
|
|
137
|
+
// Update map
|
|
138
|
+
setOpen.map[1] = line;
|
|
139
|
+
return line;
|
|
140
|
+
}
|
|
141
|
+
function blocksRule(state, startLine, endLine, silent) {
|
|
142
|
+
const lineText = getLineText(state, startLine);
|
|
143
|
+
const match = BLOCKS_OPEN_RE.exec(lineText);
|
|
144
|
+
if (!match)
|
|
145
|
+
return false;
|
|
146
|
+
if (silent)
|
|
147
|
+
return true;
|
|
148
|
+
const slashCount = match[1].length;
|
|
149
|
+
const blockType = match[2];
|
|
150
|
+
const titleRaw = match[3] ?? null;
|
|
151
|
+
let nextLine;
|
|
152
|
+
if (blockType === "tab") {
|
|
153
|
+
const title = titleRaw?.trim() ?? "Tab";
|
|
154
|
+
nextLine = parseTabBlocks(state, startLine, endLine, slashCount, title);
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
nextLine = parseSingleBlock(state, startLine, endLine, slashCount, blockType, titleRaw);
|
|
158
|
+
}
|
|
159
|
+
if (nextLine === -1)
|
|
160
|
+
return false;
|
|
161
|
+
state.line = nextLine;
|
|
162
|
+
return true;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Register the blocks syntax rule with markdown-it.
|
|
166
|
+
*/
|
|
167
|
+
export function blocksPlugin(md) {
|
|
168
|
+
md.block.ruler.before("fence", "blocks", blocksRule, {
|
|
169
|
+
alt: ["paragraph", "reference", "blockquote", "list"],
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=blocks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blocks.js","sourceRoot":"","sources":["../../src/rules/blocks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content-tabs.d.ts","sourceRoot":"","sources":["../../src/rules/content-tabs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,aAAa,CAAC;AAqF1C;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,UAAU,GAAG,IAAI,CAItD"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { findIndentedBlockEnd, dedentAndTokenize } from "../utils/indent.js";
|
|
2
|
+
/**
|
|
3
|
+
* Matches a content tab line: === "Title"
|
|
4
|
+
*/
|
|
5
|
+
const TAB_RE = /^===\s+"([^"]+)"\s*$/;
|
|
6
|
+
function getLineText(state, line) {
|
|
7
|
+
const pos = state.bMarks[line] + state.tShift[line];
|
|
8
|
+
const max = state.eMarks[line];
|
|
9
|
+
return state.src.slice(pos, max);
|
|
10
|
+
}
|
|
11
|
+
function contentTabsRule(state, startLine, endLine, silent) {
|
|
12
|
+
const firstLine = getLineText(state, startLine);
|
|
13
|
+
const firstMatch = TAB_RE.exec(firstLine);
|
|
14
|
+
if (!firstMatch)
|
|
15
|
+
return false;
|
|
16
|
+
if (silent)
|
|
17
|
+
return true;
|
|
18
|
+
// Open tab set
|
|
19
|
+
const setOpen = state.push("tab_set_open", "", 1);
|
|
20
|
+
setOpen.map = [startLine, startLine]; // updated at end
|
|
21
|
+
setOpen.block = true;
|
|
22
|
+
let line = startLine;
|
|
23
|
+
while (line < endLine) {
|
|
24
|
+
const lineText = getLineText(state, line);
|
|
25
|
+
const match = TAB_RE.exec(lineText);
|
|
26
|
+
if (!match)
|
|
27
|
+
break;
|
|
28
|
+
const title = match[1];
|
|
29
|
+
// Open tab panel
|
|
30
|
+
const panelOpen = state.push("tab_panel_open", "", 1);
|
|
31
|
+
panelOpen.info = title;
|
|
32
|
+
panelOpen.markup = "===";
|
|
33
|
+
panelOpen.block = true;
|
|
34
|
+
// Find indented content for this panel
|
|
35
|
+
const contentStart = line + 1;
|
|
36
|
+
const contentEnd = findIndentedBlockEnd(state, contentStart, endLine, 4);
|
|
37
|
+
panelOpen.map = [line, contentEnd];
|
|
38
|
+
// Recursively tokenize inner content
|
|
39
|
+
if (contentEnd > contentStart) {
|
|
40
|
+
dedentAndTokenize(state, contentStart, contentEnd, 4);
|
|
41
|
+
}
|
|
42
|
+
// Close tab panel
|
|
43
|
+
const panelClose = state.push("tab_panel_close", "", -1);
|
|
44
|
+
panelClose.markup = "===";
|
|
45
|
+
panelClose.block = true;
|
|
46
|
+
line = contentEnd;
|
|
47
|
+
// Skip blank lines between tab panels
|
|
48
|
+
while (line < endLine && state.isEmpty(line))
|
|
49
|
+
line++;
|
|
50
|
+
}
|
|
51
|
+
// Close tab set
|
|
52
|
+
const setClose = state.push("tab_set_close", "", -1);
|
|
53
|
+
setClose.block = true;
|
|
54
|
+
// Update map
|
|
55
|
+
setOpen.map[1] = line;
|
|
56
|
+
state.line = line;
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Register the content tabs block rule with markdown-it.
|
|
61
|
+
*/
|
|
62
|
+
export function contentTabsPlugin(md) {
|
|
63
|
+
md.block.ruler.before("fence", "content_tabs", contentTabsRule, {
|
|
64
|
+
alt: ["paragraph", "reference", "blockquote", "list"],
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=content-tabs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content-tabs.js","sourceRoot":"","sources":["../../src/rules/content-tabs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type MarkdownIt from "markdown-it";
|
|
2
|
+
/**
|
|
3
|
+
* Register the Docusaurus admonition rule with markdown-it.
|
|
4
|
+
* Opt-in only — conflicts with mkdocstrings ::: directive.
|
|
5
|
+
*/
|
|
6
|
+
export declare function docusaurusAdmonitionsPlugin(md: MarkdownIt): void;
|
|
7
|
+
//# sourceMappingURL=docusaurus-admonitions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docusaurus-admonitions.d.ts","sourceRoot":"","sources":["../../src/rules/docusaurus-admonitions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,aAAa,CAAC;AAgH1C;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,EAAE,EAAE,UAAU,GAAG,IAAI,CAIhE"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { resolveType, autoTitle } from "../utils/types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Opening line regex for Docusaurus-style admonitions.
|
|
4
|
+
*
|
|
5
|
+
* Group 1: Colon delimiter — `:::`, `::::`, etc.
|
|
6
|
+
* Group 2: Block type keyword — `note`, `info`, `tip`, `caution`, `danger`, etc.
|
|
7
|
+
* Group 3: Title (optional) — text after the type keyword
|
|
8
|
+
*/
|
|
9
|
+
const DOCUSAURUS_OPEN_RE = /^(:{3,})\s*([\w-]+)(?:\s+(.+?))?\s*$/;
|
|
10
|
+
function getLineText(state, line) {
|
|
11
|
+
const pos = state.bMarks[line] + state.tShift[line];
|
|
12
|
+
const max = state.eMarks[line];
|
|
13
|
+
return state.src.slice(pos, max);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Find the closing delimiter line that matches the given colon count.
|
|
17
|
+
*/
|
|
18
|
+
function findClosingDelimiter(state, startLine, endLine, colonCount) {
|
|
19
|
+
const closeRe = new RegExp(`^:{${colonCount}}\\s*$`);
|
|
20
|
+
for (let line = startLine; line < endLine; line++) {
|
|
21
|
+
const text = getLineText(state, line);
|
|
22
|
+
if (closeRe.test(text))
|
|
23
|
+
return line;
|
|
24
|
+
}
|
|
25
|
+
return -1;
|
|
26
|
+
}
|
|
27
|
+
function docusaurusAdmonitionRule(state, startLine, endLine, silent) {
|
|
28
|
+
const lineText = getLineText(state, startLine);
|
|
29
|
+
const match = DOCUSAURUS_OPEN_RE.exec(lineText);
|
|
30
|
+
if (!match)
|
|
31
|
+
return false;
|
|
32
|
+
// Don't match mkdocstrings-style `::: module.Class` (dotted identifiers)
|
|
33
|
+
const blockType = match[2];
|
|
34
|
+
if (blockType.includes("."))
|
|
35
|
+
return false;
|
|
36
|
+
if (silent)
|
|
37
|
+
return true;
|
|
38
|
+
const colonCount = match[1].length;
|
|
39
|
+
const titleRaw = match[3] ?? null;
|
|
40
|
+
const contentStart = startLine + 1;
|
|
41
|
+
const closeLine = findClosingDelimiter(state, contentStart, endLine, colonCount);
|
|
42
|
+
if (closeLine === -1)
|
|
43
|
+
return false;
|
|
44
|
+
// Map Docusaurus types to MkDocs types
|
|
45
|
+
const typeMap = {
|
|
46
|
+
caution: "warning",
|
|
47
|
+
danger: "danger",
|
|
48
|
+
info: "info",
|
|
49
|
+
note: "note",
|
|
50
|
+
tip: "tip",
|
|
51
|
+
warning: "warning",
|
|
52
|
+
example: "example",
|
|
53
|
+
important: "warning",
|
|
54
|
+
};
|
|
55
|
+
const isDetails = blockType === "details";
|
|
56
|
+
const tokenType = isDetails ? "details" : "admonition";
|
|
57
|
+
const variant = isDetails ? "note" : resolveType(typeMap[blockType] ?? blockType);
|
|
58
|
+
let title;
|
|
59
|
+
if (titleRaw !== null) {
|
|
60
|
+
title = titleRaw.trim();
|
|
61
|
+
}
|
|
62
|
+
else if (isDetails) {
|
|
63
|
+
title = "Details";
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
title = autoTitle(typeMap[blockType] ?? blockType);
|
|
67
|
+
}
|
|
68
|
+
const colons = ":".repeat(colonCount);
|
|
69
|
+
const openToken = state.push(`${tokenType}_open`, "", 1);
|
|
70
|
+
openToken.info = variant;
|
|
71
|
+
openToken.meta = { title, inline: null, open: false };
|
|
72
|
+
openToken.markup = colons;
|
|
73
|
+
openToken.map = [startLine, closeLine + 1];
|
|
74
|
+
openToken.block = true;
|
|
75
|
+
// Tokenize inner content
|
|
76
|
+
const contentEnd = closeLine;
|
|
77
|
+
if (contentEnd > contentStart) {
|
|
78
|
+
const oldParentType = state.parentType;
|
|
79
|
+
const oldLineMax = state.lineMax;
|
|
80
|
+
state.parentType = "admonition";
|
|
81
|
+
state.lineMax = contentEnd;
|
|
82
|
+
state.md.block.tokenize(state, contentStart, contentEnd);
|
|
83
|
+
state.parentType = oldParentType;
|
|
84
|
+
state.lineMax = oldLineMax;
|
|
85
|
+
}
|
|
86
|
+
const closeToken = state.push(`${tokenType}_close`, "", -1);
|
|
87
|
+
closeToken.markup = colons;
|
|
88
|
+
closeToken.block = true;
|
|
89
|
+
state.line = closeLine + 1;
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Register the Docusaurus admonition rule with markdown-it.
|
|
94
|
+
* Opt-in only — conflicts with mkdocstrings ::: directive.
|
|
95
|
+
*/
|
|
96
|
+
export function docusaurusAdmonitionsPlugin(md) {
|
|
97
|
+
md.block.ruler.before("fence", "docusaurus_admonition", docusaurusAdmonitionRule, {
|
|
98
|
+
alt: ["paragraph", "reference", "blockquote", "list"],
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=docusaurus-admonitions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docusaurus-admonitions.js","sourceRoot":"","sources":["../../src/rules/docusaurus-admonitions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type MarkdownIt from "markdown-it";
|
|
2
|
+
export interface FileIncludeOptions {
|
|
3
|
+
root: string;
|
|
4
|
+
docsDir?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function langFromExtension(filePath: string): string;
|
|
7
|
+
/**
|
|
8
|
+
* Parse a line/highlight spec like "2,6:11,13:19" into sorted unique line numbers.
|
|
9
|
+
*/
|
|
10
|
+
export declare function parseLineSpec(spec: string): number[];
|
|
11
|
+
/**
|
|
12
|
+
* Extract specific lines from content (1-based line numbers).
|
|
13
|
+
*/
|
|
14
|
+
export declare function extractLines(content: string, lineNums: number[]): string;
|
|
15
|
+
/**
|
|
16
|
+
* Remap highlight line numbers from original file positions to positions
|
|
17
|
+
* within the extracted subset.
|
|
18
|
+
*
|
|
19
|
+
* If ln=[30,31,32,33,34,35,36,37,38] and hl=[31,32,33],
|
|
20
|
+
* then hl becomes positions [2,3,4] in the extracted subset.
|
|
21
|
+
*/
|
|
22
|
+
export declare function remapHighlights(hlNums: number[], lnNums: number[]): number[];
|
|
23
|
+
/**
|
|
24
|
+
* Register the file include core rule with markdown-it.
|
|
25
|
+
* Runs after snippets but before normalize.
|
|
26
|
+
*/
|
|
27
|
+
export declare function fileIncludePlugin(md: MarkdownIt, options: FileIncludeOptions): void;
|
|
28
|
+
//# sourceMappingURL=file-include.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-include.d.ts","sourceRoot":"","sources":["../../src/rules/file-include.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,aAAa,CAAC;AAK1C,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAuDD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAiBpD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAMxE;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EAAE,EAChB,MAAM,EAAE,MAAM,EAAE,GACf,MAAM,EAAE,CAIV;AA6GD;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,UAAU,EACd,OAAO,EAAE,kBAAkB,GAC1B,IAAI,CAEN"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { resolve, extname } from "node:path";
|
|
3
|
+
/**
|
|
4
|
+
* Top-level file include: {* path [ln[...]] [hl[...]] *}
|
|
5
|
+
* Annotations can appear in either order.
|
|
6
|
+
*/
|
|
7
|
+
const FILE_INCLUDE_RE = /^\{\*\s+(\S+?)(?:\s+(?:ln\[([^\]]+)\]|hl\[([^\]]+)\]))(?:\s+(?:ln\[([^\]]+)\]|hl\[([^\]]+)\]))?\s*\*\}$|^\{\*\s+(\S+?)\s*\*\}$/;
|
|
8
|
+
/**
|
|
9
|
+
* Simpler approach: match the whole line and extract parts.
|
|
10
|
+
*/
|
|
11
|
+
const INCLUDE_LINE_RE = /^\{\*\s+(.+?)\s*\*\}$/;
|
|
12
|
+
const LN_RE = /ln\[([^\]]+)\]/;
|
|
13
|
+
const HL_RE = /hl\[([^\]]+)\]/;
|
|
14
|
+
/**
|
|
15
|
+
* Inline file include inside fences: {!> path !} or {!> path!}
|
|
16
|
+
*/
|
|
17
|
+
const INLINE_INCLUDE_RE = /\{!>\s*(\S+?)!?\}/;
|
|
18
|
+
const LANG_MAP = {
|
|
19
|
+
".py": "python",
|
|
20
|
+
".js": "javascript",
|
|
21
|
+
".ts": "typescript",
|
|
22
|
+
".jsx": "jsx",
|
|
23
|
+
".tsx": "tsx",
|
|
24
|
+
".json": "json",
|
|
25
|
+
".yaml": "yaml",
|
|
26
|
+
".yml": "yaml",
|
|
27
|
+
".toml": "toml",
|
|
28
|
+
".html": "html",
|
|
29
|
+
".css": "css",
|
|
30
|
+
".sql": "sql",
|
|
31
|
+
".sh": "bash",
|
|
32
|
+
".bash": "bash",
|
|
33
|
+
".zsh": "bash",
|
|
34
|
+
".rs": "rust",
|
|
35
|
+
".go": "go",
|
|
36
|
+
".java": "java",
|
|
37
|
+
".rb": "ruby",
|
|
38
|
+
".php": "php",
|
|
39
|
+
".c": "c",
|
|
40
|
+
".cpp": "cpp",
|
|
41
|
+
".h": "c",
|
|
42
|
+
".hpp": "cpp",
|
|
43
|
+
".md": "markdown",
|
|
44
|
+
".xml": "xml",
|
|
45
|
+
".graphql": "graphql",
|
|
46
|
+
".ini": "ini",
|
|
47
|
+
".env": "bash",
|
|
48
|
+
".txt": "text",
|
|
49
|
+
".dockerfile": "dockerfile",
|
|
50
|
+
};
|
|
51
|
+
export function langFromExtension(filePath) {
|
|
52
|
+
const ext = extname(filePath).toLowerCase();
|
|
53
|
+
return LANG_MAP[ext] || "text";
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Parse a line/highlight spec like "2,6:11,13:19" into sorted unique line numbers.
|
|
57
|
+
*/
|
|
58
|
+
export function parseLineSpec(spec) {
|
|
59
|
+
const nums = [];
|
|
60
|
+
for (const part of spec.split(",")) {
|
|
61
|
+
const trimmed = part.trim();
|
|
62
|
+
if (trimmed.includes(":")) {
|
|
63
|
+
const [startStr, endStr] = trimmed.split(":");
|
|
64
|
+
const start = parseInt(startStr, 10);
|
|
65
|
+
const end = parseInt(endStr, 10);
|
|
66
|
+
if (!isNaN(start) && !isNaN(end)) {
|
|
67
|
+
for (let i = start; i <= end; i++)
|
|
68
|
+
nums.push(i);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
const n = parseInt(trimmed, 10);
|
|
73
|
+
if (!isNaN(n))
|
|
74
|
+
nums.push(n);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return [...new Set(nums)].sort((a, b) => a - b);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Extract specific lines from content (1-based line numbers).
|
|
81
|
+
*/
|
|
82
|
+
export function extractLines(content, lineNums) {
|
|
83
|
+
const allLines = content.split("\n");
|
|
84
|
+
const extracted = lineNums
|
|
85
|
+
.filter((n) => n >= 1 && n <= allLines.length)
|
|
86
|
+
.map((n) => allLines[n - 1]);
|
|
87
|
+
return extracted.join("\n");
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Remap highlight line numbers from original file positions to positions
|
|
91
|
+
* within the extracted subset.
|
|
92
|
+
*
|
|
93
|
+
* If ln=[30,31,32,33,34,35,36,37,38] and hl=[31,32,33],
|
|
94
|
+
* then hl becomes positions [2,3,4] in the extracted subset.
|
|
95
|
+
*/
|
|
96
|
+
export function remapHighlights(hlNums, lnNums) {
|
|
97
|
+
return hlNums
|
|
98
|
+
.map((h) => lnNums.indexOf(h) + 1)
|
|
99
|
+
.filter((pos) => pos > 0);
|
|
100
|
+
}
|
|
101
|
+
function createFileIncludeRule(options) {
|
|
102
|
+
return function fileIncludeRule(state) {
|
|
103
|
+
if (state.inlineMode)
|
|
104
|
+
return;
|
|
105
|
+
const lines = state.src.split("\n");
|
|
106
|
+
let changed = false;
|
|
107
|
+
const includes = [];
|
|
108
|
+
// Determine the base directory for resolving relative paths.
|
|
109
|
+
// {* *} paths resolve relative to the docsDir (mkdocs.yml docs_dir),
|
|
110
|
+
// or the root if docsDir is not set.
|
|
111
|
+
const baseDir = options.docsDir || options.root;
|
|
112
|
+
for (let i = 0; i < lines.length; i++) {
|
|
113
|
+
const line = lines[i].trim();
|
|
114
|
+
// Top-level file include: {* path [annotations] *}
|
|
115
|
+
const includeMatch = INCLUDE_LINE_RE.exec(line);
|
|
116
|
+
if (includeMatch) {
|
|
117
|
+
const inner = includeMatch[1];
|
|
118
|
+
// Extract path (first token) and annotations
|
|
119
|
+
const lnMatch = LN_RE.exec(inner);
|
|
120
|
+
const hlMatch = HL_RE.exec(inner);
|
|
121
|
+
// Path is everything before the first annotation (or the whole thing)
|
|
122
|
+
let path = inner;
|
|
123
|
+
const firstAnnotation = Math.min(lnMatch ? inner.indexOf("ln[") : Infinity, hlMatch ? inner.indexOf("hl[") : Infinity);
|
|
124
|
+
if (firstAnnotation !== Infinity) {
|
|
125
|
+
path = inner.substring(0, firstAnnotation).trim();
|
|
126
|
+
}
|
|
127
|
+
const absPath = resolve(baseDir, path);
|
|
128
|
+
let content;
|
|
129
|
+
try {
|
|
130
|
+
content = readFileSync(absPath, "utf-8");
|
|
131
|
+
includes.push(absPath);
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
// Leave line as-is if file not found
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
const lang = langFromExtension(path);
|
|
138
|
+
let lnNums = null;
|
|
139
|
+
let hlNums = null;
|
|
140
|
+
// Parse ln[] — line extraction
|
|
141
|
+
if (lnMatch) {
|
|
142
|
+
lnNums = parseLineSpec(lnMatch[1]);
|
|
143
|
+
content = extractLines(content, lnNums);
|
|
144
|
+
}
|
|
145
|
+
// Parse hl[] — highlights
|
|
146
|
+
if (hlMatch) {
|
|
147
|
+
hlNums = parseLineSpec(hlMatch[1]);
|
|
148
|
+
// Remap if ln was used
|
|
149
|
+
if (lnNums) {
|
|
150
|
+
hlNums = remapHighlights(hlNums, lnNums);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// Build fence info string
|
|
154
|
+
let info = lang;
|
|
155
|
+
if (hlNums && hlNums.length > 0) {
|
|
156
|
+
info += ` hl_lines="${hlNums.join(" ")}"`;
|
|
157
|
+
}
|
|
158
|
+
// Trim trailing newline from content
|
|
159
|
+
content = content.replace(/\n$/, "");
|
|
160
|
+
lines[i] = "```" + info + "\n" + content + "\n```";
|
|
161
|
+
changed = true;
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
// Inline file include inside fences: {!> path !}
|
|
165
|
+
if (INLINE_INCLUDE_RE.test(line)) {
|
|
166
|
+
const inlineMatch = INLINE_INCLUDE_RE.exec(line);
|
|
167
|
+
const path = inlineMatch[1];
|
|
168
|
+
const absPath = resolve(baseDir, path);
|
|
169
|
+
try {
|
|
170
|
+
const content = readFileSync(absPath, "utf-8").replace(/\n$/, "");
|
|
171
|
+
lines[i] = lines[i].replace(INLINE_INCLUDE_RE, content);
|
|
172
|
+
includes.push(absPath);
|
|
173
|
+
changed = true;
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
// Leave as-is
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
if (changed) {
|
|
181
|
+
state.src = lines.join("\n");
|
|
182
|
+
}
|
|
183
|
+
if (includes.length > 0) {
|
|
184
|
+
if (!state.env.includes) {
|
|
185
|
+
state.env.includes = [];
|
|
186
|
+
}
|
|
187
|
+
state.env.includes.push(...includes);
|
|
188
|
+
}
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Register the file include core rule with markdown-it.
|
|
193
|
+
* Runs after snippets but before normalize.
|
|
194
|
+
*/
|
|
195
|
+
export function fileIncludePlugin(md, options) {
|
|
196
|
+
md.core.ruler.before("normalize", "file_include", createFileIncludeRule(options));
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=file-include.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-include.js","sourceRoot":"","sources":["../../src/rules/file-include.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"footnotes.d.ts","sourceRoot":"","sources":["../../src/rules/footnotes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,aAAa,CAAC;AAuK1C;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,UAAU,GAAG,IAAI,CAYpD"}
|