@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.
Files changed (145) hide show
  1. package/dist/autodoc/markdown-generator.d.ts +6 -0
  2. package/dist/autodoc/markdown-generator.d.ts.map +1 -0
  3. package/dist/autodoc/markdown-generator.js +242 -0
  4. package/dist/autodoc/markdown-generator.js.map +1 -0
  5. package/dist/autodoc/module-resolver.d.ts +8 -0
  6. package/dist/autodoc/module-resolver.d.ts.map +1 -0
  7. package/dist/autodoc/module-resolver.js +218 -0
  8. package/dist/autodoc/module-resolver.js.map +1 -0
  9. package/dist/autodoc/python-docstring.d.ts +7 -0
  10. package/dist/autodoc/python-docstring.d.ts.map +1 -0
  11. package/dist/autodoc/python-docstring.js +324 -0
  12. package/dist/autodoc/python-docstring.js.map +1 -0
  13. package/dist/autodoc/python-parser.d.ts +10 -0
  14. package/dist/autodoc/python-parser.d.ts.map +1 -0
  15. package/dist/autodoc/python-parser.js +541 -0
  16. package/dist/autodoc/python-parser.js.map +1 -0
  17. package/dist/autodoc/tree-builder.d.ts +9 -0
  18. package/dist/autodoc/tree-builder.d.ts.map +1 -0
  19. package/dist/autodoc/tree-builder.js +279 -0
  20. package/dist/autodoc/tree-builder.js.map +1 -0
  21. package/dist/autodoc/types.d.ts +128 -0
  22. package/dist/autodoc/types.d.ts.map +1 -0
  23. package/dist/autodoc/types.js +2 -0
  24. package/dist/autodoc/types.js.map +1 -0
  25. package/dist/cli.d.ts +3 -0
  26. package/dist/cli.d.ts.map +1 -0
  27. package/dist/cli.js +32 -0
  28. package/dist/cli.js.map +1 -0
  29. package/dist/export/to-astro.d.ts +26 -0
  30. package/dist/export/to-astro.d.ts.map +1 -0
  31. package/dist/export/to-astro.js +551 -0
  32. package/dist/export/to-astro.js.map +1 -0
  33. package/dist/export/to-mkdocs-project.d.ts +27 -0
  34. package/dist/export/to-mkdocs-project.d.ts.map +1 -0
  35. package/dist/export/to-mkdocs-project.js +192 -0
  36. package/dist/export/to-mkdocs-project.js.map +1 -0
  37. package/dist/export/to-mkdocs.d.ts +6 -0
  38. package/dist/export/to-mkdocs.d.ts.map +1 -0
  39. package/dist/export/to-mkdocs.js +178 -0
  40. package/dist/export/to-mkdocs.js.map +1 -0
  41. package/dist/importer.d.ts +30 -0
  42. package/dist/importer.d.ts.map +1 -0
  43. package/dist/importer.js +376 -0
  44. package/dist/importer.js.map +1 -0
  45. package/dist/index.d.ts +57 -0
  46. package/dist/index.d.ts.map +1 -0
  47. package/dist/index.js +170 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/inline-walker.d.ts +17 -0
  50. package/dist/inline-walker.d.ts.map +1 -0
  51. package/dist/inline-walker.js +167 -0
  52. package/dist/inline-walker.js.map +1 -0
  53. package/dist/loader.d.ts +42 -0
  54. package/dist/loader.d.ts.map +1 -0
  55. package/dist/loader.js +765 -0
  56. package/dist/loader.js.map +1 -0
  57. package/dist/parse.d.ts +12 -0
  58. package/dist/parse.d.ts.map +1 -0
  59. package/dist/parse.js +46 -0
  60. package/dist/parse.js.map +1 -0
  61. package/dist/renderers/mermaid.d.ts +9 -0
  62. package/dist/renderers/mermaid.d.ts.map +1 -0
  63. package/dist/renderers/mermaid.js +117 -0
  64. package/dist/renderers/mermaid.js.map +1 -0
  65. package/dist/rules/admonition.d.ts +6 -0
  66. package/dist/rules/admonition.d.ts.map +1 -0
  67. package/dist/rules/admonition.js +73 -0
  68. package/dist/rules/admonition.js.map +1 -0
  69. package/dist/rules/annotations.d.ts +6 -0
  70. package/dist/rules/annotations.d.ts.map +1 -0
  71. package/dist/rules/annotations.js +57 -0
  72. package/dist/rules/annotations.js.map +1 -0
  73. package/dist/rules/autodoc.d.ts +7 -0
  74. package/dist/rules/autodoc.d.ts.map +1 -0
  75. package/dist/rules/autodoc.js +102 -0
  76. package/dist/rules/autodoc.js.map +1 -0
  77. package/dist/rules/blocks.d.ts +6 -0
  78. package/dist/rules/blocks.d.ts.map +1 -0
  79. package/dist/rules/blocks.js +172 -0
  80. package/dist/rules/blocks.js.map +1 -0
  81. package/dist/rules/content-tabs.d.ts +6 -0
  82. package/dist/rules/content-tabs.d.ts.map +1 -0
  83. package/dist/rules/content-tabs.js +67 -0
  84. package/dist/rules/content-tabs.js.map +1 -0
  85. package/dist/rules/docusaurus-admonitions.d.ts +7 -0
  86. package/dist/rules/docusaurus-admonitions.d.ts.map +1 -0
  87. package/dist/rules/docusaurus-admonitions.js +101 -0
  88. package/dist/rules/docusaurus-admonitions.js.map +1 -0
  89. package/dist/rules/file-include.d.ts +28 -0
  90. package/dist/rules/file-include.d.ts.map +1 -0
  91. package/dist/rules/file-include.js +198 -0
  92. package/dist/rules/file-include.js.map +1 -0
  93. package/dist/rules/footnotes.d.ts +6 -0
  94. package/dist/rules/footnotes.d.ts.map +1 -0
  95. package/dist/rules/footnotes.js +161 -0
  96. package/dist/rules/footnotes.js.map +1 -0
  97. package/dist/rules/icon-shortcode.d.ts +30 -0
  98. package/dist/rules/icon-shortcode.d.ts.map +1 -0
  99. package/dist/rules/icon-shortcode.js +169 -0
  100. package/dist/rules/icon-shortcode.js.map +1 -0
  101. package/dist/rules/keys.d.ts +6 -0
  102. package/dist/rules/keys.d.ts.map +1 -0
  103. package/dist/rules/keys.js +30 -0
  104. package/dist/rules/keys.js.map +1 -0
  105. package/dist/rules/link-rewrite.d.ts +7 -0
  106. package/dist/rules/link-rewrite.d.ts.map +1 -0
  107. package/dist/rules/link-rewrite.js +93 -0
  108. package/dist/rules/link-rewrite.js.map +1 -0
  109. package/dist/rules/math.d.ts +14 -0
  110. package/dist/rules/math.d.ts.map +1 -0
  111. package/dist/rules/math.js +114 -0
  112. package/dist/rules/math.js.map +1 -0
  113. package/dist/rules/md-in-html.d.ts +6 -0
  114. package/dist/rules/md-in-html.d.ts.map +1 -0
  115. package/dist/rules/md-in-html.js +135 -0
  116. package/dist/rules/md-in-html.js.map +1 -0
  117. package/dist/rules/snippets.d.ts +10 -0
  118. package/dist/rules/snippets.d.ts.map +1 -0
  119. package/dist/rules/snippets.js +109 -0
  120. package/dist/rules/snippets.js.map +1 -0
  121. package/dist/rules/templates.d.ts +15 -0
  122. package/dist/rules/templates.d.ts.map +1 -0
  123. package/dist/rules/templates.js +105 -0
  124. package/dist/rules/templates.js.map +1 -0
  125. package/dist/rules/variants.d.ts +12 -0
  126. package/dist/rules/variants.d.ts.map +1 -0
  127. package/dist/rules/variants.js +148 -0
  128. package/dist/rules/variants.js.map +1 -0
  129. package/dist/tree.d.ts +2 -0
  130. package/dist/tree.d.ts.map +1 -0
  131. package/dist/tree.js +2 -0
  132. package/dist/tree.js.map +1 -0
  133. package/dist/utils/indent.d.ts +18 -0
  134. package/dist/utils/indent.d.ts.map +1 -0
  135. package/dist/utils/indent.js +56 -0
  136. package/dist/utils/indent.js.map +1 -0
  137. package/dist/utils/types.d.ts +19 -0
  138. package/dist/utils/types.d.ts.map +1 -0
  139. package/dist/utils/types.js +63 -0
  140. package/dist/utils/types.js.map +1 -0
  141. package/dist/walker.d.ts +8 -0
  142. package/dist/walker.d.ts.map +1 -0
  143. package/dist/walker.js +193 -0
  144. package/dist/walker.js.map +1 -0
  145. 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":"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"}
@@ -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,6 @@
1
+ import type MarkdownIt from "markdown-it";
2
+ /**
3
+ * Register the keyboard keys inline rule with markdown-it.
4
+ */
5
+ export declare function keysPlugin(md: MarkdownIt): void;
6
+ //# sourceMappingURL=keys.d.ts.map
@@ -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"}