{"version":3,"file":"components/base/CodeViewer/utils.mjs","sources":["../../../../src/components/base/CodeViewer/utils.ts"],"sourcesContent":["import { Monaco } from '@monaco-editor/react';\nimport { SDK } from '@rsdoctor/types';\nimport type { Range as RangeClass } from 'monaco-editor';\nimport { editor } from 'monaco-editor';\nimport { extname } from 'path';\n\n/**\n * 判断 data 协议文件格式 `data:[<mediatype>][;base64],<data>`\n * 完整协议: https://www.rfc-editor.org/rfc/rfc2397.html\n * @param {string} content 文件内容\n * @returns {string} 文件格式类型\n */\nfunction getDataProtocolFormat(content: string): string {\n  // 如果内容为空返回空\n  if (!content) {\n    return '';\n  }\n\n  try {\n    const prefix = 'data:';\n    // 检查是否以 data: 开头\n    if (!content.startsWith(prefix)) {\n      return '';\n    }\n\n    const { mimeType } = parseDataUrl(content);\n\n    // 根据 MIME 类型返回对应的格式\n    switch (mimeType) {\n      case 'text/javascript':\n        return 'javascript';\n      case 'text/html':\n        return 'html';\n      case 'text/css':\n        return 'css';\n      case 'text/plain':\n        return 'text';\n      case 'application/json':\n        return 'json';\n      // 可以根据需要添加更多类型\n      default:\n        return '';\n    }\n  } catch (error) {\n    console.error('解析 data 协议文件格式失败::', error);\n    return '';\n  }\n}\n\n/**\n * 解析 Data URL 并提取 MIME 类型\n * @param {string} dataUrl - 要解析的 Data URL 字符串\n * @returns {Object} 包含解析结果的对象\n */\nfunction parseDataUrl(dataUrl: string) {\n  // 检查是否是 Data URL\n  if (!dataUrl.startsWith('data:')) {\n    throw new Error('输入不是有效的 Data URL');\n  }\n\n  // 提取内容部分 (去掉 \"data:\" 前缀)\n  const content = dataUrl.substring(5);\n\n  // 查找分隔数据和元数据的逗号\n  const commaIndex = content.indexOf(',');\n\n  if (commaIndex === -1) {\n    throw new Error('无效的 Data URL 格式: 缺少数据分隔符');\n  }\n\n  // 提取元数据部分\n  const metadataPart = content.substring(0, commaIndex);\n\n  // 提取数据部分\n  const dataPart = content.substring(commaIndex + 1);\n\n  // 解析元数据\n  let mimeType = '';\n  let charset = '';\n  let isBase64 = false;\n\n  // 分割元数据部分\n  const metadataSegments = metadataPart.split(';');\n\n  // 第一部分通常是 MIME 类型\n  if (metadataSegments.length > 0) {\n    mimeType = metadataSegments[0] || 'text/plain'; // 默认为 text/plain\n  }\n\n  // 检查其他元数据参数\n  for (let i = 1; i < metadataSegments.length; i++) {\n    const segment = metadataSegments[i];\n\n    if (segment === 'base64') {\n      isBase64 = true;\n    } else if (segment.startsWith('charset=')) {\n      charset = segment.substring(8);\n    }\n  }\n\n  // 返回解析结果\n  return {\n    mimeType,\n    charset,\n    isBase64,\n    data: dataPart,\n  };\n}\n\nexport function getFilePathFormat(filePath: string): string {\n  if (!filePath) return '';\n\n  const i = getDataProtocolFormat(filePath);\n\n  if (i) {\n    return i;\n  }\n\n  try {\n    const ext = extname(filePath).slice(1);\n    switch (ext) {\n      case 'js':\n      case 'cjs':\n      case 'mjs':\n      case 'jsx':\n        return 'javascript';\n      case 'ts':\n      case 'tsx':\n        return 'typescript';\n      case 'md':\n        return 'markdown';\n      default:\n        return ext;\n    }\n  } catch {\n    return '';\n  }\n}\n\n/**\n * 默认编辑器样式, 适合预览代码\n */\nexport const DefaultEditorConfig: editor.IStandaloneEditorConstructionOptions =\n  {\n    // 设置编辑器为只读模式\n    readOnly: true,\n    // 设置 DOM 元素为只读模式\n    domReadOnly: true,\n    // 设置字体大小为 14px\n    fontSize: 14,\n    // 设置制表符宽度为 2 个空格\n    tabSize: 2,\n    // 设置行高为 24px\n    lineHeight: 24,\n    // 关闭验证装饰器的渲染(如错误、警告标记等)\n    renderValidationDecorations: 'off',\n    // 在概览标尺中隐藏光标\n    hideCursorInOverviewRuler: true,\n    // 启用平滑滚动\n    smoothScrolling: true,\n    // 设置文本换行方式\n    wordWrap: 'on',\n    // 启用颜色装饰器(如显示颜色预览)\n    colorDecorators: true,\n    // 禁用代码镜头功能(如显示引用次数等)\n    codeLens: false,\n    // 设置光标宽度为 0(隐藏光标)\n    cursorWidth: 0,\n    // 禁用右侧的小地图预览\n    minimap: {\n      enabled: false,\n    },\n\n    /** 禁用编辑器内置的右键菜单 */\n    contextmenu: false,\n    /** 禁用定义跳转功能 */\n    gotoLocation: {\n      multiple: 'goto',\n      multipleDefinitions: 'goto',\n      multipleTypeDefinitions: 'goto',\n      multipleDeclarations: 'goto',\n      multipleImplementations: 'goto',\n      multipleReferences: 'goto',\n    },\n    /** 禁用悬停提示功能 */\n    hover: { enabled: false },\n    // 禁用链接功能 - 会禁用 Command/Ctrl + 点击\n    links: false,\n  };\n\n/**\n * get monaco options, it'll combine default config\n * @param options\n * @returns target options\n */\nexport function defineMonacoOptions(\n  options?: editor.IStandaloneEditorConstructionOptions,\n): editor.IStandaloneEditorConstructionOptions {\n  return {\n    ...structuredClone(DefaultEditorConfig),\n    ...options,\n  };\n}\n\nexport function getFileName(filePath: string): string {\n  // 如果内容为空返回空\n  if (!filePath) {\n    return '';\n  }\n\n  const prefix = 'data:';\n  // 检查是否以 data: 开头\n  if (filePath.startsWith(prefix)) {\n    return 'data';\n  }\n\n  return filePath.split('/').at(-1) || '';\n}\n\nexport function getSelectionRange(\n  source: SDK.SourceRange,\n  Range: typeof RangeClass,\n) {\n  const { start, end } = source;\n  const { line = 1, column = 0 } = start;\n  return new Range(\n    line,\n    column + 1,\n    end?.line ?? line,\n    (end?.column ?? 9999) + 1,\n  );\n}\n\nexport function editorShowRange(\n  editor: editor.IStandaloneCodeEditor,\n  monaco: Monaco,\n  ranges?: SDK.SourceRange[],\n) {\n  if (!ranges || ranges.length === 0) return;\n\n  const decorations = ranges.map((range) => ({\n    range: getSelectionRange(range, monaco.Range),\n    options: {\n      inlineClassName: 'file-inline-decoration',\n    },\n  }));\n  editor.deltaDecorations([], decorations);\n\n  setTimeout(() => {\n    editor.revealLine(decorations[0].range.startLineNumber);\n  });\n}\n"],"names":["getDataProtocolFormat","content","prefix","mimeType","parseDataUrl","error","console","dataUrl","Error","commaIndex","metadataPart","dataPart","charset","isBase64","metadataSegments","i","segment","getFilePathFormat","filePath","ext","extname","DefaultEditorConfig","defineMonacoOptions","options","structuredClone","getFileName","getSelectionRange","source","Range","start","end","line","column","editorShowRange","editor","monaco","ranges","decorations","range","setTimeout"],"mappings":"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"}