@eternalheart/vue-file-preview 1.5.7 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/README.zh-CN.md +6 -0
- package/lib/FilePreviewContent.vue.d.ts +4 -1
- package/lib/FilePreviewContent.vue.d.ts.map +1 -1
- package/lib/FilePreviewEmbed.vue.d.ts +4 -1
- package/lib/FilePreviewEmbed.vue.d.ts.map +1 -1
- package/lib/FilePreviewModal.vue.d.ts +3 -0
- package/lib/FilePreviewModal.vue.d.ts.map +1 -1
- package/lib/chunks/{index-BX4Z60kq.mjs → index-2RMNnT0y.mjs} +22 -22
- package/lib/chunks/{index-BX4Z60kq.mjs.map → index-2RMNnT0y.mjs.map} +1 -1
- package/lib/chunks/{index-zUjR2PO_.mjs → index-B3Bv_Etp.mjs} +14 -14
- package/lib/chunks/{index-zUjR2PO_.mjs.map → index-B3Bv_Etp.mjs.map} +1 -1
- package/lib/chunks/{index-lfAz_44B.mjs → index-BAbJRSyS.mjs} +2 -2
- package/lib/chunks/{index-lfAz_44B.mjs.map → index-BAbJRSyS.mjs.map} +1 -1
- package/lib/chunks/{index-DAlOJW1K.mjs → index-BMz5d0Rs.mjs} +12 -12
- package/lib/chunks/{index-DAlOJW1K.mjs.map → index-BMz5d0Rs.mjs.map} +1 -1
- package/lib/chunks/{index-B81eS8ZU.mjs → index-C-ikNsDh.mjs} +2 -2
- package/lib/chunks/{index-B81eS8ZU.mjs.map → index-C-ikNsDh.mjs.map} +1 -1
- package/lib/chunks/index-C1Ev7K-W.mjs +265 -0
- package/lib/chunks/index-C1Ev7K-W.mjs.map +1 -0
- package/lib/chunks/{index-D3HEYT2-.mjs → index-CKKL3xiq.mjs} +24 -24
- package/lib/chunks/{index-D3HEYT2-.mjs.map → index-CKKL3xiq.mjs.map} +1 -1
- package/lib/chunks/{index-C6rL8w0j.mjs → index-CLDPeQbI.mjs} +7 -7
- package/lib/chunks/{index-C6rL8w0j.mjs.map → index-CLDPeQbI.mjs.map} +1 -1
- package/lib/chunks/{index-Cr5BqQ4w.mjs → index-CdUSfYfF.mjs} +19 -19
- package/lib/chunks/{index-Cr5BqQ4w.mjs.map → index-CdUSfYfF.mjs.map} +1 -1
- package/lib/chunks/{index-CCelprzZ.mjs → index-Cl9ZiWVl.mjs} +2 -2
- package/lib/chunks/{index-CCelprzZ.mjs.map → index-Cl9ZiWVl.mjs.map} +1 -1
- package/lib/chunks/{index-DxvfLZT4.mjs → index-Cy83gsDL.mjs} +49 -49
- package/lib/chunks/{index-DxvfLZT4.mjs.map → index-Cy83gsDL.mjs.map} +1 -1
- package/lib/chunks/{index-DrKqRTg_.mjs → index-D-YwSyrE.mjs} +24 -24
- package/lib/chunks/{index-DrKqRTg_.mjs.map → index-D-YwSyrE.mjs.map} +1 -1
- package/lib/chunks/{index-7qDT5hbP.mjs → index-DD9QZ4a2.mjs} +10 -10
- package/lib/chunks/{index-7qDT5hbP.mjs.map → index-DD9QZ4a2.mjs.map} +1 -1
- package/lib/chunks/{index-DezIRCWU.mjs → index-DL3qn-zG.mjs} +2 -2
- package/lib/chunks/{index-DezIRCWU.mjs.map → index-DL3qn-zG.mjs.map} +1 -1
- package/lib/chunks/{index-C7YsVakC.mjs → index-DcLACobl.mjs} +9 -9
- package/lib/chunks/{index-C7YsVakC.mjs.map → index-DcLACobl.mjs.map} +1 -1
- package/lib/chunks/{index-Bfj4Hl_r.mjs → index-Dcruruhk.mjs} +2 -2
- package/lib/chunks/{index-Bfj4Hl_r.mjs.map → index-Dcruruhk.mjs.map} +1 -1
- package/lib/chunks/{index-CkUaOFQc.mjs → index-Dqqq0VnB.mjs} +2 -2
- package/lib/chunks/{index-CkUaOFQc.mjs.map → index-Dqqq0VnB.mjs.map} +1 -1
- package/lib/chunks/{index-Vj1-8fIZ.mjs → index-DxSw5Ekp.mjs} +2 -2
- package/lib/chunks/{index-Vj1-8fIZ.mjs.map → index-DxSw5Ekp.mjs.map} +1 -1
- package/lib/chunks/{index-DOyDC7Qw.mjs → index-EPkoXaAV.mjs} +2 -2
- package/lib/chunks/{index-DOyDC7Qw.mjs.map → index-EPkoXaAV.mjs.map} +1 -1
- package/lib/chunks/{index-B8AUVu3R.mjs → index-M_Nf3MY5.mjs} +377 -326
- package/lib/chunks/index-M_Nf3MY5.mjs.map +1 -0
- package/lib/chunks/{useShikiHighlight-CZ3m7eHx.mjs → useShikiHighlight-CIk_v_UB.mjs} +2 -2
- package/lib/chunks/{useShikiHighlight-CZ3m7eHx.mjs.map → useShikiHighlight-CIk_v_UB.mjs.map} +1 -1
- package/lib/index.cjs +45 -45
- package/lib/index.cjs.map +1 -1
- package/lib/index.css +1 -1
- package/lib/index.mjs +2 -2
- package/lib/renderers/Cad/index.vue.d.ts +11 -0
- package/lib/renderers/Cad/index.vue.d.ts.map +1 -0
- package/lib/renderers/Cad/toolbar.d.ts +16 -0
- package/lib/renderers/Cad/toolbar.d.ts.map +1 -0
- package/lib/renderers/lazy.d.ts +1 -0
- package/lib/renderers/lazy.d.ts.map +1 -1
- package/lib/renderers/registry.d.ts.map +1 -1
- package/package.json +4 -1
- package/lib/chunks/index-B8AUVu3R.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-zUjR2PO_.mjs","sources":["../../src/renderers/Markdown/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, computed, watch, nextTick } from 'vue';\nimport MarkdownIt from 'markdown-it';\nimport MarkdownItKatex from '@traptitech/markdown-it-katex';\nimport { codeToHtml } from 'shiki';\nimport { Eye, Code } from 'lucide-vue-next';\nimport { fetchTextUtf8 } from '@eternalheart/file-preview-core';\nimport { useTranslator } from '../../composables/useTranslator';\nimport { useFetcher } from '../../composables/useRequest';\nimport { useResolvedTheme } from '../../composables/useResolvedTheme';\nimport RendererError from '../RendererError.vue';\nimport { ToolbarEventEmitter } from '../base.types';\nimport type { RendererHandle } from '../base.types';\nimport type { ToolbarGroup } from '../toolbar.types';\nimport 'katex/dist/katex.min.css';\n\nconst props = defineProps<{\n url: string;\n}>();\n\nconst emitter = new ToolbarEventEmitter();\n\nconst { t } = useTranslator();\nconst fetcher = useFetcher();\nconst resolvedTheme = useResolvedTheme();\nconst shikiTheme = computed(() => (resolvedTheme.value === 'light' ? 'github-light' : 'github-dark'));\n\n// 内部状态\nconst viewMode = ref<'preview' | 'source'>('preview');\n\nconst content = ref('');\nconst html = ref('');\nconst highlightedSource = ref('');\nconst loading = ref(true);\nconst error = ref<string | null>(null);\nconst containerRef = ref<HTMLDivElement | null>(null);\n\n// 监听状态变化,通知工具栏更新\nwatch([viewMode, loading], () => {\n emitter.notify();\n});\n\n// 工具栏配置(对齐 React:Code 图标、翻译 key)\nconst getToolbarGroups = (): ToolbarGroup[] => {\n const groups: ToolbarGroup[] = [];\n\n groups.push({\n items: [\n {\n type: 'button',\n icon: viewMode.value === 'preview' ? Code : Eye,\n tooltip: viewMode.value === 'preview' ? t.value('toolbar.source') : t.value('toolbar.preview'),\n action: () => { viewMode.value = viewMode.value === 'preview' ? 'source' : 'preview'; },\n active: viewMode.value === 'source',\n },\n ],\n });\n\n return groups;\n};\n\ndefineExpose<RendererHandle>({\n getToolbarGroups,\n onToolbarChange: (listener) => emitter.subscribe(listener),\n});\n\n// 创建 markdown-it 实例(支持 GFM 表格、删除线、任务列表、HTML、数学公式)\nconst md = new MarkdownIt({\n html: true,\n linkify: true,\n typographer: false,\n breaks: false,\n});\nmd.use(MarkdownItKatex);\n\n// 自定义代码块渲染:包裹 code-block-wrapper + header(不含复制按钮,由 JS 动态注入)\nmd.renderer.rules.fence = (tokens, idx) => {\n const token = tokens[idx];\n const info = token.info ? token.info.trim() : '';\n const code = token.content;\n\n if (!info) {\n return `<div class=\"code-block-wrapper\">\n <pre class=\"no-lang-pre\"><code>${md.utils.escapeHtml(code)}</code></pre>\n </div>`;\n }\n\n return `<div class=\"code-block-wrapper\">\n <div class=\"code-block-header\">\n <span>${info}</span>\n </div>\n <pre data-shiki-pending=\"1\" data-lang=\"${info}\"><code>${md.utils.escapeHtml(code)}</code></pre>\n </div>`;\n};\n\n// 4-space 缩进代码块:同样包裹 code-block-wrapper(无头,注入浮动复制按钮)\nmd.renderer.rules.code_block = (tokens, idx) => {\n const code = tokens[idx].content;\n return `<div class=\"code-block-wrapper\">\n <pre class=\"no-lang-pre\"><code>${md.utils.escapeHtml(code)}</code></pre>\n </div>`;\n};\n\n// 表格添加包裹层(用于横向滚动)\nconst defaultTableOpen =\n md.renderer.rules.table_open ||\n ((tokens, idx, options, _env, self) => self.renderToken(tokens, idx, options));\nmd.renderer.rules.table_open = (tokens, idx, options, env, self) => {\n return '<div class=\"table-wrapper\">' + defaultTableOpen(tokens, idx, options, env, self);\n};\nconst defaultTableClose =\n md.renderer.rules.table_close ||\n ((tokens, idx, options, _env, self) => self.renderToken(tokens, idx, options));\nmd.renderer.rules.table_close = (tokens, idx, options, env, self) => {\n return defaultTableClose(tokens, idx, options, env, self) + '</div>';\n};\n\nconst loadMarkdown = async () => {\n loading.value = true;\n error.value = null;\n try {\n const text = await fetchTextUtf8(props.url, { fetcher: fetcher.value });\n content.value = text;\n html.value = md.render(text);\n loading.value = false;\n // 异步生成源码高亮(不阻塞预览渲染)\n try {\n highlightedSource.value = await codeToHtml(text, { lang: 'markdown', theme: shikiTheme.value });\n } catch {\n highlightedSource.value = '';\n }\n } catch (err) {\n console.error(err);\n error.value = t.value('markdown.load_failed');\n loading.value = false;\n }\n};\n\nconst COPY_SVG_SM = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg>`;\nconst COPY_SVG_MD = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg>`;\nconst CHECK_SVG_SM = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 6 9 17l-5-5\"/></svg>`;\nconst CHECK_SVG_MD = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 6 9 17l-5-5\"/></svg>`;\n\nconst createCopyButton = (code: string, inline: boolean): HTMLButtonElement => {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = inline ? 'code-copy-btn' : 'code-copy-btn code-copy-float';\n btn.title = t.value('markdown.copy_code');\n btn.innerHTML = inline ? COPY_SVG_SM : COPY_SVG_MD;\n btn.addEventListener('click', async (e) => {\n e.stopPropagation();\n try {\n await navigator.clipboard.writeText(code);\n } catch {\n const ta = document.createElement('textarea');\n ta.value = code;\n document.body.appendChild(ta);\n ta.select();\n document.execCommand('copy');\n document.body.removeChild(ta);\n }\n btn.innerHTML = inline ? CHECK_SVG_SM : CHECK_SVG_MD;\n btn.title = t.value('markdown.copied');\n setTimeout(() => {\n btn.innerHTML = inline ? COPY_SVG_SM : COPY_SVG_MD;\n btn.title = t.value('markdown.copy_code');\n }, 2000);\n });\n return btn;\n};\n\nconst highlightAndInjectCopyButtons = async () => {\n if (!containerRef.value) return;\n\n // 1. shiki 高亮有语言的代码块\n const pending = containerRef.value.querySelectorAll<HTMLPreElement>('pre[data-shiki-pending=\"1\"]');\n for (const pre of pending) {\n const lang = pre.getAttribute('data-lang') || 'text';\n const code = pre.querySelector('code')?.textContent || '';\n try {\n const highlighted = await codeToHtml(code, { lang, theme: shikiTheme.value });\n const tmp = document.createElement('div');\n tmp.innerHTML = highlighted;\n const newPre = tmp.firstElementChild as HTMLElement;\n if (newPre) pre.replaceWith(newPre);\n } catch {\n pre.style.backgroundColor = 'var(--fp-code-bg)';\n pre.removeAttribute('data-shiki-pending');\n }\n }\n\n // 2. 为所有代码块注入复制按钮(避免重复注入)\n const wrappers = containerRef.value.querySelectorAll<HTMLElement>('.code-block-wrapper');\n for (const wrapper of wrappers) {\n if (wrapper.querySelector('.code-copy-btn')) continue;\n const header = wrapper.querySelector('.code-block-header');\n const pre = wrapper.querySelector('pre');\n const code = pre?.querySelector('code')?.textContent ?? pre?.textContent ?? '';\n if (header) {\n // 有语言:按钮放入 header 右侧\n header.appendChild(createCopyButton(code, true));\n } else {\n // 无语言:浮动按钮\n wrapper.appendChild(createCopyButton(code, false));\n }\n }\n};\n\nwatch(() => props.url, loadMarkdown, { immediate: true });\n\nwatch(html, async () => {\n if (!html.value) return;\n await nextTick();\n highlightAndInjectCopyButtons();\n});\n\n// 主题切换时重新加载(让 shiki 用新主题重新高亮)\nwatch(shikiTheme, () => {\n if (content.value) loadMarkdown();\n});\n</script>\n\n<template>\n <div v-if=\"loading\" class=\"vfp-flex vfp-items-center vfp-justify-center vfp-w-full vfp-h-full\">\n <div\n class=\"vfp-w-12 vfp-h-12 vfp-border-4 vfp-border-line-strong vfp-border-t-spinner-head vfp-rounded-full vfp-animate-spin\"\n />\n </div>\n\n <RendererError v-else-if=\"error\" :message=\"error\" />\n\n <!-- 源码视图 -->\n <div v-else-if=\"viewMode === 'source'\" class=\"vfp-w-full vfp-h-full vfp-overflow-auto\" style=\"background: var(--fp-code-bg);\">\n <pre\n v-if=\"!highlightedSource\"\n class=\"vfp-p-6 vfp-text-fg-primary vfp-font-mono vfp-text-sm vfp-whitespace-pre-wrap vfp-break-words\"\n >{{ content }}</pre\n >\n <div v-else class=\"shiki-wrapper\" v-html=\"highlightedSource\" />\n </div>\n\n <!-- 预览视图 -->\n <div v-else class=\"vfp-w-full vfp-h-full vfp-overflow-auto vfp-py-6 vfp-px-4\">\n <div ref=\"containerRef\" class=\"markdown-body\" v-html=\"html\" />\n </div>\n</template>\n\n<style scoped>\n.markdown-body :deep(.table-wrapper) {\n overflow-x: auto;\n margin: 1rem 0;\n border-radius: 0.375rem;\n border: 1px solid var(--fp-surface-3);\n}\n.markdown-body :deep(.table-wrapper > table) {\n margin: 0;\n border: 0;\n border-radius: 0;\n}\n/* shiki 生成的 pre:修正在 code-block-wrapper 内的边距与圆角 */\n.markdown-body :deep(.code-block-wrapper pre.shiki) {\n margin: 0;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n border-top: 0;\n}\n/* 无语言代码块:pre 不裁剪,让浮动按钮可见 */\n.markdown-body :deep(.code-block-wrapper) {\n overflow: visible;\n}\n.markdown-body :deep(.code-block-wrapper pre) {\n overflow: visible;\n}\n/* 无语言代码块纯文本样式 */\n.markdown-body :deep(.no-lang-pre) {\n margin: 0;\n padding: 1rem;\n background: var(--fp-code-bg);\n border-radius: 0.375rem;\n border: 1px solid var(--fp-line);\n}\n.markdown-body :deep(.no-lang-pre code) {\n display: block;\n font-size: 0.8125rem;\n line-height: 1.5;\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n color: var(--fp-fg-primary);\n white-space: pre;\n overflow-x: auto;\n}\n/* shiki 生成的 code:补充 padding,使代码有适当内边距 */\n.markdown-body :deep(pre.shiki code) {\n display: block;\n padding: 1rem;\n font-size: 0.8125rem;\n line-height: 1.5;\n overflow-x: auto;\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n}\n/* KaTeX 公式颜色适配暗色背景 */\n.markdown-body :deep(.katex) {\n color: var(--fp-fg-primary);\n}\n.markdown-body :deep(.katex-display) {\n margin: 1.25rem 0;\n overflow-x: auto;\n overflow-y: hidden;\n}\n/* 源码视图 shiki */\n.shiki-wrapper :deep(pre) {\n margin: 0;\n padding: 1.5rem;\n background: transparent !important;\n font-size: 0.875rem;\n overflow-x: auto;\n}\n.shiki-wrapper :deep(code) {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n}\n</style>\n"],"names":["COPY_SVG_SM","COPY_SVG_MD","CHECK_SVG_SM","CHECK_SVG_MD","props","__props","emitter","ToolbarEventEmitter","t","useTranslator","fetcher","useFetcher","resolvedTheme","useResolvedTheme","shikiTheme","computed","viewMode","ref","content","html","highlightedSource","loading","error","containerRef","watch","__expose","groups","Code","Eye","listener","md","MarkdownIt","MarkdownItKatex","tokens","idx","token","info","code","defaultTableOpen","options","_env","self","env","defaultTableClose","loadMarkdown","text","fetchTextUtf8","codeToHtml","err","createCopyButton","inline","btn","e","ta","highlightAndInjectCopyButtons","pending","pre","lang","_a","highlighted","tmp","newPre","wrappers","wrapper","header","_b","nextTick","_openBlock","_createElementBlock","_hoisted_1","_cache","_createElementVNode","_createBlock","RendererError","_hoisted_2","_hoisted_3","_toDisplayString","_hoisted_5"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index-B3Bv_Etp.mjs","sources":["../../src/renderers/Markdown/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, computed, watch, nextTick } from 'vue';\nimport MarkdownIt from 'markdown-it';\nimport MarkdownItKatex from '@traptitech/markdown-it-katex';\nimport { codeToHtml } from 'shiki';\nimport { Eye, Code } from 'lucide-vue-next';\nimport { fetchTextUtf8 } from '@eternalheart/file-preview-core';\nimport { useTranslator } from '../../composables/useTranslator';\nimport { useFetcher } from '../../composables/useRequest';\nimport { useResolvedTheme } from '../../composables/useResolvedTheme';\nimport RendererError from '../RendererError.vue';\nimport { ToolbarEventEmitter } from '../base.types';\nimport type { RendererHandle } from '../base.types';\nimport type { ToolbarGroup } from '../toolbar.types';\nimport 'katex/dist/katex.min.css';\n\nconst props = defineProps<{\n url: string;\n}>();\n\nconst emitter = new ToolbarEventEmitter();\n\nconst { t } = useTranslator();\nconst fetcher = useFetcher();\nconst resolvedTheme = useResolvedTheme();\nconst shikiTheme = computed(() => (resolvedTheme.value === 'light' ? 'github-light' : 'github-dark'));\n\n// 内部状态\nconst viewMode = ref<'preview' | 'source'>('preview');\n\nconst content = ref('');\nconst html = ref('');\nconst highlightedSource = ref('');\nconst loading = ref(true);\nconst error = ref<string | null>(null);\nconst containerRef = ref<HTMLDivElement | null>(null);\n\n// 监听状态变化,通知工具栏更新\nwatch([viewMode, loading], () => {\n emitter.notify();\n});\n\n// 工具栏配置(对齐 React:Code 图标、翻译 key)\nconst getToolbarGroups = (): ToolbarGroup[] => {\n const groups: ToolbarGroup[] = [];\n\n groups.push({\n items: [\n {\n type: 'button',\n icon: viewMode.value === 'preview' ? Code : Eye,\n tooltip: viewMode.value === 'preview' ? t.value('toolbar.source') : t.value('toolbar.preview'),\n action: () => { viewMode.value = viewMode.value === 'preview' ? 'source' : 'preview'; },\n active: viewMode.value === 'source',\n },\n ],\n });\n\n return groups;\n};\n\ndefineExpose<RendererHandle>({\n getToolbarGroups,\n onToolbarChange: (listener) => emitter.subscribe(listener),\n});\n\n// 创建 markdown-it 实例(支持 GFM 表格、删除线、任务列表、HTML、数学公式)\nconst md = new MarkdownIt({\n html: true,\n linkify: true,\n typographer: false,\n breaks: false,\n});\nmd.use(MarkdownItKatex);\n\n// 自定义代码块渲染:包裹 code-block-wrapper + header(不含复制按钮,由 JS 动态注入)\nmd.renderer.rules.fence = (tokens, idx) => {\n const token = tokens[idx];\n const info = token.info ? token.info.trim() : '';\n const code = token.content;\n\n if (!info) {\n return `<div class=\"code-block-wrapper\">\n <pre class=\"no-lang-pre\"><code>${md.utils.escapeHtml(code)}</code></pre>\n </div>`;\n }\n\n return `<div class=\"code-block-wrapper\">\n <div class=\"code-block-header\">\n <span>${info}</span>\n </div>\n <pre data-shiki-pending=\"1\" data-lang=\"${info}\"><code>${md.utils.escapeHtml(code)}</code></pre>\n </div>`;\n};\n\n// 4-space 缩进代码块:同样包裹 code-block-wrapper(无头,注入浮动复制按钮)\nmd.renderer.rules.code_block = (tokens, idx) => {\n const code = tokens[idx].content;\n return `<div class=\"code-block-wrapper\">\n <pre class=\"no-lang-pre\"><code>${md.utils.escapeHtml(code)}</code></pre>\n </div>`;\n};\n\n// 表格添加包裹层(用于横向滚动)\nconst defaultTableOpen =\n md.renderer.rules.table_open ||\n ((tokens, idx, options, _env, self) => self.renderToken(tokens, idx, options));\nmd.renderer.rules.table_open = (tokens, idx, options, env, self) => {\n return '<div class=\"table-wrapper\">' + defaultTableOpen(tokens, idx, options, env, self);\n};\nconst defaultTableClose =\n md.renderer.rules.table_close ||\n ((tokens, idx, options, _env, self) => self.renderToken(tokens, idx, options));\nmd.renderer.rules.table_close = (tokens, idx, options, env, self) => {\n return defaultTableClose(tokens, idx, options, env, self) + '</div>';\n};\n\nconst loadMarkdown = async () => {\n loading.value = true;\n error.value = null;\n try {\n const text = await fetchTextUtf8(props.url, { fetcher: fetcher.value });\n content.value = text;\n html.value = md.render(text);\n loading.value = false;\n // 异步生成源码高亮(不阻塞预览渲染)\n try {\n highlightedSource.value = await codeToHtml(text, { lang: 'markdown', theme: shikiTheme.value });\n } catch {\n highlightedSource.value = '';\n }\n } catch (err) {\n console.error(err);\n error.value = t.value('markdown.load_failed');\n loading.value = false;\n }\n};\n\nconst COPY_SVG_SM = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg>`;\nconst COPY_SVG_MD = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg>`;\nconst CHECK_SVG_SM = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 6 9 17l-5-5\"/></svg>`;\nconst CHECK_SVG_MD = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M20 6 9 17l-5-5\"/></svg>`;\n\nconst createCopyButton = (code: string, inline: boolean): HTMLButtonElement => {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = inline ? 'code-copy-btn' : 'code-copy-btn code-copy-float';\n btn.title = t.value('markdown.copy_code');\n btn.innerHTML = inline ? COPY_SVG_SM : COPY_SVG_MD;\n btn.addEventListener('click', async (e) => {\n e.stopPropagation();\n try {\n await navigator.clipboard.writeText(code);\n } catch {\n const ta = document.createElement('textarea');\n ta.value = code;\n document.body.appendChild(ta);\n ta.select();\n document.execCommand('copy');\n document.body.removeChild(ta);\n }\n btn.innerHTML = inline ? CHECK_SVG_SM : CHECK_SVG_MD;\n btn.title = t.value('markdown.copied');\n setTimeout(() => {\n btn.innerHTML = inline ? COPY_SVG_SM : COPY_SVG_MD;\n btn.title = t.value('markdown.copy_code');\n }, 2000);\n });\n return btn;\n};\n\nconst highlightAndInjectCopyButtons = async () => {\n if (!containerRef.value) return;\n\n // 1. shiki 高亮有语言的代码块\n const pending = containerRef.value.querySelectorAll<HTMLPreElement>('pre[data-shiki-pending=\"1\"]');\n for (const pre of pending) {\n const lang = pre.getAttribute('data-lang') || 'text';\n const code = pre.querySelector('code')?.textContent || '';\n try {\n const highlighted = await codeToHtml(code, { lang, theme: shikiTheme.value });\n const tmp = document.createElement('div');\n tmp.innerHTML = highlighted;\n const newPre = tmp.firstElementChild as HTMLElement;\n if (newPre) pre.replaceWith(newPre);\n } catch {\n pre.style.backgroundColor = 'var(--fp-code-bg)';\n pre.removeAttribute('data-shiki-pending');\n }\n }\n\n // 2. 为所有代码块注入复制按钮(避免重复注入)\n const wrappers = containerRef.value.querySelectorAll<HTMLElement>('.code-block-wrapper');\n for (const wrapper of wrappers) {\n if (wrapper.querySelector('.code-copy-btn')) continue;\n const header = wrapper.querySelector('.code-block-header');\n const pre = wrapper.querySelector('pre');\n const code = pre?.querySelector('code')?.textContent ?? pre?.textContent ?? '';\n if (header) {\n // 有语言:按钮放入 header 右侧\n header.appendChild(createCopyButton(code, true));\n } else {\n // 无语言:浮动按钮\n wrapper.appendChild(createCopyButton(code, false));\n }\n }\n};\n\nwatch(() => props.url, loadMarkdown, { immediate: true });\n\nwatch(html, async () => {\n if (!html.value) return;\n await nextTick();\n highlightAndInjectCopyButtons();\n});\n\n// 主题切换时重新加载(让 shiki 用新主题重新高亮)\nwatch(shikiTheme, () => {\n if (content.value) loadMarkdown();\n});\n</script>\n\n<template>\n <div v-if=\"loading\" class=\"vfp-flex vfp-items-center vfp-justify-center vfp-w-full vfp-h-full\">\n <div\n class=\"vfp-w-12 vfp-h-12 vfp-border-4 vfp-border-line-strong vfp-border-t-spinner-head vfp-rounded-full vfp-animate-spin\"\n />\n </div>\n\n <RendererError v-else-if=\"error\" :message=\"error\" />\n\n <!-- 源码视图 -->\n <div v-else-if=\"viewMode === 'source'\" class=\"vfp-w-full vfp-h-full vfp-overflow-auto\" style=\"background: var(--fp-code-bg);\">\n <pre\n v-if=\"!highlightedSource\"\n class=\"vfp-p-6 vfp-text-fg-primary vfp-font-mono vfp-text-sm vfp-whitespace-pre-wrap vfp-break-words\"\n >{{ content }}</pre\n >\n <div v-else class=\"shiki-wrapper\" v-html=\"highlightedSource\" />\n </div>\n\n <!-- 预览视图 -->\n <div v-else class=\"vfp-w-full vfp-h-full vfp-overflow-auto vfp-py-6 vfp-px-4\">\n <div ref=\"containerRef\" class=\"markdown-body\" v-html=\"html\" />\n </div>\n</template>\n\n<style scoped>\n.markdown-body :deep(.table-wrapper) {\n overflow-x: auto;\n margin: 1rem 0;\n border-radius: 0.375rem;\n border: 1px solid var(--fp-surface-3);\n}\n.markdown-body :deep(.table-wrapper > table) {\n margin: 0;\n border: 0;\n border-radius: 0;\n}\n/* shiki 生成的 pre:修正在 code-block-wrapper 内的边距与圆角 */\n.markdown-body :deep(.code-block-wrapper pre.shiki) {\n margin: 0;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n border-top: 0;\n}\n/* 无语言代码块:pre 不裁剪,让浮动按钮可见 */\n.markdown-body :deep(.code-block-wrapper) {\n overflow: visible;\n}\n.markdown-body :deep(.code-block-wrapper pre) {\n overflow: visible;\n}\n/* 无语言代码块纯文本样式 */\n.markdown-body :deep(.no-lang-pre) {\n margin: 0;\n padding: 1rem;\n background: var(--fp-code-bg);\n border-radius: 0.375rem;\n border: 1px solid var(--fp-line);\n}\n.markdown-body :deep(.no-lang-pre code) {\n display: block;\n font-size: 0.8125rem;\n line-height: 1.5;\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n color: var(--fp-fg-primary);\n white-space: pre;\n overflow-x: auto;\n}\n/* shiki 生成的 code:补充 padding,使代码有适当内边距 */\n.markdown-body :deep(pre.shiki code) {\n display: block;\n padding: 1rem;\n font-size: 0.8125rem;\n line-height: 1.5;\n overflow-x: auto;\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n}\n/* KaTeX 公式颜色适配暗色背景 */\n.markdown-body :deep(.katex) {\n color: var(--fp-fg-primary);\n}\n.markdown-body :deep(.katex-display) {\n margin: 1.25rem 0;\n overflow-x: auto;\n overflow-y: hidden;\n}\n/* 源码视图 shiki */\n.shiki-wrapper :deep(pre) {\n margin: 0;\n padding: 1.5rem;\n background: transparent !important;\n font-size: 0.875rem;\n overflow-x: auto;\n}\n.shiki-wrapper :deep(code) {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n}\n</style>\n"],"names":["COPY_SVG_SM","COPY_SVG_MD","CHECK_SVG_SM","CHECK_SVG_MD","props","__props","emitter","ToolbarEventEmitter","t","useTranslator","fetcher","useFetcher","resolvedTheme","useResolvedTheme","shikiTheme","computed","viewMode","ref","content","html","highlightedSource","loading","error","containerRef","watch","__expose","groups","Code","Eye","listener","md","MarkdownIt","MarkdownItKatex","tokens","idx","token","info","code","defaultTableOpen","options","_env","self","env","defaultTableClose","loadMarkdown","text","fetchTextUtf8","codeToHtml","err","createCopyButton","inline","btn","e","ta","highlightAndInjectCopyButtons","pending","pre","lang","_a","highlighted","tmp","newPre","wrappers","wrapper","header","_b","nextTick","_openBlock","_createElementBlock","_hoisted_1","_cache","_createElementVNode","_createBlock","RendererError","_hoisted_2","_hoisted_3","_toDisplayString","_hoisted_5"],"mappings":"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"}
|
|
@@ -14,7 +14,7 @@ var $t = (u, e, t, s) => ({
|
|
|
14
14
|
}
|
|
15
15
|
});
|
|
16
16
|
import { defineComponent as $b, ref as Si, watch as aa, nextTick as wu, onMounted as jb, onBeforeUnmount as Gb, openBlock as zh, createElementBlock as Eu, normalizeStyle as Ep, createElementVNode as sn, toDisplayString as _b, unref as Im, createVNode as zb, createCommentVNode as Su, createBlock as Vb } from "vue";
|
|
17
|
-
import { x as Wb, u as Xb,
|
|
17
|
+
import { x as Wb, u as Xb, K as Yb } from "./index-M_Nf3MY5.mjs";
|
|
18
18
|
import { _ as Kb } from "./RendererError.vue_vue_type_script_setup_true_lang-BNoENOWX.mjs";
|
|
19
19
|
import { X as Jb, Menu as Qb, ChevronLeft as Zb, ChevronRight as qb, ZoomOut as tA, ZoomIn as eA, RefreshCw as sA } from "lucide-vue-next";
|
|
20
20
|
import { T as iA } from "./base.types-DaftHyg7.mjs";
|
|
@@ -22210,4 +22210,4 @@ const q0 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
|
|
|
22210
22210
|
export {
|
|
22211
22211
|
dw as default
|
|
22212
22212
|
};
|
|
22213
|
-
//# sourceMappingURL=index-
|
|
22213
|
+
//# sourceMappingURL=index-BAbJRSyS.mjs.map
|