{"version":3,"file":"index-D8TwSkAS.mjs","sources":["../../src/renderers/Markdown/index.tsx"],"sourcesContent":["import { useState, useEffect, useCallback, forwardRef, useImperativeHandle, useRef } from 'react';\nimport ReactMarkdown from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport remarkMath from 'remark-math';\nimport rehypeKatex from 'rehype-katex';\nimport rehypeRaw from 'rehype-raw';\nimport { Copy, Check, Eye, Code } from 'lucide-react';\nimport { fetchTextUtf8 } from '@eternalheart/file-preview-core';\nimport { useTranslator } from '../../i18n/LocaleContext';\nimport { useFetcher } from '../../RequestContext';\nimport { useShikiHighlight } from '../../hooks/useShikiHighlight';\nimport { RendererError } from '../RendererError';\nimport type { RendererHandle } from '../base.types';\nimport type { ToolbarGroup } from '../toolbar.types';\nimport 'katex/dist/katex.min.css';\n\ninterface MarkdownRendererProps {\n  url: string;\n}\n\nconst useCopy = (text: string) => {\n  const [copied, setCopied] = useState(false);\n  const handleCopy = useCallback(async () => {\n    try {\n      await navigator.clipboard.writeText(text);\n    } catch {\n      const textarea = document.createElement('textarea');\n      textarea.value = text;\n      document.body.appendChild(textarea);\n      textarea.select();\n      document.execCommand('copy');\n      document.body.removeChild(textarea);\n    }\n    setCopied(true);\n    setTimeout(() => setCopied(false), 2000);\n  }, [text]);\n  return { copied, handleCopy };\n};\n\n/** 内联版复制按钮：放在代码块 header 行内，始终可见 */\nconst InlineCopyButton = ({ text }: { text: string }) => {\n  const t = useTranslator();\n  const { copied, handleCopy } = useCopy(text);\n  return (\n    <button\n      onClick={handleCopy}\n      className=\"rfp-p-1 rfp-rounded rfp-text-fg-muted hover:rfp-text-fg-secondary rfp-transition-colors rfp-flex rfp-items-center rfp-gap-1\"\n      title={copied ? t('markdown.copied') : t('markdown.copy_code')}\n    >\n      {copied ? <Check size={13} /> : <Copy size={13} />}\n    </button>\n  );\n};\n\n/** 浮动版复制按钮：无 header 时绝对定位于代码块右上角（hover 显示） */\nconst FloatingCopyButton = ({ text }: { text: string }) => {\n  const t = useTranslator();\n  const { copied, handleCopy } = useCopy(text);\n  return (\n    <button\n      onClick={handleCopy}\n      className=\"rfp-absolute rfp-top-2 rfp-right-2 rfp-p-1.5 rfp-rounded-md rfp-bg-surface-2 hover:rfp-bg-surface-3 rfp-text-fg-tertiary hover:rfp-text-fg-secondary rfp-transition-colors rfp-opacity-0 group-hover:rfp-opacity-100 rfp-border rfp-border-line\"\n      title={copied ? t('markdown.copied') : t('markdown.copy_code')}\n    >\n      {copied ? <Check size={14} /> : <Copy size={14} />}\n    </button>\n  );\n};\n\n/** 带语言标注的代码块：shiki 高亮 + header + 复制按钮 */\nconst ShikiCodeBlock = ({ code, lang }: { code: string; lang: string }) => {\n  const { html } = useShikiHighlight(code, lang);\n  return (\n    <div className=\"rfp-relative rfp-group rfp-my-4\">\n      <div className=\"rfp-flex rfp-items-center rfp-justify-between rfp-px-4 rfp-py-1.5 rfp-bg-surface-1 rfp-border rfp-border-line-weak rfp-rounded-t-md rfp-border-b-0\">\n        <span className=\"rfp-text-xs rfp-text-fg-secondary rfp-font-mono rfp-select-none\">{lang}</span>\n        <InlineCopyButton text={code} />\n      </div>\n      {html ? (\n        <div\n          className=\"rfp-shiki-wrapper rfp-rounded-b-md rfp-border rfp-border-line-weak rfp-border-t-0 rfp-overflow-x-auto\"\n          dangerouslySetInnerHTML={{ __html: html }}\n        />\n      ) : (\n        <pre\n          className=\"rfp-m-0 rfp-rounded-b-md rfp-border rfp-border-line-weak rfp-border-t-0 rfp-overflow-x-auto rfp-p-4 rfp-bg-code-bg\"\n          style={{ fontSize: '13px', lineHeight: '1.5' }}\n        >\n          <code className=\"rfp-font-mono rfp-text-code-fg rfp-text-sm\">{code}</code>\n        </pre>\n      )}\n    </div>\n  );\n};\n\nexport const MarkdownRenderer = forwardRef<RendererHandle, MarkdownRendererProps>(({ url }, ref) => {\n  const t = useTranslator();\n  const fetcher = useFetcher();\n\n  // 内部状态管理\n  const [content, setContent] = useState<string>('');\n  const [loading, setLoading] = useState(true);\n  const [error, setError] = useState<string | null>(null);\n  const [viewMode, setViewMode] = useState<'preview' | 'source'>('preview');\n\n  const { html: sourceHtml } = useShikiHighlight(\n    viewMode === 'source' ? content : '',\n    'markdown',\n  );\n\n  useEffect(() => {\n    const controller = new AbortController();\n    const loadMarkdown = async () => {\n      try {\n        setLoading(true);\n        setError(null);\n        const text = await fetchTextUtf8(url, { fetcher, signal: controller.signal });\n        setContent(text);\n      } catch (err: any) {\n        if (err.name === 'AbortError') return;\n        setError(t('markdown.load_failed'));\n        console.error(err);\n      } finally {\n        setLoading(false);\n      }\n    };\n\n    loadMarkdown();\n    return () => controller.abort();\n  }, [url, fetcher, t]);\n\n  // 事件发射器：用于通知主组件工具栏状态变化\n  const listenersRef = useRef<Set<() => void>>(new Set());\n  const notifyToolbarChange = useCallback(() => {\n    listenersRef.current.forEach(listener => listener());\n  }, []);\n\n  // 监听影响工具栏的状态变化\n  useEffect(() => {\n    notifyToolbarChange();\n  }, [viewMode, notifyToolbarChange]);\n\n  // 切换视图模式\n  const toggleViewMode = useCallback(() => {\n    setViewMode(prev => prev === 'preview' ? 'source' : 'preview');\n  }, []);\n\n  // 工具栏配置\n  const getToolbarGroups = useCallback((): ToolbarGroup[] => [\n    {\n      items: [\n        {\n          type: 'button',\n          icon: viewMode === 'preview' ? <Code className=\"rfp-w-4 rfp-h-4\" /> : <Eye className=\"rfp-w-4 rfp-h-4\" />,\n          tooltip: viewMode === 'preview' ? t('toolbar.source') : t('toolbar.preview'),\n          action: toggleViewMode,\n          active: viewMode === 'source',\n        },\n      ],\n    },\n  ], [viewMode, t, toggleViewMode]);\n\n  // 暴露接口给父组件\n  useImperativeHandle(ref, () => ({\n    getToolbarGroups,\n    onToolbarChange: (listener: () => void) => {\n      listenersRef.current.add(listener);\n      return () => listenersRef.current.delete(listener);\n    },\n  }), [getToolbarGroups]);\n\n  if (loading) {\n    return (\n      <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full\">\n        <div className=\"rfp-w-12 rfp-h-12 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n      </div>\n    );\n  }\n\n  if (error) {\n    return <RendererError message={error} />;\n  }\n\n  // 源码视图\n  if (viewMode === 'source') {\n    return (\n      <div className=\"rfp-w-full rfp-h-full rfp-overflow-auto rfp-bg-code-bg\">\n        {sourceHtml ? (\n          <div\n            className=\"rfp-shiki-wrapper with-line-numbers\"\n            dangerouslySetInnerHTML={{ __html: sourceHtml }}\n          />\n        ) : (\n          <pre className=\"rfp-p-6 rfp-text-fg-primary rfp-font-mono rfp-text-sm rfp-whitespace-pre-wrap rfp-break-words\">\n            {content}\n          </pre>\n        )}\n      </div>\n    );\n  }\n\n  // 预览视图\n  return (\n    <div className=\"rfp-w-full rfp-h-full rfp-overflow-auto rfp-py-6 rfp-px-4\">\n      <ReactMarkdown\n            remarkPlugins={[remarkGfm, remarkMath]}\n            rehypePlugins={[rehypeRaw, rehypeKatex]}\n            components={{\n              code({ node: _node, inline, className, children, ...props }: any) {\n                const match = /language-(\\w+)/.exec(className || '');\n                const codeString = String(children).replace(/\\n$/, '');\n                // react-markdown v9 不再传 inline，需要兜底判断：\n                // 无语言 className 且不含换行视为内联代码\n                const isInline = inline ?? (!match && !codeString.includes('\\n'));\n\n                // 行内代码 - 返回纯 <code>\n                if (isInline) {\n                  return (\n                    <code\n                      className=\"rfp-bg-surface-2 rfp-px-1.5 rfp-py-0.5 rfp-rounded rfp-text-sm rfp-font-mono rfp-text-fg-primary rfp-border rfp-border-line-weak\"\n                      {...props}\n                    >\n                      {children}\n                    </code>\n                  );\n                }\n\n                // 代码块 - 有语言标注\n                if (match) {\n                  return <ShikiCodeBlock code={codeString} lang={match[1]} />;\n                }\n\n                // 代码块 - 无语言标注\n                return (\n                  <div className=\"rfp-relative rfp-group rfp-my-4\">\n                    <FloatingCopyButton text={codeString} />\n                    <pre\n                      className=\"rfp-m-0 rfp-rounded-md rfp-border rfp-border-line-weak rfp-overflow-x-auto rfp-p-4 rfp-bg-code-bg\"\n                      style={{ fontSize: '13px', lineHeight: '1.5' }}\n                    >\n                      <code className=\"rfp-font-mono rfp-text-code-fg rfp-text-sm\">{children}</code>\n                    </pre>\n                  </div>\n                );\n              },\n              h1: ({ children }) => (\n                <h1 className=\"rfp-text-3xl rfp-font-semibold rfp-mb-4 rfp-mt-6 rfp-text-fg-primary first:rfp-mt-0\">\n                  {children}\n                </h1>\n              ),\n              h2: ({ children }) => (\n                <h2 className=\"rfp-text-2xl rfp-font-semibold rfp-mb-3 rfp-mt-8 rfp-text-fg-primary\">\n                  {children}\n                </h2>\n              ),\n              h3: ({ children }) => (\n                <h3 className=\"rfp-text-xl rfp-font-semibold rfp-mb-2 rfp-mt-6 rfp-text-fg-primary\">{children}</h3>\n              ),\n              h4: ({ children }) => (\n                <h4 className=\"rfp-text-lg rfp-font-semibold rfp-mb-2 rfp-mt-4 rfp-text-fg-primary\">{children}</h4>\n              ),\n              p: ({ children }) => (\n                <p className=\"rfp-text-fg-secondary rfp-mb-4 rfp-leading-7 rfp-text-base\">{children}</p>\n              ),\n              a: ({ href, children }) => (\n                <a\n                  href={href}\n                  className=\"rfp-text-indigo-400 hover:rfp-text-indigo-300 rfp-underline rfp-decoration-indigo-600 hover:rfp-decoration-indigo-400\"\n                  target=\"_blank\"\n                  rel=\"noopener noreferrer\"\n                >\n                  {children}\n                </a>\n              ),\n              ul: ({ children }) => (\n                <ul className=\"rfp-list-disc rfp-pl-6 rfp-mb-4 rfp-text-fg-secondary rfp-space-y-1\">{children}</ul>\n              ),\n              ol: ({ children }) => (\n                <ol className=\"rfp-list-decimal rfp-pl-6 rfp-mb-4 rfp-text-fg-secondary rfp-space-y-1\">{children}</ol>\n              ),\n              li: ({ children }) => <li className=\"rfp-leading-7\">{children}</li>,\n              blockquote: ({ children }) => (\n                <blockquote className=\"rfp-border-l-4 rfp-border-line-strong rfp-pl-4 rfp-text-fg-tertiary rfp-my-4 rfp-italic\">\n                  {children}\n                </blockquote>\n              ),\n              table: ({ children }) => (\n                <div className=\"rfp-overflow-x-auto rfp-my-4 rfp-rounded-md rfp-border rfp-border-line\">\n                  <table className=\"rfp-min-w-full rfp-divide-y rfp-divide-divide\">{children}</table>\n                </div>\n              ),\n              thead: ({ children }) => <thead className=\"rfp-bg-surface-1\">{children}</thead>,\n              tbody: ({ children }) => (\n                <tbody className=\"rfp-divide-y rfp-divide-divide rfp-bg-transparent\">{children}</tbody>\n              ),\n              tr: ({ children }) => (\n                <tr className=\"hover:rfp-bg-surface-1 rfp-transition-colors\">{children}</tr>\n              ),\n              th: ({ children }) => (\n                <th className=\"rfp-px-4 rfp-py-3 rfp-text-left rfp-text-xs rfp-font-semibold rfp-text-fg-tertiary rfp-uppercase rfp-tracking-wider\">\n                  {children}\n                </th>\n              ),\n              td: ({ children }) => (\n                <td className=\"rfp-px-4 rfp-py-3 rfp-text-sm rfp-text-fg-secondary\">{children}</td>\n              ),\n              hr: () => <hr className=\"rfp-border-line rfp-my-6\" />,\n              img: ({ src, alt }) => (\n                <img\n                  src={src}\n                  alt={alt}\n                  className=\"rfp-rounded-md rfp-max-w-full rfp-h-auto rfp-my-4 rfp-mx-auto rfp-block rfp-shadow-sm\"\n                />\n              ),\n              input: ({ type, checked, ...props }) => {\n                if (type === 'checkbox') {\n                  return (\n                    <input\n                      type=\"checkbox\"\n                      checked={checked}\n                      readOnly\n                      className=\"rfp-mr-2 rfp-rounded rfp-border-line\"\n                      {...props}\n                    />\n                  );\n                }\n                return <input type={type} {...props} />;\n              },\n              strong: ({ children }) => (\n                <strong className=\"rfp-font-semibold rfp-text-fg-primary\">{children}</strong>\n              ),\n              em: ({ children }) => <em className=\"rfp-italic\">{children}</em>,\n              del: ({ children }) => (\n                <del className=\"rfp-text-fg-muted rfp-line-through\">{children}</del>\n              ),\n            }}\n          >\n            {content}\n          </ReactMarkdown>\n    </div>\n  );\n});\n"],"names":["useCopy","text","copied","setCopied","useState","handleCopy","useCallback","textarea","InlineCopyButton","t","useTranslator","jsx","Check","Copy","FloatingCopyButton","ShikiCodeBlock","code","lang","html","useShikiHighlight","jsxs","MarkdownRenderer","forwardRef","url","ref","fetcher","useFetcher","content","setContent","loading","setLoading","error","setError","viewMode","setViewMode","sourceHtml","useEffect","controller","fetchTextUtf8","err","listenersRef","useRef","notifyToolbarChange","listener","toggleViewMode","prev","getToolbarGroups","Code","Eye","useImperativeHandle","RendererError","ReactMarkdown","remarkGfm","remarkMath","rehypeRaw","rehypeKatex","_node","inline","className","children","props","match","codeString","href","src","alt","type","checked"],"mappings":"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"}