markopress 0.0.1

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 (335) hide show
  1. package/bin/cli.js +16 -0
  2. package/dist/build/index.d.ts +83 -0
  3. package/dist/build/index.d.ts.map +1 -0
  4. package/dist/build/index.js +1553 -0
  5. package/dist/build/index.js.map +1 -0
  6. package/dist/build/manifest-generator.d.ts +34 -0
  7. package/dist/build/manifest-generator.d.ts.map +1 -0
  8. package/dist/build/manifest-generator.js +86 -0
  9. package/dist/build/manifest-generator.js.map +1 -0
  10. package/dist/build/security.test.d.ts +6 -0
  11. package/dist/build/security.test.d.ts.map +1 -0
  12. package/dist/build/security.test.js +88 -0
  13. package/dist/build/security.test.js.map +1 -0
  14. package/dist/build/types.d.ts +21 -0
  15. package/dist/build/types.d.ts.map +1 -0
  16. package/dist/build/types.js +5 -0
  17. package/dist/build/types.js.map +1 -0
  18. package/dist/build/vite-config.test.d.ts +2 -0
  19. package/dist/build/vite-config.test.d.ts.map +1 -0
  20. package/dist/build/vite-config.test.js +53 -0
  21. package/dist/build/vite-config.test.js.map +1 -0
  22. package/dist/build/vite-markdown-plugin.d.ts +13 -0
  23. package/dist/build/vite-markdown-plugin.d.ts.map +1 -0
  24. package/dist/build/vite-markdown-plugin.js +134 -0
  25. package/dist/build/vite-markdown-plugin.js.map +1 -0
  26. package/dist/build/vite-markdown-plugin.test.d.ts +2 -0
  27. package/dist/build/vite-markdown-plugin.test.d.ts.map +1 -0
  28. package/dist/build/vite-markdown-plugin.test.js +41 -0
  29. package/dist/build/vite-markdown-plugin.test.js.map +1 -0
  30. package/dist/cli/index.d.ts +6 -0
  31. package/dist/cli/index.d.ts.map +1 -0
  32. package/dist/cli/index.js +75 -0
  33. package/dist/cli/index.js.map +1 -0
  34. package/dist/config/app-root.d.ts +11 -0
  35. package/dist/config/app-root.d.ts.map +1 -0
  36. package/dist/config/app-root.js +24 -0
  37. package/dist/config/app-root.js.map +1 -0
  38. package/dist/config/app-root.test.d.ts +2 -0
  39. package/dist/config/app-root.test.d.ts.map +1 -0
  40. package/dist/config/app-root.test.js +71 -0
  41. package/dist/config/app-root.test.js.map +1 -0
  42. package/dist/config/index.d.ts +6 -0
  43. package/dist/config/index.d.ts.map +1 -0
  44. package/dist/config/index.js +6 -0
  45. package/dist/config/index.js.map +1 -0
  46. package/dist/config/loader.d.ts +25 -0
  47. package/dist/config/loader.d.ts.map +1 -0
  48. package/dist/config/loader.js +187 -0
  49. package/dist/config/loader.js.map +1 -0
  50. package/dist/config/loader.test.d.ts +2 -0
  51. package/dist/config/loader.test.d.ts.map +1 -0
  52. package/dist/config/loader.test.js +24 -0
  53. package/dist/config/loader.test.js.map +1 -0
  54. package/dist/config/types.d.ts +149 -0
  55. package/dist/config/types.d.ts.map +1 -0
  56. package/dist/config/types.js +5 -0
  57. package/dist/config/types.js.map +1 -0
  58. package/dist/config/validation.d.ts +188 -0
  59. package/dist/config/validation.d.ts.map +1 -0
  60. package/dist/config/validation.js +139 -0
  61. package/dist/config/validation.js.map +1 -0
  62. package/dist/content/index.d.ts +6 -0
  63. package/dist/content/index.d.ts.map +1 -0
  64. package/dist/content/index.js +6 -0
  65. package/dist/content/index.js.map +1 -0
  66. package/dist/content/registry.d.ts +29 -0
  67. package/dist/content/registry.d.ts.map +1 -0
  68. package/dist/content/registry.js +45 -0
  69. package/dist/content/registry.js.map +1 -0
  70. package/dist/content/scanner.d.ts +9 -0
  71. package/dist/content/scanner.d.ts.map +1 -0
  72. package/dist/content/scanner.js +115 -0
  73. package/dist/content/scanner.js.map +1 -0
  74. package/dist/content/types.d.ts +41 -0
  75. package/dist/content/types.d.ts.map +1 -0
  76. package/dist/content/types.js +5 -0
  77. package/dist/content/types.js.map +1 -0
  78. package/dist/dev/index.d.ts +18 -0
  79. package/dist/dev/index.d.ts.map +1 -0
  80. package/dist/dev/index.js +93 -0
  81. package/dist/dev/index.js.map +1 -0
  82. package/dist/index.d.ts +14 -0
  83. package/dist/index.d.ts.map +1 -0
  84. package/dist/index.js +17 -0
  85. package/dist/index.js.map +1 -0
  86. package/dist/markdown/code.d.ts +79 -0
  87. package/dist/markdown/code.d.ts.map +1 -0
  88. package/dist/markdown/code.js +305 -0
  89. package/dist/markdown/code.js.map +1 -0
  90. package/dist/markdown/containers.d.ts +17 -0
  91. package/dist/markdown/containers.d.ts.map +1 -0
  92. package/dist/markdown/containers.js +143 -0
  93. package/dist/markdown/containers.js.map +1 -0
  94. package/dist/markdown/includes.d.ts +18 -0
  95. package/dist/markdown/includes.d.ts.map +1 -0
  96. package/dist/markdown/includes.js +9 -0
  97. package/dist/markdown/includes.js.map +1 -0
  98. package/dist/markdown/index.d.ts +8 -0
  99. package/dist/markdown/index.d.ts.map +1 -0
  100. package/dist/markdown/index.js +8 -0
  101. package/dist/markdown/index.js.map +1 -0
  102. package/dist/markdown/loader.d.ts +31 -0
  103. package/dist/markdown/loader.d.ts.map +1 -0
  104. package/dist/markdown/loader.js +325 -0
  105. package/dist/markdown/loader.js.map +1 -0
  106. package/dist/markdown/preserve-tags.d.ts +16 -0
  107. package/dist/markdown/preserve-tags.d.ts.map +1 -0
  108. package/dist/markdown/preserve-tags.js +233 -0
  109. package/dist/markdown/preserve-tags.js.map +1 -0
  110. package/dist/markdown/renderer.d.ts +28 -0
  111. package/dist/markdown/renderer.d.ts.map +1 -0
  112. package/dist/markdown/renderer.js +146 -0
  113. package/dist/markdown/renderer.js.map +1 -0
  114. package/dist/markdown/tag-validator.d.ts +64 -0
  115. package/dist/markdown/tag-validator.d.ts.map +1 -0
  116. package/dist/markdown/tag-validator.js +118 -0
  117. package/dist/markdown/tag-validator.js.map +1 -0
  118. package/dist/markdown/types.d.ts +44 -0
  119. package/dist/markdown/types.d.ts.map +1 -0
  120. package/dist/markdown/types.js +5 -0
  121. package/dist/markdown/types.js.map +1 -0
  122. package/dist/plugin/compat.d.ts +14 -0
  123. package/dist/plugin/compat.d.ts.map +1 -0
  124. package/dist/plugin/compat.js +78 -0
  125. package/dist/plugin/compat.js.map +1 -0
  126. package/dist/plugin/context.d.ts +38 -0
  127. package/dist/plugin/context.d.ts.map +1 -0
  128. package/dist/plugin/context.js +103 -0
  129. package/dist/plugin/context.js.map +1 -0
  130. package/dist/plugin/index.d.ts +6 -0
  131. package/dist/plugin/index.d.ts.map +1 -0
  132. package/dist/plugin/index.js +6 -0
  133. package/dist/plugin/index.js.map +1 -0
  134. package/dist/plugin/manager.d.ts +112 -0
  135. package/dist/plugin/manager.d.ts.map +1 -0
  136. package/dist/plugin/manager.js +385 -0
  137. package/dist/plugin/manager.js.map +1 -0
  138. package/dist/plugin/types.d.ts +182 -0
  139. package/dist/plugin/types.d.ts.map +1 -0
  140. package/dist/plugin/types.js +5 -0
  141. package/dist/plugin/types.js.map +1 -0
  142. package/dist/plugins/blog-index/index.d.ts +18 -0
  143. package/dist/plugins/blog-index/index.d.ts.map +1 -0
  144. package/dist/plugins/blog-index/index.js +158 -0
  145. package/dist/plugins/blog-index/index.js.map +1 -0
  146. package/dist/plugins/sidenav/index.d.ts +36 -0
  147. package/dist/plugins/sidenav/index.d.ts.map +1 -0
  148. package/dist/plugins/sidenav/index.js +86 -0
  149. package/dist/plugins/sidenav/index.js.map +1 -0
  150. package/dist/plugins/toc/index.d.ts +38 -0
  151. package/dist/plugins/toc/index.d.ts.map +1 -0
  152. package/dist/plugins/toc/index.js +79 -0
  153. package/dist/plugins/toc/index.js.map +1 -0
  154. package/dist/preview/index.d.ts +7 -0
  155. package/dist/preview/index.d.ts.map +1 -0
  156. package/dist/preview/index.js +25 -0
  157. package/dist/preview/index.js.map +1 -0
  158. package/dist/theme/default/build/generate-all.d.ts +9 -0
  159. package/dist/theme/default/build/generate-all.d.ts.map +1 -0
  160. package/dist/theme/default/build/generate-all.js +85 -0
  161. package/dist/theme/default/build/generate-all.js.map +1 -0
  162. package/dist/theme/default/build/generate-css.d.ts +19 -0
  163. package/dist/theme/default/build/generate-css.d.ts.map +1 -0
  164. package/dist/theme/default/build/generate-css.js +199 -0
  165. package/dist/theme/default/build/generate-css.js.map +1 -0
  166. package/dist/theme/default/build/index.d.ts +5 -0
  167. package/dist/theme/default/build/index.d.ts.map +1 -0
  168. package/dist/theme/default/build/index.js +5 -0
  169. package/dist/theme/default/build/index.js.map +1 -0
  170. package/dist/theme/default/design-systems/default.d.ts +12 -0
  171. package/dist/theme/default/design-systems/default.d.ts.map +1 -0
  172. package/dist/theme/default/design-systems/default.js +289 -0
  173. package/dist/theme/default/design-systems/default.js.map +1 -0
  174. package/dist/theme/default/design-systems/docusaurus.d.ts +12 -0
  175. package/dist/theme/default/design-systems/docusaurus.d.ts.map +1 -0
  176. package/dist/theme/default/design-systems/docusaurus.js +299 -0
  177. package/dist/theme/default/design-systems/docusaurus.js.map +1 -0
  178. package/dist/theme/default/design-systems/index.d.ts +50 -0
  179. package/dist/theme/default/design-systems/index.d.ts.map +1 -0
  180. package/dist/theme/default/design-systems/index.js +54 -0
  181. package/dist/theme/default/design-systems/index.js.map +1 -0
  182. package/dist/theme/default/design-systems/rspress.d.ts +12 -0
  183. package/dist/theme/default/design-systems/rspress.d.ts.map +1 -0
  184. package/dist/theme/default/design-systems/rspress.js +299 -0
  185. package/dist/theme/default/design-systems/rspress.js.map +1 -0
  186. package/dist/theme/default/design-systems/types.d.ts +238 -0
  187. package/dist/theme/default/design-systems/types.d.ts.map +1 -0
  188. package/dist/theme/default/design-systems/types.js +6 -0
  189. package/dist/theme/default/design-systems/types.js.map +1 -0
  190. package/dist/theme/default/design-systems/vitepress.d.ts +12 -0
  191. package/dist/theme/default/design-systems/vitepress.d.ts.map +1 -0
  192. package/dist/theme/default/design-systems/vitepress.js +299 -0
  193. package/dist/theme/default/design-systems/vitepress.js.map +1 -0
  194. package/dist/theme/default/index.d.ts +60 -0
  195. package/dist/theme/default/index.d.ts.map +1 -0
  196. package/dist/theme/default/index.js +44 -0
  197. package/dist/theme/default/index.js.map +1 -0
  198. package/dist/theme/default/theme.d.ts +14 -0
  199. package/dist/theme/default/theme.d.ts.map +1 -0
  200. package/dist/theme/default/theme.js +58 -0
  201. package/dist/theme/default/theme.js.map +1 -0
  202. package/dist/theme/index.d.ts +6 -0
  203. package/dist/theme/index.d.ts.map +1 -0
  204. package/dist/theme/index.js +6 -0
  205. package/dist/theme/index.js.map +1 -0
  206. package/dist/theme/loader.d.ts +21 -0
  207. package/dist/theme/loader.d.ts.map +1 -0
  208. package/dist/theme/loader.js +125 -0
  209. package/dist/theme/loader.js.map +1 -0
  210. package/dist/theme/types.d.ts +73 -0
  211. package/dist/theme/types.d.ts.map +1 -0
  212. package/dist/theme/types.js +5 -0
  213. package/dist/theme/types.js.map +1 -0
  214. package/dist/vite/index.d.ts +6 -0
  215. package/dist/vite/index.d.ts.map +1 -0
  216. package/dist/vite/index.js +6 -0
  217. package/dist/vite/index.js.map +1 -0
  218. package/dist/vite/markdownPlugin.d.ts +15 -0
  219. package/dist/vite/markdownPlugin.d.ts.map +1 -0
  220. package/dist/vite/markdownPlugin.js +111 -0
  221. package/dist/vite/markdownPlugin.js.map +1 -0
  222. package/dist/vite/plugin.d.ts +18 -0
  223. package/dist/vite/plugin.d.ts.map +1 -0
  224. package/dist/vite/plugin.js +94 -0
  225. package/dist/vite/plugin.js.map +1 -0
  226. package/marko.json +3 -0
  227. package/package.json +109 -0
  228. package/src/theme/default/build/generate-all.ts +99 -0
  229. package/src/theme/default/build/generate-css.ts +234 -0
  230. package/src/theme/default/build/index.ts +5 -0
  231. package/src/theme/default/components/doc-footer.marko +180 -0
  232. package/src/theme/default/components/footer.marko +32 -0
  233. package/src/theme/default/components/header.marko +49 -0
  234. package/src/theme/default/components/nav-bar.marko +191 -0
  235. package/src/theme/default/components/page-header.marko +20 -0
  236. package/src/theme/default/components/reading-progress.marko +36 -0
  237. package/src/theme/default/components/search.marko +239 -0
  238. package/src/theme/default/components/sidebar.marko +211 -0
  239. package/src/theme/default/components/site-footer.marko +211 -0
  240. package/src/theme/default/components/skip-link.marko +49 -0
  241. package/src/theme/default/components/theme/theme-aside-bottom.marko +1 -0
  242. package/src/theme/default/components/theme/theme-aside-top.marko +1 -0
  243. package/src/theme/default/components/theme/theme-body-bottom.marko +1 -0
  244. package/src/theme/default/components/theme/theme-body-top.marko +1 -0
  245. package/src/theme/default/components/theme/theme-doc-bottom.marko +1 -0
  246. package/src/theme/default/components/theme/theme-doc-footer-after.marko +1 -0
  247. package/src/theme/default/components/theme/theme-doc-footer-before.marko +1 -0
  248. package/src/theme/default/components/theme/theme-doc-top.marko +1 -0
  249. package/src/theme/default/components/theme/theme-head-bottom.marko +1 -0
  250. package/src/theme/default/components/theme/theme-head-top.marko +1 -0
  251. package/src/theme/default/components/theme/theme-home-features-after.marko +1 -0
  252. package/src/theme/default/components/theme/theme-home-hero-after.marko +1 -0
  253. package/src/theme/default/components/theme/theme-home-hero-before.marko +1 -0
  254. package/src/theme/default/components/theme/theme-navbar-center.marko +5 -0
  255. package/src/theme/default/components/theme/theme-navbar-end.marko +30 -0
  256. package/src/theme/default/components/theme/theme-navbar-start.marko +1 -0
  257. package/src/theme/default/components/theme/theme-page-bottom.marko +1 -0
  258. package/src/theme/default/components/theme/theme-page-top.marko +1 -0
  259. package/src/theme/default/components/theme/theme-sidebar-bottom.marko +1 -0
  260. package/src/theme/default/components/theme/theme-sidebar-top.marko +1 -0
  261. package/src/theme/default/components/theme/theme-toc-item.marko +1 -0
  262. package/src/theme/default/components/theme-toggle.marko +122 -0
  263. package/src/theme/default/components/toc.marko +140 -0
  264. package/src/theme/default/design-systems/default.ts +331 -0
  265. package/src/theme/default/design-systems/docusaurus.ts +341 -0
  266. package/src/theme/default/design-systems/index.ts +67 -0
  267. package/src/theme/default/design-systems/rspress.ts +341 -0
  268. package/src/theme/default/design-systems/types.ts +296 -0
  269. package/src/theme/default/design-systems/vitepress.ts +341 -0
  270. package/src/theme/default/index.ts +107 -0
  271. package/src/theme/default/layouts/blog.marko +65 -0
  272. package/src/theme/default/layouts/content-page.marko +41 -0
  273. package/src/theme/default/layouts/default.marko +209 -0
  274. package/src/theme/default/layouts/docs.marko +81 -0
  275. package/src/theme/default/layouts/home-page.marko +19 -0
  276. package/src/theme/default/layouts/page.marko +51 -0
  277. package/src/theme/default/public/theme-default.css +1081 -0
  278. package/src/theme/default/public/theme-docusaurus.css +1081 -0
  279. package/src/theme/default/public/theme-vitepress.css +1081 -0
  280. package/src/theme/default/public/theme.css +2 -0
  281. package/src/theme/default/routes/+layout.marko +57 -0
  282. package/src/theme/default/styles/main.css +249 -0
  283. package/src/theme/default/styles-base.css +757 -0
  284. package/src/theme/default/styles.css +899 -0
  285. package/src/theme/default/taglib.json +18 -0
  286. package/src/theme/default/tags/doc-footer.marko +180 -0
  287. package/src/theme/default/tags/footer.marko +32 -0
  288. package/src/theme/default/tags/header.marko +49 -0
  289. package/src/theme/default/tags/nav-bar.marko +191 -0
  290. package/src/theme/default/tags/page-header.marko +20 -0
  291. package/src/theme/default/tags/reading-progress.marko +36 -0
  292. package/src/theme/default/tags/search.marko +239 -0
  293. package/src/theme/default/tags/sidebar.marko +211 -0
  294. package/src/theme/default/tags/site-footer.marko +211 -0
  295. package/src/theme/default/tags/skip-link.marko +49 -0
  296. package/src/theme/default/tags/theme-aside-bottom.marko +1 -0
  297. package/src/theme/default/tags/theme-aside-top.marko +1 -0
  298. package/src/theme/default/tags/theme-body-bottom.marko +1 -0
  299. package/src/theme/default/tags/theme-body-top.marko +1 -0
  300. package/src/theme/default/tags/theme-doc-bottom.marko +1 -0
  301. package/src/theme/default/tags/theme-doc-footer-after.marko +1 -0
  302. package/src/theme/default/tags/theme-doc-footer-before.marko +1 -0
  303. package/src/theme/default/tags/theme-doc-top.marko +1 -0
  304. package/src/theme/default/tags/theme-head-bottom.marko +1 -0
  305. package/src/theme/default/tags/theme-head-top.marko +1 -0
  306. package/src/theme/default/tags/theme-home-features-after.marko +1 -0
  307. package/src/theme/default/tags/theme-home-hero-after.marko +1 -0
  308. package/src/theme/default/tags/theme-home-hero-before.marko +1 -0
  309. package/src/theme/default/tags/theme-navbar-center.marko +5 -0
  310. package/src/theme/default/tags/theme-navbar-end.marko +30 -0
  311. package/src/theme/default/tags/theme-navbar-start.marko +1 -0
  312. package/src/theme/default/tags/theme-page-bottom.marko +1 -0
  313. package/src/theme/default/tags/theme-page-top.marko +1 -0
  314. package/src/theme/default/tags/theme-sidebar-bottom.marko +1 -0
  315. package/src/theme/default/tags/theme-sidebar-top.marko +1 -0
  316. package/src/theme/default/tags/theme-toc-item.marko +1 -0
  317. package/src/theme/default/tags/theme-toggle.marko +122 -0
  318. package/src/theme/default/tags/toc.marko +140 -0
  319. package/src/theme/default/theme.ts +83 -0
  320. package/templates/blog-post.marko.template +13 -0
  321. package/templates/catch-all-handler.js.template +90 -0
  322. package/templates/catch-all-page.marko.template +69 -0
  323. package/templates/doc.marko.template +6 -0
  324. package/templates/example-tags/README.md +212 -0
  325. package/templates/example-tags/alert-box.marko +98 -0
  326. package/templates/example-tags/button-primary.marko +28 -0
  327. package/templates/example-tags/button-secondary.marko +28 -0
  328. package/templates/example-tags/button.marko +6 -0
  329. package/templates/example-tags/card-body.marko +8 -0
  330. package/templates/example-tags/card-footer.marko +7 -0
  331. package/templates/example-tags/card-header.marko +7 -0
  332. package/templates/example-tags/card.marko +20 -0
  333. package/templates/example-tags/icon.marko +149 -0
  334. package/templates/layout.marko.template +64 -0
  335. package/templates/page.marko.template +6 -0
@@ -0,0 +1,325 @@
1
+ /**
2
+ * Markdown loader with frontmatter parsing
3
+ */
4
+ import matter from 'gray-matter';
5
+ import MarkdownIt from 'markdown-it';
6
+ import mdAnchor from 'markdown-it-anchor';
7
+ import mdAttrs from 'markdown-it-attrs';
8
+ import * as mdEmoji from 'markdown-it-emoji';
9
+ import { createHighlighter } from 'shiki';
10
+ import { setupContainers, setupDetails } from './containers.js';
11
+ import { createEnhancedHighlighter } from './code.js';
12
+ import { preprocessIncludesWithRegions } from './includes.js';
13
+ import { preserveTagsPlugin } from './preserve-tags.js';
14
+ import { globalTagValidator } from './tag-validator.js';
15
+ // Cache highlighter instance
16
+ let highlighterInstance = null;
17
+ // Track languages that have been loaded for lazy loading
18
+ const loadedLanguages = new Set();
19
+ let loadLanguagePromise = null;
20
+ /**
21
+ * Essential languages to load immediately (covers ~80% of use cases)
22
+ * Everything else loads on-demand to speed up initial build
23
+ */
24
+ const ESSENTIAL_LANGUAGES = [
25
+ 'javascript',
26
+ 'typescript',
27
+ 'js',
28
+ 'ts',
29
+ 'bash',
30
+ 'markdown',
31
+ 'md',
32
+ ];
33
+ /**
34
+ * Language alias map (shorthand -> full name)
35
+ */
36
+ const LANGUAGE_ALIASES = {
37
+ 'js': 'javascript',
38
+ 'ts': 'typescript',
39
+ 'py': 'python',
40
+ 'rs': 'rust',
41
+ 'sh': 'bash',
42
+ 'shell': 'bash',
43
+ 'yml': 'yaml',
44
+ 'cs': 'csharp',
45
+ 'cpp': 'c++',
46
+ };
47
+ /**
48
+ * Resolve language alias to canonical name
49
+ */
50
+ function resolveLanguageAlias(lang) {
51
+ return LANGUAGE_ALIASES[lang] || lang;
52
+ }
53
+ /**
54
+ * Get or create Shiki highlighter with lazy loading support
55
+ *
56
+ * Lazy loading strategy:
57
+ * 1. Start with only essential languages (js, ts, bash, md)
58
+ * 2. Load additional languages via preloadLanguages() as needed
59
+ * 3. Cache loaded languages to avoid re-loading
60
+ */
61
+ async function getHighlighterInstance() {
62
+ if (!highlighterInstance) {
63
+ // Start with essential languages (covers ~80% of use cases)
64
+ // Additional languages are loaded via preloadLanguages() after scanning content
65
+ highlighterInstance = await createHighlighter({
66
+ themes: ['github-light', 'github-dark'],
67
+ langs: Array.from(ESSENTIAL_LANGUAGES),
68
+ });
69
+ // Initialize loaded languages tracking
70
+ ESSENTIAL_LANGUAGES.forEach(lang => loadedLanguages.add(resolveLanguageAlias(lang)));
71
+ }
72
+ return highlighterInstance;
73
+ }
74
+ /**
75
+ * Pre-load a list of languages in parallel
76
+ * Called after scanning all files to load only the languages actually used
77
+ */
78
+ export async function preloadLanguages(languages) {
79
+ if (!highlighterInstance) {
80
+ // Create base highlighter with essential languages first
81
+ await getHighlighterInstance();
82
+ }
83
+ // Load all needed languages in parallel
84
+ const loadPromises = [];
85
+ for (const lang of languages) {
86
+ const resolved = resolveLanguageAlias(lang);
87
+ if (!loadedLanguages.has(resolved)) {
88
+ loadPromises.push((async () => {
89
+ try {
90
+ const { bundledLanguages } = await import('shiki/langs');
91
+ if (resolved in bundledLanguages) {
92
+ await highlighterInstance.loadLanguage(bundledLanguages[resolved]);
93
+ loadedLanguages.add(resolved);
94
+ }
95
+ }
96
+ catch {
97
+ // Language not available, ignore
98
+ }
99
+ })());
100
+ }
101
+ }
102
+ await Promise.all(loadPromises);
103
+ }
104
+ /**
105
+ * Get or create a shared MarkdownIt instance
106
+ * This allows reusing the same instance across multiple parseMarkdown calls
107
+ *
108
+ * @param options - Markdown parsing options
109
+ * @param env - Markdown environment context
110
+ * @returns Configured MarkdownIt instance
111
+ */
112
+ export async function getMarkdownIt(options = {}, env = {}) {
113
+ const highlighter = await getHighlighterInstance();
114
+ // Create enhanced highlighter with line features
115
+ const enhancedHighlight = createEnhancedHighlighter(highlighter, {
116
+ lineNumbers: options.lineNumbers ?? true,
117
+ });
118
+ const md = new MarkdownIt({
119
+ html: true, // Allow HTML in markdown (authors are trusted in SSG context)
120
+ linkify: true,
121
+ typographer: true,
122
+ highlight: (code, lang, attrs) => {
123
+ if (!lang) {
124
+ return ''; // Use default escaping
125
+ }
126
+ try {
127
+ // attrs contains a meta string (e.g., "{4}" or "title='file.js'")
128
+ return enhancedHighlight(code, lang, attrs);
129
+ }
130
+ catch (e) {
131
+ // Fallback for unsupported languages
132
+ return '';
133
+ }
134
+ },
135
+ });
136
+ // Add plugins
137
+ md.use(mdAnchor, {
138
+ slugify: slugify,
139
+ permalink: mdAnchor.permalink.linkInsideHeader({
140
+ symbol: '#',
141
+ placement: 'before',
142
+ }),
143
+ });
144
+ md.use(mdAttrs);
145
+ md.use(mdEmoji.full || mdEmoji.bare);
146
+ // Add custom containers (tip, warning, danger, info, note)
147
+ setupContainers(md);
148
+ // Add collapsible details container
149
+ setupDetails(md);
150
+ // Add preserve Marko tags plugin if enabled
151
+ if (options.markoTags?.enabled) {
152
+ md.use(preserveTagsPlugin, {
153
+ tagsDir: options.markoTags?.tagsDir || 'tags/',
154
+ onTagDetected: (tagName, lineNumber) => {
155
+ // Track tag for validation at end of build
156
+ globalTagValidator.addDetectedTag(tagName, env.filePath || 'unknown', lineNumber);
157
+ },
158
+ });
159
+ }
160
+ return md;
161
+ }
162
+ /**
163
+ * Parse markdown with frontmatter
164
+ */
165
+ export async function parseMarkdown(src, options = {}, env = {}, existingMd) {
166
+ // Parse frontmatter
167
+ const { data: frontmatter, content: rawContent, excerpt } = matter(src, {
168
+ excerpt: true,
169
+ excerpt_separator: '<!-- more -->',
170
+ });
171
+ // Preprocess file includes
172
+ const content = await preprocessIncludesWithRegions(rawContent, {
173
+ root: env.rootDir ?? process.cwd(),
174
+ currentFile: env.filePath ?? '',
175
+ });
176
+ // Use provided MarkdownIt or create new one
177
+ const md = existingMd || await setupMarkdownIt(options, env);
178
+ // Render to HTML
179
+ const html = md.render(content, env);
180
+ // Extract headers only if TOC is enabled for this module
181
+ const headers = env.extractToc ? extractHeaders(content) : [];
182
+ return {
183
+ frontmatter,
184
+ content,
185
+ html,
186
+ excerpt,
187
+ headers: buildHeaderTree(headers),
188
+ };
189
+ }
190
+ /**
191
+ * Setup markdown-it with plugins and Shiki highlighting
192
+ * @deprecated Use getMarkdownIt() directly for better reusability
193
+ */
194
+ async function setupMarkdownIt(options, env) {
195
+ return getMarkdownIt(options, env);
196
+ }
197
+ /**
198
+ * Strip markdown formatting from text for cleaner TOC entries
199
+ * Removes bold, italic, code, links, and other inline markdown
200
+ */
201
+ function stripMarkdownFormatting(text) {
202
+ return text
203
+ // Remove inline code: `code`
204
+ .replace(/`([^`]+)`/g, '$1')
205
+ // Remove bold/italic: **text**, __text__, *text*, _text_
206
+ .replace(/\*\*\*\+([^*]+)\*\*\+/g, '$1')
207
+ .replace(/___+([^_]+)___+/g, '$1')
208
+ .replace(/\*\*([^*]+)\*\*/g, '$1')
209
+ .replace(/__([^_]+)__/g, '$1')
210
+ .replace(/\*([^*]+)\*/g, '$1')
211
+ .replace(/_([^_]+)_/g, '$1')
212
+ // Remove links: [text](url) or [text](url "title")
213
+ .replace(/\[([^\]]+)\]\([^)]+\)/g, '$1')
214
+ .replace(/\[([^\]]+)\]\[[^\]]+\]/g, '$1')
215
+ .trim();
216
+ }
217
+ /**
218
+ * Extract headers from markdown content
219
+ * Skips code blocks (fenced and indented) to avoid extracting comments from code examples
220
+ */
221
+ function extractHeaders(content) {
222
+ const headers = [];
223
+ // Remove code blocks before processing headers
224
+ // This prevents extracting # comments from bash/code examples
225
+ const withoutCodeBlocks = content
226
+ .replace(/```[\s\S]*?```/g, '') // Fenced code blocks
227
+ .replace(/~~~[\s\S]*?~~~/g, '') // Tilde-fenced code blocks
228
+ .replace(/^(\t| {4}).+$/gm, ''); // Indented code blocks
229
+ const headerRegex = /^(#{1,6})\s+(.+)$/gm;
230
+ let match;
231
+ while ((match = headerRegex.exec(withoutCodeBlocks)) !== null) {
232
+ const level = match[1].length;
233
+ const rawTitle = match[2].trim();
234
+ const title = stripMarkdownFormatting(rawTitle);
235
+ const slug = slugify(rawTitle); // Use raw title for slug to preserve numbering
236
+ headers.push({ level, title, slug });
237
+ }
238
+ return headers;
239
+ }
240
+ /**
241
+ * Build header tree from flat list
242
+ */
243
+ function buildHeaderTree(headers) {
244
+ const result = [];
245
+ const stack = [];
246
+ for (const header of headers) {
247
+ const node = {
248
+ level: header.level,
249
+ title: header.title,
250
+ slug: header.slug,
251
+ children: [],
252
+ };
253
+ // Pop from stack until we find parent level
254
+ while (stack.length > 0 && stack[stack.length - 1].level >= header.level) {
255
+ stack.pop();
256
+ }
257
+ if (stack.length === 0) {
258
+ result.push(node);
259
+ }
260
+ else {
261
+ stack[stack.length - 1].children.push(node);
262
+ }
263
+ stack.push(node);
264
+ }
265
+ return result;
266
+ }
267
+ /**
268
+ * Slugify text for URL-safe IDs
269
+ * Preserves emojis (URL-safe) and text, removes special chars
270
+ * Handles camelCase by inserting hyphens at word boundaries
271
+ */
272
+ function slugify(text) {
273
+ return text
274
+ .trim()
275
+ // Insert hyphens between lowercase-to-uppercase transitions (camelCase)
276
+ .replace(/([a-z])([A-Z])/g, '$1-$2')
277
+ // Insert hyphens between digit-to-letter transitions
278
+ .replace(/([0-9])([a-zA-Z])/g, '$1-$2')
279
+ // Insert hyphens between letter-to-digit transitions
280
+ .replace(/([a-zA-Z])([0-9])/g, '$1-$2')
281
+ .toLowerCase()
282
+ // Replace spaces with hyphens
283
+ .replace(/\s+/g, '-')
284
+ // Remove special chars but keep letters, numbers, hyphens, and emojis
285
+ // Emojis are in Unicode ranges outside \w (word chars)
286
+ .replace(/[^\w\u00A0-\uFFFF\-]+/g, '')
287
+ // Remove leading/trailing hyphens
288
+ .replace(/^-+|-+$/g, '')
289
+ // Replace multiple hyphens with single
290
+ .replace(/-+/g, '-');
291
+ }
292
+ /**
293
+ * Validate frontmatter against VitePress/Docusaurus schema
294
+ */
295
+ export function validateFrontmatter(frontmatter) {
296
+ const errors = [];
297
+ // Common fields
298
+ if (frontmatter.title !== undefined && typeof frontmatter.title !== 'string') {
299
+ errors.push('title must be a string');
300
+ }
301
+ if (frontmatter.description !== undefined && typeof frontmatter.description !== 'string') {
302
+ errors.push('description must be a string');
303
+ }
304
+ if (frontmatter.draft !== undefined && typeof frontmatter.draft !== 'boolean') {
305
+ errors.push('draft must be a boolean');
306
+ }
307
+ // Date fields
308
+ if (frontmatter.date !== undefined) {
309
+ if (!(typeof frontmatter.date === 'string' || frontmatter.date instanceof Date)) {
310
+ errors.push('date must be a string or Date');
311
+ }
312
+ }
313
+ // Tags/categories
314
+ if (frontmatter.tags !== undefined && !Array.isArray(frontmatter.tags)) {
315
+ errors.push('tags must be an array');
316
+ }
317
+ if (frontmatter.categories !== undefined && !Array.isArray(frontmatter.categories)) {
318
+ errors.push('categories must be an array');
319
+ }
320
+ return {
321
+ valid: errors.length === 0,
322
+ errors,
323
+ };
324
+ }
325
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/markdown/loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Markdown-it plugin to preserve Marko tags (kebab-case) during markdown processing
3
+ *
4
+ * This plugin detects Marko component tags and preserves them verbatim,
5
+ * allowing Marko's runtime to handle component discovery and rendering.
6
+ *
7
+ * - Preserves self-closing tags: <my-tag prop="value"/>
8
+ * - Preserves tags with content: <my-tag>content</my-tag>
9
+ * - Converts markdown→HTML inside tags that don't contain Marko syntax
10
+ * - Preserves Marko template content as-is (nested components, slots)
11
+ */
12
+ /**
13
+ * Main plugin function
14
+ */
15
+ export declare function preserveTagsPlugin(md: any, options: any): void;
16
+ //# sourceMappingURL=preserve-tags.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preserve-tags.d.ts","sourceRoot":"","sources":["../../src/markdown/preserve-tags.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAqPH;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,GAAG,IAAI,CAiC9D"}
@@ -0,0 +1,233 @@
1
+ /**
2
+ * Markdown-it plugin to preserve Marko tags (kebab-case) during markdown processing
3
+ *
4
+ * This plugin detects Marko component tags and preserves them verbatim,
5
+ * allowing Marko's runtime to handle component discovery and rendering.
6
+ *
7
+ * - Preserves self-closing tags: <my-tag prop="value"/>
8
+ * - Preserves tags with content: <my-tag>content</my-tag>
9
+ * - Converts markdown→HTML inside tags that don't contain Marko syntax
10
+ * - Preserves Marko template content as-is (nested components, slots)
11
+ */
12
+ // Standard HTML5 elements that should NOT be preserved
13
+ const HTML_ELEMENTS = new Set([
14
+ 'div', 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'hr', 'blockquote', 'pre', 'figure', 'figcaption',
15
+ 'span', 'a', 'strong', 'em', 'b', 'i', 'u', 's', 'sub', 'sup', 'code', 'small',
16
+ 'ul', 'ol', 'li', 'dl', 'dt', 'dd',
17
+ 'table', 'thead', 'tbody', 'tfoot', 'tr', 'th', 'td', 'caption', 'col', 'colgroup',
18
+ 'form', 'input', 'button', 'select', 'datalist', 'optgroup', 'option', 'textarea',
19
+ 'label', 'fieldset', 'legend',
20
+ 'img', 'video', 'audio', 'source', 'track', 'canvas', 'map', 'area',
21
+ 'script', 'style', 'link', 'meta', 'noscript',
22
+ 'html', 'head', 'body', 'title', 'base', 'section', 'article', 'aside', 'header', 'footer', 'nav', 'main', 'address',
23
+ 'details', 'summary', 'dialog',
24
+ 'iframe', 'object', 'param', 'embed',
25
+ ]);
26
+ /**
27
+ * Create placeholder for a detected Marko component
28
+ */
29
+ function createPlaceholder(id) {
30
+ return `<div data-marko-tag="${id}"></div>`;
31
+ }
32
+ /**
33
+ * Restore Marko components from placeholders
34
+ */
35
+ function restoreComponents(html, components) {
36
+ let result = html;
37
+ // Restore in reverse order to preserve positions
38
+ for (let i = components.length - 1; i >= 0; i--) {
39
+ const comp = components[i];
40
+ const placeholder = createPlaceholder(comp.id);
41
+ result = result.replace(placeholder, comp.processedTag);
42
+ }
43
+ return result;
44
+ }
45
+ /**
46
+ * Check if content contains Marko syntax (nested components or named slots)
47
+ */
48
+ function hasMarkoSyntax(content) {
49
+ // Check for nested Marko components (kebab-case tags)
50
+ const nestedComponentRegex = /<[a-z][a-z0-9-]*(?:\s[^>]*?)?>/;
51
+ // Check for named slots (@slot-name)
52
+ const namedSlotRegex = /<@[\w-]+/;
53
+ return nestedComponentRegex.test(content) || namedSlotRegex.test(content);
54
+ }
55
+ /**
56
+ * Process component content - convert markdown to HTML if no Marko syntax present
57
+ */
58
+ function processComponentContent(content, md) {
59
+ if (!content || !content.trim()) {
60
+ return '';
61
+ }
62
+ if (hasMarkoSyntax(content)) {
63
+ // Content is a Marko template - preserve as-is
64
+ return content;
65
+ }
66
+ // Content is plain markdown - convert to HTML
67
+ let html = md.render(content);
68
+ // Unwrap <p> tags if markdown-it wrapped the content
69
+ // (markdown-it wraps plain text in <p> tags)
70
+ const trimmed = html.trim();
71
+ if (trimmed.startsWith('<p>') && trimmed.endsWith('</p>')) {
72
+ const inner = trimmed.slice(3, -4);
73
+ // Check if there are no other block elements, then unwrap
74
+ if (!inner.includes('</div>') && !inner.includes('<pre>')) {
75
+ html = inner;
76
+ }
77
+ }
78
+ return html;
79
+ }
80
+ function parseOpeningTag(markdown, pos) {
81
+ const tagRegex = /<([a-z][a-z0-9-]*)(\s[^>]*?)?(\/)?>/g;
82
+ tagRegex.lastIndex = pos;
83
+ const match = tagRegex.exec(markdown);
84
+ if (!match) {
85
+ return null;
86
+ }
87
+ return {
88
+ name: match[1],
89
+ attrs: match[2] || '',
90
+ selfClosing: match[3] === '/',
91
+ end: match.index + match[0].length
92
+ };
93
+ }
94
+ /**
95
+ * Extract full Marko component with content
96
+ */
97
+ function extractComponent(markdown, startPos, md, onTagDetected, getLineNumber) {
98
+ const openingTag = parseOpeningTag(markdown, startPos);
99
+ if (!openingTag) {
100
+ return null;
101
+ }
102
+ const tagName = openingTag.name;
103
+ // Skip if it's a standard HTML element
104
+ if (HTML_ELEMENTS.has(tagName)) {
105
+ return null;
106
+ }
107
+ // Notify callback for validation
108
+ if (onTagDetected && getLineNumber) {
109
+ const lineNumber = getLineNumber(markdown, startPos);
110
+ onTagDetected(tagName, lineNumber);
111
+ }
112
+ // If self-closing, return immediately
113
+ if (openingTag.selfClosing) {
114
+ return {
115
+ id: 0,
116
+ start: startPos,
117
+ end: openingTag.end,
118
+ originalTag: markdown.slice(startPos, openingTag.end),
119
+ content: '',
120
+ processedTag: markdown.slice(startPos, openingTag.end)
121
+ };
122
+ }
123
+ // Find matching closing tag (handle nesting)
124
+ let pos = openingTag.end;
125
+ let depth = 1;
126
+ const closeTagStart = `</${tagName}`;
127
+ const closeTagFull = `</${tagName}>`;
128
+ while (pos < markdown.length && depth > 0) {
129
+ const nextOpen = markdown.indexOf(`<${tagName}`, pos);
130
+ const nextClose = markdown.indexOf(closeTagFull, pos);
131
+ if (nextClose === -1) {
132
+ // No closing tag found - treat what we have
133
+ break;
134
+ }
135
+ if (nextOpen !== -1 && nextOpen < nextClose) {
136
+ // Found opening tag before closing
137
+ const potentialTag = parseOpeningTag(markdown, nextOpen);
138
+ if (potentialTag && potentialTag.name === tagName) {
139
+ depth++;
140
+ pos = potentialTag.end;
141
+ continue;
142
+ }
143
+ }
144
+ // Found closing tag
145
+ depth--;
146
+ if (depth === 0) {
147
+ const endPos = nextClose + closeTagFull.length;
148
+ const content = markdown.slice(openingTag.end, nextClose);
149
+ // Process content (convert markdown or preserve Marko)
150
+ const processedContent = processComponentContent(content, md);
151
+ return {
152
+ id: 0,
153
+ start: startPos,
154
+ end: endPos,
155
+ originalTag: markdown.slice(startPos, endPos),
156
+ content,
157
+ processedTag: `<${tagName}${openingTag.attrs}>${processedContent}</${tagName}>`
158
+ };
159
+ }
160
+ pos = nextClose + closeTagFull.length;
161
+ }
162
+ // No matching closing tag found - treat as self-closing
163
+ return {
164
+ id: 0,
165
+ start: startPos,
166
+ end: openingTag.end,
167
+ originalTag: markdown.slice(startPos, openingTag.end),
168
+ content: '',
169
+ processedTag: `<${tagName}${openingTag.attrs}/>`
170
+ };
171
+ }
172
+ /**
173
+ * Extract all Marko components from markdown
174
+ */
175
+ function extractComponents(markdown, md, onTagDetected, getLineNumber) {
176
+ const components = [];
177
+ let pos = 0;
178
+ let id = 0;
179
+ while (pos < markdown.length) {
180
+ // Find next potential tag
181
+ const tagStart = markdown.indexOf('<', pos);
182
+ if (tagStart === -1) {
183
+ break;
184
+ }
185
+ const component = extractComponent(markdown, tagStart, md, onTagDetected, getLineNumber);
186
+ if (component) {
187
+ component.id = id++;
188
+ components.push(component);
189
+ pos = component.end;
190
+ }
191
+ else {
192
+ pos = tagStart + 1;
193
+ }
194
+ }
195
+ return components;
196
+ }
197
+ /**
198
+ * Get line number from position in text
199
+ */
200
+ function getLineNumber(text, position) {
201
+ const before = text.substring(0, position);
202
+ return before.split('\n').length;
203
+ }
204
+ /**
205
+ * Main plugin function
206
+ */
207
+ export function preserveTagsPlugin(md, options) {
208
+ const { onTagDetected } = options || {};
209
+ // Wrap the render method
210
+ const originalRender = md.render.bind(md);
211
+ md.render = (src, env) => {
212
+ // Extract all Marko components (with content processing)
213
+ const components = extractComponents(src, md, onTagDetected, getLineNumber);
214
+ // Replace with placeholders
215
+ let processedSrc = src;
216
+ let offset = 0;
217
+ for (const comp of components) {
218
+ const placeholder = createPlaceholder(comp.id);
219
+ const adjustedStart = comp.start + offset;
220
+ const adjustedEnd = comp.end + offset;
221
+ processedSrc = processedSrc.substring(0, adjustedStart) +
222
+ placeholder +
223
+ processedSrc.substring(adjustedEnd);
224
+ offset += placeholder.length - (comp.end - comp.start);
225
+ }
226
+ // Render with placeholders
227
+ const result = originalRender(processedSrc, env);
228
+ // Restore Marko components (with processed content)
229
+ const restored = restoreComponents(String(result), components);
230
+ return restored;
231
+ };
232
+ }
233
+ //# sourceMappingURL=preserve-tags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preserve-tags.js","sourceRoot":"","sources":["../../src/markdown/preserve-tags.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Request-time markdown renderer
3
+ * Lazy-loads MarkdownIt + Shiki on first use
4
+ * Used by route handlers to render markdown on demand
5
+ */
6
+ import MarkdownIt from 'markdown-it';
7
+ import type { MarkdownOptions, ProcessedMarkdown } from './types.js';
8
+ /**
9
+ * Render markdown source to HTML at request time
10
+ *
11
+ * This function lazy-loads MarkdownIt + Shiki on first call,
12
+ * then reuses the instance for subsequent renders.
13
+ *
14
+ * @param source - Raw markdown source with frontmatter
15
+ * @param options - Markdown parsing options (only used on first call)
16
+ * @returns Processed markdown with frontmatter, HTML, and headers
17
+ */
18
+ export declare function renderMarkdown(source: string, options?: MarkdownOptions): Promise<ProcessedMarkdown>;
19
+ /**
20
+ * Reset the cached MarkdownIt instance
21
+ * Useful for testing or when options change
22
+ */
23
+ export declare function resetRendererCache(): void;
24
+ /**
25
+ * Get the current MarkdownIt instance if initialized
26
+ */
27
+ export declare function getRendererInstance(): MarkdownIt | null;
28
+ //# sourceMappingURL=renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/markdown/renderer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,UAAU,MAAM,aAAa,CAAC;AAErC,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAU,MAAM,YAAY,CAAC;AAQ7E;;;;;;;;;GASG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,iBAAiB,CAAC,CAkC5B;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAGzC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,UAAU,GAAG,IAAI,CAEvD"}