@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,148 @@
1
+ import { readdirSync } from "node:fs";
2
+ import { resolve, dirname, basename, extname, join } from "node:path";
3
+ /**
4
+ * Regex to parse variant filenames.
5
+ * Group 1: base name (tutorial001)
6
+ * Group 2: annotated flag (an) or undefined
7
+ * Group 3: version (py310, py39)
8
+ */
9
+ const VARIANT_RE = /^(.+?)(?:_(an))?_(py\d+)$/;
10
+ /**
11
+ * Match {* path [annotations] *} lines
12
+ */
13
+ const INCLUDE_LINE_RE = /^\{\*\s+(.+?)\s*\*\}$/;
14
+ function parseVariantFilename(filePath) {
15
+ const name = basename(filePath, extname(filePath));
16
+ const match = VARIANT_RE.exec(name);
17
+ if (!match)
18
+ return null;
19
+ return {
20
+ relPath: filePath,
21
+ base: match[1],
22
+ annotated: match[2] === "an",
23
+ version: match[3],
24
+ };
25
+ }
26
+ function versionLabel(version) {
27
+ const num = version.replace("py", "");
28
+ if (num.length >= 3) {
29
+ return `${num[0]}.${num.slice(1)}+`;
30
+ }
31
+ return `${num}+`;
32
+ }
33
+ function tabLabel(variant, hasAnnotatedSibling) {
34
+ const ver = `Python ${versionLabel(variant.version)}`;
35
+ if (!variant.annotated && hasAnnotatedSibling)
36
+ return `${ver} non-Annotated`;
37
+ return ver;
38
+ }
39
+ function sortVariants(a, b) {
40
+ if (a.version !== b.version)
41
+ return b.version.localeCompare(a.version);
42
+ if (a.annotated !== b.annotated)
43
+ return a.annotated ? -1 : 1;
44
+ return 0;
45
+ }
46
+ function findSiblingVariants(referencedPath, docsDir) {
47
+ const absPath = resolve(docsDir, referencedPath);
48
+ const dir = dirname(absPath);
49
+ const ext = extname(absPath);
50
+ const info = parseVariantFilename(absPath);
51
+ if (!info)
52
+ return [];
53
+ let entries;
54
+ try {
55
+ entries = readdirSync(dir);
56
+ }
57
+ catch {
58
+ return [];
59
+ }
60
+ const relDir = dirname(referencedPath);
61
+ const siblings = [];
62
+ for (const entry of entries) {
63
+ if (extname(entry) !== ext)
64
+ continue;
65
+ const sibling = parseVariantFilename(join(dir, entry));
66
+ if (!sibling)
67
+ continue;
68
+ if (sibling.base !== info.base)
69
+ continue;
70
+ sibling.relPath = (relDir === "." ? entry : `${relDir}/${entry}`).replace(/\\/g, "/");
71
+ siblings.push(sibling);
72
+ }
73
+ return siblings.sort(sortVariants);
74
+ }
75
+ function createVariantsRule(options) {
76
+ return function variantsRule(state) {
77
+ if (state.inlineMode)
78
+ return;
79
+ const lines = state.src.split("\n");
80
+ let changed = false;
81
+ for (let i = 0; i < lines.length; i++) {
82
+ const line = lines[i].trim();
83
+ const includeMatch = INCLUDE_LINE_RE.exec(line);
84
+ if (!includeMatch)
85
+ continue;
86
+ const inner = includeMatch[1];
87
+ // Extract path (first token before any annotations)
88
+ const firstSpace = inner.search(/\s+(?:ln\[|hl\[)/);
89
+ const refPath = firstSpace === -1 ? inner : inner.substring(0, firstSpace);
90
+ const annotations = firstSpace === -1 ? "" : inner.substring(firstSpace);
91
+ // Check if this is a variant file
92
+ const absRef = resolve(options.docsDir, refPath);
93
+ if (!parseVariantFilename(absRef))
94
+ continue;
95
+ // Skip if already inside a //// tab block
96
+ let insideTab = false;
97
+ for (let j = i - 1; j >= 0; j--) {
98
+ const prev = lines[j].trim();
99
+ if (/^\/\/\/\/\s*$/.test(prev))
100
+ break;
101
+ if (/^\/\/\/\/\s+tab\s*\|/.test(prev)) {
102
+ insideTab = true;
103
+ break;
104
+ }
105
+ }
106
+ if (insideTab)
107
+ continue;
108
+ // Find siblings (even a single variant gets wrapped in a tab)
109
+ const variants = findSiblingVariants(refPath, options.docsDir);
110
+ if (variants.length === 0)
111
+ continue;
112
+ // Build tab blocks
113
+ const tabLines = [];
114
+ const hasAnnotated = variants.some((v) => v.annotated);
115
+ for (const variant of variants) {
116
+ tabLines.push(`//// tab | ${tabLabel(variant, hasAnnotated)}`);
117
+ tabLines.push("");
118
+ if (!variant.annotated && hasAnnotated) {
119
+ tabLines.push("/// tip");
120
+ tabLines.push("");
121
+ tabLines.push("Prefer to use the `Annotated` version if possible.");
122
+ tabLines.push("");
123
+ tabLines.push("///");
124
+ tabLines.push("");
125
+ }
126
+ tabLines.push(`{* ${variant.relPath}${annotations} *}`);
127
+ tabLines.push("");
128
+ tabLines.push("////");
129
+ tabLines.push("");
130
+ }
131
+ lines.splice(i, 1, ...tabLines);
132
+ i += tabLines.length - 1;
133
+ changed = true;
134
+ }
135
+ if (changed) {
136
+ state.src = lines.join("\n");
137
+ }
138
+ };
139
+ }
140
+ /**
141
+ * Register the variants preprocessor as a markdown-it core rule.
142
+ * Must run BEFORE file_include so that expanded tab blocks
143
+ * get their {* *} includes resolved.
144
+ */
145
+ export function variantsPlugin(md, options) {
146
+ md.core.ruler.before("normalize", "variants", createVariantsRule(options));
147
+ }
148
+ //# sourceMappingURL=variants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variants.js","sourceRoot":"","sources":["../../src/rules/variants.ts"],"names":[],"mappings":"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"}
package/dist/tree.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export type { TreeNode } from "@dogsbay/types";
2
+ //# sourceMappingURL=tree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree.d.ts","sourceRoot":"","sources":["../src/tree.ts"],"names":[],"mappings":"AACA,YAAY,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC"}
package/dist/tree.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree.js","sourceRoot":"","sources":["../src/tree.ts"],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ import type StateBlock from "markdown-it/lib/rules_block/state_block.mjs";
2
+ /**
3
+ * Find the extent of an indented content block starting at `startLine`.
4
+ * Content must be indented by at least `minIndent` spaces.
5
+ * Blank lines within the block are included (don't terminate).
6
+ * Trailing blank lines are trimmed.
7
+ *
8
+ * Returns the line index one past the last content line.
9
+ */
10
+ export declare function findIndentedBlockEnd(state: StateBlock, startLine: number, endLine: number, minIndent: number): number;
11
+ /**
12
+ * Temporarily dedent lines by `indent` spaces and tokenize the inner content.
13
+ * Restores original line markers after tokenization.
14
+ * This enables recursive parsing — nested blocks at `indent` fewer spaces
15
+ * become top-level blocks in the inner parse pass.
16
+ */
17
+ export declare function dedentAndTokenize(state: StateBlock, startLine: number, endLine: number, indent: number): void;
18
+ //# sourceMappingURL=indent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indent.d.ts","sourceRoot":"","sources":["../../src/utils/indent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,6CAA6C,CAAC;AAE1E;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,UAAU,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,MAAM,CAkBR;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,UAAU,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GACb,IAAI,CA2BN"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Find the extent of an indented content block starting at `startLine`.
3
+ * Content must be indented by at least `minIndent` spaces.
4
+ * Blank lines within the block are included (don't terminate).
5
+ * Trailing blank lines are trimmed.
6
+ *
7
+ * Returns the line index one past the last content line.
8
+ */
9
+ export function findIndentedBlockEnd(state, startLine, endLine, minIndent) {
10
+ let contentEnd = startLine;
11
+ while (contentEnd < endLine) {
12
+ if (state.isEmpty(contentEnd)) {
13
+ contentEnd++;
14
+ continue;
15
+ }
16
+ if (state.sCount[contentEnd] < minIndent)
17
+ break;
18
+ contentEnd++;
19
+ }
20
+ // Trim trailing blank lines
21
+ while (contentEnd > startLine && state.isEmpty(contentEnd - 1)) {
22
+ contentEnd--;
23
+ }
24
+ return contentEnd;
25
+ }
26
+ /**
27
+ * Temporarily dedent lines by `indent` spaces and tokenize the inner content.
28
+ * Restores original line markers after tokenization.
29
+ * This enables recursive parsing — nested blocks at `indent` fewer spaces
30
+ * become top-level blocks in the inner parse pass.
31
+ */
32
+ export function dedentAndTokenize(state, startLine, endLine, indent) {
33
+ const savedBMarks = [];
34
+ const savedTShift = [];
35
+ const savedSCount = [];
36
+ const savedBlkIndent = state.blkIndent;
37
+ for (let i = startLine; i < endLine; i++) {
38
+ savedBMarks.push(state.bMarks[i]);
39
+ savedTShift.push(state.tShift[i]);
40
+ savedSCount.push(state.sCount[i]);
41
+ if (!state.isEmpty(i)) {
42
+ state.bMarks[i] += indent;
43
+ state.tShift[i] = Math.max(0, state.tShift[i] - indent);
44
+ state.sCount[i] = Math.max(0, state.sCount[i] - indent);
45
+ }
46
+ }
47
+ state.blkIndent = 0;
48
+ state.md.block.tokenize(state, startLine, endLine);
49
+ for (let i = startLine; i < endLine; i++) {
50
+ state.bMarks[i] = savedBMarks[i - startLine];
51
+ state.tShift[i] = savedTShift[i - startLine];
52
+ state.sCount[i] = savedSCount[i - startLine];
53
+ }
54
+ state.blkIndent = savedBlkIndent;
55
+ }
56
+ //# sourceMappingURL=indent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indent.js","sourceRoot":"","sources":["../../src/utils/indent.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAClC,KAAiB,EACjB,SAAiB,EACjB,OAAe,EACf,SAAiB;IAEjB,IAAI,UAAU,GAAG,SAAS,CAAC;IAE3B,OAAO,UAAU,GAAG,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,UAAU,EAAE,CAAC;YACb,SAAS;QACX,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,SAAS;YAAE,MAAM;QAChD,UAAU,EAAE,CAAC;IACf,CAAC;IAED,4BAA4B;IAC5B,OAAO,UAAU,GAAG,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,GAAG,CAAC,CAAC,EAAE,CAAC;QAC/D,UAAU,EAAE,CAAC;IACf,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAiB,EACjB,SAAiB,EACjB,OAAe,EACf,MAAc;IAEd,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,MAAM,cAAc,GAAG,KAAK,CAAC,SAAS,CAAC;IAEvC,KAAK,IAAI,CAAC,GAAG,SAAS,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAElC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YACtB,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;YAC1B,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;YACxD,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IACD,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;IAEpB,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAEnD,KAAK,IAAI,CAAC,GAAG,SAAS,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;QAC7C,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;QAC7C,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IAC/C,CAAC;IACD,KAAK,CAAC,SAAS,GAAG,cAAc,CAAC;AACnC,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * MkDocs Material admonition type aliases.
3
+ * Aliases resolve to their canonical type.
4
+ */
5
+ export declare const TYPE_ALIASES: Record<string, string>;
6
+ /**
7
+ * The 12 canonical admonition types supported by MkDocs Material.
8
+ */
9
+ export declare const VALID_TYPES: Set<string>;
10
+ /**
11
+ * Resolve a type keyword to its canonical type.
12
+ * Unknown types fall back to "note".
13
+ */
14
+ export declare function resolveType(raw: string): string;
15
+ /**
16
+ * Auto-capitalize a type keyword for default title.
17
+ */
18
+ export declare function autoTitle(type: string): string;
19
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/utils/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAyB/C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW,aAatB,CAAC;AAEH;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAI/C;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * MkDocs Material admonition type aliases.
3
+ * Aliases resolve to their canonical type.
4
+ */
5
+ export const TYPE_ALIASES = {
6
+ // abstract aliases
7
+ summary: "abstract",
8
+ tldr: "abstract",
9
+ // info aliases
10
+ todo: "info",
11
+ // tip aliases
12
+ hint: "tip",
13
+ important: "tip",
14
+ // success aliases
15
+ check: "success",
16
+ done: "success",
17
+ // question aliases
18
+ help: "question",
19
+ faq: "question",
20
+ // warning aliases
21
+ caution: "warning",
22
+ attention: "warning",
23
+ // failure aliases
24
+ fail: "failure",
25
+ missing: "failure",
26
+ // danger aliases
27
+ error: "danger",
28
+ // quote aliases
29
+ cite: "quote",
30
+ };
31
+ /**
32
+ * The 12 canonical admonition types supported by MkDocs Material.
33
+ */
34
+ export const VALID_TYPES = new Set([
35
+ "note",
36
+ "abstract",
37
+ "info",
38
+ "tip",
39
+ "success",
40
+ "question",
41
+ "warning",
42
+ "failure",
43
+ "danger",
44
+ "bug",
45
+ "example",
46
+ "quote",
47
+ ]);
48
+ /**
49
+ * Resolve a type keyword to its canonical type.
50
+ * Unknown types fall back to "note".
51
+ */
52
+ export function resolveType(raw) {
53
+ const lower = raw.toLowerCase();
54
+ const resolved = TYPE_ALIASES[lower] ?? lower;
55
+ return VALID_TYPES.has(resolved) ? resolved : "note";
56
+ }
57
+ /**
58
+ * Auto-capitalize a type keyword for default title.
59
+ */
60
+ export function autoTitle(type) {
61
+ return type.charAt(0).toUpperCase() + type.slice(1);
62
+ }
63
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/utils/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAA2B;IAClD,mBAAmB;IACnB,OAAO,EAAE,UAAU;IACnB,IAAI,EAAE,UAAU;IAChB,eAAe;IACf,IAAI,EAAE,MAAM;IACZ,cAAc;IACd,IAAI,EAAE,KAAK;IACX,SAAS,EAAE,KAAK;IAChB,kBAAkB;IAClB,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,SAAS;IACf,mBAAmB;IACnB,IAAI,EAAE,UAAU;IAChB,GAAG,EAAE,UAAU;IACf,kBAAkB;IAClB,OAAO,EAAE,SAAS;IAClB,SAAS,EAAE,SAAS;IACpB,kBAAkB;IAClB,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,SAAS;IAClB,iBAAiB;IACjB,KAAK,EAAE,QAAQ;IACf,gBAAgB;IAChB,IAAI,EAAE,OAAO;CACd,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC;IACjC,MAAM;IACN,UAAU;IACV,MAAM;IACN,KAAK;IACL,SAAS;IACT,UAAU;IACV,SAAS;IACT,SAAS;IACT,QAAQ;IACR,KAAK;IACL,SAAS;IACT,OAAO;CACR,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;IAChC,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;IAC9C,OAAO,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;AACvD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACtD,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type Token from "markdown-it/lib/token.mjs";
2
+ import type { TreeNode } from "./tree.js";
3
+ /**
4
+ * Convert a markdown-it token stream into a TreeNode[].
5
+ * Handles open/close token pairs by recursively collecting children.
6
+ */
7
+ export declare function tokensToTree(tokens: Token[]): TreeNode[];
8
+ //# sourceMappingURL=walker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walker.d.ts","sourceRoot":"","sources":["../src/walker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,2BAA2B,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAG1C;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,QAAQ,EAAE,CAkCxD"}
package/dist/walker.js ADDED
@@ -0,0 +1,193 @@
1
+ import { walkInlineTokens } from "./inline-walker.js";
2
+ /**
3
+ * Convert a markdown-it token stream into a TreeNode[].
4
+ * Handles open/close token pairs by recursively collecting children.
5
+ */
6
+ export function tokensToTree(tokens) {
7
+ let pos = 0;
8
+ function walk() {
9
+ const nodes = [];
10
+ while (pos < tokens.length) {
11
+ const token = tokens[pos];
12
+ // Close tokens: return to parent
13
+ if (token.nesting === -1) {
14
+ pos++;
15
+ return nodes;
16
+ }
17
+ // Open tokens: collect children until matching close
18
+ if (token.nesting === 1) {
19
+ pos++;
20
+ const node = openTokenToNode(token);
21
+ node.children = walk();
22
+ nodes.push(node);
23
+ continue;
24
+ }
25
+ // Self-closing / inline tokens (nesting === 0)
26
+ pos++;
27
+ const node = flatTokenToNode(token);
28
+ if (node)
29
+ nodes.push(node);
30
+ }
31
+ return nodes;
32
+ }
33
+ return walk();
34
+ }
35
+ function openTokenToNode(token) {
36
+ switch (token.type) {
37
+ case "admonition_open":
38
+ return {
39
+ type: "callout",
40
+ props: {
41
+ variant: token.info,
42
+ title: token.meta?.title ?? null,
43
+ inline: token.meta?.inline ?? null,
44
+ },
45
+ };
46
+ case "details_open":
47
+ return {
48
+ type: "details",
49
+ props: {
50
+ variant: token.info,
51
+ title: token.meta?.title ?? null,
52
+ open: token.meta?.open ?? false,
53
+ },
54
+ };
55
+ case "tab_set_open":
56
+ return { type: "tabs" };
57
+ case "tab_panel_open":
58
+ return {
59
+ type: "tab",
60
+ props: { title: token.info },
61
+ };
62
+ case "annotation_list_open":
63
+ return { type: "annotation-list" };
64
+ case "paragraph_open":
65
+ return { type: "paragraph" };
66
+ case "heading_open":
67
+ return {
68
+ type: "heading",
69
+ props: { level: parseInt(token.tag.slice(1), 10) },
70
+ };
71
+ case "ordered_list_open":
72
+ return { type: "ordered-list" };
73
+ case "bullet_list_open":
74
+ return { type: "unordered-list" };
75
+ case "list_item_open":
76
+ return { type: "list-item" };
77
+ case "blockquote_open":
78
+ return { type: "blockquote" };
79
+ case "dl_open":
80
+ return { type: "deflist" };
81
+ case "dt_open":
82
+ return { type: "dt" };
83
+ case "dd_open":
84
+ return { type: "dd" };
85
+ case "html_container_open":
86
+ return {
87
+ type: "html-container",
88
+ props: {
89
+ tag: token.meta?.tag ?? "div",
90
+ attrs: token.meta?.attrs ?? {},
91
+ },
92
+ };
93
+ case "footnote_def_open":
94
+ return {
95
+ type: "footnote-def",
96
+ props: { label: token.meta?.label ?? "" },
97
+ };
98
+ default:
99
+ return { type: token.type.replace(/_open$/, "") };
100
+ }
101
+ }
102
+ function flatTokenToNode(token) {
103
+ switch (token.type) {
104
+ case "inline": {
105
+ const node = { type: "prose", html: token.content };
106
+ // Structured inline children (Notion-style rich text model)
107
+ if (token.children && token.children.length > 0) {
108
+ node.inline = walkInlineTokens(token.children);
109
+ }
110
+ return node;
111
+ }
112
+ case "math_block":
113
+ return {
114
+ type: "math-block",
115
+ props: { latex: token.content || token.meta?.latex || "" },
116
+ };
117
+ case "fence": {
118
+ const fenceMarker = token.markup || "```";
119
+ const { lang, title, highlights, lineNumbers } = parseFenceInfo(token.info);
120
+ return {
121
+ type: "code",
122
+ props: {
123
+ lang,
124
+ title: title || undefined,
125
+ code: token.content,
126
+ highlights: highlights || undefined,
127
+ lineNumbers: lineNumbers || undefined,
128
+ hasAnnotations: token.meta?.hasAnnotations ?? false,
129
+ fence: fenceMarker.length > 3 ? fenceMarker : undefined,
130
+ },
131
+ };
132
+ }
133
+ case "code_block":
134
+ return { type: "code", props: { code: token.content } };
135
+ case "hr":
136
+ return { type: "hr" };
137
+ case "html_block": {
138
+ // Convert standalone <img> tags to structured paragraph > prose > image nodes
139
+ // so they can be rendered as BlockImage with optimization support
140
+ const imgMatch = token.content.match(/^\s*<img\s[^>]*?\bsrc=["']([^"']+)["'][^>]*?(?:\balt=["']([^"']*)["'])?[^>]*?\/?>\s*$/i);
141
+ if (imgMatch) {
142
+ const src = imgMatch[1];
143
+ // Extract alt — may appear before or after src
144
+ const altMatch = token.content.match(/\balt=["']([^"']*)["']/i);
145
+ const alt = altMatch ? altMatch[1] : "";
146
+ return {
147
+ type: "paragraph",
148
+ children: [
149
+ {
150
+ type: "prose",
151
+ inline: [{ type: "image", src, alt }],
152
+ },
153
+ ],
154
+ };
155
+ }
156
+ return { type: "html", html: token.content };
157
+ }
158
+ // Skip hidden/empty tokens
159
+ case "softbreak":
160
+ case "hardbreak":
161
+ return null;
162
+ default:
163
+ if (token.hidden)
164
+ return null;
165
+ return { type: token.type, html: token.content || undefined };
166
+ }
167
+ }
168
+ /**
169
+ * Parse fence info string to extract lang, title, hl_lines, and linenums.
170
+ * Handles: "yaml", "yaml title=\".rc\"", " yaml", "yaml hl_lines=\"2 3\"",
171
+ * "python linenums=\"1\""
172
+ */
173
+ function parseFenceInfo(info) {
174
+ if (!info)
175
+ return { lang: null, title: null, highlights: null, lineNumbers: false };
176
+ const trimmed = info.trim();
177
+ if (!trimmed)
178
+ return { lang: null, title: null, highlights: null, lineNumbers: false };
179
+ // Extract title="..." if present
180
+ const titleMatch = trimmed.match(/\btitle="([^"]*)"/);
181
+ const title = titleMatch ? titleMatch[1] : null;
182
+ // Extract hl_lines="..." if present (e.g. hl_lines="2 3" or hl_lines="1-3 5")
183
+ const hlMatch = trimmed.match(/\bhl_lines="([^"]*)"/);
184
+ const highlights = hlMatch ? hlMatch[1] : null;
185
+ // Extract linenums if present (e.g. linenums="1")
186
+ const lineNumbers = /\blinenums=/.test(trimmed);
187
+ // Lang is the first word (before any space, brace, or title= attribute)
188
+ // Must be a word-like string, not empty or starting with special chars
189
+ const firstWord = trimmed.split(/[\s{]/)[0];
190
+ const lang = firstWord && !firstWord.includes("=") ? firstWord : null;
191
+ return { lang, title, highlights, lineNumbers };
192
+ }
193
+ //# sourceMappingURL=walker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walker.js","sourceRoot":"","sources":["../src/walker.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,71 @@
1
+ {
2
+ "name": "@dogsbay/format-mkdocs",
3
+ "version": "0.2.0-beta.0",
4
+ "description": "MkDocs format plugin for Dogsbay — import/export MkDocs projects via TreeNode[]",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ },
13
+ "./loader": {
14
+ "types": "./dist/loader.d.ts",
15
+ "import": "./dist/loader.js"
16
+ },
17
+ "./cli": {
18
+ "types": "./dist/cli.d.ts",
19
+ "import": "./dist/cli.js"
20
+ },
21
+ "./export/to-astro": {
22
+ "types": "./dist/export/to-astro.d.ts",
23
+ "import": "./dist/export/to-astro.js"
24
+ }
25
+ },
26
+ "files": [
27
+ "dist",
28
+ "README.md"
29
+ ],
30
+ "peerDependencies": {
31
+ "markdown-it": "^14.0.0"
32
+ },
33
+ "devDependencies": {
34
+ "@mermaid-js/mermaid-cli": "^11.12.0",
35
+ "@types/markdown-it": "^14.1.2",
36
+ "@types/node": "^25.5.0",
37
+ "@types/nunjucks": "^3.2.6",
38
+ "markdown-it": "^14.1.0",
39
+ "tsx": "^4.21.0",
40
+ "typescript": "^5.7.0",
41
+ "vitest": "^3.0.0"
42
+ },
43
+ "license": "MIT",
44
+ "dependencies": {
45
+ "markdown-it": "^14.1.0",
46
+ "markdown-it-deflist": "^3.0.0",
47
+ "nunjucks": "^3.2.4",
48
+ "tree-sitter-python": "^0.25.0",
49
+ "web-tree-sitter": "^0.26.8",
50
+ "yaml": "^2.8.3",
51
+ "@dogsbay/types": "0.2.0-beta.0"
52
+ },
53
+ "repository": {
54
+ "type": "git",
55
+ "url": "https://github.com/dogsbay/dogsbay.git",
56
+ "directory": "packages/format-mkdocs"
57
+ },
58
+ "homepage": "https://github.com/dogsbay/dogsbay/tree/main/packages/format-mkdocs",
59
+ "bugs": {
60
+ "url": "https://github.com/dogsbay/dogsbay/issues"
61
+ },
62
+ "scripts": {
63
+ "build": "tsc",
64
+ "test": "vitest run",
65
+ "test:watch": "vitest",
66
+ "compare": "tsx scripts/build-comparison.ts",
67
+ "demo:build": "tsx scripts/build-trees.ts && cd demo && npx astro build",
68
+ "demo:preview": "cd demo && npx astro preview",
69
+ "demo:dev": "tsx scripts/build-trees.ts && cd demo && npx astro dev"
70
+ }
71
+ }