@hejiayue/x-markdown-test 0.0.1-beta.151 → 0.0.1-beta.152
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/style.css +438 -1
- package/dist/types/config.d.ts +33 -0
- package/dist/types/hooks/useMermaid.d.ts +1 -1
- package/dist/types/index.d.ts +2 -0
- package/dist/x-markdown.cjs.js +35 -1
- package/dist/x-markdown.cjs.js.map +1 -1
- package/dist/x-markdown.cjs10.js +52 -1
- package/dist/x-markdown.cjs10.js.map +1 -1
- package/dist/x-markdown.cjs11.js +57 -1
- package/dist/x-markdown.cjs11.js.map +1 -1
- package/dist/x-markdown.cjs12.js +18 -0
- package/dist/x-markdown.cjs12.js.map +1 -0
- package/dist/x-markdown.cjs14.js +92 -1
- package/dist/x-markdown.cjs14.js.map +1 -1
- package/dist/x-markdown.cjs15.js +36 -1
- package/dist/x-markdown.cjs15.js.map +1 -1
- package/dist/x-markdown.cjs16.js +9 -1
- package/dist/x-markdown.cjs16.js.map +1 -1
- package/dist/x-markdown.cjs17.js +10 -1
- package/dist/x-markdown.cjs17.js.map +1 -1
- package/dist/x-markdown.cjs18.js +11 -1
- package/dist/x-markdown.cjs18.js.map +1 -1
- package/dist/x-markdown.cjs19.js +11 -1
- package/dist/x-markdown.cjs19.js.map +1 -1
- package/dist/x-markdown.cjs2.js +86 -1
- package/dist/x-markdown.cjs2.js.map +1 -1
- package/dist/x-markdown.cjs20.js +211 -0
- package/dist/x-markdown.cjs20.js.map +1 -0
- package/dist/x-markdown.cjs22.js +13 -1
- package/dist/x-markdown.cjs22.js.map +1 -1
- package/dist/x-markdown.cjs23.js +79 -0
- package/dist/x-markdown.cjs23.js.map +1 -0
- package/dist/x-markdown.cjs25.js +409 -0
- package/dist/x-markdown.cjs25.js.map +1 -0
- package/dist/x-markdown.cjs27.js +199 -1
- package/dist/x-markdown.cjs27.js.map +1 -1
- package/dist/x-markdown.cjs28.js +135 -1
- package/dist/x-markdown.cjs28.js.map +1 -1
- package/dist/x-markdown.cjs3.js +97 -1
- package/dist/x-markdown.cjs3.js.map +1 -1
- package/dist/x-markdown.cjs30.js +11 -1
- package/dist/x-markdown.cjs30.js.map +1 -1
- package/dist/x-markdown.cjs31.js +122 -1
- package/dist/x-markdown.cjs31.js.map +1 -1
- package/dist/x-markdown.cjs32.js +11 -0
- package/dist/x-markdown.cjs32.js.map +1 -0
- package/dist/x-markdown.cjs33.js +128 -1
- package/dist/x-markdown.cjs33.js.map +1 -1
- package/dist/x-markdown.cjs4.js +153 -1
- package/dist/x-markdown.cjs4.js.map +1 -1
- package/dist/x-markdown.cjs5.js +43 -1
- package/dist/x-markdown.cjs5.js.map +1 -1
- package/dist/x-markdown.cjs6.js +27 -1
- package/dist/x-markdown.cjs6.js.map +1 -1
- package/dist/x-markdown.cjs7.js +310 -1
- package/dist/x-markdown.cjs7.js.map +1 -1
- package/dist/x-markdown.cjs8.js +30 -1
- package/dist/x-markdown.cjs8.js.map +1 -1
- package/dist/x-markdown.cjs9.js +435 -1
- package/dist/x-markdown.cjs9.js.map +1 -1
- package/dist/x-markdown.es.js +11 -28
- package/dist/x-markdown.es10.js +10 -10
- package/dist/x-markdown.es10.js.map +1 -1
- package/dist/x-markdown.es11.js +4 -5
- package/dist/x-markdown.es11.js.map +1 -1
- package/dist/x-markdown.es12.js +12 -0
- package/dist/x-markdown.es12.js.map +1 -0
- package/dist/x-markdown.es14.js +85 -29
- package/dist/x-markdown.es14.js.map +1 -1
- package/dist/x-markdown.es15.js +32 -4
- package/dist/x-markdown.es15.js.map +1 -1
- package/dist/x-markdown.es16.js +5 -5
- package/dist/x-markdown.es16.js.map +1 -1
- package/dist/x-markdown.es17.js +5 -6
- package/dist/x-markdown.es17.js.map +1 -1
- package/dist/x-markdown.es18.js +6 -6
- package/dist/x-markdown.es18.js.map +1 -1
- package/dist/x-markdown.es19.js +7 -206
- package/dist/x-markdown.es19.js.map +1 -1
- package/dist/x-markdown.es2.js +6 -7
- package/dist/x-markdown.es2.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 -72
- 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} +12 -10
- package/dist/x-markdown.es25.js.map +1 -0
- package/dist/x-markdown.es27.js +182 -7
- package/dist/x-markdown.es27.js.map +1 -1
- package/dist/x-markdown.es28.js +7 -8
- package/dist/x-markdown.es28.js.map +1 -1
- package/dist/x-markdown.es3.js +7 -8
- package/dist/x-markdown.es3.js.map +1 -1
- package/dist/x-markdown.es30.js +7 -77
- package/dist/x-markdown.es30.js.map +1 -1
- package/dist/x-markdown.es31.js +112 -124
- package/dist/x-markdown.es31.js.map +1 -1
- package/dist/x-markdown.es32.js +7 -0
- package/dist/x-markdown.es32.js.map +1 -0
- package/dist/x-markdown.es33.js +124 -5
- package/dist/x-markdown.es33.js.map +1 -1
- package/dist/x-markdown.es4.js +5 -7
- package/dist/x-markdown.es4.js.map +1 -1
- package/dist/x-markdown.es5.js +9 -10
- package/dist/x-markdown.es5.js.map +1 -1
- package/dist/x-markdown.es6.js +5 -5
- package/dist/x-markdown.es6.js.map +1 -1
- package/dist/x-markdown.es7.js +61 -74
- package/dist/x-markdown.es7.js.map +1 -1
- package/dist/x-markdown.es8.js +4 -5
- package/dist/x-markdown.es8.js.map +1 -1
- package/dist/x-markdown.es9.js +22 -14
- package/dist/x-markdown.es9.js.map +1 -1
- package/package.json +3 -14
- package/dist/types/vite-plugin.d.ts +0 -29
- package/dist/vite-plugin.cjs +0 -128
- package/dist/vite-plugin.cjs.map +0 -1
- package/dist/vite-plugin.js +0 -128
- package/dist/vite-plugin.js.map +0 -1
- package/dist/x-markdown.cjs13.js +0 -2
- package/dist/x-markdown.cjs13.js.map +0 -1
- package/dist/x-markdown.cjs21.js +0 -2
- package/dist/x-markdown.cjs21.js.map +0 -1
- package/dist/x-markdown.cjs24.js +0 -2
- package/dist/x-markdown.cjs24.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.es13.js +0 -89
- package/dist/x-markdown.es13.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.es24.js.map +0 -1
- package/dist/x-markdown.es26.js +0 -160
- package/dist/x-markdown.es26.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"x-markdown.es9.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\n// 获取是否启用控制台提示的辅助函数\r\nconst consoleHintsEnabled = () => {\r\n if (typeof __X_MARKDOWN_CONSOLE_HINTS_ENABLED__ === 'boolean') {\r\n return __X_MARKDOWN_CONSOLE_HINTS_ENABLED__\r\n }\r\n return true // 默认启用\r\n}\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 = null\r\n\r\n/**\r\n * 显示 mermaid 安装提示\r\n */\r\nconst showMermaidHint = () => {\r\n if (hasShownMermaidHint) return\r\n if (!consoleHintsEnabled()) return\r\n\r\n hasShownMermaidHint = true\r\n\r\n console.log(\r\n '%c[x-markdown]%c 图表可选: %cpnpm add mermaid%c',\r\n 'font-weight: bold; color: #9333ea;',\r\n 'color: #666;',\r\n 'color: #9333ea; font-family: monospace;',\r\n 'color: #999;'\r\n )\r\n}\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 as Promise<boolean>\r\n }\r\n\r\n // 开始检测\r\n mermaidCheckPromise = (async () => {\r\n try {\r\n const mod = await import('mermaid')\r\n // 检查模块是否有实际的 mermaid 功能\r\n // 虚拟模块返回 { default: null },所以需要检查 default 是否存在且有效\r\n const mermaidInstance = (mod as any)?.default\r\n // 检查是否有 mermaid 的关键方法或属性\r\n const hasMermaidAPI = mermaidInstance && (\r\n typeof mermaidInstance.render === 'function' ||\r\n typeof mermaidInstance.initialize === 'function' ||\r\n typeof mermaidInstance.run === 'function'\r\n )\r\n mermaidAvailableCache = hasMermaidAPI\r\n\r\n // 当 mermaid 不可用时,显示提示\r\n if (!hasMermaidAPI) {\r\n showMermaidHint()\r\n }\r\n\r\n return mermaidAvailableCache\r\n } catch {\r\n // 静默失败,mermaid 不可用\r\n mermaidAvailableCache = false\r\n showMermaidHint()\r\n return false\r\n }\r\n })()\r\n\r\n return mermaidCheckPromise as Promise<boolean>\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 const mod = await import('mermaid')\r\n // 检查是否是虚拟模块(虚拟模块返回 { default: null })\r\n if (mod && (mod as any).default === null) {\r\n showMermaidHint()\r\n return null\r\n }\r\n \r\n const mermaidInstance = (mod as any)?.default\r\n // 检查是否有 mermaid 的关键方法,确保模块可用\r\n if (!mermaidInstance || typeof mermaidInstance.initialize !== 'function') {\r\n showMermaidHint()\r\n return null\r\n }\r\n \r\n return mermaidInstance\r\n } catch {\r\n // 静默失败,显示友好提示\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":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"x-markdown.es9.js","sources":["../src/hooks/useMermaid.ts"],"sourcesContent":["import type { Ref } from 'vue'\nimport { throttle } from 'lodash-es'\nimport { computed, ref, watch, onUnmounted } from 'vue'\nimport type { MermaidZoomControls, UseMermaidZoomOptions, UseMermaidResult } from '../components/Mermaid/types'\nimport { useXMarkdownConfig } from '../config'\n\n// 获取是否启用控制台提示的辅助函数\nconst consoleHintsEnabled = () => {\n if (typeof __X_MARKDOWN_CONSOLE_HINTS_ENABLED__ === 'boolean') {\n return __X_MARKDOWN_CONSOLE_HINTS_ENABLED__\n }\n return true // 默认启用\n}\n\nexport function downloadSvgAsPng(svg: string): void {\n if (!svg) return\n\n try {\n const svgDataUrl = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`\n const img = new Image()\n\n img.onload = () => {\n try {\n const canvas = document.createElement('canvas')\n const ctx = canvas.getContext('2d', { willReadFrequently: false })\n if (!ctx) return\n\n const scale = 2\n canvas.width = img.width * scale\n canvas.height = img.height * scale\n ctx.imageSmoothingEnabled = true\n ctx.imageSmoothingQuality = 'high'\n\n ctx.fillStyle = '#ffffff'\n ctx.fillRect(0, 0, canvas.width, canvas.height)\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height)\n\n const timestamp = new Date().toISOString().slice(0, 19).replace(/:/g, '-')\n\n try {\n canvas.toBlob(\n (blob) => {\n if (!blob) return\n const url = URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.href = url\n link.download = `mermaid-diagram-${timestamp}.png`\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n URL.revokeObjectURL(url)\n },\n 'image/png',\n 0.95,\n )\n } catch (toBlobError) {\n console.error('Failed to convert canvas to blob:', toBlobError)\n try {\n const dataUrl = canvas.toDataURL('image/png', 0.95)\n const link = document.createElement('a')\n link.href = dataUrl\n link.download = `mermaid-diagram-${timestamp}.png`\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n } catch (dataUrlError) {\n console.error('Failed to convert canvas to data URL:', dataUrlError)\n }\n }\n } catch (canvasError) {\n console.error('Canvas operation failed:', canvasError)\n }\n }\n\n img.onerror = (error) => {\n console.error('Failed to load image:', error)\n }\n\n img.src = svgDataUrl\n } catch (error) {\n console.error('Failed to download SVG:', error)\n }\n}\n\ninterface UseMermaidOptions {\n id?: string\n theme?: 'default' | 'dark' | 'forest' | 'neutral' | string\n config?: any\n container?: HTMLElement | Ref<HTMLElement | null> | null\n}\n\ntype UseMermaidOptionsInput = UseMermaidOptions | Ref<UseMermaidOptions>\n\nlet mermaidPromise: Promise<any> | null = null\nlet hasShownMermaidHint = false\nlet mermaidAvailableCache: boolean | null = null\nlet mermaidCheckPromise: Promise<boolean | null> | null = null\n\n/**\n * 显示 mermaid 安装提示\n */\nconst showMermaidHint = () => {\n if (hasShownMermaidHint) return\n if (!consoleHintsEnabled()) return\n\n hasShownMermaidHint = true\n\n console.log(\n '%c[x-markdown]%c 图表可选: %cpnpm add mermaid%c (需配置 mermaidLoader)',\n 'font-weight: bold; color: #9333ea;',\n 'color: #666;',\n 'color: #9333ea; font-family: monospace;',\n 'color: #999;',\n )\n}\n\n/**\n * 同步检查缓存状态(不触发检测)\n * @returns 缓存状态,null 表示未检测\n */\nexport function getMermaidAvailableCache(): boolean | null {\n return mermaidAvailableCache\n}\n\n/**\n * 检测 mermaid 是否可用(全局缓存,只检测一次)\n */\nexport async function checkMermaidAvailable(loader?: () => Promise<any>): Promise<boolean> {\n // 如果已经有缓存结果,直接返回\n if (mermaidAvailableCache !== null) {\n return mermaidAvailableCache\n }\n\n // 如果正在检测,返回检测 Promise\n if (mermaidCheckPromise) {\n return mermaidCheckPromise as Promise<boolean>\n }\n\n // 开始检测\n mermaidCheckPromise = (async () => {\n try {\n if (!loader) {\n mermaidAvailableCache = false\n showMermaidHint()\n return false\n }\n const mod = await loader()\n // 检查模块是否有实际的 mermaid 功能\n // 虚拟模块返回 { default: null },所以需要检查 default 是否存在且有效\n const mermaidInstance = (mod as any)?.default\n // 检查是否有 mermaid 的关键方法或属性\n const hasMermaidAPI =\n mermaidInstance &&\n (typeof mermaidInstance.render === 'function' ||\n typeof mermaidInstance.initialize === 'function' ||\n typeof mermaidInstance.run === 'function')\n mermaidAvailableCache = hasMermaidAPI\n\n // 当 mermaid 不可用时,显示提示\n if (!hasMermaidAPI) {\n showMermaidHint()\n }\n\n return mermaidAvailableCache\n } catch {\n // 静默失败,mermaid 不可用\n mermaidAvailableCache = false\n showMermaidHint()\n return false\n }\n })()\n\n return mermaidCheckPromise as Promise<boolean>\n}\n\nasync function loadMermaid(loader?: () => Promise<any>) {\n if (typeof window === 'undefined') return null\n if (!mermaidPromise) {\n mermaidPromise = (async () => {\n try {\n if (!loader) {\n showMermaidHint()\n return null\n }\n const mod = await loader()\n // 检查是否是虚拟模块(虚拟模块返回 { default: null })\n if (mod && (mod as any).default === null) {\n showMermaidHint()\n return null\n }\n\n const mermaidInstance = (mod as any)?.default\n // 检查是否有 mermaid 的关键方法,确保模块可用\n if (!mermaidInstance || typeof mermaidInstance.initialize !== 'function') {\n showMermaidHint()\n return null\n }\n\n return mermaidInstance\n } catch {\n // 静默失败,显示友好提示\n showMermaidHint()\n return null\n }\n })()\n }\n return mermaidPromise\n}\n\ntype RenderTask = () => Promise<void>\nconst renderQueue: RenderTask[] = []\nlet isProcessingQueue = false\n\nasync function processRenderQueue() {\n if (isProcessingQueue) return\n isProcessingQueue = true\n\n while (renderQueue.length > 0) {\n const task = renderQueue.shift()\n if (task) {\n try {\n await task()\n } catch (err) {\n console.error('Mermaid render queue error:', err)\n }\n }\n }\n\n isProcessingQueue = false\n}\n\nfunction addToRenderQueue(task: RenderTask) {\n renderQueue.push(task)\n processRenderQueue()\n}\n\nexport function useMermaid(content: string | Ref<string>, options: UseMermaidOptionsInput = {}): UseMermaidResult {\n const config = useXMarkdownConfig()\n const optionsRef = computed(() => (typeof options === 'object' && 'value' in options ? options.value : options))\n const mermaidConfig = computed(() => ({\n suppressErrorRendering: true,\n startOnLoad: false,\n securityLevel: 'loose',\n theme: optionsRef.value.theme || 'default',\n ...(optionsRef.value.config || {}),\n }))\n const data = ref('')\n const error = ref<unknown>(null)\n const isLoading = ref(false)\n\n let isUnmounted = false\n\n const getRenderContainer = () => {\n const containerOption = optionsRef.value.container\n if (containerOption) {\n return typeof containerOption === 'object' && 'value' in containerOption ? containerOption.value : containerOption\n }\n return null\n }\n\n const throttledRender = throttle(\n () => {\n const contentValue = typeof content === 'string' ? content : content.value\n if (!contentValue?.trim()) {\n data.value = ''\n error.value = null\n isLoading.value = false\n return\n }\n\n isLoading.value = true\n\n addToRenderQueue(async () => {\n if (isUnmounted) return\n\n try {\n const mermaidInstance = await loadMermaid(config.mermaid)\n if (!mermaidInstance) {\n data.value = contentValue\n error.value = null\n isLoading.value = false\n return\n }\n\n mermaidInstance.initialize(mermaidConfig.value)\n\n const isValid = await mermaidInstance.parse(contentValue.trim())\n if (!isValid) {\n data.value = ''\n error.value = new Error('Mermaid parse error: Invalid syntax')\n isLoading.value = false\n return\n }\n\n const renderId = `${optionsRef.value.id || 'mermaid'}-${Math.random().toString(36).substring(2, 11)}`\n const container = getRenderContainer()\n if (!container) {\n isLoading.value = false\n return\n }\n\n const { svg } = await mermaidInstance.render(renderId, contentValue, container)\n data.value = svg\n error.value = null\n isLoading.value = false\n } catch (err) {\n // Mermaid render error\n data.value = ''\n error.value = err\n isLoading.value = false\n }\n })\n },\n 100,\n { leading: false, trailing: true },\n )\n\n watch(\n [() => (typeof content === 'string' ? content : content.value), () => mermaidConfig.value],\n () => {\n throttledRender()\n },\n { immediate: true },\n )\n\n onUnmounted(() => {\n isUnmounted = true\n })\n\n return {\n data,\n error,\n isLoading,\n }\n}\n\nexport function useMermaidZoom(options: UseMermaidZoomOptions): MermaidZoomControls {\n const { container } = options\n\n const scale = ref(1)\n const posX = ref(0)\n const posY = ref(0)\n const isDragging = ref(false)\n\n let removeEvents: (() => void) | null = null\n\n const getSvg = () => container.value?.querySelector('.syntax-mermaid__content svg') as HTMLElement\n\n const updateTransform = (svg: HTMLElement) => {\n svg.style.transformOrigin = 'center center'\n svg.style.transform = `translate(${posX.value}px, ${posY.value}px) scale(${scale.value})`\n }\n\n const resetState = () => {\n scale.value = 1\n posX.value = 0\n posY.value = 0\n isDragging.value = false\n }\n\n const addInteractionEvents = (containerEl: HTMLElement) => {\n let startX = 0\n let startY = 0\n let isInteractingWithMermaid = false\n\n const onStart = (clientX: number, clientY: number) => {\n isDragging.value = true\n startX = clientX - posX.value\n startY = clientY - posY.value\n document.body.style.userSelect = 'none'\n }\n\n const onMove = (clientX: number, clientY: number) => {\n if (isDragging.value && isInteractingWithMermaid) {\n posX.value = clientX - startX\n posY.value = clientY - startY\n const svg = getSvg()\n if (svg) {\n updateTransform(svg)\n }\n }\n }\n\n const onEnd = () => {\n isDragging.value = false\n isInteractingWithMermaid = false\n document.body.style.userSelect = ''\n }\n\n const onMouseDown = (e: MouseEvent) => {\n if (e.button !== 0) return\n if (e.target === containerEl || containerEl.contains(e.target as Node)) {\n e.preventDefault()\n isInteractingWithMermaid = true\n onStart(e.clientX, e.clientY)\n }\n }\n\n const onMouseMove = (e: MouseEvent) => {\n if (isInteractingWithMermaid) {\n onMove(e.clientX, e.clientY)\n }\n }\n\n const handleWheelZoom = (e: WheelEvent) => {\n const svg = getSvg()\n if (!svg) return\n\n const containerRect = containerEl.getBoundingClientRect()\n const svgRect = svg.getBoundingClientRect()\n\n const mouseX = e.clientX - containerRect.left\n const mouseY = e.clientY - containerRect.top\n\n const svgCenterX = svgRect.left - containerRect.left + svgRect.width / 2\n const svgCenterY = svgRect.top - containerRect.top + svgRect.height / 2\n\n const offsetX = (mouseX - svgCenterX - posX.value) / scale.value\n const offsetY = (mouseY - svgCenterY - posY.value) / scale.value\n\n const delta = e.deltaY > 0 ? -0.05 : 0.05\n const newScale = Math.min(Math.max(scale.value + delta, 0.1), 10)\n\n if (newScale === scale.value) return\n\n scale.value = newScale\n\n posX.value = mouseX - svgCenterX - offsetX * scale.value\n posY.value = mouseY - svgCenterY - offsetY * scale.value\n\n updateTransform(svg)\n }\n\n const throttledWheelZoom = throttle(handleWheelZoom, 20, { leading: true, trailing: true })\n\n const onWheel = (e: WheelEvent) => {\n if (e.target === containerEl || containerEl.contains(e.target as Node)) {\n e.preventDefault()\n throttledWheelZoom(e)\n }\n }\n\n const onTouchStart = (e: TouchEvent) => {\n if (e.target === containerEl || containerEl.contains(e.target as Node)) {\n if (e.touches.length === 1) {\n e.preventDefault()\n isInteractingWithMermaid = true\n onStart(e.touches[0].clientX, e.touches[0].clientY)\n }\n }\n }\n\n const onTouchMove = (e: TouchEvent) => {\n if (isInteractingWithMermaid) {\n e.preventDefault()\n onMove(e.touches[0].clientX, e.touches[0].clientY)\n }\n }\n\n containerEl.addEventListener('mousedown', onMouseDown)\n document.addEventListener('mousemove', onMouseMove)\n document.addEventListener('mouseup', onEnd)\n containerEl.addEventListener('wheel', onWheel, { passive: false })\n containerEl.addEventListener('touchstart', onTouchStart, { passive: false })\n containerEl.addEventListener('touchmove', onTouchMove, { passive: false })\n document.addEventListener('touchend', onEnd)\n\n return () => {\n containerEl.removeEventListener('mousedown', onMouseDown)\n document.removeEventListener('mousemove', onMouseMove)\n document.removeEventListener('mouseup', onEnd)\n containerEl.removeEventListener('wheel', onWheel)\n containerEl.removeEventListener('touchstart', onTouchStart)\n containerEl.removeEventListener('touchmove', onTouchMove)\n document.removeEventListener('touchend', onEnd)\n document.body.style.userSelect = ''\n }\n }\n\n const zoomIn = () => {\n const svg = getSvg()\n if (svg) {\n scale.value = Math.min(scale.value + 0.2, 10)\n updateTransform(svg)\n }\n }\n\n const zoomOut = () => {\n const svg = getSvg()\n if (svg) {\n scale.value = Math.max(scale.value - 0.2, 0.1)\n updateTransform(svg)\n }\n }\n\n const reset = () => {\n const svg = getSvg()\n if (svg) {\n resetState()\n updateTransform(svg)\n }\n }\n\n const fullscreen = () => {\n if (!container.value) return\n\n if (document.fullscreenElement) {\n document.exitFullscreen()\n } else {\n container.value.requestFullscreen?.()\n }\n }\n\n const initialize = () => {\n if (!container.value) return\n\n resetState()\n\n removeEvents = addInteractionEvents(container.value)\n\n const svg = getSvg()\n if (svg) {\n updateTransform(svg)\n }\n }\n\n const destroy = () => {\n removeEvents?.()\n removeEvents = null\n resetState()\n }\n\n watch(\n () => container.value,\n () => {\n destroy()\n resetState()\n },\n )\n\n onUnmounted(destroy)\n\n return {\n zoomIn,\n zoomOut,\n reset,\n fullscreen,\n destroy,\n initialize,\n }\n}\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hejiayue/x-markdown-test",
|
|
3
|
-
"version": "0.0.1-beta.
|
|
3
|
+
"version": "0.0.1-beta.152",
|
|
4
4
|
"description": "A markdown component library for Vue",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/x-markdown.cjs.js",
|
|
@@ -17,17 +17,7 @@
|
|
|
17
17
|
"default": "./dist/x-markdown.cjs.js"
|
|
18
18
|
}
|
|
19
19
|
},
|
|
20
|
-
"./style": "./dist/style.css"
|
|
21
|
-
"./vite-plugin": {
|
|
22
|
-
"import": {
|
|
23
|
-
"types": "./dist/types/vite-plugin.d.ts",
|
|
24
|
-
"default": "./dist/vite-plugin.js"
|
|
25
|
-
},
|
|
26
|
-
"require": {
|
|
27
|
-
"types": "./dist/types/vite-plugin.d.ts",
|
|
28
|
-
"default": "./dist/vite-plugin.cjs"
|
|
29
|
-
}
|
|
30
|
-
}
|
|
20
|
+
"./style": "./dist/style.css"
|
|
31
21
|
},
|
|
32
22
|
"files": [
|
|
33
23
|
"dist"
|
|
@@ -39,9 +29,8 @@
|
|
|
39
29
|
],
|
|
40
30
|
"scripts": {
|
|
41
31
|
"dev": "vite",
|
|
42
|
-
"build": "pnpm build:lib &&
|
|
32
|
+
"build": "pnpm build:lib && tsc --project tsconfig.build.json",
|
|
43
33
|
"build:lib": "vite build",
|
|
44
|
-
"build:plugin": "cross-env VITE_BUILD_TARGET=vite-plugin vite build",
|
|
45
34
|
"lint": "eslint src --ext .ts,.tsx,.vue",
|
|
46
35
|
"clean": "rm -rf dist node_modules"
|
|
47
36
|
},
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import type { Plugin } from 'vite';
|
|
2
|
-
/**
|
|
3
|
-
* x-markdown Vite 插件配置选项
|
|
4
|
-
*/
|
|
5
|
-
export interface XMarkdownVitePluginOptions {
|
|
6
|
-
/**
|
|
7
|
-
* 可选依赖列表(默认:['mermaid', 'shiki', 'shiki-stream'])
|
|
8
|
-
*/
|
|
9
|
-
optionalDeps?: string[];
|
|
10
|
-
/**
|
|
11
|
-
* 是否显示控制台提示(默认:true)
|
|
12
|
-
*/
|
|
13
|
-
showConsoleHints?: boolean;
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* x-markdown Vite 插件
|
|
17
|
-
*
|
|
18
|
-
* 自动处理可选依赖(shiki、shiki-stream、mermaid)的虚拟模块配置
|
|
19
|
-
* 当这些依赖未安装时,自动映射到虚拟模块避免构建失败
|
|
20
|
-
*
|
|
21
|
-
* @param options - 插件配置选项
|
|
22
|
-
* @returns Vite 插件
|
|
23
|
-
*/
|
|
24
|
-
export declare function createXMarkdownVitePlugin(options?: XMarkdownVitePluginOptions): Plugin;
|
|
25
|
-
export default createXMarkdownVitePlugin;
|
|
26
|
-
/**
|
|
27
|
-
* 为了兼容性,也提供一个具名导出
|
|
28
|
-
*/
|
|
29
|
-
export { createXMarkdownVitePlugin as xMarkdownVitePlugin };
|
package/dist/vite-plugin.cjs
DELETED
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
3
|
-
const node_path = require("node:path");
|
|
4
|
-
const node_fs = require("node:fs");
|
|
5
|
-
const module$1 = require("module");
|
|
6
|
-
function createXMarkdownVitePlugin(options = {}) {
|
|
7
|
-
const { optionalDeps = ["mermaid", "shiki", "shiki-stream"], showConsoleHints = true } = options;
|
|
8
|
-
const VIRTUAL_PREFIX = "\0virtual:x-markdown/";
|
|
9
|
-
const virtualModuleMap = /* @__PURE__ */ new Map();
|
|
10
|
-
return {
|
|
11
|
-
name: "x-markdown-vue:vite-plugin",
|
|
12
|
-
enforce: "pre",
|
|
13
|
-
// 在其他插件之前执行
|
|
14
|
-
// 拦截模块解析,包括动态导入
|
|
15
|
-
resolveId(id) {
|
|
16
|
-
if (virtualModuleMap.has(id)) {
|
|
17
|
-
return virtualModuleMap.get(id);
|
|
18
|
-
}
|
|
19
|
-
if (id.startsWith(VIRTUAL_PREFIX)) {
|
|
20
|
-
return id;
|
|
21
|
-
}
|
|
22
|
-
return null;
|
|
23
|
-
},
|
|
24
|
-
load(id) {
|
|
25
|
-
if (id.startsWith(VIRTUAL_PREFIX)) {
|
|
26
|
-
return "export default null;";
|
|
27
|
-
}
|
|
28
|
-
},
|
|
29
|
-
configResolved() {
|
|
30
|
-
},
|
|
31
|
-
config(config) {
|
|
32
|
-
const projectRoot = process.cwd();
|
|
33
|
-
if (!config.define) {
|
|
34
|
-
config.define = {};
|
|
35
|
-
}
|
|
36
|
-
config.define.__X_MARKDOWN_CONSOLE_HINTS_ENABLED__ = JSON.stringify(showConsoleHints);
|
|
37
|
-
const optionalAliases = [];
|
|
38
|
-
const projectRequire = module$1.createRequire(node_path.resolve(projectRoot, "package.json"));
|
|
39
|
-
let declaredDeps = null;
|
|
40
|
-
try {
|
|
41
|
-
const pkgJsonPath = node_path.resolve(projectRoot, "package.json");
|
|
42
|
-
const pkgRaw = node_fs.readFileSync(pkgJsonPath, "utf-8");
|
|
43
|
-
declaredDeps = JSON.parse(pkgRaw);
|
|
44
|
-
} catch {
|
|
45
|
-
declaredDeps = null;
|
|
46
|
-
}
|
|
47
|
-
const isDeclaredInProject = (dep) => {
|
|
48
|
-
if (!declaredDeps) return false;
|
|
49
|
-
const fields = ["dependencies", "devDependencies", "optionalDependencies", "peerDependencies"];
|
|
50
|
-
const declared = fields.some((field) => Boolean(declaredDeps?.[field]?.[dep]));
|
|
51
|
-
return declared;
|
|
52
|
-
};
|
|
53
|
-
for (const dep of optionalDeps) {
|
|
54
|
-
let isInstalled = false;
|
|
55
|
-
try {
|
|
56
|
-
if (!isDeclaredInProject(dep)) {
|
|
57
|
-
isInstalled = false;
|
|
58
|
-
} else {
|
|
59
|
-
projectRequire.resolve(dep);
|
|
60
|
-
isInstalled = true;
|
|
61
|
-
}
|
|
62
|
-
} catch {
|
|
63
|
-
isInstalled = false;
|
|
64
|
-
}
|
|
65
|
-
if (!isInstalled) {
|
|
66
|
-
const virtualId = `${VIRTUAL_PREFIX}${dep}`;
|
|
67
|
-
optionalAliases.push({
|
|
68
|
-
find: dep,
|
|
69
|
-
replacement: virtualId
|
|
70
|
-
});
|
|
71
|
-
virtualModuleMap.set(dep, virtualId);
|
|
72
|
-
if (config.mode === "development") {
|
|
73
|
-
console.log(`\x1B[33m[x-markdown-vue]\x1B[0m ${dep} 未安装,使用虚拟模块`);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
if (optionalAliases.length > 0) {
|
|
78
|
-
const existingAlias = config.resolve?.alias || [];
|
|
79
|
-
let normalizedExistingAlias = [];
|
|
80
|
-
if (Array.isArray(existingAlias)) {
|
|
81
|
-
normalizedExistingAlias = existingAlias;
|
|
82
|
-
} else if (typeof existingAlias === "object") {
|
|
83
|
-
normalizedExistingAlias = Object.entries(existingAlias).map(([find, replacement]) => ({
|
|
84
|
-
find,
|
|
85
|
-
replacement
|
|
86
|
-
}));
|
|
87
|
-
}
|
|
88
|
-
config.resolve = {
|
|
89
|
-
...config.resolve,
|
|
90
|
-
alias: [...optionalAliases, ...normalizedExistingAlias]
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
|
-
const optimizeDeps = config.optimizeDeps || {};
|
|
94
|
-
const excludeDeps = optimizeDeps.exclude || [];
|
|
95
|
-
const includeDeps = optimizeDeps.include || [];
|
|
96
|
-
const filteredInclude = includeDeps.filter((dep) => {
|
|
97
|
-
try {
|
|
98
|
-
if (!isDeclaredInProject(dep)) return false;
|
|
99
|
-
projectRequire.resolve(dep);
|
|
100
|
-
return true;
|
|
101
|
-
} catch {
|
|
102
|
-
return false;
|
|
103
|
-
}
|
|
104
|
-
});
|
|
105
|
-
const newExclude = [
|
|
106
|
-
...optionalDeps.filter((dep) => {
|
|
107
|
-
try {
|
|
108
|
-
if (!isDeclaredInProject(dep)) return true;
|
|
109
|
-
projectRequire.resolve(dep);
|
|
110
|
-
return false;
|
|
111
|
-
} catch {
|
|
112
|
-
return true;
|
|
113
|
-
}
|
|
114
|
-
}),
|
|
115
|
-
...excludeDeps
|
|
116
|
-
];
|
|
117
|
-
config.optimizeDeps = {
|
|
118
|
-
...optimizeDeps,
|
|
119
|
-
include: filteredInclude,
|
|
120
|
-
exclude: [...new Set(newExclude)]
|
|
121
|
-
};
|
|
122
|
-
}
|
|
123
|
-
};
|
|
124
|
-
}
|
|
125
|
-
exports.createXMarkdownVitePlugin = createXMarkdownVitePlugin;
|
|
126
|
-
exports.default = createXMarkdownVitePlugin;
|
|
127
|
-
exports.xMarkdownVitePlugin = createXMarkdownVitePlugin;
|
|
128
|
-
//# sourceMappingURL=vite-plugin.cjs.map
|
package/dist/vite-plugin.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"vite-plugin.cjs","sources":["../src/vite-plugin.ts"],"sourcesContent":["import { resolve } from 'node:path'\nimport { readFileSync } from 'node:fs'\nimport { createRequire } from 'module'\nimport type { Plugin, UserConfig } from 'vite'\n\n/**\n * x-markdown Vite 插件配置选项\n */\nexport interface XMarkdownVitePluginOptions {\n /**\n * 可选依赖列表(默认:['mermaid', 'shiki', 'shiki-stream'])\n */\n optionalDeps?: string[]\n /**\n * 是否显示控制台提示(默认:true)\n */\n showConsoleHints?: boolean\n}\n\n/**\n * x-markdown Vite 插件\n *\n * 自动处理可选依赖(shiki、shiki-stream、mermaid)的虚拟模块配置\n * 当这些依赖未安装时,自动映射到虚拟模块避免构建失败\n *\n * @param options - 插件配置选项\n * @returns Vite 插件\n */\nexport function createXMarkdownVitePlugin(options: XMarkdownVitePluginOptions = {}): Plugin {\n const { optionalDeps = ['mermaid', 'shiki', 'shiki-stream'], showConsoleHints = true } = options\n\n const VIRTUAL_PREFIX = '\\0virtual:x-markdown/'\n const virtualModuleMap = new Map<string, string>()\n\n return {\n name: 'x-markdown-vue:vite-plugin',\n enforce: 'pre', // 在其他插件之前执行\n\n // 拦截模块解析,包括动态导入\n resolveId(id) {\n // 检查是否是我们需要处理的可选依赖\n if (virtualModuleMap.has(id)) {\n return virtualModuleMap.get(id)\n }\n if (id.startsWith(VIRTUAL_PREFIX)) {\n return id\n }\n return null\n },\n\n load(id) {\n if (id.startsWith(VIRTUAL_PREFIX)) {\n return 'export default null;'\n }\n },\n\n configResolved() {\n // console.log('[x-markdown-plugin] Final aliases:', config.resolve.alias)\n },\n config(config: UserConfig) {\n // 获取项目根目录\n const projectRoot = process.cwd()\n\n // 注入全局变量,控制是否显示控制台提示\n if (!config.define) {\n config.define = {}\n }\n config.define.__X_MARKDOWN_CONSOLE_HINTS_ENABLED__ = JSON.stringify(showConsoleHints)\n\n // 动态生成可选依赖的 alias 配置\n const optionalAliases: Array<{ find: string; replacement: string }> = []\n\n // 创建 require 函数,用于解析依赖\n const projectRequire = createRequire(resolve(projectRoot, 'package.json'))\n let declaredDeps: Record<string, any> | null = null\n try {\n const pkgJsonPath = resolve(projectRoot, 'package.json')\n const pkgRaw = readFileSync(pkgJsonPath, 'utf-8')\n declaredDeps = JSON.parse(pkgRaw)\n } catch {\n declaredDeps = null\n }\n\n const isDeclaredInProject = (dep: string) => {\n if (!declaredDeps) return false\n const fields = ['dependencies', 'devDependencies', 'optionalDependencies', 'peerDependencies'] as const\n const declared = fields.some((field) => Boolean((declaredDeps as any)?.[field]?.[dep]))\n // console.log(`[x-markdown-plugin] Check ${dep} declared: ${declared}`)\n return declared\n }\n\n for (const dep of optionalDeps) {\n let isInstalled = false\n try {\n if (!isDeclaredInProject(dep)) {\n isInstalled = false\n // console.log(`[x-markdown-plugin] ${dep} NOT declared in package.json`)\n } else {\n projectRequire.resolve(dep)\n isInstalled = true\n // console.log(`[x-markdown-plugin] ${dep} is installed and declared`)\n }\n } catch {\n isInstalled = false\n }\n\n if (!isInstalled) {\n // 依赖未安装,使用虚拟模块\n const virtualId = `${VIRTUAL_PREFIX}${dep}`\n\n // 同时添加到 alias 和 resolveId 映射\n optionalAliases.push({\n find: dep,\n replacement: virtualId,\n })\n\n // 添加到 resolveId 映射表(用于动态导入)\n virtualModuleMap.set(dep, virtualId)\n\n // 在开发环境显示提示信息\n if (config.mode === 'development') {\n console.log(`\\x1b[33m[x-markdown-vue]\\x1b[0m ${dep} 未安装,使用虚拟模块`)\n }\n }\n }\n\n // 如果有需要添加的 alias,更新配置\n if (optionalAliases.length > 0) {\n // 保留原有的 alias 配置\n const existingAlias = config.resolve?.alias || []\n\n // 规范化现有 alias 为数组格式\n let normalizedExistingAlias: Array<any> = []\n if (Array.isArray(existingAlias)) {\n normalizedExistingAlias = existingAlias\n } else if (typeof existingAlias === 'object') {\n // 对象格式转换为数组格式\n normalizedExistingAlias = Object.entries(existingAlias).map(([find, replacement]) => ({\n find,\n replacement,\n }))\n }\n\n // 合并 alias 配置\n config.resolve = {\n ...config.resolve,\n alias: [...optionalAliases, ...normalizedExistingAlias],\n }\n }\n\n // 确保 optionalDeps 不被预构建\n const optimizeDeps = config.optimizeDeps || {}\n const excludeDeps = optimizeDeps.exclude || []\n const includeDeps = optimizeDeps.include || []\n\n // 移除未安装的依赖从 include\n const filteredInclude = includeDeps.filter((dep: string) => {\n try {\n if (!isDeclaredInProject(dep)) return false\n projectRequire.resolve(dep)\n return true\n } catch {\n return false\n }\n })\n\n // 添加未安装的依赖到 exclude\n const newExclude = [\n ...optionalDeps.filter((dep) => {\n try {\n if (!isDeclaredInProject(dep)) return true\n projectRequire.resolve(dep)\n return false\n } catch {\n return true\n }\n }),\n ...excludeDeps,\n ]\n\n config.optimizeDeps = {\n ...optimizeDeps,\n include: filteredInclude,\n exclude: [...new Set(newExclude)],\n }\n },\n }\n}\n\n// 默认导出,方便使用\nexport default createXMarkdownVitePlugin\n\n/**\n * 为了兼容性,也提供一个具名导出\n */\nexport { createXMarkdownVitePlugin as xMarkdownVitePlugin }\n"],"names":["createRequire","resolve","readFileSync"],"mappings":"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"}
|
package/dist/vite-plugin.js
DELETED
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
import { resolve } from "node:path";
|
|
2
|
-
import { readFileSync } from "node:fs";
|
|
3
|
-
import { createRequire } from "module";
|
|
4
|
-
function createXMarkdownVitePlugin(options = {}) {
|
|
5
|
-
const { optionalDeps = ["mermaid", "shiki", "shiki-stream"], showConsoleHints = true } = options;
|
|
6
|
-
const VIRTUAL_PREFIX = "\0virtual:x-markdown/";
|
|
7
|
-
const virtualModuleMap = /* @__PURE__ */ new Map();
|
|
8
|
-
return {
|
|
9
|
-
name: "x-markdown-vue:vite-plugin",
|
|
10
|
-
enforce: "pre",
|
|
11
|
-
// 在其他插件之前执行
|
|
12
|
-
// 拦截模块解析,包括动态导入
|
|
13
|
-
resolveId(id) {
|
|
14
|
-
if (virtualModuleMap.has(id)) {
|
|
15
|
-
return virtualModuleMap.get(id);
|
|
16
|
-
}
|
|
17
|
-
if (id.startsWith(VIRTUAL_PREFIX)) {
|
|
18
|
-
return id;
|
|
19
|
-
}
|
|
20
|
-
return null;
|
|
21
|
-
},
|
|
22
|
-
load(id) {
|
|
23
|
-
if (id.startsWith(VIRTUAL_PREFIX)) {
|
|
24
|
-
return "export default null;";
|
|
25
|
-
}
|
|
26
|
-
},
|
|
27
|
-
configResolved() {
|
|
28
|
-
},
|
|
29
|
-
config(config) {
|
|
30
|
-
const projectRoot = process.cwd();
|
|
31
|
-
if (!config.define) {
|
|
32
|
-
config.define = {};
|
|
33
|
-
}
|
|
34
|
-
config.define.__X_MARKDOWN_CONSOLE_HINTS_ENABLED__ = JSON.stringify(showConsoleHints);
|
|
35
|
-
const optionalAliases = [];
|
|
36
|
-
const projectRequire = createRequire(resolve(projectRoot, "package.json"));
|
|
37
|
-
let declaredDeps = null;
|
|
38
|
-
try {
|
|
39
|
-
const pkgJsonPath = resolve(projectRoot, "package.json");
|
|
40
|
-
const pkgRaw = readFileSync(pkgJsonPath, "utf-8");
|
|
41
|
-
declaredDeps = JSON.parse(pkgRaw);
|
|
42
|
-
} catch {
|
|
43
|
-
declaredDeps = null;
|
|
44
|
-
}
|
|
45
|
-
const isDeclaredInProject = (dep) => {
|
|
46
|
-
if (!declaredDeps) return false;
|
|
47
|
-
const fields = ["dependencies", "devDependencies", "optionalDependencies", "peerDependencies"];
|
|
48
|
-
const declared = fields.some((field) => Boolean(declaredDeps?.[field]?.[dep]));
|
|
49
|
-
return declared;
|
|
50
|
-
};
|
|
51
|
-
for (const dep of optionalDeps) {
|
|
52
|
-
let isInstalled = false;
|
|
53
|
-
try {
|
|
54
|
-
if (!isDeclaredInProject(dep)) {
|
|
55
|
-
isInstalled = false;
|
|
56
|
-
} else {
|
|
57
|
-
projectRequire.resolve(dep);
|
|
58
|
-
isInstalled = true;
|
|
59
|
-
}
|
|
60
|
-
} catch {
|
|
61
|
-
isInstalled = false;
|
|
62
|
-
}
|
|
63
|
-
if (!isInstalled) {
|
|
64
|
-
const virtualId = `${VIRTUAL_PREFIX}${dep}`;
|
|
65
|
-
optionalAliases.push({
|
|
66
|
-
find: dep,
|
|
67
|
-
replacement: virtualId
|
|
68
|
-
});
|
|
69
|
-
virtualModuleMap.set(dep, virtualId);
|
|
70
|
-
if (config.mode === "development") {
|
|
71
|
-
console.log(`\x1B[33m[x-markdown-vue]\x1B[0m ${dep} 未安装,使用虚拟模块`);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
if (optionalAliases.length > 0) {
|
|
76
|
-
const existingAlias = config.resolve?.alias || [];
|
|
77
|
-
let normalizedExistingAlias = [];
|
|
78
|
-
if (Array.isArray(existingAlias)) {
|
|
79
|
-
normalizedExistingAlias = existingAlias;
|
|
80
|
-
} else if (typeof existingAlias === "object") {
|
|
81
|
-
normalizedExistingAlias = Object.entries(existingAlias).map(([find, replacement]) => ({
|
|
82
|
-
find,
|
|
83
|
-
replacement
|
|
84
|
-
}));
|
|
85
|
-
}
|
|
86
|
-
config.resolve = {
|
|
87
|
-
...config.resolve,
|
|
88
|
-
alias: [...optionalAliases, ...normalizedExistingAlias]
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
const optimizeDeps = config.optimizeDeps || {};
|
|
92
|
-
const excludeDeps = optimizeDeps.exclude || [];
|
|
93
|
-
const includeDeps = optimizeDeps.include || [];
|
|
94
|
-
const filteredInclude = includeDeps.filter((dep) => {
|
|
95
|
-
try {
|
|
96
|
-
if (!isDeclaredInProject(dep)) return false;
|
|
97
|
-
projectRequire.resolve(dep);
|
|
98
|
-
return true;
|
|
99
|
-
} catch {
|
|
100
|
-
return false;
|
|
101
|
-
}
|
|
102
|
-
});
|
|
103
|
-
const newExclude = [
|
|
104
|
-
...optionalDeps.filter((dep) => {
|
|
105
|
-
try {
|
|
106
|
-
if (!isDeclaredInProject(dep)) return true;
|
|
107
|
-
projectRequire.resolve(dep);
|
|
108
|
-
return false;
|
|
109
|
-
} catch {
|
|
110
|
-
return true;
|
|
111
|
-
}
|
|
112
|
-
}),
|
|
113
|
-
...excludeDeps
|
|
114
|
-
];
|
|
115
|
-
config.optimizeDeps = {
|
|
116
|
-
...optimizeDeps,
|
|
117
|
-
include: filteredInclude,
|
|
118
|
-
exclude: [...new Set(newExclude)]
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
};
|
|
122
|
-
}
|
|
123
|
-
export {
|
|
124
|
-
createXMarkdownVitePlugin,
|
|
125
|
-
createXMarkdownVitePlugin as default,
|
|
126
|
-
createXMarkdownVitePlugin as xMarkdownVitePlugin
|
|
127
|
-
};
|
|
128
|
-
//# sourceMappingURL=vite-plugin.js.map
|
package/dist/vite-plugin.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"vite-plugin.js","sources":["../src/vite-plugin.ts"],"sourcesContent":["import { resolve } from 'node:path'\nimport { readFileSync } from 'node:fs'\nimport { createRequire } from 'module'\nimport type { Plugin, UserConfig } from 'vite'\n\n/**\n * x-markdown Vite 插件配置选项\n */\nexport interface XMarkdownVitePluginOptions {\n /**\n * 可选依赖列表(默认:['mermaid', 'shiki', 'shiki-stream'])\n */\n optionalDeps?: string[]\n /**\n * 是否显示控制台提示(默认:true)\n */\n showConsoleHints?: boolean\n}\n\n/**\n * x-markdown Vite 插件\n *\n * 自动处理可选依赖(shiki、shiki-stream、mermaid)的虚拟模块配置\n * 当这些依赖未安装时,自动映射到虚拟模块避免构建失败\n *\n * @param options - 插件配置选项\n * @returns Vite 插件\n */\nexport function createXMarkdownVitePlugin(options: XMarkdownVitePluginOptions = {}): Plugin {\n const { optionalDeps = ['mermaid', 'shiki', 'shiki-stream'], showConsoleHints = true } = options\n\n const VIRTUAL_PREFIX = '\\0virtual:x-markdown/'\n const virtualModuleMap = new Map<string, string>()\n\n return {\n name: 'x-markdown-vue:vite-plugin',\n enforce: 'pre', // 在其他插件之前执行\n\n // 拦截模块解析,包括动态导入\n resolveId(id) {\n // 检查是否是我们需要处理的可选依赖\n if (virtualModuleMap.has(id)) {\n return virtualModuleMap.get(id)\n }\n if (id.startsWith(VIRTUAL_PREFIX)) {\n return id\n }\n return null\n },\n\n load(id) {\n if (id.startsWith(VIRTUAL_PREFIX)) {\n return 'export default null;'\n }\n },\n\n configResolved() {\n // console.log('[x-markdown-plugin] Final aliases:', config.resolve.alias)\n },\n config(config: UserConfig) {\n // 获取项目根目录\n const projectRoot = process.cwd()\n\n // 注入全局变量,控制是否显示控制台提示\n if (!config.define) {\n config.define = {}\n }\n config.define.__X_MARKDOWN_CONSOLE_HINTS_ENABLED__ = JSON.stringify(showConsoleHints)\n\n // 动态生成可选依赖的 alias 配置\n const optionalAliases: Array<{ find: string; replacement: string }> = []\n\n // 创建 require 函数,用于解析依赖\n const projectRequire = createRequire(resolve(projectRoot, 'package.json'))\n let declaredDeps: Record<string, any> | null = null\n try {\n const pkgJsonPath = resolve(projectRoot, 'package.json')\n const pkgRaw = readFileSync(pkgJsonPath, 'utf-8')\n declaredDeps = JSON.parse(pkgRaw)\n } catch {\n declaredDeps = null\n }\n\n const isDeclaredInProject = (dep: string) => {\n if (!declaredDeps) return false\n const fields = ['dependencies', 'devDependencies', 'optionalDependencies', 'peerDependencies'] as const\n const declared = fields.some((field) => Boolean((declaredDeps as any)?.[field]?.[dep]))\n // console.log(`[x-markdown-plugin] Check ${dep} declared: ${declared}`)\n return declared\n }\n\n for (const dep of optionalDeps) {\n let isInstalled = false\n try {\n if (!isDeclaredInProject(dep)) {\n isInstalled = false\n // console.log(`[x-markdown-plugin] ${dep} NOT declared in package.json`)\n } else {\n projectRequire.resolve(dep)\n isInstalled = true\n // console.log(`[x-markdown-plugin] ${dep} is installed and declared`)\n }\n } catch {\n isInstalled = false\n }\n\n if (!isInstalled) {\n // 依赖未安装,使用虚拟模块\n const virtualId = `${VIRTUAL_PREFIX}${dep}`\n\n // 同时添加到 alias 和 resolveId 映射\n optionalAliases.push({\n find: dep,\n replacement: virtualId,\n })\n\n // 添加到 resolveId 映射表(用于动态导入)\n virtualModuleMap.set(dep, virtualId)\n\n // 在开发环境显示提示信息\n if (config.mode === 'development') {\n console.log(`\\x1b[33m[x-markdown-vue]\\x1b[0m ${dep} 未安装,使用虚拟模块`)\n }\n }\n }\n\n // 如果有需要添加的 alias,更新配置\n if (optionalAliases.length > 0) {\n // 保留原有的 alias 配置\n const existingAlias = config.resolve?.alias || []\n\n // 规范化现有 alias 为数组格式\n let normalizedExistingAlias: Array<any> = []\n if (Array.isArray(existingAlias)) {\n normalizedExistingAlias = existingAlias\n } else if (typeof existingAlias === 'object') {\n // 对象格式转换为数组格式\n normalizedExistingAlias = Object.entries(existingAlias).map(([find, replacement]) => ({\n find,\n replacement,\n }))\n }\n\n // 合并 alias 配置\n config.resolve = {\n ...config.resolve,\n alias: [...optionalAliases, ...normalizedExistingAlias],\n }\n }\n\n // 确保 optionalDeps 不被预构建\n const optimizeDeps = config.optimizeDeps || {}\n const excludeDeps = optimizeDeps.exclude || []\n const includeDeps = optimizeDeps.include || []\n\n // 移除未安装的依赖从 include\n const filteredInclude = includeDeps.filter((dep: string) => {\n try {\n if (!isDeclaredInProject(dep)) return false\n projectRequire.resolve(dep)\n return true\n } catch {\n return false\n }\n })\n\n // 添加未安装的依赖到 exclude\n const newExclude = [\n ...optionalDeps.filter((dep) => {\n try {\n if (!isDeclaredInProject(dep)) return true\n projectRequire.resolve(dep)\n return false\n } catch {\n return true\n }\n }),\n ...excludeDeps,\n ]\n\n config.optimizeDeps = {\n ...optimizeDeps,\n include: filteredInclude,\n exclude: [...new Set(newExclude)],\n }\n },\n }\n}\n\n// 默认导出,方便使用\nexport default createXMarkdownVitePlugin\n\n/**\n * 为了兼容性,也提供一个具名导出\n */\nexport { createXMarkdownVitePlugin as xMarkdownVitePlugin }\n"],"names":[],"mappings":"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"}
|
package/dist/x-markdown.cjs13.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("vue"),t=require("./x-markdown.cjs17.js"),i=require("./x-markdown.cjs18.js"),a=e.defineAsyncComponent(()=>Promise.resolve().then(()=>require("./x-markdown.cjs16.js"))),o=e.defineComponent({props:{raw:{type:Object,default:()=>({})},codeXRender:{type:Object,default:()=>({})},isDark:{type:Boolean,default:!1},shikiTheme:{type:Array,default:()=>["vitesse-light","vitesse-dark"]},showCodeBlockHeader:{type:Boolean,default:!0},stickyCodeBlockHeader:{type:Boolean,default:!0},codeMaxHeight:{type:String,default:void 0},enableAnimate:{type:Boolean,default:!1},codeBlockActions:{type:Array,default:void 0},mermaidActions:{type:Array,default:void 0},mermaidConfig:{type:Object,default:void 0}},setup(o,{slots:r}){const{codeXRender:n}=o;return()=>{if(o.raw.inline){if(n&&n.inline){const t=n.inline;return"function"==typeof t?t(o):e.h(t,o)}return e.h(i.default,{raw:o.raw,isDark:o.isDark,shikiTheme:o.shikiTheme,enableAnimate:o.enableAnimate})}const{language:d}=o.raw;if(n&&n[d]){const t=n[d];return"function"==typeof t?t(o):e.h(t,o)}if("mermaid"===d){const t={};return Object.keys(r).forEach(e=>{e.startsWith("mermaid")&&(t[e]=r[e])}),e.h(a,{raw:o.raw,isDark:o.isDark,shikiTheme:o.shikiTheme,mermaidActions:o.mermaidActions,config:o.mermaidConfig},t)}return e.h(t.default,{code:o.raw.content||"",language:o.raw.language||"text",isDark:o.isDark,lightTheme:o.shikiTheme[0],darkTheme:o.shikiTheme[1],showCodeBlockHeader:o.showCodeBlockHeader,stickyCodeBlockHeader:o.stickyCodeBlockHeader,codeMaxHeight:o.codeMaxHeight,enableAnimate:o.enableAnimate,codeBlockActions:o.codeBlockActions},r)}}});exports.default=o;
|
|
2
|
-
//# sourceMappingURL=x-markdown.cjs13.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"x-markdown.cjs13.js","sources":["../src/components/CodeX/index.vue"],"sourcesContent":["<script lang=\"ts\">\r\nimport { defineComponent, h, type PropType, defineAsyncComponent } from 'vue'\r\nimport type { CodeBlockAction } from '../CodeBlock/types'\r\nimport type { MermaidAction } from '../Mermaid/types'\r\nimport CodeBlock from '../CodeBlock/index.vue'\r\nimport CodeLine from '../CodeLine/index.vue'\r\n// Mermaid 组件改为动态导入,实现按需加载\r\nconst Mermaid = defineAsyncComponent(() => import('../Mermaid/index.vue'))\r\n\r\nexport default defineComponent({\r\n props: {\r\n raw: { type: Object, default: () => ({}) },\r\n codeXRender: { type: Object, default: () => ({}) },\r\n isDark: { type: Boolean, default: false },\r\n shikiTheme: {\r\n type: Array as unknown as PropType<[string, string]>,\r\n default: () => ['vitesse-light', 'vitesse-dark'] as [string, string],\r\n },\r\n showCodeBlockHeader: { type: Boolean, default: true },\r\n stickyCodeBlockHeader: { type: Boolean, default: true },\r\n codeMaxHeight: { type: String, default: undefined },\r\n enableAnimate: { type: Boolean, default: false },\r\n codeBlockActions: { type: Array as PropType<CodeBlockAction[]>, default: undefined },\r\n mermaidActions: { type: Array as PropType<MermaidAction[]>, default: undefined },\r\n mermaidConfig: { type: Object as PropType<Record<string, any>>, default: undefined },\r\n },\r\n setup(props, { slots }) {\r\n const { codeXRender } = props\r\n\r\n return (): ReturnType<typeof h> | null => {\r\n // 处理行内代码\r\n if (props.raw.inline) {\r\n if (codeXRender && codeXRender.inline) {\r\n const renderer = codeXRender.inline\r\n if (typeof renderer === 'function') {\r\n return renderer(props)\r\n }\r\n return h(renderer, props)\r\n }\r\n // 传递完整的配置给 CodeLine,包括主题和动画设置\r\n return h(CodeLine, {\r\n raw: props.raw,\r\n isDark: props.isDark,\r\n shikiTheme: props.shikiTheme,\r\n enableAnimate: props.enableAnimate,\r\n })\r\n }\r\n\r\n const { language } = props.raw\r\n\r\n // 处理自定义渲染器\r\n if (codeXRender && codeXRender[language]) {\r\n const renderer = codeXRender[language]\r\n if (typeof renderer === 'function') {\r\n return renderer(props)\r\n }\r\n return h(renderer, props)\r\n }\r\n\r\n // 处理 Mermaid 图表\r\n if (language === 'mermaid') {\r\n const mermaidSlots: Record<string, any> = {}\r\n Object.keys(slots).forEach((key) => {\r\n if (key.startsWith('mermaid')) {\r\n mermaidSlots[key] = slots[key]\r\n }\r\n })\r\n\r\n return h(\r\n Mermaid,\r\n {\r\n raw: props.raw,\r\n isDark: props.isDark,\r\n shikiTheme: props.shikiTheme,\r\n mermaidActions: props.mermaidActions,\r\n config: props.mermaidConfig,\r\n },\r\n mermaidSlots,\r\n )\r\n }\r\n\r\n // 渲染标准代码块\r\n return h(\r\n CodeBlock,\r\n {\r\n code: props.raw.content || '',\r\n language: props.raw.language || 'text',\r\n isDark: props.isDark,\r\n lightTheme: props.shikiTheme[0],\r\n darkTheme: props.shikiTheme[1],\r\n showCodeBlockHeader: props.showCodeBlockHeader,\r\n stickyCodeBlockHeader: props.stickyCodeBlockHeader,\r\n codeMaxHeight: props.codeMaxHeight,\r\n enableAnimate: props.enableAnimate,\r\n codeBlockActions: props.codeBlockActions,\r\n },\r\n slots,\r\n )\r\n }\r\n },\r\n})\r\n</script>\r\n"],"names":["Mermaid","defineAsyncComponent","Promise","resolve","then","require","_sfc_main","defineComponent","props","raw","type","Object","default","codeXRender","isDark","Boolean","shikiTheme","Array","showCodeBlockHeader","stickyCodeBlockHeader","codeMaxHeight","String","enableAnimate","codeBlockActions","mermaidActions","mermaidConfig","setup","slots","inline","renderer","h","CodeLine","language","mermaidSlots","keys","forEach","key","startsWith","config","CodeBlock","code","content","lightTheme","darkTheme"],"mappings":"yMAOMA,EAAUC,EAAAA,qBAAqB,IAAMC,QAAAC,UAAAC,KAAA,IAAAC,QAAO,2BAElDC,EAAeC,kBAAgB,CAC7BC,MAAO,CACLC,IAAK,CAAEC,KAAMC,OAAQC,QAAS,KAAA,CAAO,IACrCC,YAAa,CAAEH,KAAMC,OAAQC,QAAS,KAAA,CAAO,IAC7CE,OAAQ,CAAEJ,KAAMK,QAASH,SAAS,GAClCI,WAAY,CACVN,KAAMO,MACNL,QAAS,IAAM,CAAC,gBAAiB,iBAEnCM,oBAAqB,CAAER,KAAMK,QAASH,SAAS,GAC/CO,sBAAuB,CAAET,KAAMK,QAASH,SAAS,GACjDQ,cAAe,CAAEV,KAAMW,OAAQT,aAAS,GACxCU,cAAe,CAAEZ,KAAMK,QAASH,SAAS,GACzCW,iBAAkB,CAAEb,KAAMO,MAAsCL,aAAS,GACzEY,eAAgB,CAAEd,KAAMO,MAAoCL,aAAS,GACrEa,cAAe,CAAEf,KAAMC,OAAyCC,aAAS,IAE3E,KAAAc,CAAMlB,GAAOmB,MAAEA,IACb,MAAMd,YAAEA,GAAgBL,EAExB,MAAO,KAEL,GAAIA,EAAMC,IAAImB,OAAQ,CACpB,GAAIf,GAAeA,EAAYe,OAAQ,CACrC,MAAMC,EAAWhB,EAAYe,OAC7B,MAAwB,mBAAbC,EACFA,EAASrB,GAEXsB,EAAAA,EAAED,EAAUrB,EACrB,CAEA,OAAOsB,EAAAA,EAAEC,EAAAA,QAAU,CACjBtB,IAAKD,EAAMC,IACXK,OAAQN,EAAMM,OACdE,WAAYR,EAAMQ,WAClBM,cAAed,EAAMc,eAEzB,CAEA,MAAMU,SAAEA,GAAaxB,EAAMC,IAG3B,GAAII,GAAeA,EAAYmB,GAAW,CACxC,MAAMH,EAAWhB,EAAYmB,GAC7B,MAAwB,mBAAbH,EACFA,EAASrB,GAEXsB,EAAAA,EAAED,EAAUrB,EACrB,CAGA,GAAiB,YAAbwB,EAAwB,CAC1B,MAAMC,EAAoC,CAAA,EAO1C,OANAtB,OAAOuB,KAAKP,GAAOQ,QAASC,IACtBA,EAAIC,WAAW,aACjBJ,EAAaG,GAAOT,EAAMS,MAIvBN,EAAAA,EACL9B,EACA,CACES,IAAKD,EAAMC,IACXK,OAAQN,EAAMM,OACdE,WAAYR,EAAMQ,WAClBQ,eAAgBhB,EAAMgB,eACtBc,OAAQ9B,EAAMiB,eAEhBQ,EAEJ,CAGA,OAAOH,EAAAA,EACLS,EAAAA,QACA,CACEC,KAAMhC,EAAMC,IAAIgC,SAAW,GAC3BT,SAAUxB,EAAMC,IAAIuB,UAAY,OAChClB,OAAQN,EAAMM,OACd4B,WAAYlC,EAAMQ,WAAW,GAC7B2B,UAAWnC,EAAMQ,WAAW,GAC5BE,oBAAqBV,EAAMU,oBAC3BC,sBAAuBX,EAAMW,sBAC7BC,cAAeZ,EAAMY,cACrBE,cAAed,EAAMc,cACrBC,iBAAkBf,EAAMe,kBAE1BI,GAGN"}
|
package/dist/x-markdown.cjs21.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"x-markdown.cjs21.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
package/dist/x-markdown.cjs24.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("vue"),t=require("./x-markdown.cjs26.js"),o=require("./x-markdown.cjs9.js"),a=require("./x-markdown.cjs28.js");;/* empty css */const l=require("./x-markdown.cjs17.js"),n={class:"toolbar-container"},r={class:"mermaid-toolbar"},i={class:"toolbar-left"},c={class:"segmented-control"},d={class:"toolbar-right"},s=["title","onClick"],u={key:0,width:"16",height:"16",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},m={key:1,width:"16",height:"16",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},v={class:"mermaid-source-code"},h=e.defineComponent({__name:"index",props:{isDark:{type:Boolean,default:!1},shikiTheme:{default:()=>["vitesse-light","vitesse-dark"]},config:{default:()=>({})},mermaidActions:{default:void 0},raw:{default:()=>({})}},setup(h){const k=h,w=e.ref(null),p=e.ref(!1),g=e.ref(!0),f=e.computed(()=>k.raw?.content||""),V=e.computed(()=>`mermaid-${k.raw?.key||"default"}`),C=e.computed(()=>w.value?.isLoading??!0),E=e.computed(()=>w.value?.svg??""),N=e.computed(()=>p.value?"code":"diagram");function y(e){e?.stopPropagation(),e?.preventDefault(),p.value||w.value?.zoomIn()}function b(e){e?.stopPropagation(),e?.preventDefault(),p.value||w.value?.zoomOut()}function B(e){e?.stopPropagation(),e?.preventDefault(),p.value||w.value?.reset()}function x(){p.value||w.value?.fullscreen()}function z(){p.value=!p.value}const{copy:L,copied:M}=t.useClipboard({copiedDuring:1500});function j(e){"code"!==e||p.value?"diagram"===e&&p.value&&(p.value=!1):p.value=!0}async function D(e){e?.stopPropagation(),e?.preventDefault(),M.value||k.raw.content&&await L(k.raw.content)}function P(){w.value?.download()}const S=e.computed(()=>k.mermaidActions||[]),_=e.computed(()=>S.value.filter(e=>!e.show||e.show(H.value))),H=e.computed(()=>({showSourceCode:p.value,svg:E.value,rawContent:k.raw.content||"",isLoading:C.value,copied:M.value,zoomIn:y,zoomOut:b,reset:B,fullscreen:x,toggleCode:z,copyCode:D,download:P,raw:k.raw}));function T(t){if(!t.icon)return null;if("string"==typeof t.icon)return e.h("span",{class:"mermaid-action-icon",innerHTML:t.icon});if("function"==typeof t.icon){try{const e=t.icon(H.value);if(e&&"object"==typeof e&&"__v_isVNode"in e)return e}catch{}return e.h(t.icon)}return e.h(t.icon)}const q=e.computed(()=>({showSourceCode:p.value,svg:E.value,rawContent:k.raw.content||"",isLoading:C.value,copied:M.value,zoomIn:y,zoomOut:b,reset:B,fullscreen:x,toggleCode:z,copyCode:D,download:P,raw:k.raw}));return e.onMounted(async()=>{const e=await o.checkMermaidAvailable();g.value=!e}),(t,o)=>g.value?(e.openBlock(),e.createBlock(l.default,{key:0,code:k.raw?.content||"",language:"mermaid","is-dark":k.isDark,"light-theme":k.shikiTheme[0],"dark-theme":k.shikiTheme[1]},null,8,["code","is-dark","light-theme","dark-theme"])):(e.openBlock(),e.createElementBlock("div",{key:k.raw.key,class:e.normalizeClass(["markdown-mermaid",{"markdown-mermaid--dark":k.isDark}])},[e.createVNode(e.Transition,{name:"toolbar",appear:""},{default:e.withCtx(()=>[e.createElementVNode("div",n,[e.renderSlot(t.$slots,"mermaidHeader",e.normalizeProps(e.guardReactiveProps(q.value)),()=>[e.createElementVNode("div",r,[e.createElementVNode("div",i,[e.createElementVNode("div",c,[e.createElementVNode("div",{class:e.normalizeClass(["segmented-slider",{"slide-right":"code"===N.value}])},null,2),e.createElementVNode("div",{class:e.normalizeClass(["segment-item",{active:"diagram"===N.value}]),onClick:o[0]||(o[0]=e=>j("diagram"))},[...o[6]||(o[6]=[e.createElementVNode("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg"},[e.createElementVNode("path",{d:"M12 2L2 7L12 12L22 7L12 2Z",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"}),e.createElementVNode("path",{d:"M2 17L12 22L22 17",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"}),e.createElementVNode("path",{d:"M2 12L12 17L22 12",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"})],-1),e.createElementVNode("span",null,"预览",-1)])],2),e.createElementVNode("div",{class:e.normalizeClass(["segment-item",{active:"code"===N.value}]),onClick:o[1]||(o[1]=e=>j("code"))},[...o[7]||(o[7]=[e.createElementVNode("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg"},[e.createElementVNode("path",{d:"M16 18L22 12L16 6",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"}),e.createElementVNode("path",{d:"M8 6L2 12L8 18",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"})],-1),e.createElementVNode("span",null,"代码",-1)])],2)])]),e.createElementVNode("div",d,[e.renderSlot(t.$slots,"mermaidActions",e.normalizeProps(e.guardReactiveProps(q.value)),()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(_.value,t=>(e.openBlock(),e.createElementBlock("div",{key:t.key,class:e.normalizeClass(["toolbar-action-btn",[t.class,{"toolbar-action-btn--disabled":t.disabled}]]),style:e.normalizeStyle(t.style),title:t.title,onClick:e=>function(e){e.disabled||e.onClick?.(H.value)}(t)},[t.icon?(e.openBlock(),e.createBlock(e.resolveDynamicComponent(T(t)),{key:0})):e.createCommentVNode("",!0)],14,s))),128)),p.value?(e.openBlock(),e.createElementBlock("div",{key:0,class:e.normalizeClass(["toolbar-action-btn",{"copy-success":e.unref(M)}]),title:"复制代码",onClick:o[2]||(o[2]=e=>D(e))},[e.unref(M)?(e.openBlock(),e.createElementBlock("svg",u,[...o[8]||(o[8]=[e.createElementVNode("path",{fill:"currentColor",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"},null,-1)])])):(e.openBlock(),e.createElementBlock("svg",m,[...o[9]||(o[9]=[e.createElementVNode("path",{fill:"currentColor",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"},null,-1),e.createElementVNode("path",{fill:"currentColor",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"},null,-1)])]))],2)):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[e.createElementVNode("div",{class:"toolbar-action-btn",title:"缩小",onClick:o[3]||(o[3]=e=>b(e))},[...o[10]||(o[10]=[e.createElementVNode("svg",{width:"16",height:"16",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[e.createElementVNode("path",{fill:"currentColor",d:"m795.904 750.72 124.992 124.928a32 32 0 0 1-45.248 45.248L750.656 795.904a416 416 0 1 1 45.248-45.248zM480 832a352 352 0 1 0 0-704 352 352 0 0 0 0 704M352 448h256a32 32 0 0 1 0 64H352a32 32 0 0 1 0-64"})],-1)])]),e.createElementVNode("div",{class:"toolbar-action-btn",title:"放大",onClick:o[4]||(o[4]=e=>y(e))},[...o[11]||(o[11]=[e.createElementVNode("svg",{width:"16",height:"16",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[e.createElementVNode("path",{fill:"currentColor",d:"m795.904 750.72 124.992 124.928a32 32 0 0 1-45.248 45.248L750.656 795.904a416 416 0 1 1 45.248-45.248zM480 832a352 352 0 1 0 0-704 352 352 0 0 0 0 704m-32-384v-96a32 32 0 0 1 64 0v96h96a32 32 0 0 1 0 64h-96v96a32 32 0 0 1-64 0v-96h-96a32 32 0 0 1 0-64z"})],-1)])]),e.createElementVNode("div",{class:"toolbar-action-btn",title:"重置",onClick:o[5]||(o[5]=e=>B(e))},[...o[12]||(o[12]=[e.createElementVNode("svg",{width:"16",height:"16",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[e.createElementVNode("path",{fill:"currentColor",d:"M512 896a384 384 0 1 0 0-768 384 384 0 0 0 0 768m0 64a448 448 0 1 1 0-896 448 448 0 0 1 0 896"}),e.createElementVNode("path",{fill:"currentColor",d:"M512 96a32 32 0 0 1 32 32v192a32 32 0 0 1-64 0V128a32 32 0 0 1 32-32m0 576a32 32 0 0 1 32 32v192a32 32 0 1 1-64 0V704a32 32 0 0 1 32-32M96 512a32 32 0 0 1 32-32h192a32 32 0 0 1 0 64H128a32 32 0 0 1-32-32m576 0a32 32 0 0 1 32-32h192a32 32 0 1 1 0 64H704a32 32 0 0 1-32-32"})],-1)])]),e.createElementVNode("div",{class:"toolbar-action-btn",title:"下载",onClick:P},[...o[13]||(o[13]=[e.createElementVNode("svg",{width:"16",height:"16",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[e.createElementVNode("path",{fill:"currentColor",d:"M160 832h704a32 32 0 1 1 0 64H160a32 32 0 1 1 0-64m384-253.696 236.288-236.352 45.248 45.248L508.8 704 192 387.2l45.248-45.248L480 584.704V128h64z"})],-1)])])],64))])])])])])]),_:3}),e.withDirectives(e.createElementVNode("div",v,[e.createVNode(l.default,{code:k.raw?.content||"",language:"mermaid","is-dark":k.isDark,"light-theme":k.shikiTheme[0],"dark-theme":k.shikiTheme[1],"show-code-block-header":!1,"sticky-code-block-header":!1},null,8,["code","is-dark","light-theme","dark-theme"])],512),[[e.vShow,p.value]]),e.withDirectives(e.createVNode(a.default,{ref_key:"syntaxMermaidRef",ref:w,content:f.value,id:V.value,"is-dark":k.isDark,config:k.config},null,8,["content","id","is-dark","config"]),[[e.vShow,!p.value]])],2))}});exports.default=h;
|
|
2
|
-
//# sourceMappingURL=x-markdown.cjs24.js.map
|