@hejiayue/x-markdown-test 0.0.1-beta.119 → 0.0.1-beta.121
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/x-markdown.cjs10.js +1 -1
- package/dist/x-markdown.cjs13.js +1 -1
- package/dist/x-markdown.cjs14.js +1 -1
- package/dist/x-markdown.cjs14.js.map +1 -1
- package/dist/x-markdown.cjs15.js +1 -1
- package/dist/x-markdown.cjs15.js.map +1 -1
- package/dist/x-markdown.cjs16.js +1 -1
- package/dist/x-markdown.cjs17.js +1 -1
- package/dist/x-markdown.cjs18.js +1 -1
- package/dist/x-markdown.cjs19.js +1 -1
- package/dist/x-markdown.cjs19.js.map +1 -1
- package/dist/x-markdown.cjs20.js +2 -0
- package/dist/x-markdown.cjs20.js.map +1 -0
- package/dist/x-markdown.cjs22.js +1 -1
- package/dist/x-markdown.cjs22.js.map +1 -1
- package/dist/x-markdown.cjs23.js +2 -0
- package/dist/x-markdown.cjs23.js.map +1 -0
- package/dist/{x-markdown.cjs24.js → x-markdown.cjs25.js} +2 -2
- package/dist/{x-markdown.cjs24.js.map → x-markdown.cjs25.js.map} +1 -1
- package/dist/x-markdown.cjs27.js +1 -1
- package/dist/x-markdown.cjs27.js.map +1 -1
- package/dist/x-markdown.cjs28.js +1 -1
- package/dist/x-markdown.cjs28.js.map +1 -1
- package/dist/x-markdown.cjs29.js +2 -0
- package/dist/x-markdown.cjs29.js.map +1 -0
- package/dist/x-markdown.cjs31.js +1 -1
- package/dist/x-markdown.cjs31.js.map +1 -1
- package/dist/x-markdown.cjs32.js +2 -0
- package/dist/x-markdown.cjs32.js.map +1 -0
- package/dist/{x-markdown.cjs33.js → x-markdown.cjs34.js} +2 -2
- package/dist/x-markdown.cjs34.js.map +1 -0
- package/dist/x-markdown.cjs7.js +1 -1
- package/dist/x-markdown.cjs7.js.map +1 -1
- package/dist/x-markdown.cjs9.js +1 -1
- package/dist/x-markdown.cjs9.js.map +1 -1
- package/dist/x-markdown.es10.js +1 -1
- package/dist/x-markdown.es13.js +3 -3
- package/dist/x-markdown.es14.js +69 -28
- package/dist/x-markdown.es14.js.map +1 -1
- package/dist/x-markdown.es15.js +31 -2
- package/dist/x-markdown.es15.js.map +1 -1
- package/dist/x-markdown.es16.js +1 -2
- package/dist/x-markdown.es16.js.map +1 -1
- package/dist/x-markdown.es17.js +2 -4
- package/dist/x-markdown.es17.js.map +1 -1
- package/dist/x-markdown.es18.js +4 -4
- package/dist/x-markdown.es19.js +5 -204
- package/dist/x-markdown.es19.js.map +1 -1
- package/dist/x-markdown.es20.js +207 -0
- package/dist/x-markdown.es20.js.map +1 -0
- package/dist/x-markdown.es22.js +7 -71
- package/dist/x-markdown.es22.js.map +1 -1
- package/dist/x-markdown.es23.js +75 -0
- package/dist/x-markdown.es23.js.map +1 -0
- package/dist/{x-markdown.es24.js → x-markdown.es25.js} +4 -4
- package/dist/{x-markdown.es24.js.map → x-markdown.es25.js.map} +1 -1
- package/dist/x-markdown.es27.js +157 -5
- package/dist/x-markdown.es27.js.map +1 -1
- package/dist/x-markdown.es28.js +5 -139
- package/dist/x-markdown.es28.js.map +1 -1
- package/dist/x-markdown.es29.js +142 -0
- package/dist/x-markdown.es29.js.map +1 -0
- package/dist/x-markdown.es31.js +74 -121
- package/dist/x-markdown.es31.js.map +1 -1
- package/dist/x-markdown.es32.js +125 -0
- package/dist/x-markdown.es32.js.map +1 -0
- package/dist/x-markdown.es34.js +6 -0
- package/dist/x-markdown.es34.js.map +1 -0
- package/dist/x-markdown.es7.js +3 -47
- package/dist/x-markdown.es7.js.map +1 -1
- package/dist/x-markdown.es9.js +2 -10
- package/dist/x-markdown.es9.js.map +1 -1
- package/package.json +2 -1
- package/dist/x-markdown.cjs21.js +0 -2
- package/dist/x-markdown.cjs21.js.map +0 -1
- package/dist/x-markdown.cjs26.js +0 -2
- package/dist/x-markdown.cjs26.js.map +0 -1
- package/dist/x-markdown.cjs30.js +0 -2
- package/dist/x-markdown.cjs30.js.map +0 -1
- package/dist/x-markdown.cjs33.js.map +0 -1
- package/dist/x-markdown.es21.js +0 -11
- package/dist/x-markdown.es21.js.map +0 -1
- package/dist/x-markdown.es26.js +0 -160
- package/dist/x-markdown.es26.js.map +0 -1
- package/dist/x-markdown.es30.js +0 -78
- package/dist/x-markdown.es30.js.map +0 -1
- package/dist/x-markdown.es33.js +0 -6
- package/dist/x-markdown.es33.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"x-markdown.cjs9.js","sources":["../src/hooks/useMermaid.ts"],"sourcesContent":["import type { Ref } from 'vue'\r\nimport { throttle } from 'lodash-es'\r\nimport { computed, ref, watch, onUnmounted } from 'vue'\r\nimport type { MermaidZoomControls, UseMermaidZoomOptions, UseMermaidResult } from '../components/Mermaid/types'\r\n\r\nexport function downloadSvgAsPng(svg: string): void {\r\n if (!svg) return\r\n\r\n try {\r\n const svgDataUrl = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`\r\n const img = new Image()\r\n\r\n img.onload = () => {\r\n try {\r\n const canvas = document.createElement('canvas')\r\n const ctx = canvas.getContext('2d', { willReadFrequently: false })\r\n if (!ctx) return\r\n\r\n const scale = 2\r\n canvas.width = img.width * scale\r\n canvas.height = img.height * scale\r\n ctx.imageSmoothingEnabled = true\r\n ctx.imageSmoothingQuality = 'high'\r\n\r\n ctx.fillStyle = '#ffffff'\r\n ctx.fillRect(0, 0, canvas.width, canvas.height)\r\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height)\r\n\r\n const timestamp = new Date().toISOString().slice(0, 19).replace(/:/g, '-')\r\n\r\n try {\r\n canvas.toBlob(\r\n (blob) => {\r\n if (!blob) return\r\n const url = URL.createObjectURL(blob)\r\n const link = document.createElement('a')\r\n link.href = url\r\n link.download = `mermaid-diagram-${timestamp}.png`\r\n document.body.appendChild(link)\r\n link.click()\r\n document.body.removeChild(link)\r\n URL.revokeObjectURL(url)\r\n },\r\n 'image/png',\r\n 0.95,\r\n )\r\n } catch (toBlobError) {\r\n console.error('Failed to convert canvas to blob:', toBlobError)\r\n try {\r\n const dataUrl = canvas.toDataURL('image/png', 0.95)\r\n const link = document.createElement('a')\r\n link.href = dataUrl\r\n link.download = `mermaid-diagram-${timestamp}.png`\r\n document.body.appendChild(link)\r\n link.click()\r\n document.body.removeChild(link)\r\n } catch (dataUrlError) {\r\n console.error('Failed to convert canvas to data URL:', dataUrlError)\r\n }\r\n }\r\n } catch (canvasError) {\r\n console.error('Canvas operation failed:', canvasError)\r\n }\r\n }\r\n\r\n img.onerror = (error) => {\r\n console.error('Failed to load image:', error)\r\n }\r\n\r\n img.src = svgDataUrl\r\n } catch (error) {\r\n console.error('Failed to download SVG:', error)\r\n }\r\n}\r\n\r\ninterface UseMermaidOptions {\r\n id?: string\r\n theme?: 'default' | 'dark' | 'forest' | 'neutral' | string\r\n config?: any\r\n container?: HTMLElement | Ref<HTMLElement | null> | null\r\n}\r\n\r\ntype UseMermaidOptionsInput = UseMermaidOptions | Ref<UseMermaidOptions>\r\n\r\nlet mermaidPromise: Promise<any> | null = null\r\nlet hasShownMermaidHint = false\r\nlet mermaidAvailableCache: boolean | null = null\r\nlet mermaidCheckPromise: Promise<boolean> | null = null\r\n\r\n/**\r\n * 同步检查缓存状态(不触发检测)\r\n * @returns 缓存状态,null 表示未检测\r\n */\r\nexport function getMermaidAvailableCache(): boolean | null {\r\n return mermaidAvailableCache\r\n}\r\n\r\n/**\r\n * 动态导入辅助函数,绕过 Vite 的静态分析\r\n */\r\nconst dynamicImport = async (moduleName: string): Promise<any> => {\r\n // 使用 Function 构造器绕过静态分析\r\n // 构造一个函数,该函数返回 import(moduleName) 的结果\r\n const importFn = new Function('moduleName', `return import(moduleName)`)\r\n try {\r\n return await importFn(moduleName)\r\n } catch {\r\n return null\r\n }\r\n}\r\n\r\n/**\r\n * 检测 mermaid 是否可用(全局缓存,只检测一次)\r\n */\r\nexport async function checkMermaidAvailable(): Promise<boolean> {\r\n // 如果已经有缓存结果,直接返回\r\n if (mermaidAvailableCache !== null) {\r\n return mermaidAvailableCache\r\n }\r\n\r\n // 如果正在检测,返回检测 Promise\r\n if (mermaidCheckPromise) {\r\n return mermaidCheckPromise\r\n }\r\n\r\n // 开始检测\r\n mermaidCheckPromise = (async () => {\r\n try {\r\n // 使用动态导入绕过 Vite 静态分析\r\n const mod = await dynamicImport('mermaid')\r\n mermaidAvailableCache = !!mod\r\n return mermaidAvailableCache\r\n } catch (error) {\r\n console.error('[x-markdown] Failed to load mermaid:', error)\r\n mermaidAvailableCache = false\r\n return false\r\n }\r\n })()\r\n\r\n return mermaidCheckPromise\r\n}\r\n\r\nconst showMermaidHint = () => {\r\n if (hasShownMermaidHint) return\r\n hasShownMermaidHint = true\r\n\r\n console.log(\r\n '%c[x-markdown]%c Mermaid 图表功能已降级为代码块显示',\r\n 'font-weight: bold; color: #9333ea;',\r\n 'color: #666;'\r\n )\r\n console.log(\r\n '%c如需 Mermaid 图表渲染功能,请安装:',\r\n 'color: #666; font-weight: bold;'\r\n )\r\n console.log(\r\n '%c pnpm add mermaid',\r\n 'color: #9333ea; font-family: monospace;'\r\n )\r\n console.log(\r\n '%c安装后请重启开发服务器',\r\n 'color: #999; font-size: 12px;'\r\n )\r\n}\r\n\r\nasync function loadMermaid() {\r\n if (typeof window === 'undefined') return null\r\n if (!mermaidPromise) {\r\n mermaidPromise = (async () => {\r\n try {\r\n // 使用动态导入绕过 Vite 静态分析\r\n const mod = await dynamicImport('mermaid')\r\n return (mod as any)?.default\r\n } catch (error) {\r\n console.error('[x-markdown] Failed to load mermaid:', error)\r\n showMermaidHint()\r\n return null\r\n }\r\n })()\r\n }\r\n return mermaidPromise\r\n}\r\n\r\ntype RenderTask = () => Promise<void>\r\nconst renderQueue: RenderTask[] = []\r\nlet isProcessingQueue = false\r\n\r\nasync function processRenderQueue() {\r\n if (isProcessingQueue) return\r\n isProcessingQueue = true\r\n\r\n while (renderQueue.length > 0) {\r\n const task = renderQueue.shift()\r\n if (task) {\r\n try {\r\n await task()\r\n } catch (err) {\r\n console.error('Mermaid render queue error:', err)\r\n }\r\n }\r\n }\r\n\r\n isProcessingQueue = false\r\n}\r\n\r\nfunction addToRenderQueue(task: RenderTask) {\r\n renderQueue.push(task)\r\n processRenderQueue()\r\n}\r\n\r\nexport function useMermaid(content: string | Ref<string>, options: UseMermaidOptionsInput = {}): UseMermaidResult {\r\n const optionsRef = computed(() => (typeof options === 'object' && 'value' in options ? options.value : options))\r\n const mermaidConfig = computed(() => ({\r\n suppressErrorRendering: true,\r\n startOnLoad: false,\r\n securityLevel: 'loose',\r\n theme: optionsRef.value.theme || 'default',\r\n ...(optionsRef.value.config || {}),\r\n }))\r\n const data = ref('')\r\n const error = ref<unknown>(null)\r\n const isLoading = ref(false)\r\n\r\n let isUnmounted = false\r\n\r\n const getRenderContainer = () => {\r\n const containerOption = optionsRef.value.container\r\n if (containerOption) {\r\n return typeof containerOption === 'object' && 'value' in containerOption ? containerOption.value : containerOption\r\n }\r\n return null\r\n }\r\n\r\n const throttledRender = throttle(\r\n () => {\r\n const contentValue = typeof content === 'string' ? content : content.value\r\n if (!contentValue?.trim()) {\r\n data.value = ''\r\n error.value = null\r\n isLoading.value = false\r\n return\r\n }\r\n\r\n isLoading.value = true\r\n\r\n addToRenderQueue(async () => {\r\n if (isUnmounted) return\r\n\r\n try {\r\n const mermaidInstance = await loadMermaid()\r\n if (!mermaidInstance) {\r\n data.value = contentValue\r\n error.value = null\r\n isLoading.value = false\r\n return\r\n }\r\n\r\n mermaidInstance.initialize(mermaidConfig.value)\r\n\r\n const isValid = await mermaidInstance.parse(contentValue.trim())\r\n if (!isValid) {\r\n data.value = ''\r\n error.value = new Error('Mermaid parse error: Invalid syntax')\r\n isLoading.value = false\r\n return\r\n }\r\n\r\n const renderId = `${optionsRef.value.id || 'mermaid'}-${Math.random().toString(36).substring(2, 11)}`\r\n const container = getRenderContainer()\r\n if (!container) {\r\n isLoading.value = false\r\n return\r\n }\r\n\r\n const { svg } = await mermaidInstance.render(renderId, contentValue, container)\r\n data.value = svg\r\n error.value = null\r\n isLoading.value = false\r\n } catch (err) {\r\n // Mermaid render error\r\n data.value = ''\r\n error.value = err\r\n isLoading.value = false\r\n }\r\n })\r\n },\r\n 100,\r\n { leading: false, trailing: true },\r\n )\r\n\r\n watch(\r\n [() => (typeof content === 'string' ? content : content.value), () => mermaidConfig.value],\r\n () => {\r\n throttledRender()\r\n },\r\n { immediate: true },\r\n )\r\n\r\n onUnmounted(() => {\r\n isUnmounted = true\r\n })\r\n\r\n return {\r\n data,\r\n error,\r\n isLoading,\r\n }\r\n}\r\n\r\nexport function useMermaidZoom(options: UseMermaidZoomOptions): MermaidZoomControls {\r\n const { container } = options\r\n\r\n const scale = ref(1)\r\n const posX = ref(0)\r\n const posY = ref(0)\r\n const isDragging = ref(false)\r\n\r\n let removeEvents: (() => void) | null = null\r\n\r\n const getSvg = () => container.value?.querySelector('.syntax-mermaid__content svg') as HTMLElement\r\n\r\n const updateTransform = (svg: HTMLElement) => {\r\n svg.style.transformOrigin = 'center center'\r\n svg.style.transform = `translate(${posX.value}px, ${posY.value}px) scale(${scale.value})`\r\n }\r\n\r\n const resetState = () => {\r\n scale.value = 1\r\n posX.value = 0\r\n posY.value = 0\r\n isDragging.value = false\r\n }\r\n\r\n const addInteractionEvents = (containerEl: HTMLElement) => {\r\n let startX = 0\r\n let startY = 0\r\n let isInteractingWithMermaid = false\r\n\r\n const onStart = (clientX: number, clientY: number) => {\r\n isDragging.value = true\r\n startX = clientX - posX.value\r\n startY = clientY - posY.value\r\n document.body.style.userSelect = 'none'\r\n }\r\n\r\n const onMove = (clientX: number, clientY: number) => {\r\n if (isDragging.value && isInteractingWithMermaid) {\r\n posX.value = clientX - startX\r\n posY.value = clientY - startY\r\n const svg = getSvg()\r\n if (svg) {\r\n updateTransform(svg)\r\n }\r\n }\r\n }\r\n\r\n const onEnd = () => {\r\n isDragging.value = false\r\n isInteractingWithMermaid = false\r\n document.body.style.userSelect = ''\r\n }\r\n\r\n const onMouseDown = (e: MouseEvent) => {\r\n if (e.button !== 0) return\r\n if (e.target === containerEl || containerEl.contains(e.target as Node)) {\r\n e.preventDefault()\r\n isInteractingWithMermaid = true\r\n onStart(e.clientX, e.clientY)\r\n }\r\n }\r\n\r\n const onMouseMove = (e: MouseEvent) => {\r\n if (isInteractingWithMermaid) {\r\n onMove(e.clientX, e.clientY)\r\n }\r\n }\r\n\r\n const handleWheelZoom = (e: WheelEvent) => {\r\n const svg = getSvg()\r\n if (!svg) return\r\n\r\n const containerRect = containerEl.getBoundingClientRect()\r\n const svgRect = svg.getBoundingClientRect()\r\n\r\n const mouseX = e.clientX - containerRect.left\r\n const mouseY = e.clientY - containerRect.top\r\n\r\n const svgCenterX = svgRect.left - containerRect.left + svgRect.width / 2\r\n const svgCenterY = svgRect.top - containerRect.top + svgRect.height / 2\r\n\r\n const offsetX = (mouseX - svgCenterX - posX.value) / scale.value\r\n const offsetY = (mouseY - svgCenterY - posY.value) / scale.value\r\n\r\n const delta = e.deltaY > 0 ? -0.05 : 0.05\r\n const newScale = Math.min(Math.max(scale.value + delta, 0.1), 10)\r\n\r\n if (newScale === scale.value) return\r\n\r\n scale.value = newScale\r\n\r\n posX.value = mouseX - svgCenterX - offsetX * scale.value\r\n posY.value = mouseY - svgCenterY - offsetY * scale.value\r\n\r\n updateTransform(svg)\r\n }\r\n\r\n const throttledWheelZoom = throttle(handleWheelZoom, 20, { leading: true, trailing: true })\r\n\r\n const onWheel = (e: WheelEvent) => {\r\n if (e.target === containerEl || containerEl.contains(e.target as Node)) {\r\n e.preventDefault()\r\n throttledWheelZoom(e)\r\n }\r\n }\r\n\r\n const onTouchStart = (e: TouchEvent) => {\r\n if (e.target === containerEl || containerEl.contains(e.target as Node)) {\r\n if (e.touches.length === 1) {\r\n e.preventDefault()\r\n isInteractingWithMermaid = true\r\n onStart(e.touches[0].clientX, e.touches[0].clientY)\r\n }\r\n }\r\n }\r\n\r\n const onTouchMove = (e: TouchEvent) => {\r\n if (isInteractingWithMermaid) {\r\n e.preventDefault()\r\n onMove(e.touches[0].clientX, e.touches[0].clientY)\r\n }\r\n }\r\n\r\n containerEl.addEventListener('mousedown', onMouseDown)\r\n document.addEventListener('mousemove', onMouseMove)\r\n document.addEventListener('mouseup', onEnd)\r\n containerEl.addEventListener('wheel', onWheel, { passive: false })\r\n containerEl.addEventListener('touchstart', onTouchStart, { passive: false })\r\n containerEl.addEventListener('touchmove', onTouchMove, { passive: false })\r\n document.addEventListener('touchend', onEnd)\r\n\r\n return () => {\r\n containerEl.removeEventListener('mousedown', onMouseDown)\r\n document.removeEventListener('mousemove', onMouseMove)\r\n document.removeEventListener('mouseup', onEnd)\r\n containerEl.removeEventListener('wheel', onWheel)\r\n containerEl.removeEventListener('touchstart', onTouchStart)\r\n containerEl.removeEventListener('touchmove', onTouchMove)\r\n document.removeEventListener('touchend', onEnd)\r\n document.body.style.userSelect = ''\r\n }\r\n }\r\n\r\n const zoomIn = () => {\r\n const svg = getSvg()\r\n if (svg) {\r\n scale.value = Math.min(scale.value + 0.2, 10)\r\n updateTransform(svg)\r\n }\r\n }\r\n\r\n const zoomOut = () => {\r\n const svg = getSvg()\r\n if (svg) {\r\n scale.value = Math.max(scale.value - 0.2, 0.1)\r\n updateTransform(svg)\r\n }\r\n }\r\n\r\n const reset = () => {\r\n const svg = getSvg()\r\n if (svg) {\r\n resetState()\r\n updateTransform(svg)\r\n }\r\n }\r\n\r\n const fullscreen = () => {\r\n if (!container.value) return\r\n\r\n if (document.fullscreenElement) {\r\n document.exitFullscreen()\r\n } else {\r\n container.value.requestFullscreen?.()\r\n }\r\n }\r\n\r\n const initialize = () => {\r\n if (!container.value) return\r\n\r\n resetState()\r\n\r\n removeEvents = addInteractionEvents(container.value)\r\n\r\n const svg = getSvg()\r\n if (svg) {\r\n updateTransform(svg)\r\n }\r\n }\r\n\r\n const destroy = () => {\r\n removeEvents?.()\r\n removeEvents = null\r\n resetState()\r\n }\r\n\r\n watch(\r\n () => container.value,\r\n () => {\r\n destroy()\r\n resetState()\r\n },\r\n )\r\n\r\n onUnmounted(destroy)\r\n\r\n return {\r\n zoomIn,\r\n zoomOut,\r\n reset,\r\n fullscreen,\r\n destroy,\r\n initialize,\r\n }\r\n}\r\n"],"names":["mermaidPromise","hasShownMermaidHint","mermaidAvailableCache","mermaidCheckPromise","dynamicImport","async","moduleName","importFn","Function","renderQueue","isProcessingQueue","mod","error","console","svg","svgDataUrl","encodeURIComponent","img","Image","onload","canvas","document","createElement","ctx","getContext","willReadFrequently","scale","width","height","imageSmoothingEnabled","imageSmoothingQuality","fillStyle","fillRect","drawImage","timestamp","Date","toISOString","slice","replace","toBlob","blob","url","URL","createObjectURL","link","href","download","body","appendChild","click","removeChild","revokeObjectURL","toBlobError","dataUrl","toDataURL","dataUrlError","canvasError","onerror","src","content","options","optionsRef","computed","value","mermaidConfig","suppressErrorRendering","startOnLoad","securityLevel","theme","config","data","ref","isLoading","isUnmounted","throttledRender","throttle","contentValue","trim","task","mermaidInstance","window","default","log","loadMermaid","initialize","parse","Error","renderId","id","Math","random","toString","substring","container","containerOption","getRenderContainer","render","err","push","length","shift","processRenderQueue","leading","trailing","watch","immediate","onUnmounted","posX","posY","isDragging","removeEvents","getSvg","querySelector","updateTransform","style","transformOrigin","transform","resetState","destroy","zoomIn","min","zoomOut","max","reset","fullscreen","fullscreenElement","exitFullscreen","requestFullscreen","containerEl","startX","startY","isInteractingWithMermaid","onStart","clientX","clientY","userSelect","onMove","onEnd","onMouseDown","e","button","target","contains","preventDefault","onMouseMove","throttledWheelZoom","containerRect","getBoundingClientRect","svgRect","mouseX","left","mouseY","top","svgCenterX","svgCenterY","offsetX","offsetY","delta","deltaY","newScale","onWheel","onTouchStart","touches","onTouchMove","addEventListener","passive","removeEventListener","addInteractionEvents"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"x-markdown.cjs9.js","sources":["../src/hooks/useMermaid.ts"],"sourcesContent":["import type { Ref } from 'vue'\r\nimport { throttle } from 'lodash-es'\r\nimport { computed, ref, watch, onUnmounted } from 'vue'\r\nimport type { MermaidZoomControls, UseMermaidZoomOptions, UseMermaidResult } from '../components/Mermaid/types'\r\n\r\nexport function downloadSvgAsPng(svg: string): void {\r\n if (!svg) return\r\n\r\n try {\r\n const svgDataUrl = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`\r\n const img = new Image()\r\n\r\n img.onload = () => {\r\n try {\r\n const canvas = document.createElement('canvas')\r\n const ctx = canvas.getContext('2d', { willReadFrequently: false })\r\n if (!ctx) return\r\n\r\n const scale = 2\r\n canvas.width = img.width * scale\r\n canvas.height = img.height * scale\r\n ctx.imageSmoothingEnabled = true\r\n ctx.imageSmoothingQuality = 'high'\r\n\r\n ctx.fillStyle = '#ffffff'\r\n ctx.fillRect(0, 0, canvas.width, canvas.height)\r\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height)\r\n\r\n const timestamp = new Date().toISOString().slice(0, 19).replace(/:/g, '-')\r\n\r\n try {\r\n canvas.toBlob(\r\n (blob) => {\r\n if (!blob) return\r\n const url = URL.createObjectURL(blob)\r\n const link = document.createElement('a')\r\n link.href = url\r\n link.download = `mermaid-diagram-${timestamp}.png`\r\n document.body.appendChild(link)\r\n link.click()\r\n document.body.removeChild(link)\r\n URL.revokeObjectURL(url)\r\n },\r\n 'image/png',\r\n 0.95,\r\n )\r\n } catch (toBlobError) {\r\n console.error('Failed to convert canvas to blob:', toBlobError)\r\n try {\r\n const dataUrl = canvas.toDataURL('image/png', 0.95)\r\n const link = document.createElement('a')\r\n link.href = dataUrl\r\n link.download = `mermaid-diagram-${timestamp}.png`\r\n document.body.appendChild(link)\r\n link.click()\r\n document.body.removeChild(link)\r\n } catch (dataUrlError) {\r\n console.error('Failed to convert canvas to data URL:', dataUrlError)\r\n }\r\n }\r\n } catch (canvasError) {\r\n console.error('Canvas operation failed:', canvasError)\r\n }\r\n }\r\n\r\n img.onerror = (error) => {\r\n console.error('Failed to load image:', error)\r\n }\r\n\r\n img.src = svgDataUrl\r\n } catch (error) {\r\n console.error('Failed to download SVG:', error)\r\n }\r\n}\r\n\r\ninterface UseMermaidOptions {\r\n id?: string\r\n theme?: 'default' | 'dark' | 'forest' | 'neutral' | string\r\n config?: any\r\n container?: HTMLElement | Ref<HTMLElement | null> | null\r\n}\r\n\r\ntype UseMermaidOptionsInput = UseMermaidOptions | Ref<UseMermaidOptions>\r\n\r\nlet mermaidPromise: Promise<any> | null = null\r\nlet hasShownMermaidHint = false\r\nlet mermaidAvailableCache: boolean | null = null\r\nlet mermaidCheckPromise: Promise<boolean> | null = null\r\n\r\n/**\r\n * 同步检查缓存状态(不触发检测)\r\n * @returns 缓存状态,null 表示未检测\r\n */\r\nexport function getMermaidAvailableCache(): boolean | null {\r\n return mermaidAvailableCache\r\n}\r\n\r\n/**\r\n * 检测 mermaid 是否可用(全局缓存,只检测一次)\r\n */\r\nexport async function checkMermaidAvailable(): Promise<boolean> {\r\n // 如果已经有缓存结果,直接返回\r\n if (mermaidAvailableCache !== null) {\r\n return mermaidAvailableCache\r\n }\r\n\r\n // 如果正在检测,返回检测 Promise\r\n if (mermaidCheckPromise) {\r\n return mermaidCheckPromise\r\n }\r\n\r\n // 开始检测\r\n mermaidCheckPromise = (async () => {\r\n try {\r\n // 直接使用动态导入,让 Vite 正确处理\r\n // mermaid 已在 vite.config.ts 中配置为 external,不会被打包进库\r\n const mod = await import('mermaid')\r\n mermaidAvailableCache = !!mod\r\n return mermaidAvailableCache\r\n } catch (error) {\r\n console.error('[x-markdown] Failed to load mermaid:', error)\r\n mermaidAvailableCache = false\r\n return false\r\n }\r\n })()\r\n\r\n return mermaidCheckPromise\r\n}\r\n\r\nconst showMermaidHint = () => {\r\n if (hasShownMermaidHint) return\r\n hasShownMermaidHint = true\r\n\r\n console.log(\r\n '%c[x-markdown]%c Mermaid 图表功能已降级为代码块显示',\r\n 'font-weight: bold; color: #9333ea;',\r\n 'color: #666;'\r\n )\r\n console.log(\r\n '%c如需 Mermaid 图表渲染功能,请安装:',\r\n 'color: #666; font-weight: bold;'\r\n )\r\n console.log(\r\n '%c pnpm add mermaid',\r\n 'color: #9333ea; font-family: monospace;'\r\n )\r\n console.log(\r\n '%c安装后请重启开发服务器',\r\n 'color: #999; font-size: 12px;'\r\n )\r\n}\r\n\r\nasync function loadMermaid() {\r\n if (typeof window === 'undefined') return null\r\n if (!mermaidPromise) {\r\n mermaidPromise = (async () => {\r\n try {\r\n // 直接使用动态导入,让 Vite 正确处理\r\n const mod = await import('mermaid')\r\n return (mod as any)?.default\r\n } catch (error) {\r\n console.error('[x-markdown] Failed to load mermaid:', error)\r\n showMermaidHint()\r\n return null\r\n }\r\n })()\r\n }\r\n return mermaidPromise\r\n}\r\n\r\ntype RenderTask = () => Promise<void>\r\nconst renderQueue: RenderTask[] = []\r\nlet isProcessingQueue = false\r\n\r\nasync function processRenderQueue() {\r\n if (isProcessingQueue) return\r\n isProcessingQueue = true\r\n\r\n while (renderQueue.length > 0) {\r\n const task = renderQueue.shift()\r\n if (task) {\r\n try {\r\n await task()\r\n } catch (err) {\r\n console.error('Mermaid render queue error:', err)\r\n }\r\n }\r\n }\r\n\r\n isProcessingQueue = false\r\n}\r\n\r\nfunction addToRenderQueue(task: RenderTask) {\r\n renderQueue.push(task)\r\n processRenderQueue()\r\n}\r\n\r\nexport function useMermaid(content: string | Ref<string>, options: UseMermaidOptionsInput = {}): UseMermaidResult {\r\n const optionsRef = computed(() => (typeof options === 'object' && 'value' in options ? options.value : options))\r\n const mermaidConfig = computed(() => ({\r\n suppressErrorRendering: true,\r\n startOnLoad: false,\r\n securityLevel: 'loose',\r\n theme: optionsRef.value.theme || 'default',\r\n ...(optionsRef.value.config || {}),\r\n }))\r\n const data = ref('')\r\n const error = ref<unknown>(null)\r\n const isLoading = ref(false)\r\n\r\n let isUnmounted = false\r\n\r\n const getRenderContainer = () => {\r\n const containerOption = optionsRef.value.container\r\n if (containerOption) {\r\n return typeof containerOption === 'object' && 'value' in containerOption ? containerOption.value : containerOption\r\n }\r\n return null\r\n }\r\n\r\n const throttledRender = throttle(\r\n () => {\r\n const contentValue = typeof content === 'string' ? content : content.value\r\n if (!contentValue?.trim()) {\r\n data.value = ''\r\n error.value = null\r\n isLoading.value = false\r\n return\r\n }\r\n\r\n isLoading.value = true\r\n\r\n addToRenderQueue(async () => {\r\n if (isUnmounted) return\r\n\r\n try {\r\n const mermaidInstance = await loadMermaid()\r\n if (!mermaidInstance) {\r\n data.value = contentValue\r\n error.value = null\r\n isLoading.value = false\r\n return\r\n }\r\n\r\n mermaidInstance.initialize(mermaidConfig.value)\r\n\r\n const isValid = await mermaidInstance.parse(contentValue.trim())\r\n if (!isValid) {\r\n data.value = ''\r\n error.value = new Error('Mermaid parse error: Invalid syntax')\r\n isLoading.value = false\r\n return\r\n }\r\n\r\n const renderId = `${optionsRef.value.id || 'mermaid'}-${Math.random().toString(36).substring(2, 11)}`\r\n const container = getRenderContainer()\r\n if (!container) {\r\n isLoading.value = false\r\n return\r\n }\r\n\r\n const { svg } = await mermaidInstance.render(renderId, contentValue, container)\r\n data.value = svg\r\n error.value = null\r\n isLoading.value = false\r\n } catch (err) {\r\n // Mermaid render error\r\n data.value = ''\r\n error.value = err\r\n isLoading.value = false\r\n }\r\n })\r\n },\r\n 100,\r\n { leading: false, trailing: true },\r\n )\r\n\r\n watch(\r\n [() => (typeof content === 'string' ? content : content.value), () => mermaidConfig.value],\r\n () => {\r\n throttledRender()\r\n },\r\n { immediate: true },\r\n )\r\n\r\n onUnmounted(() => {\r\n isUnmounted = true\r\n })\r\n\r\n return {\r\n data,\r\n error,\r\n isLoading,\r\n }\r\n}\r\n\r\nexport function useMermaidZoom(options: UseMermaidZoomOptions): MermaidZoomControls {\r\n const { container } = options\r\n\r\n const scale = ref(1)\r\n const posX = ref(0)\r\n const posY = ref(0)\r\n const isDragging = ref(false)\r\n\r\n let removeEvents: (() => void) | null = null\r\n\r\n const getSvg = () => container.value?.querySelector('.syntax-mermaid__content svg') as HTMLElement\r\n\r\n const updateTransform = (svg: HTMLElement) => {\r\n svg.style.transformOrigin = 'center center'\r\n svg.style.transform = `translate(${posX.value}px, ${posY.value}px) scale(${scale.value})`\r\n }\r\n\r\n const resetState = () => {\r\n scale.value = 1\r\n posX.value = 0\r\n posY.value = 0\r\n isDragging.value = false\r\n }\r\n\r\n const addInteractionEvents = (containerEl: HTMLElement) => {\r\n let startX = 0\r\n let startY = 0\r\n let isInteractingWithMermaid = false\r\n\r\n const onStart = (clientX: number, clientY: number) => {\r\n isDragging.value = true\r\n startX = clientX - posX.value\r\n startY = clientY - posY.value\r\n document.body.style.userSelect = 'none'\r\n }\r\n\r\n const onMove = (clientX: number, clientY: number) => {\r\n if (isDragging.value && isInteractingWithMermaid) {\r\n posX.value = clientX - startX\r\n posY.value = clientY - startY\r\n const svg = getSvg()\r\n if (svg) {\r\n updateTransform(svg)\r\n }\r\n }\r\n }\r\n\r\n const onEnd = () => {\r\n isDragging.value = false\r\n isInteractingWithMermaid = false\r\n document.body.style.userSelect = ''\r\n }\r\n\r\n const onMouseDown = (e: MouseEvent) => {\r\n if (e.button !== 0) return\r\n if (e.target === containerEl || containerEl.contains(e.target as Node)) {\r\n e.preventDefault()\r\n isInteractingWithMermaid = true\r\n onStart(e.clientX, e.clientY)\r\n }\r\n }\r\n\r\n const onMouseMove = (e: MouseEvent) => {\r\n if (isInteractingWithMermaid) {\r\n onMove(e.clientX, e.clientY)\r\n }\r\n }\r\n\r\n const handleWheelZoom = (e: WheelEvent) => {\r\n const svg = getSvg()\r\n if (!svg) return\r\n\r\n const containerRect = containerEl.getBoundingClientRect()\r\n const svgRect = svg.getBoundingClientRect()\r\n\r\n const mouseX = e.clientX - containerRect.left\r\n const mouseY = e.clientY - containerRect.top\r\n\r\n const svgCenterX = svgRect.left - containerRect.left + svgRect.width / 2\r\n const svgCenterY = svgRect.top - containerRect.top + svgRect.height / 2\r\n\r\n const offsetX = (mouseX - svgCenterX - posX.value) / scale.value\r\n const offsetY = (mouseY - svgCenterY - posY.value) / scale.value\r\n\r\n const delta = e.deltaY > 0 ? -0.05 : 0.05\r\n const newScale = Math.min(Math.max(scale.value + delta, 0.1), 10)\r\n\r\n if (newScale === scale.value) return\r\n\r\n scale.value = newScale\r\n\r\n posX.value = mouseX - svgCenterX - offsetX * scale.value\r\n posY.value = mouseY - svgCenterY - offsetY * scale.value\r\n\r\n updateTransform(svg)\r\n }\r\n\r\n const throttledWheelZoom = throttle(handleWheelZoom, 20, { leading: true, trailing: true })\r\n\r\n const onWheel = (e: WheelEvent) => {\r\n if (e.target === containerEl || containerEl.contains(e.target as Node)) {\r\n e.preventDefault()\r\n throttledWheelZoom(e)\r\n }\r\n }\r\n\r\n const onTouchStart = (e: TouchEvent) => {\r\n if (e.target === containerEl || containerEl.contains(e.target as Node)) {\r\n if (e.touches.length === 1) {\r\n e.preventDefault()\r\n isInteractingWithMermaid = true\r\n onStart(e.touches[0].clientX, e.touches[0].clientY)\r\n }\r\n }\r\n }\r\n\r\n const onTouchMove = (e: TouchEvent) => {\r\n if (isInteractingWithMermaid) {\r\n e.preventDefault()\r\n onMove(e.touches[0].clientX, e.touches[0].clientY)\r\n }\r\n }\r\n\r\n containerEl.addEventListener('mousedown', onMouseDown)\r\n document.addEventListener('mousemove', onMouseMove)\r\n document.addEventListener('mouseup', onEnd)\r\n containerEl.addEventListener('wheel', onWheel, { passive: false })\r\n containerEl.addEventListener('touchstart', onTouchStart, { passive: false })\r\n containerEl.addEventListener('touchmove', onTouchMove, { passive: false })\r\n document.addEventListener('touchend', onEnd)\r\n\r\n return () => {\r\n containerEl.removeEventListener('mousedown', onMouseDown)\r\n document.removeEventListener('mousemove', onMouseMove)\r\n document.removeEventListener('mouseup', onEnd)\r\n containerEl.removeEventListener('wheel', onWheel)\r\n containerEl.removeEventListener('touchstart', onTouchStart)\r\n containerEl.removeEventListener('touchmove', onTouchMove)\r\n document.removeEventListener('touchend', onEnd)\r\n document.body.style.userSelect = ''\r\n }\r\n }\r\n\r\n const zoomIn = () => {\r\n const svg = getSvg()\r\n if (svg) {\r\n scale.value = Math.min(scale.value + 0.2, 10)\r\n updateTransform(svg)\r\n }\r\n }\r\n\r\n const zoomOut = () => {\r\n const svg = getSvg()\r\n if (svg) {\r\n scale.value = Math.max(scale.value - 0.2, 0.1)\r\n updateTransform(svg)\r\n }\r\n }\r\n\r\n const reset = () => {\r\n const svg = getSvg()\r\n if (svg) {\r\n resetState()\r\n updateTransform(svg)\r\n }\r\n }\r\n\r\n const fullscreen = () => {\r\n if (!container.value) return\r\n\r\n if (document.fullscreenElement) {\r\n document.exitFullscreen()\r\n } else {\r\n container.value.requestFullscreen?.()\r\n }\r\n }\r\n\r\n const initialize = () => {\r\n if (!container.value) return\r\n\r\n resetState()\r\n\r\n removeEvents = addInteractionEvents(container.value)\r\n\r\n const svg = getSvg()\r\n if (svg) {\r\n updateTransform(svg)\r\n }\r\n }\r\n\r\n const destroy = () => {\r\n removeEvents?.()\r\n removeEvents = null\r\n resetState()\r\n }\r\n\r\n watch(\r\n () => container.value,\r\n () => {\r\n destroy()\r\n resetState()\r\n },\r\n )\r\n\r\n onUnmounted(destroy)\r\n\r\n return {\r\n zoomIn,\r\n zoomOut,\r\n reset,\r\n fullscreen,\r\n destroy,\r\n initialize,\r\n }\r\n}\r\n"],"names":["mermaidPromise","hasShownMermaidHint","mermaidAvailableCache","mermaidCheckPromise","renderQueue","isProcessingQueue","async","mod","import","error","console","svg","svgDataUrl","encodeURIComponent","img","Image","onload","canvas","document","createElement","ctx","getContext","willReadFrequently","scale","width","height","imageSmoothingEnabled","imageSmoothingQuality","fillStyle","fillRect","drawImage","timestamp","Date","toISOString","slice","replace","toBlob","blob","url","URL","createObjectURL","link","href","download","body","appendChild","click","removeChild","revokeObjectURL","toBlobError","dataUrl","toDataURL","dataUrlError","canvasError","onerror","src","content","options","optionsRef","computed","value","mermaidConfig","suppressErrorRendering","startOnLoad","securityLevel","theme","config","data","ref","isLoading","isUnmounted","throttledRender","throttle","contentValue","trim","task","mermaidInstance","window","default","log","loadMermaid","initialize","parse","Error","renderId","id","Math","random","toString","substring","container","containerOption","getRenderContainer","render","err","push","length","shift","processRenderQueue","leading","trailing","watch","immediate","onUnmounted","posX","posY","isDragging","removeEvents","getSvg","querySelector","updateTransform","style","transformOrigin","transform","resetState","destroy","zoomIn","min","zoomOut","max","reset","fullscreen","fullscreenElement","exitFullscreen","requestFullscreen","containerEl","startX","startY","isInteractingWithMermaid","onStart","clientX","clientY","userSelect","onMove","onEnd","onMouseDown","e","button","target","contains","preventDefault","onMouseMove","throttledWheelZoom","containerRect","getBoundingClientRect","svgRect","mouseX","left","mouseY","top","svgCenterX","svgCenterY","offsetX","offsetY","delta","deltaY","newScale","onWheel","onTouchStart","touches","onTouchMove","addEventListener","passive","removeEventListener","addInteractionEvents"],"mappings":"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"}
|
package/dist/x-markdown.es10.js
CHANGED
|
@@ -4,7 +4,7 @@ import remarkBreaks from "remark-breaks";
|
|
|
4
4
|
import remarkGfm from "remark-gfm";
|
|
5
5
|
import remarkMath from "remark-math";
|
|
6
6
|
import { toRefs, computed } from "vue";
|
|
7
|
-
import { rehypeAnimatedPlugin } from "./x-markdown.
|
|
7
|
+
import { rehypeAnimatedPlugin } from "./x-markdown.es15.js";
|
|
8
8
|
function usePlugins(props) {
|
|
9
9
|
const {
|
|
10
10
|
allowHtml,
|
package/dist/x-markdown.es13.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { defineComponent, h, defineAsyncComponent } from "vue";
|
|
2
|
-
import CodeBlock from "./x-markdown.
|
|
3
|
-
import CodeLine from "./x-markdown.
|
|
4
|
-
const Mermaid = defineAsyncComponent(() => import("./x-markdown.
|
|
2
|
+
import CodeBlock from "./x-markdown.es18.js";
|
|
3
|
+
import CodeLine from "./x-markdown.es19.js";
|
|
4
|
+
const Mermaid = defineAsyncComponent(() => import("./x-markdown.es17.js"));
|
|
5
5
|
const _sfc_main = defineComponent({
|
|
6
6
|
props: {
|
|
7
7
|
raw: { type: Object, default: () => ({}) },
|
package/dist/x-markdown.es14.js
CHANGED
|
@@ -1,34 +1,75 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
4
|
+
class ShikiStreamTokenizer {
|
|
5
|
+
constructor(options) {
|
|
6
|
+
__publicField(this, "options");
|
|
7
|
+
__publicField(this, "tokensStable", []);
|
|
8
|
+
__publicField(this, "tokensUnstable", []);
|
|
9
|
+
__publicField(this, "lastUnstableCodeChunk", "");
|
|
10
|
+
__publicField(this, "lastStableGrammarState");
|
|
11
|
+
this.options = options;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Enqueue a chunk of code to the buffer.
|
|
15
|
+
*/
|
|
16
|
+
async enqueue(chunk) {
|
|
17
|
+
const chunkLines = (this.lastUnstableCodeChunk + chunk).split("\n");
|
|
18
|
+
const stable = [];
|
|
19
|
+
let unstable = [];
|
|
20
|
+
const recall = this.tokensUnstable.length;
|
|
21
|
+
chunkLines.forEach((line, i) => {
|
|
22
|
+
const isLastLine = i === chunkLines.length - 1;
|
|
23
|
+
const result = this.options.highlighter.codeToTokens(line, {
|
|
24
|
+
...this.options,
|
|
25
|
+
grammarState: this.lastStableGrammarState
|
|
26
|
+
});
|
|
27
|
+
const tokens = result.tokens[0];
|
|
28
|
+
if (!isLastLine)
|
|
29
|
+
tokens.push({ content: "\n", offset: 0 });
|
|
30
|
+
if (!isLastLine) {
|
|
31
|
+
this.lastStableGrammarState = result.grammarState;
|
|
32
|
+
stable.push(...tokens);
|
|
33
|
+
} else {
|
|
34
|
+
unstable = tokens;
|
|
35
|
+
this.lastUnstableCodeChunk = line;
|
|
27
36
|
}
|
|
28
37
|
});
|
|
29
|
-
|
|
38
|
+
this.tokensStable.push(...stable);
|
|
39
|
+
this.tokensUnstable = unstable;
|
|
40
|
+
return {
|
|
41
|
+
recall,
|
|
42
|
+
stable,
|
|
43
|
+
unstable
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
close() {
|
|
47
|
+
const stable = this.tokensUnstable;
|
|
48
|
+
this.tokensUnstable = [];
|
|
49
|
+
this.lastUnstableCodeChunk = "";
|
|
50
|
+
this.lastStableGrammarState = void 0;
|
|
51
|
+
return {
|
|
52
|
+
stable
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
clear() {
|
|
56
|
+
this.tokensStable = [];
|
|
57
|
+
this.tokensUnstable = [];
|
|
58
|
+
this.lastUnstableCodeChunk = "";
|
|
59
|
+
this.lastStableGrammarState = void 0;
|
|
60
|
+
}
|
|
61
|
+
clone() {
|
|
62
|
+
const clone = new ShikiStreamTokenizer(
|
|
63
|
+
this.options
|
|
64
|
+
);
|
|
65
|
+
clone.lastUnstableCodeChunk = this.lastUnstableCodeChunk;
|
|
66
|
+
clone.tokensUnstable = this.tokensUnstable;
|
|
67
|
+
clone.tokensStable = this.tokensStable;
|
|
68
|
+
clone.lastStableGrammarState = this.lastStableGrammarState;
|
|
69
|
+
return clone;
|
|
70
|
+
}
|
|
30
71
|
}
|
|
31
72
|
export {
|
|
32
|
-
|
|
73
|
+
ShikiStreamTokenizer
|
|
33
74
|
};
|
|
34
75
|
//# sourceMappingURL=x-markdown.es14.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"x-markdown.es14.js","sources":["
|
|
1
|
+
{"version":3,"file":"x-markdown.es14.js","sources":["../../../../node_modules/.pnpm/shiki-stream@0.1.4_vue@3.5.26_typescript@5.9.3_/node_modules/shiki-stream/dist/index.mjs"],"sourcesContent":["class ShikiStreamTokenizer {\n options;\n tokensStable = [];\n tokensUnstable = [];\n lastUnstableCodeChunk = \"\";\n lastStableGrammarState;\n constructor(options) {\n this.options = options;\n }\n /**\n * Enqueue a chunk of code to the buffer.\n */\n async enqueue(chunk) {\n const chunkLines = (this.lastUnstableCodeChunk + chunk).split(\"\\n\");\n const stable = [];\n let unstable = [];\n const recall = this.tokensUnstable.length;\n chunkLines.forEach((line, i) => {\n const isLastLine = i === chunkLines.length - 1;\n const result = this.options.highlighter.codeToTokens(line, {\n ...this.options,\n grammarState: this.lastStableGrammarState\n });\n const tokens = result.tokens[0];\n if (!isLastLine)\n tokens.push({ content: \"\\n\", offset: 0 });\n if (!isLastLine) {\n this.lastStableGrammarState = result.grammarState;\n stable.push(...tokens);\n } else {\n unstable = tokens;\n this.lastUnstableCodeChunk = line;\n }\n });\n this.tokensStable.push(...stable);\n this.tokensUnstable = unstable;\n return {\n recall,\n stable,\n unstable\n };\n }\n close() {\n const stable = this.tokensUnstable;\n this.tokensUnstable = [];\n this.lastUnstableCodeChunk = \"\";\n this.lastStableGrammarState = void 0;\n return {\n stable\n };\n }\n clear() {\n this.tokensStable = [];\n this.tokensUnstable = [];\n this.lastUnstableCodeChunk = \"\";\n this.lastStableGrammarState = void 0;\n }\n clone() {\n const clone = new ShikiStreamTokenizer(\n this.options\n );\n clone.lastUnstableCodeChunk = this.lastUnstableCodeChunk;\n clone.tokensUnstable = this.tokensUnstable;\n clone.tokensStable = this.tokensStable;\n clone.lastStableGrammarState = this.lastStableGrammarState;\n return clone;\n }\n}\n\nclass CodeToTokenTransformStream extends TransformStream {\n tokenizer;\n options;\n constructor(options) {\n const tokenizer = new ShikiStreamTokenizer(options);\n const {\n allowRecalls = false\n } = options;\n super({\n async transform(chunk, controller) {\n const { stable, unstable: buffer, recall } = await tokenizer.enqueue(chunk);\n if (allowRecalls && recall > 0) {\n controller.enqueue({ recall });\n }\n for (const token of stable) {\n controller.enqueue(token);\n }\n if (allowRecalls) {\n for (const token of buffer) {\n controller.enqueue(token);\n }\n }\n },\n async flush(controller) {\n const { stable } = tokenizer.close();\n if (!allowRecalls) {\n for (const token of stable) {\n controller.enqueue(token);\n }\n }\n }\n });\n this.tokenizer = tokenizer;\n this.options = options;\n }\n}\n\nexport { CodeToTokenTransformStream, ShikiStreamTokenizer };\n"],"names":[],"mappings":";;;AAAA,MAAM,qBAAqB;AAAA,EAMzB,YAAY,SAAS;AALrB;AACA,wCAAe,CAAA;AACf,0CAAiB,CAAA;AACjB,iDAAwB;AACxB;AAEE,SAAK,UAAU;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAIA,MAAM,QAAQ,OAAO;AACnB,UAAM,cAAc,KAAK,wBAAwB,OAAO,MAAM,IAAI;AAClE,UAAM,SAAS,CAAA;AACf,QAAI,WAAW,CAAA;AACf,UAAM,SAAS,KAAK,eAAe;AACnC,eAAW,QAAQ,CAAC,MAAM,MAAM;AAC9B,YAAM,aAAa,MAAM,WAAW,SAAS;AAC7C,YAAM,SAAS,KAAK,QAAQ,YAAY,aAAa,MAAM;AAAA,QACzD,GAAG,KAAK;AAAA,QACR,cAAc,KAAK;AAAA,MAC3B,CAAO;AACD,YAAM,SAAS,OAAO,OAAO,CAAC;AAC9B,UAAI,CAAC;AACH,eAAO,KAAK,EAAE,SAAS,MAAM,QAAQ,GAAG;AAC1C,UAAI,CAAC,YAAY;AACf,aAAK,yBAAyB,OAAO;AACrC,eAAO,KAAK,GAAG,MAAM;AAAA,MACvB,OAAO;AACL,mBAAW;AACX,aAAK,wBAAwB;AAAA,MAC/B;AAAA,IACF,CAAC;AACD,SAAK,aAAa,KAAK,GAAG,MAAM;AAChC,SAAK,iBAAiB;AACtB,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IACN;AAAA,EACE;AAAA,EACA,QAAQ;AACN,UAAM,SAAS,KAAK;AACpB,SAAK,iBAAiB,CAAA;AACtB,SAAK,wBAAwB;AAC7B,SAAK,yBAAyB;AAC9B,WAAO;AAAA,MACL;AAAA,IACN;AAAA,EACE;AAAA,EACA,QAAQ;AACN,SAAK,eAAe,CAAA;AACpB,SAAK,iBAAiB,CAAA;AACtB,SAAK,wBAAwB;AAC7B,SAAK,yBAAyB;AAAA,EAChC;AAAA,EACA,QAAQ;AACN,UAAM,QAAQ,IAAI;AAAA,MAChB,KAAK;AAAA,IACX;AACI,UAAM,wBAAwB,KAAK;AACnC,UAAM,iBAAiB,KAAK;AAC5B,UAAM,eAAe,KAAK;AAC1B,UAAM,yBAAyB,KAAK;AACpC,WAAO;AAAA,EACT;AACF;","x_google_ignoreList":[0]}
|
package/dist/x-markdown.es15.js
CHANGED
|
@@ -1,5 +1,34 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { visit } from "unist-util-visit";
|
|
2
|
+
function rehypeAnimatedPlugin() {
|
|
3
|
+
return (tree) => {
|
|
4
|
+
visit(tree, "element", (node) => {
|
|
5
|
+
if (["p", "h1", "h2", "h3", "h4", "h5", "h6", "li", "strong", "th", "td"].includes(node.tagName) && node.children) {
|
|
6
|
+
const newChildren = [];
|
|
7
|
+
for (const child of node.children) {
|
|
8
|
+
if (child.type === "text") {
|
|
9
|
+
const segmenter = new Intl.Segmenter("zh", { granularity: "word" });
|
|
10
|
+
const segments = segmenter.segment(child.value);
|
|
11
|
+
const words = [...segments].map((segment) => segment.segment).filter(Boolean);
|
|
12
|
+
words.forEach((word) => {
|
|
13
|
+
newChildren.push({
|
|
14
|
+
children: [{ type: "text", value: word }],
|
|
15
|
+
properties: {
|
|
16
|
+
className: "x-md-animated-word"
|
|
17
|
+
},
|
|
18
|
+
tagName: "span",
|
|
19
|
+
type: "element"
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
} else {
|
|
23
|
+
newChildren.push(child);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
node.children = newChildren;
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
};
|
|
30
|
+
}
|
|
2
31
|
export {
|
|
3
|
-
|
|
32
|
+
rehypeAnimatedPlugin
|
|
4
33
|
};
|
|
5
34
|
//# sourceMappingURL=x-markdown.es15.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"x-markdown.es15.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
1
|
+
{"version":3,"file":"x-markdown.es15.js","sources":["../src/plugins/rehypePlugin.ts"],"sourcesContent":["// Copyright (c) 2025 Bytedance Ltd. and/or its affiliates\r\n// SPDX-License-Identifier: MIT\r\nimport type { Element, ElementContent, Root } from 'hast'\r\nimport type { BuildVisitor } from 'unist-util-visit'\r\nimport { visit } from 'unist-util-visit'\r\n\r\nexport function rehypeAnimatedPlugin() {\r\n return (tree: Root) => {\r\n visit(tree, 'element', ((node: Element) => {\r\n if (\r\n ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'li', 'strong', 'th', 'td'].includes(node.tagName) &&\r\n node.children\r\n ) {\r\n const newChildren: Array<ElementContent> = []\r\n for (const child of node.children) {\r\n if (child.type === 'text') {\r\n // @ts-expect-error Segmenter is not available in all environments\r\n const segmenter = new Intl.Segmenter('zh', { granularity: 'word' })\r\n const segments = segmenter.segment(child.value)\r\n const words = [...segments].map((segment) => segment.segment).filter(Boolean)\r\n words.forEach((word: string) => {\r\n newChildren.push({\r\n children: [{ type: 'text', value: word }],\r\n properties: {\r\n className: 'x-md-animated-word',\r\n },\r\n tagName: 'span',\r\n type: 'element',\r\n })\r\n })\r\n } else {\r\n newChildren.push(child)\r\n }\r\n }\r\n node.children = newChildren\r\n }\r\n }) as BuildVisitor<Root, 'element'>)\r\n }\r\n}\r\n"],"names":[],"mappings":";AAMO,SAAS,uBAAuB;AACrC,SAAO,CAAC,SAAe;AACrB,UAAM,MAAM,WAAY,CAAC,SAAkB;AACzC,UACE,CAAC,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,UAAU,MAAM,IAAI,EAAE,SAAS,KAAK,OAAO,KAC3F,KAAK,UACL;AACA,cAAM,cAAqC,CAAA;AAC3C,mBAAW,SAAS,KAAK,UAAU;AACjC,cAAI,MAAM,SAAS,QAAQ;AAEzB,kBAAM,YAAY,IAAI,KAAK,UAAU,MAAM,EAAE,aAAa,QAAQ;AAClE,kBAAM,WAAW,UAAU,QAAQ,MAAM,KAAK;AAC9C,kBAAM,QAAQ,CAAC,GAAG,QAAQ,EAAE,IAAI,CAAC,YAAY,QAAQ,OAAO,EAAE,OAAO,OAAO;AAC5E,kBAAM,QAAQ,CAAC,SAAiB;AAC9B,0BAAY,KAAK;AAAA,gBACf,UAAU,CAAC,EAAE,MAAM,QAAQ,OAAO,MAAM;AAAA,gBACxC,YAAY;AAAA,kBACV,WAAW;AAAA,gBAAA;AAAA,gBAEb,SAAS;AAAA,gBACT,MAAM;AAAA,cAAA,CACP;AAAA,YACH,CAAC;AAAA,UACH,OAAO;AACL,wBAAY,KAAK,KAAK;AAAA,UACxB;AAAA,QACF;AACA,aAAK,WAAW;AAAA,MAClB;AAAA,IACF,CAAmC;AAAA,EACrC;AACF;"}
|
package/dist/x-markdown.es16.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"x-markdown.es16.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"x-markdown.es16.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
package/dist/x-markdown.es17.js
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
import _sfc_main from "./x-markdown.
|
|
1
|
+
import _sfc_main from "./x-markdown.es25.js";
|
|
2
2
|
/* empty css */
|
|
3
|
-
import _export_sfc from "./x-markdown.es21.js";
|
|
4
|
-
const CodeBlock = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-8b0fb0b9"]]);
|
|
5
3
|
export {
|
|
6
|
-
|
|
4
|
+
_sfc_main as default
|
|
7
5
|
};
|
|
8
6
|
//# sourceMappingURL=x-markdown.es17.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"x-markdown.es17.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"x-markdown.es17.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
|
package/dist/x-markdown.es18.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import _sfc_main from "./x-markdown.
|
|
1
|
+
import _sfc_main from "./x-markdown.es20.js";
|
|
2
2
|
/* empty css */
|
|
3
|
-
import _export_sfc from "./x-markdown.
|
|
4
|
-
const
|
|
3
|
+
import _export_sfc from "./x-markdown.es22.js";
|
|
4
|
+
const CodeBlock = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-8b0fb0b9"]]);
|
|
5
5
|
export {
|
|
6
|
-
|
|
6
|
+
CodeBlock as default
|
|
7
7
|
};
|
|
8
8
|
//# sourceMappingURL=x-markdown.es18.js.map
|
package/dist/x-markdown.es19.js
CHANGED
|
@@ -1,207 +1,8 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
import
|
|
4
|
-
const
|
|
5
|
-
const _hoisted_2 = { class: "x-md-code-header__left" };
|
|
6
|
-
const _hoisted_3 = ["title"];
|
|
7
|
-
const _hoisted_4 = { class: "x-md-code-lang" };
|
|
8
|
-
const _hoisted_5 = { class: "x-md-code-header__right" };
|
|
9
|
-
const _hoisted_6 = ["title", "disabled", "onClick"];
|
|
10
|
-
const _hoisted_7 = {
|
|
11
|
-
key: 0,
|
|
12
|
-
class: "x-md-copy-icon",
|
|
13
|
-
width: "16",
|
|
14
|
-
height: "16",
|
|
15
|
-
xmlns: "http://www.w3.org/2000/svg",
|
|
16
|
-
viewBox: "0 0 1024 1024"
|
|
17
|
-
};
|
|
18
|
-
const _hoisted_8 = {
|
|
19
|
-
key: 1,
|
|
20
|
-
class: "x-md-copy-icon",
|
|
21
|
-
width: "16",
|
|
22
|
-
height: "16",
|
|
23
|
-
xmlns: "http://www.w3.org/2000/svg",
|
|
24
|
-
viewBox: "0 0 1024 1024"
|
|
25
|
-
};
|
|
26
|
-
const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
27
|
-
...{
|
|
28
|
-
name: "CodeBlock"
|
|
29
|
-
},
|
|
30
|
-
__name: "index",
|
|
31
|
-
props: {
|
|
32
|
-
code: {},
|
|
33
|
-
language: {},
|
|
34
|
-
lightTheme: { default: "vitesse-light" },
|
|
35
|
-
darkTheme: { default: "vitesse-dark" },
|
|
36
|
-
isDark: { type: Boolean, default: false },
|
|
37
|
-
colorReplacements: {},
|
|
38
|
-
codeMaxHeight: {},
|
|
39
|
-
showCodeBlockHeader: { type: Boolean, default: true },
|
|
40
|
-
enableAnimate: { type: Boolean, default: false },
|
|
41
|
-
codeBlockActions: { default: void 0 },
|
|
42
|
-
stickyCodeBlockHeader: { type: Boolean, default: true }
|
|
43
|
-
},
|
|
44
|
-
setup(__props, { expose: __expose }) {
|
|
45
|
-
const { copy, copied } = useClipboard({ copiedDuring: 2e3 });
|
|
46
|
-
const collapsed = ref(false);
|
|
47
|
-
const syntaxCodeBlockRef = ref(null);
|
|
48
|
-
const toggleCollapse = () => {
|
|
49
|
-
collapsed.value = !collapsed.value;
|
|
50
|
-
};
|
|
51
|
-
const props = __props;
|
|
52
|
-
const code = computed(() => props.code.trim());
|
|
53
|
-
const language = computed(() => props.language || "text");
|
|
54
|
-
const normalizedActions = computed(() => {
|
|
55
|
-
return props.codeBlockActions || [];
|
|
56
|
-
});
|
|
57
|
-
const filteredActions = computed(() => {
|
|
58
|
-
return normalizedActions.value.filter((action) => {
|
|
59
|
-
if (!action.show) return true;
|
|
60
|
-
return action.show(slotProps.value);
|
|
61
|
-
});
|
|
62
|
-
});
|
|
63
|
-
const slotProps = computed(() => ({
|
|
64
|
-
language: language.value,
|
|
65
|
-
code: code.value,
|
|
66
|
-
copy,
|
|
67
|
-
copied: copied.value,
|
|
68
|
-
collapsed: collapsed.value,
|
|
69
|
-
toggleCollapse
|
|
70
|
-
}));
|
|
71
|
-
function renderActionIcon(action) {
|
|
72
|
-
if (!action.icon) return null;
|
|
73
|
-
if (typeof action.icon === "string") {
|
|
74
|
-
return h("span", {
|
|
75
|
-
class: "x-md-action-icon",
|
|
76
|
-
innerHTML: action.icon
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
if (typeof action.icon === "function") {
|
|
80
|
-
try {
|
|
81
|
-
const result = action.icon(slotProps.value);
|
|
82
|
-
if (result && typeof result === "object" && "__v_isVNode" in result) {
|
|
83
|
-
return result;
|
|
84
|
-
}
|
|
85
|
-
} catch {
|
|
86
|
-
}
|
|
87
|
-
return h(action.icon);
|
|
88
|
-
}
|
|
89
|
-
return h(action.icon);
|
|
90
|
-
}
|
|
91
|
-
function handleActionClick(action) {
|
|
92
|
-
if (action.disabled) return;
|
|
93
|
-
action.onClick?.(slotProps.value);
|
|
94
|
-
}
|
|
95
|
-
__expose({
|
|
96
|
-
copy,
|
|
97
|
-
copied,
|
|
98
|
-
collapsed,
|
|
99
|
-
toggleCollapse,
|
|
100
|
-
syntaxCodeBlockRef
|
|
101
|
-
});
|
|
102
|
-
return (_ctx, _cache) => {
|
|
103
|
-
return openBlock(), createElementBlock("div", {
|
|
104
|
-
class: normalizeClass(["x-md-code-block", { "x-md-code-block--dark": props.isDark }])
|
|
105
|
-
}, [
|
|
106
|
-
__props.showCodeBlockHeader ? (openBlock(), createElementBlock("div", {
|
|
107
|
-
key: 0,
|
|
108
|
-
class: normalizeClass(["x-md-code-header-wrapper", [{ "x-md-code-header-wrapper--sticky": props.stickyCodeBlockHeader }, { "x-md-code-header-wrapper--collapsed": collapsed.value }]])
|
|
109
|
-
}, [
|
|
110
|
-
createElementVNode("div", _hoisted_1, [
|
|
111
|
-
renderSlot(_ctx.$slots, "codeHeader", {
|
|
112
|
-
language: language.value,
|
|
113
|
-
code: code.value,
|
|
114
|
-
copy: unref(copy),
|
|
115
|
-
copied: unref(copied),
|
|
116
|
-
collapsed: collapsed.value,
|
|
117
|
-
toggleCollapse
|
|
118
|
-
}, () => [
|
|
119
|
-
createElementVNode("div", _hoisted_2, [
|
|
120
|
-
createElementVNode("button", {
|
|
121
|
-
class: normalizeClass(["x-md-collapse-btn", { "x-md-collapse-btn--collapsed": collapsed.value }]),
|
|
122
|
-
onClick: toggleCollapse,
|
|
123
|
-
title: collapsed.value ? "展开代码" : "折叠代码"
|
|
124
|
-
}, [..._cache[1] || (_cache[1] = [
|
|
125
|
-
createElementVNode("svg", {
|
|
126
|
-
class: "x-md-collapse-icon",
|
|
127
|
-
viewBox: "0 0 24 24",
|
|
128
|
-
width: "14",
|
|
129
|
-
height: "14",
|
|
130
|
-
fill: "none",
|
|
131
|
-
stroke: "currentColor",
|
|
132
|
-
"stroke-width": "2",
|
|
133
|
-
"stroke-linecap": "round",
|
|
134
|
-
"stroke-linejoin": "round"
|
|
135
|
-
}, [
|
|
136
|
-
createElementVNode("polyline", { points: "6 9 12 15 18 9" })
|
|
137
|
-
], -1)
|
|
138
|
-
])], 10, _hoisted_3),
|
|
139
|
-
createElementVNode("span", _hoisted_4, toDisplayString(language.value), 1)
|
|
140
|
-
]),
|
|
141
|
-
createElementVNode("div", _hoisted_5, [
|
|
142
|
-
renderSlot(_ctx.$slots, "codeActions", {
|
|
143
|
-
code: code.value,
|
|
144
|
-
copy: unref(copy),
|
|
145
|
-
copied: unref(copied)
|
|
146
|
-
}, () => [
|
|
147
|
-
(openBlock(true), createElementBlock(Fragment, null, renderList(filteredActions.value, (action) => {
|
|
148
|
-
return openBlock(), createElementBlock("button", {
|
|
149
|
-
key: action.key,
|
|
150
|
-
class: normalizeClass(["x-md-action-btn", [action.class, { "x-md-action-btn--disabled": action.disabled }]]),
|
|
151
|
-
style: normalizeStyle(action.style),
|
|
152
|
-
title: action.title,
|
|
153
|
-
disabled: action.disabled,
|
|
154
|
-
onClick: ($event) => handleActionClick(action)
|
|
155
|
-
}, [
|
|
156
|
-
action.icon ? (openBlock(), createBlock(resolveDynamicComponent(renderActionIcon(action)), { key: 0 })) : createCommentVNode("", true)
|
|
157
|
-
], 14, _hoisted_6);
|
|
158
|
-
}), 128)),
|
|
159
|
-
createElementVNode("button", {
|
|
160
|
-
class: normalizeClass(["x-md-copy-btn", { "x-md-copy-btn--copied": unref(copied) }]),
|
|
161
|
-
onClick: _cache[0] || (_cache[0] = ($event) => unref(copy)(code.value))
|
|
162
|
-
}, [
|
|
163
|
-
unref(copied) ? (openBlock(), createElementBlock("svg", _hoisted_7, [..._cache[2] || (_cache[2] = [
|
|
164
|
-
createElementVNode("path", {
|
|
165
|
-
fill: "currentColor",
|
|
166
|
-
d: "M406.656 706.944 195.84 496.256a32 32 0 1 0-45.248 45.248l256 256 512-512a32 32 0 0 0-45.248-45.248L406.592 706.944z"
|
|
167
|
-
}, null, -1)
|
|
168
|
-
])])) : (openBlock(), createElementBlock("svg", _hoisted_8, [..._cache[3] || (_cache[3] = [
|
|
169
|
-
createElementVNode("path", {
|
|
170
|
-
fill: "currentColor",
|
|
171
|
-
d: "M768 832a128 128 0 0 1-128 128H192A128 128 0 0 1 64 832V384a128 128 0 0 1 128-128v64a64 64 0 0 0-64 64v448a64 64 0 0 0 64 64h448a64 64 0 0 0 64-64z"
|
|
172
|
-
}, null, -1),
|
|
173
|
-
createElementVNode("path", {
|
|
174
|
-
fill: "currentColor",
|
|
175
|
-
d: "M384 128a64 64 0 0 0-64 64v448a64 64 0 0 0 64 64h448a64 64 0 0 0 64-64V192a64 64 0 0 0-64-64zm0-64h448a128 128 0 0 1 128 128v448a128 128 0 0 1-128 128H384a128 128 0 0 1-128-128V192A128 128 0 0 1 384 64"
|
|
176
|
-
}, null, -1)
|
|
177
|
-
])]))
|
|
178
|
-
], 2)
|
|
179
|
-
], true)
|
|
180
|
-
])
|
|
181
|
-
], true)
|
|
182
|
-
])
|
|
183
|
-
], 2)) : createCommentVNode("", true),
|
|
184
|
-
createElementVNode("div", {
|
|
185
|
-
class: normalizeClass(["x-md-code-body", { "x-md-code-body--collapsed": collapsed.value }])
|
|
186
|
-
}, [
|
|
187
|
-
createVNode(SyntaxCodeBlock, {
|
|
188
|
-
ref_key: "syntaxCodeBlockRef",
|
|
189
|
-
ref: syntaxCodeBlockRef,
|
|
190
|
-
code: code.value,
|
|
191
|
-
language: language.value,
|
|
192
|
-
"light-theme": props.lightTheme,
|
|
193
|
-
"dark-theme": props.darkTheme,
|
|
194
|
-
"is-dark": props.isDark,
|
|
195
|
-
"color-replacements": props.colorReplacements,
|
|
196
|
-
"code-max-height": props.codeMaxHeight,
|
|
197
|
-
"enable-animate": props.enableAnimate
|
|
198
|
-
}, null, 8, ["code", "language", "light-theme", "dark-theme", "is-dark", "color-replacements", "code-max-height", "enable-animate"])
|
|
199
|
-
], 2)
|
|
200
|
-
], 2);
|
|
201
|
-
};
|
|
202
|
-
}
|
|
203
|
-
});
|
|
1
|
+
import _sfc_main from "./x-markdown.es23.js";
|
|
2
|
+
/* empty css */
|
|
3
|
+
import _export_sfc from "./x-markdown.es22.js";
|
|
4
|
+
const CodeLine = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-97166d5b"]]);
|
|
204
5
|
export {
|
|
205
|
-
|
|
6
|
+
CodeLine as default
|
|
206
7
|
};
|
|
207
8
|
//# sourceMappingURL=x-markdown.es19.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"x-markdown.es19.js","sources":["../src/components/CodeBlock/index.vue"],"sourcesContent":["<template>\r\n <div class=\"x-md-code-block\" :class=\"{ 'x-md-code-block--dark': props.isDark }\">\r\n <!-- 头部区域:支持完全自定义或默认渲染 -->\r\n <div\r\n v-if=\"showCodeBlockHeader\"\r\n class=\"x-md-code-header-wrapper\"\r\n :class=\"[{'x-md-code-header-wrapper--sticky': props.stickyCodeBlockHeader }, { 'x-md-code-header-wrapper--collapsed': collapsed }]\"\r\n >\r\n <div class=\"x-md-code-header\">\r\n <slot\r\n name=\"codeHeader\"\r\n :language=\"language\"\r\n :code=\"code\"\r\n :copy=\"copy\"\r\n :copied=\"copied\"\r\n :collapsed=\"collapsed\"\r\n :toggleCollapse=\"toggleCollapse\"\r\n >\r\n <div class=\"x-md-code-header__left\">\r\n <button\r\n class=\"x-md-collapse-btn\"\r\n :class=\"{ 'x-md-collapse-btn--collapsed': collapsed }\"\r\n @click=\"toggleCollapse\"\r\n :title=\"collapsed ? '展开代码' : '折叠代码'\"\r\n >\r\n <svg\r\n class=\"x-md-collapse-icon\"\r\n viewBox=\"0 0 24 24\"\r\n width=\"14\"\r\n height=\"14\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n >\r\n <polyline points=\"6 9 12 15 18 9\"></polyline>\r\n </svg>\r\n </button>\r\n <span class=\"x-md-code-lang\">{{ language }}</span>\r\n </div>\r\n <div class=\"x-md-code-header__right\">\r\n <slot name=\"codeActions\" :code=\"code\" :copy=\"copy\" :copied=\"copied\">\r\n <button\r\n v-for=\"action in filteredActions\"\r\n :key=\"action.key\"\r\n class=\"x-md-action-btn\"\r\n :class=\"[action.class, { 'x-md-action-btn--disabled': action.disabled }]\"\r\n :style=\"action.style\"\r\n :title=\"action.title\"\r\n :disabled=\"action.disabled\"\r\n @click=\"handleActionClick(action)\"\r\n >\r\n <component :is=\"renderActionIcon(action)\" v-if=\"action.icon\" />\r\n </button>\r\n <button class=\"x-md-copy-btn\" :class=\"{ 'x-md-copy-btn--copied': copied }\" @click=\"copy(code)\">\r\n <svg\r\n v-if=\"copied\"\r\n class=\"x-md-copy-icon\"\r\n width=\"16\"\r\n height=\"16\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 1024 1024\"\r\n >\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M406.656 706.944 195.84 496.256a32 32 0 1 0-45.248 45.248l256 256 512-512a32 32 0 0 0-45.248-45.248L406.592 706.944z\"\r\n />\r\n </svg>\r\n <svg\r\n v-else\r\n class=\"x-md-copy-icon\"\r\n width=\"16\"\r\n height=\"16\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 1024 1024\"\r\n >\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M768 832a128 128 0 0 1-128 128H192A128 128 0 0 1 64 832V384a128 128 0 0 1 128-128v64a64 64 0 0 0-64 64v448a64 64 0 0 0 64 64h448a64 64 0 0 0 64-64z\"\r\n />\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M384 128a64 64 0 0 0-64 64v448a64 64 0 0 0 64 64h448a64 64 0 0 0 64-64V192a64 64 0 0 0-64-64zm0-64h448a128 128 0 0 1 128 128v448a128 128 0 0 1-128 128H384a128 128 0 0 1-128-128V192A128 128 0 0 1 384 64\"\r\n />\r\n </svg>\r\n </button>\r\n </slot>\r\n </div>\r\n </slot>\r\n </div>\r\n </div>\r\n <div class=\"x-md-code-body\" :class=\"{ 'x-md-code-body--collapsed': collapsed }\">\r\n <SyntaxCodeBlock\r\n ref=\"syntaxCodeBlockRef\"\r\n :code=\"code\"\r\n :language=\"language\"\r\n :light-theme=\"props.lightTheme\"\r\n :dark-theme=\"props.darkTheme\"\r\n :is-dark=\"props.isDark\"\r\n :color-replacements=\"props.colorReplacements\"\r\n :code-max-height=\"props.codeMaxHeight\"\r\n :enable-animate=\"props.enableAnimate\"\r\n />\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed, ref, h, type VNode } from 'vue'\r\nimport { useClipboard } from '@vueuse/core'\r\nimport type { CodeBlockProps, CodeBlockAction, CodeBlockSlotProps } from './types'\r\nimport SyntaxCodeBlock from './SyntaxCodeBlock.vue'\r\n\r\ndefineOptions({\r\n name: 'CodeBlock',\r\n})\r\n\r\nconst { copy, copied } = useClipboard({ copiedDuring: 2000 })\r\n\r\nconst collapsed = ref(false)\r\n\r\nconst syntaxCodeBlockRef = ref<InstanceType<typeof SyntaxCodeBlock> | null>(null)\r\n\r\nconst toggleCollapse = () => {\r\n collapsed.value = !collapsed.value\r\n}\r\n\r\nconst props = withDefaults(defineProps<CodeBlockProps>(), {\r\n lightTheme: 'vitesse-light',\r\n darkTheme: 'vitesse-dark',\r\n isDark: false,\r\n showCodeBlockHeader: true,\r\n enableAnimate: false,\r\n codeBlockActions: undefined,\r\n stickyCodeBlockHeader: true,\r\n})\r\n\r\nconst code = computed(() => props.code.trim())\r\n\r\nconst language = computed(() => props.language || 'text')\r\n\r\nconst normalizedActions = computed<CodeBlockAction[]>(() => {\r\n return props.codeBlockActions || []\r\n})\r\n\r\nconst filteredActions = computed<CodeBlockAction[]>(() => {\r\n return normalizedActions.value.filter((action) => {\r\n if (!action.show) return true\r\n return action.show(slotProps.value)\r\n })\r\n})\r\n\r\nconst slotProps = computed<CodeBlockSlotProps>(() => ({\r\n language: language.value,\r\n code: code.value,\r\n copy,\r\n copied: copied.value,\r\n collapsed: collapsed.value,\r\n toggleCollapse,\r\n}))\r\n\r\nfunction renderActionIcon(action: CodeBlockAction): VNode | null {\r\n if (!action.icon) return null\r\n\r\n if (typeof action.icon === 'string') {\r\n return h('span', {\r\n class: 'x-md-action-icon',\r\n innerHTML: action.icon,\r\n })\r\n }\r\n\r\n if (typeof action.icon === 'function') {\r\n try {\r\n const result = (action.icon as (props: CodeBlockSlotProps) => VNode)(slotProps.value)\r\n if (result && typeof result === 'object' && '__v_isVNode' in result) {\r\n return result\r\n }\r\n } catch {\r\n }\r\n return h(action.icon as any)\r\n }\r\n\r\n return h(action.icon as any)\r\n}\r\n\r\nfunction handleActionClick(action: CodeBlockAction) {\r\n if (action.disabled) return\r\n action.onClick?.(slotProps.value)\r\n}\r\n\r\ndefineExpose({\r\n copy,\r\n copied,\r\n collapsed,\r\n toggleCollapse,\r\n syntaxCodeBlockRef,\r\n})\r\n</script>\r\n\r\n<style scoped>\r\n.x-md-code-block {\r\n border-radius: 8px;\r\n overflow: hidden;\r\n font-size: 0;\r\n background: rgba(0, 0, 0, 0.03);\r\n}\r\n\r\n.x-md-code-block.x-md-code-block--dark {\r\n background: rgba(255, 255, 255, 0.13);\r\n}\r\n\r\n.x-md-code-header-wrapper--sticky {\r\n background: #fff;\r\n position: sticky;\r\n top: 0;\r\n}\r\n\r\n.x-md-code-block.x-md-code-block--dark .x-md-code-header-wrapper--sticky {\r\n background: #1a1a1a;\r\n}\r\n\r\n.x-md-code-header {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n padding: 8px 16px;\r\n background: rgba(0, 0, 0, 0.05);\r\n color: #333;\r\n}\r\n\r\n.x-md-code-block .x-md-code-header-wrapper--sticky .x-md-code-header{\r\n background: rgba(235, 235, 235);\r\n border-radius: 8px 8px 0 0;\r\n}\r\n\r\n.x-md-code-block:has(.x-md-code-header-wrapper--sticky) {\r\n overflow: visible;\r\n}\r\n\r\n.x-md-code-block.x-md-code-block--dark .x-md-code-header {\r\n background: rgba(0, 0, 0, 0.25);\r\n color: #fff;\r\n}\r\n\r\n.x-md-code-block.x-md-code-block--dark .x-md-code-header-wrapper--sticky .x-md-code-header {\r\n background: rgba(44, 44, 44);\r\n}\r\n\r\n.x-md-code-block .x-md-code-header-wrapper--collapsed .x-md-code-header {\r\n border-radius: 8px;\r\n}\r\n\r\n.x-md-code-header__left,\r\n.x-md-code-header__right {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n}\r\n\r\n.x-md-code-lang {\r\n font-size: 12px;\r\n font-weight: 500;\r\n opacity: 0.6;\r\n text-transform: lowercase;\r\n}\r\n\r\n.x-md-copy-btn {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 28px;\r\n height: 28px;\r\n padding: 0;\r\n border: none;\r\n border-radius: 4px;\r\n background: transparent;\r\n color: inherit;\r\n cursor: pointer;\r\n opacity: 0.7;\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.x-md-copy-btn:hover {\r\n opacity: 1;\r\n background: rgba(0, 0, 0, 0.08);\r\n}\r\n\r\n.x-md-code-block.x-md-code-block--dark .x-md-copy-btn:hover {\r\n background: rgba(255, 255, 255, 0.1);\r\n}\r\n\r\n.x-md-copy-btn.x-md-copy-btn--copied {\r\n opacity: 1;\r\n color: #22c55e;\r\n}\r\n\r\n.x-md-copy-icon {\r\n flex-shrink: 0;\r\n}\r\n\r\n.x-md-action-btn {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 28px;\r\n height: 28px;\r\n padding: 0;\r\n border: none;\r\n border-radius: 4px;\r\n background: transparent;\r\n color: inherit;\r\n cursor: pointer;\r\n opacity: 0.7;\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.x-md-action-btn:hover {\r\n opacity: 1;\r\n background: rgba(0, 0, 0, 0.08);\r\n}\r\n\r\n.x-md-code-block.x-md-code-block--dark .x-md-action-btn:hover {\r\n background: rgba(255, 255, 255, 0.1);\r\n}\r\n\r\n.x-md-action-btn.x-md-action-btn--disabled {\r\n opacity: 0.3;\r\n cursor: not-allowed;\r\n pointer-events: none;\r\n}\r\n\r\n.x-md-action-icon {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n.x-md-action-icon :deep(svg) {\r\n width: 16px;\r\n height: 16px;\r\n flex-shrink: 0;\r\n}\r\n\r\n.x-md-collapse-btn {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 20px;\r\n height: 20px;\r\n padding: 0;\r\n border: none;\r\n border-radius: 4px;\r\n background: transparent;\r\n color: inherit;\r\n cursor: pointer;\r\n opacity: 0.5;\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.x-md-collapse-btn:hover {\r\n opacity: 1;\r\n background: rgba(0, 0, 0, 0.08);\r\n}\r\n\r\n.x-md-code-block.x-md-code-block--dark .x-md-collapse-btn:hover {\r\n background: rgba(255, 255, 255, 0.1);\r\n}\r\n\r\n.x-md-collapse-icon {\r\n transition: transform 0.2s ease;\r\n}\r\n\r\n.x-md-collapse-btn--collapsed .x-md-collapse-icon {\r\n transform: rotate(-90deg);\r\n}\r\n\r\n.x-md-code-body {\r\n overflow: hidden;\r\n transition:\r\n max-height 0.3s ease,\r\n opacity 0.2s ease;\r\n}\r\n\r\n.x-md-code-body--collapsed {\r\n max-height: 0 !important;\r\n opacity: 0;\r\n}\r\n</style>"],"names":["_createElementBlock","_normalizeClass","_createElementVNode","_renderSlot","_unref","_toDisplayString","_Fragment","_renderList","_normalizeStyle","_createBlock","_resolveDynamicComponent","_openBlock","_createVNode"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"x-markdown.es19.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|