bobe-dom 0.0.66 → 0.0.68

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.
@@ -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, '&lt;').replace(/>/g, '&gt;');\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, '&lt;').replace(/>/g, '&gt;');\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, '&amp;').replace(/\"/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\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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"}
@@ -0,0 +1,298 @@
1
+ 'use strict';
2
+
3
+ var bobe = require('bobe');
4
+ var htmlparser2 = require('htmlparser2');
5
+
6
+ (function (SSRNodeType) {
7
+ SSRNodeType[SSRNodeType["Element"] = 0] = "Element";
8
+ SSRNodeType[SSRNodeType["Text"] = 1] = "Text";
9
+ SSRNodeType[SSRNodeType["Anchor"] = 2] = "Anchor";
10
+ SSRNodeType[SSRNodeType["Root"] = 3] = "Root";
11
+ return SSRNodeType;
12
+ })({});
13
+ class SSRFiber {
14
+ parent = undefined;
15
+ next = undefined;
16
+ child = undefined;
17
+ html = undefined;
18
+ openTagEnd = undefined;
19
+ constructor(type, props = {}) {
20
+ this.type = type;
21
+ this.props = props;
22
+ }
23
+ querySelector(selector) {
24
+ const idMatch = selector.match(/#([\w-]+)/);
25
+ const id = idMatch ? idMatch[1] : null;
26
+ const classMatches = selector.match(/\.[\w-]+/g);
27
+ const classes = classMatches ? classMatches.map(c => c.slice(1)) : [];
28
+ const tag = selector.replace(/#[\w-]+/g, '').replace(/\.[\w-]+/g, '').trim() || null;
29
+ const walk = node => {
30
+ if (!node) return null;
31
+ if (node.type !== 'root' && node.type !== 'anchor' && node.type !== 'text') {
32
+ if (!tag || node.type === tag) {
33
+ if (!id || node.props['id'] === id) {
34
+ if (classes.length === 0 || classes.every(c => (node.props['class'] || '').split(/\s+/).includes(c))) {
35
+ return node;
36
+ }
37
+ }
38
+ }
39
+ }
40
+ return walk(node.child) || walk(node.next);
41
+ };
42
+ return walk(this.child);
43
+ }
44
+ getElementById(id) {
45
+ return this.querySelector(`#${id}`);
46
+ }
47
+ }
48
+
49
+ function parseHtmlToFibers(html, root) {
50
+ const stack = [{
51
+ parent: root,
52
+ lastChild: null
53
+ }];
54
+ const append = node => {
55
+ const frame = stack[stack.length - 1];
56
+ if (!frame.parent.child) {
57
+ frame.parent.child = node;
58
+ } else if (frame.lastChild) {
59
+ frame.lastChild.next = node;
60
+ }
61
+ frame.lastChild = node;
62
+ node.parent = frame.parent;
63
+ };
64
+ let parserRef;
65
+ const parser = new htmlparser2.Parser({
66
+ onparserinit(p) {
67
+ parserRef = p;
68
+ },
69
+ onopentag(name, attribs) {
70
+ const fiber = new SSRFiber(name, {
71
+ ...attribs
72
+ });
73
+ fiber.openTagEnd = parserRef.endIndex;
74
+ append(fiber);
75
+ stack.push({
76
+ parent: fiber,
77
+ lastChild: null
78
+ });
79
+ },
80
+ ontext(text) {
81
+ const fiber = new SSRFiber('text', {
82
+ children: text
83
+ });
84
+ append(fiber);
85
+ },
86
+ onclosetag() {
87
+ stack.pop();
88
+ const top = stack[stack.length - 1];
89
+ top.lastChild ?? null;
90
+ }
91
+ });
92
+ parser.write(html);
93
+ parser.end();
94
+ }
95
+
96
+ const VOID_TAGS = new Set(['area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source', 'track', 'wbr']);
97
+ const BOOLEAN_ATTRS = new Set(['disabled', 'readonly', 'checked', 'selected', 'hidden', 'multiple', 'required', 'autofocus', 'autoplay', 'controls', 'loop', 'muted', 'defer', 'async', 'reversed', 'open', 'itemscope', 'ismap', 'nohref', 'noshade', 'nowrap', 'compact', 'default']);
98
+ const ATTR_RE = /[&"<>]/g;
99
+ const TEXT_RE = /[&<>]/g;
100
+ const ATTR_MAP = {
101
+ '&': '&amp;',
102
+ '"': '&quot;',
103
+ '<': '&lt;',
104
+ '>': '&gt;'
105
+ };
106
+ const TEXT_MAP = {
107
+ '&': '&amp;',
108
+ '<': '&lt;',
109
+ '>': '&gt;'
110
+ };
111
+ const escapeAttr = str => {
112
+ const s = String(str);
113
+ return ATTR_RE.test(s) ? s.replace(ATTR_RE, m => ATTR_MAP[m]) : s;
114
+ };
115
+ const escapeText = str => {
116
+ const s = String(str);
117
+ return TEXT_RE.test(s) ? s.replace(TEXT_RE, m => TEXT_MAP[m]) : s;
118
+ };
119
+ const createNode = name => {
120
+ return new SSRFiber(name);
121
+ };
122
+ const setProp = (node, key, value) => {
123
+ node.props[key] = value;
124
+ if (key === 'html') {
125
+ parseHtmlToFibers(value, node);
126
+ }
127
+ };
128
+ const beforeIndent = node => {
129
+ if (node.props.html != null) {
130
+ return false;
131
+ }
132
+ };
133
+ const insertAfter = (parent, node, prev) => {
134
+ let next;
135
+ if (prev) {
136
+ next = prev.next;
137
+ prev.next = node;
138
+ } else {
139
+ next = parent.child;
140
+ parent.child = node;
141
+ }
142
+ node.next = next;
143
+ node.parent = parent;
144
+ };
145
+ const createAnchor = (name, isBefore) => {
146
+ return new SSRFiber('anchor', {
147
+ name,
148
+ isBefore
149
+ });
150
+ };
151
+ const remove = (node, prev) => {
152
+ const parent = node.parent,
153
+ next = node.next;
154
+ node.next = null;
155
+ if (prev) {
156
+ prev.next = next;
157
+ } else {
158
+ parent.child = next;
159
+ }
160
+ node.parent = null;
161
+ };
162
+ const firstChild = node => node.child;
163
+ const nextSib = node => node.next;
164
+ function walkFiber(root) {
165
+ let point = root;
166
+ let shouldSink = true;
167
+ sink: do {
168
+ if (point.type === 'root') {
169
+ point.html = '';
170
+ } else if (point.type === 'anchor') {
171
+ point.html = `<!--${point.props.name}-->`;
172
+ } else if (point.type === 'text') {
173
+ const text = point.props.children;
174
+ if (text != null) {
175
+ point.html = escapeText(point.props.children);
176
+ }
177
+ } else {
178
+ point.html = `<${point.type}`;
179
+ const props = point.props;
180
+ let text;
181
+ let classStr = '';
182
+ const dotClasses = [];
183
+ let idValue = null;
184
+ for (const key in props) {
185
+ const value = props[key];
186
+ if (key.startsWith('on') || key === 'ref') continue;
187
+ if (key === 'html') {
188
+ continue;
189
+ }
190
+ if (key === 'children') {
191
+ text = value;
192
+ continue;
193
+ }
194
+ if (key.startsWith('.')) {
195
+ if (value) dotClasses.push(key.slice(1));
196
+ continue;
197
+ }
198
+ if (key.startsWith('#')) {
199
+ if (value) idValue = key.slice(1);
200
+ continue;
201
+ }
202
+ if (key === 'class') {
203
+ if (value == null) continue;
204
+ if (typeof value === 'object' && !Array.isArray(value)) {
205
+ classStr = Object.entries(value).filter(([, v]) => !!v).map(([k]) => k).join(' ');
206
+ } else {
207
+ classStr = typeof value === 'boolean' ? value ? 'true' : '' : String(value);
208
+ }
209
+ continue;
210
+ }
211
+ if (key === 'style') {
212
+ if (value == null) continue;
213
+ point.html += ` style="${escapeAttr(String(value))}"`;
214
+ continue;
215
+ }
216
+ if (BOOLEAN_ATTRS.has(key)) {
217
+ if (value !== false && value !== null && value !== undefined) {
218
+ point.html += ` ${key}`;
219
+ }
220
+ continue;
221
+ }
222
+ if (key.startsWith('data-') || key.startsWith('aria-')) {
223
+ if (value == null) continue;
224
+ point.html += ` ${key}="${escapeAttr(value)}"`;
225
+ continue;
226
+ }
227
+ if (value == null) continue;
228
+ point.html += ` ${key}="${escapeAttr(value)}"`;
229
+ }
230
+ if (dotClasses.length) {
231
+ classStr = (classStr ? classStr + ' ' : '') + dotClasses.join(' ');
232
+ }
233
+ if (classStr) {
234
+ point.html += ` class="${escapeAttr(classStr)}"`;
235
+ }
236
+ if (idValue) {
237
+ point.html += ` id="${escapeAttr(idValue)}"`;
238
+ }
239
+ if (text != null && props.html == null) {
240
+ const content = escapeText(text);
241
+ point.html += `>${content}</${point.type}>`;
242
+ if (point.child) console.warn(`<${point.type}> has text content and child elements — children ignored`);
243
+ shouldSink = false;
244
+ } else {
245
+ if (VOID_TAGS.has(point.type)) {
246
+ point.html += `/>`;
247
+ if (point.child) console.warn(`<${point.type}> can't have children`);
248
+ shouldSink = false;
249
+ } else {
250
+ point.html += `>`;
251
+ }
252
+ }
253
+ }
254
+ if (point.child && shouldSink) {
255
+ point = point.child;
256
+ continue;
257
+ }
258
+ do {
259
+ const notRoot = point !== root;
260
+ const notAnchor = point.type !== 'anchor';
261
+ const notText = point.type !== 'text';
262
+ if (shouldSink && notRoot && notAnchor && notText) {
263
+ point.html += `</${point.type}>`;
264
+ }
265
+ if (notRoot) {
266
+ point.parent.html += point.html;
267
+ }
268
+ shouldSink = true;
269
+ if (!notRoot) break sink;
270
+ if (point.next) {
271
+ point = point.next;
272
+ break;
273
+ }
274
+ point = point.parent;
275
+ } while (true);
276
+ } while (true);
277
+ }
278
+ const renderHtmlStr = ComponentClass => {
279
+ const root = new SSRFiber('root');
280
+ const render = bobe.customRender({
281
+ createNode,
282
+ setProp,
283
+ insertAfter,
284
+ createAnchor,
285
+ remove,
286
+ firstChild,
287
+ nextSib,
288
+ beforeIndent,
289
+ noopEffect: true
290
+ });
291
+ render(ComponentClass, root);
292
+ walkFiber(root);
293
+ return root.html;
294
+ };
295
+
296
+ exports.renderHtmlStr = renderHtmlStr;
297
+ exports.walkFiber = walkFiber;
298
+ //# sourceMappingURL=ssr-index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssr-index.cjs","sources":["../src/type.ts","../src/parse-html.ts","../src/render-html-str2.ts"],"sourcesContent":["export class SSRNode {\n type: SSRNodeType;\n // 链表\n parent?: SSRNode | null = null;\n firstChild: SSRNode | null = null;\n lastChild: SSRNode | null = null; // O(1) 尾插\n nextSibling: SSRNode | null = null;\n prevSibling: SSRNode | null = null;\n closed: boolean = false;\n startClosed: boolean = false;\n // innerHTML 缓存\n _innerHtml: string | null = null;\n}\n\nexport enum SSRNodeType {\n Element,\n Text,\n Anchor,\n Root\n}\n\nexport class Element extends SSRNode {\n type = SSRNodeType.Element;\n textContent: string | null = null;\n\n attrs: Record<string, string> = {};\n constructor(\n /** 标签名 */\n public value: string,\n public parent?: SSRNode | null\n ) {\n super();\n }\n}\n\nexport class Text extends SSRNode {\n type = SSRNodeType.Text;\n constructor(\n /** 文本内容 */\n public textContent: string,\n public parent?: SSRNode | null\n ) {\n super();\n }\n}\n\nexport class Anchor extends SSRNode {\n type = SSRNodeType.Anchor;\n constructor(\n /** 注释内容 */\n public value: string,\n public parent?: SSRNode | null\n ) {\n super();\n }\n}\nexport class Root extends SSRNode {\n type = SSRNodeType.Root;\n constructor(\n /** 输出 HTML */\n public value: string,\n public parent?: SSRNode | null\n ) {\n super();\n }\n}\n\nexport type SSRCtx = {\n /** 根节点 */\n root: Root;\n /** 当前节点 */\n current: SSRNode;\n};\n\n\nexport class SSRFiber {\n parent?: SSRFiber = undefined;\n next?: SSRFiber = undefined;\n child?: SSRFiber = undefined;\n html?: string = undefined;\n /** 开标签 > 在原始 HTML 字符串中的索引位置 */\n openTagEnd?: number = undefined;\n constructor(public type: any, public props: Record<any, any> = {}) {}\n\n querySelector(selector: string): SSRFiber | null {\n // 解析 selector:tag#id.class1.class2\n const idMatch = selector.match(/#([\\w-]+)/);\n const id = idMatch ? idMatch[1] : null;\n const classMatches = selector.match(/\\.[\\w-]+/g);\n const classes = classMatches ? classMatches.map(c => c.slice(1)) : [];\n const tag = selector.replace(/#[\\w-]+/g, '').replace(/\\.[\\w-]+/g, '').trim() || null;\n\n // 深度优先遍历 child → next 链表\n const walk = (node: SSRFiber | undefined): SSRFiber | null => {\n if (!node) return null;\n // 跳过非元素节点\n if (node.type !== 'root' && node.type !== 'anchor' && node.type !== 'text') {\n if (!tag || node.type === tag) {\n if (!id || node.props['id'] === id) {\n if (\n classes.length === 0 ||\n classes.every(c => (node.props['class'] || '').split(/\\s+/).includes(c))\n ) {\n return node;\n }\n }\n }\n }\n return walk(node.child) || walk(node.next);\n };\n\n return walk(this.child);\n }\n\n getElementById(id: string): SSRFiber | null {\n return this.querySelector(`#${id}`);\n }\n}\n\n","import { Parser } from 'htmlparser2';\nimport { SSRFiber } from './type';\n\n/**\n * 使用 htmlparser2 将 HTML 字符串解析为 SSRFiber,插入到 root 下。\n * 解析产生的节点通过 child/next/parent 组成树结构,挂载到 root.child 链表。\n */\nexport function parseHtmlToFibers(html: string, root: SSRFiber): void {\n // 栈:跟踪当前父节点及其最后一个子节点。root 始终在栈底\n const stack: { parent: SSRFiber; lastChild: SSRFiber | null }[] = [\n { parent: root, lastChild: null },\n ];\n // 当前层级的上一个兄弟节点\n let prevSibling: SSRFiber | null = null;\n\n const append = (node: SSRFiber) => {\n const frame = stack[stack.length - 1];\n if (!frame.parent.child) {\n frame.parent.child = node;\n } else if (frame.lastChild) {\n frame.lastChild.next = node;\n }\n frame.lastChild = node;\n node.parent = frame.parent;\n prevSibling = node;\n };\n\n // 通过 onparserinit 拿到 parser 实例,后续从 parser.endIndex 读取 > 的位置\n let parserRef: Parser;\n\n const parser = new Parser({\n onparserinit(p: Parser) {\n parserRef = p;\n },\n\n onopentag(name: string, attribs: Record<string, string>) {\n const fiber = new SSRFiber(name, { ...attribs });\n // onopentagend 在 onopentag 之前触发,已将 endIndex 写入 parser\n fiber.openTagEnd = parserRef.endIndex;\n append(fiber);\n stack.push({ parent: fiber, lastChild: null });\n prevSibling = null;\n },\n\n ontext(text: string) {\n const fiber = new SSRFiber('text', { children: text });\n append(fiber);\n },\n\n onclosetag() {\n stack.pop();\n const top = stack[stack.length - 1];\n prevSibling = top.lastChild ?? null;\n },\n });\n\n parser.write(html);\n parser.end();\n}\n","import { customRender, Store } from 'bobe';\nimport { SSRFiber } from './type';\nimport { parseHtmlToFibers } from './parse-html';\n\nconst VOID_TAGS = new Set([\n 'area',\n 'base',\n 'br',\n 'col',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr'\n]);\n\nconst BOOLEAN_ATTRS = new Set([\n 'disabled',\n 'readonly',\n 'checked',\n 'selected',\n 'hidden',\n 'multiple',\n 'required',\n 'autofocus',\n 'autoplay',\n 'controls',\n 'loop',\n 'muted',\n 'defer',\n 'async',\n 'reversed',\n 'open',\n 'itemscope',\n 'ismap',\n 'nohref',\n 'noshade',\n 'nowrap',\n 'compact',\n 'default'\n]);\n\nconst ATTR_RE = /[&\"<>]/g;\nconst TEXT_RE = /[&<>]/g;\nconst ATTR_MAP: Record<string, string> = {\n '&': '&amp;',\n '\"': '&quot;',\n '<': '&lt;',\n '>': '&gt;'\n};\nconst TEXT_MAP: Record<string, string> = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;'\n};\n\nconst escapeAttr = (str: string) => {\n const s = String(str);\n return ATTR_RE.test(s) ? s.replace(ATTR_RE, m => ATTR_MAP[m]) : s;\n};\n\nconst escapeText = (str: string) => {\n const s = String(str);\n return TEXT_RE.test(s) ? s.replace(TEXT_RE, m => TEXT_MAP[m]) : s;\n};\n\nconst createNode = (name: string) => {\n return new SSRFiber(name);\n};\n\nconst setProp = (node: SSRFiber, key: string, value: any) => {\n node.props[key] = value;\n if (key === 'html') {\n parseHtmlToFibers(value, node);\n }\n};\n\nconst beforeIndent = (node: SSRFiber) => {\n // 仅 html 需要跳过缩进子节点(子内容来自 parseHtmlToFibers)\n if (node.props.html != null) {\n return false;\n }\n};\n\nconst insertAfter = (parent: SSRFiber, node: SSRFiber, prev: SSRFiber | null) => {\n let next: SSRFiber;\n if (prev) {\n next = prev.next;\n prev.next = node;\n } else {\n next = parent.child;\n parent.child = node;\n }\n node.next = next;\n node.parent = parent;\n};\n\nconst createAnchor = (name: string, isBefore?: boolean) => {\n return new SSRFiber('anchor', {\n name,\n isBefore\n });\n};\n\nconst remove = (node: SSRFiber, prev?: SSRFiber) => {\n const { parent, next } = node;\n node.next = null;\n if (prev) {\n prev.next = next;\n } else {\n parent.child = next;\n }\n node.parent = null;\n};\n\nconst firstChild = (node: SSRFiber) => node.child;\n\nconst nextSib = (node: SSRFiber) => node.next;\n\nexport function walkFiber(root: SSRFiber) {\n let point = root;\n let shouldSink = true;\n // 下沉\n sink: do {\n // begin 组装 HTML 起始部位\n if (point.type === 'root') {\n point.html = '';\n } else if (point.type === 'anchor') {\n point.html = `<!--${point.props.name}-->`;\n } else if (point.type === 'text') {\n const text = point.props.children;\n if (text != null) {\n point.html = escapeText(point.props.children);\n }\n }\n // dom 节点\n else {\n point.html = `<${point.type}`;\n const props = point.props;\n let text;\n let classStr = '';\n const dotClasses: string[] = [];\n let idValue: string | null = null;\n\n for (const key in props) {\n const value = props[key];\n if (key.startsWith('on') || key === 'ref') continue;\n // html 被解析成了子节点,则不处理\n if (key === 'html') {\n continue;\n }\n if (key === 'children') {\n text = value;\n continue;\n }\n // .xxx — class toggle,收集后与 class 合并\n if (key.startsWith('.')) {\n if (value) dotClasses.push(key.slice(1));\n continue;\n }\n // #xxx — id toggle\n if (key.startsWith('#')) {\n if (value) idValue = key.slice(1);\n continue;\n }\n if (key === 'class') {\n if (value == null) continue;\n if (typeof value === 'object' && !Array.isArray(value)) {\n classStr = Object.entries(value as Record<string, any>)\n .filter(([, v]) => !!v)\n .map(([k]) => k)\n .join(' ');\n } else {\n classStr = typeof value === 'boolean' ? (value ? 'true' : '') : String(value);\n }\n continue;\n }\n if (key === 'style') {\n if (value == null) continue;\n point.html += ` style=\"${escapeAttr(String(value))}\"`;\n continue;\n }\n // 4. 布尔属性\n if (BOOLEAN_ATTRS.has(key)) {\n if (value !== false && value !== null && value !== undefined) {\n point.html += ` ${key}`;\n }\n continue;\n }\n // 5. data-* / aria-* — 对齐 Browser:null 时不输出\n if (key.startsWith('data-') || key.startsWith('aria-')) {\n if (value == null) continue;\n point.html += ` ${key}=\"${escapeAttr(value)}\"`;\n continue;\n }\n // 6. 其余属性 — 对齐 Browser:null 时不输出\n if (value == null) continue;\n point.html += ` ${key}=\"${escapeAttr(value)}\"`;\n }\n // 合并 .xxx 类名到 class\n if (dotClasses.length) {\n classStr = (classStr ? classStr + ' ' : '') + dotClasses.join(' ');\n }\n if (classStr) {\n point.html += ` class=\"${escapeAttr(classStr)}\"`;\n }\n // 输出 #xxx 设置的 id\n if (idValue) {\n point.html += ` id=\"${escapeAttr(idValue)}\"`;\n }\n // 纯 text(无 html children)→ 内联文本,闭合标签,不下沉\n if (text != null && props.html == null) {\n const content = escapeText(text);\n point.html += `>${content}</${point.type}>`;\n if (point.child) console.warn(`<${point.type}> has text content and child elements — children ignored`);\n shouldSink = false;\n } else {\n if (VOID_TAGS.has(point.type)) {\n point.html += `/>`;\n if (point.child) console.warn(`<${point.type}> can't have children`);\n shouldSink = false;\n } else {\n point.html += `>`;\n }\n }\n }\n\n if (point.child && shouldSink) {\n point = point.child;\n continue;\n }\n // 上浮\n do {\n const notRoot = point !== root;\n const notAnchor = point.type !== 'anchor';\n const notText = point.type !== 'text';\n /**\n * shouldSink == false 时会直接进入节点的 complete 且不会遍历子节点\n * 此时标签已闭合,complete 不需要重复处理\n */\n if (shouldSink && notRoot && notAnchor && notText) {\n point.html += `</${point.type}>`;\n }\n // 把子节点的字符串加入父节点\n if (notRoot) {\n point.parent.html += point.html;\n }\n // complete\n // 上浮到根,end\n shouldSink = true;\n if (!notRoot) break sink;\n // 有兄弟节点,停止上浮\n if (point.next) {\n point = point.next;\n break;\n }\n // 无兄弟节点,继续上浮\n point = point.parent;\n } while (true);\n } while (true);\n}\n\nexport const renderHtmlStr = (ComponentClass: typeof Store) => {\n const root = new SSRFiber('root');\n const render = customRender({\n createNode,\n setProp,\n insertAfter,\n createAnchor,\n remove,\n firstChild,\n nextSib,\n beforeIndent,\n noopEffect: true\n });\n render(ComponentClass, root);\n walkFiber(root);\n return root.html;\n};\n"],"names":["SSRNodeType","SSRFiber","parent","undefined","next","child","html","openTagEnd","constructor","type","props","querySelector","selector","idMatch","match","id","classMatches","classes","map","c","slice","tag","replace","trim","walk","node","length","every","split","includes","getElementById","parseHtmlToFibers","root","stack","lastChild","append","frame","parserRef","parser","Parser","onparserinit","p","onopentag","name","attribs","fiber","endIndex","push","ontext","text","children","onclosetag","pop","top","prevSibling","write","end","VOID_TAGS","Set","BOOLEAN_ATTRS","ATTR_RE","TEXT_RE","ATTR_MAP","TEXT_MAP","escapeAttr","str","s","String","test","m","escapeText","createNode","setProp","key","value","beforeIndent","insertAfter","prev","createAnchor","isBefore","remove","firstChild","nextSib","walkFiber","point","shouldSink","sink","classStr","dotClasses","idValue","startsWith","Array","isArray","Object","entries","filter","v","k","join","has","content","console","warn","notRoot","notAnchor","notText","renderHtmlStr","ComponentClass","render","customRender","noopEffect"],"mappings":";;;;;WAcYA,WAAW,EAAA;AAAXA,EAAAA,WAAW,CAAXA,WAAW,CAAA,SAAA,CAAA,GAAA,CAAA,CAAA,GAAA,SAAA;AAAXA,EAAAA,WAAW,CAAXA,WAAW,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAA;AAAXA,EAAAA,WAAW,CAAXA,WAAW,CAAA,QAAA,CAAA,GAAA,CAAA,CAAA,GAAA,QAAA;AAAXA,EAAAA,WAAW,CAAXA,WAAW,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA,GAAA,MAAA;AAAA,EAAA,OAAXA,WAAW;AAAA,EAAA,CAAA,EAAA;AA6DhB,MAAMC,QAAQ,CAAC;AACpBC,EAAAA,MAAM,GAAcC,SAAS;AAC7BC,EAAAA,IAAI,GAAcD,SAAS;AAC3BE,EAAAA,KAAK,GAAcF,SAAS;AAC5BG,EAAAA,IAAI,GAAYH,SAAS;AAEzBI,EAAAA,UAAU,GAAYJ,SAAS;AAC/BK,EAAAA,WAAWA,CAAQC,IAAS,EAASC,KAAuB,GAAG,EAAE,EAAE;IAAA,IAAA,CAAhDD,IAAS,GAATA,IAAS;IAAA,IAAA,CAASC,KAAuB,GAAvBA,KAAuB;AAAQ,EAAA;EAEpEC,aAAaA,CAACC,QAAgB,EAAmB;AAE/C,IAAA,MAAMC,OAAO,GAAGD,QAAQ,CAACE,KAAK,CAAC,WAAW,CAAC;IAC3C,MAAMC,EAAE,GAAGF,OAAO,GAAGA,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI;AACtC,IAAA,MAAMG,YAAY,GAAGJ,QAAQ,CAACE,KAAK,CAAC,WAAW,CAAC;AAChD,IAAA,MAAMG,OAAO,GAAGD,YAAY,GAAGA,YAAY,CAACE,GAAG,CAACC,CAAC,IAAIA,CAAC,CAACC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE;IACrE,MAAMC,GAAG,GAAGT,QAAQ,CAACU,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAACA,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAACC,IAAI,EAAE,IAAI,IAAI;IAGpF,MAAMC,IAAI,GAAIC,IAA0B,IAAsB;AAC5D,MAAA,IAAI,CAACA,IAAI,EAAE,OAAO,IAAI;AAEtB,MAAA,IAAIA,IAAI,CAAChB,IAAI,KAAK,MAAM,IAAIgB,IAAI,CAAChB,IAAI,KAAK,QAAQ,IAAIgB,IAAI,CAAChB,IAAI,KAAK,MAAM,EAAE;QAC1E,IAAI,CAACY,GAAG,IAAII,IAAI,CAAChB,IAAI,KAAKY,GAAG,EAAE;UAC7B,IAAI,CAACN,EAAE,IAAIU,IAAI,CAACf,KAAK,CAAC,IAAI,CAAC,KAAKK,EAAE,EAAE;AAClC,YAAA,IACEE,OAAO,CAACS,MAAM,KAAK,CAAC,IACpBT,OAAO,CAACU,KAAK,CAACR,CAAC,IAAI,CAACM,IAAI,CAACf,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAEkB,KAAK,CAAC,KAAK,CAAC,CAACC,QAAQ,CAACV,CAAC,CAAC,CAAC,EACxE;AACA,cAAA,OAAOM,IAAI;AACb,YAAA;AACF,UAAA;AACF,QAAA;AACF,MAAA;AACA,MAAA,OAAOD,IAAI,CAACC,IAAI,CAACpB,KAAK,CAAC,IAAImB,IAAI,CAACC,IAAI,CAACrB,IAAI,CAAC;IAC5C,CAAC;AAED,IAAA,OAAOoB,IAAI,CAAC,IAAI,CAACnB,KAAK,CAAC;AACzB,EAAA;EAEAyB,cAAcA,CAACf,EAAU,EAAmB;AAC1C,IAAA,OAAO,IAAI,CAACJ,aAAa,CAAC,CAAA,CAAA,EAAII,EAAE,EAAE,CAAC;AACrC,EAAA;AACF;;AC9GO,SAASgB,iBAAiBA,CAACzB,IAAY,EAAE0B,IAAc,EAAQ;EAEpE,MAAMC,KAAyD,GAAG,CAChE;AAAE/B,IAAAA,MAAM,EAAE8B,IAAI;AAAEE,IAAAA,SAAS,EAAE;AAAK,GAAC,CAClC;EAID,MAAMC,MAAM,GAAIV,IAAc,IAAK;IACjC,MAAMW,KAAK,GAAGH,KAAK,CAACA,KAAK,CAACP,MAAM,GAAG,CAAC,CAAC;AACrC,IAAA,IAAI,CAACU,KAAK,CAAClC,MAAM,CAACG,KAAK,EAAE;AACvB+B,MAAAA,KAAK,CAAClC,MAAM,CAACG,KAAK,GAAGoB,IAAI;AAC3B,IAAA,CAAC,MAAM,IAAIW,KAAK,CAACF,SAAS,EAAE;AAC1BE,MAAAA,KAAK,CAACF,SAAS,CAAC9B,IAAI,GAAGqB,IAAI;AAC7B,IAAA;IACAW,KAAK,CAACF,SAAS,GAAGT,IAAI;AACtBA,IAAAA,IAAI,CAACvB,MAAM,GAAGkC,KAAK,CAAClC,MAAM;EAE5B,CAAC;AAGD,EAAA,IAAImC,SAAiB;AAErB,EAAA,MAAMC,MAAM,GAAG,IAAIC,kBAAM,CAAC;IACxBC,YAAYA,CAACC,CAAS,EAAE;AACtBJ,MAAAA,SAAS,GAAGI,CAAC;IACf,CAAC;AAEDC,IAAAA,SAASA,CAACC,IAAY,EAAEC,OAA+B,EAAE;AACvD,MAAA,MAAMC,KAAK,GAAG,IAAI5C,QAAQ,CAAC0C,IAAI,EAAE;QAAE,GAAGC;AAAQ,OAAC,CAAC;AAEhDC,MAAAA,KAAK,CAACtC,UAAU,GAAG8B,SAAS,CAACS,QAAQ;MACrCX,MAAM,CAACU,KAAK,CAAC;MACbZ,KAAK,CAACc,IAAI,CAAC;AAAE7C,QAAAA,MAAM,EAAE2C,KAAK;AAAEX,QAAAA,SAAS,EAAE;AAAK,OAAC,CAAC;IAEhD,CAAC;IAEDc,MAAMA,CAACC,IAAY,EAAE;AACnB,MAAA,MAAMJ,KAAK,GAAG,IAAI5C,QAAQ,CAAC,MAAM,EAAE;AAAEiD,QAAAA,QAAQ,EAAED;AAAK,OAAC,CAAC;MACtDd,MAAM,CAACU,KAAK,CAAC;IACf,CAAC;AAEDM,IAAAA,UAAUA,GAAG;MACXlB,KAAK,CAACmB,GAAG,EAAE;MACX,MAAMC,GAAG,GAAGpB,KAAK,CAACA,KAAK,CAACP,MAAM,GAAG,CAAC,CAAC;AACnC4B,MAAcD,GAAG,CAACnB,SAAS,IAAI,IAAI;AACrC,IAAA;AACF,GAAC,CAAC;AAEFI,EAAAA,MAAM,CAACiB,KAAK,CAACjD,IAAI,CAAC;EAClBgC,MAAM,CAACkB,GAAG,EAAE;AACd;;ACtDA,MAAMC,SAAS,GAAG,IAAIC,GAAG,CAAC,CACxB,MAAM,EACN,MAAM,EACN,IAAI,EACJ,KAAK,EACL,OAAO,EACP,IAAI,EACJ,KAAK,EACL,OAAO,EACP,MAAM,EACN,MAAM,EACN,OAAO,EACP,QAAQ,EACR,OAAO,EACP,KAAK,CACN,CAAC;AAEF,MAAMC,aAAa,GAAG,IAAID,GAAG,CAAC,CAC5B,UAAU,EACV,UAAU,EACV,SAAS,EACT,UAAU,EACV,QAAQ,EACR,UAAU,EACV,UAAU,EACV,WAAW,EACX,UAAU,EACV,UAAU,EACV,MAAM,EACN,OAAO,EACP,OAAO,EACP,OAAO,EACP,UAAU,EACV,MAAM,EACN,WAAW,EACX,OAAO,EACP,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,SAAS,EACT,SAAS,CACV,CAAC;AAEF,MAAME,OAAO,GAAG,SAAS;AACzB,MAAMC,OAAO,GAAG,QAAQ;AACxB,MAAMC,QAAgC,GAAG;AACvC,EAAA,GAAG,EAAE,OAAO;AACZ,EAAA,GAAG,EAAE,QAAQ;AACb,EAAA,GAAG,EAAE,MAAM;AACX,EAAA,GAAG,EAAE;AACP,CAAC;AACD,MAAMC,QAAgC,GAAG;AACvC,EAAA,GAAG,EAAE,OAAO;AACZ,EAAA,GAAG,EAAE,MAAM;AACX,EAAA,GAAG,EAAE;AACP,CAAC;AAED,MAAMC,UAAU,GAAIC,GAAW,IAAK;AAClC,EAAA,MAAMC,CAAC,GAAGC,MAAM,CAACF,GAAG,CAAC;EACrB,OAAOL,OAAO,CAACQ,IAAI,CAACF,CAAC,CAAC,GAAGA,CAAC,CAAC5C,OAAO,CAACsC,OAAO,EAAES,CAAC,IAAIP,QAAQ,CAACO,CAAC,CAAC,CAAC,GAAGH,CAAC;AACnE,CAAC;AAED,MAAMI,UAAU,GAAIL,GAAW,IAAK;AAClC,EAAA,MAAMC,CAAC,GAAGC,MAAM,CAACF,GAAG,CAAC;EACrB,OAAOJ,OAAO,CAACO,IAAI,CAACF,CAAC,CAAC,GAAGA,CAAC,CAAC5C,OAAO,CAACuC,OAAO,EAAEQ,CAAC,IAAIN,QAAQ,CAACM,CAAC,CAAC,CAAC,GAAGH,CAAC;AACnE,CAAC;AAED,MAAMK,UAAU,GAAI5B,IAAY,IAAK;AACnC,EAAA,OAAO,IAAI1C,QAAQ,CAAC0C,IAAI,CAAC;AAC3B,CAAC;AAED,MAAM6B,OAAO,GAAGA,CAAC/C,IAAc,EAAEgD,GAAW,EAAEC,KAAU,KAAK;AAC3DjD,EAAAA,IAAI,CAACf,KAAK,CAAC+D,GAAG,CAAC,GAAGC,KAAK;EACvB,IAAID,GAAG,KAAK,MAAM,EAAE;AAClB1C,IAAAA,iBAAiB,CAAC2C,KAAK,EAAEjD,IAAI,CAAC;AAChC,EAAA;AACF,CAAC;AAED,MAAMkD,YAAY,GAAIlD,IAAc,IAAK;AAEvC,EAAA,IAAIA,IAAI,CAACf,KAAK,CAACJ,IAAI,IAAI,IAAI,EAAE;AAC3B,IAAA,OAAO,KAAK;AACd,EAAA;AACF,CAAC;AAED,MAAMsE,WAAW,GAAGA,CAAC1E,MAAgB,EAAEuB,IAAc,EAAEoD,IAAqB,KAAK;AAC/E,EAAA,IAAIzE,IAAc;AAClB,EAAA,IAAIyE,IAAI,EAAE;IACRzE,IAAI,GAAGyE,IAAI,CAACzE,IAAI;IAChByE,IAAI,CAACzE,IAAI,GAAGqB,IAAI;AAClB,EAAA,CAAC,MAAM;IACLrB,IAAI,GAAGF,MAAM,CAACG,KAAK;IACnBH,MAAM,CAACG,KAAK,GAAGoB,IAAI;AACrB,EAAA;EACAA,IAAI,CAACrB,IAAI,GAAGA,IAAI;EAChBqB,IAAI,CAACvB,MAAM,GAAGA,MAAM;AACtB,CAAC;AAED,MAAM4E,YAAY,GAAGA,CAACnC,IAAY,EAAEoC,QAAkB,KAAK;AACzD,EAAA,OAAO,IAAI9E,QAAQ,CAAC,QAAQ,EAAE;IAC5B0C,IAAI;AACJoC,IAAAA;AACF,GAAC,CAAC;AACJ,CAAC;AAED,MAAMC,MAAM,GAAGA,CAACvD,IAAc,EAAEoD,IAAe,KAAK;AAClD,EAAA,MAAQ3E,MAAM,GAAWuB,IAAI,CAArBvB,MAAM;IAAEE,IAAI,GAAKqB,IAAI,CAAbrB,IAAI;EACpBqB,IAAI,CAACrB,IAAI,GAAG,IAAI;AAChB,EAAA,IAAIyE,IAAI,EAAE;IACRA,IAAI,CAACzE,IAAI,GAAGA,IAAI;AAClB,EAAA,CAAC,MAAM;IACLF,MAAM,CAACG,KAAK,GAAGD,IAAI;AACrB,EAAA;EACAqB,IAAI,CAACvB,MAAM,GAAG,IAAI;AACpB,CAAC;AAED,MAAM+E,UAAU,GAAIxD,IAAc,IAAKA,IAAI,CAACpB,KAAK;AAEjD,MAAM6E,OAAO,GAAIzD,IAAc,IAAKA,IAAI,CAACrB,IAAI;AAEtC,SAAS+E,SAASA,CAACnD,IAAc,EAAE;EACxC,IAAIoD,KAAK,GAAGpD,IAAI;EAChB,IAAIqD,UAAU,GAAG,IAAI;AAErBC,EAAAA,IAAI,EAAE,GAAG;AAEP,IAAA,IAAIF,KAAK,CAAC3E,IAAI,KAAK,MAAM,EAAE;MACzB2E,KAAK,CAAC9E,IAAI,GAAG,EAAE;AACjB,IAAA,CAAC,MAAM,IAAI8E,KAAK,CAAC3E,IAAI,KAAK,QAAQ,EAAE;MAClC2E,KAAK,CAAC9E,IAAI,GAAG,CAAA,IAAA,EAAO8E,KAAK,CAAC1E,KAAK,CAACiC,IAAI,CAAA,GAAA,CAAK;AAC3C,IAAA,CAAC,MAAM,IAAIyC,KAAK,CAAC3E,IAAI,KAAK,MAAM,EAAE;AAChC,MAAA,MAAMwC,IAAI,GAAGmC,KAAK,CAAC1E,KAAK,CAACwC,QAAQ;MACjC,IAAID,IAAI,IAAI,IAAI,EAAE;QAChBmC,KAAK,CAAC9E,IAAI,GAAGgE,UAAU,CAACc,KAAK,CAAC1E,KAAK,CAACwC,QAAQ,CAAC;AAC/C,MAAA;AACF,IAAA,CAAC,MAEI;AACHkC,MAAAA,KAAK,CAAC9E,IAAI,GAAG,IAAI8E,KAAK,CAAC3E,IAAI,CAAA,CAAE;AAC7B,MAAA,MAAMC,KAAK,GAAG0E,KAAK,CAAC1E,KAAK;AACzB,MAAA,IAAIuC,IAAI;MACR,IAAIsC,QAAQ,GAAG,EAAE;MACjB,MAAMC,UAAoB,GAAG,EAAE;MAC/B,IAAIC,OAAsB,GAAG,IAAI;AAEjC,MAAA,KAAK,MAAMhB,GAAG,IAAI/D,KAAK,EAAE;AACvB,QAAA,MAAMgE,KAAK,GAAGhE,KAAK,CAAC+D,GAAG,CAAC;QACxB,IAAIA,GAAG,CAACiB,UAAU,CAAC,IAAI,CAAC,IAAIjB,GAAG,KAAK,KAAK,EAAE;QAE3C,IAAIA,GAAG,KAAK,MAAM,EAAE;AAClB,UAAA;AACF,QAAA;QACA,IAAIA,GAAG,KAAK,UAAU,EAAE;AACtBxB,UAAAA,IAAI,GAAGyB,KAAK;AACZ,UAAA;AACF,QAAA;AAEA,QAAA,IAAID,GAAG,CAACiB,UAAU,CAAC,GAAG,CAAC,EAAE;AACvB,UAAA,IAAIhB,KAAK,EAAEc,UAAU,CAACzC,IAAI,CAAC0B,GAAG,CAACrD,KAAK,CAAC,CAAC,CAAC,CAAC;AACxC,UAAA;AACF,QAAA;AAEA,QAAA,IAAIqD,GAAG,CAACiB,UAAU,CAAC,GAAG,CAAC,EAAE;UACvB,IAAIhB,KAAK,EAAEe,OAAO,GAAGhB,GAAG,CAACrD,KAAK,CAAC,CAAC,CAAC;AACjC,UAAA;AACF,QAAA;QACA,IAAIqD,GAAG,KAAK,OAAO,EAAE;UACnB,IAAIC,KAAK,IAAI,IAAI,EAAE;AACnB,UAAA,IAAI,OAAOA,KAAK,KAAK,QAAQ,IAAI,CAACiB,KAAK,CAACC,OAAO,CAAClB,KAAK,CAAC,EAAE;AACtDa,YAAAA,QAAQ,GAAGM,MAAM,CAACC,OAAO,CAACpB,KAA4B,CAAC,CACpDqB,MAAM,CAAC,CAAC,GAAGC,CAAC,CAAC,KAAK,CAAC,CAACA,CAAC,CAAC,CACtB9E,GAAG,CAAC,CAAC,CAAC+E,CAAC,CAAC,KAAKA,CAAC,CAAC,CACfC,IAAI,CAAC,GAAG,CAAC;AACd,UAAA,CAAC,MAAM;AACLX,YAAAA,QAAQ,GAAG,OAAOb,KAAK,KAAK,SAAS,GAAIA,KAAK,GAAG,MAAM,GAAG,EAAE,GAAIP,MAAM,CAACO,KAAK,CAAC;AAC/E,UAAA;AACA,UAAA;AACF,QAAA;QACA,IAAID,GAAG,KAAK,OAAO,EAAE;UACnB,IAAIC,KAAK,IAAI,IAAI,EAAE;UACnBU,KAAK,CAAC9E,IAAI,IAAI,CAAA,QAAA,EAAW0D,UAAU,CAACG,MAAM,CAACO,KAAK,CAAC,CAAC,CAAA,CAAA,CAAG;AACrD,UAAA;AACF,QAAA;AAEA,QAAA,IAAIf,aAAa,CAACwC,GAAG,CAAC1B,GAAG,CAAC,EAAE;UAC1B,IAAIC,KAAK,KAAK,KAAK,IAAIA,KAAK,KAAK,IAAI,IAAIA,KAAK,KAAKvE,SAAS,EAAE;AAC5DiF,YAAAA,KAAK,CAAC9E,IAAI,IAAI,CAAA,CAAA,EAAImE,GAAG,CAAA,CAAE;AACzB,UAAA;AACA,UAAA;AACF,QAAA;AAEA,QAAA,IAAIA,GAAG,CAACiB,UAAU,CAAC,OAAO,CAAC,IAAIjB,GAAG,CAACiB,UAAU,CAAC,OAAO,CAAC,EAAE;UACtD,IAAIhB,KAAK,IAAI,IAAI,EAAE;UACnBU,KAAK,CAAC9E,IAAI,IAAI,CAAA,CAAA,EAAImE,GAAG,KAAKT,UAAU,CAACU,KAAK,CAAC,CAAA,CAAA,CAAG;AAC9C,UAAA;AACF,QAAA;QAEA,IAAIA,KAAK,IAAI,IAAI,EAAE;QACnBU,KAAK,CAAC9E,IAAI,IAAI,CAAA,CAAA,EAAImE,GAAG,KAAKT,UAAU,CAACU,KAAK,CAAC,CAAA,CAAA,CAAG;AAChD,MAAA;MAEA,IAAIc,UAAU,CAAC9D,MAAM,EAAE;AACrB6D,QAAAA,QAAQ,GAAG,CAACA,QAAQ,GAAGA,QAAQ,GAAG,GAAG,GAAG,EAAE,IAAIC,UAAU,CAACU,IAAI,CAAC,GAAG,CAAC;AACpE,MAAA;AACA,MAAA,IAAIX,QAAQ,EAAE;QACZH,KAAK,CAAC9E,IAAI,IAAI,CAAA,QAAA,EAAW0D,UAAU,CAACuB,QAAQ,CAAC,CAAA,CAAA,CAAG;AAClD,MAAA;AAEA,MAAA,IAAIE,OAAO,EAAE;QACXL,KAAK,CAAC9E,IAAI,IAAI,CAAA,KAAA,EAAQ0D,UAAU,CAACyB,OAAO,CAAC,CAAA,CAAA,CAAG;AAC9C,MAAA;MAEA,IAAIxC,IAAI,IAAI,IAAI,IAAIvC,KAAK,CAACJ,IAAI,IAAI,IAAI,EAAE;AACtC,QAAA,MAAM8F,OAAO,GAAG9B,UAAU,CAACrB,IAAI,CAAC;QAChCmC,KAAK,CAAC9E,IAAI,IAAI,CAAA,CAAA,EAAI8F,OAAO,CAAA,EAAA,EAAKhB,KAAK,CAAC3E,IAAI,CAAA,CAAA,CAAG;AAC3C,QAAA,IAAI2E,KAAK,CAAC/E,KAAK,EAAEgG,OAAO,CAACC,IAAI,CAAC,CAAA,CAAA,EAAIlB,KAAK,CAAC3E,IAAI,0DAA0D,CAAC;AACvG4E,QAAAA,UAAU,GAAG,KAAK;AACpB,MAAA,CAAC,MAAM;QACL,IAAI5B,SAAS,CAAC0C,GAAG,CAACf,KAAK,CAAC3E,IAAI,CAAC,EAAE;UAC7B2E,KAAK,CAAC9E,IAAI,IAAI,CAAA,EAAA,CAAI;AAClB,UAAA,IAAI8E,KAAK,CAAC/E,KAAK,EAAEgG,OAAO,CAACC,IAAI,CAAC,CAAA,CAAA,EAAIlB,KAAK,CAAC3E,IAAI,uBAAuB,CAAC;AACpE4E,UAAAA,UAAU,GAAG,KAAK;AACpB,QAAA,CAAC,MAAM;UACLD,KAAK,CAAC9E,IAAI,IAAI,CAAA,CAAA,CAAG;AACnB,QAAA;AACF,MAAA;AACF,IAAA;AAEA,IAAA,IAAI8E,KAAK,CAAC/E,KAAK,IAAIgF,UAAU,EAAE;MAC7BD,KAAK,GAAGA,KAAK,CAAC/E,KAAK;AACnB,MAAA;AACF,IAAA;IAEA,GAAG;AACD,MAAA,MAAMkG,OAAO,GAAGnB,KAAK,KAAKpD,IAAI;AAC9B,MAAA,MAAMwE,SAAS,GAAGpB,KAAK,CAAC3E,IAAI,KAAK,QAAQ;AACzC,MAAA,MAAMgG,OAAO,GAAGrB,KAAK,CAAC3E,IAAI,KAAK,MAAM;AAKrC,MAAA,IAAI4E,UAAU,IAAIkB,OAAO,IAAIC,SAAS,IAAIC,OAAO,EAAE;AACjDrB,QAAAA,KAAK,CAAC9E,IAAI,IAAI,KAAK8E,KAAK,CAAC3E,IAAI,CAAA,CAAA,CAAG;AAClC,MAAA;AAEA,MAAA,IAAI8F,OAAO,EAAE;AACXnB,QAAAA,KAAK,CAAClF,MAAM,CAACI,IAAI,IAAI8E,KAAK,CAAC9E,IAAI;AACjC,MAAA;AAGA+E,MAAAA,UAAU,GAAG,IAAI;AACjB,MAAA,IAAI,CAACkB,OAAO,EAAE,MAAMjB,IAAI;MAExB,IAAIF,KAAK,CAAChF,IAAI,EAAE;QACdgF,KAAK,GAAGA,KAAK,CAAChF,IAAI;AAClB,QAAA;AACF,MAAA;MAEAgF,KAAK,GAAGA,KAAK,CAAClF,MAAM;AACtB,IAAA,CAAC,QAAQ,IAAI;AACf,EAAA,CAAC,QAAQ,IAAI;AACf;AAEO,MAAMwG,aAAa,GAAIC,cAA4B,IAAK;AAC7D,EAAA,MAAM3E,IAAI,GAAG,IAAI/B,QAAQ,CAAC,MAAM,CAAC;EACjC,MAAM2G,MAAM,GAAGC,iBAAY,CAAC;IAC1BtC,UAAU;IACVC,OAAO;IACPI,WAAW;IACXE,YAAY;IACZE,MAAM;IACNC,UAAU;IACVC,OAAO;IACPP,YAAY;AACZmC,IAAAA,UAAU,EAAE;AACd,GAAC,CAAC;AACFF,EAAAA,MAAM,CAACD,cAAc,EAAE3E,IAAI,CAAC;EAC5BmD,SAAS,CAACnD,IAAI,CAAC;EACf,OAAOA,IAAI,CAAC1B,IAAI;AAClB;;;;;"}