{"version":3,"file":"markdown-editor.vue2.mjs","sources":["../../../../../../packages/components/markdown-editor/src/markdown-editor.vue"],"sourcesContent":["<template>\r\n  <div :class=\"bem.b()\">\r\n    <component\r\n      :is=\"components[0]\"\r\n      ref=\"markDownRef\"\r\n      :class=\"bem.e('container')\"\r\n      v-bind=\"attrs\"\r\n      :locale=\"zh\"\r\n      :value=\"innerValue\"\r\n      :plugins=\"plugins\"\r\n      :upload-images=\"handleUploadImages\"\r\n      :sanitize=\"attrs.sanitize || sanitize\"\r\n      :mode=\"mode\"\r\n      @change=\"handleChange\"\r\n    />\r\n  </div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { ref, markRaw, watch, useAttrs } from 'vue'\r\nimport Compressor from 'compressorjs'\r\n\r\n//@ts-ignore\r\nimport { Editor } from '@bytemd/vue-next'\r\n\r\nimport gfm from '@bytemd/plugin-gfm'\r\nimport gemoji from '@bytemd/plugin-gemoji'\r\nimport highlight from '@bytemd/plugin-highlight' // 代码高亮\r\nimport frontmatter from '@bytemd/plugin-frontmatter' // 解析前题\r\nimport mediumZoom from '@bytemd/plugin-medium-zoom' // 缩放图片\r\nimport breaks from '@bytemd/plugin-breaks'\r\nimport mermaid from '@bytemd/plugin-mermaid'\r\nimport math from '@bytemd/plugin-math'\r\nimport zhHans from 'bytemd/locales/zh_Hans.json'\r\nimport gfmZhHans from '@bytemd/plugin-gfm/locales/zh_Hans.json'\r\n// import 'bytemd/dist/index.css'\r\n// import 'juejin-markdown-themes/dist/juejin.min.css' // 掘金同款样式\r\nimport { createNamespace } from '@ll-plus/utils'\r\nimport { llMarkdownEditorProps, llMarkdownEditorEmits } from './config'\r\nconst pluginsList = [\r\n  gfm({ locale: gfmZhHans }),\r\n  gemoji(),\r\n  highlight(),\r\n  frontmatter(),\r\n  mediumZoom(),\r\n  breaks(),\r\n  mermaid(),\r\n  math(),\r\n]\r\n\r\ndefineOptions({ name: 'LlMarkdownEditor' })\r\n\r\nconst props = defineProps(llMarkdownEditorProps)\r\nconst emits = defineEmits(llMarkdownEditorEmits)\r\n\r\nconst bem = createNamespace('markdown-editor')\r\n\r\n//@ts-ignore\r\nconst components = [Editor]\r\nconst markDownRef = ref()\r\nconst innerValue = ref(props.value)\r\nconst plugins = markRaw(pluginsList)\r\nconst zh = ref(zhHans)\r\nconst attrs = useAttrs()\r\nwatch(\r\n  () => props.value,\r\n  (n) => {\r\n    innerValue.value = n\r\n  }\r\n)\r\nconst handleChange = async (val: string) => {\r\n  emits('update:value', val)\r\n  emits('change', val)\r\n}\r\n// 图片压缩\r\nconst compressImage = (file) => {\r\n  return new Promise((resolve, reject) => {\r\n    new Compressor(file, {\r\n      quality: 0.6, // 设置压缩质量\r\n      maxWidth: 400, // 设置图片最大宽度\r\n      maxHeight: 400, // 设置图片最大高度\r\n      ...props.imageQuality,\r\n      success(result) {\r\n        resolve(result)\r\n      },\r\n      error(error) {\r\n        reject(error)\r\n      },\r\n    })\r\n  })\r\n}\r\n\r\nconst handleUploadImages = async (files: File[]) => {\r\n  try {\r\n    const compressImages: File[] = []\r\n    if (props.compress) {\r\n      await Promise.all(\r\n        files.map(async (file) => {\r\n          const compressedFile: File = (await compressImage(file)) as File\r\n          compressImages.push(compressedFile)\r\n        })\r\n      )\r\n    }\r\n    const showImages = await props.uploadImage(\r\n      props.compress ? compressImages : files\r\n    )\r\n\r\n    return showImages.map((e, i) => ({\r\n      title: files[i].name,\r\n      url: e,\r\n    }))\r\n  } catch (error) {\r\n    console.error('压缩和上传图像时出错:', error)\r\n  }\r\n}\r\n\r\nconst sanitize = (schema: any) => {\r\n  // 创建配置的深拷贝，避免修改原始 schema\r\n  const config = JSON.parse(JSON.stringify(schema))\r\n\r\n  // 允许 data 协议在 src 属性中（用于 Base64 图片）\r\n  if (config.protocols && config.protocols.src) {\r\n    if (!config.protocols.src.includes('data')) {\r\n      config.protocols.src.push('data')\r\n    }\r\n  }\r\n\r\n  // 确保 img 标签有必要的属性支持\r\n  if (config.attributes && config.attributes.img) {\r\n    const imgAttributes = config.attributes.img\r\n\r\n    // 确保包含 src 属性\r\n    if (!imgAttributes.includes('src')) {\r\n      imgAttributes.push('src')\r\n    }\r\n\r\n    // 添加 alt 属性用于更好的可访问性\r\n    if (!imgAttributes.includes('alt')) {\r\n      imgAttributes.push('alt')\r\n    }\r\n\r\n    // 添加 title 属性\r\n    if (!imgAttributes.includes('title')) {\r\n      imgAttributes.push('title')\r\n    }\r\n  }\r\n\r\n  // 在全局属性中添加对 Base64 图片可能有用的属性\r\n  if (config.attributes && config.attributes['*']) {\r\n    const globalAttributes = config.attributes['*']\r\n\r\n    // 确保包含 width 和 height 属性\r\n    const neededAttributes = ['width', 'height']\r\n    neededAttributes.forEach((attr) => {\r\n      if (!globalAttributes.includes(attr)) {\r\n        globalAttributes.push(attr)\r\n      }\r\n    })\r\n  }\r\n\r\n  // 添加自定义过滤逻辑来验证 Base64 图片\r\n  config.customFilters = {\r\n    // 对 img 标签的 src 属性进行额外验证\r\n    img: (element: any) => {\r\n      const src = element.getAttribute('src')\r\n\r\n      // 如果是 data URI，验证是否为安全的图片类型\r\n      if (src && src.startsWith('data:')) {\r\n        // 只允许图片类型的 data URI\r\n        const allowedImageTypes = [\r\n          'image/jpeg',\r\n          'image/jpg',\r\n          'image/png',\r\n          'image/gif',\r\n          'image/webp',\r\n          'image/svg+xml',\r\n        ]\r\n\r\n        const isSafeImageType = allowedImageTypes.some((type) =>\r\n          src.startsWith(`data:${type}`)\r\n        )\r\n\r\n        if (!isSafeImageType) {\r\n          // 移除不安全的 data URI\r\n          element.removeAttribute('src')\r\n        }\r\n\r\n        // 可选：限制 Base64 数据大小（防止超大图片影响性能）\r\n        const base64Match = src.match(/data:[^,]+,(.+)/)\r\n        if (base64Match && base64Match[1]) {\r\n          const base64Data = base64Match[1]\r\n          // 限制 Base64 数据大小（例如 1MB）\r\n          if (base64Data.length > 1.5 * 1024 * 1024) {\r\n            // 约 1.5MB\r\n            element.removeAttribute('src')\r\n          }\r\n        }\r\n      }\r\n\r\n      return element\r\n    },\r\n  }\r\n\r\n  return config\r\n}\r\n</script>\r\n"],"names":["_createElementBlock","_normalizeClass","_unref","_createBlock","_resolveDynamicComponent","_mergeProps","mode"],"mappings":"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"}