bobe-dom 0.0.67 → 0.0.69
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/dist/bobe-dom.cjs +281 -0
- package/dist/bobe-dom.cjs.map +1 -0
- package/dist/bobe-dom.esm.js +28 -319
- package/dist/bobe-dom.esm.js.map +1 -1
- package/dist/{code.cjs.js → code.cjs} +3 -3
- package/dist/code.cjs.map +1 -0
- package/dist/code.esm.js +2 -2
- package/dist/code.esm.js.map +1 -1
- package/dist/iconify.cjs +442 -0
- package/dist/iconify.cjs.map +1 -0
- package/dist/iconify.d.ts +42 -0
- package/dist/iconify.esm.js +432 -0
- package/dist/iconify.esm.js.map +1 -0
- package/dist/index.css +1 -1
- package/dist/index.d.ts +1 -18
- package/dist/index.umd.js +40 -332
- package/dist/index.umd.js.map +1 -1
- package/dist/{markdown.cjs.js → markdown.cjs} +81 -15
- package/dist/markdown.cjs.map +1 -0
- package/dist/markdown.esm.js +80 -14
- package/dist/markdown.esm.js.map +1 -1
- package/dist/ssr-index.cjs +298 -0
- package/dist/ssr-index.cjs.map +1 -0
- package/dist/ssr-index.esm.js +295 -0
- package/dist/ssr-index.esm.js.map +1 -0
- package/package.json +19 -7
- package/dist/bobe-dom.cjs.js +0 -574
- package/dist/bobe-dom.cjs.js.map +0 -1
- package/dist/code.cjs.js.map +0 -1
- package/dist/markdown.cjs.js.map +0 -1
|
@@ -68,7 +68,7 @@ async function resolveImportTree(importPath, currentPath, vResolve, walked = new
|
|
|
68
68
|
|
|
69
69
|
function registerBobeLang() {
|
|
70
70
|
hljs.registerLanguage('bobe', hljs => {
|
|
71
|
-
const ATTRS = ['class', 'id', '
|
|
71
|
+
const ATTRS = ['class', 'id', 'children', 'html', 'style', 'href', 'src', 'alt', 'title', 'ref', 'type', 'placeholder', 'value', 'name', 'foo', 'disabled', 'readonly', 'checked', 'selected', 'hidden', 'role', 'target', 'rel', 'width', 'height', 'tabindex', 'data-[\\w-]+', 'aria-[\\w-]+', 'onclick', 'oninput', 'onchange', 'onsubmit', 'onreset', 'onkeydown', 'onkeyup', 'onkeypress', 'onfocus', 'onblur', 'onmouseenter', 'onmouseleave', 'onmousemove', 'onmouseover', 'onmouseout', 'onload', 'onerror', 'onscroll', 'onresize', 'ondrag', 'ondragstart', 'ondragend', 'ondragover', 'ondrop', 'ontouchstart', 'ontouchend', 'ontouchmove'].join('|');
|
|
72
72
|
return {
|
|
73
73
|
name: 'bobe',
|
|
74
74
|
keywords: ['if', 'else', 'for', 'tp', 'context'],
|
|
@@ -160,9 +160,21 @@ function registerBobeLang() {
|
|
|
160
160
|
function esc(s) {
|
|
161
161
|
return s.replace(/\\/g, '\\\\').replace(/`/g, '\\`').replace(/\$/g, '\\$');
|
|
162
162
|
}
|
|
163
|
+
function plainText(tokens) {
|
|
164
|
+
return tokens.map(token => {
|
|
165
|
+
if (Array.isArray(token.tokens)) return plainText(token.tokens);
|
|
166
|
+
return typeof token.text === 'string' ? token.text : token.raw || '';
|
|
167
|
+
}).join('');
|
|
168
|
+
}
|
|
169
|
+
function slugify(s) {
|
|
170
|
+
return s.toLowerCase().replace(/[^\w一-鿿]+/g, '-').replace(/^-+|-+$/g, '');
|
|
171
|
+
}
|
|
172
|
+
function escAttr(s) {
|
|
173
|
+
return s.replace(/&/g, '&').replace(/"/g, '"').replace(/</g, '<').replace(/>/g, '>');
|
|
174
|
+
}
|
|
163
175
|
function gen(html, headers, previewEntries, codeTrees = [], layoutPath, routeMeta) {
|
|
164
176
|
const hasCode = codeTrees.length > 0;
|
|
165
|
-
const lines = [`import { bobe, Store } from 'bobe';`];
|
|
177
|
+
const lines = [`import { bobe, Store, effect } from 'bobe';`];
|
|
166
178
|
if (layoutPath) {
|
|
167
179
|
lines.push(`import __layout from '${layoutPath}';`);
|
|
168
180
|
}
|
|
@@ -173,24 +185,77 @@ function gen(html, headers, previewEntries, codeTrees = [], layoutPath, routeMet
|
|
|
173
185
|
});
|
|
174
186
|
}
|
|
175
187
|
lines.push(`const mdHtml = \`${esc(html)}\`;`);
|
|
188
|
+
lines.push(`const headings = ${JSON.stringify(headers)};`);
|
|
176
189
|
if (hasCode) {
|
|
177
190
|
for (let i = 0; i < codeTrees.length; i++) {
|
|
178
191
|
lines.push(`const codeTree${i} = ${JSON.stringify(codeTrees[i])};`);
|
|
179
192
|
}
|
|
180
193
|
}
|
|
181
194
|
lines.push(`class Markdown extends Store {`);
|
|
195
|
+
lines.push(` headings = headings;`);
|
|
182
196
|
lines.push(` mdRef = null;`);
|
|
197
|
+
lines.push(` asideRef = null;`);
|
|
198
|
+
lines.push(` activeHeadingId = '';`);
|
|
199
|
+
lines.push(` indicatorTop = 0;`);
|
|
200
|
+
lines.push(` indicatorHeight = 25;`);
|
|
201
|
+
lines.push(``);
|
|
202
|
+
lines.push(` constructor() {`);
|
|
203
|
+
lines.push(` super();`);
|
|
204
|
+
lines.push(` effect(() => {`);
|
|
205
|
+
lines.push(` if (typeof window === 'undefined') return;`);
|
|
206
|
+
lines.push(` const syncActiveHeading = () => {`);
|
|
207
|
+
lines.push(` const rawHash = window.location.hash.slice(1);`);
|
|
208
|
+
lines.push(` let hash = rawHash;`);
|
|
209
|
+
lines.push(` try {`);
|
|
210
|
+
lines.push(` hash = decodeURIComponent(rawHash);`);
|
|
211
|
+
lines.push(` } catch {}`);
|
|
212
|
+
lines.push(` this.activeHeadingId = headings.some(item => item.id === hash) ? hash : '';`);
|
|
213
|
+
lines.push(` this.updateIndicator();`);
|
|
214
|
+
lines.push(` };`);
|
|
215
|
+
lines.push(` syncActiveHeading();`);
|
|
216
|
+
lines.push(` window.addEventListener('hashchange', syncActiveHeading);`);
|
|
217
|
+
lines.push(` return () => window.removeEventListener('hashchange', syncActiveHeading);`);
|
|
218
|
+
lines.push(` });`);
|
|
219
|
+
lines.push(` }`);
|
|
220
|
+
lines.push(``);
|
|
221
|
+
lines.push(` getAsideClass(item) {`);
|
|
222
|
+
lines.push(` const active = this.activeHeadingId === item.id ? ' markdown-aside-item-active' : '';`);
|
|
223
|
+
lines.push(` return 'markdown-aside-item markdown-aside-depth-' + item.depth + active;`);
|
|
224
|
+
lines.push(` }`);
|
|
225
|
+
lines.push(``);
|
|
226
|
+
lines.push(` get indicatorStyle() {`);
|
|
227
|
+
lines.push(` return 'transform: translateY(' + this.indicatorTop + 'px); height: ' + this.indicatorHeight + 'px;';`);
|
|
228
|
+
lines.push(` }`);
|
|
229
|
+
lines.push(``);
|
|
230
|
+
lines.push(` updateIndicator() {`);
|
|
231
|
+
lines.push(` if (typeof window === 'undefined') return;`);
|
|
232
|
+
lines.push(` window.requestAnimationFrame(() => {`);
|
|
233
|
+
lines.push(` const active = this.asideRef?.querySelector?.('.markdown-aside-item-active');`);
|
|
234
|
+
lines.push(` if (!active) {`);
|
|
235
|
+
lines.push(` this.indicatorTop = 0;`);
|
|
236
|
+
lines.push(` this.indicatorHeight = 25;`);
|
|
237
|
+
lines.push(` return;`);
|
|
238
|
+
lines.push(` }`);
|
|
239
|
+
lines.push(` const style = window.getComputedStyle(active);`);
|
|
240
|
+
lines.push(` const marginTop = Number.parseFloat(style.marginTop) || 0;`);
|
|
241
|
+
lines.push(` this.indicatorTop = active.offsetTop - marginTop + (active.offsetHeight - this.indicatorHeight) / 2;`);
|
|
242
|
+
lines.push(` this.indicatorHeight = 25;`);
|
|
243
|
+
lines.push(` });`);
|
|
244
|
+
lines.push(` }`);
|
|
245
|
+
lines.push(``);
|
|
183
246
|
lines.push(` ui = bobe\``);
|
|
184
|
-
lines.push(` div class="markdown"
|
|
185
|
-
lines.push(` main ref={mdRef} class="markdown-body"
|
|
247
|
+
lines.push(` div class="markdown"`);
|
|
248
|
+
lines.push(` main ref={mdRef} class="markdown-body" html=\${mdHtml}`);
|
|
186
249
|
lines.push(` if showAside`);
|
|
187
|
-
lines.push(`
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
}
|
|
250
|
+
lines.push(` aside ref={asideRef} class="markdown-aside"`);
|
|
251
|
+
lines.push(` div class="markdown-aside-content"`);
|
|
252
|
+
lines.push(` div class="markdown-aside-border"`);
|
|
253
|
+
lines.push(` div class={activeHeadingId ? 'markdown-aside-indicator markdown-aside-indicator-active' : 'markdown-aside-indicator'} style={indicatorStyle}`);
|
|
254
|
+
lines.push(` for headings; item ; item.id`);
|
|
255
|
+
lines.push(` a`);
|
|
256
|
+
lines.push(` | href={'#' + item.id}`);
|
|
257
|
+
lines.push(` | children={item.text}`);
|
|
258
|
+
lines.push(` | class={getAsideClass(item)}`);
|
|
194
259
|
if (hasCode) {
|
|
195
260
|
for (let i = 0; i < codeTrees.length; i++) {
|
|
196
261
|
const previewProp = previewEntries[i] ? `preview=\${() => $Bobe_Comp_${i}}` : '';
|
|
@@ -227,8 +292,9 @@ function markdownPlugin(opt = {}) {
|
|
|
227
292
|
tokens,
|
|
228
293
|
depth
|
|
229
294
|
}) {
|
|
230
|
-
const
|
|
231
|
-
const
|
|
295
|
+
const html = this.parser.parseInline(tokens);
|
|
296
|
+
const text = plainText(tokens);
|
|
297
|
+
const id = slugify(text);
|
|
232
298
|
if (depth <= (opt.asideDeep || 3)) {
|
|
233
299
|
headers.push({
|
|
234
300
|
depth,
|
|
@@ -236,7 +302,7 @@ function markdownPlugin(opt = {}) {
|
|
|
236
302
|
text
|
|
237
303
|
});
|
|
238
304
|
}
|
|
239
|
-
return `<h${depth} class="${headClassMap[depth]}" data-text="${text}" id="${id}">${
|
|
305
|
+
return `<h${depth} class="${headClassMap[depth] || ''}" data-text="${escAttr(text)}" id="${id}">${html}</h${depth}>`;
|
|
240
306
|
},
|
|
241
307
|
code({
|
|
242
308
|
text,
|
|
@@ -287,4 +353,4 @@ function markdownPlugin(opt = {}) {
|
|
|
287
353
|
}
|
|
288
354
|
|
|
289
355
|
module.exports = markdownPlugin;
|
|
290
|
-
//# sourceMappingURL=markdown.cjs.
|
|
356
|
+
//# sourceMappingURL=markdown.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.cjs","sources":["../src/plugins/markdown/my-resolve.ts","../src/plugins/markdown/components/bobe-lang.ts","../src/plugins/markdown/index.ts"],"sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport hljs from 'highlight.js';\nfunction highlight(code: string, lang: string): string {\n try {\n return hljs.highlight(code, { language: lang }).value;\n } catch {\n return code.replace(/</g, '<').replace(/>/g, '>');\n }\n}\n\ntype ResolveFn = (id: string, importer?: string) => Promise<{ id: string } | null>;\nexport type FileItem = {\n path: string;\n name: string;\n lang: string;\n html: string;\n};\nexport async function resolveImportTree(\n importPath: string,\n currentPath: string,\n vResolve: ResolveFn,\n walked = new Set<string>()\n): Promise<FileItem[]> {\n const resolved = await vResolve(importPath, currentPath);\n const absPath = resolved?.id;\n\n if (!absPath || absPath.includes('node_modules') || absPath.startsWith('\\0') || walked.has(absPath)) {\n return [];\n }\n\n walked.add(absPath);\n\n let content = '';\n try {\n content = await fs.promises.readFile(absPath, 'utf-8');\n } catch (error) {\n console.warn(`Failed to read file: ${absPath}`);\n }\n if (!content) {\n return [];\n }\n\n const langMap: Record<string, string> = {\n ts: 'typescript',\n tsx: 'typescript',\n mts: 'typescript',\n js: 'javascript',\n jsx: 'javascript',\n mjs: 'javascript',\n css: 'css',\n html: 'xml',\n json: 'json'\n };\n const ext = path.extname(absPath).slice(1);\n const lang = langMap[ext];\n\n const item: FileItem = {\n path: absPath,\n name: path.basename(absPath),\n lang: lang,\n // html: highlight(content, lang)\n html: lang ? highlight(content, lang) : content\n };\n\n // 4. 正则匹配出文件中的静态 import 语句\n const importRegex = /import\\s+(?:[\\w*\\s{},]*\\s+from\\s+)?['\"]([^'\"]+)['\"]/g;\n let match: RegExpExecArray | null;\n const dependencies: Promise<FileItem[]>[] = [];\n\n while ((match = importRegex.exec(content)) !== null) {\n const importPath = match[1];\n // 排除绝对路径网络请求(如 https://)\n if (!importPath.startsWith('http')) {\n dependencies.push(resolveImportTree(importPath, absPath, vResolve, walked));\n }\n }\n if (!dependencies.length) {\n return [item];\n }\n const deps = await Promise.all(dependencies);\n return [item, ...deps.flat()];\n}\n","import hljs, { Language } from 'highlight.js';\n\n/**\n * 注册 bobe DSL 语法高亮。\n *\n * 1. 注册 `bobe` 独立语言(用于 markdown 中 ```bobe 代码块)\n * 2. 给 JavaScript grammar 打补丁,让 `bobe`...`` 标签模板被 TS/JS 代码块自动识别\n *\n * bobe 采用类似 Pug 的缩进风格,语法要素:\n * - 元素标签:div, span, h1-h6, a, p, ul, li, button, input ...\n * - 属性:class=\"...\", id=\"...\", children=\"...\", onclick={...}, ref={...}\n * - 控制流:if, else, for, tp\n * - 响应式绑定:{expr}\n * - 模板插值:${expr}\n * - 字符串:\"hello\"\n * - 注释:# comment\n */\nexport function registerBobeLang() {\n // ================================================================\n // Part 1: 注册 bobe 独立语言\n // ================================================================\n hljs.registerLanguage('bobe', (hljs) => {\n // 属性名列表(含事件处理器和布尔属性)\n const ATTRS = [\n 'class', 'id', 'children', 'html', 'style', 'href', 'src', 'alt', 'title',\n 'ref', 'type', 'placeholder', 'value', 'name', 'foo',\n 'disabled', 'readonly', 'checked', 'selected', 'hidden',\n 'role', 'target', 'rel', 'width', 'height', 'tabindex',\n 'data-[\\\\w-]+', 'aria-[\\\\w-]+',\n 'onclick', 'oninput', 'onchange', 'onsubmit', 'onreset',\n 'onkeydown', 'onkeyup', 'onkeypress',\n 'onfocus', 'onblur', 'onmouseenter', 'onmouseleave',\n 'onmousemove', 'onmouseover', 'onmouseout',\n 'onload', 'onerror', 'onscroll', 'onresize',\n 'ondrag', 'ondragstart', 'ondragend', 'ondragover', 'ondrop',\n 'ontouchstart', 'ontouchend', 'ontouchmove',\n ].join('|');\n\n return {\n name: 'bobe',\n // keywords: {\n // $pattern: /\\b(if|else|for|tp)\\b/,\n // keyword: 'if else for tp'\n // },\n keywords: ['if','else','for','tp','context'],\n contains: [\n // ----------------------------------------------------------\n // 1. 行注释 — # 到行尾\n // ----------------------------------------------------------\n hljs.COMMENT('#', '$', { relevance: 0 }),\n\n // ----------------------------------------------------------\n // 2. 模板插值 ${expr} — bobe 组件/表达式嵌入\n // ----------------------------------------------------------\n {\n className: 'template-substitution',\n begin: /\\$\\{/,\n end: /\\}/,\n contains: [\n { begin: /\\$\\{/, end: /\\}/, skip: true },\n ],\n subLanguage: 'javascript',\n },\n\n // ----------------------------------------------------------\n // 3. 响应式绑定 {expr} — 跟在 = 后面(不含 $)\n // ----------------------------------------------------------\n {\n className: 'template-substitution',\n begin: /(?<==)\\{/,\n end: /\\}/,\n contains: [\n { begin: /\\{/, end: /\\}/, skip: true },\n ],\n subLanguage: 'javascript',\n },\n\n // ----------------------------------------------------------\n // 4. 双引号字符串 — 内部可含 ${} 插值\n // ----------------------------------------------------------\n {\n className: 'string',\n begin: /\"/,\n end: /\"/,\n contains: [\n {\n begin: /\\$\\{/,\n end: /\\}/,\n subLanguage: 'javascript',\n }\n ]\n },\n\n // ----------------------------------------------------------\n // 5. 元素标签 — 行首缩进后的第一个标识符(排除关键字)\n // 泛化匹配:bobe 缩进语法中每行首个标识符必是标签或关键字\n // ----------------------------------------------------------\n {\n className: 'selector-tag',\n begin: /^[ \\t]*(?!(?:if|else|for|tp)\\b)[a-z][\\w-]*(?:-[a-z][\\w-]*)*\\b/m,\n relevance: 2,\n },\n\n // ----------------------------------------------------------\n // 6. 属性名 — key=value 形式\n // ----------------------------------------------------------\n {\n className: 'attr',\n begin: new RegExp(`\\\\b(?:${ATTRS})\\\\b(?=\\\\s*=)`),\n relevance: 1,\n },\n\n // ----------------------------------------------------------\n // 7. 布尔属性 — 独立出现,不跟 =\n // ----------------------------------------------------------\n {\n className: 'attr',\n begin: /\\b(?:disabled|readonly|checked|selected|hidden)\\b(?!\\s*=)/,\n relevance: 0,\n },\n\n // ----------------------------------------------------------\n // 8. for 循环变量 — for items; item i\n // ----------------------------------------------------------\n {\n className: 'variable',\n begin: /(?<=for\\s+)\\w+(?=\\s*;)/,\n relevance: 0,\n },\n {\n className: 'params',\n begin: /(?<=for\\s+\\S+\\s*;\\s*)\\w+/,\n relevance: 0,\n },\n {\n className: 'params',\n begin: /(?<=for\\s+\\S+\\s*;\\s*\\w+\\s+)\\w+/,\n relevance: 0,\n },\n\n // ----------------------------------------------------------\n // 9. 数字字面量\n // ----------------------------------------------------------\n hljs.NUMBER_MODE,\n ]\n } as Language;\n });\n\n // ================================================================\n // Part 2: 给 JS-family grammars 打补丁,让 `bobe`...`` 标签模板被识别\n // ================================================================\n function patchJsFamily(name: string) {\n const fn = (hljs.getLanguage(name) as any)?.rawDefinition as\n | ((hljs: any) => any)\n | undefined;\n if (!fn) return;\n\n const def = fn(hljs);\n\n // 避免重复注册\n if (def.contains.some((c: any) =>\n c.begin?.toString?.().includes('bobe')\n )) return;\n\n // 复刻该 grammar 的 keywords(用于 SUBST 中的 JS 表达式高亮)\n const SUBST = {\n className: 'subst',\n begin: /\\$\\{/,\n end: /\\}/,\n keywords: def.keywords,\n };\n\n def.contains.push({\n begin: /\\.?bobe`/, // 匹配 bobe` 或 .bobe`\n end: '',\n starts: {\n end: '`',\n returnEnd: false,\n contains: [hljs.BACKSLASH_ESCAPE, SUBST],\n subLanguage: 'bobe',\n },\n });\n\n hljs.registerLanguage(name, () => def);\n }\n\n patchJsFamily('javascript');\n patchJsFamily('typescript');\n}\n","import type { Plugin } from 'vite';\nimport type { MarkedExtension } from 'marked';\nimport { marked } from 'marked';\nimport matter from 'gray-matter';\nimport { resolve, dirname } from 'path';\nimport { FileItem, resolveImportTree } from './my-resolve';\nimport hljs from 'highlight.js';\nimport { registerBobeLang } from './components/bobe-lang';\n\nexport interface MarkdownPluginOptions {\n /** 传递给 marked.use() 的扩展配置 */\n marked?: MarkedExtension;\n /** 侧边栏的深度,默认为 3,表示提取 h1 - h3 到侧边栏做导航 */\n asideDeep?: number;\n}\n\n/** 对要嵌入模板字面量的字符串进行转义(` $ \\) */\nfunction esc(s: string): string {\n return s.replace(/\\\\/g, '\\\\\\\\').replace(/`/g, '\\\\`').replace(/\\$/g, '\\\\$');\n}\n\nfunction plainText(tokens: any[]): string {\n return tokens.map(token => {\n if (Array.isArray(token.tokens)) return plainText(token.tokens);\n return typeof token.text === 'string' ? token.text : token.raw || '';\n }).join('');\n}\n\nfunction slugify(s: string): string {\n return s.toLowerCase().replace(/[^\\w一-鿿]+/g, '-').replace(/^-+|-+$/g, '');\n}\n\nfunction escAttr(s: string): string {\n return s.replace(/&/g, '&').replace(/\"/g, '"').replace(/</g, '<').replace(/>/g, '>');\n}\n\n/** 将 HTML 字符串编译为 bobe 组件模块源码 */\nfunction gen(\n html: string,\n headers: HeadItem[],\n previewEntries: string[],\n codeTrees: FileItem[][] = [],\n layoutPath?: string,\n routeMeta?: Record<string, any>\n): string {\n const hasCode = codeTrees.length > 0;\n const lines = [`import { bobe, Store, effect } from 'bobe';`];\n\n // layout 组件导入\n if (layoutPath) {\n lines.push(`import __layout from '${layoutPath}';`);\n }\n\n if (hasCode) {\n lines.push(`import Code from 'bobe-dom/plugin-markdown/code';`);\n previewEntries.forEach((src, i) => {\n lines.push(`import $Bobe_Comp_${i} from '${src}';`);\n });\n }\n\n lines.push(`const mdHtml = \\`${esc(html)}\\`;`);\n lines.push(`const headings = ${JSON.stringify(headers)};`);\n\n // 代码树数据\n if (hasCode) {\n for (let i = 0; i < codeTrees.length; i++) {\n lines.push(`const codeTree${i} = ${JSON.stringify(codeTrees[i])};`);\n }\n }\n\n // Markdown Store 组件\n lines.push(`class Markdown extends Store {`);\n lines.push(` headings = headings;`);\n lines.push(` mdRef = null;`);\n lines.push(` asideRef = null;`);\n lines.push(` activeHeadingId = '';`);\n lines.push(` indicatorTop = 0;`);\n lines.push(` indicatorHeight = 25;`);\n lines.push(``);\n lines.push(` constructor() {`);\n lines.push(` super();`);\n lines.push(` effect(() => {`);\n lines.push(` if (typeof window === 'undefined') return;`);\n lines.push(` const syncActiveHeading = () => {`);\n lines.push(` const rawHash = window.location.hash.slice(1);`);\n lines.push(` let hash = rawHash;`);\n lines.push(` try {`);\n lines.push(` hash = decodeURIComponent(rawHash);`);\n lines.push(` } catch {}`);\n lines.push(` this.activeHeadingId = headings.some(item => item.id === hash) ? hash : '';`);\n lines.push(` this.updateIndicator();`);\n lines.push(` };`);\n lines.push(` syncActiveHeading();`);\n lines.push(` window.addEventListener('hashchange', syncActiveHeading);`);\n lines.push(` return () => window.removeEventListener('hashchange', syncActiveHeading);`);\n lines.push(` });`);\n lines.push(` }`);\n lines.push(``);\n lines.push(` getAsideClass(item) {`);\n lines.push(` const active = this.activeHeadingId === item.id ? ' markdown-aside-item-active' : '';`);\n lines.push(` return 'markdown-aside-item markdown-aside-depth-' + item.depth + active;`);\n lines.push(` }`);\n lines.push(``);\n lines.push(` get indicatorStyle() {`);\n lines.push(` return 'transform: translateY(' + this.indicatorTop + 'px); height: ' + this.indicatorHeight + 'px;';`);\n lines.push(` }`);\n lines.push(``);\n lines.push(` updateIndicator() {`);\n lines.push(` if (typeof window === 'undefined') return;`);\n lines.push(` window.requestAnimationFrame(() => {`);\n lines.push(` const active = this.asideRef?.querySelector?.('.markdown-aside-item-active');`);\n lines.push(` if (!active) {`);\n lines.push(` this.indicatorTop = 0;`);\n lines.push(` this.indicatorHeight = 25;`);\n lines.push(` return;`);\n lines.push(` }`);\n lines.push(` const style = window.getComputedStyle(active);`);\n lines.push(` const marginTop = Number.parseFloat(style.marginTop) || 0;`);\n lines.push(` this.indicatorTop = active.offsetTop - marginTop + (active.offsetHeight - this.indicatorHeight) / 2;`);\n lines.push(` this.indicatorHeight = 25;`);\n lines.push(` });`);\n lines.push(` }`);\n lines.push(``);\n lines.push(` ui = bobe\\``);\n lines.push(` div class=\"markdown\"`);\n lines.push(` main ref={mdRef} class=\"markdown-body\" html=\\${mdHtml}`);\n lines.push(` if showAside`);\n lines.push(` aside ref={asideRef} class=\"markdown-aside\"`);\n lines.push(` div class=\"markdown-aside-content\"`);\n lines.push(` div class=\"markdown-aside-border\"`);\n lines.push(` div class={activeHeadingId ? 'markdown-aside-indicator markdown-aside-indicator-active' : 'markdown-aside-indicator'} style={indicatorStyle}`);\n lines.push(` for headings; item ; item.id`);\n lines.push(` a`);\n lines.push(` | href={'#' + item.id}`);\n lines.push(` | children={item.text}`);\n lines.push(` | class={getAsideClass(item)}`);\n // tp + Code 组件\n if (hasCode) {\n for (let i = 0; i < codeTrees.length; i++) {\n const previewProp = previewEntries[i] ? `preview=\\${() => $Bobe_Comp_${i}}` : '';\n lines.push(` tp node={mdRef?.querySelector?.('#code-${i}')}`);\n lines.push(` \\${Code} files=\\${codeTree${i}} ${previewProp}`);\n }\n }\n lines.push(` \\`;`);\n lines.push(`}`);\n lines.push(`export default Markdown;`);\n if (layoutPath) {\n lines.push(`export { __layout as layout };`);\n }\n if (routeMeta) {\n lines.push(`export const routeMeta = ${JSON.stringify(routeMeta)};`);\n }\n return lines.join('\\n');\n}\n\n/**\n * bobe-markdown Vite 插件。\n *\n * 将 .md / .mdx 文件编译为 bobe 组件:\n * import Readme from './README.md';\n *\n * 支持 <code src=\"xxx.ts\" /> 引入代码文件及 import 树(非 node_modules),\n * 以 Code 组件 + tp 传送方式渲染。\n */\n\nexport type HeadItem = {\n depth: number;\n id: string;\n text: string;\n};\n\nconst CODE_TAG_RE = /<code\\s+src=\"([^\"]+)\"(\\s+preview)?\\s*\\/>/g;\n\nexport default function markdownPlugin(opt: MarkdownPluginOptions = {}): Plugin {\n let headers: HeadItem[] = [];\n const headClassMap: Record<number, string> = {\n '1': 'cyber-title'\n }\n return {\n name: 'bobe-markdown',\n enforce: 'pre',\n\n configResolved() {\n registerBobeLang(); // 注册 bobe DSL 语法高亮(支持 markdown 中的 ```bobe 代码块)\n marked.use({\n gfm: true, // GitHub Flavored Markdown\n renderer: {\n heading({ tokens, depth }) {\n const html = this.parser.parseInline(tokens);\n const text = plainText(tokens);\n const id = slugify(text);\n if (depth <= (opt.asideDeep || 3)) {\n headers.push({ depth, id, text });\n }\n return `<h${depth} class=\"${headClassMap[depth] || ''}\" data-text=\"${escAttr(text)}\" id=\"${id}\">${html}</h${depth}>`;\n },\n code({ text, lang }) {\n return `<pre><code class=\"hljs\">${hljs.highlight(text, { language: lang }).value}</code></pre>`;\n }\n }\n });\n if (opt.marked) marked.use(opt.marked);\n },\n\n async transform(code, id) {\n if (!id.match(/\\.mdx?$/)) return;\n headers = [];\n try {\n // 解析 YAML frontmatter\n const { data, content: mdContent } = matter(code);\n\n // 提取 routeMeta\n const routeMeta = data.meta as Record<string, any> | undefined;\n\n // 提取 layout 路径(相对于 .md 文件)\n let layoutPath: string | undefined;\n if (data.layout && typeof data.layout === 'string') {\n layoutPath = data.layout;\n }\n\n const html = marked.parse(mdContent) as string;\n\n // 匹配 <code src=\"xxx.ts\"> → <div id=\"code-N\">\n const codeTags: string[] = [];\n const previewEntries: string[] = [];\n let idx = 0;\n const finalHtml = html.replace(CODE_TAG_RE, (_, src, preview) => {\n codeTags.push(src);\n if (preview) {\n previewEntries[idx] = src;\n }\n return `<div id=\"code-${idx++}\"></div>`;\n });\n\n // 解析每个 code block 的 import 树\n const fileDir = dirname(id);\n const codeTrees = await Promise.all(\n codeTags.map(tag => resolveImportTree(resolve(fileDir, tag), id, this.resolve.bind(this)))\n );\n\n return { code: gen(finalHtml, headers, previewEntries, codeTrees, layoutPath, routeMeta), moduleSideEffects: false };\n } catch (e: any) {\n this.error(`[bobe-markdown] 解析失败: ${id}\\n${e.message}`);\n }\n }\n };\n}\n"],"names":["highlight","code","lang","hljs","language","value","replace","resolveImportTree","importPath","currentPath","vResolve","walked","Set","resolved","absPath","id","includes","startsWith","has","add","content","fs","promises","readFile","error","console","warn","langMap","ts","tsx","mts","js","jsx","mjs","css","html","json","ext","path","extname","slice","item","name","basename","importRegex","match","dependencies","exec","push","length","deps","Promise","all","flat","registerBobeLang","registerLanguage","ATTRS","join","keywords","contains","COMMENT","relevance","className","begin","end","skip","subLanguage","RegExp","NUMBER_MODE","patchJsFamily","fn","getLanguage","rawDefinition","def","some","c","toString","SUBST","starts","returnEnd","BACKSLASH_ESCAPE","esc","s","plainText","tokens","map","token","Array","isArray","text","raw","slugify","toLowerCase","escAttr","gen","headers","previewEntries","codeTrees","layoutPath","routeMeta","hasCode","lines","forEach","src","i","JSON","stringify","previewProp","CODE_TAG_RE","markdownPlugin","opt","headClassMap","enforce","configResolved","marked","use","gfm","renderer","heading","depth","parser","parseInline","asideDeep","transform","_matter","matter","data","mdContent","meta","layout","parse","codeTags","idx","finalHtml","_","preview","fileDir","dirname","tag","resolve","bind","moduleSideEffects","e","message"],"mappings":"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"}
|
package/dist/markdown.esm.js
CHANGED
|
@@ -66,7 +66,7 @@ async function resolveImportTree(importPath, currentPath, vResolve, walked = new
|
|
|
66
66
|
|
|
67
67
|
function registerBobeLang() {
|
|
68
68
|
hljs.registerLanguage('bobe', hljs => {
|
|
69
|
-
const ATTRS = ['class', 'id', '
|
|
69
|
+
const ATTRS = ['class', 'id', 'children', 'html', 'style', 'href', 'src', 'alt', 'title', 'ref', 'type', 'placeholder', 'value', 'name', 'foo', 'disabled', 'readonly', 'checked', 'selected', 'hidden', 'role', 'target', 'rel', 'width', 'height', 'tabindex', 'data-[\\w-]+', 'aria-[\\w-]+', 'onclick', 'oninput', 'onchange', 'onsubmit', 'onreset', 'onkeydown', 'onkeyup', 'onkeypress', 'onfocus', 'onblur', 'onmouseenter', 'onmouseleave', 'onmousemove', 'onmouseover', 'onmouseout', 'onload', 'onerror', 'onscroll', 'onresize', 'ondrag', 'ondragstart', 'ondragend', 'ondragover', 'ondrop', 'ontouchstart', 'ontouchend', 'ontouchmove'].join('|');
|
|
70
70
|
return {
|
|
71
71
|
name: 'bobe',
|
|
72
72
|
keywords: ['if', 'else', 'for', 'tp', 'context'],
|
|
@@ -158,9 +158,21 @@ function registerBobeLang() {
|
|
|
158
158
|
function esc(s) {
|
|
159
159
|
return s.replace(/\\/g, '\\\\').replace(/`/g, '\\`').replace(/\$/g, '\\$');
|
|
160
160
|
}
|
|
161
|
+
function plainText(tokens) {
|
|
162
|
+
return tokens.map(token => {
|
|
163
|
+
if (Array.isArray(token.tokens)) return plainText(token.tokens);
|
|
164
|
+
return typeof token.text === 'string' ? token.text : token.raw || '';
|
|
165
|
+
}).join('');
|
|
166
|
+
}
|
|
167
|
+
function slugify(s) {
|
|
168
|
+
return s.toLowerCase().replace(/[^\w一-鿿]+/g, '-').replace(/^-+|-+$/g, '');
|
|
169
|
+
}
|
|
170
|
+
function escAttr(s) {
|
|
171
|
+
return s.replace(/&/g, '&').replace(/"/g, '"').replace(/</g, '<').replace(/>/g, '>');
|
|
172
|
+
}
|
|
161
173
|
function gen(html, headers, previewEntries, codeTrees = [], layoutPath, routeMeta) {
|
|
162
174
|
const hasCode = codeTrees.length > 0;
|
|
163
|
-
const lines = [`import { bobe, Store } from 'bobe';`];
|
|
175
|
+
const lines = [`import { bobe, Store, effect } from 'bobe';`];
|
|
164
176
|
if (layoutPath) {
|
|
165
177
|
lines.push(`import __layout from '${layoutPath}';`);
|
|
166
178
|
}
|
|
@@ -171,24 +183,77 @@ function gen(html, headers, previewEntries, codeTrees = [], layoutPath, routeMet
|
|
|
171
183
|
});
|
|
172
184
|
}
|
|
173
185
|
lines.push(`const mdHtml = \`${esc(html)}\`;`);
|
|
186
|
+
lines.push(`const headings = ${JSON.stringify(headers)};`);
|
|
174
187
|
if (hasCode) {
|
|
175
188
|
for (let i = 0; i < codeTrees.length; i++) {
|
|
176
189
|
lines.push(`const codeTree${i} = ${JSON.stringify(codeTrees[i])};`);
|
|
177
190
|
}
|
|
178
191
|
}
|
|
179
192
|
lines.push(`class Markdown extends Store {`);
|
|
193
|
+
lines.push(` headings = headings;`);
|
|
180
194
|
lines.push(` mdRef = null;`);
|
|
195
|
+
lines.push(` asideRef = null;`);
|
|
196
|
+
lines.push(` activeHeadingId = '';`);
|
|
197
|
+
lines.push(` indicatorTop = 0;`);
|
|
198
|
+
lines.push(` indicatorHeight = 25;`);
|
|
199
|
+
lines.push(``);
|
|
200
|
+
lines.push(` constructor() {`);
|
|
201
|
+
lines.push(` super();`);
|
|
202
|
+
lines.push(` effect(() => {`);
|
|
203
|
+
lines.push(` if (typeof window === 'undefined') return;`);
|
|
204
|
+
lines.push(` const syncActiveHeading = () => {`);
|
|
205
|
+
lines.push(` const rawHash = window.location.hash.slice(1);`);
|
|
206
|
+
lines.push(` let hash = rawHash;`);
|
|
207
|
+
lines.push(` try {`);
|
|
208
|
+
lines.push(` hash = decodeURIComponent(rawHash);`);
|
|
209
|
+
lines.push(` } catch {}`);
|
|
210
|
+
lines.push(` this.activeHeadingId = headings.some(item => item.id === hash) ? hash : '';`);
|
|
211
|
+
lines.push(` this.updateIndicator();`);
|
|
212
|
+
lines.push(` };`);
|
|
213
|
+
lines.push(` syncActiveHeading();`);
|
|
214
|
+
lines.push(` window.addEventListener('hashchange', syncActiveHeading);`);
|
|
215
|
+
lines.push(` return () => window.removeEventListener('hashchange', syncActiveHeading);`);
|
|
216
|
+
lines.push(` });`);
|
|
217
|
+
lines.push(` }`);
|
|
218
|
+
lines.push(``);
|
|
219
|
+
lines.push(` getAsideClass(item) {`);
|
|
220
|
+
lines.push(` const active = this.activeHeadingId === item.id ? ' markdown-aside-item-active' : '';`);
|
|
221
|
+
lines.push(` return 'markdown-aside-item markdown-aside-depth-' + item.depth + active;`);
|
|
222
|
+
lines.push(` }`);
|
|
223
|
+
lines.push(``);
|
|
224
|
+
lines.push(` get indicatorStyle() {`);
|
|
225
|
+
lines.push(` return 'transform: translateY(' + this.indicatorTop + 'px); height: ' + this.indicatorHeight + 'px;';`);
|
|
226
|
+
lines.push(` }`);
|
|
227
|
+
lines.push(``);
|
|
228
|
+
lines.push(` updateIndicator() {`);
|
|
229
|
+
lines.push(` if (typeof window === 'undefined') return;`);
|
|
230
|
+
lines.push(` window.requestAnimationFrame(() => {`);
|
|
231
|
+
lines.push(` const active = this.asideRef?.querySelector?.('.markdown-aside-item-active');`);
|
|
232
|
+
lines.push(` if (!active) {`);
|
|
233
|
+
lines.push(` this.indicatorTop = 0;`);
|
|
234
|
+
lines.push(` this.indicatorHeight = 25;`);
|
|
235
|
+
lines.push(` return;`);
|
|
236
|
+
lines.push(` }`);
|
|
237
|
+
lines.push(` const style = window.getComputedStyle(active);`);
|
|
238
|
+
lines.push(` const marginTop = Number.parseFloat(style.marginTop) || 0;`);
|
|
239
|
+
lines.push(` this.indicatorTop = active.offsetTop - marginTop + (active.offsetHeight - this.indicatorHeight) / 2;`);
|
|
240
|
+
lines.push(` this.indicatorHeight = 25;`);
|
|
241
|
+
lines.push(` });`);
|
|
242
|
+
lines.push(` }`);
|
|
243
|
+
lines.push(``);
|
|
181
244
|
lines.push(` ui = bobe\``);
|
|
182
|
-
lines.push(` div class="markdown"
|
|
183
|
-
lines.push(` main ref={mdRef} class="markdown-body"
|
|
245
|
+
lines.push(` div class="markdown"`);
|
|
246
|
+
lines.push(` main ref={mdRef} class="markdown-body" html=\${mdHtml}`);
|
|
184
247
|
lines.push(` if showAside`);
|
|
185
|
-
lines.push(`
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
}
|
|
248
|
+
lines.push(` aside ref={asideRef} class="markdown-aside"`);
|
|
249
|
+
lines.push(` div class="markdown-aside-content"`);
|
|
250
|
+
lines.push(` div class="markdown-aside-border"`);
|
|
251
|
+
lines.push(` div class={activeHeadingId ? 'markdown-aside-indicator markdown-aside-indicator-active' : 'markdown-aside-indicator'} style={indicatorStyle}`);
|
|
252
|
+
lines.push(` for headings; item ; item.id`);
|
|
253
|
+
lines.push(` a`);
|
|
254
|
+
lines.push(` | href={'#' + item.id}`);
|
|
255
|
+
lines.push(` | children={item.text}`);
|
|
256
|
+
lines.push(` | class={getAsideClass(item)}`);
|
|
192
257
|
if (hasCode) {
|
|
193
258
|
for (let i = 0; i < codeTrees.length; i++) {
|
|
194
259
|
const previewProp = previewEntries[i] ? `preview=\${() => $Bobe_Comp_${i}}` : '';
|
|
@@ -225,8 +290,9 @@ function markdownPlugin(opt = {}) {
|
|
|
225
290
|
tokens,
|
|
226
291
|
depth
|
|
227
292
|
}) {
|
|
228
|
-
const
|
|
229
|
-
const
|
|
293
|
+
const html = this.parser.parseInline(tokens);
|
|
294
|
+
const text = plainText(tokens);
|
|
295
|
+
const id = slugify(text);
|
|
230
296
|
if (depth <= (opt.asideDeep || 3)) {
|
|
231
297
|
headers.push({
|
|
232
298
|
depth,
|
|
@@ -234,7 +300,7 @@ function markdownPlugin(opt = {}) {
|
|
|
234
300
|
text
|
|
235
301
|
});
|
|
236
302
|
}
|
|
237
|
-
return `<h${depth} class="${headClassMap[depth]}" data-text="${text}" id="${id}">${
|
|
303
|
+
return `<h${depth} class="${headClassMap[depth] || ''}" data-text="${escAttr(text)}" id="${id}">${html}</h${depth}>`;
|
|
238
304
|
},
|
|
239
305
|
code({
|
|
240
306
|
text,
|
package/dist/markdown.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown.esm.js","sources":["../src/plugins/markdown/my-resolve.ts","../src/plugins/markdown/components/bobe-lang.ts","../src/plugins/markdown/index.ts"],"sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport hljs from 'highlight.js';\nfunction highlight(code: string, lang: string): string {\n try {\n return hljs.highlight(code, { language: lang }).value;\n } catch {\n return code.replace(/</g, '<').replace(/>/g, '>');\n }\n}\n\ntype ResolveFn = (id: string, importer?: string) => Promise<{ id: string } | null>;\nexport type FileItem = {\n path: string;\n name: string;\n lang: string;\n html: string;\n};\nexport async function resolveImportTree(\n importPath: string,\n currentPath: string,\n vResolve: ResolveFn,\n walked = new Set<string>()\n): Promise<FileItem[]> {\n const resolved = await vResolve(importPath, currentPath);\n const absPath = resolved?.id;\n\n if (!absPath || absPath.includes('node_modules') || absPath.startsWith('\\0') || walked.has(absPath)) {\n return [];\n }\n\n walked.add(absPath);\n\n let content = '';\n try {\n content = await fs.promises.readFile(absPath, 'utf-8');\n } catch (error) {\n console.warn(`Failed to read file: ${absPath}`);\n }\n if (!content) {\n return [];\n }\n\n const langMap: Record<string, string> = {\n ts: 'typescript',\n tsx: 'typescript',\n mts: 'typescript',\n js: 'javascript',\n jsx: 'javascript',\n mjs: 'javascript',\n css: 'css',\n html: 'xml',\n json: 'json'\n };\n const ext = path.extname(absPath).slice(1);\n const lang = langMap[ext];\n\n const item: FileItem = {\n path: absPath,\n name: path.basename(absPath),\n lang: lang,\n // html: highlight(content, lang)\n html: lang ? highlight(content, lang) : content\n };\n\n // 4. 正则匹配出文件中的静态 import 语句\n const importRegex = /import\\s+(?:[\\w*\\s{},]*\\s+from\\s+)?['\"]([^'\"]+)['\"]/g;\n let match: RegExpExecArray | null;\n const dependencies: Promise<FileItem[]>[] = [];\n\n while ((match = importRegex.exec(content)) !== null) {\n const importPath = match[1];\n // 排除绝对路径网络请求(如 https://)\n if (!importPath.startsWith('http')) {\n dependencies.push(resolveImportTree(importPath, absPath, vResolve, walked));\n }\n }\n if (!dependencies.length) {\n return [item];\n }\n const deps = await Promise.all(dependencies);\n return [item, ...deps.flat()];\n}\n","import hljs, { Language } from 'highlight.js';\n\n/**\n * 注册 bobe DSL 语法高亮。\n *\n * 1. 注册 `bobe` 独立语言(用于 markdown 中 ```bobe 代码块)\n * 2. 给 JavaScript grammar 打补丁,让 `bobe`...`` 标签模板被 TS/JS 代码块自动识别\n *\n * bobe 采用类似 Pug 的缩进风格,语法要素:\n * - 元素标签:div, span, h1-h6, a, p, ul, li, button, input ...\n * - 属性:class=\"...\", id=\"...\", text=\"...\", onclick={...}, ref={...}\n * - 控制流:if, else, for, tp\n * - 响应式绑定:{expr}\n * - 模板插值:${expr}\n * - 字符串:\"hello\"\n * - 注释:# comment\n */\nexport function registerBobeLang() {\n // ================================================================\n // Part 1: 注册 bobe 独立语言\n // ================================================================\n hljs.registerLanguage('bobe', (hljs) => {\n // 属性名列表(含事件处理器和布尔属性)\n const ATTRS = [\n 'class', 'id', 'text', 'html', 'style', 'href', 'src', 'alt', 'title',\n 'ref', 'type', 'placeholder', 'value', 'name', 'foo',\n 'disabled', 'readonly', 'checked', 'selected', 'hidden',\n 'role', 'target', 'rel', 'width', 'height', 'tabindex',\n 'data-[\\\\w-]+', 'aria-[\\\\w-]+',\n 'onclick', 'oninput', 'onchange', 'onsubmit', 'onreset',\n 'onkeydown', 'onkeyup', 'onkeypress',\n 'onfocus', 'onblur', 'onmouseenter', 'onmouseleave',\n 'onmousemove', 'onmouseover', 'onmouseout',\n 'onload', 'onerror', 'onscroll', 'onresize',\n 'ondrag', 'ondragstart', 'ondragend', 'ondragover', 'ondrop',\n 'ontouchstart', 'ontouchend', 'ontouchmove',\n ].join('|');\n\n return {\n name: 'bobe',\n // keywords: {\n // $pattern: /\\b(if|else|for|tp)\\b/,\n // keyword: 'if else for tp'\n // },\n keywords: ['if','else','for','tp','context'],\n contains: [\n // ----------------------------------------------------------\n // 1. 行注释 — # 到行尾\n // ----------------------------------------------------------\n hljs.COMMENT('#', '$', { relevance: 0 }),\n\n // ----------------------------------------------------------\n // 2. 模板插值 ${expr} — bobe 组件/表达式嵌入\n // ----------------------------------------------------------\n {\n className: 'template-substitution',\n begin: /\\$\\{/,\n end: /\\}/,\n contains: [\n { begin: /\\$\\{/, end: /\\}/, skip: true },\n ],\n subLanguage: 'javascript',\n },\n\n // ----------------------------------------------------------\n // 3. 响应式绑定 {expr} — 跟在 = 后面(不含 $)\n // ----------------------------------------------------------\n {\n className: 'template-substitution',\n begin: /(?<==)\\{/,\n end: /\\}/,\n contains: [\n { begin: /\\{/, end: /\\}/, skip: true },\n ],\n subLanguage: 'javascript',\n },\n\n // ----------------------------------------------------------\n // 4. 双引号字符串 — 内部可含 ${} 插值\n // ----------------------------------------------------------\n {\n className: 'string',\n begin: /\"/,\n end: /\"/,\n contains: [\n {\n begin: /\\$\\{/,\n end: /\\}/,\n subLanguage: 'javascript',\n }\n ]\n },\n\n // ----------------------------------------------------------\n // 5. 元素标签 — 行首缩进后的第一个标识符(排除关键字)\n // 泛化匹配:bobe 缩进语法中每行首个标识符必是标签或关键字\n // ----------------------------------------------------------\n {\n className: 'selector-tag',\n begin: /^[ \\t]*(?!(?:if|else|for|tp)\\b)[a-z][\\w-]*(?:-[a-z][\\w-]*)*\\b/m,\n relevance: 2,\n },\n\n // ----------------------------------------------------------\n // 6. 属性名 — key=value 形式\n // ----------------------------------------------------------\n {\n className: 'attr',\n begin: new RegExp(`\\\\b(?:${ATTRS})\\\\b(?=\\\\s*=)`),\n relevance: 1,\n },\n\n // ----------------------------------------------------------\n // 7. 布尔属性 — 独立出现,不跟 =\n // ----------------------------------------------------------\n {\n className: 'attr',\n begin: /\\b(?:disabled|readonly|checked|selected|hidden)\\b(?!\\s*=)/,\n relevance: 0,\n },\n\n // ----------------------------------------------------------\n // 8. for 循环变量 — for items; item i\n // ----------------------------------------------------------\n {\n className: 'variable',\n begin: /(?<=for\\s+)\\w+(?=\\s*;)/,\n relevance: 0,\n },\n {\n className: 'params',\n begin: /(?<=for\\s+\\S+\\s*;\\s*)\\w+/,\n relevance: 0,\n },\n {\n className: 'params',\n begin: /(?<=for\\s+\\S+\\s*;\\s*\\w+\\s+)\\w+/,\n relevance: 0,\n },\n\n // ----------------------------------------------------------\n // 9. 数字字面量\n // ----------------------------------------------------------\n hljs.NUMBER_MODE,\n ]\n } as Language;\n });\n\n // ================================================================\n // Part 2: 给 JS-family grammars 打补丁,让 `bobe`...`` 标签模板被识别\n // ================================================================\n function patchJsFamily(name: string) {\n const fn = (hljs.getLanguage(name) as any)?.rawDefinition as\n | ((hljs: any) => any)\n | undefined;\n if (!fn) return;\n\n const def = fn(hljs);\n\n // 避免重复注册\n if (def.contains.some((c: any) =>\n c.begin?.toString?.().includes('bobe')\n )) return;\n\n // 复刻该 grammar 的 keywords(用于 SUBST 中的 JS 表达式高亮)\n const SUBST = {\n className: 'subst',\n begin: /\\$\\{/,\n end: /\\}/,\n keywords: def.keywords,\n };\n\n def.contains.push({\n begin: /\\.?bobe`/, // 匹配 bobe` 或 .bobe`\n end: '',\n starts: {\n end: '`',\n returnEnd: false,\n contains: [hljs.BACKSLASH_ESCAPE, SUBST],\n subLanguage: 'bobe',\n },\n });\n\n hljs.registerLanguage(name, () => def);\n }\n\n patchJsFamily('javascript');\n patchJsFamily('typescript');\n}\n","import type { Plugin } from 'vite';\nimport type { MarkedExtension } from 'marked';\nimport { marked } from 'marked';\nimport matter from 'gray-matter';\nimport { resolve, dirname } from 'path';\nimport { FileItem, resolveImportTree } from './my-resolve';\nimport hljs from 'highlight.js';\nimport { registerBobeLang } from './components/bobe-lang';\n\nexport interface MarkdownPluginOptions {\n /** 传递给 marked.use() 的扩展配置 */\n marked?: MarkedExtension;\n /** 侧边栏的深度,默认为 3,表示提取 h1 - h3 到侧边栏做导航 */\n asideDeep?: number;\n}\n\n/** 对要嵌入模板字面量的字符串进行转义(` $ \\) */\nfunction esc(s: string): string {\n return s.replace(/\\\\/g, '\\\\\\\\').replace(/`/g, '\\\\`').replace(/\\$/g, '\\\\$');\n}\n\n/** 将 HTML 字符串编译为 bobe 组件模块源码 */\nfunction gen(\n html: string,\n headers: HeadItem[],\n previewEntries: string[],\n codeTrees: FileItem[][] = [],\n layoutPath?: string,\n routeMeta?: Record<string, any>\n): string {\n const hasCode = codeTrees.length > 0;\n const lines = [`import { bobe, Store } from 'bobe';`];\n\n // layout 组件导入\n if (layoutPath) {\n lines.push(`import __layout from '${layoutPath}';`);\n }\n\n if (hasCode) {\n lines.push(`import Code from 'bobe-dom/plugin-markdown/code';`);\n previewEntries.forEach((src, i) => {\n lines.push(`import $Bobe_Comp_${i} from '${src}';`);\n });\n }\n\n lines.push(`const mdHtml = \\`${esc(html)}\\`;`);\n\n // 代码树数据\n if (hasCode) {\n for (let i = 0; i < codeTrees.length; i++) {\n lines.push(`const codeTree${i} = ${JSON.stringify(codeTrees[i])};`);\n }\n }\n\n // Markdown Store 组件\n lines.push(`class Markdown extends Store {`);\n lines.push(` mdRef = null;`);\n lines.push(` ui = bobe\\``);\n lines.push(` div class=\"markdown\" style=\"display: flex;\"`);\n lines.push(` main ref={mdRef} class=\"markdown-body\" style=\"overflow-y: auto;\" html=\\${mdHtml}`);\n lines.push(` if showAside`);\n lines.push(` div class=\"markdown-aside\" style=\"flex: none; display: flex; flex-direction: column; overflow-y: auto;\"`);\n for (const { depth, id, text } of headers) {\n lines.push(\n ` a href=\"#${id}\" text=\"${esc(text)}\" class=\"markdown-aside-item markdown-aside-depth-${depth}\"`\n );\n }\n // tp + Code 组件\n if (hasCode) {\n for (let i = 0; i < codeTrees.length; i++) {\n const previewProp = previewEntries[i] ? `preview=\\${() => $Bobe_Comp_${i}}` : '';\n lines.push(` tp node={mdRef?.querySelector?.('#code-${i}')}`);\n lines.push(` \\${Code} files=\\${codeTree${i}} ${previewProp}`);\n }\n }\n lines.push(` \\`;`);\n lines.push(`}`);\n lines.push(`export default Markdown;`);\n if (layoutPath) {\n lines.push(`export { __layout as layout };`);\n }\n if (routeMeta) {\n lines.push(`export const routeMeta = ${JSON.stringify(routeMeta)};`);\n }\n return lines.join('\\n');\n}\n\n/**\n * bobe-markdown Vite 插件。\n *\n * 将 .md / .mdx 文件编译为 bobe 组件:\n * import Readme from './README.md';\n *\n * 支持 <code src=\"xxx.ts\" /> 引入代码文件及 import 树(非 node_modules),\n * 以 Code 组件 + tp 传送方式渲染。\n */\n\nexport type HeadItem = {\n depth: number;\n id: string;\n text: string;\n};\n\nconst CODE_TAG_RE = /<code\\s+src=\"([^\"]+)\"(\\s+preview)?\\s*\\/>/g;\n\nexport default function markdownPlugin(opt: MarkdownPluginOptions = {}): Plugin {\n let headers: HeadItem[] = [];\n const headClassMap = {\n '1': 'cyber-title'\n }\n return {\n name: 'bobe-markdown',\n enforce: 'pre',\n\n configResolved() {\n registerBobeLang(); // 注册 bobe DSL 语法高亮(支持 markdown 中的 ```bobe 代码块)\n marked.use({\n gfm: true, // GitHub Flavored Markdown\n renderer: {\n heading({ tokens, depth }) {\n const text = this.parser.parseInline(tokens);\n const id = text.toLowerCase().replace(/[^\\w一-鿿]+/g, '-');\n if (depth <= (opt.asideDeep || 3)) {\n headers.push({ depth, id, text });\n }\n return `<h${depth} class=\"${headClassMap[depth]}\" data-text=\"${text}\" id=\"${id}\">${text}</h${depth}>`;\n },\n code({ text, lang }) {\n return `<pre><code class=\"hljs\">${hljs.highlight(text, { language: lang }).value}</code></pre>`;\n }\n }\n });\n if (opt.marked) marked.use(opt.marked);\n },\n\n async transform(code, id) {\n if (!id.match(/\\.mdx?$/)) return;\n headers = [];\n try {\n // 解析 YAML frontmatter\n const { data, content: mdContent } = matter(code);\n\n // 提取 routeMeta\n const routeMeta = data.meta as Record<string, any> | undefined;\n\n // 提取 layout 路径(相对于 .md 文件)\n let layoutPath: string | undefined;\n if (data.layout && typeof data.layout === 'string') {\n layoutPath = data.layout;\n }\n\n const html = marked.parse(mdContent) as string;\n\n // 匹配 <code src=\"xxx.ts\"> → <div id=\"code-N\">\n const codeTags: string[] = [];\n const previewEntries: string[] = [];\n let idx = 0;\n const finalHtml = html.replace(CODE_TAG_RE, (_, src, preview) => {\n codeTags.push(src);\n if (preview) {\n previewEntries[idx] = src;\n }\n return `<div id=\"code-${idx++}\"></div>`;\n });\n\n // 解析每个 code block 的 import 树\n const fileDir = dirname(id);\n const codeTrees = await Promise.all(\n codeTags.map(tag => resolveImportTree(resolve(fileDir, tag), id, this.resolve.bind(this)))\n );\n\n return { code: gen(finalHtml, headers, previewEntries, codeTrees, layoutPath, routeMeta), moduleSideEffects: false };\n } catch (e: any) {\n this.error(`[bobe-markdown] 解析失败: ${id}\\n${e.message}`);\n }\n }\n };\n}\n"],"names":["highlight","code","lang","hljs","language","value","replace","resolveImportTree","importPath","currentPath","vResolve","walked","Set","resolved","absPath","id","includes","startsWith","has","add","content","fs","promises","readFile","error","console","warn","langMap","ts","tsx","mts","js","jsx","mjs","css","html","json","ext","path","extname","slice","item","name","basename","importRegex","match","dependencies","exec","push","length","deps","Promise","all","flat","registerBobeLang","registerLanguage","ATTRS","join","keywords","contains","COMMENT","relevance","className","begin","end","skip","subLanguage","RegExp","NUMBER_MODE","patchJsFamily","fn","getLanguage","rawDefinition","def","some","c","toString","SUBST","starts","returnEnd","BACKSLASH_ESCAPE","esc","s","gen","headers","previewEntries","codeTrees","layoutPath","routeMeta","hasCode","lines","forEach","src","i","JSON","stringify","_ref","depth","text","previewProp","CODE_TAG_RE","markdownPlugin","opt","headClassMap","enforce","configResolved","marked","use","gfm","renderer","heading","tokens","parser","parseInline","toLowerCase","asideDeep","transform","_matter","matter","data","mdContent","meta","layout","parse","codeTags","idx","finalHtml","_","preview","fileDir","dirname","map","tag","resolve","bind","moduleSideEffects","e","message"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"markdown.esm.js","sources":["../src/plugins/markdown/my-resolve.ts","../src/plugins/markdown/components/bobe-lang.ts","../src/plugins/markdown/index.ts"],"sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport hljs from 'highlight.js';\nfunction highlight(code: string, lang: string): string {\n try {\n return hljs.highlight(code, { language: lang }).value;\n } catch {\n return code.replace(/</g, '<').replace(/>/g, '>');\n }\n}\n\ntype ResolveFn = (id: string, importer?: string) => Promise<{ id: string } | null>;\nexport type FileItem = {\n path: string;\n name: string;\n lang: string;\n html: string;\n};\nexport async function resolveImportTree(\n importPath: string,\n currentPath: string,\n vResolve: ResolveFn,\n walked = new Set<string>()\n): Promise<FileItem[]> {\n const resolved = await vResolve(importPath, currentPath);\n const absPath = resolved?.id;\n\n if (!absPath || absPath.includes('node_modules') || absPath.startsWith('\\0') || walked.has(absPath)) {\n return [];\n }\n\n walked.add(absPath);\n\n let content = '';\n try {\n content = await fs.promises.readFile(absPath, 'utf-8');\n } catch (error) {\n console.warn(`Failed to read file: ${absPath}`);\n }\n if (!content) {\n return [];\n }\n\n const langMap: Record<string, string> = {\n ts: 'typescript',\n tsx: 'typescript',\n mts: 'typescript',\n js: 'javascript',\n jsx: 'javascript',\n mjs: 'javascript',\n css: 'css',\n html: 'xml',\n json: 'json'\n };\n const ext = path.extname(absPath).slice(1);\n const lang = langMap[ext];\n\n const item: FileItem = {\n path: absPath,\n name: path.basename(absPath),\n lang: lang,\n // html: highlight(content, lang)\n html: lang ? highlight(content, lang) : content\n };\n\n // 4. 正则匹配出文件中的静态 import 语句\n const importRegex = /import\\s+(?:[\\w*\\s{},]*\\s+from\\s+)?['\"]([^'\"]+)['\"]/g;\n let match: RegExpExecArray | null;\n const dependencies: Promise<FileItem[]>[] = [];\n\n while ((match = importRegex.exec(content)) !== null) {\n const importPath = match[1];\n // 排除绝对路径网络请求(如 https://)\n if (!importPath.startsWith('http')) {\n dependencies.push(resolveImportTree(importPath, absPath, vResolve, walked));\n }\n }\n if (!dependencies.length) {\n return [item];\n }\n const deps = await Promise.all(dependencies);\n return [item, ...deps.flat()];\n}\n","import hljs, { Language } from 'highlight.js';\n\n/**\n * 注册 bobe DSL 语法高亮。\n *\n * 1. 注册 `bobe` 独立语言(用于 markdown 中 ```bobe 代码块)\n * 2. 给 JavaScript grammar 打补丁,让 `bobe`...`` 标签模板被 TS/JS 代码块自动识别\n *\n * bobe 采用类似 Pug 的缩进风格,语法要素:\n * - 元素标签:div, span, h1-h6, a, p, ul, li, button, input ...\n * - 属性:class=\"...\", id=\"...\", children=\"...\", onclick={...}, ref={...}\n * - 控制流:if, else, for, tp\n * - 响应式绑定:{expr}\n * - 模板插值:${expr}\n * - 字符串:\"hello\"\n * - 注释:# comment\n */\nexport function registerBobeLang() {\n // ================================================================\n // Part 1: 注册 bobe 独立语言\n // ================================================================\n hljs.registerLanguage('bobe', (hljs) => {\n // 属性名列表(含事件处理器和布尔属性)\n const ATTRS = [\n 'class', 'id', 'children', 'html', 'style', 'href', 'src', 'alt', 'title',\n 'ref', 'type', 'placeholder', 'value', 'name', 'foo',\n 'disabled', 'readonly', 'checked', 'selected', 'hidden',\n 'role', 'target', 'rel', 'width', 'height', 'tabindex',\n 'data-[\\\\w-]+', 'aria-[\\\\w-]+',\n 'onclick', 'oninput', 'onchange', 'onsubmit', 'onreset',\n 'onkeydown', 'onkeyup', 'onkeypress',\n 'onfocus', 'onblur', 'onmouseenter', 'onmouseleave',\n 'onmousemove', 'onmouseover', 'onmouseout',\n 'onload', 'onerror', 'onscroll', 'onresize',\n 'ondrag', 'ondragstart', 'ondragend', 'ondragover', 'ondrop',\n 'ontouchstart', 'ontouchend', 'ontouchmove',\n ].join('|');\n\n return {\n name: 'bobe',\n // keywords: {\n // $pattern: /\\b(if|else|for|tp)\\b/,\n // keyword: 'if else for tp'\n // },\n keywords: ['if','else','for','tp','context'],\n contains: [\n // ----------------------------------------------------------\n // 1. 行注释 — # 到行尾\n // ----------------------------------------------------------\n hljs.COMMENT('#', '$', { relevance: 0 }),\n\n // ----------------------------------------------------------\n // 2. 模板插值 ${expr} — bobe 组件/表达式嵌入\n // ----------------------------------------------------------\n {\n className: 'template-substitution',\n begin: /\\$\\{/,\n end: /\\}/,\n contains: [\n { begin: /\\$\\{/, end: /\\}/, skip: true },\n ],\n subLanguage: 'javascript',\n },\n\n // ----------------------------------------------------------\n // 3. 响应式绑定 {expr} — 跟在 = 后面(不含 $)\n // ----------------------------------------------------------\n {\n className: 'template-substitution',\n begin: /(?<==)\\{/,\n end: /\\}/,\n contains: [\n { begin: /\\{/, end: /\\}/, skip: true },\n ],\n subLanguage: 'javascript',\n },\n\n // ----------------------------------------------------------\n // 4. 双引号字符串 — 内部可含 ${} 插值\n // ----------------------------------------------------------\n {\n className: 'string',\n begin: /\"/,\n end: /\"/,\n contains: [\n {\n begin: /\\$\\{/,\n end: /\\}/,\n subLanguage: 'javascript',\n }\n ]\n },\n\n // ----------------------------------------------------------\n // 5. 元素标签 — 行首缩进后的第一个标识符(排除关键字)\n // 泛化匹配:bobe 缩进语法中每行首个标识符必是标签或关键字\n // ----------------------------------------------------------\n {\n className: 'selector-tag',\n begin: /^[ \\t]*(?!(?:if|else|for|tp)\\b)[a-z][\\w-]*(?:-[a-z][\\w-]*)*\\b/m,\n relevance: 2,\n },\n\n // ----------------------------------------------------------\n // 6. 属性名 — key=value 形式\n // ----------------------------------------------------------\n {\n className: 'attr',\n begin: new RegExp(`\\\\b(?:${ATTRS})\\\\b(?=\\\\s*=)`),\n relevance: 1,\n },\n\n // ----------------------------------------------------------\n // 7. 布尔属性 — 独立出现,不跟 =\n // ----------------------------------------------------------\n {\n className: 'attr',\n begin: /\\b(?:disabled|readonly|checked|selected|hidden)\\b(?!\\s*=)/,\n relevance: 0,\n },\n\n // ----------------------------------------------------------\n // 8. for 循环变量 — for items; item i\n // ----------------------------------------------------------\n {\n className: 'variable',\n begin: /(?<=for\\s+)\\w+(?=\\s*;)/,\n relevance: 0,\n },\n {\n className: 'params',\n begin: /(?<=for\\s+\\S+\\s*;\\s*)\\w+/,\n relevance: 0,\n },\n {\n className: 'params',\n begin: /(?<=for\\s+\\S+\\s*;\\s*\\w+\\s+)\\w+/,\n relevance: 0,\n },\n\n // ----------------------------------------------------------\n // 9. 数字字面量\n // ----------------------------------------------------------\n hljs.NUMBER_MODE,\n ]\n } as Language;\n });\n\n // ================================================================\n // Part 2: 给 JS-family grammars 打补丁,让 `bobe`...`` 标签模板被识别\n // ================================================================\n function patchJsFamily(name: string) {\n const fn = (hljs.getLanguage(name) as any)?.rawDefinition as\n | ((hljs: any) => any)\n | undefined;\n if (!fn) return;\n\n const def = fn(hljs);\n\n // 避免重复注册\n if (def.contains.some((c: any) =>\n c.begin?.toString?.().includes('bobe')\n )) return;\n\n // 复刻该 grammar 的 keywords(用于 SUBST 中的 JS 表达式高亮)\n const SUBST = {\n className: 'subst',\n begin: /\\$\\{/,\n end: /\\}/,\n keywords: def.keywords,\n };\n\n def.contains.push({\n begin: /\\.?bobe`/, // 匹配 bobe` 或 .bobe`\n end: '',\n starts: {\n end: '`',\n returnEnd: false,\n contains: [hljs.BACKSLASH_ESCAPE, SUBST],\n subLanguage: 'bobe',\n },\n });\n\n hljs.registerLanguage(name, () => def);\n }\n\n patchJsFamily('javascript');\n patchJsFamily('typescript');\n}\n","import type { Plugin } from 'vite';\nimport type { MarkedExtension } from 'marked';\nimport { marked } from 'marked';\nimport matter from 'gray-matter';\nimport { resolve, dirname } from 'path';\nimport { FileItem, resolveImportTree } from './my-resolve';\nimport hljs from 'highlight.js';\nimport { registerBobeLang } from './components/bobe-lang';\n\nexport interface MarkdownPluginOptions {\n /** 传递给 marked.use() 的扩展配置 */\n marked?: MarkedExtension;\n /** 侧边栏的深度,默认为 3,表示提取 h1 - h3 到侧边栏做导航 */\n asideDeep?: number;\n}\n\n/** 对要嵌入模板字面量的字符串进行转义(` $ \\) */\nfunction esc(s: string): string {\n return s.replace(/\\\\/g, '\\\\\\\\').replace(/`/g, '\\\\`').replace(/\\$/g, '\\\\$');\n}\n\nfunction plainText(tokens: any[]): string {\n return tokens.map(token => {\n if (Array.isArray(token.tokens)) return plainText(token.tokens);\n return typeof token.text === 'string' ? token.text : token.raw || '';\n }).join('');\n}\n\nfunction slugify(s: string): string {\n return s.toLowerCase().replace(/[^\\w一-鿿]+/g, '-').replace(/^-+|-+$/g, '');\n}\n\nfunction escAttr(s: string): string {\n return s.replace(/&/g, '&').replace(/\"/g, '"').replace(/</g, '<').replace(/>/g, '>');\n}\n\n/** 将 HTML 字符串编译为 bobe 组件模块源码 */\nfunction gen(\n html: string,\n headers: HeadItem[],\n previewEntries: string[],\n codeTrees: FileItem[][] = [],\n layoutPath?: string,\n routeMeta?: Record<string, any>\n): string {\n const hasCode = codeTrees.length > 0;\n const lines = [`import { bobe, Store, effect } from 'bobe';`];\n\n // layout 组件导入\n if (layoutPath) {\n lines.push(`import __layout from '${layoutPath}';`);\n }\n\n if (hasCode) {\n lines.push(`import Code from 'bobe-dom/plugin-markdown/code';`);\n previewEntries.forEach((src, i) => {\n lines.push(`import $Bobe_Comp_${i} from '${src}';`);\n });\n }\n\n lines.push(`const mdHtml = \\`${esc(html)}\\`;`);\n lines.push(`const headings = ${JSON.stringify(headers)};`);\n\n // 代码树数据\n if (hasCode) {\n for (let i = 0; i < codeTrees.length; i++) {\n lines.push(`const codeTree${i} = ${JSON.stringify(codeTrees[i])};`);\n }\n }\n\n // Markdown Store 组件\n lines.push(`class Markdown extends Store {`);\n lines.push(` headings = headings;`);\n lines.push(` mdRef = null;`);\n lines.push(` asideRef = null;`);\n lines.push(` activeHeadingId = '';`);\n lines.push(` indicatorTop = 0;`);\n lines.push(` indicatorHeight = 25;`);\n lines.push(``);\n lines.push(` constructor() {`);\n lines.push(` super();`);\n lines.push(` effect(() => {`);\n lines.push(` if (typeof window === 'undefined') return;`);\n lines.push(` const syncActiveHeading = () => {`);\n lines.push(` const rawHash = window.location.hash.slice(1);`);\n lines.push(` let hash = rawHash;`);\n lines.push(` try {`);\n lines.push(` hash = decodeURIComponent(rawHash);`);\n lines.push(` } catch {}`);\n lines.push(` this.activeHeadingId = headings.some(item => item.id === hash) ? hash : '';`);\n lines.push(` this.updateIndicator();`);\n lines.push(` };`);\n lines.push(` syncActiveHeading();`);\n lines.push(` window.addEventListener('hashchange', syncActiveHeading);`);\n lines.push(` return () => window.removeEventListener('hashchange', syncActiveHeading);`);\n lines.push(` });`);\n lines.push(` }`);\n lines.push(``);\n lines.push(` getAsideClass(item) {`);\n lines.push(` const active = this.activeHeadingId === item.id ? ' markdown-aside-item-active' : '';`);\n lines.push(` return 'markdown-aside-item markdown-aside-depth-' + item.depth + active;`);\n lines.push(` }`);\n lines.push(``);\n lines.push(` get indicatorStyle() {`);\n lines.push(` return 'transform: translateY(' + this.indicatorTop + 'px); height: ' + this.indicatorHeight + 'px;';`);\n lines.push(` }`);\n lines.push(``);\n lines.push(` updateIndicator() {`);\n lines.push(` if (typeof window === 'undefined') return;`);\n lines.push(` window.requestAnimationFrame(() => {`);\n lines.push(` const active = this.asideRef?.querySelector?.('.markdown-aside-item-active');`);\n lines.push(` if (!active) {`);\n lines.push(` this.indicatorTop = 0;`);\n lines.push(` this.indicatorHeight = 25;`);\n lines.push(` return;`);\n lines.push(` }`);\n lines.push(` const style = window.getComputedStyle(active);`);\n lines.push(` const marginTop = Number.parseFloat(style.marginTop) || 0;`);\n lines.push(` this.indicatorTop = active.offsetTop - marginTop + (active.offsetHeight - this.indicatorHeight) / 2;`);\n lines.push(` this.indicatorHeight = 25;`);\n lines.push(` });`);\n lines.push(` }`);\n lines.push(``);\n lines.push(` ui = bobe\\``);\n lines.push(` div class=\"markdown\"`);\n lines.push(` main ref={mdRef} class=\"markdown-body\" html=\\${mdHtml}`);\n lines.push(` if showAside`);\n lines.push(` aside ref={asideRef} class=\"markdown-aside\"`);\n lines.push(` div class=\"markdown-aside-content\"`);\n lines.push(` div class=\"markdown-aside-border\"`);\n lines.push(` div class={activeHeadingId ? 'markdown-aside-indicator markdown-aside-indicator-active' : 'markdown-aside-indicator'} style={indicatorStyle}`);\n lines.push(` for headings; item ; item.id`);\n lines.push(` a`);\n lines.push(` | href={'#' + item.id}`);\n lines.push(` | children={item.text}`);\n lines.push(` | class={getAsideClass(item)}`);\n // tp + Code 组件\n if (hasCode) {\n for (let i = 0; i < codeTrees.length; i++) {\n const previewProp = previewEntries[i] ? `preview=\\${() => $Bobe_Comp_${i}}` : '';\n lines.push(` tp node={mdRef?.querySelector?.('#code-${i}')}`);\n lines.push(` \\${Code} files=\\${codeTree${i}} ${previewProp}`);\n }\n }\n lines.push(` \\`;`);\n lines.push(`}`);\n lines.push(`export default Markdown;`);\n if (layoutPath) {\n lines.push(`export { __layout as layout };`);\n }\n if (routeMeta) {\n lines.push(`export const routeMeta = ${JSON.stringify(routeMeta)};`);\n }\n return lines.join('\\n');\n}\n\n/**\n * bobe-markdown Vite 插件。\n *\n * 将 .md / .mdx 文件编译为 bobe 组件:\n * import Readme from './README.md';\n *\n * 支持 <code src=\"xxx.ts\" /> 引入代码文件及 import 树(非 node_modules),\n * 以 Code 组件 + tp 传送方式渲染。\n */\n\nexport type HeadItem = {\n depth: number;\n id: string;\n text: string;\n};\n\nconst CODE_TAG_RE = /<code\\s+src=\"([^\"]+)\"(\\s+preview)?\\s*\\/>/g;\n\nexport default function markdownPlugin(opt: MarkdownPluginOptions = {}): Plugin {\n let headers: HeadItem[] = [];\n const headClassMap: Record<number, string> = {\n '1': 'cyber-title'\n }\n return {\n name: 'bobe-markdown',\n enforce: 'pre',\n\n configResolved() {\n registerBobeLang(); // 注册 bobe DSL 语法高亮(支持 markdown 中的 ```bobe 代码块)\n marked.use({\n gfm: true, // GitHub Flavored Markdown\n renderer: {\n heading({ tokens, depth }) {\n const html = this.parser.parseInline(tokens);\n const text = plainText(tokens);\n const id = slugify(text);\n if (depth <= (opt.asideDeep || 3)) {\n headers.push({ depth, id, text });\n }\n return `<h${depth} class=\"${headClassMap[depth] || ''}\" data-text=\"${escAttr(text)}\" id=\"${id}\">${html}</h${depth}>`;\n },\n code({ text, lang }) {\n return `<pre><code class=\"hljs\">${hljs.highlight(text, { language: lang }).value}</code></pre>`;\n }\n }\n });\n if (opt.marked) marked.use(opt.marked);\n },\n\n async transform(code, id) {\n if (!id.match(/\\.mdx?$/)) return;\n headers = [];\n try {\n // 解析 YAML frontmatter\n const { data, content: mdContent } = matter(code);\n\n // 提取 routeMeta\n const routeMeta = data.meta as Record<string, any> | undefined;\n\n // 提取 layout 路径(相对于 .md 文件)\n let layoutPath: string | undefined;\n if (data.layout && typeof data.layout === 'string') {\n layoutPath = data.layout;\n }\n\n const html = marked.parse(mdContent) as string;\n\n // 匹配 <code src=\"xxx.ts\"> → <div id=\"code-N\">\n const codeTags: string[] = [];\n const previewEntries: string[] = [];\n let idx = 0;\n const finalHtml = html.replace(CODE_TAG_RE, (_, src, preview) => {\n codeTags.push(src);\n if (preview) {\n previewEntries[idx] = src;\n }\n return `<div id=\"code-${idx++}\"></div>`;\n });\n\n // 解析每个 code block 的 import 树\n const fileDir = dirname(id);\n const codeTrees = await Promise.all(\n codeTags.map(tag => resolveImportTree(resolve(fileDir, tag), id, this.resolve.bind(this)))\n );\n\n return { code: gen(finalHtml, headers, previewEntries, codeTrees, layoutPath, routeMeta), moduleSideEffects: false };\n } catch (e: any) {\n this.error(`[bobe-markdown] 解析失败: ${id}\\n${e.message}`);\n }\n }\n };\n}\n"],"names":["highlight","code","lang","hljs","language","value","replace","resolveImportTree","importPath","currentPath","vResolve","walked","Set","resolved","absPath","id","includes","startsWith","has","add","content","fs","promises","readFile","error","console","warn","langMap","ts","tsx","mts","js","jsx","mjs","css","html","json","ext","path","extname","slice","item","name","basename","importRegex","match","dependencies","exec","push","length","deps","Promise","all","flat","registerBobeLang","registerLanguage","ATTRS","join","keywords","contains","COMMENT","relevance","className","begin","end","skip","subLanguage","RegExp","NUMBER_MODE","patchJsFamily","fn","getLanguage","rawDefinition","def","some","c","toString","SUBST","starts","returnEnd","BACKSLASH_ESCAPE","esc","s","plainText","tokens","map","token","Array","isArray","text","raw","slugify","toLowerCase","escAttr","gen","headers","previewEntries","codeTrees","layoutPath","routeMeta","hasCode","lines","forEach","src","i","JSON","stringify","previewProp","CODE_TAG_RE","markdownPlugin","opt","headClassMap","enforce","configResolved","marked","use","gfm","renderer","heading","depth","parser","parseInline","asideDeep","transform","_matter","matter","data","mdContent","meta","layout","parse","codeTags","idx","finalHtml","_","preview","fileDir","dirname","tag","resolve","bind","moduleSideEffects","e","message"],"mappings":"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"}
|