@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,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":"AAYA;;;GAGG;AACH,SAAS,cAAc,CAAC,KAAkB,EAAE,MAAe;IACzD,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;IACtB,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;IAEtB,oBAAoB;IACpB,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAEvD,8BAA8B;IAC9B,IAAI,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAE3E,sBAAsB;IACtB,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAEtE,uCAAuC;IACvC,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC;IAClB,KAAK,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;YACvC,yBAAyB;YACzB,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;gBAC3C,QAAQ,GAAG,CAAC,CAAC;gBACb,MAAM;YACR,CAAC;QACH,CAAC;QACD,uBAAuB;QACvB,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,QAAQ;YAAE,MAAM;IACjD,CAAC;IAED,IAAI,QAAQ,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAE/B,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC3C,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;QAAE,OAAO,KAAK,CAAC;IAEhC,IAAI,MAAM,EAAE,CAAC;QACX,KAAK,CAAC,GAAG,GAAG,QAAQ,GAAG,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IACnD,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC;IACtB,KAAK,CAAC,IAAI,GAAG,EAAE,KAAK,EAAE,CAAC;IAEvB,KAAK,CAAC,GAAG,GAAG,QAAQ,GAAG,CAAC,CAAC;IACzB,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,aAAa,CACpB,KAAiB,EACjB,SAAiB,EACjB,OAAe,EACf,MAAe;IAEf,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACnE,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IAE1D,qBAAqB;IACrB,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAE7C,iDAAiD;IACjD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1E,IAAI,MAAM;YAAE,OAAO,IAAI,CAAC;QACxB,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QACjD,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC;QACtB,KAAK,CAAC,IAAI,GAAG,EAAE,KAAK,EAAE,CAAC;QACvB,KAAK,CAAC,GAAG,GAAG,CAAC,SAAS,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;QACvC,KAAK,CAAC,IAAI,GAAG,SAAS,GAAG,CAAC,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,8BAA8B;IAC9B,IAAI,QAAQ,GAAG,SAAS,GAAG,CAAC,CAAC;IAC7B,IAAI,KAAK,GAAG,KAAK,CAAC;IAElB,OAAO,QAAQ,GAAG,OAAO,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC7D,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QAEjD,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,KAAK,GAAG,IAAI,CAAC;YACb,MAAM;QACR,CAAC;QACD,QAAQ,EAAE,CAAC;IACb,CAAC;IAED,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,IAAI,MAAM;QAAE,OAAO,IAAI,CAAC;IAExB,qCAAqC;IACrC,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,KAAK,IAAI,IAAI,GAAG,SAAS,GAAG,CAAC,EAAE,IAAI,GAAG,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC;QACvD,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAChC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7C,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IACjD,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC;IACtB,KAAK,CAAC,IAAI,GAAG,EAAE,KAAK,EAAE,CAAC;IACvB,KAAK,CAAC,GAAG,GAAG,CAAC,SAAS,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;IAEtC,KAAK,CAAC,IAAI,GAAG,QAAQ,GAAG,CAAC,CAAC;IAC1B,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,EAAc;IACvC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,aAAa,EAAE,cAAc,CAAC,CAAC;IAC/D,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE;QAC1D,GAAG,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,YAAY,CAAC;KAC9C,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type MarkdownIt from "markdown-it";
2
+ /**
3
+ * Register the md_in_html core rule with markdown-it.
4
+ */
5
+ export declare function mdInHtmlPlugin(md: MarkdownIt): void;
6
+ //# sourceMappingURL=md-in-html.d.ts.map
@@ -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":"AAEA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAW,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,IAAI,MAAM,MAAM,CAAC;AAWxB,SAAS,YAAY,CAAC,QAAgB;IACpC,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChD,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IAC5C,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,WAAW,CAAC,OAAyB;IAC5C,MAAM,OAAO,GAA4B,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAE7D,wBAAwB;IACxB,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YACjE,IAAI,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;YACzC,CAAC;YAAC,MAAM,CAAC;gBACP,gCAAgC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;IAED,qCAAqC;IACrC,IAAI,OAAO,CAAC,OAAO,IAAI,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnD,IAAI,CAAC;YACH,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBACjD,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;gBACzC,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;oBACzD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;oBAC3C,IAAI,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC,EAAE,CAAC;wBACvB,IAAI,CAAC;4BACH,OAAO,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;wBAC7D,CAAC;wBAAC,MAAM,CAAC;4BACP,qBAAqB;wBACvB,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,4BAA4B;QAC9B,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACH,SAAS,iBAAiB,CAAC,GAAW;IACpC,gEAAgE;IAChE,2EAA2E;IAC3E,uFAAuF;IACvF,+DAA+D;IAC/D,+EAA+E;IAC/E,GAAG,GAAG,GAAG,CAAC,OAAO,CACf,iDAAiD,EACjD,oCAAoC,CACrC,CAAC;IACF,uEAAuE;IACvE,GAAG,GAAG,GAAG,CAAC,OAAO,CACf,mCAAmC,EACnC,iBAAiB,CAClB,CAAC;IACF,gDAAgD;IAChD,GAAG,GAAG,GAAG,CAAC,OAAO,CACf,qBAAqB,EACrB,uBAAuB,CACxB,CAAC;IACF,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAyB;IACpD,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACrC,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;IAElE,yEAAyE;IACzE,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC,GAAc,EAAE,CAAS,EAAE,EAAE;QAC1D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;YAAE,OAAO,GAAG,CAAC;QACpC,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,6EAA6E;IAC7E,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC,GAA4B,EAAE,EAAE;QAC3D,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,OAAO,EAAE,CAAC;QAC/C,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,OAAO,SAAS,aAAa,CAAC,KAAgB;QAC5C,IAAI,KAAK,CAAC,UAAU;YAAE,OAAO;QAC7B,mDAAmD;QACnD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO;QAEnE,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC7C,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,uCAAuC;QACzC,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAC7B,EAAc,EACd,OAAyB;IAEzB,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,WAAW,EAAE,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC;AAC/E,CAAC"}
@@ -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"}