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.
- package/bin/cli.js +16 -0
- package/dist/build/index.d.ts +83 -0
- package/dist/build/index.d.ts.map +1 -0
- package/dist/build/index.js +1553 -0
- package/dist/build/index.js.map +1 -0
- package/dist/build/manifest-generator.d.ts +34 -0
- package/dist/build/manifest-generator.d.ts.map +1 -0
- package/dist/build/manifest-generator.js +86 -0
- package/dist/build/manifest-generator.js.map +1 -0
- package/dist/build/security.test.d.ts +6 -0
- package/dist/build/security.test.d.ts.map +1 -0
- package/dist/build/security.test.js +88 -0
- package/dist/build/security.test.js.map +1 -0
- package/dist/build/types.d.ts +21 -0
- package/dist/build/types.d.ts.map +1 -0
- package/dist/build/types.js +5 -0
- package/dist/build/types.js.map +1 -0
- package/dist/build/vite-config.test.d.ts +2 -0
- package/dist/build/vite-config.test.d.ts.map +1 -0
- package/dist/build/vite-config.test.js +53 -0
- package/dist/build/vite-config.test.js.map +1 -0
- package/dist/build/vite-markdown-plugin.d.ts +13 -0
- package/dist/build/vite-markdown-plugin.d.ts.map +1 -0
- package/dist/build/vite-markdown-plugin.js +134 -0
- package/dist/build/vite-markdown-plugin.js.map +1 -0
- package/dist/build/vite-markdown-plugin.test.d.ts +2 -0
- package/dist/build/vite-markdown-plugin.test.d.ts.map +1 -0
- package/dist/build/vite-markdown-plugin.test.js +41 -0
- package/dist/build/vite-markdown-plugin.test.js.map +1 -0
- package/dist/cli/index.d.ts +6 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +75 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config/app-root.d.ts +11 -0
- package/dist/config/app-root.d.ts.map +1 -0
- package/dist/config/app-root.js +24 -0
- package/dist/config/app-root.js.map +1 -0
- package/dist/config/app-root.test.d.ts +2 -0
- package/dist/config/app-root.test.d.ts.map +1 -0
- package/dist/config/app-root.test.js +71 -0
- package/dist/config/app-root.test.js.map +1 -0
- package/dist/config/index.d.ts +6 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +6 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +25 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +187 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/loader.test.d.ts +2 -0
- package/dist/config/loader.test.d.ts.map +1 -0
- package/dist/config/loader.test.js +24 -0
- package/dist/config/loader.test.js.map +1 -0
- package/dist/config/types.d.ts +149 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +5 -0
- package/dist/config/types.js.map +1 -0
- package/dist/config/validation.d.ts +188 -0
- package/dist/config/validation.d.ts.map +1 -0
- package/dist/config/validation.js +139 -0
- package/dist/config/validation.js.map +1 -0
- package/dist/content/index.d.ts +6 -0
- package/dist/content/index.d.ts.map +1 -0
- package/dist/content/index.js +6 -0
- package/dist/content/index.js.map +1 -0
- package/dist/content/registry.d.ts +29 -0
- package/dist/content/registry.d.ts.map +1 -0
- package/dist/content/registry.js +45 -0
- package/dist/content/registry.js.map +1 -0
- package/dist/content/scanner.d.ts +9 -0
- package/dist/content/scanner.d.ts.map +1 -0
- package/dist/content/scanner.js +115 -0
- package/dist/content/scanner.js.map +1 -0
- package/dist/content/types.d.ts +41 -0
- package/dist/content/types.d.ts.map +1 -0
- package/dist/content/types.js +5 -0
- package/dist/content/types.js.map +1 -0
- package/dist/dev/index.d.ts +18 -0
- package/dist/dev/index.d.ts.map +1 -0
- package/dist/dev/index.js +93 -0
- package/dist/dev/index.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/markdown/code.d.ts +79 -0
- package/dist/markdown/code.d.ts.map +1 -0
- package/dist/markdown/code.js +305 -0
- package/dist/markdown/code.js.map +1 -0
- package/dist/markdown/containers.d.ts +17 -0
- package/dist/markdown/containers.d.ts.map +1 -0
- package/dist/markdown/containers.js +143 -0
- package/dist/markdown/containers.js.map +1 -0
- package/dist/markdown/includes.d.ts +18 -0
- package/dist/markdown/includes.d.ts.map +1 -0
- package/dist/markdown/includes.js +9 -0
- package/dist/markdown/includes.js.map +1 -0
- package/dist/markdown/index.d.ts +8 -0
- package/dist/markdown/index.d.ts.map +1 -0
- package/dist/markdown/index.js +8 -0
- package/dist/markdown/index.js.map +1 -0
- package/dist/markdown/loader.d.ts +31 -0
- package/dist/markdown/loader.d.ts.map +1 -0
- package/dist/markdown/loader.js +325 -0
- package/dist/markdown/loader.js.map +1 -0
- package/dist/markdown/preserve-tags.d.ts +16 -0
- package/dist/markdown/preserve-tags.d.ts.map +1 -0
- package/dist/markdown/preserve-tags.js +233 -0
- package/dist/markdown/preserve-tags.js.map +1 -0
- package/dist/markdown/renderer.d.ts +28 -0
- package/dist/markdown/renderer.d.ts.map +1 -0
- package/dist/markdown/renderer.js +146 -0
- package/dist/markdown/renderer.js.map +1 -0
- package/dist/markdown/tag-validator.d.ts +64 -0
- package/dist/markdown/tag-validator.d.ts.map +1 -0
- package/dist/markdown/tag-validator.js +118 -0
- package/dist/markdown/tag-validator.js.map +1 -0
- package/dist/markdown/types.d.ts +44 -0
- package/dist/markdown/types.d.ts.map +1 -0
- package/dist/markdown/types.js +5 -0
- package/dist/markdown/types.js.map +1 -0
- package/dist/plugin/compat.d.ts +14 -0
- package/dist/plugin/compat.d.ts.map +1 -0
- package/dist/plugin/compat.js +78 -0
- package/dist/plugin/compat.js.map +1 -0
- package/dist/plugin/context.d.ts +38 -0
- package/dist/plugin/context.d.ts.map +1 -0
- package/dist/plugin/context.js +103 -0
- package/dist/plugin/context.js.map +1 -0
- package/dist/plugin/index.d.ts +6 -0
- package/dist/plugin/index.d.ts.map +1 -0
- package/dist/plugin/index.js +6 -0
- package/dist/plugin/index.js.map +1 -0
- package/dist/plugin/manager.d.ts +112 -0
- package/dist/plugin/manager.d.ts.map +1 -0
- package/dist/plugin/manager.js +385 -0
- package/dist/plugin/manager.js.map +1 -0
- package/dist/plugin/types.d.ts +182 -0
- package/dist/plugin/types.d.ts.map +1 -0
- package/dist/plugin/types.js +5 -0
- package/dist/plugin/types.js.map +1 -0
- package/dist/plugins/blog-index/index.d.ts +18 -0
- package/dist/plugins/blog-index/index.d.ts.map +1 -0
- package/dist/plugins/blog-index/index.js +158 -0
- package/dist/plugins/blog-index/index.js.map +1 -0
- package/dist/plugins/sidenav/index.d.ts +36 -0
- package/dist/plugins/sidenav/index.d.ts.map +1 -0
- package/dist/plugins/sidenav/index.js +86 -0
- package/dist/plugins/sidenav/index.js.map +1 -0
- package/dist/plugins/toc/index.d.ts +38 -0
- package/dist/plugins/toc/index.d.ts.map +1 -0
- package/dist/plugins/toc/index.js +79 -0
- package/dist/plugins/toc/index.js.map +1 -0
- package/dist/preview/index.d.ts +7 -0
- package/dist/preview/index.d.ts.map +1 -0
- package/dist/preview/index.js +25 -0
- package/dist/preview/index.js.map +1 -0
- package/dist/theme/default/build/generate-all.d.ts +9 -0
- package/dist/theme/default/build/generate-all.d.ts.map +1 -0
- package/dist/theme/default/build/generate-all.js +85 -0
- package/dist/theme/default/build/generate-all.js.map +1 -0
- package/dist/theme/default/build/generate-css.d.ts +19 -0
- package/dist/theme/default/build/generate-css.d.ts.map +1 -0
- package/dist/theme/default/build/generate-css.js +199 -0
- package/dist/theme/default/build/generate-css.js.map +1 -0
- package/dist/theme/default/build/index.d.ts +5 -0
- package/dist/theme/default/build/index.d.ts.map +1 -0
- package/dist/theme/default/build/index.js +5 -0
- package/dist/theme/default/build/index.js.map +1 -0
- package/dist/theme/default/design-systems/default.d.ts +12 -0
- package/dist/theme/default/design-systems/default.d.ts.map +1 -0
- package/dist/theme/default/design-systems/default.js +289 -0
- package/dist/theme/default/design-systems/default.js.map +1 -0
- package/dist/theme/default/design-systems/docusaurus.d.ts +12 -0
- package/dist/theme/default/design-systems/docusaurus.d.ts.map +1 -0
- package/dist/theme/default/design-systems/docusaurus.js +299 -0
- package/dist/theme/default/design-systems/docusaurus.js.map +1 -0
- package/dist/theme/default/design-systems/index.d.ts +50 -0
- package/dist/theme/default/design-systems/index.d.ts.map +1 -0
- package/dist/theme/default/design-systems/index.js +54 -0
- package/dist/theme/default/design-systems/index.js.map +1 -0
- package/dist/theme/default/design-systems/rspress.d.ts +12 -0
- package/dist/theme/default/design-systems/rspress.d.ts.map +1 -0
- package/dist/theme/default/design-systems/rspress.js +299 -0
- package/dist/theme/default/design-systems/rspress.js.map +1 -0
- package/dist/theme/default/design-systems/types.d.ts +238 -0
- package/dist/theme/default/design-systems/types.d.ts.map +1 -0
- package/dist/theme/default/design-systems/types.js +6 -0
- package/dist/theme/default/design-systems/types.js.map +1 -0
- package/dist/theme/default/design-systems/vitepress.d.ts +12 -0
- package/dist/theme/default/design-systems/vitepress.d.ts.map +1 -0
- package/dist/theme/default/design-systems/vitepress.js +299 -0
- package/dist/theme/default/design-systems/vitepress.js.map +1 -0
- package/dist/theme/default/index.d.ts +60 -0
- package/dist/theme/default/index.d.ts.map +1 -0
- package/dist/theme/default/index.js +44 -0
- package/dist/theme/default/index.js.map +1 -0
- package/dist/theme/default/theme.d.ts +14 -0
- package/dist/theme/default/theme.d.ts.map +1 -0
- package/dist/theme/default/theme.js +58 -0
- package/dist/theme/default/theme.js.map +1 -0
- package/dist/theme/index.d.ts +6 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +6 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/loader.d.ts +21 -0
- package/dist/theme/loader.d.ts.map +1 -0
- package/dist/theme/loader.js +125 -0
- package/dist/theme/loader.js.map +1 -0
- package/dist/theme/types.d.ts +73 -0
- package/dist/theme/types.d.ts.map +1 -0
- package/dist/theme/types.js +5 -0
- package/dist/theme/types.js.map +1 -0
- package/dist/vite/index.d.ts +6 -0
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +6 -0
- package/dist/vite/index.js.map +1 -0
- package/dist/vite/markdownPlugin.d.ts +15 -0
- package/dist/vite/markdownPlugin.d.ts.map +1 -0
- package/dist/vite/markdownPlugin.js +111 -0
- package/dist/vite/markdownPlugin.js.map +1 -0
- package/dist/vite/plugin.d.ts +18 -0
- package/dist/vite/plugin.d.ts.map +1 -0
- package/dist/vite/plugin.js +94 -0
- package/dist/vite/plugin.js.map +1 -0
- package/marko.json +3 -0
- package/package.json +109 -0
- package/src/theme/default/build/generate-all.ts +99 -0
- package/src/theme/default/build/generate-css.ts +234 -0
- package/src/theme/default/build/index.ts +5 -0
- package/src/theme/default/components/doc-footer.marko +180 -0
- package/src/theme/default/components/footer.marko +32 -0
- package/src/theme/default/components/header.marko +49 -0
- package/src/theme/default/components/nav-bar.marko +191 -0
- package/src/theme/default/components/page-header.marko +20 -0
- package/src/theme/default/components/reading-progress.marko +36 -0
- package/src/theme/default/components/search.marko +239 -0
- package/src/theme/default/components/sidebar.marko +211 -0
- package/src/theme/default/components/site-footer.marko +211 -0
- package/src/theme/default/components/skip-link.marko +49 -0
- package/src/theme/default/components/theme/theme-aside-bottom.marko +1 -0
- package/src/theme/default/components/theme/theme-aside-top.marko +1 -0
- package/src/theme/default/components/theme/theme-body-bottom.marko +1 -0
- package/src/theme/default/components/theme/theme-body-top.marko +1 -0
- package/src/theme/default/components/theme/theme-doc-bottom.marko +1 -0
- package/src/theme/default/components/theme/theme-doc-footer-after.marko +1 -0
- package/src/theme/default/components/theme/theme-doc-footer-before.marko +1 -0
- package/src/theme/default/components/theme/theme-doc-top.marko +1 -0
- package/src/theme/default/components/theme/theme-head-bottom.marko +1 -0
- package/src/theme/default/components/theme/theme-head-top.marko +1 -0
- package/src/theme/default/components/theme/theme-home-features-after.marko +1 -0
- package/src/theme/default/components/theme/theme-home-hero-after.marko +1 -0
- package/src/theme/default/components/theme/theme-home-hero-before.marko +1 -0
- package/src/theme/default/components/theme/theme-navbar-center.marko +5 -0
- package/src/theme/default/components/theme/theme-navbar-end.marko +30 -0
- package/src/theme/default/components/theme/theme-navbar-start.marko +1 -0
- package/src/theme/default/components/theme/theme-page-bottom.marko +1 -0
- package/src/theme/default/components/theme/theme-page-top.marko +1 -0
- package/src/theme/default/components/theme/theme-sidebar-bottom.marko +1 -0
- package/src/theme/default/components/theme/theme-sidebar-top.marko +1 -0
- package/src/theme/default/components/theme/theme-toc-item.marko +1 -0
- package/src/theme/default/components/theme-toggle.marko +122 -0
- package/src/theme/default/components/toc.marko +140 -0
- package/src/theme/default/design-systems/default.ts +331 -0
- package/src/theme/default/design-systems/docusaurus.ts +341 -0
- package/src/theme/default/design-systems/index.ts +67 -0
- package/src/theme/default/design-systems/rspress.ts +341 -0
- package/src/theme/default/design-systems/types.ts +296 -0
- package/src/theme/default/design-systems/vitepress.ts +341 -0
- package/src/theme/default/index.ts +107 -0
- package/src/theme/default/layouts/blog.marko +65 -0
- package/src/theme/default/layouts/content-page.marko +41 -0
- package/src/theme/default/layouts/default.marko +209 -0
- package/src/theme/default/layouts/docs.marko +81 -0
- package/src/theme/default/layouts/home-page.marko +19 -0
- package/src/theme/default/layouts/page.marko +51 -0
- package/src/theme/default/public/theme-default.css +1081 -0
- package/src/theme/default/public/theme-docusaurus.css +1081 -0
- package/src/theme/default/public/theme-vitepress.css +1081 -0
- package/src/theme/default/public/theme.css +2 -0
- package/src/theme/default/routes/+layout.marko +57 -0
- package/src/theme/default/styles/main.css +249 -0
- package/src/theme/default/styles-base.css +757 -0
- package/src/theme/default/styles.css +899 -0
- package/src/theme/default/taglib.json +18 -0
- package/src/theme/default/tags/doc-footer.marko +180 -0
- package/src/theme/default/tags/footer.marko +32 -0
- package/src/theme/default/tags/header.marko +49 -0
- package/src/theme/default/tags/nav-bar.marko +191 -0
- package/src/theme/default/tags/page-header.marko +20 -0
- package/src/theme/default/tags/reading-progress.marko +36 -0
- package/src/theme/default/tags/search.marko +239 -0
- package/src/theme/default/tags/sidebar.marko +211 -0
- package/src/theme/default/tags/site-footer.marko +211 -0
- package/src/theme/default/tags/skip-link.marko +49 -0
- package/src/theme/default/tags/theme-aside-bottom.marko +1 -0
- package/src/theme/default/tags/theme-aside-top.marko +1 -0
- package/src/theme/default/tags/theme-body-bottom.marko +1 -0
- package/src/theme/default/tags/theme-body-top.marko +1 -0
- package/src/theme/default/tags/theme-doc-bottom.marko +1 -0
- package/src/theme/default/tags/theme-doc-footer-after.marko +1 -0
- package/src/theme/default/tags/theme-doc-footer-before.marko +1 -0
- package/src/theme/default/tags/theme-doc-top.marko +1 -0
- package/src/theme/default/tags/theme-head-bottom.marko +1 -0
- package/src/theme/default/tags/theme-head-top.marko +1 -0
- package/src/theme/default/tags/theme-home-features-after.marko +1 -0
- package/src/theme/default/tags/theme-home-hero-after.marko +1 -0
- package/src/theme/default/tags/theme-home-hero-before.marko +1 -0
- package/src/theme/default/tags/theme-navbar-center.marko +5 -0
- package/src/theme/default/tags/theme-navbar-end.marko +30 -0
- package/src/theme/default/tags/theme-navbar-start.marko +1 -0
- package/src/theme/default/tags/theme-page-bottom.marko +1 -0
- package/src/theme/default/tags/theme-page-top.marko +1 -0
- package/src/theme/default/tags/theme-sidebar-bottom.marko +1 -0
- package/src/theme/default/tags/theme-sidebar-top.marko +1 -0
- package/src/theme/default/tags/theme-toc-item.marko +1 -0
- package/src/theme/default/tags/theme-toggle.marko +122 -0
- package/src/theme/default/tags/toc.marko +140 -0
- package/src/theme/default/theme.ts +83 -0
- package/templates/blog-post.marko.template +13 -0
- package/templates/catch-all-handler.js.template +90 -0
- package/templates/catch-all-page.marko.template +69 -0
- package/templates/doc.marko.template +6 -0
- package/templates/example-tags/README.md +212 -0
- package/templates/example-tags/alert-box.marko +98 -0
- package/templates/example-tags/button-primary.marko +28 -0
- package/templates/example-tags/button-secondary.marko +28 -0
- package/templates/example-tags/button.marko +6 -0
- package/templates/example-tags/card-body.marko +8 -0
- package/templates/example-tags/card-footer.marko +7 -0
- package/templates/example-tags/card-header.marko +7 -0
- package/templates/example-tags/card.marko +20 -0
- package/templates/example-tags/icon.marko +149 -0
- package/templates/layout.marko.template +64 -0
- 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"}
|