@open-file-viewer/core 0.1.3 → 0.1.5

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/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/detect.ts","../src/dom.ts","../src/plugins/fallback.ts","../src/viewer.ts","../src/plugins/image.ts","../src/plugins/video.ts","../src/plugins/audio.ts","../src/plugins/text.ts","../src/plugins/pdf.ts","../src/plugins/epub.ts","../src/plugins/utils.ts","../src/plugins/xps.ts","../src/plugins/office.ts","../src/plugins/ofd.ts","../src/plugins/archive.ts","../src/plugins/email.ts","../src/plugins/drawing.ts","../src/plugins/cad.ts","../src/plugins/model3d.ts","../src/plugins/gis.ts","../src/plugins/asset.ts"],"sourcesContent":["import type { PreviewFile, PreviewSource } from \"./types\";\n\nconst extensionMimeMap: Record<string, string> = {\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n jfif: \"image/jpeg\",\n pjpe: \"image/pjpeg\",\n pjpeg: \"image/pjpeg\",\n png: \"image/png\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n avif: \"image/avif\",\n jxl: \"image/jxl\",\n svg: \"image/svg+xml\",\n bmp: \"image/bmp\",\n ico: \"image/x-icon\",\n cur: \"image/x-icon\",\n tif: \"image/tiff\",\n tiff: \"image/tiff\",\n apng: \"image/apng\",\n heic: \"image/heic\",\n heif: \"image/heif\",\n mp4: \"video/mp4\",\n mpg: \"video/mpeg\",\n mpeg: \"video/mpeg\",\n mpe: \"video/mpeg\",\n mpv: \"video/mpv\",\n webm: \"video/webm\",\n ogg: \"audio/ogg\",\n ogv: \"video/ogg\",\n mov: \"video/quicktime\",\n m4v: \"video/x-m4v\",\n avi: \"video/x-msvideo\",\n mkv: \"video/x-matroska\",\n flv: \"video/x-flv\",\n wmv: \"video/x-ms-wmv\",\n \"3gp\": \"video/3gpp\",\n \"3g2\": \"video/3gpp2\",\n m2ts: \"video/mp2t\",\n m3u8: \"application/vnd.apple.mpegurl\",\n mp3: \"audio/mpeg\",\n wav: \"audio/wav\",\n aif: \"audio/aiff\",\n aiff: \"audio/aiff\",\n aifc: \"audio/aiff\",\n aac: \"audio/aac\",\n m4a: \"audio/mp4\",\n flac: \"audio/flac\",\n opus: \"audio/opus\",\n oga: \"audio/ogg\",\n weba: \"audio/webm\",\n amr: \"audio/amr\",\n mid: \"audio/midi\",\n midi: \"audio/midi\",\n caf: \"audio/x-caf\",\n au: \"audio/basic\",\n snd: \"audio/basic\",\n wma: \"audio/x-ms-wma\",\n pdf: \"application/pdf\",\n epub: \"application/epub+zip\",\n xps: \"application/vnd.ms-xpsdocument\",\n oxps: \"application/oxps\",\n txt: \"text/plain\",\n log: \"text/plain\",\n env: \"text/plain\",\n gitignore: \"text/plain\",\n dockerignore: \"text/plain\",\n npmrc: \"text/plain\",\n yarnrc: \"text/plain\",\n pnpmrc: \"text/plain\",\n editorconfig: \"text/plain\",\n browserslistrc: \"text/plain\",\n prettierrc: \"application/json\",\n eslintrc: \"application/json\",\n stylelintrc: \"application/json\",\n conf: \"text/plain\",\n config: \"text/plain\",\n properties: \"text/plain\",\n lock: \"text/plain\",\n json: \"application/json\",\n jsonc: \"application/json\",\n json5: \"application/json5\",\n ipynb: \"application/x-ipynb+json\",\n jsonl: \"application/x-ndjson\",\n ndjson: \"application/x-ndjson\",\n xml: \"application/xml\",\n yaml: \"text/yaml\",\n yml: \"text/yaml\",\n csv: \"text/csv\",\n tsv: \"text/tab-separated-values\",\n md: \"text/markdown\",\n markdown: \"text/markdown\",\n toml: \"application/toml\",\n ini: \"text/plain\",\n proto: \"text/x-protobuf\",\n tf: \"text/x-hcl\",\n tfvars: \"text/x-hcl\",\n hcl: \"text/x-hcl\",\n tex: \"application/x-tex\",\n latex: \"application/x-tex\",\n bib: \"text/x-bibtex\",\n gv: \"text/vnd.graphviz\",\n http: \"message/http\",\n css: \"text/css\",\n scss: \"text/css\",\n less: \"text/css\",\n js: \"text/javascript\",\n mjs: \"text/javascript\",\n cjs: \"text/javascript\",\n ts: \"text/typescript\",\n tsx: \"text/typescript\",\n jsx: \"text/javascript\",\n htm: \"text/html\",\n html: \"text/html\",\n vue: \"text/plain\",\n py: \"text/x-python\",\n java: \"text/x-java-source\",\n go: \"text/x-go\",\n rs: \"text/rust\",\n rb: \"text/x-ruby\",\n swift: \"text/x-swift\",\n kt: \"text/x-kotlin\",\n kts: \"text/x-kotlin\",\n scala: \"text/x-scala\",\n lua: \"text/x-lua\",\n r: \"text/x-r\",\n dart: \"text/x-dart\",\n svelte: \"text/plain\",\n astro: \"text/plain\",\n elm: \"text/x-elm\",\n ex: \"text/x-elixir\",\n exs: \"text/x-elixir\",\n clj: \"text/x-clojure\",\n cljs: \"text/x-clojure\",\n erl: \"text/x-erlang\",\n hrl: \"text/x-erlang\",\n fs: \"text/x-fsharp\",\n fsx: \"text/x-fsharp\",\n hs: \"text/x-haskell\",\n lhs: \"text/x-haskell\",\n php: \"application/x-httpd-php\",\n c: \"text/x-c\",\n cpp: \"text/x-c++src\",\n h: \"text/x-c\",\n hpp: \"text/x-c++hdr\",\n cs: \"text/x-csharp\",\n sql: \"application/sql\",\n sh: \"application/x-sh\",\n bash: \"application/x-sh\",\n zsh: \"application/x-sh\",\n fish: \"application/x-sh\",\n ps1: \"text/plain\",\n bat: \"text/plain\",\n cmd: \"text/plain\",\n dockerfile: \"text/plain\",\n nginxconf: \"text/plain\",\n gradle: \"text/plain\",\n graphql: \"application/graphql\",\n gql: \"application/graphql\",\n pem: \"application/x-pem-file\",\n crt: \"application/x-x509-ca-cert\",\n cer: \"application/pkix-cert\",\n ics: \"text/calendar\",\n vcf: \"text/vcard\",\n diff: \"text/x-diff\",\n patch: \"text/x-diff\",\n geojson: \"application/geo+json\",\n topojson: \"application/topo+json\",\n kml: \"application/vnd.google-earth.kml+xml\",\n kmz: \"application/vnd.google-earth.kmz\",\n gpx: \"application/gpx+xml\",\n shp: \"application/octet-stream\",\n drawio: \"application/vnd.jgraph.mxfile\",\n dio: \"application/vnd.jgraph.mxfile\",\n excalidraw: \"application/vnd.excalidraw+json\",\n tldraw: \"application/json\",\n zip: \"application/zip\",\n rar: \"application/vnd.rar\",\n \"7z\": \"application/x-7z-compressed\",\n tar: \"application/x-tar\",\n gz: \"application/gzip\",\n tgz: \"application/gzip\",\n bz2: \"application/x-bzip2\",\n xz: \"application/x-xz\",\n docx: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n docm: \"application/vnd.ms-word.document.macroenabled.12\",\n dotx: \"application/vnd.openxmlformats-officedocument.wordprocessingml.template\",\n dotm: \"application/vnd.ms-word.template.macroenabled.12\",\n dot: \"application/msword\",\n doc: \"application/msword\",\n rtf: \"application/rtf\",\n odt: \"application/vnd.oasis.opendocument.text\",\n fodt: \"application/vnd.oasis.opendocument.text-flat-xml\",\n wps: \"application/vnd.ms-works\",\n xlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n xltx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.template\",\n xls: \"application/vnd.ms-excel\",\n xlsm: \"application/vnd.ms-excel.sheet.macroenabled.12\",\n xltm: \"application/vnd.ms-excel.template.macroenabled.12\",\n xlsb: \"application/vnd.ms-excel.sheet.binary.macroenabled.12\",\n ods: \"application/vnd.oasis.opendocument.spreadsheet\",\n fods: \"application/vnd.oasis.opendocument.spreadsheet-flat-xml\",\n numbers: \"application/vnd.apple.numbers\",\n et: \"application/vnd.ms-excel\",\n pptx: \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n pptm: \"application/vnd.ms-powerpoint.presentation.macroenabled.12\",\n ppsx: \"application/vnd.openxmlformats-officedocument.presentationml.slideshow\",\n ppsm: \"application/vnd.ms-powerpoint.slideshow.macroenabled.12\",\n potx: \"application/vnd.openxmlformats-officedocument.presentationml.template\",\n potm: \"application/vnd.ms-powerpoint.template.macroenabled.12\",\n ppt: \"application/vnd.ms-powerpoint\",\n pps: \"application/vnd.ms-powerpoint\",\n odp: \"application/vnd.oasis.opendocument.presentation\",\n fodp: \"application/vnd.oasis.opendocument.presentation-flat-xml\",\n key: \"application/vnd.apple.keynote\",\n dps: \"application/vnd.ms-powerpoint\",\n eml: \"message/rfc822\",\n msg: \"application/vnd.ms-outlook\",\n mbox: \"application/mbox\",\n ofd: \"application/ofd\",\n gltf: \"model/gltf+json\",\n glb: \"model/gltf-binary\",\n stl: \"model/stl\",\n obj: \"model/obj\",\n \"3ds\": \"model/3ds\",\n fbx: \"application/vnd.autodesk.fbx\",\n dae: \"model/vnd.collada+xml\",\n ply: \"application/ply\",\n \"3mf\": \"model/3mf\",\n usdz: \"model/vnd.usdz+zip\",\n usdc: \"model/vnd.usd\",\n usda: \"model/vnd.usd\",\n usd: \"model/vnd.usd\",\n wrl: \"model/vrml\",\n vrml: \"model/vrml\",\n dxf: \"image/vnd.dxf\",\n dwg: \"application/acad\",\n dwf: \"model/vnd.dwf\",\n step: \"model/step\",\n stp: \"model/step\",\n iges: \"application/iges\",\n igs: \"application/iges\",\n ifc: \"application/x-step\",\n sat: \"application/sat\",\n sab: \"application/sab\",\n \"x_t\": \"application/x-parasolid\",\n \"x_b\": \"application/x-parasolid\",\n \"3dm\": \"model/vnd.3dm\",\n skp: \"application/vnd.sketchup.skp\",\n sldprt: \"application/sldworks\",\n sldasm: \"application/sldworks\",\n ttf: \"font/ttf\",\n otf: \"font/otf\",\n woff: \"font/woff\",\n woff2: \"font/woff2\",\n eot: \"application/vnd.ms-fontobject\",\n psd: \"image/vnd.adobe.photoshop\",\n psb: \"image/vnd.adobe.photoshop\",\n ai: \"application/postscript\",\n eps: \"application/postscript\",\n ps: \"application/postscript\",\n webarchive: \"application/x-webarchive\",\n sqlite: \"application/vnd.sqlite3\",\n sqlite3: \"application/vnd.sqlite3\",\n db: \"application/vnd.sqlite3\",\n wasm: \"application/wasm\",\n parquet: \"application/vnd.apache.parquet\",\n avro: \"application/avro\"\n};\n\nexport async function normalizeFile(\n source: PreviewSource,\n fileName?: string,\n mimeType?: string\n): Promise<PreviewFile> {\n if (typeof source === \"string\") {\n const name = fileName || source.split(\"?\")[0]?.split(\"/\").pop() || \"remote-file\";\n const extension = getExtension(name);\n return {\n source,\n name,\n extension,\n mimeType: mimeType || extensionMimeMap[extension] || \"\",\n url: source\n };\n }\n\n if (source instanceof File) {\n const extension = getExtension(fileName || source.name);\n return {\n source,\n name: fileName || source.name,\n extension,\n mimeType: mimeType || source.type || extensionMimeMap[extension] || \"\",\n size: source.size,\n blob: source\n };\n }\n\n if (source instanceof Blob) {\n const name = fileName || \"blob\";\n const extension = getExtension(name);\n return {\n source,\n name,\n extension,\n mimeType: mimeType || source.type || extensionMimeMap[extension] || \"\",\n size: source.size,\n blob: source\n };\n }\n\n const name = fileName || \"buffer\";\n const extension = getExtension(name);\n const blob = new Blob([source], { type: mimeType || extensionMimeMap[extension] || \"\" });\n return {\n source,\n name,\n extension,\n mimeType: blob.type,\n size: blob.size,\n blob\n };\n}\n\nexport function getExtension(name: string): string {\n const clean = name.split(\"?\")[0]?.split(\"#\")[0] || \"\";\n const index = clean.lastIndexOf(\".\");\n return index >= 0 ? clean.slice(index + 1).toLowerCase() : \"\";\n}\n\nexport function isTextLike(file: PreviewFile): boolean {\n const textFileName = normalizeFileName(file.name);\n const textFileStem = textFileName.split(\".\")[0];\n return (\n file.mimeType.startsWith(\"text/\") ||\n [\n \"application/json\",\n \"application/json5\",\n \"application/x-ipynb+json\",\n \"application/xml\",\n \"application/yaml\",\n \"application/x-yaml\",\n \"application/sql\",\n \"application/x-sh\",\n \"application/x-httpd-php\",\n \"application/javascript\",\n \"application/x-javascript\",\n \"application/typescript\",\n \"application/x-typescript\",\n \"application/toml\",\n \"application/x-toml\",\n \"application/x-ndjson\",\n \"application/graphql\",\n \"application/x-pem-file\",\n \"application/x-x509-ca-cert\",\n \"application/pkix-cert\",\n \"application/x-tex\",\n \"message/http\",\n \"text/calendar\",\n \"text/vcard\",\n \"text/x-bibtex\",\n \"text/x-hcl\",\n \"text/x-protobuf\",\n \"text/vnd.graphviz\"\n ].includes(file.mimeType) ||\n [\n \"txt\",\n \"json\",\n \"jsonc\",\n \"json5\",\n \"ipynb\",\n \"jsonl\",\n \"ndjson\",\n \"xml\",\n \"yaml\",\n \"yml\",\n \"csv\",\n \"log\",\n \"env\",\n \"gitignore\",\n \"dockerignore\",\n \"npmrc\",\n \"yarnrc\",\n \"pnpmrc\",\n \"editorconfig\",\n \"browserslistrc\",\n \"prettierrc\",\n \"eslintrc\",\n \"stylelintrc\",\n \"conf\",\n \"config\",\n \"properties\",\n \"lock\",\n \"md\",\n \"markdown\",\n \"js\",\n \"mjs\",\n \"cjs\",\n \"ts\",\n \"tsx\",\n \"jsx\",\n \"vue\",\n \"css\",\n \"scss\",\n \"less\",\n \"html\",\n \"htm\",\n \"toml\",\n \"ini\",\n \"proto\",\n \"tf\",\n \"tfvars\",\n \"hcl\",\n \"tex\",\n \"latex\",\n \"bib\",\n \"gv\",\n \"http\",\n \"java\",\n \"py\",\n \"go\",\n \"rs\",\n \"rb\",\n \"swift\",\n \"kt\",\n \"kts\",\n \"scala\",\n \"lua\",\n \"r\",\n \"dart\",\n \"svelte\",\n \"astro\",\n \"elm\",\n \"ex\",\n \"exs\",\n \"clj\",\n \"cljs\",\n \"erl\",\n \"hrl\",\n \"fs\",\n \"fsx\",\n \"hs\",\n \"lhs\",\n \"php\",\n \"c\",\n \"cpp\",\n \"h\",\n \"hpp\",\n \"cs\",\n \"sql\",\n \"sh\",\n \"bash\",\n \"zsh\",\n \"fish\",\n \"ps1\",\n \"bat\",\n \"cmd\",\n \"dockerfile\",\n \"nginxconf\",\n \"gradle\",\n \"graphql\",\n \"gql\",\n \"pem\",\n \"crt\",\n \"cer\",\n \"ics\",\n \"vcf\",\n \"diff\",\n \"patch\"\n ].includes(file.extension) ||\n [\n \"dockerfile\",\n \"makefile\",\n \"rakefile\",\n \"gemfile\",\n \"procfile\",\n \"jenkinsfile\",\n \"vagrantfile\",\n \"brewfile\",\n \"podfile\",\n \"go.mod\",\n \"go.sum\",\n \"cargo.toml\",\n \"cargo.lock\",\n \".gitignore\",\n \".dockerignore\",\n \".npmrc\",\n \".yarnrc\",\n \".pnpmrc\",\n \".editorconfig\",\n \".browserslistrc\",\n \".prettierrc\",\n \".eslintrc\",\n \".stylelintrc\"\n ].includes(textFileName) ||\n [\n \"readme\",\n \"changelog\",\n \"changes\",\n \"history\",\n \"license\",\n \"licence\",\n \"copying\",\n \"notice\",\n \"authors\",\n \"contributors\",\n \"codeowners\"\n ].includes(textFileStem)\n );\n}\n\nfunction normalizeFileName(name: string): string {\n const baseName = name.split(/[\\\\/]/).pop() || name;\n return baseName.toLowerCase();\n}\n","import type { PreviewSize } from \"./types\";\n\nexport function resolveContainer(container: HTMLElement | string): HTMLElement {\n if (typeof container !== \"string\") {\n return container;\n }\n\n const element = document.querySelector<HTMLElement>(container);\n if (!element) {\n throw new Error(`File viewer container not found: ${container}`);\n }\n return element;\n}\n\nexport function applyBoxSize(\n element: HTMLElement,\n width?: number | string,\n height?: number | string\n): void {\n if (width !== undefined) {\n element.style.width = typeof width === \"number\" ? `${width}px` : width;\n }\n if (height !== undefined) {\n element.style.height = typeof height === \"number\" ? `${height}px` : height;\n }\n}\n\nexport function getElementSize(element: HTMLElement): PreviewSize {\n const rect = element.getBoundingClientRect();\n return {\n width: Math.max(0, Math.round(rect.width)),\n height: Math.max(0, Math.round(rect.height))\n };\n}\n\nexport function createObjectUrl(file: { url?: string; blob?: Blob }): string {\n if (file.url) {\n return file.url;\n }\n if (!file.blob) {\n throw new Error(\"File source cannot be converted to an object URL.\");\n }\n return URL.createObjectURL(file.blob);\n}\n\nexport function revokeObjectUrl(url: string, isExternal: boolean): void {\n if (!isExternal) {\n URL.revokeObjectURL(url);\n }\n}\n","import { createObjectUrl, revokeObjectUrl } from \"../dom\";\nimport type { PreviewPlugin } from \"../types\";\n\nexport function fallbackPlugin(): PreviewPlugin {\n return {\n name: \"fallback\",\n match() {\n return true;\n },\n render(ctx) {\n ctx.options.onUnsupported?.(ctx.file);\n if (ctx.options.fallback === \"custom\" && ctx.options.renderFallback) {\n return ctx.options.renderFallback(ctx);\n }\n\n const url = createObjectUrl(ctx.file);\n const isExternal = Boolean(ctx.file.url);\n const panel = document.createElement(\"div\");\n panel.className = \"ofv-fallback\";\n\n const title = document.createElement(\"strong\");\n title.textContent =\n ctx.options.fallback === \"download\"\n ? \"当前文件可下载后查看\"\n : \"当前文件暂不支持在线预览\";\n\n const meta = createFallbackMeta(ctx.file);\n\n const download = document.createElement(\"a\");\n download.href = url;\n download.download = ctx.file.name;\n download.textContent = \"下载文件\";\n\n panel.append(title, meta, download);\n ctx.viewport.classList.add(\"ofv-center\");\n ctx.viewport.append(panel);\n\n if (ctx.options.fallback === \"download\") {\n download.focus();\n }\n\n return {\n destroy() {\n ctx.viewport.classList.remove(\"ofv-center\");\n revokeObjectUrl(url, isExternal);\n }\n };\n }\n };\n}\n\nfunction createFallbackMeta(file: { name: string; extension: string; mimeType: string; size?: number; url?: string }): HTMLElement {\n const meta = document.createElement(\"dl\");\n meta.className = \"ofv-fallback-meta\";\n appendFallbackMeta(meta, \"文件\", file.name || \"未命名文件\");\n appendFallbackMeta(meta, \"格式\", file.extension ? `.${file.extension}` : \"未知\");\n appendFallbackMeta(meta, \"MIME\", file.mimeType || \"未声明\");\n appendFallbackMeta(meta, \"大小\", file.size === undefined ? \"未知\" : formatFallbackBytes(file.size));\n appendFallbackMeta(meta, \"来源\", file.url ? \"远程 URL\" : \"本地/内存文件\");\n return meta;\n}\n\nfunction appendFallbackMeta(parent: HTMLElement, label: string, value: string): void {\n const key = document.createElement(\"dt\");\n key.textContent = label;\n const content = document.createElement(\"dd\");\n content.textContent = value;\n parent.append(key, content);\n}\n\nfunction formatFallbackBytes(bytes: number): string {\n if (bytes < 1024) {\n return `${bytes} B`;\n }\n if (bytes < 1024 * 1024) {\n return `${(bytes / 1024).toFixed(1)} KB`;\n }\n return `${(bytes / 1024 / 1024).toFixed(2)} MB`;\n}\n","import { normalizeFile } from \"./detect\";\nimport { applyBoxSize, createObjectUrl, getElementSize, resolveContainer, revokeObjectUrl } from \"./dom\";\nimport { fallbackPlugin } from \"./plugins/fallback\";\nimport type {\n FileViewer,\n PreviewFile,\n PreviewCommand,\n PreviewInstance,\n PreviewItem,\n PreviewOptions,\n PreviewPlugin,\n PreviewSource,\n PreviewToolbarActionId,\n PreviewToolbarBuiltInAction,\n PreviewToolbarCustomAction,\n PreviewToolbarOptions\n} from \"./types\";\n\nexport function createViewer(options: PreviewOptions): FileViewer {\n const container = resolveContainer(options.container);\n applyBoxSize(container, options.width, options.height);\n\n container.classList.add(\"ofv-root\");\n if (options.className) {\n container.classList.add(options.className);\n }\n const theme = applyTheme(container, options.theme || \"light\");\n\n const host = document.createElement(\"div\");\n host.className = \"ofv-host\";\n\n const status = document.createElement(\"div\");\n status.className = \"ofv-status\";\n status.hidden = true;\n\n const viewport = document.createElement(\"div\");\n viewport.className = \"ofv-viewport\";\n\n const queue = normalizeQueue(options);\n let currentIndex = clampIndex(options.initialIndex || 0, queue.length);\n let currentInstance: PreviewInstance | undefined;\n\n const goTo = async (index: number) => {\n if (destroyed || queue.length === 0) {\n return;\n }\n currentIndex = clampIndex(index, queue.length);\n await renderQueueItem(currentIndex);\n };\n\n const toolbar = createToolbar(options.toolbar, viewport, {\n getLength: () => queue.length,\n next: () => goTo(currentIndex + 1),\n previous: () => goTo(currentIndex - 1),\n command: (command) => currentInstance?.command?.(command)\n });\n if (toolbar) {\n host.append(toolbar.element);\n }\n\n host.append(status, viewport);\n container.replaceChildren(host);\n\n const normalizedOptions = {\n fit: options.fit || \"contain\",\n fallback: options.fallback || \"inline\",\n ...options\n };\n\n let destroyed = false;\n let renderToken = 0;\n\n const setLoading = (loading: boolean) => {\n status.hidden = !loading;\n status.textContent = loading ? \"Loading preview...\" : \"\";\n };\n\n const setError = (error: Error | string) => {\n status.hidden = false;\n status.textContent = typeof error === \"string\" ? error : error.message;\n };\n\n const resize = () => {\n if (destroyed) {\n return;\n }\n const size = getElementSize(viewport);\n currentInstance?.resize?.(size);\n };\n\n const resizeObserver = observeResize(container, resize);\n\n const renderFile = async (file: PreviewFile) => {\n const token = (renderToken += 1);\n currentInstance?.destroy();\n currentInstance = undefined;\n viewport.replaceChildren();\n setLoading(true);\n toolbar?.update(file, currentIndex, queue.length);\n\n const plugins = [...(options.plugins || []), fallbackPlugin()];\n const plugin = await findPlugin(plugins, file);\n if (destroyed || token !== renderToken) {\n return;\n }\n\n try {\n const nextInstance = await plugin.render({\n host,\n viewport,\n file,\n size: getElementSize(viewport),\n options: normalizedOptions,\n toolbar: toolbar?.getContext(),\n setLoading,\n setError\n });\n if (destroyed || token !== renderToken) {\n nextInstance.destroy();\n return;\n }\n currentInstance = nextInstance;\n setLoading(false);\n toolbar?.setCommandSupport((command) =>\n Boolean(nextInstance.command) && (nextInstance.canCommand ? nextInstance.canCommand(command) : true)\n );\n options.onLoad?.(file);\n resize();\n } catch (error) {\n if (destroyed || token !== renderToken) {\n return;\n }\n const normalizedError = error instanceof Error ? error : new Error(String(error));\n setLoading(false);\n setError(normalizedError);\n options.onError?.(normalizedError, file);\n }\n };\n\n async function renderQueueItem(index: number) {\n const item = queue[index];\n const file = await normalizeFile(item.file, item.fileName, item.mimeType);\n await renderFile(file);\n }\n\n void goTo(currentIndex);\n\n return {\n async reload(file) {\n if (destroyed) {\n return;\n }\n if (file !== undefined) {\n const currentItem = queue[currentIndex];\n queue.splice(currentIndex, 1, createReloadItem(file, currentItem, options));\n }\n await renderQueueItem(currentIndex);\n },\n async next() {\n await goTo(currentIndex + 1);\n },\n async previous() {\n await goTo(currentIndex - 1);\n },\n goTo,\n getCurrentIndex() {\n return currentIndex;\n },\n resize,\n destroy() {\n destroyed = true;\n renderToken += 1;\n resizeObserver.destroy();\n currentInstance?.destroy();\n toolbar?.destroy();\n theme.destroy();\n container.replaceChildren();\n container.classList.remove(\"ofv-root\");\n if (options.className) {\n container.classList.remove(options.className);\n }\n }\n };\n}\n\nfunction normalizeQueue(options: PreviewOptions): PreviewItem[] {\n if (options.files && options.files.length > 0) {\n return options.files.map((item) =>\n isPreviewItem(item)\n ? item\n : {\n file: item\n }\n );\n }\n if (options.file === undefined) {\n throw new Error(\"File viewer requires either file or files.\");\n }\n return [\n {\n file: options.file,\n fileName: options.fileName,\n mimeType: options.mimeType\n }\n ];\n}\n\nfunction isPreviewItem(item: PreviewSource | PreviewItem): item is PreviewItem {\n return typeof item === \"object\" && item !== null && \"file\" in item;\n}\n\nfunction createReloadItem(\n file: PreviewSource,\n currentItem: PreviewItem | undefined,\n options: PreviewOptions\n): PreviewItem {\n if (typeof File !== \"undefined\" && file instanceof File) {\n return { file };\n }\n return {\n file,\n fileName: currentItem?.fileName || options.fileName,\n mimeType: currentItem?.mimeType || options.mimeType\n };\n}\n\nfunction clampIndex(index: number, length: number): number {\n if (length <= 0) {\n return 0;\n }\n return Math.min(Math.max(index, 0), length - 1);\n}\n\nfunction applyTheme(\n container: HTMLElement,\n theme: NonNullable<PreviewOptions[\"theme\"]>\n): { destroy: () => void } {\n const media = window.matchMedia?.(\"(prefers-color-scheme: dark)\");\n const classes = [\"ofv-theme-light\", \"ofv-theme-dark\"];\n\n const setThemeClass = () => {\n container.classList.remove(...classes);\n const resolvedTheme = theme === \"auto\" && media?.matches ? \"dark\" : theme === \"auto\" ? \"light\" : theme;\n container.classList.add(`ofv-theme-${resolvedTheme}`);\n };\n\n setThemeClass();\n if (theme === \"auto\") {\n addMediaListener(media, setThemeClass);\n }\n\n return {\n destroy() {\n if (theme === \"auto\") {\n removeMediaListener(media, setThemeClass);\n }\n container.classList.remove(...classes);\n }\n };\n}\n\nfunction observeResize(element: HTMLElement, callback: () => void): { destroy: () => void } {\n if (typeof ResizeObserver !== \"undefined\") {\n const observer = new ResizeObserver(callback);\n observer.observe(element);\n return {\n destroy() {\n observer.disconnect();\n }\n };\n }\n\n window.addEventListener(\"resize\", callback);\n return {\n destroy() {\n window.removeEventListener(\"resize\", callback);\n }\n };\n}\n\ntype CompatibleMediaQueryList = MediaQueryList & {\n addListener?: (listener: () => void) => void;\n removeListener?: (listener: () => void) => void;\n};\n\nfunction addMediaListener(media: CompatibleMediaQueryList | undefined, listener: () => void): void {\n if (!media) {\n return;\n }\n if (typeof media.addEventListener === \"function\") {\n media.addEventListener(\"change\", listener);\n return;\n }\n media.addListener?.(listener);\n}\n\nfunction removeMediaListener(media: CompatibleMediaQueryList | undefined, listener: () => void): void {\n if (!media) {\n return;\n }\n if (typeof media.removeEventListener === \"function\") {\n media.removeEventListener(\"change\", listener);\n return;\n }\n media.removeListener?.(listener);\n}\n\nfunction createToolbar(\n toolbar: PreviewOptions[\"toolbar\"],\n viewport: HTMLElement,\n queue: {\n getLength: () => number;\n next: () => void | Promise<void>;\n previous: () => void | Promise<void>;\n command: (command: PreviewCommand) => void | boolean | undefined;\n }\n):\n | {\n element: HTMLElement;\n update: (file: PreviewFile, index: number, length: number) => void;\n setCommandSupport: (isSupported: (command: PreviewCommand) => boolean) => void;\n getContext: () => ReturnType<typeof createToolbarContext>;\n setZoom: (zoom?: number) => void;\n destroy: () => void;\n }\n | undefined {\n if (!toolbar) {\n return undefined;\n }\n\n const options: PreviewToolbarOptions =\n typeof toolbar === \"boolean\"\n ? { zoom: true, rotate: true, download: true, fullscreen: true, print: true, search: true }\n : toolbar;\n\n const element = document.createElement(\"div\");\n element.className = \"ofv-toolbar\";\n element.setAttribute(\"role\", \"toolbar\");\n element.setAttribute(\"aria-label\", \"File preview toolbar\");\n\n let file: PreviewFile | undefined;\n let currentIndex = 0;\n let currentLength = queue.getLength();\n let queueLabel: HTMLSpanElement | undefined;\n let previousButton: HTMLButtonElement | undefined;\n let nextButton: HTMLButtonElement | undefined;\n let zoomResetButton: HTMLButtonElement | undefined;\n let currentZoom: number | undefined;\n const commandButtons: Array<{ button: HTMLButtonElement; command: PreviewCommand }> = [];\n const customButtons: Array<{ button: HTMLButtonElement; action: PreviewToolbarCustomAction }> = [];\n const disposers: Array<() => void> = [];\n const search = createSearchController(viewport);\n let searchInput: HTMLInputElement | undefined;\n let searchCount: HTMLSpanElement | undefined;\n let canRunCommand = (_command: PreviewCommand) => false;\n\n const getContext = () =>\n createToolbarContext({\n file,\n index: currentIndex,\n length: currentLength,\n viewport,\n queue,\n element,\n search,\n canCommand: canRunCommand,\n zoom: currentZoom,\n setZoom\n });\n\n const addButton = (\n label: string,\n title: string,\n action: () => void,\n className?: string,\n icon?: string | HTMLElement | SVGElement\n ) => {\n const button = document.createElement(\"button\");\n button.type = \"button\";\n setToolbarButtonContent(button, label, icon);\n button.title = title;\n button.setAttribute(\"aria-label\", title);\n if (className) {\n button.className = className;\n }\n button.addEventListener(\"click\", action);\n element.append(button);\n disposers.push(() => button.removeEventListener(\"click\", action));\n return button;\n };\n\n const addCommandButton = (\n id: PreviewToolbarBuiltInAction,\n label: string,\n title: string,\n command: PreviewCommand\n ) => {\n const button = addButton(label, title, () => {\n queue.command(command);\n }, undefined, options.icons?.[id]);\n button.disabled = true;\n commandButtons.push({ button, command });\n };\n\n const renderDefaultAction = (id: PreviewToolbarActionId) => {\n if (!isBuiltInToolbarAction(id)) {\n const customAction = options.actions?.find((action) => action.id === id);\n if (customAction) {\n renderCustomAction(customAction);\n }\n return;\n }\n\n if (id === \"previous\" && queue.getLength() > 1) {\n previousButton = addButton(\n getToolbarLabel(options, \"previous\"),\n getToolbarTitle(options, \"previous\"),\n () => void queue.previous(),\n undefined,\n options.icons?.previous\n );\n return;\n }\n if (id === \"next\" && queue.getLength() > 1) {\n nextButton = addButton(\n getToolbarLabel(options, \"next\"),\n getToolbarTitle(options, \"next\"),\n () => void queue.next(),\n undefined,\n options.icons?.next\n );\n return;\n }\n if (id === \"queue\" && queue.getLength() > 1) {\n queueLabel = document.createElement(\"span\");\n queueLabel.className = \"ofv-toolbar-queue\";\n element.append(queueLabel);\n return;\n }\n if (id === \"zoom-out\" && options.zoom) {\n addCommandButton(id, getToolbarLabel(options, id), getToolbarTitle(options, id), \"zoom-out\");\n return;\n }\n if (id === \"zoom-in\" && options.zoom) {\n addCommandButton(id, getToolbarLabel(options, id), getToolbarTitle(options, id), \"zoom-in\");\n return;\n }\n if (id === \"zoom-reset\" && options.zoom) {\n addCommandButton(id, getToolbarLabel(options, id), getToolbarTitle(options, id), \"zoom-reset\");\n zoomResetButton = commandButtons[commandButtons.length - 1]?.button;\n updateZoomLabel();\n return;\n }\n if (id === \"rotate-right\" && options.rotate) {\n addCommandButton(id, getToolbarLabel(options, id), getToolbarTitle(options, id), \"rotate-right\");\n return;\n }\n if (id === \"download\" && options.download !== false) {\n addButton(\n getToolbarLabel(options, id),\n getToolbarTitle(options, id),\n () => getContext().download(),\n undefined,\n options.icons?.download\n );\n return;\n }\n if (id === \"fullscreen\" && options.fullscreen !== false) {\n addButton(\n getToolbarLabel(options, id),\n getToolbarTitle(options, id),\n () => getContext().fullscreen(),\n undefined,\n options.icons?.fullscreen\n );\n return;\n }\n if (id === \"print\" && options.print) {\n addButton(\n getToolbarLabel(options, id),\n getToolbarTitle(options, id),\n () => getContext().print(),\n undefined,\n options.icons?.print\n );\n return;\n }\n if (id === \"search\" && options.search !== false) {\n renderSearchControl();\n return;\n }\n\n };\n\n const renderCustomAction = (action: PreviewToolbarCustomAction) => {\n const button = addButton(\n action.label,\n action.title || action.label,\n () => void action.onClick(getContext()),\n action.className,\n action.icon\n );\n button.dataset.ofvToolbarAction = action.id;\n customButtons.push({ button, action });\n };\n\n const renderSearchControl = () => {\n const searchGroup = document.createElement(\"div\");\n searchGroup.className = \"ofv-toolbar-search\";\n searchGroup.title = getToolbarTitle(options, \"search\");\n const nextSearchInput = document.createElement(\"input\");\n nextSearchInput.type = \"search\";\n nextSearchInput.placeholder = getToolbarLabel(options, \"search\");\n nextSearchInput.setAttribute(\"aria-label\", getToolbarTitle(options, \"search\"));\n const nextSearchCount = document.createElement(\"span\");\n nextSearchCount.className = \"ofv-toolbar-search-count\";\n searchInput = nextSearchInput;\n searchCount = nextSearchCount;\n\n const runSearch = () => {\n const count = search.search(nextSearchInput.value);\n nextSearchCount.textContent = nextSearchInput.value ? String(count) : \"\";\n };\n\n nextSearchInput.addEventListener(\"input\", runSearch);\n searchGroup.append(nextSearchInput, nextSearchCount);\n element.append(searchGroup);\n disposers.push(() => nextSearchInput.removeEventListener(\"input\", runSearch));\n };\n\n const renderToolbar = () => {\n if (options.render) {\n element.replaceChildren();\n const customElement = options.render(getContext());\n if (customElement) {\n element.append(customElement);\n }\n return;\n }\n getToolbarOrder(options, queue.getLength()).forEach(renderDefaultAction);\n getImplicitCustomActions(options).forEach(renderCustomAction);\n };\n\n renderToolbar();\n\n const updateCustomButtons = () => {\n const context = getContext();\n for (const { button, action } of customButtons) {\n button.disabled = evaluateToolbarFlag(action.disabled, context);\n button.hidden = evaluateToolbarFlag(action.hidden, context);\n }\n };\n\n const resetSearch = () => {\n search.clear();\n if (searchInput) {\n searchInput.value = \"\";\n }\n if (searchCount) {\n searchCount.textContent = \"\";\n }\n };\n\n function setZoom(zoom?: number) {\n currentZoom = typeof zoom === \"number\" && Number.isFinite(zoom) && zoom > 0 ? zoom : undefined;\n updateZoomLabel();\n updateCustomButtons();\n refreshCustomRender();\n }\n\n function updateZoomLabel() {\n if (!zoomResetButton) {\n return;\n }\n setToolbarButtonContent(\n zoomResetButton,\n currentZoom === undefined ? getToolbarLabel(options, \"zoom-reset\") : formatToolbarZoom(currentZoom),\n options.icons?.[\"zoom-reset\"]\n );\n }\n\n const refreshCustomRender = () => {\n if (!options.render) {\n return;\n }\n element.replaceChildren();\n const customElement = options.render(getContext());\n if (customElement) {\n element.append(customElement);\n }\n };\n\n return {\n element,\n update(nextFile, index, length) {\n file = nextFile;\n currentIndex = index;\n currentLength = length;\n currentZoom = undefined;\n updateZoomLabel();\n resetSearch();\n commandButtons.forEach(({ button }) => {\n button.disabled = true;\n });\n if (queueLabel) {\n queueLabel.textContent = `${index + 1} / ${length}`;\n }\n if (previousButton) {\n previousButton.disabled = index <= 0;\n }\n if (nextButton) {\n nextButton.disabled = index >= length - 1;\n }\n updateCustomButtons();\n refreshCustomRender();\n },\n setCommandSupport(isSupported) {\n canRunCommand = isSupported;\n commandButtons.forEach(({ button, command }) => {\n button.disabled = !isSupported(command);\n });\n updateCustomButtons();\n refreshCustomRender();\n },\n getContext,\n setZoom,\n destroy() {\n search.clear();\n for (const dispose of disposers) {\n dispose();\n }\n element.replaceChildren();\n }\n };\n}\n\nfunction createToolbarContext({\n file,\n index,\n length,\n viewport,\n queue,\n element,\n search,\n canCommand,\n zoom,\n setZoom\n}: {\n file?: PreviewFile;\n index: number;\n length: number;\n viewport: HTMLElement;\n queue: {\n next: () => void | Promise<void>;\n previous: () => void | Promise<void>;\n command: (command: PreviewCommand) => void | boolean | undefined;\n };\n element: HTMLElement;\n search: ReturnType<typeof createSearchController>;\n canCommand: (command: PreviewCommand) => boolean;\n zoom?: number;\n setZoom: (zoom?: number) => void;\n}) {\n return {\n file,\n index,\n length,\n viewport,\n canPrevious: index > 0,\n canNext: index < length - 1,\n zoom,\n zoomLabel: zoom === undefined ? undefined : formatToolbarZoom(zoom),\n async previous() {\n await queue.previous();\n },\n async next() {\n await queue.next();\n },\n command: queue.command,\n canCommand,\n setZoom,\n download() {\n if (file) {\n downloadFile(file);\n }\n },\n fullscreen() {\n void element.parentElement?.requestFullscreen?.();\n },\n print() {\n printPreview(viewport);\n },\n search: search.search,\n clearSearch: search.clear\n };\n}\n\nconst defaultToolbarLabels: Record<PreviewToolbarBuiltInAction, string> = {\n previous: \"Prev\",\n next: \"Next\",\n queue: \"\",\n \"zoom-out\": \"-\",\n \"zoom-in\": \"+\",\n \"zoom-reset\": \"100%\",\n \"rotate-right\": \"Rotate\",\n download: \"Download\",\n fullscreen: \"Fullscreen\",\n print: \"Print\",\n search: \"Search\"\n};\n\nconst defaultToolbarTitles: Record<PreviewToolbarBuiltInAction, string> = {\n previous: \"Previous file\",\n next: \"Next file\",\n queue: \"Current file position\",\n \"zoom-out\": \"Zoom out\",\n \"zoom-in\": \"Zoom in\",\n \"zoom-reset\": \"Reset zoom\",\n \"rotate-right\": \"Rotate right\",\n download: \"Download file\",\n fullscreen: \"Open preview fullscreen\",\n print: \"Print preview\",\n search: \"Search preview text\"\n};\n\nfunction getToolbarLabel(options: PreviewToolbarOptions, id: PreviewToolbarBuiltInAction): string {\n return options.labels?.[id] ?? defaultToolbarLabels[id];\n}\n\nfunction getToolbarTitle(options: PreviewToolbarOptions, id: PreviewToolbarBuiltInAction): string {\n return options.titles?.[id] ?? options.labels?.[id] ?? defaultToolbarTitles[id];\n}\n\nfunction formatToolbarZoom(zoom: number): string {\n return `${Math.round(zoom * 100)}%`;\n}\n\nfunction getToolbarOrder(options: PreviewToolbarOptions, queueLength: number): PreviewToolbarActionId[] {\n if (options.order) {\n return options.order;\n }\n\n const actions: PreviewToolbarActionId[] = [];\n if (queueLength > 1) {\n actions.push(\"previous\", \"next\", \"queue\");\n }\n if (options.zoom) {\n actions.push(\"zoom-out\", \"zoom-in\", \"zoom-reset\");\n }\n if (options.rotate) {\n actions.push(\"rotate-right\");\n }\n if (options.download !== false) {\n actions.push(\"download\");\n }\n if (options.fullscreen !== false) {\n actions.push(\"fullscreen\");\n }\n if (options.print) {\n actions.push(\"print\");\n }\n if (options.search !== false) {\n actions.push(\"search\");\n }\n return actions;\n}\n\nfunction getImplicitCustomActions(options: PreviewToolbarOptions): PreviewToolbarCustomAction[] {\n if (options.order || !options.actions) {\n return [];\n }\n return [...options.actions].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n}\n\nfunction evaluateToolbarFlag(\n value: boolean | ((ctx: ReturnType<typeof createToolbarContext>) => boolean) | undefined,\n context: ReturnType<typeof createToolbarContext>\n): boolean {\n return typeof value === \"function\" ? value(context) : Boolean(value);\n}\n\nfunction setToolbarButtonContent(\n button: HTMLButtonElement,\n label: string,\n icon?: string | HTMLElement | SVGElement\n): void {\n button.replaceChildren();\n if (!icon) {\n button.textContent = label;\n return;\n }\n\n const iconElement = document.createElement(\"span\");\n iconElement.className = \"ofv-toolbar-icon\";\n iconElement.setAttribute(\"aria-hidden\", \"true\");\n if (typeof icon === \"string\") {\n iconElement.append(sanitizeToolbarIcon(icon));\n } else {\n iconElement.append(icon.cloneNode(true));\n }\n\n const labelElement = document.createElement(\"span\");\n labelElement.className = \"ofv-toolbar-label\";\n labelElement.textContent = label;\n button.append(iconElement, labelElement);\n}\n\nconst allowedToolbarIconTags = new Set([\n \"svg\",\n \"g\",\n \"path\",\n \"circle\",\n \"rect\",\n \"line\",\n \"polyline\",\n \"polygon\",\n \"ellipse\",\n \"defs\",\n \"title\",\n \"desc\"\n]);\n\nconst allowedToolbarIconAttrs = new Set([\n \"aria-hidden\",\n \"class\",\n \"cx\",\n \"cy\",\n \"d\",\n \"fill\",\n \"focusable\",\n \"height\",\n \"id\",\n \"points\",\n \"r\",\n \"rx\",\n \"ry\",\n \"stroke\",\n \"stroke-linecap\",\n \"stroke-linejoin\",\n \"stroke-width\",\n \"transform\",\n \"viewBox\",\n \"width\",\n \"x\",\n \"x1\",\n \"x2\",\n \"y\",\n \"y1\",\n \"y2\"\n]);\n\nfunction sanitizeToolbarIcon(icon: string): Node {\n const template = document.createElement(\"template\");\n template.innerHTML = icon.trim();\n const fragment = document.createDocumentFragment();\n for (const child of Array.from(template.content.childNodes)) {\n const sanitized = sanitizeToolbarIconNode(child);\n if (sanitized) {\n fragment.append(sanitized);\n }\n }\n return fragment;\n}\n\nfunction sanitizeToolbarIconNode(node: Node): Node | null {\n if (node.nodeType === Node.TEXT_NODE) {\n const text = node.textContent || \"\";\n return text.trim() ? document.createTextNode(text) : null;\n }\n\n if (!(node instanceof Element)) {\n return null;\n }\n\n const tagName = node.tagName.toLowerCase();\n if (!allowedToolbarIconTags.has(tagName)) {\n return null;\n }\n\n const sanitized = document.createElementNS(\"http://www.w3.org/2000/svg\", tagName);\n for (const attr of Array.from(node.attributes)) {\n if (isSafeToolbarIconAttribute(attr.name, attr.value)) {\n sanitized.setAttribute(attr.name, attr.value);\n }\n }\n\n for (const child of Array.from(node.childNodes)) {\n const sanitizedChild = sanitizeToolbarIconNode(child);\n if (sanitizedChild) {\n sanitized.append(sanitizedChild);\n }\n }\n\n return sanitized;\n}\n\nfunction isSafeToolbarIconAttribute(name: string, value: string): boolean {\n const attrName = name.toLowerCase();\n if (attrName.startsWith(\"on\") || attrName.includes(\":\")) {\n return false;\n }\n if (!allowedToolbarIconAttrs.has(name) && !allowedToolbarIconAttrs.has(attrName) && !attrName.startsWith(\"data-\")) {\n return false;\n }\n return !/^\\s*(?:javascript|data:text\\/html|vbscript):/i.test(value);\n}\n\nfunction isBuiltInToolbarAction(id: PreviewToolbarActionId): id is PreviewToolbarBuiltInAction {\n return id in defaultToolbarLabels;\n}\n\nfunction createSearchController(root: HTMLElement): {\n search: (query: string) => number;\n clear: () => void;\n} {\n const markerClass = \"ofv-search-match\";\n\n const clear = () => {\n const markers = collectSearchRoots(root).flatMap((searchRoot) => [\n ...searchRoot.querySelectorAll(`mark.${markerClass}`)\n ]);\n for (const marker of markers) {\n marker.replaceWith(document.createTextNode(marker.textContent || \"\"));\n }\n collectSearchRoots(root).forEach((searchRoot) => searchRoot.normalize());\n };\n\n const search = (query: string): number => {\n clear();\n const normalizedQuery = query.trim();\n if (!normalizedQuery) {\n return 0;\n }\n\n const textNodes = collectSearchRoots(root).flatMap((searchRoot) => collectSearchableTextNodes(searchRoot));\n let count = 0;\n let firstMatch: HTMLElement | undefined;\n\n for (const node of textNodes) {\n const text = node.nodeValue || \"\";\n const lowerText = text.toLowerCase();\n const lowerQuery = normalizedQuery.toLowerCase();\n let start = 0;\n let index = lowerText.indexOf(lowerQuery, start);\n if (index < 0) {\n continue;\n }\n\n const fragment = document.createDocumentFragment();\n while (index >= 0) {\n if (index > start) {\n fragment.append(document.createTextNode(text.slice(start, index)));\n }\n const marker = document.createElement(\"mark\");\n marker.className = markerClass;\n marker.textContent = text.slice(index, index + normalizedQuery.length);\n fragment.append(marker);\n firstMatch ||= marker;\n count += 1;\n start = index + normalizedQuery.length;\n index = lowerText.indexOf(lowerQuery, start);\n }\n if (start < text.length) {\n fragment.append(document.createTextNode(text.slice(start)));\n }\n node.replaceWith(fragment);\n }\n\n firstMatch?.scrollIntoView?.({ block: \"center\", inline: \"nearest\" });\n return count;\n };\n\n return { search, clear };\n}\n\nfunction collectSearchRoots(root: HTMLElement): HTMLElement[] {\n const roots = [root];\n for (const iframe of root.querySelectorAll<HTMLIFrameElement>(\"iframe\")) {\n try {\n const body = iframe.contentDocument?.body;\n if (body) {\n roots.push(body);\n }\n } catch {\n // Cross-origin or sandboxed frames without DOM access are skipped.\n }\n }\n return roots;\n}\n\nfunction collectSearchableTextNodes(root: HTMLElement): Text[] {\n const nodes: Text[] = [];\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, {\n acceptNode(node) {\n const parent = node.parentElement;\n if (!parent || !node.nodeValue?.trim()) {\n return NodeFilter.FILTER_REJECT;\n }\n if ([\"SCRIPT\", \"STYLE\", \"TEXTAREA\", \"INPUT\", \"BUTTON\"].includes(parent.tagName)) {\n return NodeFilter.FILTER_REJECT;\n }\n return NodeFilter.FILTER_ACCEPT;\n }\n });\n\n let current = walker.nextNode();\n while (current) {\n nodes.push(current as Text);\n current = walker.nextNode();\n }\n return nodes;\n}\n\nfunction printPreview(viewport: HTMLElement): void {\n const frame = document.createElement(\"iframe\");\n frame.className = \"ofv-print-frame\";\n frame.setAttribute(\"aria-hidden\", \"true\");\n document.body.append(frame);\n\n const clone = viewport.cloneNode(true) as HTMLElement;\n copyCanvasContent(viewport, clone);\n clone.classList.add(\"ofv-print-root\", \"ofv-root\"); // Add ofv-root class so CSS variables can resolve\n\n // Handle PPTX printing layout adaptation\n const pptxViewer = clone.querySelector(\".ofv-pptx-viewer\") || (clone.classList.contains(\"ofv-pptx-viewer\") ? clone : null);\n let intrinsicWidth = 960;\n let intrinsicHeight = 540;\n let hasSlides = false;\n\n if (pptxViewer) {\n const slides = pptxViewer.querySelectorAll(\"[data-slide-index]\");\n if (slides.length > 0) {\n hasSlides = true;\n const firstWrapper = slides[0].firstElementChild as HTMLElement | null;\n const firstSlide = firstWrapper?.firstElementChild as HTMLElement | null;\n if (firstSlide) {\n intrinsicWidth = parseInt(firstSlide.style.width) || 960;\n intrinsicHeight = parseInt(firstSlide.style.height) || 540;\n }\n\n slides.forEach((slideEl) => {\n const item = slideEl as HTMLElement;\n item.style.width = \"100%\";\n item.style.margin = \"0 0 20px 0\";\n\n const wrapper = item.firstElementChild as HTMLElement | null;\n if (wrapper) {\n wrapper.style.width = `${intrinsicWidth}px`;\n wrapper.style.height = `${intrinsicHeight}px`;\n wrapper.style.boxShadow = \"none\";\n wrapper.style.margin = \"0 auto\";\n\n const slideContent = wrapper.firstElementChild as HTMLElement | null;\n if (slideContent) {\n slideContent.style.transform = \"none\";\n slideContent.style.width = `${intrinsicWidth}px`;\n slideContent.style.height = `${intrinsicHeight}px`;\n }\n }\n });\n }\n }\n\n const doc = frame.contentDocument;\n if (!doc) {\n frame.remove();\n return;\n }\n\n // 1. Write the basic HTML skeleton\n doc.open();\n doc.write(`<!doctype html>\n <html>\n <head>\n <meta charset=\"utf-8\" />\n <title>Print preview</title>\n </head>\n <body></body>\n </html>`);\n doc.close();\n\n // 2. Copy all stylesheets from parent document to print iframe\n Array.from(document.querySelectorAll(\"style, link[rel='stylesheet']\")).forEach((el) => {\n doc.head.appendChild(el.cloneNode(true));\n });\n\n // 3. Inject our base print style override element AFTER parent stylesheets\n const baseStyle = doc.createElement(\"style\");\n baseStyle.textContent = `\n * { box-sizing: border-box; }\n html, body {\n margin: 0;\n padding: 0;\n background: #fff;\n color: #111827;\n font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n }\n body { padding: 16px; }\n img, video, canvas, svg { max-width: 100%; }\n pre {\n white-space: pre-wrap;\n word-break: break-word;\n font: 12px/1.5 ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n }\n .ofv-viewport, .ofv-print-root {\n width: 100% !important;\n height: auto !important;\n overflow: visible !important;\n background: #fff !important;\n color: #111827 !important;\n border: none !important;\n box-shadow: none !important;\n }\n .ofv-pdf {\n padding: 0;\n overflow: visible;\n background: #fff;\n }\n .ofv-pdf-page {\n display: block;\n max-width: 100%;\n height: auto;\n margin: 0 auto 16px;\n box-shadow: none;\n }\n .ofv-panel,\n .ofv-text,\n .ofv-text-block,\n .ofv-file-list {\n max-height: none;\n min-height: 0;\n overflow: visible;\n }\n .ofv-section {\n break-inside: avoid;\n page-break-inside: avoid;\n }\n `;\n doc.head.appendChild(baseStyle);\n\n // 4. Inject PPTX-specific style overrides if slides are present\n if (hasSlides) {\n const pptxStyle = doc.createElement(\"style\");\n pptxStyle.textContent = `\n @media print {\n @page {\n size: ${intrinsicWidth > intrinsicHeight ? \"landscape\" : \"portrait\"};\n margin: 0;\n }\n html, body {\n background: #fff;\n }\n body {\n width: ${intrinsicWidth}px !important;\n margin: 0 !important;\n padding: 0 !important;\n }\n .ofv-print-root {\n width: ${intrinsicWidth}px !important;\n padding: 0 !important;\n }\n .ofv-pptx-viewer {\n width: ${intrinsicWidth}px !important;\n padding: 0 !important;\n background: #fff !important;\n overflow: visible !important;\n }\n .ofv-pptx-viewer > div[data-slide-index] {\n page-break-after: always;\n break-after: page;\n break-inside: avoid;\n page-break-inside: avoid;\n margin: 0 !important;\n padding: 0 !important;\n overflow: visible !important;\n }\n .ofv-pptx-viewer > div[data-slide-index]:last-child {\n page-break-after: avoid;\n break-after: avoid;\n }\n }\n `;\n doc.head.appendChild(pptxStyle);\n }\n\n doc.body.append(clone);\n\n let printed = false;\n const printAndCleanup = () => {\n if (printed) {\n return;\n }\n printed = true;\n frame.contentWindow?.focus();\n frame.contentWindow?.print();\n window.setTimeout(() => frame.remove(), 1000);\n };\n\n frame.onload = () => {\n printAndCleanup();\n };\n\n window.setTimeout(() => {\n printAndCleanup();\n }, 100);\n}\n\nfunction copyCanvasContent(sourceRoot: HTMLElement, targetRoot: HTMLElement): void {\n const sourceCanvases = [...sourceRoot.querySelectorAll(\"canvas\")];\n const targetCanvases = [...targetRoot.querySelectorAll(\"canvas\")];\n\n sourceCanvases.forEach((sourceCanvas, index) => {\n const targetCanvas = targetCanvases[index];\n if (!targetCanvas) {\n return;\n }\n const image = document.createElement(\"img\");\n image.className = targetCanvas.className;\n image.alt = \"Canvas preview page\";\n try {\n image.src = sourceCanvas.toDataURL(\"image/png\");\n } catch {\n return;\n }\n image.width = sourceCanvas.width;\n image.height = sourceCanvas.height;\n targetCanvas.replaceWith(image);\n });\n}\n\nfunction downloadFile(file: PreviewFile): void {\n const url = createObjectUrl(file);\n const isExternal = Boolean(file.url);\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = file.name;\n link.rel = \"noopener\";\n link.hidden = true;\n document.body.append(link);\n link.click();\n window.setTimeout(() => {\n link.remove();\n revokeObjectUrl(url, isExternal);\n }, 0);\n}\n\nasync function findPlugin(plugins: PreviewPlugin[], file: PreviewFile): Promise<PreviewPlugin> {\n for (const plugin of plugins) {\n if (await plugin.match(file)) {\n return plugin;\n }\n }\n return fallbackPlugin();\n}\n","/// <reference path=\"../shims-heic.d.ts\" />\nimport { createObjectUrl, revokeObjectUrl } from \"../dom\";\nimport type { PreviewPlugin, PreviewSize } from \"../types\";\n\nconst imageExtensions = new Set([\n \"jpg\",\n \"jpeg\",\n \"jfif\",\n \"pjpe\",\n \"pjpeg\",\n \"png\",\n \"gif\",\n \"webp\",\n \"avif\",\n \"jxl\",\n \"svg\",\n \"bmp\",\n \"ico\",\n \"cur\",\n \"tif\",\n \"tiff\",\n \"apng\",\n \"heic\",\n \"heif\"\n]);\nconst nonRasterImageExtensions = new Set([\"dxf\"]);\nconst nonRasterImageMimeTypes = new Set([\"image/vnd.dxf\", \"image/vnd.adobe.photoshop\"]);\nconst heicMimeTypes = new Set([\"image/heic\", \"image/heif\", \"image/heic-sequence\", \"image/heif-sequence\"]);\n\nexport function imagePlugin(): PreviewPlugin {\n return {\n name: \"image\",\n match(file) {\n if (nonRasterImageExtensions.has(file.extension) || nonRasterImageMimeTypes.has(file.mimeType)) {\n return false;\n }\n return file.mimeType.startsWith(\"image/\") || imageExtensions.has(file.extension);\n },\n async render(ctx) {\n const ext = ctx.file.extension.toLowerCase();\n const isHeic = ext === \"heic\" || ext === \"heif\" || heicMimeTypes.has(ctx.file.mimeType.toLowerCase());\n const sourceBytesPromise = readImageBytes(ctx.file.blob);\n\n let url = \"\";\n let convertedBlob: Blob | null = null;\n let isExternal = Boolean(ctx.file.url);\n\n if (isHeic) {\n ctx.setLoading(true);\n try {\n let blob = ctx.file.blob;\n if (!blob && typeof ctx.file.source === \"string\") {\n const res = await fetch(ctx.file.source);\n if (!res.ok) {\n throw new Error(`Failed to fetch HEIC file: ${res.status}`);\n }\n blob = await res.blob();\n }\n if (!blob) {\n throw new Error(\"HEIC file source cannot be resolved to a Blob.\");\n }\n\n const heic2anyModule = await import(\"heic2any\");\n const heic2any = heic2anyModule.default || heic2anyModule;\n const converted = await heic2any({\n blob,\n toType: \"image/jpeg\",\n quality: 0.8\n });\n\n convertedBlob = Array.isArray(converted) ? converted[0] : converted;\n url = URL.createObjectURL(convertedBlob);\n isExternal = false;\n } catch (err: any) {\n console.error(\"HEIC image conversion failed:\", err);\n // Fallback to raw object URL\n url = createObjectUrl(ctx.file);\n isExternal = Boolean(ctx.file.url);\n } finally {\n ctx.setLoading(false);\n }\n } else {\n url = createObjectUrl(ctx.file);\n }\n\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-image-viewer\";\n\n const showInlineControls = !ctx.options.toolbar;\n const controls = document.createElement(\"div\");\n controls.className = \"ofv-image-controls\";\n\n const stage = document.createElement(\"div\");\n stage.className = \"ofv-image-stage\";\n const infoBar = createImageInfoBar(await sourceBytesPromise, ext, ctx.file.mimeType, ctx.file.name);\n\n const image = document.createElement(\"img\");\n image.className = \"ofv-media ofv-image-content\";\n image.alt = ctx.file.name;\n image.draggable = false;\n image.src = url;\n image.style.objectFit = objectFit(ctx.options.fit);\n\n let scale = 1;\n let rotation = 0;\n let offsetX = 0;\n let offsetY = 0;\n let dragging = false;\n let dragStartX = 0;\n let dragStartY = 0;\n let startOffsetX = 0;\n let startOffsetY = 0;\n\n const zoomLabel = document.createElement(\"span\");\n zoomLabel.className = \"ofv-image-zoom\";\n\n const updateTransform = () => {\n image.style.transform = `translate(${offsetX}px, ${offsetY}px) scale(${scale}) rotate(${rotation}deg)`;\n zoomLabel.textContent = `${Math.round(scale * 100)}%`;\n ctx.toolbar?.setZoom(scale);\n };\n\n const showImageFallback = () => {\n stage.replaceChildren(createImageFallback(ctx.file.name, url));\n };\n\n const setScale = (nextScale: number) => {\n scale = Math.min(8, Math.max(0.1, nextScale));\n updateTransform();\n };\n\n const reset = () => {\n scale = 1;\n rotation = 0;\n offsetX = 0;\n offsetY = 0;\n updateTransform();\n };\n\n const addButton = (label: string, title: string, action: () => void) => {\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.textContent = label;\n button.title = title;\n button.setAttribute(\"aria-label\", title);\n button.addEventListener(\"click\", action);\n controls.append(button);\n return () => button.removeEventListener(\"click\", action);\n };\n\n const disposers = showInlineControls\n ? [\n addButton(\"-\", \"Zoom out\", () => setScale(scale - 0.25)),\n addButton(\"+\", \"Zoom in\", () => setScale(scale + 0.25)),\n addButton(\"Rotate\", \"Rotate image\", () => {\n rotation += 90;\n updateTransform();\n }),\n addButton(\"Reset\", \"Reset image view\", reset)\n ]\n : [];\n if (showInlineControls) {\n controls.append(zoomLabel);\n }\n\n const onPointerDown = (event: PointerEvent) => {\n if (event.button !== 0) {\n return;\n }\n dragging = true;\n dragStartX = event.clientX;\n dragStartY = event.clientY;\n startOffsetX = offsetX;\n startOffsetY = offsetY;\n stage.classList.add(\"is-dragging\");\n stage.setPointerCapture(event.pointerId);\n };\n\n const onPointerMove = (event: PointerEvent) => {\n if (!dragging) {\n return;\n }\n offsetX = startOffsetX + event.clientX - dragStartX;\n offsetY = startOffsetY + event.clientY - dragStartY;\n updateTransform();\n };\n\n const onPointerUp = (event: PointerEvent) => {\n dragging = false;\n stage.classList.remove(\"is-dragging\");\n if (stage.hasPointerCapture(event.pointerId)) {\n stage.releasePointerCapture(event.pointerId);\n }\n };\n\n const onWheel = (event: WheelEvent) => {\n if (!event.ctrlKey && !event.metaKey) {\n return;\n }\n event.preventDefault();\n setScale(scale + (event.deltaY > 0 ? -0.1 : 0.1));\n };\n\n stage.addEventListener(\"pointerdown\", onPointerDown);\n stage.addEventListener(\"pointermove\", onPointerMove);\n stage.addEventListener(\"pointerup\", onPointerUp);\n stage.addEventListener(\"pointercancel\", onPointerUp);\n stage.addEventListener(\"wheel\", onWheel, { passive: false });\n image.addEventListener(\"error\", showImageFallback);\n\n stage.append(image);\n wrapper.append(...(showInlineControls ? [controls, stage, infoBar] : [stage, infoBar]));\n ctx.viewport.append(wrapper);\n updateTransform();\n\n return {\n canCommand(command) {\n return (\n command === \"zoom-in\" ||\n command === \"zoom-out\" ||\n command === \"zoom-reset\" ||\n command === \"rotate-right\" ||\n command === \"rotate-left\"\n );\n },\n command(command) {\n if (command === \"zoom-in\") {\n setScale(scale + 0.25);\n return true;\n }\n if (command === \"zoom-out\") {\n setScale(scale - 0.25);\n return true;\n }\n if (command === \"zoom-reset\") {\n reset();\n return true;\n }\n if (command === \"rotate-right\") {\n rotation += 90;\n updateTransform();\n return true;\n }\n if (command === \"rotate-left\") {\n rotation -= 90;\n updateTransform();\n return true;\n }\n return false;\n },\n resize(size: PreviewSize) {\n image.style.maxWidth = `${size.width}px`;\n image.style.maxHeight = `${Math.max(0, size.height - controls.offsetHeight)}px`;\n },\n destroy() {\n ctx.toolbar?.setZoom(undefined);\n for (const dispose of disposers) {\n dispose();\n }\n stage.removeEventListener(\"pointerdown\", onPointerDown);\n stage.removeEventListener(\"pointermove\", onPointerMove);\n stage.removeEventListener(\"pointerup\", onPointerUp);\n stage.removeEventListener(\"pointercancel\", onPointerUp);\n stage.removeEventListener(\"wheel\", onWheel);\n image.removeEventListener(\"error\", showImageFallback);\n wrapper.remove();\n if (convertedBlob) {\n URL.revokeObjectURL(url);\n } else {\n revokeObjectUrl(url, isExternal);\n }\n }\n };\n }\n };\n}\n\nfunction createImageFallback(fileName: string, url: string): HTMLElement {\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n\n const title = document.createElement(\"strong\");\n title.textContent = \"图片预览失败\";\n\n const meta = document.createElement(\"span\");\n meta.textContent = \"当前浏览器无法直接显示该图片,文件可能已损坏或编码暂不受支持。\";\n\n const download = document.createElement(\"a\");\n download.href = url;\n download.download = fileName;\n download.textContent = \"下载图片\";\n\n fallback.append(title, meta, download);\n return fallback;\n}\n\ntype ImageInfo = {\n format: string;\n width?: number;\n height?: number;\n bitDepth?: string;\n color?: string;\n frames?: number;\n count?: number;\n note?: string;\n};\n\nasync function readImageBytes(blob?: Blob): Promise<Uint8Array> {\n if (!blob) {\n return new Uint8Array();\n }\n return new Uint8Array(await blob.arrayBuffer().catch(() => new ArrayBuffer(0)));\n}\n\nfunction createImageInfoBar(bytes: Uint8Array, extension: string, mimeType: string, fileName: string): HTMLElement {\n const info = parseImageInfo(bytes, extension, mimeType, fileName);\n const bar = document.createElement(\"div\");\n bar.className = \"ofv-image-info\";\n appendImageInfo(bar, \"格式\", info.format);\n if (info.width && info.height) {\n appendImageInfo(bar, \"尺寸\", `${info.width} x ${info.height}px`);\n }\n if (info.bitDepth) {\n appendImageInfo(bar, \"位深\", info.bitDepth);\n }\n if (info.color) {\n appendImageInfo(bar, \"颜色\", info.color);\n }\n if (info.frames !== undefined) {\n appendImageInfo(bar, \"帧\", String(info.frames));\n }\n if (info.count !== undefined) {\n appendImageInfo(bar, \"图像\", String(info.count));\n }\n if (info.note) {\n appendImageInfo(bar, \"说明\", info.note);\n }\n return bar;\n}\n\nfunction appendImageInfo(parent: HTMLElement, label: string, value: string): void {\n const row = document.createElement(\"span\");\n row.className = \"ofv-image-info-item\";\n const key = document.createElement(\"span\");\n key.textContent = label;\n const content = document.createElement(\"strong\");\n content.textContent = value;\n row.append(key, content);\n parent.append(row);\n}\n\nfunction parseImageInfo(bytes: Uint8Array, extension: string, mimeType: string, fileName: string): ImageInfo {\n const fallbackFormat = (extension || mimeType || fileName.split(\".\").pop() || \"image\").toUpperCase();\n if (bytes.length === 0) {\n return { format: fallbackFormat, note: \"无法读取本地头信息\" };\n }\n return (\n parsePngInfo(bytes) ||\n parseJpegInfo(bytes) ||\n parseGifInfo(bytes) ||\n parseWebpInfo(bytes) ||\n parseAvifInfo(bytes) ||\n parseBmpInfo(bytes) ||\n parseIcoInfo(bytes) ||\n parseSvgInfo(bytes) ||\n { format: fallbackFormat, note: \"暂未识别图片头结构\" }\n );\n}\n\nfunction parsePngInfo(bytes: Uint8Array): ImageInfo | null {\n if (bytes.length < 33 || !bytesMatch(bytes, 0, [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a])) {\n return null;\n }\n const view = dataView(bytes);\n const frames = countPngChunks(bytes, \"fcTL\");\n return {\n format: frames > 0 ? \"APNG\" : \"PNG\",\n width: view.getUint32(16, false),\n height: view.getUint32(20, false),\n bitDepth: `${bytes[24]} bit`,\n color: pngColorType(bytes[25]),\n frames: frames > 0 ? frames : undefined\n };\n}\n\nfunction parseJpegInfo(bytes: Uint8Array): ImageInfo | null {\n if (bytes.length < 4 || bytes[0] !== 0xff || bytes[1] !== 0xd8) {\n return null;\n }\n let offset = 2;\n while (offset + 9 < bytes.length) {\n if (bytes[offset] !== 0xff) {\n offset++;\n continue;\n }\n const marker = bytes[offset + 1];\n offset += 2;\n while (bytes[offset] === 0xff) {\n offset++;\n }\n if (marker === 0xd9 || marker === 0xda) {\n break;\n }\n if (offset + 2 > bytes.length) {\n break;\n }\n const length = (bytes[offset] << 8) | bytes[offset + 1];\n if (length < 2 || offset + length > bytes.length) {\n break;\n }\n if ((marker >= 0xc0 && marker <= 0xc3) || (marker >= 0xc5 && marker <= 0xc7) || (marker >= 0xc9 && marker <= 0xcb) || (marker >= 0xcd && marker <= 0xcf)) {\n return {\n format: \"JPEG\",\n width: (bytes[offset + 5] << 8) | bytes[offset + 6],\n height: (bytes[offset + 3] << 8) | bytes[offset + 4],\n bitDepth: `${bytes[offset + 2]} bit`,\n color: `${bytes[offset + 7]} component`\n };\n }\n offset += length;\n }\n return { format: \"JPEG\", note: \"未在头部扫描到 SOF 尺寸段\" };\n}\n\nfunction parseGifInfo(bytes: Uint8Array): ImageInfo | null {\n const header = asciiAt(bytes, 0, 6);\n if (header !== \"GIF87a\" && header !== \"GIF89a\") {\n return null;\n }\n const packed = bytes[10] || 0;\n return {\n format: header,\n width: readUint16Le(bytes, 6),\n height: readUint16Le(bytes, 8),\n bitDepth: `${(packed & 0x07) + 1} bit`,\n color: (packed & 0x80) ? \"Global color table\" : \"No global color table\",\n frames: countGifFrames(bytes)\n };\n}\n\nfunction parseWebpInfo(bytes: Uint8Array): ImageInfo | null {\n if (bytes.length < 16 || asciiAt(bytes, 0, 4) !== \"RIFF\" || asciiAt(bytes, 8, 4) !== \"WEBP\") {\n return null;\n }\n const chunk = asciiAt(bytes, 12, 4);\n if (chunk === \"VP8X\" && bytes.length >= 30) {\n const flags = bytes[20];\n return {\n format: \"WebP\",\n width: 1 + readUint24Le(bytes, 24),\n height: 1 + readUint24Le(bytes, 27),\n frames: (flags & 0x02) !== 0 ? countWebpAnimationFrames(bytes) : undefined,\n color: (flags & 0x10) !== 0 ? \"Alpha\" : undefined\n };\n }\n if (chunk === \"VP8 \" && bytes.length >= 30) {\n const start = 20;\n if (bytes[start + 3] === 0x9d && bytes[start + 4] === 0x01 && bytes[start + 5] === 0x2a) {\n return {\n format: \"WebP\",\n width: readUint16Le(bytes, start + 6) & 0x3fff,\n height: readUint16Le(bytes, start + 8) & 0x3fff\n };\n }\n }\n if (chunk === \"VP8L\" && bytes.length >= 25) {\n const b0 = bytes[21];\n const b1 = bytes[22];\n const b2 = bytes[23];\n const b3 = bytes[24];\n return {\n format: \"WebP\",\n width: 1 + (((b1 & 0x3f) << 8) | b0),\n height: 1 + (((b3 & 0x0f) << 10) | (b2 << 2) | ((b1 & 0xc0) >> 6)),\n color: \"Lossless\"\n };\n }\n return { format: \"WebP\", note: `未知 ${chunk || \"chunk\"} 头` };\n}\n\nfunction parseAvifInfo(bytes: Uint8Array): ImageInfo | null {\n const boxes = collectBmffBoxes(bytes, 0, bytes.length);\n const ftyp = boxes.find((box) => box.type === \"ftyp\");\n if (!ftyp) {\n return null;\n }\n const majorBrand = asciiAt(bytes, ftyp.dataStart, 4);\n const compatibleBrands = asciiAt(bytes, ftyp.dataStart + 8, Math.max(0, ftyp.dataEnd - ftyp.dataStart - 8));\n if (!/\\b(avif|avis|mif1|msf1|heic|heix|hevc|hevx)\\b/.test(`${majorBrand} ${compatibleBrands}`)) {\n return null;\n }\n const ispe = findBmffBox(bytes, boxes, \"ispe\");\n return {\n format: majorBrand === \"avis\" || compatibleBrands.includes(\"avis\") ? \"AVIF Sequence\" : majorBrand.startsWith(\"hei\") ? \"HEIF\" : \"AVIF\",\n width: ispe && ispe.dataStart + 12 <= ispe.dataEnd ? readUint32Be(bytes, ispe.dataStart + 4) : undefined,\n height: ispe && ispe.dataStart + 12 <= ispe.dataEnd ? readUint32Be(bytes, ispe.dataStart + 8) : undefined,\n note: `brand ${majorBrand}${compatibleBrands.trim() ? ` · ${formatBmffBrands(compatibleBrands)}` : \"\"}`\n };\n}\n\ntype BmffBox = {\n type: string;\n start: number;\n dataStart: number;\n dataEnd: number;\n end: number;\n};\n\nfunction collectBmffBoxes(bytes: Uint8Array, start: number, end: number): BmffBox[] {\n const boxes: BmffBox[] = [];\n let offset = start;\n while (offset + 8 <= end && boxes.length < 512) {\n let size = readUint32Be(bytes, offset);\n const type = asciiAt(bytes, offset + 4, 4);\n let headerSize = 8;\n if (!/^[A-Za-z0-9 _-]{4}$/.test(type)) {\n break;\n }\n if (size === 1 && offset + 16 <= end) {\n const high = readUint32Be(bytes, offset + 8);\n const low = readUint32Be(bytes, offset + 12);\n size = high > 0 ? end - offset : low;\n headerSize = 16;\n } else if (size === 0) {\n size = end - offset;\n }\n if (size < headerSize || offset + size > end) {\n break;\n }\n boxes.push({\n type,\n start: offset,\n dataStart: offset + headerSize,\n dataEnd: offset + size,\n end: offset + size\n });\n offset += size;\n }\n return boxes;\n}\n\nfunction findBmffBox(bytes: Uint8Array, boxes: BmffBox[], type: string): BmffBox | undefined {\n for (const box of boxes) {\n if (box.type === type) {\n return box;\n }\n if ([\"meta\", \"iprp\", \"ipco\", \"moov\", \"trak\", \"mdia\", \"minf\", \"stbl\"].includes(box.type)) {\n const childStart = box.type === \"meta\" ? box.dataStart + 4 : box.dataStart;\n const found = findBmffBox(bytes, collectBmffBoxes(bytes, childStart, box.dataEnd), type);\n if (found) {\n return found;\n }\n }\n }\n return undefined;\n}\n\nfunction formatBmffBrands(value: string): string {\n const brands = value.match(/.{1,4}/g)?.map((brand) => brand.trim()).filter(Boolean) || [];\n return brands.slice(0, 6).join(\", \");\n}\n\nfunction parseBmpInfo(bytes: Uint8Array): ImageInfo | null {\n if (bytes.length < 30 || asciiAt(bytes, 0, 2) !== \"BM\") {\n return null;\n }\n const dibSize = readUint32Le(bytes, 14);\n if (dibSize < 12) {\n return { format: \"BMP\", note: \"DIB header 太短\" };\n }\n if (dibSize === 12 && bytes.length >= 26) {\n return {\n format: \"BMP\",\n width: readUint16Le(bytes, 18),\n height: readUint16Le(bytes, 20),\n bitDepth: `${readUint16Le(bytes, 24)} bit`\n };\n }\n return {\n format: \"BMP\",\n width: readInt32Le(bytes, 18),\n height: Math.abs(readInt32Le(bytes, 22)),\n bitDepth: `${readUint16Le(bytes, 28)} bit`\n };\n}\n\nfunction parseIcoInfo(bytes: Uint8Array): ImageInfo | null {\n if (bytes.length < 6 || readUint16Le(bytes, 0) !== 0 || ![1, 2].includes(readUint16Le(bytes, 2))) {\n return null;\n }\n const count = readUint16Le(bytes, 4);\n if (count < 1 || bytes.length < 6 + count * 16) {\n return { format: \"ICO/CUR\", count };\n }\n const width = bytes[6] || 256;\n const height = bytes[7] || 256;\n return {\n format: readUint16Le(bytes, 2) === 1 ? \"ICO\" : \"CUR\",\n width,\n height,\n bitDepth: `${readUint16Le(bytes, 12)} bit`,\n count\n };\n}\n\nfunction parseSvgInfo(bytes: Uint8Array): ImageInfo | null {\n const text = new TextDecoder(\"utf-8\", { fatal: false }).decode(bytes.slice(0, Math.min(bytes.length, 8192)));\n if (!/<svg[\\s>]/i.test(text)) {\n return null;\n }\n const tag = text.match(/<svg\\b[^>]*>/i)?.[0] || \"\";\n const width = numberAttribute(tag, \"width\");\n const height = numberAttribute(tag, \"height\");\n const viewBox = tag.match(/\\bviewBox=[\"']([^\"']+)[\"']/i)?.[1]?.trim();\n const viewBoxParts = viewBox?.split(/[\\s,]+/).map(Number).filter(Number.isFinite);\n return {\n format: \"SVG\",\n width: width || (viewBoxParts?.length === 4 ? viewBoxParts[2] : undefined),\n height: height || (viewBoxParts?.length === 4 ? viewBoxParts[3] : undefined),\n note: viewBox ? `viewBox ${viewBox}` : undefined\n };\n}\n\nfunction countPngChunks(bytes: Uint8Array, chunkType: string): number {\n let offset = 8;\n let count = 0;\n while (offset + 12 <= bytes.length) {\n const length = readUint32Be(bytes, offset);\n const type = asciiAt(bytes, offset + 4, 4);\n if (type === chunkType) {\n count++;\n }\n offset += 12 + length;\n }\n return count;\n}\n\nfunction countGifFrames(bytes: Uint8Array): number {\n let count = 0;\n for (let index = 13; index < bytes.length; index++) {\n if (bytes[index] === 0x2c) {\n count++;\n }\n }\n return count || 1;\n}\n\nfunction countWebpAnimationFrames(bytes: Uint8Array): number {\n let count = 0;\n for (let offset = 12; offset + 8 <= bytes.length; ) {\n const type = asciiAt(bytes, offset, 4);\n const size = readUint32Le(bytes, offset + 4);\n if (type === \"ANMF\") {\n count++;\n }\n offset += 8 + size + (size % 2);\n }\n return count || 1;\n}\n\nfunction pngColorType(value: number): string {\n const colors: Record<number, string> = {\n 0: \"Grayscale\",\n 2: \"Truecolor\",\n 3: \"Indexed color\",\n 4: \"Grayscale + alpha\",\n 6: \"Truecolor + alpha\"\n };\n return colors[value] || `Unknown (${value})`;\n}\n\nfunction numberAttribute(tag: string, name: string): number | undefined {\n const value = tag.match(new RegExp(`\\\\b${name}=[\"']([0-9.]+)`, \"i\"))?.[1];\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nfunction bytesMatch(bytes: Uint8Array, offset: number, expected: number[]): boolean {\n return expected.every((byte, index) => bytes[offset + index] === byte);\n}\n\nfunction dataView(bytes: Uint8Array): DataView {\n return new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n}\n\nfunction asciiAt(bytes: Uint8Array, offset: number, length: number): string {\n if (offset < 0 || offset + length > bytes.length) {\n return \"\";\n }\n return new TextDecoder(\"ascii\").decode(bytes.slice(offset, offset + length));\n}\n\nfunction readUint16Le(bytes: Uint8Array, offset: number): number {\n return dataView(bytes).getUint16(offset, true);\n}\n\nfunction readUint24Le(bytes: Uint8Array, offset: number): number {\n return bytes[offset] | (bytes[offset + 1] << 8) | (bytes[offset + 2] << 16);\n}\n\nfunction readUint32Le(bytes: Uint8Array, offset: number): number {\n return dataView(bytes).getUint32(offset, true);\n}\n\nfunction readUint32Be(bytes: Uint8Array, offset: number): number {\n return dataView(bytes).getUint32(offset, false);\n}\n\nfunction readInt32Le(bytes: Uint8Array, offset: number): number {\n return dataView(bytes).getInt32(offset, true);\n}\n\nfunction objectFit(fit: string): string {\n if (fit === \"cover\") {\n return \"cover\";\n }\n if (fit === \"actual\") {\n return \"none\";\n }\n if (fit === \"scale-down\") {\n return \"scale-down\";\n }\n return \"contain\";\n}\n","import { createObjectUrl, revokeObjectUrl } from \"../dom\";\nimport type { PreviewPlugin } from \"../types\";\n\nconst videoExtensions = new Set([\n \"mp4\",\n \"mpg\",\n \"mpeg\",\n \"mpe\",\n \"mpv\",\n \"webm\",\n \"ogv\",\n \"mov\",\n \"m4v\",\n \"avi\",\n \"mkv\",\n \"flv\",\n \"wmv\",\n \"3gp\",\n \"3g2\",\n \"m2ts\",\n \"m3u8\"\n]);\nconst videoMimeTypes = new Set([\n \"application/vnd.apple.mpegurl\",\n \"application/x-mpegurl\",\n \"application/mpegurl\",\n \"application/dash+xml\"\n]);\nconst hlsMimeTypes = new Set([\"application/vnd.apple.mpegurl\", \"application/x-mpegurl\", \"application/mpegurl\"]);\n\nexport function videoPlugin(): PreviewPlugin {\n return {\n name: \"video\",\n match(file) {\n return file.mimeType.startsWith(\"video/\") || videoMimeTypes.has(file.mimeType) || videoExtensions.has(file.extension);\n },\n async render(ctx) {\n const url = createObjectUrl(ctx.file);\n const isExternal = Boolean(ctx.file.url);\n const mimeType = ctx.file.mimeType.toLowerCase();\n const bytes = await readVideoBytes(ctx.file.blob);\n \n const container = document.createElement(\"div\");\n container.className = \"ofv-video-container\";\n const stage = document.createElement(\"div\");\n stage.className = \"ofv-video-stage\";\n\n const video = document.createElement(\"video\");\n video.className = \"ofv-media\";\n video.controls = true;\n video.playsInline = true;\n video.preload = \"metadata\";\n video.style.objectFit = ctx.options.fit === \"cover\" ? \"cover\" : \"contain\";\n \n const ext = ctx.file.extension.toLowerCase();\n const infoBar = createVideoInfo(parseVideoInfo(bytes, ext, mimeType, ctx.file.name));\n stage.append(video);\n container.append(stage, infoBar);\n ctx.viewport.classList.add(\"ofv-center\");\n ctx.viewport.append(container);\n\n let hlsInstance: any = null;\n let mpegtsPlayer: any = null;\n const isHls = ext === \"m3u8\" || hlsMimeTypes.has(mimeType);\n const isMpegTs = ext === \"m2ts\" || mimeType === \"video/mp2t\";\n const isDash = mimeType === \"application/dash+xml\";\n const isFlv = ext === \"flv\" || mimeType === \"video/x-flv\";\n const formatLabel = (ctx.file.extension || ctx.file.mimeType || \"video\").toUpperCase();\n\n const showTranscodeFallback = () => {\n video.style.display = \"none\";\n video.pause();\n \n // Remove any existing fallback UI first\n const oldFallback = stage.querySelector(\".ofv-fallback\");\n if (oldFallback) {\n oldFallback.remove();\n }\n\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n \n const title = document.createElement(\"strong\");\n title.textContent = `当前浏览器不支持直接播放该视频格式 (${formatLabel})`;\n \n const meta = document.createElement(\"span\");\n meta.textContent = \"建议转换为 MP4 格式播放,或直接下载在本地播放。\";\n \n const download = document.createElement(\"a\");\n download.href = url;\n download.download = ctx.file.name;\n download.textContent = \"下载视频\";\n \n fallback.append(title, meta, download);\n stage.append(fallback);\n };\n\n const onVideoError = () => {\n showTranscodeFallback();\n };\n\n video.addEventListener(\"error\", onVideoError);\n\n try {\n if (isDash) {\n showTranscodeFallback();\n } else if (isHls) {\n const Hls = (await import(\"hls.js\")).default;\n if (Hls.isSupported()) {\n hlsInstance = new Hls();\n hlsInstance.loadSource(url);\n hlsInstance.attachMedia(video);\n hlsInstance.on(Hls.Events.ERROR, (_event: any, data: any) => {\n if (data.fatal) {\n showTranscodeFallback();\n }\n });\n } else if (video.canPlayType(\"application/vnd.apple.mpegurl\")) {\n video.src = url;\n } else {\n showTranscodeFallback();\n }\n } else if (isFlv || isMpegTs) {\n const mpegts = (await import(\"mpegts.js\")).default;\n if (mpegts.isSupported()) {\n mpegtsPlayer = mpegts.createPlayer({\n type: isFlv ? \"flv\" : \"mpegts\",\n url: url\n });\n mpegtsPlayer.attachMediaElement(video);\n mpegtsPlayer.load();\n mpegtsPlayer.on(mpegts.Events.ERROR, () => {\n showTranscodeFallback();\n });\n } else {\n showTranscodeFallback();\n }\n } else {\n // Native playback for mp4, webm, mov, ogg, etc.\n video.src = url;\n }\n } catch (err) {\n showTranscodeFallback();\n }\n\n return {\n resize() {\n video.style.width = \"100%\";\n video.style.height = \"100%\";\n },\n destroy() {\n video.removeEventListener(\"error\", onVideoError);\n video.pause();\n \n if (hlsInstance) {\n hlsInstance.destroy();\n }\n if (mpegtsPlayer) {\n mpegtsPlayer.unload();\n mpegtsPlayer.destroy();\n }\n\n ctx.viewport.classList.remove(\"ofv-center\");\n revokeObjectUrl(url, isExternal);\n container.remove();\n }\n };\n }\n };\n}\n\ntype VideoInfo = {\n format: string;\n codec?: string;\n width?: number;\n height?: number;\n duration?: string;\n bitrate?: string;\n tracks?: number;\n variants?: number;\n segments?: number;\n note?: string;\n};\n\nasync function readVideoBytes(blob?: Blob): Promise<Uint8Array> {\n if (!blob) {\n return new Uint8Array();\n }\n return new Uint8Array(await blob.arrayBuffer().catch(() => new ArrayBuffer(0)));\n}\n\nfunction createVideoInfo(info: VideoInfo): HTMLElement {\n const bar = document.createElement(\"div\");\n bar.className = \"ofv-media-info\";\n appendMediaInfo(bar, \"格式\", info.format);\n if (info.codec) {\n appendMediaInfo(bar, \"编码\", info.codec);\n }\n if (info.width && info.height) {\n appendMediaInfo(bar, \"尺寸\", `${info.width} x ${info.height}px`);\n }\n if (info.duration) {\n appendMediaInfo(bar, \"时长\", info.duration);\n }\n if (info.bitrate) {\n appendMediaInfo(bar, \"码率\", info.bitrate);\n }\n if (info.tracks !== undefined) {\n appendMediaInfo(bar, \"轨道\", String(info.tracks));\n }\n if (info.variants !== undefined) {\n appendMediaInfo(bar, \"变体\", String(info.variants));\n }\n if (info.segments !== undefined) {\n appendMediaInfo(bar, \"片段\", String(info.segments));\n }\n if (info.note) {\n appendMediaInfo(bar, \"说明\", info.note);\n }\n return bar;\n}\n\nfunction appendMediaInfo(parent: HTMLElement, label: string, value: string): void {\n const item = document.createElement(\"span\");\n item.className = \"ofv-media-info-item\";\n const key = document.createElement(\"span\");\n key.textContent = label;\n const content = document.createElement(\"strong\");\n content.textContent = value;\n item.append(key, content);\n parent.append(item);\n}\n\nfunction parseVideoInfo(bytes: Uint8Array, extension: string, mimeType: string, fileName: string): VideoInfo {\n const fallback = (extension || mimeType || fileName.split(\".\").pop() || \"video\").toUpperCase();\n if (bytes.length === 0) {\n return { format: fallback, note: \"无法读取本地头信息\" };\n }\n return parseHlsInfo(bytes) || parseDashInfo(bytes) || parseMp4Info(bytes) || parseAviInfo(bytes) || parseEbmlInfo(bytes) || {\n format: fallback,\n note: \"暂未识别视频头结构\"\n };\n}\n\nfunction parseMp4Info(bytes: Uint8Array): VideoInfo | null {\n if (bytes.length < 12 || asciiAt(bytes, 4, 4) !== \"ftyp\") {\n return null;\n }\n const majorBrand = asciiAt(bytes, 8, 4);\n const info: VideoInfo = { format: [\"qt \"].includes(majorBrand) ? \"MOV\" : \"MP4\", codec: majorBrand };\n const atoms = collectMp4Atoms(bytes, 0, bytes.length);\n const moov = atoms.find((atom) => atom.type === \"moov\");\n if (moov) {\n const children = collectMp4Atoms(bytes, moov.start + moov.headerSize, moov.end);\n const mvhd = children.find((atom) => atom.type === \"mvhd\");\n if (mvhd) {\n const duration = readMp4MvhdDuration(bytes, mvhd.start + mvhd.headerSize);\n if (duration !== undefined) {\n info.duration = formatDuration(duration);\n }\n }\n const tracks = children.filter((atom) => atom.type === \"trak\");\n info.tracks = tracks.length;\n for (const track of tracks) {\n const tkhd = collectMp4Atoms(bytes, track.start + track.headerSize, track.end).find((atom) => atom.type === \"tkhd\");\n if (tkhd) {\n const size = readMp4TkhdSize(bytes, tkhd.start + tkhd.headerSize);\n if (size.width && size.height) {\n info.width = size.width;\n info.height = size.height;\n break;\n }\n }\n }\n }\n return info;\n}\n\ntype Mp4Atom = {\n type: string;\n start: number;\n end: number;\n headerSize: number;\n};\n\nfunction collectMp4Atoms(bytes: Uint8Array, start: number, end: number): Mp4Atom[] {\n const atoms: Mp4Atom[] = [];\n let offset = start;\n while (offset + 8 <= end) {\n let size = readUint32Be(bytes, offset);\n const type = asciiAt(bytes, offset + 4, 4);\n let headerSize = 8;\n if (size === 1 && offset + 16 <= end) {\n size = Number(readUint64Be(bytes, offset + 8));\n headerSize = 16;\n }\n if (size < headerSize || offset + size > end || !/^[\\w ]{4}$/.test(type)) {\n break;\n }\n atoms.push({ type, start: offset, end: offset + size, headerSize });\n offset += size;\n }\n return atoms;\n}\n\nfunction readMp4MvhdDuration(bytes: Uint8Array, offset: number): number | undefined {\n if (offset + 20 > bytes.length) {\n return undefined;\n }\n const version = bytes[offset];\n if (version === 1 && offset + 32 <= bytes.length) {\n const timescale = readUint32Be(bytes, offset + 20);\n const duration = readUint64Be(bytes, offset + 24);\n return timescale ? Number(duration) / timescale : undefined;\n }\n const timescale = readUint32Be(bytes, offset + 12);\n const duration = readUint32Be(bytes, offset + 16);\n return timescale ? duration / timescale : undefined;\n}\n\nfunction readMp4TkhdSize(bytes: Uint8Array, offset: number): { width?: number; height?: number } {\n const version = bytes[offset];\n const sizeOffset = version === 1 ? offset + 84 : offset + 72;\n if (sizeOffset + 8 > bytes.length) {\n return {};\n }\n return {\n width: readUint32Be(bytes, sizeOffset) / 65536,\n height: readUint32Be(bytes, sizeOffset + 4) / 65536\n };\n}\n\nfunction parseAviInfo(bytes: Uint8Array): VideoInfo | null {\n if (bytes.length < 64 || asciiAt(bytes, 0, 4) !== \"RIFF\" || asciiAt(bytes, 8, 4) !== \"AVI \") {\n return null;\n }\n const avihOffset = findAscii(bytes, \"avih\", 12);\n if (avihOffset < 0 || avihOffset + 56 > bytes.length) {\n return { format: \"AVI\", note: \"未找到 avih header\" };\n }\n const microSecPerFrame = readUint32Le(bytes, avihOffset + 8);\n const maxBytesPerSec = readUint32Le(bytes, avihOffset + 16);\n const totalFrames = readUint32Le(bytes, avihOffset + 24);\n const streams = readUint32Le(bytes, avihOffset + 32);\n const width = readUint32Le(bytes, avihOffset + 40);\n const height = readUint32Le(bytes, avihOffset + 44);\n return {\n format: \"AVI\",\n width,\n height,\n tracks: streams,\n bitrate: maxBytesPerSec ? `${Math.round((maxBytesPerSec * 8) / 1000)} kbps` : undefined,\n duration: microSecPerFrame && totalFrames ? formatDuration((microSecPerFrame * totalFrames) / 1_000_000) : undefined\n };\n}\n\nfunction parseEbmlInfo(bytes: Uint8Array): VideoInfo | null {\n if (bytes.length < 8 || bytes[0] !== 0x1a || bytes[1] !== 0x45 || bytes[2] !== 0xdf || bytes[3] !== 0xa3) {\n return null;\n }\n const root = collectEbmlElements(bytes, 0, bytes.length);\n const header = root.find((element) => element.id === 0x1a45dfa3);\n const headerChildren = header ? collectEbmlElements(bytes, header.dataStart, header.dataEnd) : [];\n const docTypeValue = readEbmlString(bytes, headerChildren.find((element) => element.id === 0x4282));\n const segment = root.find((element) => element.id === 0x18538067);\n const segmentChildren = segment ? collectEbmlElements(bytes, segment.dataStart, segment.dataEnd) : [];\n const info = parseEbmlSegmentInfo(bytes, segmentChildren.find((element) => element.id === 0x1549a966));\n const tracks = parseEbmlTracks(bytes, segmentChildren.find((element) => element.id === 0x1654ae6b));\n const docType = docTypeValue?.toLowerCase().includes(\"webm\")\n ? \"WebM\"\n : docTypeValue?.toLowerCase().includes(\"matroska\")\n ? \"Matroska\"\n : \"EBML\";\n return {\n format: docType,\n codec: tracks.codecs.length > 0 ? tracks.codecs.slice(0, 4).join(\", \") : undefined,\n width: tracks.width,\n height: tracks.height,\n duration: info.duration === undefined ? undefined : formatDuration(info.duration),\n tracks: tracks.count || undefined,\n note: docTypeValue ? `EBML DocType ${docTypeValue}` : \"已识别 EBML 容器\"\n };\n}\n\ntype EbmlElement = {\n id: number;\n start: number;\n dataStart: number;\n dataEnd: number;\n end: number;\n};\n\nfunction collectEbmlElements(bytes: Uint8Array, start: number, end: number, limit = 256): EbmlElement[] {\n const elements: EbmlElement[] = [];\n let offset = start;\n while (offset < end && elements.length < limit) {\n const id = readEbmlId(bytes, offset, end);\n if (!id) {\n break;\n }\n const size = readEbmlSize(bytes, id.offset, end);\n if (!size) {\n break;\n }\n const dataStart = size.offset;\n const dataEnd = size.unknown ? end : dataStart + size.value;\n if (dataEnd < dataStart || dataEnd > end) {\n break;\n }\n elements.push({\n id: id.value,\n start: offset,\n dataStart,\n dataEnd,\n end: dataEnd\n });\n offset = dataEnd;\n }\n return elements;\n}\n\nfunction readEbmlId(bytes: Uint8Array, offset: number, end: number): { value: number; offset: number } | undefined {\n const length = ebmlVintLength(bytes[offset]);\n if (!length || length > 4 || offset + length > end) {\n return undefined;\n }\n let value = 0;\n for (let index = 0; index < length; index++) {\n value = value * 256 + bytes[offset + index];\n }\n return { value, offset: offset + length };\n}\n\nfunction readEbmlSize(bytes: Uint8Array, offset: number, end: number): { value: number; offset: number; unknown: boolean } | undefined {\n const length = ebmlVintLength(bytes[offset]);\n if (!length || length > 8 || offset + length > end) {\n return undefined;\n }\n const firstMask = 0xff >> length;\n let value = bytes[offset] & firstMask;\n let max = firstMask;\n for (let index = 1; index < length; index++) {\n value = value * 256 + bytes[offset + index];\n max = max * 256 + 0xff;\n }\n return { value, offset: offset + length, unknown: value === max };\n}\n\nfunction ebmlVintLength(firstByte: number | undefined): number {\n if (!firstByte) {\n return 0;\n }\n for (let length = 1; length <= 8; length++) {\n if (firstByte & (0x80 >> (length - 1))) {\n return length;\n }\n }\n return 0;\n}\n\nfunction parseEbmlSegmentInfo(bytes: Uint8Array, element?: EbmlElement): { duration?: number } {\n if (!element) {\n return {};\n }\n const children = collectEbmlElements(bytes, element.dataStart, element.dataEnd);\n const timecodeScale = readEbmlUInt(bytes, children.find((child) => child.id === 0x2ad7b1)) || 1_000_000;\n const duration = readEbmlFloat(bytes, children.find((child) => child.id === 0x4489));\n return {\n duration: duration === undefined ? undefined : (duration * timecodeScale) / 1_000_000_000\n };\n}\n\nfunction parseEbmlTracks(bytes: Uint8Array, element?: EbmlElement): { count: number; codecs: string[]; width?: number; height?: number } {\n if (!element) {\n return { count: 0, codecs: [] };\n }\n const trackEntries = collectEbmlElements(bytes, element.dataStart, element.dataEnd).filter((child) => child.id === 0xae);\n const codecs: string[] = [];\n let width: number | undefined;\n let height: number | undefined;\n for (const track of trackEntries) {\n const children = collectEbmlElements(bytes, track.dataStart, track.dataEnd);\n const codec = readEbmlString(bytes, children.find((child) => child.id === 0x86));\n if (codec && !codecs.includes(codec)) {\n codecs.push(codec);\n }\n const type = readEbmlUInt(bytes, children.find((child) => child.id === 0x83));\n const video = children.find((child) => child.id === 0xe0);\n if (type === 1 && video) {\n const videoChildren = collectEbmlElements(bytes, video.dataStart, video.dataEnd);\n width = readEbmlUInt(bytes, videoChildren.find((child) => child.id === 0xb0)) || width;\n height = readEbmlUInt(bytes, videoChildren.find((child) => child.id === 0xba)) || height;\n }\n }\n return { count: trackEntries.length, codecs, width, height };\n}\n\nfunction readEbmlString(bytes: Uint8Array, element?: EbmlElement): string | undefined {\n if (!element || element.dataEnd <= element.dataStart || element.dataEnd - element.dataStart > 4096) {\n return undefined;\n }\n return new TextDecoder(\"utf-8\", { fatal: false }).decode(bytes.slice(element.dataStart, element.dataEnd)).replace(/\\0+$/g, \"\").trim();\n}\n\nfunction readEbmlUInt(bytes: Uint8Array, element?: EbmlElement): number | undefined {\n if (!element || element.dataEnd <= element.dataStart || element.dataEnd - element.dataStart > 6) {\n return undefined;\n }\n let value = 0;\n for (let offset = element.dataStart; offset < element.dataEnd; offset++) {\n value = value * 256 + bytes[offset];\n }\n return value;\n}\n\nfunction readEbmlFloat(bytes: Uint8Array, element?: EbmlElement): number | undefined {\n if (!element) {\n return undefined;\n }\n const data = view(bytes);\n if (element.dataEnd - element.dataStart === 4) {\n return data.getFloat32(element.dataStart, false);\n }\n if (element.dataEnd - element.dataStart === 8) {\n return data.getFloat64(element.dataStart, false);\n }\n return undefined;\n}\n\nfunction parseHlsInfo(bytes: Uint8Array): VideoInfo | null {\n const text = decodeTextHead(bytes);\n if (!text.startsWith(\"#EXTM3U\")) {\n return null;\n }\n const segments = countMatches(text, /^#EXTINF:/gm);\n const variants = countMatches(text, /^#EXT-X-STREAM-INF:/gm);\n const durations = [...text.matchAll(/^#EXTINF:([0-9.]+)/gm)].map((match) => Number(match[1])).filter(Number.isFinite);\n const bandwidth = text.match(/BANDWIDTH=(\\d+)/i)?.[1];\n return {\n format: \"HLS\",\n variants,\n segments,\n duration: durations.length > 0 ? formatDuration(durations.reduce((sum, value) => sum + value, 0)) : undefined,\n bitrate: bandwidth ? `${Math.round(Number(bandwidth) / 1000)} kbps` : undefined\n };\n}\n\nfunction parseDashInfo(bytes: Uint8Array): VideoInfo | null {\n const text = decodeTextHead(bytes);\n if (!/<MPD[\\s>]/i.test(text)) {\n return null;\n }\n return {\n format: \"DASH\",\n duration: isoDurationToClock(text.match(/mediaPresentationDuration=[\"']([^\"']+)[\"']/i)?.[1]),\n variants: countMatches(text, /<Representation\\b/gi),\n segments: countMatches(text, /<SegmentURL\\b|<S\\b/gi)\n };\n}\n\nfunction decodeTextHead(bytes: Uint8Array): string {\n return new TextDecoder(\"utf-8\", { fatal: false }).decode(bytes.slice(0, Math.min(bytes.length, 65536))).trim();\n}\n\nfunction countMatches(value: string, pattern: RegExp): number {\n return [...value.matchAll(pattern)].length;\n}\n\nfunction isoDurationToClock(value?: string): string | undefined {\n if (!value) {\n return undefined;\n }\n const match = value.match(/^PT(?:(\\d+(?:\\.\\d+)?)H)?(?:(\\d+(?:\\.\\d+)?)M)?(?:(\\d+(?:\\.\\d+)?)S)?$/i);\n if (!match) {\n return value;\n }\n const seconds = Number(match[1] || 0) * 3600 + Number(match[2] || 0) * 60 + Number(match[3] || 0);\n return formatDuration(seconds);\n}\n\nfunction formatDuration(seconds: number): string {\n if (!Number.isFinite(seconds) || seconds <= 0) {\n return \"\";\n }\n const total = Math.round(seconds);\n const hours = Math.floor(total / 3600);\n const minutes = Math.floor((total % 3600) / 60);\n const rest = total % 60;\n return hours > 0 ? `${hours}:${String(minutes).padStart(2, \"0\")}:${String(rest).padStart(2, \"0\")}` : `${minutes}:${String(rest).padStart(2, \"0\")}`;\n}\n\nfunction asciiAt(bytes: Uint8Array, offset: number, length: number): string {\n if (offset < 0 || offset + length > bytes.length) {\n return \"\";\n }\n return new TextDecoder(\"latin1\").decode(bytes.slice(offset, offset + length));\n}\n\nfunction findAscii(bytes: Uint8Array, value: string, start = 0): number {\n const encoded = new TextEncoder().encode(value);\n for (let offset = start; offset + encoded.length <= bytes.length; offset++) {\n if (encoded.every((byte, index) => bytes[offset + index] === byte)) {\n return offset;\n }\n }\n return -1;\n}\n\nfunction view(bytes: Uint8Array): DataView {\n return new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n}\n\nfunction readUint32Le(bytes: Uint8Array, offset: number): number {\n return view(bytes).getUint32(offset, true);\n}\n\nfunction readUint32Be(bytes: Uint8Array, offset: number): number {\n return view(bytes).getUint32(offset, false);\n}\n\nfunction readUint64Be(bytes: Uint8Array, offset: number): bigint {\n return (BigInt(readUint32Be(bytes, offset)) << 32n) | BigInt(readUint32Be(bytes, offset + 4));\n}\n","import { createObjectUrl, revokeObjectUrl } from \"../dom\";\nimport type { PreviewPlugin } from \"../types\";\n\nconst audioExtensions = new Set([\n \"mp3\",\n \"wav\",\n \"aif\",\n \"aiff\",\n \"aifc\",\n \"ogg\",\n \"oga\",\n \"aac\",\n \"m4a\",\n \"flac\",\n \"opus\",\n \"weba\",\n \"amr\",\n \"mid\",\n \"midi\",\n \"caf\",\n \"au\",\n \"snd\",\n \"wma\"\n]);\n\nexport function audioPlugin(): PreviewPlugin {\n return {\n name: \"audio\",\n match(file) {\n return file.mimeType.startsWith(\"audio/\") || audioExtensions.has(file.extension);\n },\n async render(ctx) {\n const url = createObjectUrl(ctx.file);\n const isExternal = Boolean(ctx.file.url);\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-audio\";\n const bytes = await readAudioBytes(ctx.file.blob);\n\n const title = document.createElement(\"div\");\n title.className = \"ofv-audio-title\";\n title.textContent = ctx.file.name;\n\n const audio = document.createElement(\"audio\");\n audio.src = url;\n audio.controls = true;\n audio.preload = \"metadata\";\n\n wrapper.append(title, audio, createAudioInfo(parseAudioInfo(bytes, ctx.file.extension, ctx.file.mimeType)));\n ctx.viewport.classList.add(\"ofv-center\");\n ctx.viewport.append(wrapper);\n\n const formatLabel = (ctx.file.extension || ctx.file.mimeType || \"audio\").toUpperCase();\n const showPlaybackFallback = () => {\n audio.pause();\n audio.remove();\n\n if (wrapper.querySelector(\".ofv-fallback\")) {\n return;\n }\n\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n\n const fallbackTitle = document.createElement(\"strong\");\n fallbackTitle.textContent = `当前浏览器不支持直接播放该音频格式 (${formatLabel})`;\n\n const meta = document.createElement(\"span\");\n meta.textContent = \"建议转换为 MP3/AAC/OGG 等浏览器兼容格式,或直接下载在本地播放。\";\n\n const download = document.createElement(\"a\");\n download.href = url;\n download.download = ctx.file.name;\n download.textContent = \"下载音频\";\n\n fallback.append(fallbackTitle, meta, download);\n wrapper.append(fallback);\n };\n\n audio.addEventListener(\"error\", showPlaybackFallback);\n\n return {\n destroy() {\n audio.removeEventListener(\"error\", showPlaybackFallback);\n audio.pause();\n ctx.viewport.classList.remove(\"ofv-center\");\n revokeObjectUrl(url, isExternal);\n }\n };\n }\n };\n}\n\ntype AudioInfo = {\n format: string;\n codec?: string;\n sampleRate?: number;\n channels?: number;\n bitDepth?: number;\n bitrate?: string;\n duration?: string;\n tags?: string;\n note?: string;\n};\n\nasync function readAudioBytes(blob?: Blob): Promise<Uint8Array> {\n if (!blob) {\n return new Uint8Array();\n }\n return new Uint8Array(await blob.arrayBuffer().catch(() => new ArrayBuffer(0)));\n}\n\nfunction createAudioInfo(info: AudioInfo): HTMLElement {\n const bar = document.createElement(\"div\");\n bar.className = \"ofv-media-info\";\n appendMediaInfo(bar, \"格式\", info.format);\n if (info.codec) {\n appendMediaInfo(bar, \"编码\", info.codec);\n }\n if (info.sampleRate) {\n appendMediaInfo(bar, \"采样率\", `${info.sampleRate} Hz`);\n }\n if (info.channels) {\n appendMediaInfo(bar, \"声道\", String(info.channels));\n }\n if (info.bitDepth) {\n appendMediaInfo(bar, \"位深\", `${info.bitDepth} bit`);\n }\n if (info.bitrate) {\n appendMediaInfo(bar, \"码率\", info.bitrate);\n }\n if (info.duration) {\n appendMediaInfo(bar, \"时长\", info.duration);\n }\n if (info.tags) {\n appendMediaInfo(bar, \"标签\", info.tags);\n }\n if (info.note) {\n appendMediaInfo(bar, \"说明\", info.note);\n }\n return bar;\n}\n\nfunction appendMediaInfo(parent: HTMLElement, label: string, value: string): void {\n const item = document.createElement(\"span\");\n item.className = \"ofv-media-info-item\";\n const key = document.createElement(\"span\");\n key.textContent = label;\n const content = document.createElement(\"strong\");\n content.textContent = value;\n item.append(key, content);\n parent.append(item);\n}\n\nfunction parseAudioInfo(bytes: Uint8Array, extension: string, mimeType: string): AudioInfo {\n const fallback = (extension || mimeType || \"audio\").toUpperCase();\n if (bytes.length === 0) {\n return { format: fallback, note: \"无法读取本地头信息\" };\n }\n return parseWaveInfo(bytes) || parseFlacInfo(bytes) || parseOggInfo(bytes) || parseAiffInfo(bytes) || parseAuInfo(bytes) || parseMidiInfo(bytes) || parseId3Mp3Info(bytes) || {\n format: fallback,\n note: \"暂未识别音频头结构\"\n };\n}\n\nfunction parseWaveInfo(bytes: Uint8Array): AudioInfo | null {\n if (bytes.length < 44 || asciiAt(bytes, 0, 4) !== \"RIFF\" || asciiAt(bytes, 8, 4) !== \"WAVE\") {\n return null;\n }\n let offset = 12;\n let channels = 0;\n let sampleRate = 0;\n let bitDepth = 0;\n let byteRate = 0;\n let dataBytes = 0;\n while (offset + 8 <= bytes.length) {\n const chunk = asciiAt(bytes, offset, 4);\n const size = readUint32Le(bytes, offset + 4);\n const dataOffset = offset + 8;\n if (chunk === \"fmt \" && dataOffset + 16 <= bytes.length) {\n channels = readUint16Le(bytes, dataOffset + 2);\n sampleRate = readUint32Le(bytes, dataOffset + 4);\n byteRate = readUint32Le(bytes, dataOffset + 8);\n bitDepth = readUint16Le(bytes, dataOffset + 14);\n }\n if (chunk === \"data\") {\n dataBytes = size;\n }\n offset += 8 + size + (size % 2);\n }\n return {\n format: \"WAV\",\n codec: \"PCM\",\n sampleRate,\n channels,\n bitDepth,\n bitrate: byteRate ? `${Math.round((byteRate * 8) / 1000)} kbps` : undefined,\n duration: byteRate && dataBytes ? formatDuration(dataBytes / byteRate) : undefined\n };\n}\n\nfunction parseFlacInfo(bytes: Uint8Array): AudioInfo | null {\n if (bytes.length < 42 || asciiAt(bytes, 0, 4) !== \"fLaC\") {\n return null;\n }\n let offset = 4;\n while (offset + 4 <= bytes.length) {\n const type = bytes[offset] & 0x7f;\n const length = (bytes[offset + 1] << 16) | (bytes[offset + 2] << 8) | bytes[offset + 3];\n const dataOffset = offset + 4;\n if (type === 0 && dataOffset + 34 <= bytes.length) {\n const b10 = bytes[dataOffset + 10];\n const b11 = bytes[dataOffset + 11];\n const b12 = bytes[dataOffset + 12];\n const b13 = bytes[dataOffset + 13];\n const b14 = bytes[dataOffset + 14];\n const b15 = bytes[dataOffset + 15];\n const b16 = bytes[dataOffset + 16];\n const b17 = bytes[dataOffset + 17];\n const sampleRate = (b10 << 12) | (b11 << 4) | ((b12 & 0xf0) >> 4);\n const channels = ((b12 & 0x0e) >> 1) + 1;\n const bitDepth = (((b12 & 0x01) << 4) | ((b13 & 0xf0) >> 4)) + 1;\n const totalSamples = ((BigInt(b13 & 0x0f) << 32n) | (BigInt(b14) << 24n) | (BigInt(b15) << 16n) | (BigInt(b16) << 8n) | BigInt(b17));\n return {\n format: \"FLAC\",\n codec: \"FLAC\",\n sampleRate,\n channels,\n bitDepth,\n duration: sampleRate && totalSamples > 0n ? formatDuration(Number(totalSamples) / sampleRate) : undefined\n };\n }\n offset += 4 + length;\n }\n return { format: \"FLAC\", codec: \"FLAC\", note: \"未找到 STREAMINFO metadata block\" };\n}\n\nfunction parseId3Mp3Info(bytes: Uint8Array): AudioInfo | null {\n let offset = 0;\n let tags: string | undefined;\n if (bytes.length >= 10 && asciiAt(bytes, 0, 3) === \"ID3\") {\n tags = `ID3v2.${bytes[3]}.${bytes[4]}`;\n offset = 10 + readSynchsafe(bytes, 6);\n }\n for (let index = offset; index + 3 < Math.min(bytes.length, offset + 4096); index++) {\n if (bytes[index] === 0xff && (bytes[index + 1] & 0xe0) === 0xe0) {\n const versionBits = (bytes[index + 1] >> 3) & 0x03;\n const layerBits = (bytes[index + 1] >> 1) & 0x03;\n const bitrateIndex = (bytes[index + 2] >> 4) & 0x0f;\n const sampleIndex = (bytes[index + 2] >> 2) & 0x03;\n const channelMode = (bytes[index + 3] >> 6) & 0x03;\n return {\n format: \"MP3\",\n codec: `${mpegVersion(versionBits)} Layer ${mpegLayer(layerBits)}`,\n sampleRate: mp3SampleRate(versionBits, sampleIndex),\n channels: channelMode === 3 ? 1 : 2,\n bitrate: mp3Bitrate(versionBits, layerBits, bitrateIndex),\n tags\n };\n }\n }\n return tags ? { format: \"MP3\", tags, note: \"未在头部扫描到 MPEG frame\" } : null;\n}\n\nfunction parseOggInfo(bytes: Uint8Array): AudioInfo | null {\n if (bytes.length < 36 || asciiAt(bytes, 0, 4) !== \"OggS\") {\n return null;\n }\n const pages = collectOggPages(bytes);\n const firstPacket = pages[0]?.packets[0];\n const lastGranule = [...pages].reverse().find((page) => page.granule > 0n)?.granule;\n if (firstPacket && asciiAt(firstPacket, 0, 8) === \"OpusHead\") {\n const preSkip = firstPacket.length >= 12 ? readUint16Le(firstPacket, 10) : 0;\n const sampleRate = firstPacket.length >= 16 ? readUint32Le(firstPacket, 12) : 48000;\n const totalSamples = lastGranule === undefined ? undefined : lastGranule - BigInt(preSkip);\n return {\n format: \"Ogg\",\n codec: \"Opus\",\n channels: firstPacket[9],\n sampleRate,\n duration: totalSamples !== undefined && totalSamples > 0n ? formatDuration(Number(totalSamples) / 48000) : undefined,\n note: `${pages.length} 页`\n };\n }\n if (firstPacket && firstPacket[0] === 0x01 && asciiAt(firstPacket, 1, 6) === \"vorbis\") {\n const sampleRate = firstPacket.length >= 16 ? readUint32Le(firstPacket, 12) : undefined;\n return {\n format: \"Ogg\",\n codec: \"Vorbis\",\n channels: firstPacket[11],\n sampleRate,\n bitrate: firstPacket.length >= 28 ? oggVorbisBitrate(firstPacket) : undefined,\n duration: sampleRate && lastGranule !== undefined && lastGranule > 0n ? formatDuration(Number(lastGranule) / sampleRate) : undefined,\n note: `${pages.length} 页`\n };\n }\n return { format: \"Ogg\", note: pages.length > 0 ? `未识别 Ogg codec header,${pages.length} 页` : \"未识别 Ogg codec header\" };\n}\n\ntype OggPage = {\n granule: bigint;\n packets: Uint8Array[];\n};\n\nfunction collectOggPages(bytes: Uint8Array): OggPage[] {\n const pages: OggPage[] = [];\n let offset = 0;\n let continuedPacket: number[] = [];\n while (offset + 27 <= bytes.length && asciiAt(bytes, offset, 4) === \"OggS\") {\n const segmentCount = bytes[offset + 26];\n const segmentTableOffset = offset + 27;\n const dataOffset = segmentTableOffset + segmentCount;\n if (dataOffset > bytes.length) {\n break;\n }\n const sizes = Array.from(bytes.slice(segmentTableOffset, dataOffset));\n const payloadLength = sizes.reduce((sum, value) => sum + value, 0);\n const payloadEnd = dataOffset + payloadLength;\n if (payloadEnd > bytes.length) {\n break;\n }\n const pagePackets: Uint8Array[] = [];\n let packetOffset = dataOffset;\n for (const size of sizes) {\n continuedPacket.push(...bytes.slice(packetOffset, packetOffset + size));\n packetOffset += size;\n if (size < 255) {\n pagePackets.push(new Uint8Array(continuedPacket));\n continuedPacket = [];\n }\n }\n pages.push({\n granule: readUint64Le(bytes, offset + 6),\n packets: pagePackets\n });\n offset = payloadEnd;\n }\n return pages;\n}\n\nfunction oggVorbisBitrate(packet: Uint8Array): string | undefined {\n const nominal = readUint32Le(packet, 20);\n if (nominal > 0) {\n return `${Math.round(nominal / 1000)} kbps`;\n }\n const upper = readUint32Le(packet, 16);\n const lower = readUint32Le(packet, 24);\n if (upper > 0 && lower > 0) {\n return `${Math.round(((upper + lower) / 2) / 1000)} kbps`;\n }\n return undefined;\n}\n\nfunction parseAiffInfo(bytes: Uint8Array): AudioInfo | null {\n if (bytes.length < 12 || asciiAt(bytes, 0, 4) !== \"FORM\" || ![\"AIFF\", \"AIFC\"].includes(asciiAt(bytes, 8, 4))) {\n return null;\n }\n const format = asciiAt(bytes, 8, 4);\n let offset = 12;\n while (offset + 26 <= bytes.length) {\n const chunk = asciiAt(bytes, offset, 4);\n const size = readUint32Be(bytes, offset + 4);\n if (chunk === \"COMM\") {\n return {\n format,\n channels: readUint16Be(bytes, offset + 8),\n bitDepth: readUint16Be(bytes, offset + 14),\n sampleRate: Math.round(readAiffExtended(bytes, offset + 16))\n };\n }\n offset += 8 + size + (size % 2);\n }\n return { format, note: \"未找到 COMM chunk\" };\n}\n\nfunction parseAuInfo(bytes: Uint8Array): AudioInfo | null {\n if (bytes.length < 24 || asciiAt(bytes, 0, 4) !== \".snd\") {\n return null;\n }\n const dataOffset = readUint32Be(bytes, 4);\n const dataSize = readUint32Be(bytes, 8);\n const encoding = readUint32Be(bytes, 12);\n const sampleRate = readUint32Be(bytes, 16);\n const channels = readUint32Be(bytes, 20);\n const bitDepth = auBitDepth(encoding);\n const bytesPerSample = bitDepth ? bitDepth / 8 : 0;\n const resolvedDataSize = dataSize === 0xffffffff ? Math.max(0, bytes.length - dataOffset) : dataSize;\n return {\n format: \"AU/SND\",\n codec: auEncodingName(encoding),\n sampleRate,\n channels,\n bitDepth,\n duration: sampleRate && channels && bytesPerSample && resolvedDataSize ? formatDuration(resolvedDataSize / (sampleRate * channels * bytesPerSample)) : undefined,\n note: `data @ ${dataOffset} B`\n };\n}\n\nfunction auEncodingName(value: number): string {\n const names: Record<number, string> = {\n 1: \"8-bit μ-law\",\n 2: \"8-bit linear PCM\",\n 3: \"16-bit linear PCM\",\n 4: \"24-bit linear PCM\",\n 5: \"32-bit linear PCM\",\n 6: \"32-bit float\",\n 7: \"64-bit float\",\n 23: \"G.721 ADPCM\",\n 24: \"G.722 ADPCM\",\n 25: \"G.723 3-bit ADPCM\",\n 26: \"G.723 5-bit ADPCM\",\n 27: \"8-bit A-law\"\n };\n return names[value] || `encoding ${value}`;\n}\n\nfunction auBitDepth(value: number): number | undefined {\n const depths: Record<number, number> = {\n 1: 8,\n 2: 8,\n 3: 16,\n 4: 24,\n 5: 32,\n 6: 32,\n 7: 64,\n 27: 8\n };\n return depths[value];\n}\n\nfunction parseMidiInfo(bytes: Uint8Array): AudioInfo | null {\n if (bytes.length < 14 || asciiAt(bytes, 0, 4) !== \"MThd\") {\n return null;\n }\n return {\n format: \"MIDI\",\n codec: `SMF ${readUint16Be(bytes, 8)}`,\n channels: readUint16Be(bytes, 10),\n note: `${readUint16Be(bytes, 12)} ticks/quarter`\n };\n}\n\nfunction formatDuration(seconds: number): string {\n if (!Number.isFinite(seconds) || seconds <= 0) {\n return \"\";\n }\n const total = Math.round(seconds);\n const minutes = Math.floor(total / 60);\n const rest = total % 60;\n return `${minutes}:${String(rest).padStart(2, \"0\")}`;\n}\n\nfunction asciiAt(bytes: Uint8Array, offset: number, length: number): string {\n if (offset < 0 || offset + length > bytes.length) {\n return \"\";\n }\n return new TextDecoder(\"ascii\").decode(bytes.slice(offset, offset + length));\n}\n\nfunction view(bytes: Uint8Array): DataView {\n return new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n}\n\nfunction readUint16Le(bytes: Uint8Array, offset: number): number {\n return view(bytes).getUint16(offset, true);\n}\n\nfunction readUint16Be(bytes: Uint8Array, offset: number): number {\n return view(bytes).getUint16(offset, false);\n}\n\nfunction readUint32Le(bytes: Uint8Array, offset: number): number {\n return view(bytes).getUint32(offset, true);\n}\n\nfunction readUint32Be(bytes: Uint8Array, offset: number): number {\n return view(bytes).getUint32(offset, false);\n}\n\nfunction readUint64Le(bytes: Uint8Array, offset: number): bigint {\n return (BigInt(readUint32Le(bytes, offset + 4)) << 32n) | BigInt(readUint32Le(bytes, offset));\n}\n\nfunction readSynchsafe(bytes: Uint8Array, offset: number): number {\n return ((bytes[offset] & 0x7f) << 21) | ((bytes[offset + 1] & 0x7f) << 14) | ((bytes[offset + 2] & 0x7f) << 7) | (bytes[offset + 3] & 0x7f);\n}\n\nfunction mpegVersion(bits: number): string {\n return bits === 3 ? \"MPEG-1\" : bits === 2 ? \"MPEG-2\" : bits === 0 ? \"MPEG-2.5\" : \"MPEG\";\n}\n\nfunction mpegLayer(bits: number): string {\n return bits === 3 ? \"I\" : bits === 2 ? \"II\" : bits === 1 ? \"III\" : \"?\";\n}\n\nfunction mp3SampleRate(versionBits: number, index: number): number | undefined {\n const rates = versionBits === 3 ? [44100, 48000, 32000] : versionBits === 2 ? [22050, 24000, 16000] : [11025, 12000, 8000];\n return rates[index];\n}\n\nfunction mp3Bitrate(versionBits: number, layerBits: number, index: number): string | undefined {\n const mpeg1Layer3 = [0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320];\n const mpeg2Layer3 = [0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160];\n if (index <= 0 || index >= 15 || layerBits !== 1) {\n return undefined;\n }\n return `${(versionBits === 3 ? mpeg1Layer3 : mpeg2Layer3)[index]} kbps`;\n}\n\nfunction readAiffExtended(bytes: Uint8Array, offset: number): number {\n const exponent = readUint16Be(bytes, offset) & 0x7fff;\n let mantissa = 0;\n for (let index = 0; index < 8; index++) {\n mantissa = mantissa * 256 + bytes[offset + 2 + index];\n }\n return mantissa * Math.pow(2, exponent - 16383 - 63);\n}\n","/// <reference path=\"../shims-text.d.ts\" />\nimport { isTextLike } from \"../detect\";\nimport type { PreviewPlugin } from \"../types\";\n\nconst langMap: Record<string, string> = {\n js: \"javascript\",\n mjs: \"javascript\",\n cjs: \"javascript\",\n ts: \"typescript\",\n tsx: \"tsx\",\n jsx: \"jsx\",\n html: \"markup\",\n htm: \"markup\",\n vue: \"markup\",\n xml: \"markup\",\n css: \"css\",\n scss: \"scss\",\n less: \"less\",\n json: \"json\",\n jsonc: \"json\",\n json5: \"json5\",\n ipynb: \"json\",\n jsonl: \"json\",\n ndjson: \"json\",\n toml: \"toml\",\n ini: \"ini\",\n properties: \"properties\",\n proto: \"protobuf\",\n tf: \"hcl\",\n tfvars: \"hcl\",\n hcl: \"hcl\",\n tex: \"latex\",\n latex: \"latex\",\n bib: \"latex\",\n gv: \"dot\",\n http: \"http\",\n py: \"python\",\n java: \"java\",\n cpp: \"cpp\",\n c: \"c\",\n h: \"c\",\n hpp: \"cpp\",\n cs: \"csharp\",\n go: \"go\",\n rs: \"rust\",\n rb: \"ruby\",\n swift: \"swift\",\n kt: \"kotlin\",\n kts: \"kotlin\",\n scala: \"scala\",\n lua: \"lua\",\n r: \"r\",\n dart: \"dart\",\n svelte: \"markup\",\n astro: \"markup\",\n elm: \"elm\",\n ex: \"elixir\",\n exs: \"elixir\",\n clj: \"clojure\",\n cljs: \"clojure\",\n erl: \"erlang\",\n hrl: \"erlang\",\n fs: \"fsharp\",\n fsx: \"fsharp\",\n hs: \"haskell\",\n lhs: \"haskell\",\n sql: \"sql\",\n sh: \"bash\",\n bash: \"bash\",\n zsh: \"bash\",\n fish: \"bash\",\n ps1: \"powershell\",\n bat: \"batch\",\n cmd: \"batch\",\n dockerfile: \"docker\",\n nginxconf: \"nginx\",\n gradle: \"groovy\",\n graphql: \"graphql\",\n gql: \"graphql\",\n yaml: \"yaml\",\n yml: \"yaml\",\n diff: \"diff\",\n patch: \"diff\",\n php: \"php\",\n md: \"markdown\",\n markdown: \"markdown\"\n};\nconst filenameLangMap: Record<string, string> = {\n dockerfile: \"docker\",\n makefile: \"makefile\",\n gemfile: \"ruby\",\n rakefile: \"ruby\",\n procfile: \"bash\",\n jenkinsfile: \"groovy\",\n vagrantfile: \"ruby\",\n brewfile: \"ruby\",\n podfile: \"ruby\",\n \"go.mod\": \"go\",\n \"go.sum\": \"go\",\n \"cargo.toml\": \"toml\",\n \"cargo.lock\": \"toml\",\n \".gitignore\": \"none\",\n \".dockerignore\": \"ignore\",\n \".npmrc\": \"none\",\n \".yarnrc\": \"none\",\n \".pnpmrc\": \"none\",\n \".editorconfig\": \"editorconfig\",\n \".browserslistrc\": \"none\",\n \".prettierrc\": \"json\",\n \".eslintrc\": \"json\",\n \".stylelintrc\": \"json\",\n readme: \"markdown\",\n changelog: \"markdown\",\n changes: \"markdown\",\n history: \"markdown\",\n license: \"none\",\n licence: \"none\",\n copying: \"none\",\n notice: \"none\",\n authors: \"none\",\n contributors: \"none\",\n codeowners: \"none\"\n};\nconst mimeLangMap: Record<string, string> = {\n \"text/markdown\": \"markdown\",\n \"text/html\": \"markup\",\n \"application/xml\": \"markup\",\n \"text/xml\": \"markup\",\n \"application/json\": \"json\",\n \"application/json5\": \"json5\",\n \"application/x-ipynb+json\": \"json\",\n \"application/x-ndjson\": \"json\",\n \"application/yaml\": \"yaml\",\n \"application/x-yaml\": \"yaml\",\n \"text/yaml\": \"yaml\",\n \"application/javascript\": \"javascript\",\n \"application/x-javascript\": \"javascript\",\n \"text/javascript\": \"javascript\",\n \"application/typescript\": \"typescript\",\n \"application/x-typescript\": \"typescript\",\n \"text/typescript\": \"typescript\",\n \"application/sql\": \"sql\",\n \"application/x-sh\": \"bash\",\n \"application/graphql\": \"graphql\",\n \"text/calendar\": \"none\",\n \"text/vcard\": \"none\",\n \"application/x-pem-file\": \"none\",\n \"application/x-x509-ca-cert\": \"none\",\n \"application/pkix-cert\": \"none\",\n \"application/x-httpd-php\": \"php\",\n \"application/x-tex\": \"latex\",\n \"message/http\": \"http\",\n \"text/x-bibtex\": \"latex\",\n \"text/x-hcl\": \"hcl\",\n \"text/x-protobuf\": \"protobuf\",\n \"text/vnd.graphviz\": \"dot\",\n \"text/css\": \"css\"\n};\n\nconst MAX_HIGHLIGHT_CHARS = 180_000;\nconst MAX_RENDER_CHARS = 600_000;\n\nfunction loadPrismCss(theme: \"light\" | \"dark\"): Promise<void> {\n const lightId = \"ofv-prism-css-light\";\n const darkId = \"ofv-prism-css-dark\";\n\n const activeId = theme === \"dark\" ? darkId : lightId;\n const inactiveId = theme === \"dark\" ? lightId : darkId;\n\n document.getElementById(inactiveId)?.remove();\n\n if (document.getElementById(activeId)) {\n return Promise.resolve();\n }\n\n const href =\n theme === \"dark\"\n ? \"https://cdn.jsdelivr.net/npm/prismjs@1.29.0/themes/prism-tomorrow.min.css\"\n : \"https://cdn.jsdelivr.net/npm/prismjs@1.29.0/themes/prism.min.css\";\n\n return new Promise((resolve, reject) => {\n const link = document.createElement(\"link\");\n link.id = activeId;\n link.rel = \"stylesheet\";\n link.href = href;\n link.onload = () => resolve();\n link.onerror = () => reject(new Error(`Failed to load Prism CSS: ${href}`));\n document.head.appendChild(link);\n });\n}\n\nexport function textPlugin(): PreviewPlugin {\n return {\n name: \"text\",\n match(file) {\n return isTextLike(file);\n },\n async render(ctx) {\n const ext = ctx.file.extension.toLowerCase();\n const lang = getTextLanguage(ctx.file.name, ext, ctx.file.mimeType);\n const defaultWrapped = lang === \"none\";\n const isMarkdown = lang === \"markdown\";\n const text = await readText(ctx.file.source).catch((error: unknown) => undefined);\n if (text === undefined) {\n const fallback = createTextFallback(ctx.file.name, ctx.file.url);\n ctx.viewport.classList.add(\"ofv-center\");\n ctx.viewport.append(fallback);\n return {\n destroy() {\n ctx.viewport.classList.remove(\"ofv-center\");\n fallback.remove();\n }\n };\n }\n\n // Detect dark theme active state\n const isDark =\n ctx.host.parentElement?.classList.contains(\"ofv-theme-dark\") ||\n document.body.classList.contains(\"ofv-theme-dark\") ||\n (ctx.options.theme === \"auto\" && window.matchMedia?.(\"(prefers-color-scheme: dark)\").matches) ||\n ctx.options.theme === \"dark\";\n\n // 1. Markdown path\n if (isMarkdown) {\n const [markedModule, PrismModule, DOMPurifyModule] = await Promise.all([\n import(\"marked\"),\n import(\"prismjs\"),\n import(\"dompurify\")\n ]);\n\n const parseMarkdown =\n markedModule.marked?.parse || markedModule.parse || (markedModule as any).default?.parse;\n const Prism = PrismModule.default || PrismModule;\n const DOMPurify = DOMPurifyModule.default || DOMPurifyModule;\n\n const container = document.createElement(\"div\");\n container.className = \"ofv-markdown-body\";\n container.innerHTML = DOMPurify.sanitize(parseMarkdown(text), {\n USE_PROFILES: { html: true },\n ADD_ATTR: [\"target\"]\n });\n secureMarkdownLinks(container);\n ctx.viewport.appendChild(container);\n\n // Highlight code blocks inside markdown\n try {\n const codeBlocks = container.querySelectorAll(\"pre code\");\n if (codeBlocks.length > 0) {\n await loadPrismCss(isDark ? \"dark\" : \"light\");\n codeBlocks.forEach((block) => {\n const parent = block.parentElement;\n if (parent && !parent.className.includes(\"language-\")) {\n parent.className = \"language-none\";\n }\n Prism.highlightElement(block);\n });\n }\n } catch (e) {\n console.warn(\"Prism highlight for markdown failed:\", e);\n }\n\n return {\n destroy() {\n container.remove();\n }\n };\n }\n\n // 2. Syntax-highlighted code path\n const [PrismModule] = await Promise.all([import(\"prismjs\")]);\n const Prism = PrismModule.default || PrismModule;\n\n // Load specific language component dynamically if needed\n if (lang !== \"none\") {\n try {\n if (lang === \"typescript\" || lang === \"tsx\") {\n await import(\"prismjs/components/prism-typescript\");\n } else if (lang === \"python\") {\n await import(\"prismjs/components/prism-python\");\n } else if (lang === \"json\") {\n await import(\"prismjs/components/prism-json\");\n } else if (lang === \"json5\") {\n await import(\"prismjs/components/prism-json5\");\n } else if (lang === \"yaml\") {\n await import(\"prismjs/components/prism-yaml\");\n } else if (lang === \"toml\") {\n await import(\"prismjs/components/prism-toml\");\n } else if (lang === \"ini\") {\n await import(\"prismjs/components/prism-ini\");\n } else if (lang === \"properties\") {\n await import(\"prismjs/components/prism-properties\");\n } else if (lang === \"editorconfig\") {\n await import(\"prismjs/components/prism-editorconfig\");\n } else if (lang === \"ignore\") {\n await import(\"prismjs/components/prism-ignore\");\n } else if (lang === \"protobuf\") {\n await import(\"prismjs/components/prism-protobuf\");\n } else if (lang === \"hcl\") {\n await import(\"prismjs/components/prism-hcl\");\n } else if (lang === \"latex\") {\n await import(\"prismjs/components/prism-latex\");\n } else if (lang === \"dot\") {\n await import(\"prismjs/components/prism-dot\");\n } else if (lang === \"http\") {\n await import(\"prismjs/components/prism-http\");\n } else if (lang === \"bash\") {\n await import(\"prismjs/components/prism-bash\");\n } else if (lang === \"powershell\") {\n await import(\"prismjs/components/prism-powershell\");\n } else if (lang === \"batch\") {\n await import(\"prismjs/components/prism-batch\");\n } else if (lang === \"docker\") {\n await import(\"prismjs/components/prism-docker\");\n } else if (lang === \"makefile\") {\n await import(\"prismjs/components/prism-makefile\");\n } else if (lang === \"ruby\") {\n await import(\"prismjs/components/prism-ruby\");\n } else if (lang === \"nginx\") {\n await import(\"prismjs/components/prism-nginx\");\n } else if (lang === \"groovy\") {\n await import(\"prismjs/components/prism-groovy\");\n } else if (lang === \"graphql\") {\n await import(\"prismjs/components/prism-graphql\");\n } else if (lang === \"csharp\") {\n await import(\"prismjs/components/prism-csharp\");\n } else if (lang === \"rust\") {\n await import(\"prismjs/components/prism-rust\");\n } else if (lang === \"go\") {\n await import(\"prismjs/components/prism-go\");\n } else if (lang === \"ruby\") {\n await import(\"prismjs/components/prism-ruby\");\n } else if (lang === \"swift\") {\n await import(\"prismjs/components/prism-swift\");\n } else if (lang === \"kotlin\") {\n await import(\"prismjs/components/prism-kotlin\");\n } else if (lang === \"scala\") {\n await import(\"prismjs/components/prism-scala\");\n } else if (lang === \"lua\") {\n await import(\"prismjs/components/prism-lua\");\n } else if (lang === \"r\") {\n await import(\"prismjs/components/prism-r\");\n } else if (lang === \"dart\") {\n await import(\"prismjs/components/prism-dart\");\n } else if (lang === \"elm\") {\n await import(\"prismjs/components/prism-elm\");\n } else if (lang === \"elixir\") {\n await import(\"prismjs/components/prism-elixir\");\n } else if (lang === \"clojure\") {\n await import(\"prismjs/components/prism-clojure\");\n } else if (lang === \"erlang\") {\n await import(\"prismjs/components/prism-erlang\");\n } else if (lang === \"fsharp\") {\n await import(\"prismjs/components/prism-fsharp\");\n } else if (lang === \"haskell\") {\n await import(\"prismjs/components/prism-haskell\");\n } else if (lang === \"sql\") {\n await import(\"prismjs/components/prism-sql\");\n } else if (lang === \"cpp\") {\n await import(\"prismjs/components/prism-c\");\n await import(\"prismjs/components/prism-cpp\");\n } else if (lang === \"java\") {\n await import(\"prismjs/components/prism-java\");\n } else if (lang === \"php\") {\n await import(\"prismjs/components/prism-markup-templating\");\n await import(\"prismjs/components/prism-php\");\n }\n } catch (e) {\n console.warn(`Prism failed to load language component for: ${lang}`, e);\n }\n }\n\n await loadPrismCss(isDark ? \"dark\" : \"light\").catch((error) => {\n console.warn(\"Prism CSS failed to load; rendering code without external theme:\", error);\n });\n\n const codeText = text.length > MAX_RENDER_CHARS ? text.slice(0, MAX_RENDER_CHARS) : text;\n const totalLines = countLines(text);\n const shownLines = countLines(codeText);\n const truncated = codeText.length < text.length;\n const shouldHighlight = codeText.length <= MAX_HIGHLIGHT_CHARS;\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-code-container\";\n if (truncated) {\n wrapper.classList.add(\"is-truncated\");\n }\n if (defaultWrapped) {\n wrapper.classList.add(\"is-wrapped\");\n }\n\n const header = document.createElement(\"div\");\n header.className = \"ofv-code-header\";\n\n const title = document.createElement(\"div\");\n title.className = \"ofv-code-title\";\n const fileName = document.createElement(\"strong\");\n fileName.textContent = ctx.file.name;\n const meta = document.createElement(\"span\");\n meta.textContent = [\n lang === \"none\" ? \"plain text\" : lang,\n `${totalLines.toLocaleString()} lines`,\n formatBytes(ctx.file.size ?? (ctx.file.source instanceof Blob ? ctx.file.source.size : text.length))\n ].join(\" · \");\n title.append(fileName, meta);\n\n const actions = document.createElement(\"div\");\n actions.className = \"ofv-code-actions\";\n\n const status = document.createElement(\"span\");\n status.className = \"ofv-code-status\";\n status.setAttribute(\"role\", \"status\");\n\n const wrapButton = document.createElement(\"button\");\n wrapButton.type = \"button\";\n wrapButton.className = \"ofv-code-action\";\n wrapButton.textContent = \"Wrap\";\n wrapButton.setAttribute(\"aria-pressed\", String(defaultWrapped));\n wrapButton.addEventListener(\"click\", () => {\n const wrapped = wrapper.classList.toggle(\"is-wrapped\");\n wrapButton.setAttribute(\"aria-pressed\", String(wrapped));\n });\n\n const copyButton = document.createElement(\"button\");\n copyButton.type = \"button\";\n copyButton.className = \"ofv-code-action\";\n copyButton.textContent = \"Copy\";\n copyButton.addEventListener(\"click\", async () => {\n copyButton.disabled = true;\n try {\n await copyToClipboard(text);\n status.textContent = \"Copied\";\n } catch {\n status.textContent = \"Copy failed\";\n } finally {\n copyButton.disabled = false;\n }\n });\n\n const downloadButton = document.createElement(\"button\");\n downloadButton.type = \"button\";\n downloadButton.className = \"ofv-code-action\";\n downloadButton.textContent = \"Download\";\n downloadButton.addEventListener(\"click\", () => {\n downloadText(ctx.file.name, text);\n status.textContent = \"Download ready\";\n });\n\n actions.append(wrapButton, copyButton, downloadButton, status);\n header.append(title, actions);\n const structureSummary = createTextStructureSummary(text, ext, lang, ctx.file.mimeType);\n\n const body = document.createElement(\"div\");\n body.className = \"ofv-code-body\";\n\n const gutter = document.createElement(\"pre\");\n gutter.className = \"ofv-code-gutter\";\n gutter.setAttribute(\"aria-hidden\", \"true\");\n gutter.textContent = createLineNumbers(shownLines);\n\n const pre = document.createElement(\"pre\");\n pre.className = `language-${lang}`;\n\n const code = document.createElement(\"code\");\n code.className = `language-${lang}`;\n code.textContent = codeText;\n\n pre.appendChild(code);\n body.append(gutter, pre);\n wrapper.append(header);\n if (structureSummary) {\n wrapper.append(structureSummary);\n }\n if (truncated) {\n const notice = document.createElement(\"div\");\n notice.className = \"ofv-code-notice\";\n notice.textContent = `文件较大,当前展示前 ${formatBytes(codeText.length)},复制和下载仍会使用完整内容。`;\n wrapper.append(notice);\n }\n if (!shouldHighlight) {\n const notice = document.createElement(\"div\");\n notice.className = \"ofv-code-notice\";\n notice.textContent = \"内容较大,已跳过语法高亮以保持滚动流畅。\";\n wrapper.append(notice);\n }\n wrapper.appendChild(body);\n ctx.viewport.appendChild(wrapper);\n\n if (shouldHighlight) {\n try {\n Prism.highlightElement(code);\n } catch (err) {\n console.error(\"Prism syntax highlighting failed:\", err);\n }\n }\n\n return {\n destroy() {\n wrapper.remove();\n }\n };\n }\n };\n}\n\nfunction getTextLanguage(fileName: string, extension: string, mimeType: string): string {\n const normalizedFileName = normalizeFileName(fileName);\n return (\n langMap[extension] ||\n filenameLangMap[normalizedFileName] ||\n filenameLangMap[normalizedFileName.split(\".\")[0]] ||\n mimeLangMap[mimeType.toLowerCase()] ||\n \"none\"\n );\n}\n\nfunction normalizeFileName(name: string): string {\n const baseName = name.split(/[\\\\/]/).pop() || name;\n return baseName.toLowerCase();\n}\n\nfunction createTextFallback(fileName: string, url?: string): HTMLElement {\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n\n const title = document.createElement(\"strong\");\n title.textContent = \"文本预览失败\";\n\n const meta = document.createElement(\"span\");\n meta.textContent = \"无法读取该文本内容,可能是远程文件不可访问或响应状态异常。\";\n\n fallback.append(title, meta);\n if (url) {\n const download = document.createElement(\"a\");\n download.href = url;\n download.download = fileName;\n download.textContent = \"打开原文件\";\n fallback.append(download);\n }\n return fallback;\n}\n\nfunction secureMarkdownLinks(container: HTMLElement): void {\n for (const link of container.querySelectorAll<HTMLAnchorElement>(\"a[href]\")) {\n const href = link.getAttribute(\"href\") || \"\";\n if (!isSafeMarkdownHref(href)) {\n link.removeAttribute(\"href\");\n link.removeAttribute(\"target\");\n link.removeAttribute(\"rel\");\n continue;\n }\n if (/^(https?:)?\\/\\//i.test(href)) {\n link.target = \"_blank\";\n link.rel = \"noopener noreferrer\";\n }\n }\n}\n\nfunction isSafeMarkdownHref(href: string): boolean {\n const trimmed = href.trim();\n return (\n trimmed.startsWith(\"#\") ||\n trimmed.startsWith(\"/\") ||\n trimmed.startsWith(\"./\") ||\n trimmed.startsWith(\"../\") ||\n /^(https?:|mailto:|tel:)/i.test(trimmed)\n );\n}\n\nfunction countLines(text: string): number {\n if (!text) {\n return 1;\n }\n return text.split(/\\r\\n|\\r|\\n/).length;\n}\n\nfunction createTextStructureSummary(text: string, extension: string, language: string, mimeType: string): HTMLElement | null {\n if (text.length > MAX_RENDER_CHARS) {\n return null;\n }\n const items = summarizeTextStructure(text, extension, language, mimeType);\n if (items.length === 0) {\n return null;\n }\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-text-structure\";\n for (const item of items) {\n const row = document.createElement(\"span\");\n const label = document.createElement(\"span\");\n label.textContent = item.label;\n const value = document.createElement(\"strong\");\n value.textContent = item.value;\n row.append(label, value);\n summary.append(row);\n }\n return summary;\n}\n\nfunction summarizeTextStructure(\n text: string,\n extension: string,\n language: string,\n mimeType: string\n): Array<{ label: string; value: string }> {\n if (extension === \"ipynb\" || mimeType === \"application/x-ipynb+json\") {\n return summarizeNotebook(text);\n }\n if (extension === \"ndjson\" || extension === \"jsonl\" || mimeType === \"application/x-ndjson\") {\n return summarizeNdjson(text);\n }\n if (language === \"json\" || language === \"json5\") {\n return summarizeJson(text);\n }\n return [];\n}\n\nfunction summarizeJson(text: string): Array<{ label: string; value: string }> {\n try {\n const data = JSON.parse(text) as unknown;\n if (Array.isArray(data)) {\n return [\n { label: \"结构\", value: \"Array\" },\n { label: \"条目\", value: String(data.length) }\n ];\n }\n if (data && typeof data === \"object\") {\n const keys = Object.keys(data as Record<string, unknown>);\n return [\n { label: \"结构\", value: \"Object\" },\n { label: \"键\", value: String(keys.length) },\n { label: \"预览\", value: keys.slice(0, 8).join(\", \") || \"无键\" }\n ];\n }\n return [{ label: \"结构\", value: typeof data }];\n } catch {\n return [];\n }\n}\n\nfunction summarizeNotebook(text: string): Array<{ label: string; value: string }> {\n try {\n const notebook = JSON.parse(text) as {\n cells?: Array<{ cell_type?: string; source?: string | string[] }>;\n metadata?: { kernelspec?: { display_name?: string; name?: string }; language_info?: { name?: string } };\n };\n if (!Array.isArray(notebook.cells)) {\n return summarizeJson(text);\n }\n const counts = new Map<string, number>();\n for (const cell of notebook.cells) {\n const type = cell.cell_type || \"unknown\";\n counts.set(type, (counts.get(type) || 0) + 1);\n }\n const kernel = notebook.metadata?.kernelspec?.display_name || notebook.metadata?.kernelspec?.name || notebook.metadata?.language_info?.name;\n return [\n { label: \"Notebook\", value: `${notebook.cells.length} cells` },\n { label: \"类型\", value: [...counts.entries()].map(([type, count]) => `${type} ${count}`).join(\", \") || \"未知\" },\n ...(kernel ? [{ label: \"Kernel\", value: kernel }] : [])\n ];\n } catch {\n return [];\n }\n}\n\nfunction summarizeNdjson(text: string): Array<{ label: string; value: string }> {\n const lines = text.split(/\\r\\n|\\r|\\n/).filter((line) => line.trim());\n let parsed = 0;\n let objects = 0;\n let arrays = 0;\n for (const line of lines.slice(0, 1000)) {\n try {\n const value = JSON.parse(line);\n parsed++;\n if (Array.isArray(value)) {\n arrays++;\n } else if (value && typeof value === \"object\") {\n objects++;\n }\n } catch {\n // keep counting valid rows only\n }\n }\n return [\n { label: \"NDJSON\", value: `${lines.length} lines` },\n { label: \"可解析\", value: String(parsed) },\n { label: \"类型\", value: `object ${objects}, array ${arrays}` }\n ];\n}\n\nfunction createLineNumbers(lines: number): string {\n return Array.from({ length: Math.max(lines, 1) }, (_, index) => String(index + 1)).join(\"\\n\");\n}\n\nfunction formatBytes(bytes: number): string {\n if (!Number.isFinite(bytes) || bytes < 0) {\n return \"0 B\";\n }\n if (bytes < 1024) {\n return `${bytes} B`;\n }\n const units = [\"KB\", \"MB\", \"GB\"];\n let value = bytes / 1024;\n let unitIndex = 0;\n while (value >= 1024 && unitIndex < units.length - 1) {\n value /= 1024;\n unitIndex += 1;\n }\n return `${value.toFixed(value >= 10 ? 1 : 2)} ${units[unitIndex]}`;\n}\n\nasync function copyToClipboard(text: string): Promise<void> {\n if (navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n return;\n }\n\n const textarea = document.createElement(\"textarea\");\n textarea.value = text;\n textarea.setAttribute(\"readonly\", \"\");\n textarea.style.position = \"fixed\";\n textarea.style.left = \"-9999px\";\n document.body.append(textarea);\n textarea.select();\n const copied = document.execCommand?.(\"copy\");\n textarea.remove();\n if (!copied) {\n throw new Error(\"Clipboard API is not available.\");\n }\n}\n\nfunction downloadText(fileName: string, text: string): void {\n const blob = new Blob([text], { type: \"text/plain;charset=utf-8\" });\n const url = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = fileName;\n document.body.append(link);\n link.click();\n link.remove();\n URL.revokeObjectURL(url);\n}\n\nasync function readText(source: unknown): Promise<string> {\n if (typeof source === \"string\") {\n const response = await fetch(source);\n if (!response.ok) {\n throw new Error(`Failed to fetch text file: ${response.status}`);\n }\n return response.text();\n }\n if (source instanceof Blob) {\n return source.text();\n }\n if (source instanceof ArrayBuffer) {\n return new TextDecoder().decode(source);\n }\n return String(source);\n}\n","import { createObjectUrl, revokeObjectUrl } from \"../dom\";\nimport type { PreviewPlugin, PreviewSize } from \"../types\";\n\ntype PdfJsModule = typeof import(\"pdfjs-dist\");\n\nexport interface PdfPluginOptions {\n pdfjs?: PdfJsModule;\n workerSrc?: string;\n cMapUrl?: string;\n cMapPacked?: boolean;\n standardFontDataUrl?: string;\n useSystemFonts?: boolean;\n}\n\n// 2D affine transform matrix multiplication helper\nfunction multiplyMatrices(m1: number[], m2: number[]): number[] {\n return [\n m1[0] * m2[0] + m1[2] * m2[1],\n m1[1] * m2[0] + m1[3] * m2[1],\n m1[0] * m2[2] + m1[2] * m2[3],\n m1[1] * m2[2] + m1[3] * m2[3],\n m1[0] * m2[4] + m1[2] * m2[5] + m1[4],\n m1[1] * m2[4] + m1[3] * m2[5] + m1[5]\n ];\n}\n\nexport function pdfPlugin(options: PdfJsModule | PdfPluginOptions = {}): PreviewPlugin {\n return {\n name: \"pdf\",\n match(file) {\n return file.mimeType === \"application/pdf\" || file.extension === \"pdf\";\n },\n async render(ctx) {\n const normalizedOptions = normalizePdfOptions(options);\n const pdf = normalizedOptions.pdfjs || (await import(\"pdfjs-dist\"));\n configurePdfWorker(pdf, normalizedOptions.workerSrc);\n const url = createObjectUrl(ctx.file);\n const isExternal = Boolean(ctx.file.url);\n\n const viewer = document.createElement(\"div\");\n viewer.className = \"ofv-pdf-viewer\";\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-pdf-summary\";\n const scroller = document.createElement(\"div\");\n scroller.className = \"ofv-pdf ofv-pdf-pages\";\n viewer.append(summary, scroller);\n ctx.viewport.append(viewer);\n\n const documentTask = pdf.getDocument({\n url,\n cMapUrl: normalizedOptions.cMapUrl ?? `https://cdn.jsdelivr.net/npm/pdfjs-dist@${pdf.version}/cmaps/`,\n cMapPacked: normalizedOptions.cMapPacked ?? true,\n standardFontDataUrl:\n normalizedOptions.standardFontDataUrl ??\n `https://cdn.jsdelivr.net/npm/pdfjs-dist@${pdf.version}/standard_fonts/`,\n useSystemFonts: normalizedOptions.useSystemFonts ?? true\n });\n const doc = await documentTask.promise.catch((error: unknown) => {\n viewer.remove();\n ctx.viewport.classList.add(\"ofv-center\");\n const fallback = createPdfFallback(ctx.file.name, url, normalizePdfError(error));\n ctx.viewport.append(fallback);\n return undefined;\n });\n if (!doc) {\n return {\n destroy() {\n ctx.viewport.classList.remove(\"ofv-center\");\n documentTask.destroy?.();\n revokeObjectUrl(url, isExternal);\n }\n };\n }\n\n // Fast-extract page dimensions\n const pagesMeta: Array<{ width: number; height: number }> = [];\n for (let pageNumber = 1; pageNumber <= doc.numPages; pageNumber += 1) {\n try {\n const page = await doc.getPage(pageNumber);\n const baseViewport = page.getViewport({ scale: 1 });\n pagesMeta.push({\n width: baseViewport.width,\n height: baseViewport.height\n });\n } catch {\n pagesMeta.push({ width: 612, height: 792 });\n }\n }\n\n const pageStates: Array<{\n wrapper: HTMLDivElement;\n canvas: HTMLCanvasElement | null;\n renderTask: any | null;\n rendered: boolean;\n }> = [];\n\n let observer: IntersectionObserver | null = null;\n let currentSize = ctx.size;\n let zoomFactor = 1;\n\n const updateSummary = () => {\n renderPdfSummary(summary, doc.numPages, pagesMeta, ctx.options.fit, zoomFactor);\n ctx.toolbar?.setZoom(zoomFactor);\n };\n\n // Cancel page rendering and free canvas memory\n const clearPage = (pageIdx: number) => {\n const state = pageStates[pageIdx];\n if (!state || !state.rendered) return;\n\n if (state.renderTask) {\n try {\n state.renderTask.cancel();\n } catch (e) {\n // Ignore cancel errors\n }\n state.renderTask = null;\n }\n\n state.canvas = null;\n state.rendered = false;\n state.wrapper.replaceChildren();\n state.wrapper.append(createPageStatus(\"ofv-pdf-skeleton\", `页面 ${pageIdx + 1} 加载中...`));\n };\n\n // Perform actual on-demand rendering on canvas and build text layer\n const renderPage = async (pageIdx: number, size: PreviewSize) => {\n const state = pageStates[pageIdx];\n if (!state || state.rendered) return;\n\n state.rendered = true;\n\n try {\n const page = await doc.getPage(pageIdx + 1);\n const meta = pagesMeta[pageIdx];\n const scale =\n ctx.options.fit === \"actual\"\n ? zoomFactor\n : Math.max(0.05, Math.min(5, (getPdfAvailableWidth(size.width) / meta.width) * zoomFactor));\n \n const viewport = page.getViewport({ scale });\n const outputScale = getPdfOutputScale();\n const cssWidth = Math.floor(viewport.width);\n const cssHeight = Math.floor(viewport.height);\n\n const canvas = document.createElement(\"canvas\");\n canvas.className = \"ofv-pdf-page\";\n canvas.width = Math.floor(cssWidth * outputScale);\n canvas.height = Math.floor(cssHeight * outputScale);\n canvas.style.width = `${cssWidth}px`;\n canvas.style.height = `${cssHeight}px`;\n\n const context = canvas.getContext(\"2d\");\n if (!context) {\n throw new Error(\"Canvas 2D context is not available.\");\n }\n\n state.wrapper.replaceChildren(canvas);\n state.canvas = canvas;\n\n const renderTask = page.render({\n canvasContext: context,\n viewport,\n transform: outputScale === 1 ? undefined : [outputScale, 0, 0, outputScale, 0, 0]\n });\n state.renderTask = renderTask;\n \n await renderTask.promise;\n state.renderTask = null;\n\n // Build absolute-positioned selectable text layer overlay\n const textContent = await page.getTextContent();\n const textLayer = document.createElement(\"div\");\n textLayer.className = \"ofv-pdf-text-layer\";\n textLayer.style.width = `${cssWidth}px`;\n textLayer.style.height = `${cssHeight}px`;\n state.wrapper.appendChild(textLayer);\n\n for (const item of textContent.items) {\n if (!(\"str\" in item)) continue;\n const str = (item as any).str;\n if (!str.trim()) continue;\n\n const tx = multiplyMatrices(viewport.transform, (item as any).transform);\n const fontHeight = Math.sqrt(tx[2] * tx[2] + tx[3] * tx[3]);\n\n const span = document.createElement(\"span\");\n span.textContent = str;\n span.style.fontSize = `${fontHeight}px`;\n span.style.fontFamily = (item as any).fontName || \"sans-serif\";\n span.style.left = `${tx[4]}px`;\n span.style.top = `${tx[5] - fontHeight}px`;\n span.style.transformOrigin = \"0% 0%\";\n\n textLayer.appendChild(span);\n\n // Scale text width horizontally if specified to match visual width perfectly\n if ((item as any).width) {\n const itemWidth = (item as any).width * scale;\n const actualWidth = span.offsetWidth || span.getBoundingClientRect().width;\n if (actualWidth > 0 && Math.abs(actualWidth - itemWidth) > 1) {\n span.style.transform = `scaleX(${itemWidth / actualWidth})`;\n }\n }\n }\n } catch (err) {\n console.error(`Failed to render PDF page ${pageIdx + 1}:`, err);\n state.rendered = false;\n state.wrapper.replaceChildren(createPageStatus(\"ofv-pdf-error\", \"无法渲染该页面\"));\n }\n };\n\n const renderLayout = (size: PreviewSize) => {\n observer?.disconnect();\n updateSummary();\n scroller.replaceChildren();\n pageStates.length = 0;\n\n if (typeof IntersectionObserver !== \"undefined\") {\n observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n const pageIdx = parseInt(entry.target.getAttribute(\"data-page-index\") || \"0\", 10);\n const state = pageStates[pageIdx];\n if (!state) return;\n\n if (entry.isIntersecting) {\n if (!state.rendered) {\n void renderPage(pageIdx, size);\n }\n } else {\n if (state.rendered && doc.numPages > 8) {\n clearPage(pageIdx);\n }\n }\n });\n },\n {\n root: scroller,\n rootMargin: \"400px 0px 400px 0px\"\n }\n );\n }\n\n for (let i = 0; i < doc.numPages; i++) {\n const meta = pagesMeta[i];\n const scale =\n ctx.options.fit === \"actual\"\n ? zoomFactor\n : Math.max(0.05, Math.min(5, (getPdfAvailableWidth(size.width) / meta.width) * zoomFactor));\n \n const w = Math.floor(meta.width * scale);\n const h = Math.floor(meta.height * scale);\n\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-pdf-page-wrapper\";\n wrapper.setAttribute(\"data-page-index\", String(i));\n wrapper.style.width = `${w}px`;\n wrapper.style.height = `${h}px`;\n wrapper.append(createPageStatus(\"ofv-pdf-skeleton\", `页面 ${i + 1} 加载中...`));\n\n scroller.appendChild(wrapper);\n\n pageStates.push({\n wrapper,\n canvas: null,\n renderTask: null,\n rendered: false\n });\n\n if (observer) {\n observer.observe(wrapper);\n } else {\n void renderPage(i, size);\n }\n }\n };\n\n renderLayout(ctx.size);\n\n let resizeTimer: number | undefined;\n return {\n canCommand(command) {\n return command === \"zoom-in\" || command === \"zoom-out\" || command === \"zoom-reset\";\n },\n command(command) {\n if (command === \"zoom-in\") {\n zoomFactor = Math.min(4, zoomFactor + 0.15);\n renderLayout(currentSize);\n return true;\n }\n if (command === \"zoom-out\") {\n zoomFactor = Math.max(0.25, zoomFactor - 0.15);\n renderLayout(currentSize);\n return true;\n }\n if (command === \"zoom-reset\") {\n zoomFactor = 1;\n renderLayout(currentSize);\n return true;\n }\n return false;\n },\n resize(size) {\n currentSize = size;\n window.clearTimeout(resizeTimer);\n resizeTimer = window.setTimeout(() => {\n renderLayout(size);\n }, 120);\n },\n destroy() {\n ctx.toolbar?.setZoom(undefined);\n window.clearTimeout(resizeTimer);\n observer?.disconnect();\n \n pageStates.forEach((state) => {\n if (state.renderTask) {\n try {\n state.renderTask.cancel();\n } catch (e) {\n // Ignore\n }\n }\n });\n pageStates.length = 0;\n\n revokeObjectUrl(url, isExternal);\n void doc.destroy();\n }\n };\n }\n };\n}\n\nfunction getPdfOutputScale(): number {\n if (typeof window === \"undefined\") {\n return 1;\n }\n return Math.max(1, Math.min(window.devicePixelRatio || 1, 2.5));\n}\n\nfunction getPdfAvailableWidth(width: number): number {\n if (!Number.isFinite(width) || width <= 0) {\n return 1;\n }\n const gutter = width < 160 ? 16 : 32;\n return Math.max(1, width - gutter);\n}\n\nfunction renderPdfSummary(\n summary: HTMLElement,\n pages: number,\n pagesMeta: Array<{ width: number; height: number }>,\n fit: string,\n zoomFactor: number\n): void {\n summary.replaceChildren();\n appendPdfSummary(summary, \"页数\", String(pages));\n const pageSizes = formatPdfPageSizes(pagesMeta);\n if (pageSizes) {\n appendPdfSummary(summary, \"页面尺寸\", pageSizes);\n }\n appendPdfSummary(summary, \"适配\", fit === \"actual\" ? \"原始大小\" : \"适合宽度\");\n appendPdfSummary(summary, \"缩放\", `${Math.round(zoomFactor * 100)}%`);\n}\n\nfunction appendPdfSummary(parent: HTMLElement, label: string, value: string): void {\n const item = document.createElement(\"span\");\n const key = document.createElement(\"span\");\n key.textContent = label;\n const content = document.createElement(\"strong\");\n content.textContent = value;\n item.append(key, content);\n parent.append(item);\n}\n\nfunction formatPdfPageSizes(pagesMeta: Array<{ width: number; height: number }>): string {\n const counts = new Map<string, number>();\n for (const page of pagesMeta) {\n const key = `${Math.round(page.width)} x ${Math.round(page.height)}`;\n counts.set(key, (counts.get(key) || 0) + 1);\n }\n return [...counts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 4)\n .map(([size, count]) => (count > 1 ? `${size} (${count})` : size))\n .join(\", \");\n}\n\nfunction normalizePdfOptions(options: PdfJsModule | PdfPluginOptions): PdfPluginOptions {\n if (\"getDocument\" in options) {\n return { pdfjs: options };\n }\n return options;\n}\n\nfunction createPageStatus(className: string, text: string): HTMLDivElement {\n const status = document.createElement(\"div\");\n status.className = className;\n status.textContent = text;\n return status;\n}\n\nfunction createPdfFallback(fileName: string, url: string, message: string): HTMLElement {\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n\n const title = document.createElement(\"strong\");\n title.textContent = \"PDF 预览失败\";\n\n const meta = document.createElement(\"span\");\n meta.textContent = `${message} ${fileName}`;\n\n const download = document.createElement(\"a\");\n download.href = url;\n download.download = fileName;\n download.textContent = \"下载 PDF\";\n\n fallback.append(title, meta, download);\n return fallback;\n}\n\nfunction normalizePdfError(error: unknown): string {\n const message = error instanceof Error ? error.message : String(error || \"\");\n const name = typeof error === \"object\" && error !== null && \"name\" in error ? String((error as { name?: unknown }).name) : \"\";\n const lower = `${name} ${message}`.toLowerCase();\n if (lower.includes(\"password\")) {\n return \"该 PDF 受密码保护,当前无法在浏览器内直接预览。\";\n }\n if (lower.includes(\"invalid\") || lower.includes(\"missing\") || lower.includes(\"corrupt\")) {\n return \"该 PDF 文件可能已损坏或格式无效。\";\n }\n return \"当前浏览器无法加载该 PDF。\";\n}\n\nfunction configurePdfWorker(pdf: PdfJsModule, workerSrc?: string): void {\n if (workerSrc) {\n pdf.GlobalWorkerOptions.workerSrc = workerSrc;\n return;\n }\n\n if (!pdf.GlobalWorkerOptions.workerSrc && typeof window !== \"undefined\") {\n pdf.GlobalWorkerOptions.workerSrc = `https://cdn.jsdelivr.net/npm/pdfjs-dist@${pdf.version}/build/pdf.worker.mjs`;\n }\n}\n","import JSZip from \"jszip\";\nimport DOMPurify from \"dompurify\";\nimport type { PreviewPlugin } from \"../types\";\nimport { createPanel, createSection, readArrayBuffer } from \"./utils\";\n\nconst epubMimeTypes = new Set([\"application/epub+zip\", \"application/x-epub+zip\"]);\n\ntype EpubManifestItem = {\n id: string;\n href: string;\n mediaType: string;\n properties: string;\n};\n\ntype EpubMetadata = {\n title: string;\n creator: string;\n language: string;\n identifier: string;\n publisher: string;\n modified: string;\n};\n\ntype EpubStructureSummary = {\n manifestItems: number;\n spineItems: number;\n chapters: number;\n images: number;\n styles: number;\n fonts: number;\n audio: number;\n video: number;\n navItems: number;\n tocItems: number;\n coverItems: number;\n otherItems: number;\n missingSpineItems: number;\n};\n\nexport function epubPlugin(): PreviewPlugin {\n return {\n name: \"epub\",\n match(file) {\n return file.extension === \"epub\" || epubMimeTypes.has(file.mimeType);\n },\n async render(ctx) {\n const panel = createPanel(\"ofv-epub\");\n ctx.viewport.append(panel);\n\n try {\n const zip = await JSZip.loadAsync(await readArrayBuffer(ctx.file));\n await renderEpub(panel, zip);\n } catch (error) {\n renderEpubFallback(panel, error);\n }\n\n return {\n destroy() {\n panel.remove();\n }\n };\n }\n };\n}\n\nasync function renderEpub(panel: HTMLElement, zip: JSZip): Promise<void> {\n const opfPath = await resolvePackagePath(zip);\n const opfText = await zip.file(opfPath)?.async(\"text\");\n if (!opfText) {\n throw new Error(\"EPUB 缺少 OPF package 文件。\");\n }\n\n const opf = parseXml(opfText, \"EPUB package 文件解析失败。\");\n const basePath = directoryName(opfPath);\n const manifest = readManifest(opf);\n const spine = readSpine(opf, manifest);\n const metadata = readMetadata(opf);\n const structure = summarizeEpubStructure(opf, manifest, spine);\n const assets = await readEpubAssets(zip, basePath, manifest);\n\n const summary = createSection(\"EPUB 图书信息\");\n const meta = document.createElement(\"div\");\n meta.className = \"ofv-epub-meta\";\n appendMeta(meta, \"标题\", metadata.title || \"未命名 EPUB\");\n appendMeta(meta, \"作者\", metadata.creator || \"未知\");\n appendMeta(meta, \"语言\", metadata.language || \"未声明\");\n if (metadata.publisher) {\n appendMeta(meta, \"出版方\", metadata.publisher);\n }\n if (metadata.identifier) {\n appendMeta(meta, \"标识\", metadata.identifier);\n }\n if (metadata.modified) {\n appendMeta(meta, \"修改时间\", metadata.modified);\n }\n appendMeta(meta, \"章节\", spine.length || \"未解析到阅读顺序\");\n appendMeta(meta, \"Manifest\", structure.manifestItems);\n appendMeta(meta, \"Spine\", structure.spineItems);\n appendMeta(meta, \"导航\", structure.navItems + structure.tocItems);\n appendMeta(meta, \"封面\", structure.coverItems);\n appendMeta(meta, \"图片\", structure.images);\n appendMeta(meta, \"样式\", structure.styles);\n appendMeta(meta, \"字体\", structure.fonts);\n if (structure.audio || structure.video) {\n appendMeta(meta, \"音视频\", `${structure.audio} / ${structure.video}`);\n }\n if (structure.otherItems) {\n appendMeta(meta, \"其他资源\", structure.otherItems);\n }\n if (structure.missingSpineItems) {\n appendMeta(meta, \"缺失章节引用\", structure.missingSpineItems);\n }\n summary.append(meta);\n panel.append(summary);\n\n const chapters = createSection(\"EPUB 正文预览\");\n const article = document.createElement(\"article\");\n article.className = \"ofv-epub-reader\";\n\n if (spine.length === 0) {\n const empty = document.createElement(\"p\");\n empty.textContent = \"未解析到可展示章节。\";\n article.append(empty);\n } else {\n for (const [index, item] of spine.slice(0, 40).entries()) {\n const chapterPath = joinZipPath(basePath, item.href);\n const chapterText = await zip.file(chapterPath)?.async(\"text\");\n if (!chapterText) {\n continue;\n }\n const section = document.createElement(\"section\");\n section.className = \"ofv-epub-chapter\";\n const heading = document.createElement(\"h3\");\n heading.textContent = chapterTitle(chapterText) || `章节 ${index + 1}`;\n const content = document.createElement(\"div\");\n content.className = \"ofv-epub-content\";\n content.innerHTML = sanitizeChapterHtml(rewriteAssetReferences(chapterText, assets, directoryName(chapterPath)));\n section.append(heading, content);\n article.append(section);\n }\n }\n\n chapters.append(article);\n panel.append(chapters);\n}\n\nasync function resolvePackagePath(zip: JSZip): Promise<string> {\n const containerXml = await zip.file(\"META-INF/container.xml\")?.async(\"text\");\n if (containerXml) {\n const container = parseXml(containerXml, \"EPUB container.xml 解析失败。\");\n const rootfile = Array.from(container.getElementsByTagName(\"*\")).find(\n (element) => element.localName === \"rootfile\" && getXmlAttribute(element, \"full-path\")\n );\n const fullPath = rootfile ? getXmlAttribute(rootfile, \"full-path\") : null;\n if (fullPath && zip.file(fullPath)) {\n return fullPath;\n }\n }\n\n const fallback = Object.values(zip.files).find((entry) => !entry.dir && entry.name.endsWith(\".opf\"));\n if (!fallback) {\n throw new Error(\"EPUB 未找到 package OPF 文件。\");\n }\n return fallback.name;\n}\n\nfunction readManifest(opf: Document): Map<string, EpubManifestItem> {\n const manifest = new Map<string, EpubManifestItem>();\n for (const item of Array.from(opf.getElementsByTagName(\"*\")).filter((element) => element.localName === \"item\")) {\n const id = getXmlAttribute(item, \"id\");\n const href = getXmlAttribute(item, \"href\");\n if (!id || !href) {\n continue;\n }\n manifest.set(id, {\n id,\n href,\n mediaType: getXmlAttribute(item, \"media-type\") || \"\",\n properties: getXmlAttribute(item, \"properties\") || \"\"\n });\n }\n return manifest;\n}\n\nfunction readSpine(opf: Document, manifest: Map<string, EpubManifestItem>): EpubManifestItem[] {\n const items: EpubManifestItem[] = [];\n for (const itemref of Array.from(opf.getElementsByTagName(\"*\")).filter((element) => element.localName === \"itemref\")) {\n const idref = getXmlAttribute(itemref, \"idref\");\n const item = idref ? manifest.get(idref) : undefined;\n if (item && isChapterMediaType(item.mediaType)) {\n items.push(item);\n }\n }\n if (items.length > 0) {\n return items;\n }\n return Array.from(manifest.values()).filter((item) => isChapterMediaType(item.mediaType));\n}\n\nfunction readMetadata(opf: Document): EpubMetadata {\n return {\n title: textByLocalName(opf, \"title\"),\n creator: textByLocalName(opf, \"creator\"),\n language: textByLocalName(opf, \"language\"),\n identifier: textByLocalName(opf, \"identifier\"),\n publisher: textByLocalName(opf, \"publisher\"),\n modified: metaPropertyText(opf, \"dcterms:modified\")\n };\n}\n\nfunction summarizeEpubStructure(opf: Document, manifest: Map<string, EpubManifestItem>, spine: EpubManifestItem[]): EpubStructureSummary {\n const items = Array.from(manifest.values());\n const chapters = spine.length;\n const images = items.filter((item) => item.mediaType.startsWith(\"image/\")).length;\n const styles = items.filter((item) => item.mediaType === \"text/css\").length;\n const fonts = items.filter((item) => item.mediaType.startsWith(\"font/\") || /font|opentype|truetype/i.test(item.mediaType)).length;\n const audio = items.filter((item) => item.mediaType.startsWith(\"audio/\")).length;\n const video = items.filter((item) => item.mediaType.startsWith(\"video/\")).length;\n const navItems = items.filter((item) => propertyTokens(item.properties).has(\"nav\")).length;\n const tocItems = items.filter((item) => item.mediaType === \"application/x-dtbncx+xml\" || propertyTokens(item.properties).has(\"toc\")).length;\n const coverItems = items.filter((item) => item.id.toLowerCase().includes(\"cover\") || propertyTokens(item.properties).has(\"cover-image\")).length;\n const otherItems = items.filter((item) => !isKnownEpubResource(item)).length;\n return {\n manifestItems: items.length,\n spineItems: spine.length,\n chapters,\n images,\n styles,\n fonts,\n audio,\n video,\n navItems,\n tocItems,\n coverItems,\n otherItems,\n missingSpineItems: Math.max(0, readSpineRefCount(opf) - spine.length)\n };\n}\n\nfunction isKnownEpubResource(item: EpubManifestItem): boolean {\n const properties = propertyTokens(item.properties);\n return (\n isChapterMediaType(item.mediaType) ||\n item.mediaType.startsWith(\"image/\") ||\n item.mediaType === \"text/css\" ||\n item.mediaType.startsWith(\"font/\") ||\n /font|opentype|truetype/i.test(item.mediaType) ||\n item.mediaType.startsWith(\"audio/\") ||\n item.mediaType.startsWith(\"video/\") ||\n item.mediaType === \"application/x-dtbncx+xml\" ||\n properties.has(\"nav\") ||\n properties.has(\"toc\")\n );\n}\n\nasync function readEpubAssets(\n zip: JSZip,\n basePath: string,\n manifest: Map<string, EpubManifestItem>\n): Promise<Map<string, string>> {\n const assets = new Map<string, string>();\n for (const item of manifest.values()) {\n if (!item.mediaType.startsWith(\"image/\")) {\n continue;\n }\n const path = joinZipPath(basePath, item.href);\n const entry = zip.file(path);\n if (!entry) {\n continue;\n }\n assets.set(path, `data:${item.mediaType};base64,${await entry.async(\"base64\")}`);\n }\n return assets;\n}\n\nfunction rewriteAssetReferences(html: string, assets: Map<string, string>, chapterDir: string): string {\n const documentHtml = new DOMParser().parseFromString(html, \"text/html\");\n for (const image of Array.from(documentHtml.querySelectorAll<HTMLImageElement>(\"img[src], image[href], image[xlink\\\\:href]\"))) {\n const raw = image.getAttribute(\"src\") || image.getAttribute(\"href\") || image.getAttribute(\"xlink:href\") || \"\";\n const path = joinZipPath(chapterDir, raw.split(\"#\")[0] || raw);\n const src = assets.get(path);\n if (!src) {\n continue;\n }\n image.setAttribute(\"src\", src);\n image.setAttribute(\"href\", src);\n image.setAttribute(\"xlink:href\", src);\n }\n return documentHtml.body.innerHTML;\n}\n\nfunction sanitizeChapterHtml(html: string): string {\n return DOMPurify.sanitize(html, {\n USE_PROFILES: { html: true, svg: true, svgFilters: false },\n ADD_ATTR: [\"target\", \"xlink:href\"]\n });\n}\n\nfunction chapterTitle(html: string): string {\n const documentHtml = new DOMParser().parseFromString(html, \"text/html\");\n const heading = documentHtml.querySelector(\"h1, h2, h3, title\");\n return heading?.textContent?.trim() || \"\";\n}\n\nfunction renderEpubFallback(panel: HTMLElement, error: unknown): void {\n panel.replaceChildren();\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n const title = document.createElement(\"strong\");\n title.textContent = \"EPUB 解析失败\";\n const meta = document.createElement(\"span\");\n meta.textContent = error instanceof Error ? error.message : \"文件可能已损坏,或不是有效的 EPUB。\";\n fallback.append(title, meta);\n panel.append(fallback);\n}\n\nfunction parseXml(xml: string, message: string): Document {\n const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n if (doc.querySelector(\"parsererror\")) {\n throw new Error(message);\n }\n return doc;\n}\n\nfunction appendMeta(parent: HTMLElement, label: string, value: string | number): void {\n const row = document.createElement(\"div\");\n row.className = \"ofv-meta-row\";\n const key = document.createElement(\"span\");\n key.textContent = label;\n const content = document.createElement(\"strong\");\n content.textContent = String(value);\n row.append(key, content);\n parent.append(row);\n}\n\nfunction textByLocalName(doc: Document, localName: string): string {\n return (\n Array.from(doc.getElementsByTagName(\"*\"))\n .find((element) => element.localName === localName)\n ?.textContent?.trim() || \"\"\n );\n}\n\nfunction metaPropertyText(doc: Document, property: string): string {\n return (\n Array.from(doc.getElementsByTagName(\"*\"))\n .find((element) => element.localName === \"meta\" && getXmlAttribute(element, \"property\") === property)\n ?.textContent?.trim() || \"\"\n );\n}\n\nfunction propertyTokens(value: string): Set<string> {\n return new Set(value.split(/\\s+/).map((item) => item.trim()).filter(Boolean));\n}\n\nfunction readSpineRefCount(opf: Document): number {\n return Array.from(opf.getElementsByTagName(\"*\")).filter((element) => element.localName === \"itemref\").length;\n}\n\nfunction getXmlAttribute(element: Element, localName: string): string | null {\n const direct = element.getAttribute(localName);\n if (direct !== null) {\n return direct;\n }\n for (const attribute of Array.from(element.attributes)) {\n if (attribute.localName === localName) {\n return attribute.value;\n }\n }\n return null;\n}\n\nfunction isChapterMediaType(mediaType: string): boolean {\n return mediaType === \"application/xhtml+xml\" || mediaType === \"text/html\" || mediaType === \"application/xml\";\n}\n\nfunction directoryName(path: string): string {\n const index = path.lastIndexOf(\"/\");\n return index >= 0 ? path.slice(0, index + 1) : \"\";\n}\n\nfunction joinZipPath(basePath: string, path: string): string {\n const parts = `${basePath}${path}`.split(\"/\");\n const normalized: string[] = [];\n for (const part of parts) {\n if (!part || part === \".\") {\n continue;\n }\n if (part === \"..\") {\n normalized.pop();\n } else {\n normalized.push(part);\n }\n }\n return normalized.join(\"/\");\n}\n","import type { PreviewFile } from \"../types\";\n\nexport async function readArrayBuffer(file: PreviewFile): Promise<ArrayBuffer> {\n if (file.source instanceof ArrayBuffer) {\n return file.source;\n }\n if (file.blob) {\n return file.blob.arrayBuffer();\n }\n if (typeof file.source === \"string\") {\n const response = await fetch(file.source);\n if (!response.ok) {\n throw new Error(`Failed to fetch file: ${response.status}`);\n }\n return response.arrayBuffer();\n }\n throw new Error(\"Unsupported file source.\");\n}\n\nexport async function readTextFile(file: PreviewFile): Promise<string> {\n if (typeof file.source === \"string\") {\n const response = await fetch(file.source);\n if (!response.ok) {\n throw new Error(`Failed to fetch text file: ${response.status}`);\n }\n return response.text();\n }\n if (file.blob) {\n return file.blob.text();\n }\n if (file.source instanceof ArrayBuffer) {\n return new TextDecoder().decode(file.source);\n }\n return String(file.source);\n}\n\nexport function createPanel(className = \"\"): HTMLElement {\n const panel = document.createElement(\"div\");\n panel.className = `ofv-panel ${className}`.trim();\n return panel;\n}\n\nexport function createSection(title: string): HTMLElement {\n const section = document.createElement(\"section\");\n section.className = \"ofv-section\";\n const heading = document.createElement(\"h3\");\n heading.textContent = title;\n section.append(heading);\n return section;\n}\n\nexport function appendMeta(parent: HTMLElement, label: string, value: string | number): void {\n const row = document.createElement(\"div\");\n row.className = \"ofv-meta-row\";\n const key = document.createElement(\"span\");\n key.textContent = label;\n const content = document.createElement(\"strong\");\n content.textContent = String(value);\n row.append(key, content);\n parent.append(row);\n}\n\nexport function escapeHtml(value: string): string {\n return value\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll('\"', \"&quot;\")\n .replaceAll(\"'\", \"&#039;\");\n}\n\nexport function bytesToText(bytes: Uint8Array): string {\n return new TextDecoder(\"utf-8\", { fatal: false }).decode(bytes);\n}\n\nexport function resolveFormat(\n file: Pick<PreviewFile, \"extension\" | \"mimeType\">,\n mimeMap: Record<string, string>\n): string {\n return file.extension || mimeMap[file.mimeType] || \"\";\n}\n","import JSZip from \"jszip\";\nimport type { PreviewPlugin } from \"../types\";\nimport { createPanel, createSection, readArrayBuffer } from \"./utils\";\n\nconst xpsMimeTypes = new Set([\n \"application/oxps\",\n \"application/vnd.ms-xpsdocument\"\n]);\n\nexport function xpsPlugin(): PreviewPlugin {\n return {\n name: \"xps\",\n match(file) {\n return file.extension === \"xps\" || file.extension === \"oxps\" || xpsMimeTypes.has(file.mimeType);\n },\n async render(ctx) {\n const panel = createPanel(\"ofv-xps\");\n ctx.viewport.append(panel);\n\n try {\n const zip = await JSZip.loadAsync(await readArrayBuffer(ctx.file));\n await renderXps(panel, zip);\n } catch (error) {\n renderXpsFallback(panel, error);\n }\n\n return {\n destroy() {\n panel.remove();\n }\n };\n }\n };\n}\n\nasync function renderXps(panel: HTMLElement, zip: JSZip): Promise<void> {\n const entries = Object.values(zip.files).filter((entry) => !entry.dir);\n const fixedPages = entries\n .filter((entry) => /(?:^|\\/)Pages\\/[^/]+\\.fpage$/i.test(entry.name) || entry.name.endsWith(\".fpage\"))\n .sort((a, b) => a.name.localeCompare(b.name, undefined, { numeric: true }));\n const resourceEntries = entries.filter((entry) => /\\.(?:png|jpe?g|tiff?|wdp|bmp|gif|odttf|ttf)$/i.test(entry.name));\n const pagePreviews = await Promise.all(\n fixedPages.slice(0, 80).map(async (entry, index) => {\n const xml = await entry.async(\"text\");\n return {\n entry,\n index,\n xml,\n info: parseXpsPageInfo(xml)\n };\n })\n );\n\n const summary = createSection(\"XPS 基础预览\");\n const note = document.createElement(\"p\");\n note.textContent = \"当前版本提取 XPS/OXPS 包内 FixedPage 文本、页面顺序和资源结构。完整版式渲染可后续接入专用渲染器。\";\n summary.append(note);\n summary.append(createXpsSummary(entries, fixedPages, resourceEntries, pagePreviews.map((page) => page.info)));\n panel.append(summary);\n\n const pages = createSection(`页面文本 ${fixedPages.length}`);\n const reader = document.createElement(\"div\");\n reader.className = \"ofv-xps-pages\";\n\n if (fixedPages.length === 0) {\n const empty = document.createElement(\"p\");\n empty.textContent = \"未解析到 FixedPage 页面。\";\n reader.append(empty);\n } else {\n for (const page of pagePreviews) {\n reader.append(renderXpsPage(page.xml, page.entry.name, page.index));\n }\n }\n pages.append(reader);\n panel.append(pages);\n\n const structure = createSection(`文件结构 ${entries.length}`);\n const list = document.createElement(\"ul\");\n for (const entry of entries.slice(0, 240)) {\n const item = document.createElement(\"li\");\n item.textContent = entry.name;\n list.append(item);\n }\n structure.append(list);\n panel.append(structure);\n}\n\ntype XpsPageInfo = {\n width?: number;\n height?: number;\n glyphs: number;\n imageBrushes: number;\n canvases: number;\n paths: number;\n};\n\nfunction createXpsSummary(\n entries: JSZip.JSZipObject[],\n fixedPages: JSZip.JSZipObject[],\n resourceEntries: JSZip.JSZipObject[],\n pageInfos: XpsPageInfo[]\n): HTMLElement {\n const meta = document.createElement(\"div\");\n meta.className = \"ofv-xps-meta ofv-xps-summary\";\n appendMeta(meta, \"页面\", fixedPages.length);\n appendMeta(meta, \"文件\", entries.length);\n appendMeta(meta, \"FixedDocument\", entries.filter((entry) => /\\.fdoc$/i.test(entry.name)).length);\n appendMeta(meta, \"FixedDocSeq\", entries.filter((entry) => /\\.fdseq$/i.test(entry.name)).length);\n appendMeta(meta, \"关系文件\", entries.filter((entry) => /(?:^|\\/)_rels\\/[^/]+\\.rels$/i.test(entry.name) || entry.name.endsWith(\".rels\")).length);\n appendMeta(meta, \"资源\", resourceEntries.length);\n appendMeta(meta, \"图片资源\", resourceEntries.filter((entry) => /\\.(?:png|jpe?g|tiff?|wdp|bmp|gif)$/i.test(entry.name)).length);\n appendMeta(meta, \"字体资源\", resourceEntries.filter((entry) => /\\.(?:odttf|ttf)$/i.test(entry.name)).length);\n const glyphs = pageInfos.reduce((count, page) => count + page.glyphs, 0);\n appendMeta(meta, \"Glyphs\", glyphs);\n const pageSizes = formatXpsPageSizes(pageInfos);\n if (pageSizes) {\n appendMeta(meta, \"页面尺寸\", pageSizes);\n }\n const pageObjects = formatXpsPageObjects(pageInfos);\n if (pageObjects) {\n appendMeta(meta, \"页面对象\", pageObjects);\n }\n return meta;\n}\n\nfunction parseXpsPageInfo(xml: string): XpsPageInfo {\n const fallback = parseXpsPageInfoByRegex(xml);\n const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n if (doc.querySelector(\"parsererror\")) {\n return fallback;\n }\n const root = doc.documentElement;\n const elements = Array.from(doc.getElementsByTagName(\"*\"));\n return {\n width: finiteNumber(getXmlAttribute(root, \"Width\"), fallback.width),\n height: finiteNumber(getXmlAttribute(root, \"Height\"), fallback.height),\n glyphs: elements.filter((element) => element.localName === \"Glyphs\").length,\n imageBrushes: elements.filter((element) => element.localName === \"ImageBrush\").length,\n canvases: elements.filter((element) => element.localName === \"Canvas\").length,\n paths: elements.filter((element) => element.localName === \"Path\").length\n };\n}\n\nfunction parseXpsPageInfoByRegex(xml: string): XpsPageInfo {\n return {\n width: finiteNumber(firstAttributeValue(xml, \"Width\"), undefined),\n height: finiteNumber(firstAttributeValue(xml, \"Height\"), undefined),\n glyphs: countMatches(xml, /<[\\w:.-]*Glyphs\\b/g),\n imageBrushes: countMatches(xml, /<[\\w:.-]*ImageBrush\\b/g),\n canvases: countMatches(xml, /<[\\w:.-]*Canvas\\b/g),\n paths: countMatches(xml, /<[\\w:.-]*Path\\b/g)\n };\n}\n\nfunction formatXpsPageSizes(pageInfos: XpsPageInfo[]): string {\n const counts = new Map<string, number>();\n for (const page of pageInfos) {\n if (!Number.isFinite(page.width) || !Number.isFinite(page.height)) {\n continue;\n }\n const key = `${Math.round(page.width as number)} x ${Math.round(page.height as number)}`;\n counts.set(key, (counts.get(key) || 0) + 1);\n }\n return [...counts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 4)\n .map(([size, count]) => (count > 1 ? `${size} (${count})` : size))\n .join(\", \");\n}\n\nfunction formatXpsPageObjects(pageInfos: XpsPageInfo[]): string {\n const totals = pageInfos.reduce(\n (result, page) => ({\n imageBrushes: result.imageBrushes + page.imageBrushes,\n canvases: result.canvases + page.canvases,\n paths: result.paths + page.paths\n }),\n { imageBrushes: 0, canvases: 0, paths: 0 }\n );\n return [\n totals.imageBrushes ? `ImageBrush ${totals.imageBrushes}` : \"\",\n totals.canvases ? `Canvas ${totals.canvases}` : \"\",\n totals.paths ? `Path ${totals.paths}` : \"\"\n ].filter(Boolean).join(\", \");\n}\n\nfunction renderXpsPage(xml: string, path: string, index: number): HTMLElement {\n const page = document.createElement(\"article\");\n page.className = \"ofv-xps-page\";\n const heading = document.createElement(\"h4\");\n heading.textContent = `Page ${index + 1}`;\n const pathMeta = document.createElement(\"span\");\n pathMeta.textContent = path;\n\n const text = document.createElement(\"div\");\n text.className = \"ofv-xps-text\";\n const fragments = extractXpsText(xml);\n if (fragments.length > 0) {\n for (const fragment of fragments) {\n const paragraph = document.createElement(\"p\");\n paragraph.textContent = fragment;\n text.append(paragraph);\n }\n } else {\n const empty = document.createElement(\"p\");\n empty.textContent = \"这一页未提取到 Glyphs 文本。\";\n text.append(empty);\n }\n\n page.append(heading, pathMeta, text);\n return page;\n}\n\nfunction extractXpsText(xml: string): string[] {\n const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n if (doc.querySelector(\"parsererror\")) {\n return extractXpsTextByRegex(xml);\n }\n return Array.from(doc.getElementsByTagName(\"*\"))\n .filter((element) => element.localName === \"Glyphs\")\n .map((glyph) => getXmlAttribute(glyph, \"UnicodeString\") || \"\")\n .map((value) => value.replace(/\\s+/g, \" \").trim())\n .filter(Boolean);\n}\n\nfunction extractXpsTextByRegex(xml: string): string[] {\n return [...xml.matchAll(/\\bUnicodeString=(?:\"([^\"]*)\"|'([^']*)')/g)]\n .map((match) => decodeXml(match[1] || match[2] || \"\"))\n .map((value) => value.replace(/\\s+/g, \" \").trim())\n .filter(Boolean);\n}\n\nfunction firstAttributeValue(xml: string, name: string): string | undefined {\n const match = xml.match(new RegExp(`\\\\b${name}=(?:\"([^\"]*)\"|'([^']*)')`));\n return match?.[1] || match?.[2];\n}\n\nfunction countMatches(value: string, pattern: RegExp): number {\n return [...value.matchAll(pattern)].length;\n}\n\nfunction renderXpsFallback(panel: HTMLElement, error: unknown): void {\n panel.replaceChildren();\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n const title = document.createElement(\"strong\");\n title.textContent = \"XPS 解析失败\";\n const meta = document.createElement(\"span\");\n meta.textContent = error instanceof Error ? error.message : \"文件可能已损坏,或不是有效的 XPS/OXPS 包。\";\n fallback.append(title, meta);\n panel.append(fallback);\n}\n\nfunction appendMeta(parent: HTMLElement, label: string, value: string | number): void {\n const row = document.createElement(\"div\");\n row.className = \"ofv-meta-row\";\n const key = document.createElement(\"span\");\n key.textContent = label;\n const content = document.createElement(\"strong\");\n content.textContent = String(value);\n row.append(key, content);\n parent.append(row);\n}\n\nfunction getXmlAttribute(element: Element, localName: string): string | null {\n const direct = element.getAttribute(localName);\n if (direct !== null) {\n return direct;\n }\n for (const attribute of Array.from(element.attributes)) {\n if (attribute.localName === localName) {\n return attribute.value;\n }\n }\n return null;\n}\n\nfunction finiteNumber(value: unknown, fallback: number | undefined): number | undefined {\n const parsed = typeof value === \"number\" ? value : Number(value);\n return Number.isFinite(parsed) ? parsed : fallback;\n}\n\nfunction decodeXml(value: string): string {\n return value\n .replaceAll(\"&lt;\", \"<\")\n .replaceAll(\"&gt;\", \">\")\n .replaceAll(\"&amp;\", \"&\")\n .replaceAll(\"&quot;\", '\"')\n .replaceAll(\"&apos;\", \"'\");\n}\n","import JSZip from \"jszip\";\nimport DOMPurify from \"dompurify\";\nimport type { WorkBook } from \"xlsx\";\nimport type { PreviewPlugin } from \"../types\";\nimport { createPanel, createSection, readArrayBuffer, resolveFormat } from \"./utils\";\n\nconst wordExtensions = new Set([\"docx\", \"docm\", \"doc\", \"dotx\", \"dotm\", \"dot\", \"rtf\", \"odt\", \"fodt\", \"wps\"]);\nconst sheetExtensions = new Set([\"xlsx\", \"xls\", \"xlsm\", \"xlsb\", \"xlt\", \"xltx\", \"xltm\", \"csv\", \"tsv\", \"ods\", \"fods\", \"numbers\", \"et\"]);\nconst presentationExtensions = new Set([\"pptx\", \"pptm\", \"ppt\", \"pps\", \"ppsx\", \"ppsm\", \"potx\", \"potm\", \"odp\", \"fodp\", \"key\", \"dps\"]);\nconst packagedOfficeCandidates = new Set([\"wps\", \"et\", \"dps\", \"numbers\", \"key\"]);\nconst SHEET_WINDOW_ROWS = 200;\nconst SHEET_WINDOW_COLUMNS = 80;\nconst PPTX_REL_NS = \"http://schemas.openxmlformats.org/package/2006/relationships\";\nconst officeMimeTypes = new Set([\n \"application/msword\",\n \"application/rtf\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n \"application/vnd.ms-word.document.macroenabled.12\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.template\",\n \"application/vnd.ms-word.template.macroenabled.12\",\n \"application/vnd.oasis.opendocument.text\",\n \"application/vnd.oasis.opendocument.text-flat-xml\",\n \"application/vnd.ms-works\",\n \"application/vnd.ms-excel\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.template\",\n \"application/vnd.ms-excel.sheet.macroenabled.12\",\n \"application/vnd.ms-excel.sheet.binary.macroenabled.12\",\n \"application/vnd.ms-excel.template.macroenabled.12\",\n \"application/vnd.oasis.opendocument.spreadsheet\",\n \"application/vnd.oasis.opendocument.spreadsheet-flat-xml\",\n \"application/vnd.apple.numbers\",\n \"application/vnd.ms-powerpoint\",\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n \"application/vnd.ms-powerpoint.presentation.macroenabled.12\",\n \"application/vnd.openxmlformats-officedocument.presentationml.slideshow\",\n \"application/vnd.ms-powerpoint.slideshow.macroenabled.12\",\n \"application/vnd.openxmlformats-officedocument.presentationml.template\",\n \"application/vnd.ms-powerpoint.template.macroenabled.12\",\n \"application/vnd.oasis.opendocument.presentation\",\n \"application/vnd.oasis.opendocument.presentation-flat-xml\",\n \"application/vnd.apple.keynote\"\n]);\nconst officeMimeFormatMap: Record<string, string> = {\n \"application/msword\": \"doc\",\n \"application/rtf\": \"rtf\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\": \"docx\",\n \"application/vnd.ms-word.document.macroenabled.12\": \"docm\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.template\": \"dotx\",\n \"application/vnd.ms-word.template.macroenabled.12\": \"dotm\",\n \"application/vnd.oasis.opendocument.text\": \"odt\",\n \"application/vnd.oasis.opendocument.text-flat-xml\": \"fodt\",\n \"application/vnd.ms-works\": \"wps\",\n \"application/vnd.ms-excel\": \"xls\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\": \"xlsx\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.template\": \"xltx\",\n \"application/vnd.ms-excel.sheet.macroenabled.12\": \"xlsm\",\n \"application/vnd.ms-excel.sheet.binary.macroenabled.12\": \"xlsb\",\n \"application/vnd.ms-excel.template.macroenabled.12\": \"xltm\",\n \"application/vnd.oasis.opendocument.spreadsheet\": \"ods\",\n \"application/vnd.oasis.opendocument.spreadsheet-flat-xml\": \"fods\",\n \"application/vnd.apple.numbers\": \"numbers\",\n \"application/vnd.ms-powerpoint\": \"ppt\",\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\": \"pptx\",\n \"application/vnd.ms-powerpoint.presentation.macroenabled.12\": \"pptm\",\n \"application/vnd.openxmlformats-officedocument.presentationml.slideshow\": \"ppsx\",\n \"application/vnd.ms-powerpoint.slideshow.macroenabled.12\": \"ppsm\",\n \"application/vnd.openxmlformats-officedocument.presentationml.template\": \"potx\",\n \"application/vnd.ms-powerpoint.template.macroenabled.12\": \"potm\",\n \"application/vnd.oasis.opendocument.presentation\": \"odp\",\n \"application/vnd.oasis.opendocument.presentation-flat-xml\": \"fodp\",\n \"application/vnd.apple.keynote\": \"key\"\n};\n\ntype LegacyOfficeTextSource = \"ascii\" | \"utf16\";\n\ntype PresentationSlideInsight = {\n title: string;\n layout?: string;\n textCount: number;\n imageCount: number;\n notesCount: number;\n hasTransition: boolean;\n animationCount: number;\n sampleTexts: string[];\n};\n\ntype PresentationInsight = {\n title: string;\n slideCount: number;\n imageCount: number;\n notesCount: number;\n transitionCount: number;\n animationCount: number;\n layouts: string[];\n slides: PresentationSlideInsight[];\n};\n\ntype IWorkMetadata = {\n title?: string;\n author?: string;\n company?: string;\n subject?: string;\n keywords?: string[];\n created?: string;\n modified?: string;\n};\n\nexport function officePlugin(): PreviewPlugin {\n return {\n name: \"office\",\n match(file) {\n return (\n wordExtensions.has(file.extension) ||\n sheetExtensions.has(file.extension) ||\n presentationExtensions.has(file.extension) ||\n officeMimeTypes.has(file.mimeType)\n );\n },\n async render(ctx) {\n const panel = createPanel(\"ofv-office\");\n ctx.viewport.append(panel);\n const extension = resolveFormat(ctx.file, officeMimeFormatMap);\n const arrayBuffer = await readArrayBuffer(ctx.file);\n let disposeDocxFit: (() => void) | undefined;\n\n if (fileIsDocx(extension)) {\n disposeDocxFit = await renderDocx(panel, arrayBuffer);\n } else if (extension === \"rtf\") {\n renderPlainDocument(panel, \"RTF 文档\", rtfToText(await readTextFromBuffer(arrayBuffer)));\n } else if (extension === \"odt\") {\n await renderOdt(panel, arrayBuffer);\n } else if (extension === \"fodt\") {\n renderOpenDocumentXml(panel, \"FODT 文档\", await readTextFromBuffer(arrayBuffer));\n } else if (extension === \"fods\") {\n renderFlatOds(panel, await readTextFromBuffer(arrayBuffer));\n } else if (packagedOfficeCandidates.has(extension) && (await renderPackagedOfficePreview(panel, arrayBuffer, extension))) {\n // Rendered by package sniffing.\n } else if (sheetExtensions.has(extension)) {\n await renderSheet(panel, arrayBuffer, extension);\n } else if ([\"pptx\", \"pptm\", \"ppsx\", \"ppsm\", \"potx\", \"potm\"].includes(extension)) {\n await renderPptx(panel, arrayBuffer);\n } else if (extension === \"odp\") {\n await renderOdp(panel, arrayBuffer);\n } else if (extension === \"fodp\") {\n renderOpenDocumentPresentationXml(panel, await readTextFromBuffer(arrayBuffer));\n } else if (isLegacyOfficeBinary(extension)) {\n renderLegacyOfficeBinary(panel, extension, arrayBuffer);\n } else {\n renderUnsupportedOffice(panel, extension || ctx.file.extension || \"office\");\n }\n\n return {\n destroy() {\n disposeDocxFit?.();\n panel.remove();\n }\n };\n }\n };\n}\n\nfunction fileIsDocx(extension: string): boolean {\n return extension === \"docx\" || extension === \"docm\" || extension === \"dotx\" || extension === \"dotm\";\n}\n\nasync function renderDocx(panel: HTMLElement, arrayBuffer: ArrayBuffer): Promise<() => void> {\n const section = createSection(\"Word 文档\");\n const content = document.createElement(\"div\");\n content.className = \"ofv-docx-document\";\n section.append(content);\n panel.append(section);\n\n try {\n const docxPreview = await import(\"docx-preview\");\n await docxPreview.renderAsync(arrayBuffer, content, content, {\n className: \"ofv-docx\",\n inWrapper: true,\n breakPages: true,\n ignoreWidth: false,\n ignoreHeight: false,\n ignoreFonts: false,\n renderHeaders: true,\n renderFooters: true,\n renderFootnotes: true,\n renderEndnotes: true,\n renderComments: true,\n renderAltChunks: true,\n experimental: true,\n useBase64URL: true\n });\n return fitDocxPages(content);\n } catch (error) {\n content.replaceChildren();\n const fallbackNote = document.createElement(\"div\");\n fallbackNote.className = \"ofv-docx-fallback-note\";\n fallbackNote.textContent = \"高保真 DOCX 渲染失败,已切换为基础内容预览。\";\n content.append(fallbackNote);\n try {\n await renderDocxWithMammoth(content, arrayBuffer);\n } catch (fallbackError) {\n await renderDocxTextFallback(content, arrayBuffer);\n console.warn(\"DOCX content fallback failed, used raw OpenXML text extraction:\", fallbackError);\n }\n console.warn(\"DOCX layout preview failed, fell back to Mammoth:\", error);\n }\n return () => undefined;\n}\n\nfunction fitDocxPages(container: HTMLElement): () => void {\n const wrapper = container.querySelector<HTMLElement>(\".ofv-docx-wrapper\");\n if (!wrapper) {\n return () => undefined;\n }\n\n const update = () => {\n const frames = ensureDocxPageFrames(wrapper);\n if (frames.length === 0) {\n wrapper.style.removeProperty(\"--ofv-docx-scale\");\n return;\n }\n\n const availableWidth = Math.max(1, container.clientWidth - 48);\n const pageWidth = Math.max(\n 1,\n ...frames.map(({ page }) => {\n const rectWidth = page.getBoundingClientRect().width;\n return page.offsetWidth || rectWidth || parseCssPixelValue(page.style.width) || 794;\n })\n );\n const scale = Math.min(1, Math.max(0.35, availableWidth / pageWidth));\n wrapper.style.setProperty(\"--ofv-docx-scale\", formatCssNumber(scale));\n wrapper.style.setProperty(\"--ofv-docx-page-width\", `${pageWidth}px`);\n\n for (const { frame, page } of frames) {\n const pageHeight = page.offsetHeight || page.getBoundingClientRect().height || parseCssPixelValue(page.style.height);\n if (pageHeight > 0) {\n frame.style.height = `${Math.ceil(pageHeight * scale)}px`;\n }\n }\n };\n\n update();\n const timers = [0, 80, 240].map((delay) => window.setTimeout(update, delay));\n\n if (typeof ResizeObserver === \"undefined\") {\n window.addEventListener(\"resize\", update);\n return () => {\n timers.forEach((timer) => window.clearTimeout(timer));\n window.removeEventListener(\"resize\", update);\n };\n }\n\n const observer = new ResizeObserver(update);\n observer.observe(container);\n observer.observe(wrapper);\n return () => {\n timers.forEach((timer) => window.clearTimeout(timer));\n observer.disconnect();\n };\n}\n\nfunction ensureDocxPageFrames(wrapper: HTMLElement): Array<{ frame: HTMLElement; page: HTMLElement }> {\n const pages = Array.from(wrapper.querySelectorAll<HTMLElement>(\"section.ofv-docx\"));\n return pages.map((page) => {\n const parent = page.parentElement;\n if (parent?.classList.contains(\"ofv-docx-page-frame\")) {\n return { frame: parent, page };\n }\n const frame = document.createElement(\"div\");\n frame.className = \"ofv-docx-page-frame\";\n page.before(frame);\n frame.append(page);\n return { frame, page };\n });\n}\n\nfunction parseCssPixelValue(value: string): number {\n const parsed = Number.parseFloat(value);\n return Number.isFinite(parsed) ? parsed : 0;\n}\n\nfunction formatCssNumber(value: number): string {\n return Number.isFinite(value) ? value.toFixed(4).replace(/0+$/, \"\").replace(/\\.$/, \"\") : \"1\";\n}\n\nasync function renderDocxTextFallback(container: HTMLElement, arrayBuffer: ArrayBuffer): Promise<void> {\n const article = document.createElement(\"article\");\n article.className = \"ofv-document\";\n\n try {\n const zip = await JSZip.loadAsync(arrayBuffer);\n const documentXml = await zip.file(\"word/document.xml\")?.async(\"text\");\n const paragraphs = documentXml ? extractWordParagraphs(documentXml) : [];\n if (paragraphs.length > 0) {\n for (const paragraphText of paragraphs) {\n const paragraph = document.createElement(\"p\");\n paragraph.textContent = paragraphText;\n article.append(paragraph);\n }\n } else {\n const empty = document.createElement(\"p\");\n empty.textContent = \"DOCX 内容解析失败,未提取到可展示文本。\";\n article.append(empty);\n }\n } catch {\n const empty = document.createElement(\"p\");\n empty.textContent = \"DOCX 内容解析失败,文件可能已损坏或不是有效的 DOCX。\";\n article.append(empty);\n }\n\n container.append(article);\n}\n\nasync function renderDocxWithMammoth(container: HTMLElement, arrayBuffer: ArrayBuffer): Promise<void> {\n const mammoth = await import(\"mammoth\");\n const result = await mammoth.convertToHtml(\n { arrayBuffer },\n {\n convertImage: mammoth.images.imgElement(async (image) => ({\n src: `data:${image.contentType};base64,${await image.read(\"base64\")}`\n }))\n }\n );\n const content = document.createElement(\"article\");\n content.className = \"ofv-document\";\n content.innerHTML = sanitizeHtml(result.value || \"<p>未解析到可展示内容。</p>\");\n container.append(content);\n\n if (result.messages.length > 0) {\n const notes = document.createElement(\"details\");\n notes.className = \"ofv-details\";\n const summary = document.createElement(\"summary\");\n summary.textContent = `解析提示 ${result.messages.length}`;\n const list = document.createElement(\"ul\");\n for (const message of result.messages) {\n const item = document.createElement(\"li\");\n item.textContent = message.message;\n list.append(item);\n }\n notes.append(summary, list);\n container.append(notes);\n }\n}\n\nasync function renderOdt(panel: HTMLElement, arrayBuffer: ArrayBuffer): Promise<void> {\n const zip = await JSZip.loadAsync(arrayBuffer);\n const content = zip.file(\"content.xml\");\n if (!content) {\n renderPlainDocument(panel, \"ODT 文档\", \"未找到 content.xml。\");\n return;\n }\n renderOpenDocumentXml(panel, \"ODT 文档\", await content.async(\"text\"));\n}\n\nfunction renderOpenDocumentXml(panel: HTMLElement, title: string, xml: string): void {\n const section = createSection(title);\n const article = document.createElement(\"article\");\n article.className = \"ofv-document\";\n const blocks = extractOpenDocumentBlocks(xml);\n if (blocks.length > 0) {\n for (const block of blocks) {\n const paragraph = document.createElement(\"p\");\n paragraph.textContent = block;\n article.append(paragraph);\n }\n } else {\n const empty = document.createElement(\"p\");\n empty.textContent = \"未提取到可展示文本。\";\n article.append(empty);\n }\n section.append(article);\n panel.append(section);\n}\n\nfunction renderPlainDocument(panel: HTMLElement, title: string, text: string): void {\n const section = createSection(title);\n const pre = document.createElement(\"pre\");\n pre.className = \"ofv-text-block\";\n pre.textContent = text || \"未提取到可展示文本。\";\n section.append(pre);\n panel.append(section);\n}\n\nasync function renderSheet(\n panel: HTMLElement,\n arrayBuffer: ArrayBuffer,\n extension: string\n): Promise<void> {\n const xlsx = await import(\"xlsx\");\n let workbook: WorkBook;\n try {\n workbook = xlsx.read(arrayBuffer, { type: \"array\" }) as WorkBook;\n } catch (error) {\n if (isLegacyOfficeBinary(extension)) {\n renderLegacyOfficeBinary(panel, extension, arrayBuffer, `表格解析失败:${normalizeOfficeError(error)}`);\n return;\n }\n renderSheetFallback(panel, extension, normalizeOfficeError(error));\n return;\n }\n const chartPreviews = await readWorkbookCharts(arrayBuffer).catch(() => []);\n const tabs = document.createElement(\"div\");\n tabs.className = \"ofv-tabs\";\n tabs.setAttribute(\"role\", \"tablist\");\n const content = document.createElement(\"div\");\n content.className = \"ofv-sheet\";\n content.setAttribute(\"role\", \"tabpanel\");\n const buttons = new Map<string, HTMLButtonElement>();\n\n const renderSheetByName = (sheetName: string, sheetIndex: number) => {\n content.replaceChildren();\n buttons.forEach((button, name) => {\n const active = name === sheetName;\n button.classList.toggle(\"is-active\", active);\n button.setAttribute(\"aria-selected\", String(active));\n });\n content.setAttribute(\"aria-label\", sheetName);\n\n const heading = document.createElement(\"h3\");\n heading.textContent = sheetName;\n const sheet = workbook.Sheets[sheetName];\n const range = xlsx.utils.decode_range(sheet[\"!ref\"] || \"A1:A1\");\n const rowCount = range.e.r - range.s.r + 1;\n const columnCount = range.e.c - range.s.c + 1;\n const formulaRows = collectFormulaRows(sheet, range, xlsx.utils.encode_cell);\n\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-sheet-summary\";\n summary.textContent = `${rowCount} 行 x ${columnCount} 列${\n formulaRows.length > 0 ? `,包含 ${formulaRows.length} 个公式单元格` : \"\"\n }`;\n\n const tableWrapper = document.createElement(\"div\");\n tableWrapper.className = \"ofv-table-scroll\";\n const viewport = createSheetViewport(rowCount, columnCount);\n const windowControls = createSheetWindowControls(viewport, () => renderTableWindow());\n const renderTableWindow = () => {\n tableWrapper.replaceChildren(\n createWorkbookSheetTable(\n sheet,\n range,\n sheetIndex,\n viewport,\n xlsx.utils.encode_cell,\n xlsx.utils.format_cell\n )\n );\n windowControls?.update();\n };\n\n content.append(heading, summary);\n if (windowControls) {\n content.append(windowControls.element);\n }\n content.append(tableWrapper);\n renderTableWindow();\n\n if (formulaRows.length > 0) {\n const details = document.createElement(\"details\");\n details.className = \"ofv-details ofv-formula-list\";\n const detailsSummary = document.createElement(\"summary\");\n detailsSummary.textContent = \"公式明细\";\n const list = document.createElement(\"ul\");\n for (const item of formulaRows.slice(0, 200)) {\n const row = document.createElement(\"li\");\n row.textContent = `${item.address}: ${item.formula}`;\n list.append(row);\n }\n if (formulaRows.length > 200) {\n const row = document.createElement(\"li\");\n row.textContent = `还有 ${formulaRows.length - 200} 个公式未展示。`;\n list.append(row);\n }\n details.append(detailsSummary, list);\n content.append(details);\n }\n };\n\n if (workbook.SheetNames.length === 0) {\n content.textContent = extension === \"numbers\" ? \"Numbers 文件需要服务端转换后高保真预览。\" : \"未解析到表格。\";\n } else {\n for (const [index, sheetName] of workbook.SheetNames.entries()) {\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.setAttribute(\"role\", \"tab\");\n button.setAttribute(\"aria-selected\", \"false\");\n button.textContent = sheetName;\n button.title = sheetName;\n button.addEventListener(\"click\", () => renderSheetByName(sheetName, index));\n buttons.set(sheetName, button);\n tabs.append(button);\n if (index === 0) {\n renderSheetByName(sheetName, index);\n }\n }\n }\n\n panel.append(tabs, content);\n if (chartPreviews.length > 0) {\n panel.append(renderChartPreviewSection(chartPreviews));\n }\n}\n\nfunction renderSheetFallback(panel: HTMLElement, extension: string, detail: string): void {\n const section = createSection(\"表格解析失败\");\n const title = document.createElement(\"p\");\n title.textContent = `.${extension || \"sheet\"} 文件无法解析为可预览表格。`;\n const meta = document.createElement(\"p\");\n meta.textContent = detail;\n const support = document.createElement(\"p\");\n support.textContent = \"请确认文件未加密、未损坏,或先转换为 XLSX/CSV/ODS 后再预览。\";\n section.append(title, meta, support);\n panel.append(section);\n}\n\ntype ChartPreview = {\n name: string;\n type: string;\n title: string;\n categories: string[];\n series: Array<{ name: string; values: number[] }>;\n};\n\ntype ParsedSheet = {\n name: string;\n rows: string[][];\n formulas: Array<{ address: string; formula: string }>;\n};\n\nfunction renderFlatOds(panel: HTMLElement, xml: string): void {\n const sheets = parseFlatOds(xml);\n renderParsedSheets(panel, sheets, \"FODS 文件未解析到表格。\");\n}\n\nfunction renderParsedSheets(panel: HTMLElement, sheets: ParsedSheet[], emptyMessage: string): void {\n const tabs = document.createElement(\"div\");\n tabs.className = \"ofv-tabs\";\n tabs.setAttribute(\"role\", \"tablist\");\n const content = document.createElement(\"div\");\n content.className = \"ofv-sheet\";\n content.setAttribute(\"role\", \"tabpanel\");\n const buttons = new Map<string, HTMLButtonElement>();\n\n const renderSheetByIndex = (sheet: ParsedSheet, sheetIndex: number) => {\n content.replaceChildren();\n buttons.forEach((button, name) => {\n const active = name === sheet.name;\n button.classList.toggle(\"is-active\", active);\n button.setAttribute(\"aria-selected\", String(active));\n });\n content.setAttribute(\"aria-label\", sheet.name);\n\n const heading = document.createElement(\"h3\");\n heading.textContent = sheet.name;\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-sheet-summary\";\n const rowCount = sheet.rows.length;\n const columnCount = Math.max(0, ...sheet.rows.map((row) => row.length));\n summary.textContent = `${rowCount} 行 x ${columnCount} 列${\n sheet.formulas.length > 0 ? `,包含 ${sheet.formulas.length} 个公式单元格` : \"\"\n }`;\n\n const tableWrapper = document.createElement(\"div\");\n tableWrapper.className = \"ofv-table-scroll\";\n const viewport = createSheetViewport(rowCount, columnCount);\n const windowControls = createSheetWindowControls(viewport, () => renderTableWindow());\n const renderTableWindow = () => {\n tableWrapper.replaceChildren(createParsedSheetTable(sheet, sheetIndex, viewport));\n windowControls?.update();\n };\n\n content.append(heading, summary);\n if (windowControls) {\n content.append(windowControls.element);\n }\n content.append(tableWrapper);\n renderTableWindow();\n\n if (sheet.formulas.length > 0) {\n const details = document.createElement(\"details\");\n details.className = \"ofv-details ofv-formula-list\";\n const detailsSummary = document.createElement(\"summary\");\n detailsSummary.textContent = \"公式明细\";\n const list = document.createElement(\"ul\");\n for (const item of sheet.formulas.slice(0, 200)) {\n const row = document.createElement(\"li\");\n row.textContent = `${item.address}: ${item.formula}`;\n list.append(row);\n }\n if (sheet.formulas.length > 200) {\n const row = document.createElement(\"li\");\n row.textContent = `还有 ${sheet.formulas.length - 200} 个公式未展示。`;\n list.append(row);\n }\n details.append(detailsSummary, list);\n content.append(details);\n }\n };\n\n if (sheets.length === 0) {\n content.textContent = emptyMessage;\n } else {\n for (const [index, sheet] of sheets.entries()) {\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.setAttribute(\"role\", \"tab\");\n button.setAttribute(\"aria-selected\", \"false\");\n button.textContent = sheet.name;\n button.title = sheet.name;\n button.addEventListener(\"click\", () => renderSheetByIndex(sheet, index));\n buttons.set(sheet.name, button);\n tabs.append(button);\n if (index === 0) {\n renderSheetByIndex(sheet, index);\n }\n }\n }\n\n panel.append(tabs, content);\n}\n\nasync function readWorkbookCharts(arrayBuffer: ArrayBuffer): Promise<ChartPreview[]> {\n const zip = await JSZip.loadAsync(arrayBuffer);\n const chartEntries = Object.values(zip.files)\n .filter((entry) => !entry.dir && /^xl\\/charts\\/chart\\d+\\.xml$/i.test(entry.name))\n .sort((a, b) => a.name.localeCompare(b.name));\n const charts: ChartPreview[] = [];\n for (const [index, entry] of chartEntries.entries()) {\n const xml = await entry.async(\"text\");\n const chart = parseChartXml(xml, entry.name.split(\"/\").pop() || `chart${index + 1}.xml`);\n if (chart) {\n charts.push(chart);\n }\n }\n return charts;\n}\n\nfunction parseChartXml(xml: string, fallbackName: string): ChartPreview | null {\n const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n if (doc.querySelector(\"parsererror\")) {\n return null;\n }\n\n const type = detectChartType(doc);\n const title = textFromFirst(doc, \"title\") || fallbackName.replace(/\\.xml$/i, \"\");\n const seriesElements = Array.from(doc.getElementsByTagName(\"*\")).filter((element) => element.localName === \"ser\");\n const series = seriesElements\n .map((element, index) => parseChartSeries(element, index))\n .filter((item): item is { name: string; values: number[]; categories: string[] } => item.values.length > 0);\n\n if (series.length === 0) {\n return null;\n }\n\n return {\n name: fallbackName,\n type,\n title,\n categories: series.find((item) => item.categories.length > 0)?.categories || [],\n series: series.map((item) => ({ name: item.name, values: item.values }))\n };\n}\n\nfunction detectChartType(doc: Document): string {\n const chartType = Array.from(doc.getElementsByTagName(\"*\")).find(\n (element) => element.localName.endsWith(\"Chart\") && element.localName !== \"chart\"\n )?.localName;\n if (!chartType) {\n return \"chart\";\n }\n return chartType.replace(/Chart$/i, \"\").toLowerCase();\n}\n\nfunction parseChartSeries(\n element: Element,\n index: number\n): { name: string; values: number[]; categories: string[] } {\n return {\n name: textFromFirst(element, \"tx\") || `Series ${index + 1}`,\n values: numbersFromFirst(element, \"val\"),\n categories: stringsFromFirst(element, \"cat\")\n };\n}\n\nfunction renderChartPreviewSection(charts: ChartPreview[]): HTMLElement {\n const section = createSection(\"表格图表预览\");\n const grid = document.createElement(\"div\");\n grid.className = \"ofv-chart-grid\";\n for (const chart of charts) {\n grid.append(renderChartCard(chart));\n }\n section.append(grid);\n return section;\n}\n\nfunction renderChartCard(chart: ChartPreview): HTMLElement {\n const card = document.createElement(\"article\");\n card.className = \"ofv-chart-card\";\n\n const header = document.createElement(\"header\");\n const title = document.createElement(\"h4\");\n title.textContent = chart.title;\n const meta = document.createElement(\"span\");\n meta.textContent = `${chart.type} · ${chart.series.length} 个系列`;\n header.append(title, meta);\n\n const svg = renderChartSvg(chart);\n const details = document.createElement(\"details\");\n details.className = \"ofv-details ofv-chart-data\";\n const summary = document.createElement(\"summary\");\n summary.textContent = \"数据摘要\";\n const list = document.createElement(\"ul\");\n for (const item of chart.series) {\n const row = document.createElement(\"li\");\n row.textContent = `${item.name}: ${item.values.slice(0, 12).join(\", \")}${\n item.values.length > 12 ? ` ... 共 ${item.values.length} 项` : \"\"\n }`;\n list.append(row);\n }\n details.append(summary, list);\n card.append(header, svg, details);\n return card;\n}\n\nfunction renderChartSvg(chart: ChartPreview): SVGSVGElement {\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svg.setAttribute(\"viewBox\", \"0 0 640 260\");\n svg.setAttribute(\"role\", \"img\");\n svg.setAttribute(\"aria-label\", chart.title);\n svg.classList.add(\"ofv-chart-svg\");\n\n const allValues = chart.series.flatMap((item) => item.values).filter((value) => Number.isFinite(value));\n const max = Math.max(1, ...allValues);\n const min = Math.min(0, ...allValues);\n const span = max - min || 1;\n const colors = [\"#2563eb\", \"#059669\", \"#d97706\", \"#dc2626\", \"#7c3aed\"];\n const plot = { x: 48, y: 24, width: 552, height: 178 };\n\n appendSvg(svg, \"line\", { x1: plot.x, y1: plot.y, x2: plot.x, y2: plot.y + plot.height, class: \"ofv-chart-axis\" });\n appendSvg(svg, \"line\", {\n x1: plot.x,\n y1: plot.y + plot.height,\n x2: plot.x + plot.width,\n y2: plot.y + plot.height,\n class: \"ofv-chart-axis\"\n });\n\n chart.series.forEach((series, seriesIndex) => {\n const color = colors[seriesIndex % colors.length];\n const step = series.values.length > 1 ? plot.width / (series.values.length - 1) : plot.width;\n const points = series.values.map((value, index) => ({\n x: plot.x + index * step,\n y: plot.y + plot.height - ((value - min) / span) * plot.height\n }));\n\n if (chart.type.includes(\"bar\") || chart.type.includes(\"col\")) {\n const barWidth = Math.max(4, Math.min(28, step * 0.6)) / Math.max(1, chart.series.length);\n points.forEach((point, index) => {\n const zeroY = plot.y + plot.height - ((0 - min) / span) * plot.height;\n const x = point.x - (barWidth * chart.series.length) / 2 + seriesIndex * barWidth;\n appendSvg(svg, \"rect\", {\n x,\n y: Math.min(point.y, zeroY),\n width: barWidth,\n height: Math.max(1, Math.abs(zeroY - point.y)),\n fill: color,\n \"data-index\": index\n });\n });\n } else {\n appendSvg(svg, \"polyline\", {\n points: points.map((point) => `${point.x.toFixed(1)},${point.y.toFixed(1)}`).join(\" \"),\n fill: \"none\",\n stroke: color,\n \"stroke-width\": 3,\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\"\n });\n for (const point of points.slice(0, 80)) {\n appendSvg(svg, \"circle\", { cx: point.x, cy: point.y, r: 3, fill: color });\n }\n }\n\n appendLegend(svg, series.name, color, 52 + seriesIndex * 118, 236);\n });\n\n return svg;\n}\n\nfunction appendLegend(svg: SVGSVGElement, label: string, color: string, x: number, y: number): void {\n appendSvg(svg, \"rect\", { x, y: y - 10, width: 12, height: 12, rx: 2, fill: color });\n const text = appendSvg(svg, \"text\", { x: x + 18, y, class: \"ofv-chart-label\" });\n text.textContent = label.length > 16 ? `${label.slice(0, 16)}...` : label;\n}\n\nfunction appendSvg<K extends keyof SVGElementTagNameMap>(\n parent: SVGElement,\n tag: K,\n attributes: Record<string, string | number>\n): SVGElementTagNameMap[K] {\n const element = document.createElementNS(\"http://www.w3.org/2000/svg\", tag);\n for (const [key, value] of Object.entries(attributes)) {\n element.setAttribute(key, String(value));\n }\n parent.append(element);\n return element;\n}\n\nfunction textFromFirst(root: ParentNode, localName: string): string {\n const element = Array.from(root.querySelectorAll(\"*\")).find((item) => item.localName === localName);\n return element ? chartText(element) : \"\";\n}\n\nfunction stringsFromFirst(root: ParentNode, localName: string): string[] {\n const element = Array.from(root.querySelectorAll(\"*\")).find((item) => item.localName === localName);\n if (!element) {\n return [];\n }\n return chartStringValues(element);\n}\n\nfunction numbersFromFirst(root: ParentNode, localName: string): number[] {\n const element = Array.from(root.querySelectorAll(\"*\")).find((item) => item.localName === localName);\n if (!element) {\n return [];\n }\n return Array.from(element.querySelectorAll(\"*\"))\n .filter((item) => item.localName === \"v\")\n .map((item) => Number(item.textContent || \"\"))\n .filter((value) => Number.isFinite(value));\n}\n\nfunction chartText(element: Element): string {\n return (\n Array.from(element.querySelectorAll(\"*\"))\n .filter((item) => item.localName === \"v\" || item.localName === \"t\")\n .map((item) => item.textContent?.trim() || \"\")\n .find(Boolean) || \"\"\n );\n}\n\nfunction chartStringValues(element: Element): string[] {\n return Array.from(element.querySelectorAll(\"*\"))\n .filter((item) => item.localName === \"v\" || item.localName === \"t\")\n .map((item) => item.textContent?.trim() || \"\")\n .filter(Boolean);\n}\n\ntype SheetViewport = {\n rowStart: number;\n columnStart: number;\n rowCount: number;\n columnCount: number;\n};\n\ntype SheetWindowControls = {\n element: HTMLElement;\n update: () => void;\n};\n\nfunction createSheetViewport(rowCount: number, columnCount: number): SheetViewport {\n return {\n rowStart: 0,\n columnStart: 0,\n rowCount,\n columnCount\n };\n}\n\nfunction createSheetWindowControls(viewport: SheetViewport, render: () => void): SheetWindowControls | null {\n const needsRows = viewport.rowCount > SHEET_WINDOW_ROWS;\n const needsColumns = viewport.columnCount > SHEET_WINDOW_COLUMNS;\n if (!needsRows && !needsColumns) {\n return null;\n }\n\n const controls = document.createElement(\"div\");\n controls.className = \"ofv-sheet-window\";\n\n const note = document.createElement(\"span\");\n note.className = \"ofv-sheet-window-note\";\n\n const rowBack = createWindowButton(\"上 200 行\", () => {\n viewport.rowStart = Math.max(0, viewport.rowStart - SHEET_WINDOW_ROWS);\n render();\n });\n const rowNext = createWindowButton(\"下 200 行\", () => {\n viewport.rowStart = Math.min(maxStart(viewport.rowCount, SHEET_WINDOW_ROWS), viewport.rowStart + SHEET_WINDOW_ROWS);\n render();\n });\n const colBack = createWindowButton(\"左 80 列\", () => {\n viewport.columnStart = Math.max(0, viewport.columnStart - SHEET_WINDOW_COLUMNS);\n render();\n });\n const colNext = createWindowButton(\"右 80 列\", () => {\n viewport.columnStart = Math.min(\n maxStart(viewport.columnCount, SHEET_WINDOW_COLUMNS),\n viewport.columnStart + SHEET_WINDOW_COLUMNS\n );\n render();\n });\n\n controls.append(note, rowBack, rowNext, colBack, colNext);\n\n const update = () => {\n const rowEnd = Math.min(viewport.rowStart + SHEET_WINDOW_ROWS, viewport.rowCount);\n const columnEnd = Math.min(viewport.columnStart + SHEET_WINDOW_COLUMNS, viewport.columnCount);\n note.textContent = `大表格窗口化渲染:当前 ${viewport.rowStart + 1}-${rowEnd} 行,${viewport.columnStart + 1}-${columnEnd} 列`;\n rowBack.disabled = viewport.rowStart === 0;\n rowNext.disabled = viewport.rowStart >= maxStart(viewport.rowCount, SHEET_WINDOW_ROWS);\n colBack.disabled = viewport.columnStart === 0;\n colNext.disabled = viewport.columnStart >= maxStart(viewport.columnCount, SHEET_WINDOW_COLUMNS);\n rowBack.hidden = rowNext.hidden = !needsRows;\n colBack.hidden = colNext.hidden = !needsColumns;\n };\n\n update();\n return { element: controls, update };\n}\n\nfunction createWindowButton(label: string, onClick: () => void): HTMLButtonElement {\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.textContent = label;\n button.addEventListener(\"click\", onClick);\n return button;\n}\n\nfunction maxStart(total: number, size: number): number {\n return Math.max(0, total - size);\n}\n\nfunction createWorkbookSheetTable(\n sheet: Record<string, any>,\n range: { s: { r: number; c: number }; e: { r: number; c: number } },\n sheetIndex: number,\n viewport: SheetViewport,\n encodeCell: (cell: { r: number; c: number }) => string,\n formatCell: (cell: any) => string\n): HTMLTableElement {\n const table = document.createElement(\"table\");\n table.id = `ofv-sheet-${sheetIndex + 1}`;\n const rowEnd = Math.min(range.s.r + viewport.rowStart + SHEET_WINDOW_ROWS - 1, range.e.r);\n const columnEnd = Math.min(range.s.c + viewport.columnStart + SHEET_WINDOW_COLUMNS - 1, range.e.c);\n\n for (let rowIndex = range.s.r + viewport.rowStart; rowIndex <= rowEnd; rowIndex += 1) {\n const row = document.createElement(\"tr\");\n for (let columnIndex = range.s.c + viewport.columnStart; columnIndex <= columnEnd; columnIndex += 1) {\n const cell = document.createElement(rowIndex === range.s.r ? \"th\" : \"td\");\n const address = encodeCell({ r: rowIndex, c: columnIndex });\n const sourceCell = sheet[address];\n cell.dataset.cell = address;\n const text = sourceCell ? formatCell(sourceCell) : \"\";\n cell.textContent = text;\n if (text) {\n cell.title = text;\n }\n if (sourceCell?.f) {\n cell.classList.add(\"ofv-cell-formula\");\n cell.title = `=${sourceCell.f}`;\n }\n row.append(cell);\n }\n table.append(row);\n }\n\n return table;\n}\n\nfunction createParsedSheetTable(sheet: ParsedSheet, sheetIndex: number, viewport: SheetViewport): HTMLTableElement {\n const table = document.createElement(\"table\");\n table.id = `ofv-sheet-${sheetIndex + 1}`;\n const formulaMap = new Map(sheet.formulas.map((item) => [item.address, item.formula]));\n const rowEnd = Math.min(viewport.rowStart + SHEET_WINDOW_ROWS, sheet.rows.length);\n for (let rowIndex = viewport.rowStart; rowIndex < rowEnd; rowIndex += 1) {\n const sourceRow = sheet.rows[rowIndex] || [];\n const row = document.createElement(\"tr\");\n const columnEnd = Math.min(viewport.columnStart + SHEET_WINDOW_COLUMNS, viewport.columnCount);\n for (let columnIndex = viewport.columnStart; columnIndex < columnEnd; columnIndex += 1) {\n const value = sourceRow[columnIndex] || \"\";\n const cell = document.createElement(rowIndex === 0 ? \"th\" : \"td\");\n const address = encodeA1(rowIndex, columnIndex);\n cell.dataset.cell = address;\n cell.textContent = value;\n if (value) {\n cell.title = value;\n }\n const formula = formulaMap.get(address);\n if (formula) {\n cell.classList.add(\"ofv-cell-formula\");\n cell.title = formula;\n }\n row.append(cell);\n }\n table.append(row);\n }\n return table;\n}\n\nfunction parseFlatOds(xml: string): ParsedSheet[] {\n const documentXml = new DOMParser().parseFromString(xml, \"application/xml\");\n if (documentXml.querySelector(\"parsererror\")) {\n return [];\n }\n\n return Array.from(documentXml.getElementsByTagName(\"*\"))\n .filter((element) => element.localName === \"table\")\n .map((tableElement, tableIndex) => parseFlatOdsTable(tableElement, tableIndex))\n .filter((sheet) => sheet.rows.length > 0);\n}\n\nfunction parseFlatOdsTable(tableElement: Element, tableIndex: number): ParsedSheet {\n const rows: string[][] = [];\n const formulas: Array<{ address: string; formula: string }> = [];\n const sheetName = getXmlAttribute(tableElement, \"name\") || `Sheet ${tableIndex + 1}`;\n for (const rowElement of Array.from(tableElement.children).filter((element) => element.localName === \"table-row\")) {\n const repeatRows = clampRepeat(getXmlAttribute(rowElement, \"number-rows-repeated\"), 200);\n const parsedRow = parseFlatOdsRow(rowElement, rows.length, formulas);\n for (let index = 0; index < repeatRows; index += 1) {\n rows.push([...parsedRow]);\n }\n }\n trimEmptyTrailingRows(rows);\n return { name: sheetName, rows, formulas };\n}\n\nfunction parseFlatOdsRow(\n rowElement: Element,\n rowIndex: number,\n formulas: Array<{ address: string; formula: string }>\n): string[] {\n const row: string[] = [];\n for (const cellElement of Array.from(rowElement.children).filter(\n (element) => element.localName === \"table-cell\" || element.localName === \"covered-table-cell\"\n )) {\n const repeatColumns = clampRepeat(getXmlAttribute(cellElement, \"number-columns-repeated\"), 256);\n const value = extractFlatOdsCellValue(cellElement);\n const formula = getXmlAttribute(cellElement, \"formula\");\n for (let index = 0; index < repeatColumns; index += 1) {\n const columnIndex = row.length;\n row.push(value);\n if (formula) {\n formulas.push({ address: encodeA1(rowIndex, columnIndex), formula });\n }\n }\n }\n trimEmptyTrailingCells(row);\n return row;\n}\n\nfunction extractFlatOdsCellValue(cellElement: Element): string {\n const text = extractOpenDocumentTextFromElement(cellElement);\n if (text) {\n return text;\n }\n return (\n getXmlAttribute(cellElement, \"value\") ||\n getXmlAttribute(cellElement, \"date-value\") ||\n getXmlAttribute(cellElement, \"time-value\") ||\n getXmlAttribute(cellElement, \"boolean-value\") ||\n \"\"\n );\n}\n\nfunction extractOpenDocumentTextFromElement(element: Element): string {\n const fragments: string[] = [];\n const visit = (node: Node) => {\n if (node.nodeType === Node.TEXT_NODE) {\n fragments.push(node.textContent || \"\");\n return;\n }\n if (!(node instanceof Element)) {\n return;\n }\n if (node.localName === \"s\") {\n fragments.push(\" \".repeat(clampRepeat(getXmlAttribute(node, \"c\"), 64)));\n return;\n }\n if (node.localName === \"tab\") {\n fragments.push(\"\\t\");\n return;\n }\n if (node.localName === \"line-break\") {\n fragments.push(\"\\n\");\n return;\n }\n for (const child of Array.from(node.childNodes)) {\n visit(child);\n }\n if (node.localName === \"p\" || node.localName === \"h\") {\n fragments.push(\"\\n\");\n }\n };\n visit(element);\n return fragments.join(\"\").replace(/\\n+$/g, \"\").trim();\n}\n\nfunction getXmlAttribute(element: Element, localName: string): string | null {\n const direct = element.getAttribute(localName);\n if (direct !== null) {\n return direct;\n }\n for (const attribute of Array.from(element.attributes)) {\n if (attribute.localName === localName) {\n return attribute.value;\n }\n }\n return null;\n}\n\nfunction clampRepeat(value: string | null, max: number): number {\n const parsed = value ? Number.parseInt(value, 10) : 1;\n if (!Number.isFinite(parsed) || parsed < 1) {\n return 1;\n }\n return Math.min(parsed, max);\n}\n\nfunction trimEmptyTrailingRows(rows: string[][]): void {\n while (rows.length > 0 && rows[rows.length - 1].every((cell) => cell === \"\")) {\n rows.pop();\n }\n}\n\nfunction trimEmptyTrailingCells(row: string[]): void {\n while (row.length > 0 && row[row.length - 1] === \"\") {\n row.pop();\n }\n}\n\nfunction collectFormulaRows(\n sheet: Record<string, any>,\n range: { s: { r: number; c: number }; e: { r: number; c: number } },\n encodeCell: (cell: { r: number; c: number }) => string\n): Array<{ address: string; formula: string }> {\n const formulas: Array<{ address: string; formula: string }> = [];\n for (let row = range.s.r; row <= range.e.r; row += 1) {\n for (let column = range.s.c; column <= range.e.c; column += 1) {\n const address = encodeCell({ r: row, c: column });\n const cell = sheet[address];\n if (cell?.f) {\n formulas.push({ address, formula: `=${cell.f}` });\n }\n }\n }\n return formulas;\n}\n\nfunction encodeA1(rowIndex: number, columnIndex: number): string {\n let column = \"\";\n let value = columnIndex + 1;\n while (value > 0) {\n const remainder = (value - 1) % 26;\n column = String.fromCharCode(65 + remainder) + column;\n value = Math.floor((value - 1) / 26);\n }\n return `${column}${rowIndex + 1}`;\n}\n\nasync function renderPptx(panel: HTMLElement, arrayBuffer: ArrayBuffer): Promise<void> {\n const container = document.createElement(\"div\");\n container.className = \"ofv-pptx-viewer\";\n\n try {\n const zip = await JSZip.loadAsync(arrayBuffer);\n await renderPresentationInsight(panel, await inspectPptxPresentation(zip));\n } catch (error) {\n console.warn(\"PPTX structure insight extraction failed:\", error);\n }\n\n panel.append(container);\n try {\n const { PptxViewer } = await import(\"@aiden0z/pptx-renderer\");\n await PptxViewer.open(arrayBuffer, container);\n } catch {\n container.textContent = \"PPTX 渲染失败,请检查文件是否损坏。\";\n }\n}\n\nasync function renderOdp(panel: HTMLElement, arrayBuffer: ArrayBuffer): Promise<void> {\n const zip = await JSZip.loadAsync(arrayBuffer);\n const content = zip.file(\"content.xml\");\n if (!content) {\n panel.textContent = \"未解析到 ODP 内容。\";\n return;\n }\n const xml = await content.async(\"text\");\n const images = await extractZipImages(zip, /^Pictures\\//);\n renderPresentationInsight(panel, inspectOpenDocumentPresentation(titleFromOdf(xml, \"ODP 演示文稿\"), xml, images.length));\n renderOpenDocumentPresentation(panel, \"ODP 演示文稿\", xml, images);\n}\n\nfunction renderOpenDocumentPresentationXml(panel: HTMLElement, xml: string): void {\n renderPresentationInsight(panel, inspectOpenDocumentPresentation(\"FODP 演示文稿\", xml, 0));\n renderOpenDocumentPresentation(panel, \"FODP 演示文稿\", xml, []);\n}\n\nasync function renderPackagedOfficePreview(\n panel: HTMLElement,\n arrayBuffer: ArrayBuffer,\n extension: string\n): Promise<boolean> {\n let zip: JSZip;\n try {\n zip = await JSZip.loadAsync(arrayBuffer);\n } catch {\n return false;\n }\n\n const entries = Object.values(zip.files).filter((entry) => !entry.dir);\n const hasEntry = (path: string) => entries.some((entry) => entry.name.toLowerCase() === path.toLowerCase());\n const contentXml = zip.file(/(^|\\/)content\\.xml$/i)[0];\n\n if (hasEntry(\"word/document.xml\")) {\n renderOfficePackageNotice(panel, extension, \"检测到 OOXML Word 包结构,已按 DOCX 兼容路径预览。\");\n await renderDocx(panel, arrayBuffer);\n return true;\n }\n\n if (hasEntry(\"xl/workbook.xml\")) {\n renderOfficePackageNotice(panel, extension, \"检测到 OOXML Workbook 包结构,已按 XLSX 兼容路径预览。\");\n await renderSheet(panel, arrayBuffer, extension);\n return true;\n }\n\n if (hasEntry(\"ppt/presentation.xml\")) {\n renderOfficePackageNotice(panel, extension, \"检测到 OOXML Presentation 包结构,已按 PPTX 兼容路径预览。\");\n await renderPptx(panel, arrayBuffer);\n return true;\n }\n\n if (contentXml) {\n const xml = await contentXml.async(\"text\");\n if (/<office:spreadsheet\\b|<table:table\\b/i.test(xml)) {\n renderOfficePackageNotice(panel, extension, \"检测到 OpenDocument Spreadsheet 包结构,已按 ODS 兼容路径预览。\");\n renderParsedSheets(panel, parseFlatOds(xml), `${extension.toUpperCase()} 文件未解析到表格。`);\n return true;\n }\n if (/<office:presentation\\b|<draw:page\\b/i.test(xml)) {\n renderOfficePackageNotice(panel, extension, \"检测到 OpenDocument Presentation 包结构,已按 ODP 兼容路径预览。\");\n renderOpenDocumentPresentation(panel, `${extension.toUpperCase()} 演示文稿`, xml, await extractZipImages(zip, /^Pictures\\//));\n return true;\n }\n if (/<office:text\\b|<text:p\\b/i.test(xml)) {\n renderOfficePackageNotice(panel, extension, \"检测到 OpenDocument Text 包结构,已按 ODT 兼容路径预览。\");\n renderOpenDocumentXml(panel, `${extension.toUpperCase()} 文档`, xml);\n return true;\n }\n }\n\n if (entries.some((entry) => /^index\\//i.test(entry.name) || /\\.iwa$/i.test(entry.name))) {\n renderOfficePackageStructure(\n panel,\n extension,\n entries.map((entry) => entry.name),\n \"检测到 Apple iWork 包结构。当前解析包内 plist 元数据并展示 IWA/资源结构;正文 IWA 数据可后续接入专用解析器增强。\",\n await extractIWorkMetadata(entries)\n );\n return true;\n }\n\n if (entries.length > 0) {\n renderOfficePackageStructure(\n panel,\n extension,\n entries.map((entry) => entry.name),\n \"检测到 ZIP 包结构,但未发现标准 OOXML/ODF 入口。可后续接入对应厂商格式解析器或服务端转换。\"\n );\n return true;\n }\n\n return false;\n}\n\nfunction renderOfficePackageNotice(panel: HTMLElement, extension: string, message: string): void {\n const section = createSection(\"兼容包识别\");\n const note = document.createElement(\"p\");\n note.className = \"ofv-office-package-note\";\n note.textContent = `.${extension} ${message}`;\n section.append(note);\n panel.append(section);\n}\n\nfunction renderOfficePackageStructure(\n panel: HTMLElement,\n extension: string,\n entries: string[],\n message: string,\n metadata?: IWorkMetadata\n): void {\n const section = createSection(\"Office 包结构预览\");\n const note = document.createElement(\"p\");\n note.className = \"ofv-office-package-note\";\n note.textContent = `.${extension} ${message}`;\n\n if (metadata && Object.keys(metadata).length > 0) {\n section.append(createIWorkMetadataSummary(metadata));\n }\n\n const list = document.createElement(\"ul\");\n list.className = \"ofv-office-package-list\";\n for (const name of entries.slice(0, 120)) {\n const item = document.createElement(\"li\");\n item.textContent = name;\n list.append(item);\n }\n if (entries.length > 120) {\n const item = document.createElement(\"li\");\n item.textContent = `还有 ${entries.length - 120} 个文件未展示。`;\n list.append(item);\n }\n\n section.append(note, list);\n panel.append(section);\n}\n\nasync function extractIWorkMetadata(entries: JSZip.JSZipObject[]): Promise<IWorkMetadata> {\n const metadataEntries = entries.filter((entry) => /^metadata\\/.*\\.plist$/i.test(entry.name) || /properties\\.plist$/i.test(entry.name));\n const metadata: IWorkMetadata = {};\n for (const entry of metadataEntries.slice(0, 6)) {\n const text = await entry.async(\"text\").catch(() => \"\");\n if (!text || !/<plist[\\s>]/i.test(text)) {\n continue;\n }\n const plist = parsePlistDict(text);\n mergeIWorkMetadata(metadata, plist);\n }\n return metadata;\n}\n\nfunction createIWorkMetadataSummary(metadata: IWorkMetadata): HTMLElement {\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-iwork-meta\";\n const title = document.createElement(\"strong\");\n title.textContent = \"iWork 元数据\";\n const grid = document.createElement(\"div\");\n grid.className = \"ofv-iwork-meta-grid\";\n appendIWorkMeta(grid, \"标题\", metadata.title);\n appendIWorkMeta(grid, \"作者\", metadata.author);\n appendIWorkMeta(grid, \"公司\", metadata.company);\n appendIWorkMeta(grid, \"主题\", metadata.subject);\n appendIWorkMeta(grid, \"关键词\", metadata.keywords?.join(\", \"));\n appendIWorkMeta(grid, \"创建时间\", metadata.created);\n appendIWorkMeta(grid, \"修改时间\", metadata.modified);\n wrapper.append(title, grid);\n return wrapper;\n}\n\nfunction appendIWorkMeta(parent: HTMLElement, label: string, value?: string): void {\n if (!value) {\n return;\n }\n const row = document.createElement(\"div\");\n row.className = \"ofv-meta-row\";\n const key = document.createElement(\"span\");\n key.textContent = label;\n const content = document.createElement(\"strong\");\n content.textContent = value;\n row.append(key, content);\n parent.append(row);\n}\n\nfunction mergeIWorkMetadata(metadata: IWorkMetadata, plist: Record<string, unknown>): void {\n metadata.title ||= plistText(plist, [\"Title\", \"title\", \"DocumentTitle\", \"SFDocumentTitle\", \"kMDItemTitle\"]);\n metadata.author ||= plistText(plist, [\"Author\", \"author\", \"Authors\", \"kMDItemAuthors\", \"creator\"]);\n metadata.company ||= plistText(plist, [\"Company\", \"company\", \"Organization\"]);\n metadata.subject ||= plistText(plist, [\"Subject\", \"subject\", \"Description\", \"comment\"]);\n metadata.created ||= plistText(plist, [\"CreationDate\", \"created\", \"kMDItemFSCreationDate\"]);\n metadata.modified ||= plistText(plist, [\"ModificationDate\", \"modified\", \"kMDItemFSContentChangeDate\"]);\n metadata.keywords ||= plistArray(plist, [\"Keywords\", \"keywords\", \"kMDItemKeywords\"]);\n}\n\nfunction parsePlistDict(xml: string): Record<string, unknown> {\n if (typeof DOMParser === \"undefined\") {\n return {};\n }\n const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n if (doc.querySelector(\"parsererror\")) {\n return {};\n }\n const dict = Array.from(doc.documentElement.children).find((child) => child.tagName === \"dict\");\n const value = dict ? parsePlistValue(dict) : undefined;\n return value && typeof value === \"object\" && !Array.isArray(value) ? (value as Record<string, unknown>) : {};\n}\n\nfunction parsePlistValue(element: Element): unknown {\n switch (element.tagName) {\n case \"dict\": {\n const result: Record<string, unknown> = {};\n const children = Array.from(element.children);\n for (let index = 0; index < children.length; index++) {\n const key = children[index];\n if (key.tagName !== \"key\") {\n continue;\n }\n const value = children[index + 1];\n if (value) {\n result[key.textContent || \"\"] = parsePlistValue(value);\n index++;\n }\n }\n return result;\n }\n case \"array\":\n return Array.from(element.children).map(parsePlistValue);\n case \"true\":\n return true;\n case \"false\":\n return false;\n case \"integer\":\n case \"real\":\n return Number(element.textContent || 0);\n case \"string\":\n case \"date\":\n default:\n return element.textContent?.trim() || \"\";\n }\n}\n\nfunction plistText(plist: Record<string, unknown>, keys: string[]): string | undefined {\n for (const key of keys) {\n const value = plist[key];\n if (typeof value === \"string\" && value.trim()) {\n return value.trim();\n }\n if (Array.isArray(value)) {\n const text = value.filter((item): item is string => typeof item === \"string\" && Boolean(item.trim())).join(\", \");\n if (text) {\n return text;\n }\n }\n }\n return undefined;\n}\n\nfunction plistArray(plist: Record<string, unknown>, keys: string[]): string[] | undefined {\n for (const key of keys) {\n const value = plist[key];\n if (Array.isArray(value)) {\n const items = value.filter((item): item is string => typeof item === \"string\" && Boolean(item.trim()));\n if (items.length > 0) {\n return items;\n }\n }\n if (typeof value === \"string\" && value.trim()) {\n return value.split(/[,;]/).map((item) => item.trim()).filter(Boolean);\n }\n }\n return undefined;\n}\n\nfunction renderOpenDocumentPresentation(\n panel: HTMLElement,\n title: string,\n xml: string,\n images: Array<{ name: string; src: string }>\n): void {\n const pages = xml.split(/<draw:page\\b/).slice(1);\n const pageSources = pages.length > 0 ? pages : [xml];\n for (const [index, pageXml] of pageSources.entries()) {\n const section = createSection(`${title} ${index + 1}`);\n const body = document.createElement(\"div\");\n body.className = \"ofv-slide\";\n const texts = extractOpenDocumentBlocks(pageXml);\n if (texts.length > 0) {\n for (const text of texts) {\n const paragraph = document.createElement(\"p\");\n paragraph.textContent = text;\n body.append(paragraph);\n }\n } else {\n const empty = document.createElement(\"p\");\n empty.textContent = \"这一页没有可提取文本。\";\n body.append(empty);\n }\n for (const image of images.slice(index === 0 ? 0 : images.length, index === 0 ? images.length : images.length)) {\n const figure = document.createElement(\"figure\");\n figure.className = \"ofv-slide-image\";\n const img = document.createElement(\"img\");\n img.src = image.src;\n img.alt = image.name;\n const caption = document.createElement(\"figcaption\");\n caption.textContent = image.name;\n figure.append(img, caption);\n body.append(figure);\n }\n section.append(body);\n panel.append(section);\n }\n}\n\nasync function inspectPptxPresentation(zip: JSZip): Promise<PresentationInsight> {\n const slideEntries = Object.values(zip.files)\n .filter((entry) => !entry.dir && /^ppt\\/slides\\/slide\\d+\\.xml$/i.test(entry.name))\n .sort((a, b) => slideNumberFromPath(a.name) - slideNumberFromPath(b.name));\n\n const slides: PresentationSlideInsight[] = [];\n let imageCount = 0;\n let notesCount = 0;\n let transitionCount = 0;\n let animationCount = 0;\n const layouts = new Set<string>();\n\n for (const entry of slideEntries) {\n const xml = await entry.async(\"text\");\n const texts = extractOpenXmlText(xml);\n const rels = await readPptxRelationships(zip, entry.name);\n const layout = await resolvePptxSlideLayout(zip, entry.name, rels);\n if (layout) {\n layouts.add(layout);\n }\n\n const slideImageCount = countPptxSlideImages(xml, rels);\n const notesPath = resolvePptxRelationshipTarget(entry.name, rels.find((rel) => /\\/notesSlide$/i.test(rel.type))?.target);\n const notesXml = notesPath ? await zip.file(notesPath)?.async(\"text\") : undefined;\n const slideNotesCount = notesXml ? extractOpenXmlText(notesXml).length : 0;\n const hasTransition = /<p:transition\\b/i.test(xml);\n const slideAnimationCount = countMatches(xml, /<p:(?:anim|animEffect|animMotion|animRot|animScale|cmd|set)\\b/gi);\n\n imageCount += slideImageCount;\n notesCount += slideNotesCount;\n transitionCount += hasTransition ? 1 : 0;\n animationCount += slideAnimationCount;\n slides.push({\n title: texts[0] || `Slide ${slides.length + 1}`,\n layout,\n textCount: texts.length,\n imageCount: slideImageCount,\n notesCount: slideNotesCount,\n hasTransition,\n animationCount: slideAnimationCount,\n sampleTexts: texts.slice(0, 4)\n });\n }\n\n return {\n title: \"PPTX 演示文稿结构\",\n slideCount: slides.length,\n imageCount,\n notesCount,\n transitionCount,\n animationCount,\n layouts: Array.from(layouts),\n slides\n };\n}\n\nfunction inspectOpenDocumentPresentation(title: string, xml: string, totalImages: number): PresentationInsight {\n const pages = xml.split(/<draw:page\\b/).slice(1);\n const pageSources = pages.length > 0 ? pages : [xml];\n const slides = pageSources.map((pageXml, index) => {\n const texts = extractOpenDocumentBlocks(pageXml);\n const layout =\n matchXmlAttribute(pageXml, /presentation:class=\"([^\"]+)\"/i) ||\n matchXmlAttribute(pageXml, /draw:style-name=\"([^\"]+)\"/i) ||\n undefined;\n const imageCount = countMatches(pageXml, /<draw:image\\b/gi);\n const hasTransition = /presentation:transition-type=|presentation:transition-style=|smil:type=/i.test(pageXml);\n const animationCount = countMatches(pageXml, /<anim:|<presentation:animations\\b|<presentation:show-shape\\b/gi);\n return {\n title: texts[0] || `Slide ${index + 1}`,\n layout,\n textCount: texts.length,\n imageCount,\n notesCount: countMatches(pageXml, /<presentation:notes\\b/gi),\n hasTransition,\n animationCount,\n sampleTexts: texts.slice(0, 4)\n };\n });\n\n const layouts = new Set(slides.map((slide) => slide.layout).filter(Boolean) as string[]);\n return {\n title,\n slideCount: slides.length,\n imageCount: Math.max(totalImages, slides.reduce((sum, slide) => sum + slide.imageCount, 0)),\n notesCount: slides.reduce((sum, slide) => sum + slide.notesCount, 0),\n transitionCount: slides.filter((slide) => slide.hasTransition).length,\n animationCount: slides.reduce((sum, slide) => sum + slide.animationCount, 0),\n layouts: Array.from(layouts),\n slides\n };\n}\n\nasync function renderPresentationInsight(panel: HTMLElement, insight: PresentationInsight): Promise<void> {\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-presentation-summary\";\n summary.hidden = true;\n summary.setAttribute(\"aria-hidden\", \"true\");\n summary.dataset.slideCount = String(insight.slideCount);\n summary.dataset.imageCount = String(insight.imageCount);\n summary.dataset.notesCount = String(insight.notesCount);\n summary.dataset.transitionCount = String(insight.transitionCount);\n summary.dataset.animationCount = String(insight.animationCount);\n const stats = [\n `${insight.slideCount} 页`,\n `${insight.layouts.length || 0} 种布局`,\n `${insight.imageCount} 张图片`,\n `${insight.notesCount} 条备注`,\n `${insight.transitionCount} 页切换`,\n `${insight.animationCount} 个动画标记`\n ];\n summary.append(createPresentationMetric(insight.title, stats.join(\" · \")));\n\n if (insight.layouts.length > 0) {\n summary.append(createPresentationMetric(\"布局\", insight.layouts.join(\"、\")));\n }\n panel.append(summary);\n}\n\nfunction createPresentationMetric(label: string, value: string): HTMLElement {\n const metric = document.createElement(\"p\");\n const strong = document.createElement(\"strong\");\n strong.textContent = label;\n const span = document.createElement(\"span\");\n span.textContent = value;\n metric.append(strong, span);\n return metric;\n}\n\ntype PptxRelationship = {\n id: string;\n type: string;\n target: string;\n};\n\nasync function readPptxRelationships(zip: JSZip, partPath: string): Promise<PptxRelationship[]> {\n const relsPath = relationshipPathForPart(partPath);\n const xml = await zip.file(relsPath)?.async(\"text\");\n if (!xml) {\n return [];\n }\n const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n if (doc.querySelector(\"parsererror\")) {\n return [];\n }\n return Array.from(doc.getElementsByTagNameNS(PPTX_REL_NS, \"Relationship\")).map((element) => ({\n id: element.getAttribute(\"Id\") || \"\",\n type: element.getAttribute(\"Type\") || \"\",\n target: element.getAttribute(\"Target\") || \"\"\n }));\n}\n\nasync function resolvePptxSlideLayout(zip: JSZip, slidePath: string, rels: PptxRelationship[]): Promise<string | undefined> {\n const layoutRel = rels.find((rel) => /\\/slideLayout$/i.test(rel.type));\n const layoutPath = resolvePptxRelationshipTarget(slidePath, layoutRel?.target);\n const xml = layoutPath ? await zip.file(layoutPath)?.async(\"text\") : undefined;\n if (!xml) {\n return layoutPath?.split(\"/\").pop()?.replace(/\\.xml$/i, \"\");\n }\n return matchXmlAttribute(xml, /<p:cSld\\b[^>]*name=\"([^\"]+)\"/i) || layoutPath?.split(\"/\").pop()?.replace(/\\.xml$/i, \"\");\n}\n\nfunction countPptxSlideImages(xml: string, rels: PptxRelationship[]): number {\n const relImageIds = new Set(rels.filter((rel) => /\\/image$/i.test(rel.type)).map((rel) => rel.id));\n const embeddedIds = [...xml.matchAll(/<a:blip\\b[^>]*(?:r:embed|r:link)=\"([^\"]+)\"/gi)].map((match) => match[1]);\n if (embeddedIds.length > 0) {\n return embeddedIds.filter((id) => relImageIds.size === 0 || relImageIds.has(id)).length;\n }\n return relImageIds.size;\n}\n\nfunction relationshipPathForPart(partPath: string): string {\n const parts = partPath.split(\"/\");\n const fileName = parts.pop() || partPath;\n return `${parts.join(\"/\")}/_rels/${fileName}.rels`;\n}\n\nfunction resolvePptxRelationshipTarget(sourcePath: string, target?: string): string | undefined {\n if (!target || /^[a-z]+:/i.test(target)) {\n return undefined;\n }\n if (target.startsWith(\"/\")) {\n return target.slice(1);\n }\n const base = sourcePath.split(\"/\").slice(0, -1);\n for (const segment of target.split(\"/\")) {\n if (!segment || segment === \".\") {\n continue;\n }\n if (segment === \"..\") {\n base.pop();\n } else {\n base.push(segment);\n }\n }\n return base.join(\"/\");\n}\n\nfunction slideNumberFromPath(path: string): number {\n return Number(path.match(/slide(\\d+)\\.xml$/i)?.[1] || \"0\");\n}\n\nfunction countMatches(value: string, pattern: RegExp): number {\n return [...value.matchAll(pattern)].length;\n}\n\nfunction matchXmlAttribute(value: string, pattern: RegExp): string | null {\n const match = value.match(pattern);\n return match ? decodeXml(match[1] || \"\") : null;\n}\n\nfunction titleFromOdf(xml: string, fallback: string): string {\n return matchXmlAttribute(xml, /<office:meta[\\s\\S]*?<dc:title[^>]*>([\\s\\S]*?)<\\/dc:title>/i) || fallback;\n}\n\nfunction isLegacyOfficeBinary(extension: string): boolean {\n return [\"doc\", \"dot\", \"xls\", \"xlt\", \"ppt\", \"pps\"].includes(extension);\n}\n\nfunction legacyOfficeFormatLabel(extension: string): string {\n if (extension === \"doc\" || extension === \"dot\") {\n return \"Word Binary File Format\";\n }\n if (extension === \"xls\" || extension === \"xlt\") {\n return \"Excel Binary File Format\";\n }\n return \"PowerPoint Binary File Format\";\n}\n\nfunction renderLegacyOfficeBinary(panel: HTMLElement, extension: string, arrayBuffer: ArrayBuffer, parseError?: string): void {\n const fragments = extractLegacyOfficeText(arrayBuffer);\n panel.replaceChildren();\n const section = createSection(\"Office 转换提示\");\n section.classList.add(\"ofv-office-conversion\");\n const format = document.createElement(\"p\");\n const strong = document.createElement(\"strong\");\n strong.textContent = `.${extension}`;\n format.append(\n strong,\n document.createTextNode(\n \" 属于旧版 Microsoft Office 二进制格式,浏览器内无法高保真解析;当前仅展示可信文本片段和结构指纹,完整排版建议接入 LibreOffice/OnlyOffice 服务端转换为 PDF/HTML。\"\n )\n );\n\n const meta = document.createElement(\"dl\");\n meta.className = \"ofv-office-binary-meta\";\n appendOfficeBinaryMeta(meta, \"格式类型\", legacyOfficeFormatLabel(extension));\n appendOfficeBinaryMeta(meta, \"文件结构\", hasOleSignature(arrayBuffer) ? \"检测到 OLE Compound File 签名\" : \"未检测到标准 OLE 签名,按原始二进制尝试提取\");\n appendOfficeBinaryMeta(meta, \"文本片段\", `${fragments.length} 段`);\n if (parseError) {\n appendOfficeBinaryMeta(meta, \"解析状态\", parseError);\n }\n\n section.append(format, meta);\n\n if (fragments.length > 0) {\n const article = document.createElement(\"article\");\n article.className = \"ofv-document ofv-office-binary-fragments\";\n const heading = document.createElement(\"h4\");\n heading.textContent = \"可读文本片段\";\n article.append(heading);\n for (const fragment of fragments.slice(0, 80)) {\n const paragraph = document.createElement(\"p\");\n paragraph.textContent = fragment;\n article.append(paragraph);\n }\n section.append(article);\n } else {\n const empty = document.createElement(\"p\");\n empty.className = \"ofv-office-binary-empty\";\n empty.textContent = \"未提取到稳定可读文本。该文件可能经过压缩、加密,或文本编码无法在浏览器端可靠识别;请使用服务端 LibreOffice/OnlyOffice 转换后预览。\";\n section.append(empty);\n }\n\n panel.append(section);\n}\n\nfunction appendOfficeBinaryMeta(list: HTMLDListElement, label: string, value: string): void {\n const term = document.createElement(\"dt\");\n term.textContent = label;\n const detail = document.createElement(\"dd\");\n detail.textContent = value;\n list.append(term, detail);\n}\n\nfunction renderUnsupportedOffice(panel: HTMLElement, extension: string): void {\n const legacyBinary = new Set([\"doc\", \"dot\", \"wps\", \"ppt\", \"pps\", \"key\", \"dps\"]);\n const message = legacyBinary.has(extension)\n ? \"该格式属于老二进制或专有格式,浏览器内无法可靠解析;建议接入 LibreOffice/OnlyOffice 服务端转换为 PDF/HTML 后预览。\"\n : \"该格式通常需要服务端转换或专用解析器才能高保真预览。\";\n panel.replaceChildren();\n const section = createSection(\"Office 基础预览\");\n const format = document.createElement(\"p\");\n const strong = document.createElement(\"strong\");\n strong.textContent = `.${extension}`;\n format.append(strong, document.createTextNode(` 已进入 Office 插件。${message}`));\n\n const support = document.createElement(\"p\");\n support.textContent = \"当前版本优先支持 docx、rtf、odt/fodt、xlsx/xls/csv/ods、pptx/ppsx、odp/fodp 的基础内容预览。\";\n\n section.append(format, support);\n panel.append(section);\n}\n\nfunction normalizeOfficeError(error: unknown): string {\n const message = error instanceof Error ? error.message : String(error || \"\");\n return message ? `解析器返回:${message}` : \"解析器未返回具体错误信息。\";\n}\n\nfunction extractLegacyOfficeText(arrayBuffer: ArrayBuffer): string[] {\n const bytes = new Uint8Array(arrayBuffer);\n const fragments = [\n ...extractPrintableRuns(bytes).map((text) => ({ text, source: \"ascii\" as const })),\n ...extractUtf16Runs(bytes).map((text) => ({ text, source: \"utf16\" as const }))\n ]\n .map(({ text, source }) => ({ text: normalizeLegacyText(text), source }))\n .filter(({ text, source }) => isReadableLegacyTextFragment(text, source));\n const unique: string[] = [];\n const seen = new Set<string>();\n for (const { text: fragment } of fragments) {\n const key = fragment.toLowerCase();\n if (!seen.has(key)) {\n seen.add(key);\n unique.push(fragment);\n }\n }\n return unique.slice(0, 160);\n}\n\nfunction isReadableLegacyTextFragment(fragment: string, source: LegacyOfficeTextSource): boolean {\n if (fragment.length > 600) {\n return false;\n }\n if (isLegacyOfficeMetadataNoise(fragment)) {\n return false;\n }\n if (!/[\\p{L}\\p{N}]/u.test(fragment)) {\n return false;\n }\n const chars = Array.from(fragment);\n const letters = chars.filter((char) => /\\p{L}/u.test(char)).length;\n const digits = chars.filter((char) => /\\p{N}/u.test(char)).length;\n const spaces = chars.filter((char) => /\\s/u.test(char)).length;\n const asciiLetters = chars.filter((char) => /[A-Za-z]/.test(char)).length;\n const cjkLetters = chars.filter((char) => /[\\u3400-\\u9fff]/u.test(char)).length;\n const punctuation = chars.filter((char) => /[^\\p{L}\\p{N}\\s]/u.test(char)).length;\n const alphaNumeric = letters + digits;\n const readableRatio = alphaNumeric / chars.length;\n const punctuationRatio = punctuation / chars.length;\n\n if (fragment.length < 4 || readableRatio < 0.55 || punctuationRatio > 0.24) {\n return false;\n }\n if (/([\\p{L}\\p{N}])\\1{4,}/u.test(fragment)) {\n return false;\n }\n if (cjkLetters >= 2) {\n const suspiciousCjk = chars.filter((char) => isAsciiBytePairCjk(char)).length;\n if (suspiciousCjk / cjkLetters > 0.65) {\n return false;\n }\n if (isLikelyCjkHeading(fragment)) {\n return true;\n }\n if (punctuation > 0 && fragment.length < 12) {\n return false;\n }\n return cjkLetters >= 8 || (cjkLetters >= 4 && spaces > 0);\n }\n if (asciiLetters >= 4) {\n if (punctuation > 0 && spaces === 0) {\n return false;\n }\n if (source === \"ascii\" && /^[A-Z]{2,8}$/.test(fragment)) {\n return false;\n }\n if (spaces > 0) {\n return letters >= 3;\n }\n return fragment.length >= 6;\n }\n if (spaces > 0 && letters >= 3) {\n return true;\n }\n return false;\n}\n\nfunction isLegacyOfficeMetadataNoise(fragment: string): boolean {\n if (/[$�\\uFFFD]/u.test(fragment)) {\n return true;\n }\n if (/^(?:Root Entry|WordDocument|Workbook|Book|SummaryInformation|DocumentSummaryInformation|CompObj|ObjectPool|Data|PowerPoint Document|Pictures)$/i.test(fragment)) {\n return true;\n }\n if (/\\.(dotm?|docm?|pptx?|ppsx?|xlsm?|xlsx?)\\b/i.test(fragment)) {\n return true;\n }\n if (/^(?:默认段落字体|普通表格|正文|标题|副标题|目录|页眉|页脚|批注|超链接)(?:\\s*\\d+)?$/.test(fragment)) {\n return true;\n }\n if (/\\b(?:Normal|Default|Calibri|Times New Roman|WPS Office|Microsoft Office|KSOP?ProductBuildVer)\\b/i.test(fragment)) {\n return true;\n }\n if (/^\\d+(?:Table|List|Heading|Title|Style)$/i.test(fragment)) {\n return true;\n }\n if (/[{(]?[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}[})]?/i.test(fragment)) {\n return true;\n }\n if (/^[A-Z_]{3,}$/.test(fragment) || /^[A-Za-z]+(?:Information|Document|Storage|Stream|Table|Data|Pool|Obj|Props)$/i.test(fragment)) {\n return true;\n }\n return false;\n}\n\nfunction isLikelyCjkHeading(fragment: string): boolean {\n return /^(?:标题|第[一二三四五六七八九十\\d]+[章节条]|[一二三四五六七八九十\\d]+[、..])\\s*[\\p{L}\\p{N}\\s-]*$/u.test(fragment);\n}\n\nfunction isAsciiBytePairCjk(char: string): boolean {\n const code = char.codePointAt(0) || 0;\n if (code < 0x3400 || code > 0x9fff) {\n return false;\n }\n const low = code & 0xff;\n const high = code >> 8;\n return isPrintableAsciiByte(low) && isPrintableAsciiByte(high);\n}\n\nfunction isPrintableAsciiByte(value: number): boolean {\n return value >= 0x20 && value <= 0x7e;\n}\n\nfunction extractPrintableRuns(bytes: Uint8Array): string[] {\n const fragments: string[] = [];\n let current = \"\";\n for (const byte of bytes) {\n if ((byte >= 32 && byte <= 126) || byte === 9) {\n current += String.fromCharCode(byte);\n } else {\n if (current.length >= 4) {\n fragments.push(current);\n }\n current = \"\";\n }\n }\n if (current.length >= 4) {\n fragments.push(current);\n }\n return fragments;\n}\n\nfunction extractUtf16Runs(bytes: Uint8Array): string[] {\n const fragments: string[] = [];\n let current = \"\";\n for (let index = 0; index < bytes.length - 1; index += 2) {\n if (looksLikeMisalignedAsciiUtf16(bytes[index], bytes[index + 1])) {\n if (current.length >= 3) {\n fragments.push(current);\n }\n current = \"\";\n continue;\n }\n const code = bytes[index] | (bytes[index + 1] << 8);\n if ((code >= 32 && code <= 0xd7ff) || code === 9) {\n current += String.fromCharCode(code);\n } else {\n if (current.length >= 3) {\n fragments.push(current);\n }\n current = \"\";\n }\n }\n if (current.length >= 3) {\n fragments.push(current);\n }\n return fragments;\n}\n\nfunction looksLikeMisalignedAsciiUtf16(lowByte: number, highByte: number): boolean {\n return lowByte === 0 && ((highByte >= 48 && highByte <= 57) || (highByte >= 65 && highByte <= 90) || (highByte >= 97 && highByte <= 122));\n}\n\nfunction normalizeLegacyText(value: string): string {\n return value.replace(/[\\u0000-\\u001f]+/g, \" \").replace(/\\s+/g, \" \").trim();\n}\n\nfunction hasOleSignature(arrayBuffer: ArrayBuffer): boolean {\n const signature = Array.from(new Uint8Array(arrayBuffer.slice(0, 8)));\n return signature.join(\",\") === \"208,207,17,224,161,177,26,225\";\n}\n\nasync function extractZipImages(\n zip: JSZip,\n pattern: RegExp\n): Promise<Array<{ name: string; src: string }>> {\n const images: Array<{ name: string; src: string }> = [];\n for (const entry of Object.values(zip.files).filter((item) => !item.dir && pattern.test(item.name))) {\n const mimeType = mimeTypeFromPath(entry.name);\n if (!mimeType.startsWith(\"image/\")) {\n continue;\n }\n images.push({\n name: entry.name.split(\"/\").pop() || entry.name,\n src: `data:${mimeType};base64,${await entry.async(\"base64\")}`\n });\n }\n return images;\n}\n\nfunction extractOpenXmlText(xml: string): string[] {\n return [...xml.matchAll(/<a:t>([\\s\\S]*?)<\\/a:t>|<w:t[^>]*>([\\s\\S]*?)<\\/w:t>/g)]\n .map((match) => decodeXml(match[1] || match[2] || \"\").trim())\n .filter(Boolean);\n}\n\nfunction extractWordParagraphs(xml: string): string[] {\n return [...xml.matchAll(/<w:p\\b[\\s\\S]*?<\\/w:p>/g)]\n .map((match) => extractOpenXmlText(match[0]).join(\"\"))\n .map((text) => text.trim())\n .filter(Boolean);\n}\n\nfunction extractOpenDocumentBlocks(xml: string): string[] {\n return [...xml.matchAll(/<(?:text:p|text:h)[^>]*>([\\s\\S]*?)<\\/(?:text:p|text:h)>/g)]\n .map((match) => stripXmlTags(match[1] || \"\"))\n .map((text) => decodeXml(text).trim())\n .filter(Boolean);\n}\n\nfunction stripXmlTags(value: string): string {\n return value\n .replace(/<text:line-break\\s*\\/>/g, \"\\n\")\n .replace(/<text:tab\\s*\\/>/g, \"\\t\")\n .replace(/<[^>]+>/g, \"\");\n}\n\nfunction rtfToText(rtf: string): string {\n return rtf\n .replace(/\\\\'[0-9a-fA-F]{2}/g, \"\")\n .replace(/\\\\par[d]?/g, \"\\n\")\n .replace(/\\\\tab/g, \"\\t\")\n .replace(/\\\\[a-zA-Z]+\\d* ?/g, \"\")\n .replace(/[{}]/g, \"\")\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .trim();\n}\n\nasync function readTextFromBuffer(arrayBuffer: ArrayBuffer): Promise<string> {\n return new TextDecoder(\"utf-8\", { fatal: false }).decode(arrayBuffer);\n}\n\n\nfunction mimeTypeFromPath(path: string): string {\n const extension = path.split(\".\").pop()?.toLowerCase();\n const map: Record<string, string> = {\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n bmp: \"image/bmp\",\n svg: \"image/svg+xml\",\n webp: \"image/webp\"\n };\n return extension ? map[extension] || \"application/octet-stream\" : \"application/octet-stream\";\n}\n\nfunction decodeXml(value: string): string {\n return value\n .replaceAll(\"&lt;\", \"<\")\n .replaceAll(\"&gt;\", \">\")\n .replaceAll(\"&amp;\", \"&\")\n .replaceAll(\"&quot;\", '\"')\n .replaceAll(\"&apos;\", \"'\");\n}\n\nfunction sanitizeHtml(html: string): string {\n return DOMPurify.sanitize(html, {\n USE_PROFILES: { html: true },\n ADD_ATTR: [\"target\"]\n });\n}\n","import JSZip from \"jszip\";\nimport { createObjectUrl, revokeObjectUrl } from \"../dom\";\nimport type { PreviewPlugin } from \"../types\";\nimport { createPanel, createSection, readArrayBuffer } from \"./utils\";\n\nexport function ofdPlugin(): PreviewPlugin {\n return {\n name: \"ofd\",\n match(file) {\n return file.extension === \"ofd\" || file.mimeType === \"application/ofd\";\n },\n async render(ctx) {\n const panel = createPanel(\"ofv-ofd\");\n const url = createObjectUrl(ctx.file);\n const isExternal = Boolean(ctx.file.url);\n ctx.viewport.append(panel);\n let zip: JSZip;\n try {\n zip = await JSZip.loadAsync(await readArrayBuffer(ctx.file));\n } catch (error) {\n panel.append(createOfdFallback(ctx.file.name, url, normalizeOfdError(error)));\n return {\n destroy() {\n panel.remove();\n revokeObjectUrl(url, isExternal);\n }\n };\n }\n\n const entries = Object.values(zip.files).filter((entry) => !entry.dir);\n const textFragments: string[] = [];\n\n try {\n for (const entry of entries.filter((item) => item.name.endsWith(\".xml\")).slice(0, 40)) {\n const xml = await entry.async(\"text\");\n const matches = [...xml.matchAll(/>([^<>]{2,})</g)]\n .map((match) => match[1]?.trim())\n .filter(Boolean) as string[];\n textFragments.push(...matches);\n }\n } catch (error) {\n panel.append(createOfdFallback(ctx.file.name, url, normalizeOfdError(error)));\n return {\n destroy() {\n panel.remove();\n revokeObjectUrl(url, isExternal);\n }\n };\n }\n\n const images = await readOfdImages(entries);\n const pages = await readOfdPages(entries, images);\n const section = createSection(\"OFD 基础预览\");\n const note = document.createElement(\"p\");\n note.textContent = pages.length > 0\n ? \"当前版本提取 OFD 页面文本、路径、直线和图片对象,并按 Boundary 坐标生成轻量 SVG 版式预览。复杂字体、签章和颜色空间可后续接入专用 OFD 渲染器。\"\n : \"当前版本提取 OFD 包内 XML 文本和文件结构。版式级渲染可在后续接入专用 OFD 渲染器。\";\n section.append(note);\n section.append(createOfdSummary(entries, pages, images));\n\n if (pages.length > 0) {\n const pagesWrap = document.createElement(\"div\");\n pagesWrap.className = \"ofv-ofd-pages\";\n for (const page of pages) {\n pagesWrap.append(renderOfdPage(page));\n }\n section.append(pagesWrap);\n }\n\n const content = document.createElement(\"pre\");\n content.className = \"ofv-text-block\";\n content.textContent = textFragments.slice(0, 300).join(\"\\n\") || \"未提取到可读文本。\";\n section.append(content);\n\n const list = createSection(`文件结构 ${entries.length}`);\n const ul = document.createElement(\"ul\");\n for (const entry of entries.slice(0, 200)) {\n const li = document.createElement(\"li\");\n li.textContent = entry.name;\n ul.append(li);\n }\n list.append(ul);\n panel.append(section, list);\n\n return {\n destroy() {\n panel.remove();\n revokeObjectUrl(url, isExternal);\n }\n };\n }\n };\n}\n\ntype OfdTextObject = {\n text: string;\n x: number;\n y: number;\n width: number;\n height: number;\n size: number;\n color: string;\n weight: string;\n letterSpacing?: number;\n};\n\ntype OfdPathObject = {\n d: string;\n x: number;\n y: number;\n width: number;\n height: number;\n stroke: string;\n fill: string;\n strokeWidth: number;\n};\n\ntype OfdLineObject = {\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n stroke: string;\n strokeWidth: number;\n};\n\ntype OfdImageObject = {\n x: number;\n y: number;\n width: number;\n height: number;\n resourceId: string;\n href?: string;\n};\n\ntype OfdPagePreview = {\n name: string;\n width: number;\n height: number;\n texts: OfdTextObject[];\n paths: OfdPathObject[];\n lines: OfdLineObject[];\n images: OfdImageObject[];\n};\n\nfunction createOfdSummary(entries: JSZip.JSZipObject[], pages: OfdPagePreview[], images: Map<string, string>): HTMLElement {\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-ofd-summary\";\n const xmlEntries = entries.filter((entry) => entry.name.endsWith(\".xml\")).length;\n const textCount = pages.reduce((count, page) => count + page.texts.length, 0);\n const pathCount = pages.reduce((count, page) => count + page.paths.length, 0);\n const lineCount = pages.reduce((count, page) => count + page.lines.length, 0);\n const imageCount = pages.reduce((count, page) => count + page.images.length, 0);\n const textLength = pages.reduce((count, page) => count + page.texts.reduce((inner, item) => inner + item.text.length, 0), 0);\n appendOfdSummary(summary, \"文件\", String(entries.length));\n appendOfdSummary(summary, \"XML\", String(xmlEntries));\n appendOfdSummary(summary, \"页面\", String(pages.length));\n appendOfdSummary(summary, \"文本\", String(textCount));\n appendOfdSummary(summary, \"路径\", String(pathCount));\n appendOfdSummary(summary, \"线条\", String(lineCount));\n appendOfdSummary(summary, \"图片对象\", String(imageCount));\n appendOfdSummary(summary, \"图片资源\", String(uniqueOfdImageResources(images)));\n if (textLength > 0) {\n appendOfdSummary(summary, \"文字长度\", String(textLength));\n }\n const sizes = formatOfdPageSizes(pages);\n if (sizes) {\n appendOfdSummary(summary, \"页面尺寸\", sizes);\n }\n return summary;\n}\n\nfunction appendOfdSummary(parent: HTMLElement, label: string, value: string): void {\n const item = document.createElement(\"span\");\n const key = document.createElement(\"span\");\n key.textContent = label;\n const content = document.createElement(\"strong\");\n content.textContent = value;\n item.append(key, content);\n parent.append(item);\n}\n\nfunction uniqueOfdImageResources(images: Map<string, string>): number {\n return new Set(images.values()).size;\n}\n\nfunction formatOfdPageSizes(pages: OfdPagePreview[]): string {\n const counts = new Map<string, number>();\n for (const page of pages) {\n const key = `${Math.round(page.width)} x ${Math.round(page.height)}`;\n counts.set(key, (counts.get(key) || 0) + 1);\n }\n return [...counts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 4)\n .map(([size, count]) => (count > 1 ? `${size} (${count})` : size))\n .join(\", \");\n}\n\nasync function readOfdPages(\n entries: JSZip.JSZipObject[],\n images: Map<string, string>\n): Promise<OfdPagePreview[]> {\n const pages: OfdPagePreview[] = [];\n const pageEntries = entries\n .filter((entry) => /(^|\\/)Pages\\/Page_[^/]+\\/Content\\.xml$/i.test(entry.name) || /(^|\\/)Page_[^/]+\\/Content\\.xml$/i.test(entry.name))\n .slice(0, 80);\n for (const entry of pageEntries) {\n const xml = await entry.async(\"text\");\n const page = parseOfdPage(entry.name, xml, images);\n if (page.texts.length > 0 || page.paths.length > 0 || page.lines.length > 0 || page.images.length > 0) {\n pages.push(page);\n }\n }\n return pages;\n}\n\nfunction parseOfdPage(name: string, xml: string, images: Map<string, string>): OfdPagePreview {\n const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n if (doc.querySelector(\"parsererror\")) {\n return { name, width: 210, height: 297, texts: [], paths: [], lines: [], images: [] };\n }\n const pageSize = parseOfdPageSize(doc);\n const textObjects = Array.from(doc.getElementsByTagName(\"*\")).filter((element) => element.localName === \"TextObject\");\n const texts = textObjects.flatMap((element) => parseOfdTextObject(element));\n const paths = Array.from(doc.getElementsByTagName(\"*\"))\n .filter((element) => element.localName === \"PathObject\")\n .flatMap((element) => parseOfdPathObject(element));\n const lines = Array.from(doc.getElementsByTagName(\"*\"))\n .filter((element) => element.localName === \"LineObject\")\n .flatMap((element) => parseOfdLineObject(element));\n const imageObjects = Array.from(doc.getElementsByTagName(\"*\"))\n .filter((element) => element.localName === \"ImageObject\")\n .flatMap((element) => parseOfdImageObject(element, images));\n const bounds = [\n ...texts.map((item) => ({ x: item.x, y: item.y, width: item.width, height: item.height })),\n ...paths.map((item) => ({ x: item.x, y: item.y, width: item.width, height: item.height })),\n ...lines.map((item) => ({\n x: Math.min(item.x1, item.x2),\n y: Math.min(item.y1, item.y2),\n width: Math.abs(item.x2 - item.x1),\n height: Math.abs(item.y2 - item.y1)\n })),\n ...imageObjects.map((item) => ({ x: item.x, y: item.y, width: item.width, height: item.height }))\n ];\n const width = Math.max(pageSize.width, ...bounds.map((item) => item.x + item.width + 12));\n const height = Math.max(pageSize.height, ...bounds.map((item) => item.y + item.height + 12));\n return { name, width, height, texts, paths, lines, images: imageObjects };\n}\n\nfunction parseOfdTextObject(element: Element): OfdTextObject[] {\n const boundary = parseBoundary(getOfdAttribute(element, \"Boundary\"));\n const size = finiteNumber(getOfdAttribute(element, \"Size\"), Math.max(4, boundary.height || 5));\n const color = parseOfdColor(element, \"#111827\");\n const weight = finiteNumber(getOfdAttribute(element, \"Weight\"), 400) >= 600 ? \"700\" : \"400\";\n const letterSpacing = getOfdAttribute(element, \"DeltaX\") ? 0.5 : undefined;\n const textCodes = Array.from(element.getElementsByTagName(\"*\")).filter((child) => child.localName === \"TextCode\");\n if (textCodes.length === 0) {\n return [];\n }\n return textCodes.map((code) => {\n const x = boundary.x + finiteNumber(getOfdAttribute(code, \"X\"), 0);\n const y = boundary.y + finiteNumber(getOfdAttribute(code, \"Y\"), 0);\n return {\n text: code.textContent?.trim() || \"\",\n x,\n y,\n width: boundary.width,\n height: boundary.height,\n size,\n color,\n weight,\n letterSpacing\n };\n }).filter((item) => item.text);\n}\n\nfunction parseOfdPathObject(element: Element): OfdPathObject[] {\n const boundary = parseBoundary(getOfdAttribute(element, \"Boundary\"));\n const commands = Array.from(element.getElementsByTagName(\"*\")).filter(\n (child) => child.localName === \"AbbreviatedData\" || child.localName === \"PathData\"\n );\n const raw = commands.map((child) => child.textContent || \"\").join(\" \").trim();\n if (!raw) {\n return [];\n }\n return [\n {\n d: normalizeOfdPathData(raw),\n x: boundary.x,\n y: boundary.y,\n width: boundary.width,\n height: boundary.height,\n stroke: parseOfdColor(element, \"#334155\", \"StrokeColor\"),\n fill: parseOfdFill(element),\n strokeWidth: finiteNumber(getOfdAttribute(element, \"LineWidth\"), 1)\n }\n ];\n}\n\nfunction parseOfdLineObject(element: Element): OfdLineObject[] {\n const boundary = parseBoundary(getOfdAttribute(element, \"Boundary\"));\n const start = parsePoint(getOfdAttribute(element, \"StartPoint\"), { x: 0, y: 0 });\n const end = parsePoint(getOfdAttribute(element, \"EndPoint\"), {\n x: boundary.width,\n y: boundary.height\n });\n return [\n {\n x1: boundary.x + start.x,\n y1: boundary.y + start.y,\n x2: boundary.x + end.x,\n y2: boundary.y + end.y,\n stroke: parseOfdColor(element, \"#334155\"),\n strokeWidth: finiteNumber(getOfdAttribute(element, \"LineWidth\"), 1)\n }\n ];\n}\n\nfunction parseOfdImageObject(element: Element, images: Map<string, string>): OfdImageObject[] {\n const boundary = parseBoundary(getOfdAttribute(element, \"Boundary\"));\n const resourceId = getOfdAttribute(element, \"ResourceID\") || getOfdAttribute(element, \"ResourceId\") || \"\";\n return [\n {\n x: boundary.x,\n y: boundary.y,\n width: boundary.width || 32,\n height: boundary.height || 32,\n resourceId,\n href: images.get(resourceId)\n }\n ];\n}\n\nfunction renderOfdPage(page: OfdPagePreview): HTMLElement {\n const figure = document.createElement(\"figure\");\n figure.className = \"ofv-ofd-page\";\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svg.setAttribute(\"viewBox\", `0 0 ${page.width} ${page.height}`);\n svg.setAttribute(\"role\", \"img\");\n svg.setAttribute(\"aria-label\", page.name);\n\n const paper = document.createElementNS(svg.namespaceURI, \"rect\");\n paper.setAttribute(\"x\", \"0\");\n paper.setAttribute(\"y\", \"0\");\n paper.setAttribute(\"width\", String(page.width));\n paper.setAttribute(\"height\", String(page.height));\n paper.setAttribute(\"fill\", \"white\");\n svg.append(paper);\n\n for (const item of page.images) {\n if (item.href) {\n const image = document.createElementNS(svg.namespaceURI, \"image\");\n image.setAttribute(\"x\", String(item.x));\n image.setAttribute(\"y\", String(item.y));\n image.setAttribute(\"width\", String(item.width));\n image.setAttribute(\"height\", String(item.height));\n image.setAttribute(\"href\", item.href);\n image.setAttribute(\"preserveAspectRatio\", \"xMidYMid meet\");\n svg.append(image);\n } else {\n const placeholder = document.createElementNS(svg.namespaceURI, \"rect\");\n placeholder.setAttribute(\"x\", String(item.x));\n placeholder.setAttribute(\"y\", String(item.y));\n placeholder.setAttribute(\"width\", String(item.width));\n placeholder.setAttribute(\"height\", String(item.height));\n placeholder.setAttribute(\"fill\", \"#f8fafc\");\n placeholder.setAttribute(\"stroke\", \"#94a3b8\");\n placeholder.setAttribute(\"stroke-dasharray\", \"4 3\");\n svg.append(placeholder);\n }\n }\n\n for (const item of page.paths) {\n const path = document.createElementNS(svg.namespaceURI, \"path\");\n path.setAttribute(\"d\", item.d);\n path.setAttribute(\"transform\", `translate(${item.x} ${item.y})`);\n path.setAttribute(\"fill\", item.fill);\n path.setAttribute(\"stroke\", item.stroke);\n path.setAttribute(\"stroke-width\", String(item.strokeWidth));\n svg.append(path);\n }\n\n for (const item of page.lines) {\n const line = document.createElementNS(svg.namespaceURI, \"line\");\n line.setAttribute(\"x1\", String(item.x1));\n line.setAttribute(\"y1\", String(item.y1));\n line.setAttribute(\"x2\", String(item.x2));\n line.setAttribute(\"y2\", String(item.y2));\n line.setAttribute(\"stroke\", item.stroke);\n line.setAttribute(\"stroke-width\", String(item.strokeWidth));\n line.setAttribute(\"stroke-linecap\", \"round\");\n svg.append(line);\n }\n\n for (const item of page.texts) {\n const text = document.createElementNS(svg.namespaceURI, \"text\");\n text.setAttribute(\"x\", String(item.x));\n text.setAttribute(\"y\", String(item.y + item.size));\n text.setAttribute(\"font-size\", String(item.size));\n text.setAttribute(\"fill\", item.color);\n text.setAttribute(\"font-weight\", item.weight);\n if (item.letterSpacing !== undefined) {\n text.setAttribute(\"letter-spacing\", String(item.letterSpacing));\n }\n text.textContent = item.text;\n svg.append(text);\n }\n\n const caption = document.createElement(\"figcaption\");\n caption.textContent = `${page.name} · ${page.texts.length} text · ${page.paths.length} path · ${page.lines.length} line · ${page.images.length} image`;\n figure.append(svg, caption);\n return figure;\n}\n\nasync function readOfdImages(entries: JSZip.JSZipObject[]): Promise<Map<string, string>> {\n const images = new Map<string, string>();\n for (const entry of entries.filter((item) => /\\.(?:png|jpe?g|gif|bmp|webp)$/i.test(item.name)).slice(0, 80)) {\n const id = entry.name.split(\"/\").pop()?.replace(/\\.[^.]+$/, \"\") || entry.name;\n const mimeType = mimeTypeFromPath(entry.name);\n if (!mimeType.startsWith(\"image/\")) {\n continue;\n }\n const base64 = await entry.async(\"base64\");\n const href = `data:${mimeType};base64,${base64}`;\n images.set(id, href);\n images.set(entry.name, href);\n images.set(entry.name.split(\"/\").pop() || entry.name, href);\n }\n return images;\n}\n\nfunction parseOfdPageSize(doc: Document): { width: number; height: number } {\n const physicalBox = Array.from(doc.getElementsByTagName(\"*\")).find((element) => element.localName === \"PhysicalBox\");\n if (physicalBox?.textContent) {\n const box = parseBoundary(physicalBox.textContent);\n if (box.width > 0 && box.height > 0) {\n return { width: box.width, height: box.height };\n }\n }\n return { width: 210, height: 297 };\n}\n\nfunction parseOfdColor(element: Element, fallback: string, preferredLocalName = \"FillColor\"): string {\n const colorElement = findOfdChild(element, preferredLocalName) || findOfdChild(element, \"StrokeColor\") || findOfdChild(element, \"FillColor\");\n const value = colorElement ? getOfdAttribute(colorElement, \"Value\") : null;\n if (!value) {\n return fallback;\n }\n const parts = value.trim().split(/\\s+/).map((part) => Number(part));\n if (parts.length >= 3 && parts.every((part) => Number.isFinite(part))) {\n return `rgb(${parts.slice(0, 3).map((part) => Math.max(0, Math.min(255, part))).join(\" \")})`;\n }\n return fallback;\n}\n\nfunction parseOfdFill(element: Element): string {\n const fillElement = findOfdChild(element, \"FillColor\");\n return fillElement ? parseOfdColor(element, \"transparent\", \"FillColor\") : \"transparent\";\n}\n\nfunction findOfdChild(element: Element, localName: string): Element | undefined {\n return Array.from(element.children).find((child) => child.localName === localName);\n}\n\nfunction parsePoint(value: string | null, fallback: { x: number; y: number }): { x: number; y: number } {\n const parts = (value || \"\").trim().split(/\\s+/).map((part) => Number(part));\n return {\n x: Number.isFinite(parts[0]) ? parts[0] : fallback.x,\n y: Number.isFinite(parts[1]) ? parts[1] : fallback.y\n };\n}\n\nfunction normalizeOfdPathData(value: string): string {\n return value\n .replace(/\\bM\\s+/gi, \"M \")\n .replace(/\\bL\\s+/gi, \"L \")\n .replace(/\\bC\\s+/gi, \"C \")\n .replace(/\\bQ\\s+/gi, \"Q \")\n .replace(/\\bA\\s+/gi, \"A \")\n .replace(/\\bB\\s+/gi, \"C \")\n .replace(/\\bZ\\b/gi, \"Z\")\n .replace(/\\s+/g, \" \")\n .trim();\n}\n\nfunction mimeTypeFromPath(path: string): string {\n const extension = path.split(\".\").pop()?.toLowerCase();\n const map: Record<string, string> = {\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n bmp: \"image/bmp\",\n webp: \"image/webp\"\n };\n return extension ? map[extension] || \"application/octet-stream\" : \"application/octet-stream\";\n}\n\nfunction parseBoundary(value: string | null): { x: number; y: number; width: number; height: number } {\n const parts = (value || \"\").trim().split(/\\s+/).map((part) => Number(part));\n return {\n x: Number.isFinite(parts[0]) ? parts[0] : 0,\n y: Number.isFinite(parts[1]) ? parts[1] : 0,\n width: Number.isFinite(parts[2]) ? parts[2] : 0,\n height: Number.isFinite(parts[3]) ? parts[3] : 0\n };\n}\n\nfunction getOfdAttribute(element: Element, localName: string): string | null {\n const direct = element.getAttribute(localName);\n if (direct !== null) {\n return direct;\n }\n for (const attribute of Array.from(element.attributes)) {\n if (attribute.localName === localName) {\n return attribute.value;\n }\n }\n return null;\n}\n\nfunction finiteNumber(value: string | null, fallback: number): number {\n const parsed = value === null ? Number.NaN : Number(value);\n return Number.isFinite(parsed) ? parsed : fallback;\n}\n\nfunction createOfdFallback(fileName: string, url: string, detail: string): HTMLElement {\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n\n const title = document.createElement(\"strong\");\n title.textContent = \"OFD 解析失败\";\n\n const meta = document.createElement(\"span\");\n meta.textContent = `${detail}。可下载 ${fileName} 后使用本地 OFD 阅读器查看。`;\n\n const download = document.createElement(\"a\");\n download.href = url;\n download.download = fileName;\n download.textContent = \"下载 OFD\";\n\n fallback.append(title, meta, download);\n return fallback;\n}\n\nfunction normalizeOfdError(error: unknown): string {\n if (error instanceof Error && error.message) {\n return error.message;\n }\n return \"文件可能已损坏,或不是有效的 OFD 包\";\n}\n","import JSZip from \"jszip\";\nimport pako from \"pako\";\nimport type { PreviewPlugin, PreviewFile } from \"../types\";\nimport { normalizeFile } from \"../detect\";\nimport { fallbackPlugin } from \"./fallback\";\nimport { createObjectUrl, revokeObjectUrl } from \"../dom\";\nimport { appendMeta, createPanel, createSection, readArrayBuffer, resolveFormat } from \"./utils\";\n\nconst archiveExtensions = new Set([\"zip\", \"rar\", \"7z\", \"tar\", \"gz\", \"tgz\", \"bz2\", \"xz\"]);\nconst archiveMimeTypes = new Set([\n \"application/zip\",\n \"application/x-zip-compressed\",\n \"application/vnd.rar\",\n \"application/x-rar-compressed\",\n \"application/x-7z-compressed\",\n \"application/x-tar\",\n \"application/gzip\",\n \"application/x-gzip\",\n \"application/x-bzip2\",\n \"application/x-xz\"\n]);\nconst archiveMimeFormatMap: Record<string, string> = {\n \"application/zip\": \"zip\",\n \"application/x-zip-compressed\": \"zip\",\n \"application/vnd.rar\": \"rar\",\n \"application/x-rar-compressed\": \"rar\",\n \"application/x-7z-compressed\": \"7z\",\n \"application/x-tar\": \"tar\",\n \"application/gzip\": \"gz\",\n \"application/x-gzip\": \"gz\",\n \"application/x-bzip2\": \"bz2\",\n \"application/x-xz\": \"xz\"\n};\n\ninterface ArchiveEntry {\n name: string;\n unsafeName?: string;\n size: number;\n dir: boolean;\n read: () => Promise<ArrayBuffer>;\n}\n\ninterface ArchiveProbe {\n format: string;\n valid: boolean;\n error?: string;\n meta: Array<{ label: string; value: string }>;\n entries: Array<{ name: string; size?: number; packedSize?: number }>;\n note: string;\n}\n\nexport function archivePlugin(): PreviewPlugin {\n return {\n name: \"archive\",\n match(file) {\n return archiveExtensions.has(file.extension) || archiveMimeTypes.has(file.mimeType);\n },\n async render(ctx) {\n const url = createObjectUrl(ctx.file);\n const isExternal = Boolean(ctx.file.url);\n const panel = createPanel(\"ofv-archive\");\n ctx.viewport.append(panel);\n\n const ext = resolveFormat(ctx.file, archiveMimeFormatMap).toLowerCase();\n let archiveEntries: ArchiveEntry[] = [];\n let isEncrypted = false;\n let parseError: string | null = null;\n let archiveProbe: ArchiveProbe | null = null;\n\n // 1. Parse different archive formats\n try {\n if (ext === \"zip\") {\n try {\n const zip = await JSZip.loadAsync(await readArrayBuffer(ctx.file));\n archiveEntries = Object.values(zip.files).map((entry) => ({\n name: entry.name,\n unsafeName: (entry as any).unsafeOriginalName,\n size: (entry as any)._data?.uncompressedSize || 0,\n dir: entry.dir,\n read: () => entry.async(\"arraybuffer\")\n }));\n } catch (zipErr: any) {\n // Check for encryption errors\n if (\n zipErr.message &&\n (zipErr.message.includes(\"encrypted\") ||\n zipErr.message.includes(\"password\") ||\n zipErr.message.includes(\"protected\"))\n ) {\n isEncrypted = true;\n } else {\n throw zipErr;\n }\n }\n } else if (ext === \"tar\") {\n archiveEntries = untar(await readArrayBuffer(ctx.file));\n } else if (ext === \"gz\" || ext === \"tgz\" || ext === \"tar.gz\") {\n const u8 = new Uint8Array(await readArrayBuffer(ctx.file));\n const decompressed = pako.ungzip(u8);\n const originalName = ctx.file.name.endsWith(\".gz\")\n ? ctx.file.name.slice(0, -3)\n : ctx.file.name.endsWith(\".tgz\")\n ? ctx.file.name.slice(0, -4) + \".tar\"\n : ctx.file.name;\n\n if (ext === \"tgz\" || ext === \"tar.gz\" || originalName.endsWith(\".tar\")) {\n archiveEntries = untar(decompressed.buffer);\n } else {\n // Single decompressed file\n archiveEntries = [\n {\n name: originalName,\n size: decompressed.byteLength,\n dir: false,\n read: async () => decompressed.buffer\n }\n ];\n }\n } else if ([\"rar\", \"7z\", \"bz2\", \"xz\"].includes(ext)) {\n archiveProbe = probeArchiveHeader(await readArrayBuffer(ctx.file), ext);\n } else {\n parseError = `该格式 (.${ext.toUpperCase()}) 目前暂不支持直接在浏览器端在线解压和目录预览。`;\n }\n } catch (err: any) {\n parseError = `压缩包解析失败:${err.message || err}`;\n }\n\n // 2. Encrypted Archive Prompt UI\n if (isEncrypted) {\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n \n const title = document.createElement(\"strong\");\n title.textContent = \"该压缩包已被加密保护\";\n \n const meta = document.createElement(\"span\");\n meta.textContent = \"为了您的数据安全,本预览器不支持直接在线解密。请下载文件后在本地输入密码解压。\";\n \n const download = document.createElement(\"a\");\n download.href = url;\n download.download = ctx.file.name;\n download.textContent = \"下载文件\";\n \n fallback.append(title, meta, download);\n panel.append(fallback);\n ctx.viewport.classList.add(\"ofv-center\");\n \n return {\n destroy() {\n ctx.viewport.classList.remove(\"ofv-center\");\n revokeObjectUrl(url, isExternal);\n panel.remove();\n }\n };\n }\n\n if (archiveProbe) {\n renderArchiveProbe(panel, archiveProbe, ctx.file.name, url);\n return {\n destroy() {\n revokeObjectUrl(url, isExternal);\n panel.remove();\n }\n };\n }\n\n // 3. Fallback Unsupported message (RAR, 7z, etc.)\n if (parseError) {\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n \n const title = document.createElement(\"strong\");\n title.textContent = parseError;\n \n const meta = document.createElement(\"span\");\n meta.textContent = \"建议下载视频/文档等文件至本地查看,或使用原生解压工具提取内容。\";\n \n const download = document.createElement(\"a\");\n download.href = url;\n download.download = ctx.file.name;\n download.textContent = \"下载压缩包\";\n \n fallback.append(title, meta, download);\n panel.append(fallback);\n ctx.viewport.classList.add(\"ofv-center\");\n\n return {\n destroy() {\n ctx.viewport.classList.remove(\"ofv-center\");\n revokeObjectUrl(url, isExternal);\n panel.remove();\n }\n };\n }\n\n // 4. Split Layout UI for interactive preview\n const layout = document.createElement(\"div\");\n layout.className = \"ofv-archive-layout\";\n\n const sidebar = document.createElement(\"div\");\n sidebar.className = \"ofv-archive-sidebar\";\n const sidebarPanel = document.createElement(\"div\");\n sidebarPanel.className = \"ofv-archive-sidebar-panel\";\n\n const header = document.createElement(\"div\");\n header.className = \"ofv-archive-header\";\n const sidebarTitle = document.createElement(\"span\");\n sidebarTitle.className = \"ofv-archive-header-title\";\n sidebarTitle.textContent = `文件列表 (${archiveEntries.filter(e => !e.dir).length})`;\n const sidebarToggle = document.createElement(\"button\");\n sidebarToggle.className = \"ofv-archive-sidebar-toggle\";\n sidebarToggle.type = \"button\";\n sidebarToggle.setAttribute(\"aria-label\", \"展开文件列表\");\n sidebarToggle.setAttribute(\"aria-expanded\", \"false\");\n sidebarToggle.title = \"展开文件列表\";\n sidebarToggle.textContent = \"‹\";\n header.append(sidebarToggle, sidebarTitle);\n sidebarPanel.append(header);\n\n const tree = document.createElement(\"div\");\n tree.className = \"ofv-archive-tree\";\n sidebarPanel.append(tree);\n sidebar.append(sidebarPanel);\n\n const mainPanel = document.createElement(\"div\");\n mainPanel.className = \"ofv-archive-main\";\n\n layout.append(sidebar, mainPanel);\n panel.append(layout);\n\n let currentSubInstance: any = null;\n const getSidebarViewportWidth = () => ctx.viewport.clientWidth || ctx.size.width;\n const shouldAutoCollapseSidebar = () => getSidebarViewportWidth() <= 520;\n const setSidebarCollapsed = (collapsed: boolean) => {\n layout.classList.toggle(\"is-sidebar-collapsed\", collapsed);\n sidebarToggle.setAttribute(\"aria-expanded\", String(!collapsed));\n const label = collapsed ? \"展开文件列表\" : \"收起文件列表\";\n sidebarToggle.setAttribute(\"aria-label\", label);\n sidebarToggle.title = label;\n sidebarToggle.textContent = collapsed ? \"›\" : \"‹\";\n };\n setSidebarCollapsed(false);\n sidebarToggle.addEventListener(\"click\", () => {\n setSidebarCollapsed(!layout.classList.contains(\"is-sidebar-collapsed\"));\n });\n\n // Render default metadata summary\n const showDefaultSummary = () => {\n mainPanel.replaceChildren();\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-archive-info\";\n \n const heading = document.createElement(\"h3\");\n heading.textContent = ctx.file.name;\n\n const info = document.createElement(\"div\");\n info.className = \"ofv-archive-info-meta\";\n \n const fileCount = archiveEntries.filter(e => !e.dir).length;\n const dirCount = archiveEntries.filter(e => e.dir).length;\n \n appendArchiveInfo(info, \"格式类型\", `.${ext.toUpperCase()} 压缩文件`);\n appendArchiveInfo(info, \"包含文件数\", `${fileCount} 个`);\n appendArchiveInfo(info, \"包含目录数\", `${dirCount} 个`);\n appendArchiveInfo(info, \"操作提示\", \"请点击左侧栏中的文件进行联动预览。\");\n \n summary.append(heading, info, createArchiveSummary(archiveEntries));\n mainPanel.append(summary);\n };\n\n showDefaultSummary();\n\n // Filter and render items (max 500 to keep DOM lightweight)\n const visibleEntries = archiveEntries.filter(e => !e.dir).slice(0, 500);\n let destroyed = false;\n let renderToken = 0;\n\n visibleEntries.forEach((entry) => {\n const item = document.createElement(\"button\");\n item.className = \"ofv-archive-item\";\n item.type = \"button\";\n item.title = entry.name;\n\n const icon = document.createElement(\"span\");\n icon.className = \"ofv-archive-item-icon\";\n icon.textContent = getIcon(entry.name, entry.dir);\n\n const name = document.createElement(\"span\");\n name.className = \"ofv-archive-item-name\";\n name.textContent = entry.name;\n name.title = entry.name;\n\n item.append(icon, name);\n tree.append(item);\n\n item.addEventListener(\"click\", async () => {\n if (destroyed) {\n return;\n }\n if (shouldAutoCollapseSidebar()) {\n setSidebarCollapsed(true);\n }\n const token = ++renderToken;\n // Highlight active item\n sidebar.querySelectorAll(\".ofv-archive-item\").forEach((el) => {\n el.classList.remove(\"is-active\");\n el.removeAttribute(\"aria-current\");\n });\n item.classList.add(\"is-active\");\n item.setAttribute(\"aria-current\", \"true\");\n\n // Cleanup previous sub-preview\n if (currentSubInstance) {\n currentSubInstance.destroy();\n currentSubInstance = null;\n }\n\n // Show loading state\n mainPanel.replaceChildren(createArchiveLoading(entry.name.split(\"/\").pop() || entry.name));\n\n try {\n let buffer = await entry.read();\n if (destroyed || token !== renderToken) {\n return;\n }\n const subName = entry.name.split(\"/\").pop() || entry.name;\n const subExt = subName.split(\".\").pop()?.toLowerCase() || \"\";\n\n // Shapefile components linkage mechanism:\n // Combine adjacent .dbf, .shx, and .prj files into a single ZIP buffer in memory\n if (subExt === \"shp\") {\n const basePath = entry.name.slice(0, -4);\n const dbfEntry = archiveEntries.find(\n (e) => e.name.toLowerCase() === basePath.toLowerCase() + \".dbf\"\n );\n const shxEntry = archiveEntries.find(\n (e) => e.name.toLowerCase() === basePath.toLowerCase() + \".shx\"\n );\n if (dbfEntry && shxEntry) {\n const prjEntry = archiveEntries.find(\n (e) => e.name.toLowerCase() === basePath.toLowerCase() + \".prj\"\n );\n const newZip = new JSZip();\n newZip.file(subName, buffer);\n newZip.file(dbfEntry.name.split(\"/\").pop()!, await dbfEntry.read());\n newZip.file(shxEntry.name.split(\"/\").pop()!, await shxEntry.read());\n if (prjEntry) {\n newZip.file(prjEntry.name.split(\"/\").pop()!, await prjEntry.read());\n }\n buffer = await newZip.generateAsync({ type: \"arraybuffer\" });\n if (destroyed || token !== renderToken) {\n return;\n }\n }\n }\n\n const subContainer = document.createElement(\"div\");\n subContainer.style.cssText = \"width: 100%; height: 100%; position: relative; display: flex; flex-direction: column;\";\n mainPanel.replaceChildren(subContainer);\n\n const subViewport = document.createElement(\"div\");\n subViewport.className = \"ofv-viewport\";\n subViewport.style.cssText = \"flex: 1; width: 100%; height: 100%; position: relative; overflow: auto;\";\n subContainer.append(subViewport);\n\n const subFile: PreviewFile = await normalizeFile(buffer, subName);\n\n const plugins = [...(ctx.options.plugins || []), fallbackPlugin()];\n let matchedPlugin = await findSubPreviewPlugin(plugins, subFile);\n if (destroyed || token !== renderToken) {\n return;\n }\n if (matchedPlugin.name === \"archive\") {\n matchedPlugin = fallbackPlugin();\n }\n\n let previewError: Error | undefined;\n const nextSubInstance = await Promise.resolve()\n .then(() =>\n matchedPlugin.render({\n host: ctx.host,\n viewport: subViewport,\n file: subFile,\n size: { width: subViewport.clientWidth || 600, height: subViewport.clientHeight || 400 },\n options: ctx.options,\n setLoading: () => {},\n setError: (err) => {\n previewError = err instanceof Error ? err : new Error(String(err));\n subViewport.replaceChildren(createInlineError(\"文件预览失败\", previewError.message));\n }\n })\n )\n .catch((error: unknown) => {\n previewError = error instanceof Error ? error : new Error(String(error));\n subViewport.replaceChildren(createInlineError(\"文件预览失败\", previewError.message));\n return undefined;\n });\n if (destroyed || token !== renderToken) {\n nextSubInstance?.destroy();\n return;\n }\n if (nextSubInstance && !previewError) {\n currentSubInstance = nextSubInstance;\n } else if (nextSubInstance) {\n nextSubInstance.destroy();\n }\n } catch (err: any) {\n if (destroyed || token !== renderToken) {\n return;\n }\n mainPanel.replaceChildren(createInlineError(\"解压加载失败\", String(err.message || err)));\n }\n });\n });\n\n return {\n resize(size) {\n currentSubInstance?.resize?.(size);\n },\n destroy() {\n destroyed = true;\n renderToken += 1;\n if (currentSubInstance) {\n currentSubInstance.destroy();\n }\n revokeObjectUrl(url, isExternal);\n panel.remove();\n }\n };\n }\n };\n}\n\nasync function findSubPreviewPlugin(plugins: PreviewPlugin[], file: PreviewFile): Promise<PreviewPlugin> {\n for (const plugin of plugins) {\n if (await plugin.match(file)) {\n return plugin;\n }\n }\n return fallbackPlugin();\n}\n\nfunction createInlineError(titleText: string, detailText: string): HTMLElement {\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n const title = document.createElement(\"strong\");\n title.textContent = titleText;\n const detail = document.createElement(\"span\");\n detail.textContent = detailText;\n fallback.append(title, detail);\n return fallback;\n}\n\nfunction appendArchiveInfo(parent: HTMLElement, label: string, value: string): void {\n const row = document.createElement(\"div\");\n const key = document.createElement(\"strong\");\n key.textContent = `${label}:`;\n row.append(key, document.createTextNode(value));\n parent.append(row);\n}\n\nfunction createArchiveSummary(entries: ArchiveEntry[]): HTMLElement {\n const files = entries.filter((entry) => !entry.dir);\n const summary = document.createElement(\"dl\");\n summary.className = \"ofv-archive-summary\";\n const totalSize = files.reduce((sum, entry) => sum + entry.size, 0);\n const largest = files.reduce<ArchiveEntry | undefined>((current, entry) => (!current || entry.size > current.size ? entry : current), undefined);\n appendArchiveSummary(summary, \"总解压大小\", formatBytes(totalSize));\n appendArchiveSummary(summary, \"最大文件\", largest ? `${largest.name} · ${formatBytes(largest.size)}` : \"无\");\n appendArchiveSummary(summary, \"类型分布\", formatArchiveExtensions(files));\n appendArchiveSummary(summary, \"可预览条目\", String(files.slice(0, 500).length));\n appendArchiveSummary(summary, \"风险路径\", String(files.filter((entry) => isRiskyArchivePath(entry.unsafeName || entry.name)).length));\n return summary;\n}\n\nfunction appendArchiveSummary(parent: HTMLElement, label: string, value: string): void {\n const key = document.createElement(\"dt\");\n key.textContent = label;\n const content = document.createElement(\"dd\");\n content.textContent = value;\n parent.append(key, content);\n}\n\nfunction formatArchiveExtensions(entries: ArchiveEntry[]): string {\n const counts = new Map<string, number>();\n for (const entry of entries) {\n const name = entry.name.split(\"/\").pop() || entry.name;\n const index = name.lastIndexOf(\".\");\n const extension = index > 0 ? name.slice(index + 1).toLowerCase() : \"(无扩展名)\";\n counts.set(extension, (counts.get(extension) || 0) + 1);\n }\n return [...counts.entries()]\n .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))\n .slice(0, 6)\n .map(([extension, count]) => `${extension} ${count}`)\n .join(\", \") || \"无\";\n}\n\nfunction isRiskyArchivePath(name: string): boolean {\n return name.startsWith(\"/\") || /^[A-Za-z]:[\\\\/]/.test(name) || name.split(/[\\\\/]+/).includes(\"..\");\n}\n\nfunction createArchiveLoading(fileName: string): HTMLElement {\n const loading = document.createElement(\"div\");\n loading.className = \"ofv-archive-loading\";\n const spinner = document.createElement(\"div\");\n spinner.className = \"ofv-archive-loading-spinner\";\n const text = document.createElement(\"span\");\n text.textContent = `正在解压并加载 [${fileName}]...`;\n loading.append(spinner, text);\n return loading;\n}\n\nfunction renderArchiveProbe(panel: HTMLElement, probe: ArchiveProbe, fileName: string, url: string): void {\n const section = createSection(`${probe.format} 结构预览`);\n const note = document.createElement(\"p\");\n note.textContent = probe.note;\n\n const meta = document.createElement(\"div\");\n meta.className = \"ofv-archive-probe-meta\";\n appendArchiveInfo(meta, \"文件\", fileName);\n appendArchiveInfo(meta, \"格式\", probe.format);\n for (const item of probe.meta) {\n appendArchiveInfo(meta, item.label, item.value);\n }\n\n const download = document.createElement(\"a\");\n download.className = \"ofv-asset-download\";\n download.href = url;\n download.download = fileName;\n download.textContent = \"下载压缩包\";\n\n section.append(note, meta, download);\n\n if (!probe.valid) {\n const error = document.createElement(\"p\");\n error.className = \"ofv-data-error\";\n error.textContent = probe.error || \"压缩包头信息无法识别。\";\n section.append(error);\n }\n\n if (probe.entries.length > 0) {\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-table-scroll ofv-archive-probe-table\";\n const table = document.createElement(\"table\");\n const thead = document.createElement(\"thead\");\n const header = document.createElement(\"tr\");\n for (const label of [\"文件\", \"原始大小\", \"压缩大小\"]) {\n const th = document.createElement(\"th\");\n th.textContent = label;\n header.append(th);\n }\n thead.append(header);\n const tbody = document.createElement(\"tbody\");\n for (const entry of probe.entries.slice(0, 200)) {\n const tr = document.createElement(\"tr\");\n for (const value of [\n entry.name,\n entry.size === undefined ? \"未知\" : formatBytes(entry.size),\n entry.packedSize === undefined ? \"未知\" : formatBytes(entry.packedSize)\n ]) {\n const td = document.createElement(\"td\");\n td.textContent = value;\n tr.append(td);\n }\n tbody.append(tr);\n }\n table.append(thead, tbody);\n wrapper.append(table);\n section.append(wrapper);\n }\n\n panel.append(section);\n}\n\nfunction probeArchiveHeader(arrayBuffer: ArrayBuffer, extension: string): ArchiveProbe {\n const bytes = new Uint8Array(arrayBuffer);\n if (extension === \"rar\") {\n return probeRar(bytes);\n }\n if (extension === \"7z\") {\n return probe7z(bytes);\n }\n if (extension === \"bz2\") {\n return probeBzip2(bytes);\n }\n if (extension === \"xz\") {\n return probeXz(bytes);\n }\n return {\n format: extension.toUpperCase(),\n valid: false,\n error: \"暂不支持该压缩格式的头信息解析。\",\n meta: [],\n entries: [],\n note: \"当前仅提供压缩包识别和下载入口。\"\n };\n}\n\nfunction probeRar(bytes: Uint8Array): ArchiveProbe {\n const rar4 = bytes.length >= 7 && bytes[0] === 0x52 && bytes[1] === 0x61 && bytes[2] === 0x72 && bytes[3] === 0x21 && bytes[4] === 0x1a && bytes[5] === 0x07 && bytes[6] === 0x00;\n const rar5 = bytes.length >= 8 && bytes[0] === 0x52 && bytes[1] === 0x61 && bytes[2] === 0x72 && bytes[3] === 0x21 && bytes[4] === 0x1a && bytes[5] === 0x07 && bytes[6] === 0x01 && bytes[7] === 0x00;\n const entries = rar4 ? parseRar4Entries(bytes) : [];\n return {\n format: \"RAR\",\n valid: rar4 || rar5,\n error: rar4 || rar5 ? undefined : \"缺少 RAR signature。\",\n meta: [\n { label: \"版本\", value: rar5 ? \"RAR5\" : rar4 ? \"RAR4\" : \"未知\" },\n { label: \"签名\", value: byteSignature(bytes) },\n { label: \"可见条目\", value: String(entries.length) }\n ],\n entries,\n note: rar4\n ? \"当前轻量读取 RAR4 未加密文件头,用于目录确认;实际解压仍建议接入 unrar WASM 或本地工具。\"\n : \"当前识别 RAR 容器和版本;RAR5 目录解析需要专用解码器。\"\n };\n}\n\nfunction parseRar4Entries(bytes: Uint8Array): ArchiveProbe[\"entries\"] {\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const entries: ArchiveProbe[\"entries\"] = [];\n let offset = 7;\n while (offset + 7 <= bytes.length && entries.length < 200) {\n const type = bytes[offset + 2];\n const flags = view.getUint16(offset + 3, true);\n let headerSize = view.getUint16(offset + 5, true);\n if (headerSize < 7 || offset + headerSize > bytes.length) {\n break;\n }\n if ((flags & 0x8000) !== 0) {\n if (offset + 11 > bytes.length) {\n break;\n }\n headerSize += view.getUint32(offset + 7, true);\n }\n if (type === 0x74 && offset + 32 <= bytes.length) {\n const packedSize = view.getUint32(offset + 7, true);\n const unpackedSize = view.getUint32(offset + 11, true);\n const nameSize = view.getUint16(offset + 26, true);\n const nameOffset = offset + 32;\n const nameEnd = Math.min(nameOffset + nameSize, offset + headerSize, bytes.length);\n const nameBytes = bytes.slice(nameOffset, nameEnd);\n const name = new TextDecoder(\"latin1\").decode(nameBytes).replace(/\\0.*$/, \"\");\n if (name) {\n entries.push({ name, size: unpackedSize, packedSize });\n }\n }\n offset += headerSize;\n }\n return entries;\n}\n\nfunction probe7z(bytes: Uint8Array): ArchiveProbe {\n const valid = bytes.length >= 32 && bytes[0] === 0x37 && bytes[1] === 0x7a && bytes[2] === 0xbc && bytes[3] === 0xaf && bytes[4] === 0x27 && bytes[5] === 0x1c;\n const meta: ArchiveProbe[\"meta\"] = [{ label: \"签名\", value: byteSignature(bytes) }];\n if (valid) {\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n meta.push({ label: \"版本\", value: `${bytes[6]}.${bytes[7]}` });\n meta.push({ label: \"Next header offset\", value: String(readUint64Le(view, 12)) });\n meta.push({ label: \"Next header size\", value: String(readUint64Le(view, 20)) });\n meta.push({ label: \"Next header CRC\", value: `0x${view.getUint32(28, true).toString(16).toUpperCase()}` });\n }\n return {\n format: \"7Z\",\n valid,\n error: valid ? undefined : \"缺少 7z signature。\",\n meta,\n entries: [],\n note: \"当前识别 7z 容器和 next header 边界;目录和解压需要 LZMA/7z 专用解码器。\"\n };\n}\n\nfunction probeBzip2(bytes: Uint8Array): ArchiveProbe {\n const valid = bytes.length >= 4 && bytes[0] === 0x42 && bytes[1] === 0x5a && bytes[2] === 0x68 && bytes[3] >= 0x31 && bytes[3] <= 0x39;\n return {\n format: \"BZIP2\",\n valid,\n error: valid ? undefined : \"缺少 BZh magic header。\",\n meta: [\n { label: \"签名\", value: byteSignature(bytes) },\n { label: \"块大小\", value: valid ? `${String.fromCharCode(bytes[3])}00 KB` : \"未知\" }\n ],\n entries: [],\n note: \"BZIP2 通常是单文件压缩流,本预览器当前展示容器头信息;解压可后续接入 bzip2 解码器。\"\n };\n}\n\nfunction probeXz(bytes: Uint8Array): ArchiveProbe {\n const valid = bytes.length >= 6 && bytes[0] === 0xfd && bytes[1] === 0x37 && bytes[2] === 0x7a && bytes[3] === 0x58 && bytes[4] === 0x5a && bytes[5] === 0x00;\n return {\n format: \"XZ\",\n valid,\n error: valid ? undefined : \"缺少 XZ magic header。\",\n meta: [\n { label: \"签名\", value: byteSignature(bytes) },\n { label: \"Stream flags\", value: bytes.length >= 8 ? `0x${bytes[6].toString(16).padStart(2, \"0\").toUpperCase()} 0x${bytes[7].toString(16).padStart(2, \"0\").toUpperCase()}` : \"未知\" }\n ],\n entries: [],\n note: \"XZ 通常是单文件 LZMA2 压缩流,本预览器当前展示容器头信息;解压可后续接入 xz/lzma 解码器。\"\n };\n}\n\nfunction readUint64Le(view: DataView, offset: number): bigint {\n return BigInt(view.getUint32(offset, true)) | (BigInt(view.getUint32(offset + 4, true)) << 32n);\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) {\n return `${bytes} B`;\n }\n if (bytes < 1024 * 1024) {\n return `${(bytes / 1024).toFixed(1)} KB`;\n }\n return `${(bytes / 1024 / 1024).toFixed(2)} MB`;\n}\n\nfunction byteSignature(bytes: Uint8Array): string {\n if (bytes.length === 0) {\n return \"空文件\";\n }\n const ascii = new TextDecoder(\"ascii\").decode(bytes.slice(0, Math.min(bytes.length, 16))).replace(/[^\\x20-\\x7E]/g, \".\");\n const hex = Array.from(bytes.slice(0, Math.min(bytes.length, 8)))\n .map((byte) => byte.toString(16).padStart(2, \"0\").toUpperCase())\n .join(\" \");\n return `${ascii} (${hex})`;\n}\n\n// 5. Lightweight TAR parser\nfunction untar(arrayBuffer: ArrayBuffer): ArchiveEntry[] {\n const entries: ArchiveEntry[] = [];\n const u8 = new Uint8Array(arrayBuffer);\n let offset = 0;\n\n const readString = (start: number, length: number): string => {\n let end = start;\n while (end < start + length && u8[end] !== 0) {\n end++;\n }\n return new TextDecoder().decode(u8.subarray(start, end)).trim();\n };\n\n while (offset + 512 <= arrayBuffer.byteLength) {\n const magic = readString(offset + 257, 6);\n if (magic !== \"ustar\" && magic !== \"ustar\\0\") {\n let allZero = true;\n for (let i = 0; i < 512; i++) {\n if (u8[offset + i] !== 0) {\n allZero = false;\n break;\n }\n }\n if (allZero) {\n break; // End of archive\n }\n break;\n }\n\n const name = readString(offset, 100);\n const prefix = readString(offset + 345, 155);\n const fullName = prefix ? `${prefix}/${name}` : name;\n\n const sizeStr = readString(offset + 124, 12);\n const size = parseInt(sizeStr, 8) || 0;\n const typeflag = readString(offset + 156, 1);\n const dir = typeflag === \"5\" || fullName.endsWith(\"/\");\n\n const contentOffset = offset + 512;\n entries.push({\n name: fullName,\n size,\n dir,\n read: async () => arrayBuffer.slice(contentOffset, contentOffset + size)\n });\n\n offset += 512 + Math.ceil(size / 512) * 512;\n }\n\n return entries;\n}\n\n// 6. UI Helpers\nfunction getIcon(name: string, dir: boolean): string {\n if (dir) return \"📁\";\n const ext = name.split(\".\").pop()?.toLowerCase();\n switch (ext) {\n case \"png\":\n case \"jpg\":\n case \"jpeg\":\n case \"gif\":\n case \"svg\":\n case \"webp\":\n return \"🖼️\";\n case \"pdf\":\n return \"📕\";\n case \"doc\":\n case \"docx\":\n return \"📘\";\n case \"xls\":\n case \"xlsx\":\n return \"📗\";\n case \"ppt\":\n case \"pptx\":\n return \"📙\";\n case \"zip\":\n case \"rar\":\n case \"7z\":\n case \"tar\":\n case \"gz\":\n return \"📦\";\n case \"mp4\":\n case \"mkv\":\n case \"avi\":\n case \"webm\":\n return \"🎥\";\n case \"mp3\":\n case \"wav\":\n case \"ogg\":\n return \"🎵\";\n case \"txt\":\n case \"md\":\n case \"html\":\n case \"js\":\n case \"ts\":\n case \"json\":\n case \"css\":\n return \"📄\";\n default:\n return \"📄\";\n }\n}\n","import DOMPurify from \"dompurify\";\nimport type { PreviewPlugin } from \"../types\";\nimport { appendMeta, createPanel, createSection, readArrayBuffer, readTextFile, resolveFormat } from \"./utils\";\nimport { createObjectUrl, revokeObjectUrl } from \"../dom\";\n\nconst emailExtensions = new Set([\"eml\", \"msg\", \"mbox\"]);\nconst emailMimeTypes = new Set([\"message/rfc822\", \"application/vnd.ms-outlook\", \"application/mbox\"]);\nconst emailMimeFormatMap: Record<string, string> = {\n \"message/rfc822\": \"eml\",\n \"application/vnd.ms-outlook\": \"msg\",\n \"application/mbox\": \"mbox\"\n};\n\ninterface EmailAttachment {\n name: string;\n mimeType: string;\n content: Uint8Array;\n contentId?: string;\n}\n\ninterface EmailData {\n from: string;\n to: string;\n cc?: string;\n subject: string;\n date: string;\n bodyText?: string;\n bodyHtml?: string;\n attachments: EmailAttachment[];\n}\n\ninterface MboxMessageSummary {\n from: string;\n subject: string;\n date: string;\n}\n\nexport function emailPlugin(): PreviewPlugin {\n return {\n name: \"email\",\n match(file) {\n return emailExtensions.has(file.extension) || emailMimeTypes.has(file.mimeType);\n },\n async render(ctx) {\n const panel = createPanel(\"ofv-email\");\n ctx.viewport.append(panel);\n\n const url = createObjectUrl(ctx.file);\n const isExternal = Boolean(ctx.file.url);\n const ext = resolveFormat(ctx.file, emailMimeFormatMap).toLowerCase();\n let emailData: EmailData;\n const objectUrlsToRevoke: string[] = [];\n const attachmentObjectUrls = new Map<EmailAttachment, string>();\n const timersToClear: number[] = [];\n let mboxSummary: MboxMessageSummary[] = [];\n\n try {\n if (ext === \"msg\") {\n // Parse Outlook binary MSG format\n const MsgReader = (await import(\"@kenjiuno/msgreader\")).default;\n const buffer = await readArrayBuffer(ctx.file);\n const reader = new MsgReader(buffer);\n const parsed = reader.getFileData();\n\n if (parsed.error) {\n throw new Error(parsed.error);\n }\n\n const from = parsed.senderName\n ? `${parsed.senderName} <${parsed.senderEmail || parsed.senderSmtpAddress || \"\"}>`.trim()\n : parsed.senderEmail || parsed.senderSmtpAddress || \"\";\n\n const recipients = parsed.recipients || [];\n const to = recipients\n .filter((r) => r.recipType === \"to\")\n .map((r) => `${r.name || \"\"} <${r.email || r.smtpAddress || \"\"}>`.trim())\n .join(\"; \");\n const cc = recipients\n .filter((r) => r.recipType === \"cc\")\n .map((r) => `${r.name || \"\"} <${r.email || r.smtpAddress || \"\"}>`.trim())\n .join(\"; \");\n\n const attachments: EmailAttachment[] = [];\n if (Array.isArray(parsed.attachments)) {\n parsed.attachments.forEach((att) => {\n try {\n const fullAtt = reader.getAttachment(att);\n attachments.push({\n name: fullAtt.fileName || \"未命名附件\",\n mimeType: getAttachmentMimeType(fullAtt, att),\n content: fullAtt.content,\n contentId: att.pidContentId\n });\n } catch (attErr) {\n console.warn(\"Failed to parse attachment:\", attErr);\n }\n });\n }\n\n let bodyHtml = parsed.bodyHtml;\n if (!bodyHtml && parsed.html instanceof Uint8Array) {\n bodyHtml = new TextDecoder(\"utf-8\").decode(parsed.html);\n }\n\n emailData = {\n from: from || \"-\",\n to: to || \"-\",\n cc: cc || \"\",\n subject: parsed.subject || \"(无主题)\",\n date: parsed.messageDeliveryTime || parsed.clientSubmitTime || parsed.creationTime || \"-\",\n bodyText: parsed.body,\n bodyHtml,\n attachments\n };\n } else {\n // Parse EML or MBOX text formats\n const PostalMime = (await import(\"postal-mime\")).default;\n const parser = new PostalMime();\n \n let rawText = await readTextFile(ctx.file);\n if (ext === \"mbox\") {\n const messages = splitMboxMessages(rawText);\n mboxSummary = messages.map(summarizeMboxMessage);\n rawText = messages[0] || rawText;\n }\n\n const parsed = await parser.parse(rawText);\n\n const from = parsed.from ? `${parsed.from.name || \"\"} <${parsed.from.address || \"\"}>`.trim() : \"\";\n const to = Array.isArray(parsed.to)\n ? parsed.to.map((t) => `${t.name || \"\"} <${t.address || \"\"}>`.trim()).join(\"; \")\n : \"\";\n const cc = Array.isArray(parsed.cc)\n ? parsed.cc.map((c) => `${c.name || \"\"} <${c.address || \"\"}>`.trim()).join(\"; \")\n : \"\";\n\n emailData = {\n from: from || \"-\",\n to: to || \"-\",\n cc: cc || \"\",\n subject: parsed.subject || \"(无主题)\",\n date: parsed.date || \"-\",\n bodyText: parsed.text,\n bodyHtml: parsed.html,\n attachments: (parsed.attachments || []).map((att) => ({\n name: att.filename || \"未命名附件\",\n mimeType: att.mimeType || \"application/octet-stream\",\n content: att.content instanceof Uint8Array ? att.content : new Uint8Array(att.content as any),\n contentId: att.contentId\n }))\n };\n }\n\n if (mboxSummary.length > 0) {\n panel.append(createMboxSummarySection(mboxSummary));\n }\n\n // 1. Render Header information section\n const headerSection = createSection(\"邮件信息\");\n appendMeta(headerSection, \"Subject\", emailData.subject);\n appendMeta(headerSection, \"From\", emailData.from);\n appendMeta(headerSection, \"To\", emailData.to);\n if (emailData.cc) {\n appendMeta(headerSection, \"Cc\", emailData.cc);\n }\n appendMeta(headerSection, \"Date\", emailData.date);\n panel.append(headerSection);\n\n // 2. Render Attachments section if present\n if (emailData.attachments.length > 0) {\n const attachmentsSection = createSection(\"附件列表\");\n const container = document.createElement(\"div\");\n container.className = \"ofv-email-attachments\";\n\n emailData.attachments.forEach((att) => {\n const blobUrl = getAttachmentObjectUrl(att, attachmentObjectUrls, objectUrlsToRevoke);\n\n const item = document.createElement(\"a\");\n item.className = \"ofv-email-attachment-item\";\n item.href = blobUrl;\n item.download = att.name;\n item.rel = \"noopener noreferrer\";\n \n // Format attachment size helper\n const sizeKB = Math.round(att.content.byteLength / 1024);\n item.textContent = `Attachment: ${att.name} (${sizeKB} KB)`;\n container.append(item);\n });\n \n attachmentsSection.append(container);\n panel.append(attachmentsSection);\n }\n\n // 3. Render Body section (support inline cid images)\n const bodySection = createSection(\"正文\");\n panel.append(bodySection);\n\n let html = emailData.bodyHtml;\n if (html) {\n // Replace inline cid: content IDs with local blob URLs\n let nextHtml = html;\n emailData.attachments.forEach((att) => {\n const contentId = att.contentId;\n if (contentId) {\n const blobUrl = getAttachmentObjectUrl(att, attachmentObjectUrls, objectUrlsToRevoke);\n\n const cleanCid = contentId.replace(/[<>]/g, \"\");\n nextHtml = replaceCidResourceUrls(nextHtml, contentId, blobUrl);\n if (cleanCid !== contentId) {\n nextHtml = replaceCidResourceUrls(nextHtml, cleanCid, blobUrl);\n }\n }\n });\n html = nextHtml;\n const sanitizedHtml = sanitizeEmailHtml(html);\n\n // Render in a sandboxed iframe to prevent styles leaking\n const iframe = document.createElement(\"iframe\");\n iframe.className = \"ofv-email-body-iframe\";\n iframe.setAttribute(\"sandbox\", \"allow-popups allow-popups-to-escape-sandbox\");\n iframe.style.cssText = \"width: 100%; border: none; background: #fff; min-height: 200px;\";\n bodySection.append(iframe);\n\n iframe.onload = () => {\n try {\n const idoc = iframe.contentDocument || iframe.contentWindow?.document;\n if (idoc) {\n idoc.open();\n idoc.write(`\n <!doctype html>\n <html>\n <head>\n <meta charset=\"utf-8\" />\n <style>\n body {\n margin: 16px;\n padding: 0;\n font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n font-size: 14px;\n line-height: 1.6;\n color: #1f2937;\n }\n img { max-width: 100%; height: auto; display: block; margin: 12px 0; }\n a { color: #2563eb; }\n blockquote {\n margin: 12px 0;\n padding-left: 12px;\n border-left: 3px solid #d1d5db;\n color: #4b5563;\n }\n </style>\n </head>\n <body>${sanitizedHtml}</body>\n </html>\n `);\n idoc.close();\n secureEmailLinks(idoc);\n\n // Auto-adjust height to avoid double scrolling\n const resize = () => {\n const body = idoc.body;\n const docEl = idoc.documentElement;\n const height = Math.max(\n body.scrollHeight,\n body.offsetHeight,\n docEl.clientHeight,\n docEl.scrollHeight,\n docEl.offsetHeight\n );\n iframe.style.height = `${height + 32}px`;\n };\n\n resize();\n timersToClear.push(window.setTimeout(resize, 300));\n timersToClear.push(window.setTimeout(resize, 1000));\n }\n } catch (err) {\n console.error(\"Failed to write html body to email iframe:\", err);\n }\n };\n } else {\n // Render plain text body\n const pre = document.createElement(\"pre\");\n pre.className = \"ofv-text-block\";\n pre.textContent = emailData.bodyText || \"未解析到正文。\";\n bodySection.append(pre);\n }\n\n } catch (err: any) {\n panel.replaceChildren();\n const errorSection = createSection(\"邮件解析出错\");\n const pre = document.createElement(\"pre\");\n pre.className = \"ofv-text-block\";\n pre.style.color = \"#ef4444\";\n pre.textContent = `解析邮件时发生错误:\\n${err.message || err}`;\n errorSection.append(pre);\n panel.append(errorSection);\n }\n\n return {\n destroy() {\n timersToClear.forEach((timer) => window.clearTimeout(timer));\n objectUrlsToRevoke.forEach((u) => {\n URL.revokeObjectURL(u);\n });\n revokeObjectUrl(url, isExternal);\n panel.remove();\n }\n };\n }\n };\n}\n\nfunction getAttachmentObjectUrl(\n attachment: EmailAttachment,\n cache: Map<EmailAttachment, string>,\n urlsToRevoke: string[]\n): string {\n const cached = cache.get(attachment);\n if (cached) {\n return cached;\n }\n const blob = new Blob([attachment.content as BlobPart], { type: attachment.mimeType });\n const url = URL.createObjectURL(blob);\n cache.set(attachment, url);\n urlsToRevoke.push(url);\n return url;\n}\n\nfunction getAttachmentMimeType(fullAttachment: unknown, attachmentMeta?: unknown): string {\n const candidates = [fullAttachment, attachmentMeta];\n for (const candidate of candidates) {\n if (!candidate || typeof candidate !== \"object\") {\n continue;\n }\n const record = candidate as Record<string, unknown>;\n const explicitMime =\n normalizeMimeValue(record.attachMimeTag) ||\n normalizeMimeValue(record.mimeType) ||\n normalizeMimeValue(record.contentType) ||\n normalizeMimeValue(record.mime) ||\n normalizeMimeValue(record[\"content-type\"]);\n if (explicitMime) {\n return explicitMime;\n }\n }\n\n const fileName =\n (fullAttachment && typeof fullAttachment === \"object\" ? (fullAttachment as { fileName?: unknown }).fileName : undefined) ||\n (attachmentMeta && typeof attachmentMeta === \"object\" ? (attachmentMeta as { fileName?: unknown }).fileName : undefined);\n return getMimeType(typeof fileName === \"string\" ? fileName : \"\");\n}\n\nfunction normalizeMimeValue(value: unknown): string {\n if (typeof value !== \"string\") {\n return \"\";\n }\n const mimeType = value.split(\";\")[0]?.trim().toLowerCase() || \"\";\n return mimeType.includes(\"/\") ? mimeType : \"\";\n}\n\nfunction replaceCidResourceUrls(html: string, contentId: string, blobUrl: string): string {\n const escapedCid = escapeRegExp(contentId);\n return html.replace(\n new RegExp(`\\\\b(src|poster|background)=([\"'])cid:${escapedCid}\\\\2`, \"gi\"),\n (_match, attribute: string, quote: string) => `${attribute}=${quote}${blobUrl}${quote}`\n );\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction createMboxSummarySection(messages: MboxMessageSummary[]): HTMLElement {\n const section = createSection(\"MBOX 邮箱摘要\");\n const meta = document.createElement(\"div\");\n meta.className = \"ofv-email-mbox-meta\";\n appendMeta(meta, \"邮件数\", String(messages.length));\n appendMeta(meta, \"预览\", \"当前正文显示第一封邮件\");\n\n const tableWrap = document.createElement(\"div\");\n tableWrap.className = \"ofv-table-scroll ofv-email-mbox-table\";\n const table = document.createElement(\"table\");\n const thead = document.createElement(\"thead\");\n const header = document.createElement(\"tr\");\n for (const label of [\"#\", \"Subject\", \"From\", \"Date\"]) {\n const th = document.createElement(\"th\");\n th.textContent = label;\n header.append(th);\n }\n thead.append(header);\n const tbody = document.createElement(\"tbody\");\n messages.slice(0, 100).forEach((message, index) => {\n const row = document.createElement(\"tr\");\n for (const value of [String(index + 1), message.subject || \"(无主题)\", message.from || \"-\", message.date || \"-\"]) {\n const cell = document.createElement(\"td\");\n cell.textContent = value;\n row.append(cell);\n }\n tbody.append(row);\n });\n table.append(thead, tbody);\n tableWrap.append(table);\n section.append(meta, tableWrap);\n return section;\n}\n\nfunction splitMboxMessages(mboxText: string): string[] {\n const lines = mboxText.replace(/\\r\\n/g, \"\\n\").split(\"\\n\");\n const messages: string[][] = [];\n let current: string[] | null = null;\n let foundFirstFrom = false;\n\n for (const line of lines) {\n if (line.startsWith(\"From \")) {\n if (current && current.length > 0) {\n messages.push(current);\n }\n current = [];\n foundFirstFrom = true;\n continue;\n }\n if (foundFirstFrom && current) {\n current.push(line.startsWith(\">From \") ? line.slice(1) : line);\n }\n }\n if (current && current.length > 0) {\n messages.push(current);\n }\n return messages.length > 0 ? messages.map((message) => message.join(\"\\n\")) : [mboxText];\n}\n\nfunction summarizeMboxMessage(message: string): MboxMessageSummary {\n return {\n from: unfoldHeader(readHeaderValue(message, \"From\")),\n subject: unfoldHeader(readHeaderValue(message, \"Subject\")),\n date: unfoldHeader(readHeaderValue(message, \"Date\"))\n };\n}\n\nfunction readHeaderValue(message: string, name: string): string {\n const headers = message.split(/\\n\\s*\\n/, 1)[0] || \"\";\n const escaped = name.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const match = headers.match(new RegExp(`^${escaped}:\\\\s*([\\\\s\\\\S]*?)(?=\\\\n[^\\\\s:]+:|\\\\n\\\\s*\\\\n|$)`, \"im\"));\n return match?.[1]?.trim() || \"\";\n}\n\nfunction unfoldHeader(value: string): string {\n return value.replace(/\\n[ \\t]+/g, \" \").trim();\n}\n\n// File extension to MIME type helper for attachment previews\nfunction getMimeType(name: string): string {\n const ext = name.split(\".\").pop()?.toLowerCase();\n const map: Record<string, string> = {\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n svg: \"image/svg+xml\",\n pdf: \"application/pdf\",\n docx: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n xlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n pptx: \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n txt: \"text/plain\",\n md: \"text/markdown\",\n html: \"text/html\",\n mp4: \"video/mp4\",\n mp3: \"audio/mpeg\",\n wav: \"audio/wav\"\n };\n return ext ? map[ext] || \"application/octet-stream\" : \"application/octet-stream\";\n}\n\nfunction sanitizeEmailHtml(html: string): string {\n return DOMPurify.sanitize(html, {\n USE_PROFILES: { html: true },\n ADD_ATTR: [\"target\"],\n ALLOWED_URI_REGEXP: /^(?:(?:https?|mailto|tel|blob|cid):|[^a-z]|[a-z+.-]+(?:[^a-z+.-:]|$))/i\n });\n}\n\nfunction secureEmailLinks(document: Document): void {\n for (const link of document.querySelectorAll<HTMLAnchorElement>(\"a[href]\")) {\n const href = link.getAttribute(\"href\") || \"\";\n if (!isSafeEmailHref(href)) {\n link.removeAttribute(\"href\");\n link.removeAttribute(\"target\");\n link.removeAttribute(\"rel\");\n continue;\n }\n if (/^(https?:)?\\/\\//i.test(href)) {\n link.target = \"_blank\";\n link.rel = \"noopener noreferrer\";\n }\n }\n}\n\nfunction isSafeEmailHref(href: string): boolean {\n const trimmed = href.trim();\n return (\n trimmed.startsWith(\"#\") ||\n trimmed.startsWith(\"/\") ||\n trimmed.startsWith(\"./\") ||\n trimmed.startsWith(\"../\") ||\n trimmed.startsWith(\"blob:\") ||\n /^(https?:|mailto:|tel:)/i.test(trimmed)\n );\n}\n","import pako from \"pako\";\nimport type { PreviewPlugin } from \"../types\";\nimport { createPanel, createSection, readTextFile, resolveFormat } from \"./utils\";\n\nconst drawingExtensions = new Set([\"drawio\", \"dio\", \"excalidraw\", \"tldraw\"]);\nconst drawingMimeFormatMap: Record<string, string> = {\n \"application/vnd.jgraph.mxfile\": \"drawio\",\n \"application/vnd.excalidraw+json\": \"excalidraw\",\n \"application/x-excalidraw+json\": \"excalidraw\"\n};\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\n\nexport function drawingPlugin(): PreviewPlugin {\n return {\n name: \"drawing\",\n match(file) {\n return drawingExtensions.has(file.extension) || Boolean(drawingMimeFormatMap[file.mimeType]);\n },\n async render(ctx) {\n const panel = createPanel(\"ofv-drawing\");\n ctx.viewport.append(panel);\n const text = await readTextFile(ctx.file);\n const extension = resolveFormat(ctx.file, drawingMimeFormatMap);\n\n try {\n if (extension === \"excalidraw\") {\n renderExcalidraw(panel, text);\n } else if (extension === \"tldraw\") {\n renderTldraw(panel, text);\n } else if (extension === \"drawio\" || extension === \"dio\") {\n renderDrawio(panel, text);\n } else {\n renderRawDrawing(panel, extension || \"drawing\", text);\n }\n } catch (error) {\n renderDrawingParseFallback(panel, extension || \"drawing\", text, error);\n }\n\n return {\n destroy() {\n panel.remove();\n }\n };\n }\n };\n}\n\ntype DrawingSummaryItem = {\n type: string;\n x?: number;\n y?: number;\n width?: number;\n height?: number;\n text?: string;\n image?: boolean;\n embed?: boolean;\n edge?: boolean;\n};\n\nfunction createDrawingSummary(items: DrawingSummaryItem[]): HTMLElement {\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-drawing-summary\";\n const typeCounts = countDrawingTypes(items);\n appendDrawingSummary(summary, \"对象\", String(items.length));\n appendDrawingSummary(summary, \"类型\", formatDrawingTypes(typeCounts));\n appendDrawingSummary(summary, \"文本\", String(items.filter((item) => item.text && item.text.trim()).length));\n appendDrawingSummary(summary, \"连线\", String(items.filter((item) => item.edge).length));\n const media = items.filter((item) => item.image || item.embed).length;\n if (media > 0) {\n appendDrawingSummary(summary, \"媒体/嵌入\", String(media));\n }\n const bounds = drawingBounds(items);\n if (bounds) {\n appendDrawingSummary(summary, \"范围\", `${Math.round(bounds[0])}, ${Math.round(bounds[1])}, ${Math.round(bounds[2])}, ${Math.round(bounds[3])}`);\n }\n return summary;\n}\n\nfunction appendDrawingSummary(parent: HTMLElement, label: string, value: string): void {\n const item = document.createElement(\"span\");\n const key = document.createElement(\"span\");\n key.textContent = label;\n const content = document.createElement(\"strong\");\n content.textContent = value;\n item.append(key, content);\n parent.append(item);\n}\n\nfunction countDrawingTypes(items: DrawingSummaryItem[]): Map<string, number> {\n const counts = new Map<string, number>();\n for (const item of items) {\n counts.set(item.type, (counts.get(item.type) || 0) + 1);\n }\n return counts;\n}\n\nfunction formatDrawingTypes(counts: Map<string, number>): string {\n return [...counts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 6)\n .map(([type, count]) => `${type} ${count}`)\n .join(\", \") || \"无\";\n}\n\nfunction drawingBounds(items: DrawingSummaryItem[]): [number, number, number, number] | undefined {\n const boxes = items\n .map((item) => {\n if (!Number.isFinite(item.x) || !Number.isFinite(item.y)) {\n return undefined;\n }\n const x = item.x as number;\n const y = item.y as number;\n const width = Math.max(0, finiteNumber(item.width, 0));\n const height = Math.max(0, finiteNumber(item.height, 0));\n return [x, y, x + width, y + height] as [number, number, number, number];\n })\n .filter((item): item is [number, number, number, number] => Boolean(item));\n if (boxes.length === 0) {\n return undefined;\n }\n return [\n Math.min(...boxes.map((box) => box[0])),\n Math.min(...boxes.map((box) => box[1])),\n Math.max(...boxes.map((box) => box[2])),\n Math.max(...boxes.map((box) => box[3]))\n ];\n}\n\nfunction excalidrawSummaryItem(element: Record<string, unknown>): DrawingSummaryItem {\n return {\n type: String(element.type || \"unknown\"),\n x: finiteNumber(element.x, 0),\n y: finiteNumber(element.y, 0),\n width: finiteNumber(element.width, 0),\n height: finiteNumber(element.height, 0),\n text: String(element.text || element.name || \"\"),\n image: element.type === \"image\",\n embed: element.type === \"embeddable\",\n edge: element.type === \"arrow\" || element.type === \"line\"\n };\n}\n\nfunction tldrawSummaryItem(shape: TldrawShape): DrawingSummaryItem {\n const props = shape.props || {};\n return {\n type: String(shape.type || props.type || \"unknown\"),\n x: finiteNumber(shape.x, 0),\n y: finiteNumber(shape.y, 0),\n width: finiteNumber(props.w, finiteNumber(props.width, 0)),\n height: finiteNumber(props.h, finiteNumber(props.height, 0)),\n text: String(props.text || \"\"),\n edge: shape.type === \"arrow\" || shape.type === \"line\"\n };\n}\n\nfunction drawioSummaryItem(shape: DrawioShape): DrawingSummaryItem {\n return {\n type: shape.edge ? \"edge\" : drawioShapeName(shape.style),\n x: shape.x,\n y: shape.y,\n width: shape.width,\n height: shape.height,\n text: shape.value,\n image: drawioShapeName(shape.style) === \"image\",\n edge: shape.edge\n };\n}\n\nfunction renderExcalidraw(panel: HTMLElement, text: string): void {\n const data = JSON.parse(text) as {\n elements?: Array<Record<string, unknown>>;\n files?: Record<string, { dataURL?: string; mimeType?: string; id?: string }>;\n };\n const files = data.files || {};\n const elements = (data.elements || []).filter((element) => !element.isDeleted);\n const section = createSection(`Excalidraw ${elements.length} elements`);\n section.append(createDrawingSummary(elements.map(excalidrawSummaryItem)));\n const svg = document.createElementNS(SVG_NS, \"svg\");\n svg.setAttribute(\"class\", \"ofv-svg-stage\");\n svg.setAttribute(\"viewBox\", createExcalidrawViewBox(elements));\n const defs = document.createElementNS(SVG_NS, \"defs\");\n svg.append(defs);\n\n for (const element of elements) {\n const type = String(element.type || \"\");\n const x = Number(element.x || 0);\n const y = Number(element.y || 0);\n const width = Number(element.width || 80);\n const height = Number(element.height || 40);\n const stroke = String(element.strokeColor || \"#111827\");\n const fill = excalidrawFill(svg, defs, element, stroke);\n const common = getExcalidrawCommonAttrs(element);\n const transform = excalidrawTransform(element, x, y, width, height);\n\n if (type === \"frame\") {\n const frame = document.createElementNS(SVG_NS, \"rect\");\n applySvgAttrs(frame, {\n x,\n y,\n width,\n height,\n rx: 4,\n fill: \"transparent\",\n stroke: \"#94a3b8\",\n \"stroke-width\": 2,\n \"stroke-dasharray\": \"8 6\",\n opacity: common.opacity,\n transform\n });\n svg.append(frame);\n appendSvgMultilineText(svg, String(element.name || \"Frame\"), x + 12, y + 24, \"#64748b\", {\n fontSize: 14,\n transform\n });\n } else if (type === \"image\") {\n renderExcalidrawImage(svg, element, files, x, y, width, height, common, transform);\n } else if (type === \"embeddable\") {\n renderExcalidrawEmbeddable(svg, element, x, y, width, height, common, transform);\n } else if (type === \"rectangle\" || type === \"diamond\") {\n if (type === \"diamond\") {\n const polygon = document.createElementNS(SVG_NS, \"polygon\");\n polygon.setAttribute(\n \"points\",\n `${x + width / 2},${y} ${x + width},${y + height / 2} ${x + width / 2},${y + height} ${x},${y + height / 2}`\n );\n applySvgAttrs(polygon, { fill, stroke, ...common, transform });\n svg.append(polygon);\n } else {\n const rect = document.createElementNS(SVG_NS, \"rect\");\n applySvgAttrs(rect, {\n x,\n y,\n width,\n height,\n rx: finiteNumber(element.roundness && typeof element.roundness === \"object\" ? (element.roundness as Record<string, unknown>).value : undefined, 0),\n fill,\n stroke,\n ...common,\n transform\n });\n svg.append(rect);\n }\n } else if (type === \"ellipse\") {\n const ellipse = document.createElementNS(SVG_NS, \"ellipse\");\n applySvgAttrs(ellipse, {\n cx: x + width / 2,\n cy: y + height / 2,\n rx: Math.abs(width / 2),\n ry: Math.abs(height / 2),\n fill,\n stroke,\n ...common,\n transform\n });\n svg.append(ellipse);\n } else if (type === \"line\" || type === \"arrow\") {\n const points = excalidrawPoints(element, x, y, width, height);\n if (points.length > 2) {\n const polyline = document.createElementNS(SVG_NS, \"polyline\");\n applySvgAttrs(polyline, {\n points: points.map((point) => `${point.x},${point.y}`).join(\" \"),\n fill: \"none\",\n stroke,\n ...common,\n transform\n });\n svg.append(polyline);\n appendExcalidrawArrowHeads(svg, element, points, stroke);\n } else {\n const start = points[0] || { x, y };\n const end = points[points.length - 1] || { x: x + width, y: y + height };\n const line = document.createElementNS(SVG_NS, \"line\");\n applySvgAttrs(line, {\n x1: start.x,\n y1: start.y,\n x2: end.x,\n y2: end.y,\n stroke,\n ...common,\n transform\n });\n svg.append(line);\n appendExcalidrawArrowHeads(svg, element, [start, end], stroke);\n }\n } else if (type === \"freedraw\") {\n const path = createExcalidrawFreedrawPath(element, x, y);\n if (path) {\n applySvgAttrs(path, { fill: \"none\", stroke, ...common, transform });\n svg.append(path);\n }\n } else if (type === \"text\") {\n const fontSize = finiteNumber(element.fontSize, 18);\n const lines = String(element.text || \"\").split(/\\r?\\n/);\n const textAlign = String(element.textAlign || \"left\");\n const verticalAlign = String(element.verticalAlign || \"top\");\n const anchor = textAlign === \"center\" ? \"middle\" : textAlign === \"right\" ? \"end\" : \"start\";\n const textX = textAlign === \"center\" ? x + width / 2 : textAlign === \"right\" ? x + width : x;\n const textY =\n verticalAlign === \"middle\"\n ? y + height / 2 - ((lines.length - 1) * fontSize * 1.25) / 2\n : verticalAlign === \"bottom\"\n ? y + height - (lines.length - 1) * fontSize * 1.25\n : y + fontSize;\n appendSvgMultilineText(svg, String(element.text || \"\"), textX, textY, stroke, {\n fontSize,\n fontFamily: String(element.fontFamily || \"Inter, ui-sans-serif, system-ui, sans-serif\"),\n anchor,\n dominantBaseline: verticalAlign === \"middle\" ? \"middle\" : \"auto\",\n opacity: common.opacity,\n transform\n });\n }\n }\n\n section.append(svg);\n panel.append(section);\n}\n\nfunction renderExcalidrawImage(\n svg: SVGSVGElement,\n element: Record<string, unknown>,\n files: Record<string, { dataURL?: string; mimeType?: string; id?: string }>,\n x: number,\n y: number,\n width: number,\n height: number,\n common: Record<string, string | number>,\n transform: string\n): void {\n const fileId = String(element.fileId || \"\");\n const file = fileId ? files[fileId] : undefined;\n const dataUrl = file?.dataURL || \"\";\n if (isSafeExcalidrawImageDataUrl(dataUrl)) {\n const image = document.createElementNS(SVG_NS, \"image\");\n applySvgAttrs(image, {\n x,\n y,\n width,\n height,\n href: dataUrl,\n preserveAspectRatio: \"xMidYMid meet\",\n opacity: common.opacity,\n transform\n });\n svg.append(image);\n return;\n }\n\n const rect = document.createElementNS(SVG_NS, \"rect\");\n applySvgAttrs(rect, {\n x,\n y,\n width,\n height,\n rx: 8,\n fill: \"#f8fafc\",\n stroke: \"#94a3b8\",\n \"stroke-width\": 1.5,\n \"stroke-dasharray\": \"6 4\",\n opacity: common.opacity,\n transform\n });\n svg.append(rect);\n appendSvgMultilineText(svg, fileId ? `Image\\n${fileId}` : \"Image\", x + width / 2, y + height / 2 - 8, \"#64748b\", {\n fontSize: 13,\n anchor: \"middle\",\n transform\n });\n}\n\nfunction renderExcalidrawEmbeddable(\n svg: SVGSVGElement,\n element: Record<string, unknown>,\n x: number,\n y: number,\n width: number,\n height: number,\n common: Record<string, string | number>,\n transform: string\n): void {\n const rect = document.createElementNS(SVG_NS, \"rect\");\n applySvgAttrs(rect, {\n x,\n y,\n width,\n height,\n rx: 10,\n fill: \"#eef2ff\",\n stroke: \"#6366f1\",\n \"stroke-width\": 1.5,\n \"stroke-dasharray\": \"8 5\",\n opacity: common.opacity,\n transform\n });\n svg.append(rect);\n const link = String(element.link || element.url || \"Embedded content\");\n appendSvgMultilineText(svg, `Embed\\n${shortenText(link, 48)}`, x + width / 2, y + height / 2 - 10, \"#4338ca\", {\n fontSize: 13,\n anchor: \"middle\",\n transform\n });\n}\n\nfunction appendSvgMultilineText(\n svg: SVGSVGElement,\n text: string,\n x: number,\n y: number,\n fill: string,\n options: {\n fontSize?: number;\n fontFamily?: string;\n anchor?: string;\n dominantBaseline?: string;\n opacity?: string | number;\n transform?: string;\n } = {}\n): SVGTextElement {\n const textNode = document.createElementNS(SVG_NS, \"text\");\n applySvgAttrs(textNode, {\n x,\n y,\n fill,\n \"font-size\": options.fontSize || 18,\n \"font-family\": options.fontFamily || \"Inter, ui-sans-serif, system-ui, sans-serif\",\n \"text-anchor\": options.anchor,\n \"dominant-baseline\": options.dominantBaseline,\n opacity: options.opacity,\n transform: options.transform\n });\n for (const [index, line] of text.split(/\\r?\\n/).entries()) {\n const span = document.createElementNS(SVG_NS, \"tspan\");\n span.setAttribute(\"x\", String(x));\n span.setAttribute(\"dy\", index === 0 ? \"0\" : \"1.25em\");\n span.textContent = line;\n textNode.append(span);\n }\n svg.append(textNode);\n return textNode;\n}\n\nfunction isSafeExcalidrawImageDataUrl(value: string): boolean {\n return /^data:image\\/(?:png|jpe?g|gif|webp|bmp);base64,/i.test(value);\n}\n\nfunction shortenText(value: string, maxLength: number): string {\n return value.length > maxLength ? `${value.slice(0, Math.max(0, maxLength - 3))}...` : value;\n}\n\nfunction createExcalidrawViewBox(elements: Array<Record<string, unknown>>): string {\n if (elements.length === 0) {\n return \"0 0 1200 800\";\n }\n const bounds = elements.map((element) => {\n const x = finiteNumber(element.x, 0);\n const y = finiteNumber(element.y, 0);\n const points = Array.isArray(element.points) ? element.points.map((point) => pointFromValue(point, { x: 0, y: 0 })) : [];\n const width = Math.max(1, finiteNumber(element.width, Math.max(80, ...points.map((point) => point.x))));\n const height = Math.max(1, finiteNumber(element.height, Math.max(40, ...points.map((point) => point.y))));\n return { x, y, width, height };\n });\n const minX = Math.min(...bounds.map((bound) => bound.x)) - 40;\n const minY = Math.min(...bounds.map((bound) => bound.y)) - 40;\n const maxX = Math.max(...bounds.map((bound) => bound.x + bound.width)) + 40;\n const maxY = Math.max(...bounds.map((bound) => bound.y + bound.height)) + 40;\n return `${minX} ${minY} ${Math.max(320, maxX - minX)} ${Math.max(240, maxY - minY)}`;\n}\n\nfunction getExcalidrawCommonAttrs(element: Record<string, unknown>): Record<string, string | number> {\n const strokeWidth = finiteNumber(element.strokeWidth, 1.5);\n const opacity = Math.max(0, Math.min(1, finiteNumber(element.opacity, 100) / 100));\n const style = String(element.strokeStyle || \"solid\");\n return {\n \"stroke-width\": strokeWidth,\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n \"stroke-dasharray\": style === \"dashed\" ? `${strokeWidth * 6} ${strokeWidth * 4}` : style === \"dotted\" ? `${strokeWidth} ${strokeWidth * 4}` : \"\",\n opacity\n };\n}\n\nfunction excalidrawFill(\n svg: SVGSVGElement,\n defs: SVGDefsElement,\n element: Record<string, unknown>,\n stroke: string\n): string {\n const value = String(element.backgroundColor || \"transparent\");\n if (!value || value === \"transparent\") {\n return \"transparent\";\n }\n const fillStyle = String(element.fillStyle || \"solid\");\n if (fillStyle === \"solid\") {\n return value;\n }\n const id = `ofv-excalidraw-${fillStyle}-${defs.children.length}`;\n const pattern = document.createElementNS(SVG_NS, \"pattern\");\n applySvgAttrs(pattern, {\n id,\n width: 10,\n height: 10,\n patternUnits: \"userSpaceOnUse\"\n });\n const background = document.createElementNS(SVG_NS, \"rect\");\n applySvgAttrs(background, { width: 10, height: 10, fill: value, opacity: 0.35 });\n pattern.append(background);\n if (fillStyle === \"cross-hatch\") {\n pattern.append(createPatternLine(svg, \"M 0 10 L 10 0\", stroke));\n pattern.append(createPatternLine(svg, \"M 0 0 L 10 10\", stroke));\n } else if (fillStyle === \"dots\") {\n const dot = document.createElementNS(SVG_NS, \"circle\");\n applySvgAttrs(dot, { cx: 5, cy: 5, r: 1.2, fill: stroke, opacity: 0.48 });\n pattern.append(dot);\n } else {\n pattern.append(createPatternLine(svg, \"M 0 10 L 10 0\", stroke));\n }\n defs.append(pattern);\n return `url(#${id})`;\n}\n\nfunction createPatternLine(svg: SVGSVGElement, d: string, stroke: string): SVGPathElement {\n const path = document.createElementNS(SVG_NS, \"path\");\n applySvgAttrs(path, {\n d,\n stroke,\n \"stroke-width\": 1,\n \"stroke-linecap\": \"round\",\n opacity: 0.42\n });\n return path;\n}\n\nfunction excalidrawTransform(\n element: Record<string, unknown>,\n x: number,\n y: number,\n width: number,\n height: number\n): string {\n const angle = finiteNumber(element.angle, 0);\n if (!angle) {\n return \"\";\n }\n return `rotate(${(angle * 180) / Math.PI} ${x + width / 2} ${y + height / 2})`;\n}\n\nfunction excalidrawPoints(\n element: Record<string, unknown>,\n x: number,\n y: number,\n width: number,\n height: number\n): Array<{ x: number; y: number }> {\n if (!Array.isArray(element.points)) {\n return [\n { x, y },\n { x: x + width, y: y + height }\n ];\n }\n return element.points.map((point) => {\n const parsed = pointFromValue(point, { x: 0, y: 0 });\n return { x: x + parsed.x, y: y + parsed.y };\n });\n}\n\nfunction createExcalidrawFreedrawPath(element: Record<string, unknown>, x: number, y: number): SVGPathElement | null {\n const points = excalidrawPoints(element, x, y, 0, 0);\n if (points.length < 2) {\n return null;\n }\n const path = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n path.setAttribute(\n \"d\",\n points\n .map((point, index) => `${index === 0 ? \"M\" : \"L\"} ${point.x} ${point.y}`)\n .join(\" \")\n );\n return path;\n}\n\nfunction appendExcalidrawArrowHeads(\n svg: SVGSVGElement,\n element: Record<string, unknown>,\n points: Array<{ x: number; y: number }>,\n stroke: string\n): void {\n if (String(element.type || \"\") !== \"arrow\" || points.length < 2) {\n return;\n }\n const startHead = String(element.startArrowhead || \"\");\n const endHead = String(element.endArrowhead || \"arrow\");\n if (startHead && startHead !== \"none\") {\n appendArrowHead(svg, points[1].x, points[1].y, points[0].x, points[0].y, stroke, startHead);\n }\n if (endHead && endHead !== \"none\") {\n const previous = points[points.length - 2];\n const end = points[points.length - 1];\n appendArrowHead(svg, previous.x, previous.y, end.x, end.y, stroke, endHead);\n }\n}\n\nfunction applySvgAttrs(element: SVGElement, attributes: Record<string, string | number | undefined>): void {\n for (const [key, value] of Object.entries(attributes)) {\n if (value === undefined || value === \"\") {\n continue;\n }\n element.setAttribute(key, String(value));\n }\n}\n\ntype TldrawShape = Record<string, unknown> & {\n props?: Record<string, unknown>;\n};\n\nfunction renderTldraw(panel: HTMLElement, text: string): void {\n const data = JSON.parse(text) as unknown;\n const shapes = extractTldrawShapes(data);\n const section = createSection(`tldraw 基础预览 ${shapes.length} shapes`);\n section.append(createDrawingSummary(shapes.map(tldrawSummaryItem)));\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svg.setAttribute(\"class\", \"ofv-svg-stage\");\n svg.setAttribute(\"viewBox\", createTldrawViewBox(shapes));\n\n if (shapes.length === 0) {\n const empty = document.createElementNS(svg.namespaceURI, \"text\");\n empty.setAttribute(\"x\", \"24\");\n empty.setAttribute(\"y\", \"40\");\n empty.setAttribute(\"fill\", \"#64748b\");\n empty.textContent = \"未解析到可展示的 tldraw 图形。\";\n svg.append(empty);\n } else {\n for (const shape of shapes) {\n renderTldrawShape(svg, shape);\n }\n }\n\n section.append(svg);\n panel.append(section);\n}\n\nfunction extractTldrawShapes(data: unknown): TldrawShape[] {\n if (!data || typeof data !== \"object\") {\n return [];\n }\n const source = data as Record<string, unknown>;\n const candidates: unknown[] = [];\n if (Array.isArray(source.records)) {\n candidates.push(...source.records);\n }\n if (Array.isArray(source.shapes)) {\n candidates.push(...source.shapes);\n }\n if (source.store && typeof source.store === \"object\") {\n candidates.push(...Object.values(source.store as Record<string, unknown>));\n }\n if (source.document && typeof source.document === \"object\") {\n const documentRecord = source.document as Record<string, unknown>;\n if (Array.isArray(documentRecord.shapes)) {\n candidates.push(...documentRecord.shapes);\n }\n }\n\n return candidates.filter((item): item is TldrawShape => {\n if (!item || typeof item !== \"object\") {\n return false;\n }\n const record = item as Record<string, unknown>;\n return record.typeName === \"shape\" || String(record.id || \"\").startsWith(\"shape:\");\n });\n}\n\nfunction renderTldrawShape(svg: SVGSVGElement, shape: TldrawShape): void {\n const props = shape.props || {};\n const type = String(shape.type || props.type || \"\");\n const x = finiteNumber(shape.x, 0);\n const y = finiteNumber(shape.y, 0);\n const width = Math.max(1, finiteNumber(props.w, finiteNumber(props.width, 120)));\n const height = Math.max(1, finiteNumber(props.h, finiteNumber(props.height, 80)));\n const stroke = tldrawColor(String(props.color || shape.color || \"black\"));\n const fill = tldrawFill(String(props.fill || \"none\"), stroke);\n\n if (type === \"geo\" || type === \"frame\" || type === \"highlight\") {\n const geo = String(props.geo || (type === \"frame\" ? \"rectangle\" : \"rectangle\"));\n if (geo === \"ellipse\" || geo === \"oval\") {\n const ellipse = document.createElementNS(svg.namespaceURI, \"ellipse\");\n ellipse.setAttribute(\"cx\", String(x + width / 2));\n ellipse.setAttribute(\"cy\", String(y + height / 2));\n ellipse.setAttribute(\"rx\", String(width / 2));\n ellipse.setAttribute(\"ry\", String(height / 2));\n ellipse.setAttribute(\"fill\", fill);\n ellipse.setAttribute(\"stroke\", stroke);\n ellipse.setAttribute(\"stroke-width\", \"2\");\n svg.append(ellipse);\n } else if (geo === \"diamond\") {\n const polygon = document.createElementNS(svg.namespaceURI, \"polygon\");\n polygon.setAttribute(\n \"points\",\n `${x + width / 2},${y} ${x + width},${y + height / 2} ${x + width / 2},${y + height} ${x},${y + height / 2}`\n );\n polygon.setAttribute(\"fill\", fill);\n polygon.setAttribute(\"stroke\", stroke);\n polygon.setAttribute(\"stroke-width\", \"2\");\n svg.append(polygon);\n } else if (geo === \"triangle\") {\n const polygon = document.createElementNS(svg.namespaceURI, \"polygon\");\n polygon.setAttribute(\"points\", `${x + width / 2},${y} ${x + width},${y + height} ${x},${y + height}`);\n polygon.setAttribute(\"fill\", fill);\n polygon.setAttribute(\"stroke\", stroke);\n polygon.setAttribute(\"stroke-width\", \"2\");\n svg.append(polygon);\n } else {\n const rect = document.createElementNS(svg.namespaceURI, \"rect\");\n rect.setAttribute(\"x\", String(x));\n rect.setAttribute(\"y\", String(y));\n rect.setAttribute(\"width\", String(width));\n rect.setAttribute(\"height\", String(height));\n rect.setAttribute(\"rx\", type === \"frame\" ? \"0\" : \"8\");\n rect.setAttribute(\"fill\", fill);\n rect.setAttribute(\"stroke\", stroke);\n rect.setAttribute(\"stroke-width\", \"2\");\n svg.append(rect);\n }\n appendTldrawText(svg, String(props.text || \"\"), x + 12, y + 24, stroke);\n } else if (type === \"text\" || type === \"note\") {\n if (type === \"note\") {\n const note = document.createElementNS(svg.namespaceURI, \"rect\");\n note.setAttribute(\"x\", String(x));\n note.setAttribute(\"y\", String(y));\n note.setAttribute(\"width\", String(width));\n note.setAttribute(\"height\", String(height));\n note.setAttribute(\"rx\", \"6\");\n note.setAttribute(\"fill\", tldrawColor(String(props.color || \"yellow\"), 0.24));\n note.setAttribute(\"stroke\", stroke);\n svg.append(note);\n }\n appendTldrawText(svg, String(props.text || \"\"), x, y + 18, stroke);\n } else if (type === \"arrow\" || type === \"line\") {\n renderTldrawLine(svg, shape, stroke);\n } else if (type === \"draw\") {\n renderTldrawDraw(svg, shape, stroke);\n } else {\n const rect = document.createElementNS(svg.namespaceURI, \"rect\");\n rect.setAttribute(\"x\", String(x));\n rect.setAttribute(\"y\", String(y));\n rect.setAttribute(\"width\", String(width));\n rect.setAttribute(\"height\", String(height));\n rect.setAttribute(\"fill\", \"transparent\");\n rect.setAttribute(\"stroke\", stroke);\n rect.setAttribute(\"stroke-dasharray\", \"6 4\");\n svg.append(rect);\n appendTldrawText(svg, type || \"shape\", x + 8, y + 20, stroke);\n }\n}\n\nfunction renderTldrawLine(svg: SVGSVGElement, shape: TldrawShape, stroke: string): void {\n const props = shape.props || {};\n const x = finiteNumber(shape.x, 0);\n const y = finiteNumber(shape.y, 0);\n const start = pointFromValue(props.start, { x: 0, y: 0 });\n const end = pointFromValue(props.end, {\n x: finiteNumber(props.w, finiteNumber(props.width, 120)),\n y: finiteNumber(props.h, finiteNumber(props.height, 0))\n });\n const line = document.createElementNS(svg.namespaceURI, \"line\");\n line.setAttribute(\"x1\", String(x + start.x));\n line.setAttribute(\"y1\", String(y + start.y));\n line.setAttribute(\"x2\", String(x + end.x));\n line.setAttribute(\"y2\", String(y + end.y));\n line.setAttribute(\"stroke\", stroke);\n line.setAttribute(\"stroke-width\", \"3\");\n line.setAttribute(\"stroke-linecap\", \"round\");\n svg.append(line);\n if (String(shape.type || \"\") === \"arrow\") {\n appendArrowHead(svg, x + start.x, y + start.y, x + end.x, y + end.y, stroke);\n }\n}\n\nfunction renderTldrawDraw(svg: SVGSVGElement, shape: TldrawShape, stroke: string): void {\n const props = shape.props || {};\n const x = finiteNumber(shape.x, 0);\n const y = finiteNumber(shape.y, 0);\n const points = extractTldrawDrawPoints(props.segments);\n if (points.length < 2) {\n return;\n }\n const polyline = document.createElementNS(svg.namespaceURI, \"polyline\");\n polyline.setAttribute(\"points\", points.map((point) => `${x + point.x},${y + point.y}`).join(\" \"));\n polyline.setAttribute(\"fill\", \"none\");\n polyline.setAttribute(\"stroke\", stroke);\n polyline.setAttribute(\"stroke-width\", \"3\");\n polyline.setAttribute(\"stroke-linecap\", \"round\");\n polyline.setAttribute(\"stroke-linejoin\", \"round\");\n svg.append(polyline);\n}\n\nfunction appendTldrawText(svg: SVGSVGElement, text: string, x: number, y: number, fill: string): void {\n if (!text.trim()) {\n return;\n }\n const textNode = document.createElementNS(svg.namespaceURI, \"text\");\n textNode.setAttribute(\"x\", String(x));\n textNode.setAttribute(\"y\", String(y));\n textNode.setAttribute(\"fill\", fill);\n textNode.setAttribute(\"font-size\", \"16\");\n textNode.setAttribute(\"font-family\", \"Inter, ui-sans-serif, system-ui, sans-serif\");\n for (const [index, line] of text.split(/\\r?\\n/).entries()) {\n const span = document.createElementNS(svg.namespaceURI, \"tspan\");\n span.setAttribute(\"x\", String(x));\n span.setAttribute(\"dy\", index === 0 ? \"0\" : \"1.3em\");\n span.textContent = line;\n textNode.append(span);\n }\n svg.append(textNode);\n}\n\nfunction appendArrowHead(\n svg: SVGSVGElement,\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n fill: string,\n type = \"arrow\"\n): void {\n const angle = Math.atan2(y2 - y1, x2 - x1);\n const size = 10;\n if (type === \"bar\") {\n const line = document.createElementNS(SVG_NS, \"line\");\n const dx = Math.sin(angle) * size * 0.65;\n const dy = Math.cos(angle) * size * 0.65;\n applySvgAttrs(line, {\n x1: x2 - dx,\n y1: y2 + dy,\n x2: x2 + dx,\n y2: y2 - dy,\n stroke: fill,\n \"stroke-width\": 2,\n \"stroke-linecap\": \"round\"\n });\n svg.append(line);\n return;\n }\n if (type === \"dot\" || type === \"circle\") {\n const circle = document.createElementNS(SVG_NS, \"circle\");\n applySvgAttrs(circle, { cx: x2, cy: y2, r: size * 0.42, fill });\n svg.append(circle);\n return;\n }\n const points = [\n [x2, y2],\n [x2 - size * Math.cos(angle - Math.PI / 6), y2 - size * Math.sin(angle - Math.PI / 6)],\n [x2 - size * Math.cos(angle + Math.PI / 6), y2 - size * Math.sin(angle + Math.PI / 6)]\n ];\n const polygon = document.createElementNS(svg.namespaceURI, \"polygon\");\n polygon.setAttribute(\"points\", points.map((point) => point.join(\",\")).join(\" \"));\n polygon.setAttribute(\"fill\", type === \"triangle_outline\" || type === \"arrow_outline\" ? \"transparent\" : fill);\n polygon.setAttribute(\"stroke\", fill);\n svg.append(polygon);\n}\n\nfunction createTldrawViewBox(shapes: TldrawShape[]): string {\n if (shapes.length === 0) {\n return \"0 0 800 500\";\n }\n const bounds = shapes.map((shape) => {\n const props = shape.props || {};\n const x = finiteNumber(shape.x, 0);\n const y = finiteNumber(shape.y, 0);\n const width = Math.max(1, finiteNumber(props.w, finiteNumber(props.width, 120)));\n const height = Math.max(1, finiteNumber(props.h, finiteNumber(props.height, 80)));\n return { x, y, width, height };\n });\n const minX = Math.min(...bounds.map((bound) => bound.x)) - 40;\n const minY = Math.min(...bounds.map((bound) => bound.y)) - 40;\n const maxX = Math.max(...bounds.map((bound) => bound.x + bound.width)) + 40;\n const maxY = Math.max(...bounds.map((bound) => bound.y + bound.height)) + 40;\n return `${minX} ${minY} ${Math.max(240, maxX - minX)} ${Math.max(180, maxY - minY)}`;\n}\n\nfunction extractTldrawDrawPoints(value: unknown): Array<{ x: number; y: number }> {\n if (!Array.isArray(value)) {\n return [];\n }\n return value.flatMap((segment) => {\n if (!segment || typeof segment !== \"object\") {\n return [];\n }\n const points = (segment as Record<string, unknown>).points;\n if (!Array.isArray(points)) {\n return [];\n }\n return points.map((point) => pointFromValue(point, { x: 0, y: 0 }));\n });\n}\n\nfunction pointFromValue(value: unknown, fallback: { x: number; y: number }): { x: number; y: number } {\n if (Array.isArray(value)) {\n return {\n x: finiteNumber(value[0], fallback.x),\n y: finiteNumber(value[1], fallback.y)\n };\n }\n if (!value || typeof value !== \"object\") {\n return fallback;\n }\n const point = value as Record<string, unknown>;\n return {\n x: finiteNumber(point.x, fallback.x),\n y: finiteNumber(point.y, fallback.y)\n };\n}\n\nfunction finiteNumber(value: unknown, fallback: number): number {\n const parsed = typeof value === \"number\" ? value : Number(value);\n return Number.isFinite(parsed) ? parsed : fallback;\n}\n\nfunction tldrawFill(fill: string, stroke: string): string {\n return fill === \"solid\" || fill === \"semi\" || fill === \"pattern\" ? tldrawColor(stroke, 0.14) : \"transparent\";\n}\n\nfunction tldrawColor(value: string, alpha = 1): string {\n const colors: Record<string, [number, number, number]> = {\n black: [17, 24, 39],\n grey: [100, 116, 139],\n light: [203, 213, 225],\n red: [220, 38, 38],\n orange: [234, 88, 12],\n yellow: [202, 138, 4],\n green: [22, 163, 74],\n blue: [37, 99, 235],\n violet: [124, 58, 237],\n purple: [147, 51, 234],\n pink: [219, 39, 119]\n };\n if (value.startsWith(\"#\") || value.startsWith(\"rgb\")) {\n return value;\n }\n const color = colors[value] || colors.black;\n return alpha >= 1 ? `rgb(${color.join(\" \")})` : `rgb(${color.join(\" \")} / ${alpha})`;\n}\n\nfunction renderDrawio(panel: HTMLElement, text: string): void {\n const diagrams = extractDrawioDiagrams(text);\n if (diagrams.length === 0) {\n renderRawDrawing(panel, \"Draw.io\", text);\n return;\n }\n\n for (const [index, diagram] of diagrams.entries()) {\n const section = createSection(`Draw.io 图形预览 ${index + 1}`);\n const shapes = parseDrawioShapes(diagram);\n if (shapes.length > 0) {\n section.append(createDrawingSummary(shapes.map(drawioSummaryItem)));\n const svg = document.createElementNS(SVG_NS, \"svg\");\n svg.setAttribute(\"class\", \"ofv-svg-stage\");\n svg.setAttribute(\"viewBox\", createDrawioViewBox(shapes));\n for (const shape of shapes) {\n renderDrawioShape(svg, shape);\n }\n section.append(svg);\n }\n\n const details = document.createElement(\"details\");\n details.className = \"ofv-details\";\n const summary = document.createElement(\"summary\");\n summary.textContent = shapes.length > 0 ? `原始 XML 摘要(${shapes.length} cells)` : \"Draw.io 原始内容\";\n const pre = document.createElement(\"pre\");\n pre.className = \"ofv-text-block\";\n pre.textContent = diagram.slice(0, 30000);\n details.append(summary, pre);\n section.append(details);\n panel.append(section);\n }\n}\n\ntype DrawioShape = {\n id: string;\n value: string;\n style: Record<string, string>;\n vertex: boolean;\n edge: boolean;\n x: number;\n y: number;\n width: number;\n height: number;\n source?: string;\n target?: string;\n points?: Array<{ x: number; y: number }>;\n};\n\nfunction extractDrawioDiagrams(text: string): string[] {\n const matches = [...text.matchAll(/<diagram[^>]*>([\\s\\S]*?)<\\/diagram>/g)].map((match) => decodeDrawioDiagram(match[1] || \"\"));\n if (matches.length > 0) {\n return matches;\n }\n return text.includes(\"<mxGraphModel\") ? [text] : [];\n}\n\nfunction parseDrawioShapes(xml: string): DrawioShape[] {\n const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n if (doc.querySelector(\"parsererror\")) {\n return [];\n }\n return Array.from(doc.querySelectorAll(\"mxCell\")).flatMap((cell) => {\n const geometry = Array.from(cell.children).find((child) => child.localName === \"mxGeometry\");\n const vertex = cell.getAttribute(\"vertex\") === \"1\";\n const edge = cell.getAttribute(\"edge\") === \"1\";\n if (!vertex && !edge) {\n return [];\n }\n const shape: DrawioShape = {\n id: cell.getAttribute(\"id\") || \"\",\n value: decodeXmlText(cell.getAttribute(\"value\") || \"\"),\n style: parseDrawioStyle(cell.getAttribute(\"style\") || \"\"),\n vertex,\n edge,\n x: finiteNumber(geometry?.getAttribute(\"x\"), 0),\n y: finiteNumber(geometry?.getAttribute(\"y\"), 0),\n width: Math.max(1, finiteNumber(geometry?.getAttribute(\"width\"), 120)),\n height: Math.max(1, finiteNumber(geometry?.getAttribute(\"height\"), edge ? 1 : 60)),\n source: cell.getAttribute(\"source\") || undefined,\n target: cell.getAttribute(\"target\") || undefined\n };\n\n if (edge && geometry) {\n const points = Array.from(geometry.children)\n .filter((child) => child.localName === \"mxPoint\")\n .map((point) => ({\n x: finiteNumber(point.getAttribute(\"x\"), 0),\n y: finiteNumber(point.getAttribute(\"y\"), 0)\n }));\n if (points.length >= 2) {\n shape.x = points[0].x;\n shape.y = points[0].y;\n shape.width = points[points.length - 1].x - points[0].x;\n shape.height = points[points.length - 1].y - points[0].y;\n shape.points = points;\n }\n }\n return [shape];\n });\n}\n\nfunction parseDrawioStyle(style: string): Record<string, string> {\n const result: Record<string, string> = {};\n const imageMatch = style.match(/(?:^|;)image=(data:image\\/[^;]+;base64,[^;]+)/i);\n const protectedStyle = imageMatch ? style.replace(imageMatch[0], imageMatch[0].startsWith(\";\") ? \";image=__OFV_IMAGE__\" : \"image=__OFV_IMAGE__\") : style;\n for (const part of protectedStyle.split(\";\")) {\n if (!part) {\n continue;\n }\n const separator = part.indexOf(\"=\");\n const key = separator >= 0 ? part.slice(0, separator) : part;\n const value = separator >= 0 ? part.slice(separator + 1) : \"1\";\n if (key) {\n result[key] = value === \"__OFV_IMAGE__\" && imageMatch ? imageMatch[1] : value;\n }\n }\n return result;\n}\n\nfunction createDrawioViewBox(shapes: DrawioShape[]): string {\n const bounds = shapes.map((shape) => ({\n x: Math.min(shape.x, shape.x + shape.width),\n y: Math.min(shape.y, shape.y + shape.height),\n width: Math.abs(shape.width),\n height: Math.abs(shape.height)\n }));\n const minX = Math.min(...bounds.map((bound) => bound.x)) - 40;\n const minY = Math.min(...bounds.map((bound) => bound.y)) - 40;\n const maxX = Math.max(...bounds.map((bound) => bound.x + bound.width)) + 40;\n const maxY = Math.max(...bounds.map((bound) => bound.y + bound.height)) + 40;\n return `${minX} ${minY} ${Math.max(320, maxX - minX)} ${Math.max(240, maxY - minY)}`;\n}\n\nfunction renderDrawioShape(svg: SVGSVGElement, shape: DrawioShape): void {\n const stroke = drawioColor(shape.style.strokeColor, \"#334155\");\n const fill = shape.style.fillColor === \"none\" ? \"transparent\" : drawioColor(shape.style.fillColor, \"#f8fafc\");\n const strokeWidth = finiteNumber(shape.style.strokeWidth, 1.5);\n const opacity = Math.max(0, Math.min(1, finiteNumber(shape.style.opacity, 100) / 100));\n const strokeAttrs = drawioStrokeAttrs(shape.style, strokeWidth);\n const transform = drawioTransform(shape);\n\n if (shape.edge) {\n const points = shape.points || [\n { x: shape.x, y: shape.y },\n { x: shape.x + shape.width, y: shape.y + shape.height }\n ];\n if (points.length > 2) {\n const polyline = document.createElementNS(SVG_NS, \"polyline\");\n applySvgAttrs(polyline, {\n points: points.map((point) => `${point.x},${point.y}`).join(\" \"),\n fill: \"none\",\n stroke,\n ...strokeAttrs,\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n opacity\n });\n svg.append(polyline);\n } else {\n const line = document.createElementNS(SVG_NS, \"line\");\n applySvgAttrs(line, {\n x1: points[0].x,\n y1: points[0].y,\n x2: points[1].x,\n y2: points[1].y,\n stroke,\n ...strokeAttrs,\n \"stroke-linecap\": \"round\",\n opacity\n });\n svg.append(line);\n }\n if (shape.style.endArrow && shape.style.endArrow !== \"none\") {\n const tail = points[Math.max(0, points.length - 2)];\n const head = points[points.length - 1];\n appendArrowHead(svg, tail.x, tail.y, head.x, head.y, stroke);\n }\n return;\n }\n\n const shapeName = drawioShapeName(shape.style);\n if (shapeName === \"image\") {\n renderDrawioImage(svg, shape, opacity, transform);\n } else if (shapeName === \"ellipse\") {\n const ellipse = document.createElementNS(SVG_NS, \"ellipse\");\n applySvgAttrs(ellipse, {\n cx: shape.x + shape.width / 2,\n cy: shape.y + shape.height / 2,\n rx: shape.width / 2,\n ry: shape.height / 2,\n fill,\n stroke,\n ...strokeAttrs,\n opacity,\n transform\n });\n svg.append(ellipse);\n } else if (shapeName === \"rhombus\" || shapeName === \"diamond\") {\n const polygon = document.createElementNS(SVG_NS, \"polygon\");\n applySvgAttrs(polygon, {\n points: `${shape.x + shape.width / 2},${shape.y} ${shape.x + shape.width},${shape.y + shape.height / 2} ${shape.x + shape.width / 2},${shape.y + shape.height} ${shape.x},${shape.y + shape.height / 2}`,\n fill,\n stroke,\n ...strokeAttrs,\n opacity,\n transform\n });\n svg.append(polygon);\n } else if (shapeName === \"hexagon\" || shapeName === \"process\") {\n const polygon = document.createElementNS(SVG_NS, \"polygon\");\n const inset = shapeName === \"process\" ? shape.width * 0.12 : shape.width * 0.22;\n applySvgAttrs(polygon, {\n points:\n shapeName === \"process\"\n ? `${shape.x},${shape.y} ${shape.x + shape.width - inset},${shape.y} ${shape.x + shape.width},${shape.y + shape.height / 2} ${shape.x + shape.width - inset},${shape.y + shape.height} ${shape.x},${shape.y + shape.height}`\n : `${shape.x + inset},${shape.y} ${shape.x + shape.width - inset},${shape.y} ${shape.x + shape.width},${shape.y + shape.height / 2} ${shape.x + shape.width - inset},${shape.y + shape.height} ${shape.x + inset},${shape.y + shape.height} ${shape.x},${shape.y + shape.height / 2}`,\n fill,\n stroke,\n ...strokeAttrs,\n opacity,\n transform\n });\n svg.append(polygon);\n } else if (shapeName === \"triangle\") {\n const polygon = document.createElementNS(SVG_NS, \"polygon\");\n applySvgAttrs(polygon, {\n points: `${shape.x + shape.width / 2},${shape.y} ${shape.x + shape.width},${shape.y + shape.height} ${shape.x},${shape.y + shape.height}`,\n fill,\n stroke,\n ...strokeAttrs,\n opacity,\n transform\n });\n svg.append(polygon);\n } else if (shapeName === \"actor\" || shapeName === \"umlActor\") {\n renderDrawioActor(svg, shape, stroke, strokeAttrs, opacity, transform);\n } else if (shapeName === \"document\") {\n const path = document.createElementNS(SVG_NS, \"path\");\n applySvgAttrs(path, {\n d: createDrawioDocumentPath(shape.x, shape.y, shape.width, shape.height),\n fill,\n stroke,\n ...strokeAttrs,\n opacity,\n transform\n });\n svg.append(path);\n } else if (shapeName === \"cylinder\") {\n const group = document.createElementNS(SVG_NS, \"g\");\n applySvgAttrs(group, { transform });\n const body = document.createElementNS(SVG_NS, \"rect\");\n applySvgAttrs(body, {\n x: shape.x,\n y: shape.y + Math.min(18, shape.height * 0.18) / 2,\n width: shape.width,\n height: shape.height - Math.min(18, shape.height * 0.18),\n fill,\n stroke,\n ...strokeAttrs,\n opacity\n });\n const top = document.createElementNS(SVG_NS, \"ellipse\");\n const bottom = document.createElementNS(SVG_NS, \"ellipse\");\n const capHeight = Math.min(18, shape.height * 0.18);\n applySvgAttrs(top, {\n cx: shape.x + shape.width / 2,\n cy: shape.y + capHeight / 2,\n rx: shape.width / 2,\n ry: capHeight / 2,\n fill,\n stroke,\n ...strokeAttrs,\n opacity\n });\n applySvgAttrs(bottom, {\n cx: shape.x + shape.width / 2,\n cy: shape.y + shape.height - capHeight / 2,\n rx: shape.width / 2,\n ry: capHeight / 2,\n fill: \"none\",\n stroke,\n ...strokeAttrs,\n opacity\n });\n group.append(body, top, bottom);\n svg.append(group);\n } else if (shapeName === \"cloud\") {\n const path = document.createElementNS(SVG_NS, \"path\");\n applySvgAttrs(path, {\n d: createDrawioCloudPath(shape.x, shape.y, shape.width, shape.height),\n fill,\n stroke,\n ...strokeAttrs,\n opacity,\n transform\n });\n svg.append(path);\n } else if (shapeName === \"swimlane\") {\n const rect = document.createElementNS(SVG_NS, \"rect\");\n applySvgAttrs(rect, {\n x: shape.x,\n y: shape.y,\n width: shape.width,\n height: shape.height,\n rx: shape.style.rounded === \"1\" ? Math.min(12, shape.height / 5) : 0,\n fill,\n stroke,\n ...strokeAttrs,\n opacity,\n transform\n });\n const header = document.createElementNS(SVG_NS, \"rect\");\n const headerHeight = Math.min(shape.height, finiteNumber(shape.style.startSize, 30));\n applySvgAttrs(header, {\n x: shape.x,\n y: shape.y,\n width: shape.width,\n height: headerHeight,\n rx: shape.style.rounded === \"1\" ? Math.min(12, headerHeight / 3) : 0,\n fill: drawioColor(shape.style.swimlaneFillColor || shape.style.fillColor, \"#e2e8f0\"),\n stroke,\n ...strokeAttrs,\n opacity,\n transform\n });\n svg.append(rect, header);\n } else {\n const rect = document.createElementNS(SVG_NS, \"rect\");\n applySvgAttrs(rect, {\n x: shape.x,\n y: shape.y,\n width: shape.width,\n height: shape.height,\n rx: shape.style.rounded === \"1\" ? Math.min(12, shape.height / 5) : 0,\n fill,\n stroke,\n ...strokeAttrs,\n opacity,\n transform\n });\n svg.append(rect);\n }\n\n appendDrawioText(\n svg,\n shape.value,\n shape.x + shape.width / 2,\n shape.y + shape.height / 2,\n drawioColor(shape.style.fontColor, \"#111827\"),\n shape.style,\n transform\n );\n}\n\nfunction drawioShapeName(style: Record<string, string>): string {\n if (style.shape) {\n return style.shape;\n }\n if (style.image) {\n return \"image\";\n }\n if (style.ellipse === \"1\") {\n return \"ellipse\";\n }\n if (style.rhombus === \"1\") {\n return \"rhombus\";\n }\n if (style.swimlane === \"1\") {\n return \"swimlane\";\n }\n if (style.text === \"1\") {\n return \"text\";\n }\n return \"rectangle\";\n}\n\nfunction renderDrawioImage(svg: SVGSVGElement, shape: DrawioShape, opacity: number, transform: string): void {\n const src = shape.style.image || \"\";\n if (/^data:image\\/(?:png|jpe?g|gif|webp|svg\\+xml);base64,/i.test(src)) {\n const image = document.createElementNS(SVG_NS, \"image\");\n applySvgAttrs(image, {\n x: shape.x,\n y: shape.y,\n width: shape.width,\n height: shape.height,\n href: src,\n preserveAspectRatio: \"xMidYMid meet\",\n opacity,\n transform\n });\n svg.append(image);\n return;\n }\n const rect = document.createElementNS(SVG_NS, \"rect\");\n applySvgAttrs(rect, {\n x: shape.x,\n y: shape.y,\n width: shape.width,\n height: shape.height,\n rx: 6,\n fill: \"#f8fafc\",\n stroke: \"#94a3b8\",\n \"stroke-dasharray\": \"6 4\",\n opacity,\n transform\n });\n svg.append(rect);\n}\n\nfunction renderDrawioActor(\n svg: SVGSVGElement,\n shape: DrawioShape,\n stroke: string,\n strokeAttrs: Record<string, string | number>,\n opacity: number,\n transform: string\n): void {\n const group = document.createElementNS(SVG_NS, \"g\");\n applySvgAttrs(group, { opacity, transform });\n const cx = shape.x + shape.width / 2;\n const headRadius = Math.min(shape.width, shape.height) * 0.15;\n const head = document.createElementNS(SVG_NS, \"circle\");\n applySvgAttrs(head, {\n cx,\n cy: shape.y + headRadius * 1.4,\n r: headRadius,\n fill: \"transparent\",\n stroke,\n ...strokeAttrs\n });\n const body = createSvgLine(cx, shape.y + headRadius * 2.4, cx, shape.y + shape.height * 0.68, stroke, strokeAttrs);\n const arms = createSvgLine(shape.x + shape.width * 0.22, shape.y + shape.height * 0.42, shape.x + shape.width * 0.78, shape.y + shape.height * 0.42, stroke, strokeAttrs);\n const leftLeg = createSvgLine(cx, shape.y + shape.height * 0.68, shape.x + shape.width * 0.25, shape.y + shape.height, stroke, strokeAttrs);\n const rightLeg = createSvgLine(cx, shape.y + shape.height * 0.68, shape.x + shape.width * 0.75, shape.y + shape.height, stroke, strokeAttrs);\n group.append(head, body, arms, leftLeg, rightLeg);\n svg.append(group);\n}\n\nfunction createSvgLine(\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n stroke: string,\n strokeAttrs: Record<string, string | number>\n): SVGLineElement {\n const line = document.createElementNS(SVG_NS, \"line\");\n applySvgAttrs(line, {\n x1,\n y1,\n x2,\n y2,\n stroke,\n ...strokeAttrs,\n \"stroke-linecap\": \"round\"\n });\n return line;\n}\n\nfunction createDrawioDocumentPath(x: number, y: number, width: number, height: number): string {\n const wave = Math.min(18, height * 0.18);\n return [\n `M ${x} ${y}`,\n `H ${x + width}`,\n `V ${y + height - wave}`,\n `C ${x + width * 0.72} ${y + height - wave * 2}, ${x + width * 0.58} ${y + height + wave * 0.5}, ${x + width * 0.34} ${y + height - wave * 0.4}`,\n `C ${x + width * 0.18} ${y + height - wave}, ${x + width * 0.08} ${y + height - wave * 0.2}, ${x} ${y + height - wave * 0.45}`,\n \"Z\"\n ].join(\" \");\n}\n\nfunction drawioStrokeAttrs(style: Record<string, string>, strokeWidth: number): Record<string, string | number> {\n const attrs: Record<string, string | number> = {\n \"stroke-width\": strokeWidth\n };\n if (style.dashed === \"1\") {\n attrs[\"stroke-dasharray\"] = style.dashPattern || `${strokeWidth * 4} ${strokeWidth * 3}`;\n }\n return attrs;\n}\n\nfunction drawioTransform(shape: DrawioShape): string {\n const rotation = finiteNumber(shape.style.rotation, 0);\n if (!rotation) {\n return \"\";\n }\n return `rotate(${rotation} ${shape.x + shape.width / 2} ${shape.y + shape.height / 2})`;\n}\n\nfunction createDrawioCloudPath(x: number, y: number, width: number, height: number): string {\n const cx = x + width / 2;\n const cy = y + height / 2;\n return [\n `M ${x + width * 0.24} ${y + height * 0.72}`,\n `C ${x - width * 0.02} ${y + height * 0.68}, ${x + width * 0.02} ${y + height * 0.34}, ${x + width * 0.28} ${y + height * 0.38}`,\n `C ${x + width * 0.32} ${y + height * 0.12}, ${cx} ${y + height * 0.06}, ${x + width * 0.62} ${y + height * 0.26}`,\n `C ${x + width * 0.86} ${y + height * 0.2}, ${x + width * 1.02} ${y + height * 0.42}, ${x + width * 0.88} ${y + height * 0.62}`,\n `C ${x + width * 0.86} ${y + height * 0.84}, ${x + width * 0.42} ${y + height * 0.9}, ${x + width * 0.24} ${y + height * 0.72}`,\n \"Z\"\n ].join(\" \");\n}\n\nfunction appendDrawioText(\n svg: SVGSVGElement,\n text: string,\n x: number,\n y: number,\n fill: string,\n style: Record<string, string> = {},\n transform = \"\"\n): void {\n if (!text.trim()) {\n return;\n }\n const lines = normalizeDrawioLabel(text).split(/\\r?\\n/).filter(Boolean);\n if (lines.length === 0) {\n return;\n }\n const textNode = document.createElementNS(SVG_NS, \"text\");\n const align = style.align || \"center\";\n const fontStyle = Number.parseInt(style.fontStyle || \"0\", 10);\n applySvgAttrs(textNode, {\n x: align === \"left\" ? x - finiteNumber(style.spacingLeft, 0) : align === \"right\" ? x + finiteNumber(style.spacingRight, 0) : x,\n y,\n fill,\n \"font-size\": finiteNumber(style.fontSize, 14),\n \"font-family\": \"Inter, ui-sans-serif, system-ui, sans-serif\",\n \"font-weight\": fontStyle & 1 ? \"700\" : undefined,\n \"font-style\": fontStyle & 2 ? \"italic\" : undefined,\n \"text-decoration\": fontStyle & 4 ? \"underline\" : undefined,\n \"text-anchor\": align === \"left\" ? \"start\" : align === \"right\" ? \"end\" : \"middle\",\n \"dominant-baseline\": \"middle\",\n transform\n });\n const firstDy = lines.length > 1 ? `${-0.55 * (lines.length - 1)}em` : \"0\";\n for (const [index, line] of lines.entries()) {\n const span = document.createElementNS(SVG_NS, \"tspan\");\n span.setAttribute(\"x\", String(x));\n span.setAttribute(\"dy\", index === 0 ? firstDy : \"1.2em\");\n span.textContent = line;\n textNode.append(span);\n }\n svg.append(textNode);\n}\n\nfunction normalizeDrawioLabel(text: string): string {\n const decoded = decodeXmlText(text);\n return decoded\n .replace(/<br\\s*\\/?>/gi, \"\\n\")\n .replace(/<\\/(?:div|p|li|h\\d)>/gi, \"\\n\")\n .replace(/<[^>]+>/g, \"\")\n .split(/\\r?\\n/)\n .map((line) => decodeXmlText(line).replace(/\\u00a0/g, \" \").replace(/[ \\t]+/g, \" \").trim())\n .filter(Boolean)\n .join(\"\\n\");\n}\n\nfunction drawioColor(value: string | undefined, fallback: string): string {\n if (!value || value === \"default\") {\n return fallback;\n }\n return value.startsWith(\"#\") ? value : `#${value}`;\n}\n\nfunction decodeXmlText(value: string): string {\n const textarea = document.createElement(\"textarea\");\n textarea.innerHTML = value;\n return textarea.value;\n}\n\nfunction renderRawDrawing(panel: HTMLElement, extension: string, text: string): void {\n const section = createSection(`${extension} 基础预览`);\n const pre = document.createElement(\"pre\");\n pre.className = \"ofv-text-block\";\n pre.textContent = text.slice(0, 30000);\n section.append(pre);\n panel.append(section);\n}\n\nfunction renderDrawingParseFallback(panel: HTMLElement, extension: string, text: string, error: unknown): void {\n panel.replaceChildren();\n const section = createSection(`${extension} 解析失败`);\n const message = document.createElement(\"p\");\n message.textContent = error instanceof Error ? error.message : String(error);\n const pre = document.createElement(\"pre\");\n pre.className = \"ofv-text-block\";\n pre.textContent = text.slice(0, 30000) || \"文件内容为空。\";\n section.append(message, pre);\n panel.append(section);\n}\n\nfunction decodeDrawioDiagram(value: string): string {\n try {\n const decoded = decodeURIComponent(escape(atob(value)));\n return pako.inflateRaw(Uint8Array.from(decoded, (char) => char.charCodeAt(0)), {\n to: \"string\"\n }) as string;\n } catch {\n return value;\n }\n}\n","import type { PreviewContext, PreviewPlugin } from \"../types\";\nimport { createPanel, createSection, readArrayBuffer, readTextFile, resolveFormat } from \"./utils\";\n\ninterface LayeredValue<T> {\n layer: string;\n value: T;\n}\n\nconst cadExtensions = new Set([\n \"dxf\",\n \"dwg\",\n \"dwf\",\n \"step\",\n \"stp\",\n \"iges\",\n \"igs\",\n \"ifc\",\n \"sat\",\n \"sab\",\n \"x_t\",\n \"x_b\",\n \"3dm\",\n \"skp\",\n \"sldprt\",\n \"sldasm\"\n]);\nconst cadMimeTypes = new Set([\n \"application/acad\",\n \"application/dxf\",\n \"application/x-dxf\",\n \"image/vnd.dxf\",\n \"model/vnd.dwf\",\n \"model/step\",\n \"application/step\",\n \"application/iges\",\n \"application/x-step\",\n \"application/sat\",\n \"application/sab\",\n \"application/x-parasolid\",\n \"model/vnd.3dm\",\n \"application/vnd.sketchup.skp\",\n \"application/sldworks\"\n]);\nconst cadMimeFormatMap: Record<string, string> = {\n \"application/acad\": \"dwg\",\n \"application/dxf\": \"dxf\",\n \"application/x-dxf\": \"dxf\",\n \"image/vnd.dxf\": \"dxf\",\n \"model/vnd.dwf\": \"dwf\",\n \"model/step\": \"step\",\n \"application/step\": \"step\",\n \"application/iges\": \"iges\",\n \"application/x-step\": \"ifc\",\n \"application/sat\": \"sat\",\n \"application/sab\": \"sab\",\n \"application/x-parasolid\": \"x_t\",\n \"model/vnd.3dm\": \"3dm\",\n \"application/vnd.sketchup.skp\": \"skp\",\n \"application/sldworks\": \"sldprt\"\n};\n\nexport function cadPlugin(): PreviewPlugin {\n return {\n name: \"cad\",\n match(file) {\n return cadExtensions.has(file.extension) || cadMimeTypes.has(file.mimeType);\n },\n async render(ctx) {\n const panel = createPanel(\"ofv-cad\");\n ctx.viewport.append(panel);\n\n const extension = resolveFormat(ctx.file, cadMimeFormatMap);\n if (extension === \"step\" || extension === \"stp\") {\n renderStep(panel, await readTextFile(ctx.file), extension);\n return { destroy: () => panel.remove() };\n }\n if (extension === \"iges\" || extension === \"igs\") {\n renderIges(panel, await readTextFile(ctx.file), extension);\n return { destroy: () => panel.remove() };\n }\n if (extension === \"ifc\") {\n renderIfc(panel, await readTextFile(ctx.file));\n return { destroy: () => panel.remove() };\n }\n if (extension === \"dwg\" || extension === \"dwf\") {\n renderBinaryCad(panel, await readArrayBuffer(ctx.file), extension, ctx.file.name);\n return { destroy: () => panel.remove() };\n }\n if (extension !== \"dxf\") {\n const section = createSection(\"CAD 基础预览\");\n section.append(`.${extension || \"cad\"} 已识别为图纸/工程格式,当前前端插件优先渲染 DXF。该格式建议接入服务端转换或 WASM 专用引擎。`);\n panel.append(section);\n return { destroy: () => panel.remove() };\n }\n\n const dxf = await readTextFile(ctx.file);\n const viewer = renderDxf(panel, dxf, ctx);\n return {\n canCommand(command) {\n return viewer.canCommand(command);\n },\n command(command) {\n return viewer.command(command);\n },\n destroy() {\n panel.remove();\n }\n };\n }\n };\n}\n\nfunction renderStep(panel: HTMLElement, text: string, extension: string): void {\n const records = parseStepRecords(text);\n const typeCounts = countBy(records.map((record) => record.type));\n const section = createSection(`${extension.toUpperCase()} 结构预览`);\n const note = document.createElement(\"p\");\n note.textContent = \"当前版本提取 STEP 文本实体、类型统计和关键几何参数。精确 B-Rep/曲面渲染建议后续接入 CAD 内核或服务端转换。\";\n\n const meta = document.createElement(\"div\");\n meta.className = \"ofv-cad-summary\";\n appendMeta(meta, \"实体\", records.length);\n appendMeta(meta, \"类型\", typeCounts.size);\n appendMeta(meta, \"点\", typeCounts.get(\"CARTESIAN_POINT\") || 0);\n appendMeta(meta, \"方向\", typeCounts.get(\"DIRECTION\") || 0);\n section.append(note, meta, createCadTypeList(typeCounts));\n\n const table = createCadEntityTable(\n records.slice(0, 200).map((record) => ({\n id: record.id,\n type: record.type,\n detail: summarizeStepRecord(record)\n }))\n );\n section.append(table);\n panel.append(section);\n}\n\nfunction renderIges(panel: HTMLElement, text: string, extension: string): void {\n const records = parseIgesRecords(text);\n const typeCounts = countBy(records.map((record) => record.type));\n const section = createSection(`${extension.toUpperCase()} 结构预览`);\n const note = document.createElement(\"p\");\n note.textContent = \"当前版本提取 IGES 参数区实体、类型统计和基础参数。精确曲线/曲面渲染建议后续接入 CAD 内核或服务端转换。\";\n\n const meta = document.createElement(\"div\");\n meta.className = \"ofv-cad-summary\";\n appendMeta(meta, \"实体\", records.length);\n appendMeta(meta, \"类型\", typeCounts.size);\n appendMeta(meta, \"点实体\", typeCounts.get(\"116\") || 0);\n appendMeta(meta, \"线实体\", typeCounts.get(\"110\") || 0);\n section.append(note, meta, createCadTypeList(typeCounts, \"类型号统计\"));\n\n const table = createCadEntityTable(\n records.slice(0, 200).map((record, index) => ({\n id: String(index + 1),\n type: igesTypeName(record.type),\n detail: record.params.slice(0, 8).join(\", \")\n }))\n );\n section.append(table);\n panel.append(section);\n}\n\nfunction renderIfc(panel: HTMLElement, text: string): void {\n const records = parseStepRecords(text);\n const typeCounts = countBy(records.map((record) => record.type));\n const section = createSection(\"IFC BIM 结构预览\");\n const note = document.createElement(\"p\");\n note.textContent = \"当前版本提取 IFC STEP 实体、BIM 层级和常见构件统计。几何网格、材质和属性集可后续接入 IfcOpenShell/IFC.js 增强。\";\n\n const meta = document.createElement(\"div\");\n meta.className = \"ofv-cad-summary\";\n appendMeta(meta, \"实体\", records.length);\n appendMeta(meta, \"类型\", typeCounts.size);\n appendMeta(meta, \"项目\", typeCounts.get(\"IFCPROJECT\") || 0);\n appendMeta(meta, \"建筑\", typeCounts.get(\"IFCBUILDING\") || 0);\n appendMeta(meta, \"楼层\", typeCounts.get(\"IFCBUILDINGSTOREY\") || 0);\n appendMeta(meta, \"空间\", typeCounts.get(\"IFCSPACE\") || 0);\n appendMeta(meta, \"构件\", countIfcElements(typeCounts));\n section.append(note, meta, createCadTypeList(typeCounts, \"IFC 实体统计\"));\n\n const hierarchy = createIfcHierarchy(records);\n if (hierarchy) {\n section.append(hierarchy);\n }\n\n const table = createCadEntityTable(\n records.slice(0, 240).map((record) => ({\n id: record.id,\n type: record.type,\n detail: summarizeIfcRecord(record)\n }))\n );\n section.append(table);\n panel.append(section);\n}\n\ntype StepRecord = {\n id: string;\n type: string;\n args: string;\n};\n\ntype IgesRecord = {\n type: string;\n params: string[];\n};\n\nfunction renderBinaryCad(panel: HTMLElement, arrayBuffer: ArrayBuffer, extension: string, fileName: string): void {\n const bytes = new Uint8Array(arrayBuffer);\n const section = createSection(`${extension.toUpperCase()} 文件预览`);\n const note = document.createElement(\"p\");\n note.textContent =\n extension === \"dwg\"\n ? \"DWG 是 AutoCAD 专有二进制格式,当前前端插件提供文件识别、版本提示和转换建议;几何渲染建议接入 ODA/LibreDWG/服务端转换。\"\n : \"DWF 是发布用图纸格式,当前前端插件提供容器识别和转换建议;高保真页面渲染建议接入专用解析器或服务端转换。\";\n\n const meta = document.createElement(\"div\");\n meta.className = \"ofv-cad-summary\";\n appendMeta(meta, \"文件\", fileName);\n appendMeta(meta, \"格式\", extension.toUpperCase());\n appendMeta(meta, \"大小\", formatBytes(bytes.byteLength));\n appendMeta(meta, \"签名\", byteSignature(bytes));\n appendMeta(meta, \"版本\", detectCadVersion(bytes, extension));\n appendMeta(meta, \"容器\", detectCadContainer(bytes));\n\n const actions = document.createElement(\"ol\");\n actions.className = \"ofv-cad-conversion\";\n const suggestions =\n extension === \"dwg\"\n ? [\n \"服务端使用 ODA File Converter / Teigha 将 DWG 转为 DXF、SVG 或 PDF。\",\n \"浏览器端可后续接入 LibreDWG WASM,但需处理字体、块参照、外部参照和许可证。\",\n \"若业务只需预览,建议转换为 PDF/SVG 后走现有 PDF 或图像预览链路。\"\n ]\n : [\n \"优先在服务端转换为 PDF/SVG,保留图层、页面和标注信息。\",\n \"若 DWF 为压缩容器,可后续读取 manifest/descriptor 再还原页面资源。\",\n \"若业务只需下载/归档,保留当前文件元信息和转换提示即可。\"\n ];\n for (const suggestion of suggestions) {\n const item = document.createElement(\"li\");\n item.textContent = suggestion;\n actions.append(item);\n }\n\n const preview = document.createElement(\"pre\");\n preview.className = \"ofv-text-block\";\n preview.textContent = hexPreview(bytes);\n\n section.append(note, meta, createBinaryCadProbe(bytes, extension), actions, preview);\n panel.append(section);\n}\n\nfunction createBinaryCadProbe(bytes: Uint8Array, extension: string): HTMLElement {\n const probe = probeBinaryCad(bytes);\n const details = document.createElement(\"details\");\n details.className = \"ofv-details ofv-cad-binary-probe\";\n details.open = true;\n const summary = document.createElement(\"summary\");\n summary.textContent = \"二进制结构探测\";\n const meta = document.createElement(\"div\");\n meta.className = \"ofv-archive-probe-meta\";\n appendMeta(meta, \"可读片段\", probe.tokens.length);\n appendMeta(meta, \"实体关键词\", formatCadKeywordCounts(probe.entityCounts));\n appendMeta(meta, \"图层线索\", String(probe.layerHints.length));\n appendMeta(meta, \"块/引用线索\", String(probe.blockHints.length));\n appendMeta(meta, \"外部引用\", String(probe.externalRefs.length));\n appendMeta(meta, \"解析级别\", extension === \"dwg\" ? \"启发式扫描\" : \"容器/文本扫描\");\n details.append(summary, meta);\n\n const hints = [...probe.layerHints, ...probe.blockHints, ...probe.externalRefs].slice(0, 18);\n if (hints.length > 0) {\n const list = document.createElement(\"ul\");\n list.className = \"ofv-cad-probe-list\";\n for (const hint of hints) {\n const item = document.createElement(\"li\");\n item.textContent = hint;\n list.append(item);\n }\n details.append(list);\n }\n\n if (probe.tokens.length > 0) {\n const preview = document.createElement(\"pre\");\n preview.className = \"ofv-text-block\";\n preview.textContent = probe.tokens.slice(0, 80).join(\"\\n\");\n details.append(preview);\n }\n return details;\n}\n\ntype BinaryCadProbe = {\n tokens: string[];\n entityCounts: Map<string, number>;\n layerHints: string[];\n blockHints: string[];\n externalRefs: string[];\n};\n\nfunction probeBinaryCad(bytes: Uint8Array): BinaryCadProbe {\n const text = extractAsciiRuns(bytes.slice(0, Math.min(bytes.length, 65536)));\n const tokens = text\n .map((item) => item.trim())\n .filter((item) => item.length >= 3)\n .slice(0, 240);\n const entityKeywords = [\"LINE\", \"CIRCLE\", \"ARC\", \"LWPOLYLINE\", \"POLYLINE\", \"TEXT\", \"MTEXT\", \"INSERT\", \"BLOCK\", \"LAYER\", \"XREF\", \"DIMENSION\"];\n const entityCounts = new Map<string, number>();\n for (const token of tokens) {\n const normalized = token.toUpperCase();\n for (const keyword of entityKeywords) {\n if (normalized.includes(keyword)) {\n entityCounts.set(keyword, (entityCounts.get(keyword) || 0) + 1);\n }\n }\n }\n return {\n tokens,\n entityCounts,\n layerHints: uniqueHints(tokens.filter((item) => /layer|图层/i.test(item))),\n blockHints: uniqueHints(tokens.filter((item) => /block|insert|块/i.test(item))),\n externalRefs: uniqueHints(tokens.filter((item) => /xref|\\.dwg|\\.dxf|\\.pdf|\\.png|\\.jpe?g/i.test(item)))\n };\n}\n\nfunction extractAsciiRuns(bytes: Uint8Array): string[] {\n const result: string[] = [];\n let current = \"\";\n for (const byte of bytes) {\n if (byte >= 32 && byte <= 126) {\n current += String.fromCharCode(byte);\n continue;\n }\n if (current.length >= 3) {\n result.push(current);\n }\n current = \"\";\n }\n if (current.length >= 3) {\n result.push(current);\n }\n return result;\n}\n\nfunction uniqueHints(values: string[]): string[] {\n return Array.from(new Set(values.map((value) => value.trim()).filter(Boolean))).slice(0, 12);\n}\n\nfunction formatCadKeywordCounts(counts: Map<string, number>): string {\n const text = [...counts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 6)\n .map(([type, count]) => `${type} ${count}`)\n .join(\", \");\n return text || \"未发现\";\n}\n\nfunction parseStepRecords(text: string): StepRecord[] {\n return [...text.matchAll(/#(\\d+)\\s*=\\s*([A-Z0-9_]+)\\s*\\(([\\s\\S]*?)\\)\\s*;/gi)].map((match) => ({\n id: `#${match[1]}`,\n type: (match[2] || \"\").toUpperCase(),\n args: (match[3] || \"\").replace(/\\s+/g, \" \").trim()\n }));\n}\n\nfunction parseIgesRecords(text: string): IgesRecord[] {\n const parameterText = text\n .split(/\\r?\\n/)\n .filter((line) => line.slice(72, 73).toUpperCase() === \"P\" || /^\\s*\\d+\\s*,/.test(line))\n .map((line) => line.slice(0, 72).trim())\n .join(\"\");\n if (!parameterText) {\n return [];\n }\n return parameterText\n .split(\";\")\n .map((record) => record.trim())\n .filter(Boolean)\n .map((record) => {\n const params = record.split(\",\").map((part) => part.trim()).filter(Boolean);\n return { type: params[0] || \"UNKNOWN\", params };\n });\n}\n\nfunction summarizeStepRecord(record: StepRecord): string {\n if (record.type === \"CARTESIAN_POINT\") {\n const point = record.args.match(/\\(([-+0-9., E]+)\\)/i)?.[1];\n return point ? `坐标 ${point.replace(/\\s+/g, \"\")}` : record.args;\n }\n if (record.type === \"DIRECTION\" || record.type === \"VECTOR\") {\n const direction = record.args.match(/\\(([-+0-9., E]+)\\)/i)?.[1];\n return direction ? `向量 ${direction.replace(/\\s+/g, \"\")}` : record.args;\n }\n if (record.type === \"LINE\" || record.type === \"CIRCLE\" || record.type === \"ADVANCED_FACE\") {\n return record.args.slice(0, 180);\n }\n return record.args.slice(0, 120);\n}\n\nfunction summarizeIfcRecord(record: StepRecord): string {\n const strings = extractStepStrings(record.args);\n const globalId = strings[0];\n const name = strings[2] || strings[1];\n const label = [globalId, name].filter(Boolean).join(\" · \");\n if (label) {\n return label;\n }\n return summarizeStepRecord(record);\n}\n\nfunction createIfcHierarchy(records: StepRecord[]): HTMLElement | null {\n const rows = records\n .filter((record) => [\"IFCPROJECT\", \"IFCSITE\", \"IFCBUILDING\", \"IFCBUILDINGSTOREY\", \"IFCSPACE\"].includes(record.type))\n .slice(0, 80)\n .map((record) => ({\n id: record.id,\n type: ifcTypeName(record.type),\n detail: summarizeIfcRecord(record)\n }));\n if (rows.length === 0) {\n return null;\n }\n\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-table-scroll ofv-cad-entities\";\n const title = document.createElement(\"strong\");\n title.textContent = \"BIM 层级\";\n const table = document.createElement(\"table\");\n const thead = document.createElement(\"thead\");\n const header = document.createElement(\"tr\");\n for (const label of [\"ID\", \"层级\", \"名称\"]) {\n const cell = document.createElement(\"th\");\n cell.textContent = label;\n header.append(cell);\n }\n thead.append(header);\n const tbody = document.createElement(\"tbody\");\n for (const row of rows) {\n const tr = document.createElement(\"tr\");\n for (const value of [row.id, row.type, row.detail]) {\n const cell = document.createElement(\"td\");\n cell.textContent = value;\n tr.append(cell);\n }\n tbody.append(tr);\n }\n table.append(thead, tbody);\n wrapper.append(title, table);\n return wrapper;\n}\n\nfunction extractStepStrings(args: string): string[] {\n const values: string[] = [];\n const pattern = /'((?:''|[^'])*)'/g;\n let match: RegExpExecArray | null;\n while ((match = pattern.exec(args))) {\n values.push((match[1] || \"\").replace(/''/g, \"'\"));\n }\n return values;\n}\n\nfunction countIfcElements(counts: Map<string, number>): number {\n const elementTypes = [\n \"IFCBEAM\",\n \"IFCBUILDINGELEMENTPROXY\",\n \"IFCCOLUMN\",\n \"IFCCOVERING\",\n \"IFCCURTAINWALL\",\n \"IFCDOOR\",\n \"IFCFLOWSEGMENT\",\n \"IFCFURNISHINGELEMENT\",\n \"IFCMEMBER\",\n \"IFCPLATE\",\n \"IFCRAILING\",\n \"IFCRAMP\",\n \"IFCRAMPFLIGHT\",\n \"IFCROOF\",\n \"IFCSLAB\",\n \"IFCSTAIR\",\n \"IFCSTAIRFLIGHT\",\n \"IFCWALL\",\n \"IFCWALLSTANDARDCASE\",\n \"IFCWINDOW\"\n ];\n return elementTypes.reduce((sum, type) => sum + (counts.get(type) || 0), 0);\n}\n\nfunction ifcTypeName(type: string): string {\n const names: Record<string, string> = {\n IFCPROJECT: \"项目\",\n IFCSITE: \"场地\",\n IFCBUILDING: \"建筑\",\n IFCBUILDINGSTOREY: \"楼层\",\n IFCSPACE: \"空间\"\n };\n return names[type] || type;\n}\n\nfunction igesTypeName(type: string): string {\n const names: Record<string, string> = {\n \"100\": \"100 Circular Arc\",\n \"110\": \"110 Line\",\n \"112\": \"112 Parametric Spline Curve\",\n \"114\": \"114 Parametric Spline Surface\",\n \"116\": \"116 Point\",\n \"118\": \"118 Ruled Surface\",\n \"120\": \"120 Surface of Revolution\",\n \"126\": \"126 Rational B-Spline Curve\",\n \"128\": \"128 Rational B-Spline Surface\",\n \"144\": \"144 Trimmed Surface\"\n };\n return names[type] || type;\n}\n\nfunction createCadTypeList(counts: Map<string, number>, titleText = \"类型统计\"): HTMLElement {\n const details = document.createElement(\"details\");\n details.className = \"ofv-details ofv-cad-types\";\n details.open = true;\n const summary = document.createElement(\"summary\");\n summary.textContent = titleText;\n const list = document.createElement(\"ul\");\n for (const [type, count] of [...counts.entries()].sort((a, b) => b[1] - a[1]).slice(0, 80)) {\n const item = document.createElement(\"li\");\n item.textContent = `${type}: ${count}`;\n list.append(item);\n }\n details.append(summary, list);\n return details;\n}\n\nfunction createCadEntityTable(rows: Array<{ id: string; type: string; detail: string }>): HTMLElement {\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-table-scroll ofv-cad-entities\";\n const table = document.createElement(\"table\");\n const thead = document.createElement(\"thead\");\n const header = document.createElement(\"tr\");\n for (const label of [\"ID\", \"类型\", \"摘要\"]) {\n const cell = document.createElement(\"th\");\n cell.textContent = label;\n header.append(cell);\n }\n thead.append(header);\n const tbody = document.createElement(\"tbody\");\n for (const row of rows) {\n const tr = document.createElement(\"tr\");\n for (const value of [row.id, row.type, row.detail]) {\n const cell = document.createElement(\"td\");\n cell.textContent = value;\n tr.append(cell);\n }\n tbody.append(tr);\n }\n table.append(thead, tbody);\n wrapper.append(table);\n return wrapper;\n}\n\nfunction countBy(values: string[]): Map<string, number> {\n const counts = new Map<string, number>();\n for (const value of values) {\n counts.set(value, (counts.get(value) || 0) + 1);\n }\n return counts;\n}\n\nfunction appendMeta(parent: HTMLElement, label: string, value: string | number): void {\n const row = document.createElement(\"div\");\n row.className = \"ofv-meta-row\";\n const key = document.createElement(\"span\");\n key.textContent = label;\n const content = document.createElement(\"strong\");\n content.textContent = String(value);\n row.append(key, content);\n parent.append(row);\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) {\n return `${bytes} B`;\n }\n if (bytes < 1024 * 1024) {\n return `${(bytes / 1024).toFixed(1)} KB`;\n }\n return `${(bytes / 1024 / 1024).toFixed(2)} MB`;\n}\n\nfunction byteSignature(bytes: Uint8Array): string {\n if (bytes.length === 0) {\n return \"空文件\";\n }\n const ascii = new TextDecoder(\"ascii\").decode(bytes.slice(0, Math.min(bytes.length, 16))).replace(/[^\\x20-\\x7E]/g, \".\");\n const hex = Array.from(bytes.slice(0, Math.min(bytes.length, 8)))\n .map((byte) => byte.toString(16).padStart(2, \"0\").toUpperCase())\n .join(\" \");\n return `${ascii} (${hex})`;\n}\n\nfunction detectCadVersion(bytes: Uint8Array, extension: string): string {\n const header = new TextDecoder(\"ascii\").decode(bytes.slice(0, Math.min(bytes.length, 32)));\n if (extension === \"dwg\") {\n const match = header.match(/AC\\d{4}/);\n if (!match) {\n return \"未知 DWG 版本\";\n }\n const names: Record<string, string> = {\n AC1009: \"AutoCAD R12\",\n AC1012: \"AutoCAD R13\",\n AC1014: \"AutoCAD R14\",\n AC1015: \"AutoCAD 2000/2002\",\n AC1018: \"AutoCAD 2004/2005/2006\",\n AC1021: \"AutoCAD 2007/2008/2009\",\n AC1024: \"AutoCAD 2010/2011/2012\",\n AC1027: \"AutoCAD 2013/2014/2015/2016/2017\",\n AC1032: \"AutoCAD 2018+\"\n };\n return `${match[0]}${names[match[0]] ? ` · ${names[match[0]]}` : \"\"}`;\n }\n if (header.startsWith(\"(DWF\") || header.includes(\"DWF\")) {\n return header.split(/\\s+/)[0] || \"DWF\";\n }\n return \"未知版本\";\n}\n\nfunction detectCadContainer(bytes: Uint8Array): string {\n if (bytes[0] === 0x50 && bytes[1] === 0x4b) {\n return \"ZIP/PK 压缩容器\";\n }\n if (bytes[0] === 0x1f && bytes[1] === 0x8b) {\n return \"GZIP 压缩流\";\n }\n if (bytes[0] === 0x28 && bytes[1] === 0x44 && bytes[2] === 0x57 && bytes[3] === 0x46) {\n return \"DWF ASCII 头\";\n }\n return \"二进制流\";\n}\n\nfunction hexPreview(bytes: Uint8Array): string {\n const rows: string[] = [];\n const limit = Math.min(bytes.length, 256);\n for (let offset = 0; offset < limit; offset += 16) {\n const slice = bytes.slice(offset, offset + 16);\n const hex = Array.from(slice)\n .map((byte) => byte.toString(16).padStart(2, \"0\").toUpperCase())\n .join(\" \")\n .padEnd(47, \" \");\n const ascii = Array.from(slice)\n .map((byte) => (byte >= 32 && byte <= 126 ? String.fromCharCode(byte) : \".\"))\n .join(\"\");\n rows.push(`${offset.toString(16).padStart(8, \"0\").toUpperCase()} ${hex} ${ascii}`);\n }\n if (bytes.length > limit) {\n rows.push(`... 仅展示前 ${limit} 字节,共 ${bytes.length} 字节`);\n }\n return rows.join(\"\\n\") || \"无可展示字节。\";\n}\n\nfunction renderDxf(\n panel: HTMLElement,\n dxf: string,\n ctx: Pick<PreviewContext, \"toolbar\">\n): {\n canCommand: (command: string) => boolean;\n command: (command: string) => boolean;\n destroy: () => void;\n} {\n const pairs = dxf.split(/\\r?\\n/).map((line) => line.trim());\n const lines: Array<LayeredValue<[number, number, number, number]>> = [];\n const circles: Array<LayeredValue<[number, number, number]>> = [];\n const arcs: Array<LayeredValue<[number, number, number, number, number]>> = [];\n const points: Array<LayeredValue<[number, number]>> = [];\n const polylines: Array<LayeredValue<Array<[number, number]>>> = [];\n const texts: Array<LayeredValue<[number, number, string, number]>> = [];\n\n for (let index = 0; index < pairs.length; index += 2) {\n const code = pairs[index];\n const value = pairs[index + 1];\n if (code === \"0\" && value === \"LINE\") {\n const entity = readEntity(pairs, index + 2);\n lines.push({\n layer: normalizeLayerName(entity[\"8\"]),\n value: [\n Number(entity[\"10\"] || 0),\n Number(entity[\"20\"] || 0),\n Number(entity[\"11\"] || 0),\n Number(entity[\"21\"] || 0)\n ]\n });\n }\n if (code === \"0\" && value === \"CIRCLE\") {\n const entity = readEntity(pairs, index + 2);\n circles.push({\n layer: normalizeLayerName(entity[\"8\"]),\n value: [\n Number(entity[\"10\"] || 0),\n Number(entity[\"20\"] || 0),\n Number(entity[\"40\"] || 0)\n ]\n });\n }\n if (code === \"0\" && value === \"ARC\") {\n const entity = readEntity(pairs, index + 2);\n arcs.push({\n layer: normalizeLayerName(entity[\"8\"]),\n value: [\n Number(entity[\"10\"] || 0),\n Number(entity[\"20\"] || 0),\n Number(entity[\"40\"] || 0),\n Number(entity[\"50\"] || 0),\n Number(entity[\"51\"] || 0)\n ]\n });\n }\n if (code === \"0\" && value === \"POINT\") {\n const entity = readEntity(pairs, index + 2);\n points.push({\n layer: normalizeLayerName(entity[\"8\"]),\n value: [Number(entity[\"10\"] || 0), Number(entity[\"20\"] || 0)]\n });\n }\n if (code === \"0\" && value === \"LWPOLYLINE\") {\n const entity = readEntity(pairs, index + 2);\n const entityPairs = readEntityPairs(pairs, index + 2);\n const polyline = readPolylinePoints(entityPairs);\n if (polyline.length > 1) {\n polylines.push({ layer: normalizeLayerName(entity[\"8\"]), value: polyline });\n }\n }\n if (code === \"0\" && value === \"POLYLINE\") {\n const result = readLegacyPolyline(pairs, index + 2);\n if (result.points.length > 1) {\n polylines.push({ layer: result.layer, value: result.points });\n }\n index = Math.max(index, result.endIndex - 2);\n }\n if (code === \"0\" && (value === \"TEXT\" || value === \"MTEXT\")) {\n const entity = readEntity(pairs, index + 2);\n const text = normalizeDxfText(entity[\"1\"] || entity[\"3\"] || \"\");\n if (text) {\n texts.push({\n layer: normalizeLayerName(entity[\"8\"]),\n value: [\n Number(entity[\"10\"] || 0),\n Number(entity[\"20\"] || 0),\n text,\n Math.max(1, Number(entity[\"40\"] || 12))\n ]\n });\n }\n }\n }\n\n const section = createSection(`DXF 基础预览`);\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svg.setAttribute(\"class\", \"ofv-svg-stage\");\n\n const bounds = computeBounds(lines, circles, arcs, points, polylines, texts);\n const initialViewBox = {\n x: bounds.minX,\n y: bounds.minY,\n width: bounds.width,\n height: bounds.height\n };\n let currentViewBox = { ...initialViewBox };\n const applyViewBox = () => {\n svg.setAttribute(\n \"viewBox\",\n `${currentViewBox.x} ${currentViewBox.y} ${currentViewBox.width} ${currentViewBox.height}`\n );\n };\n applyViewBox();\n\n for (const item of lines.slice(0, 3000)) {\n const [x1, y1, x2, y2] = item.value;\n const line = document.createElementNS(svg.namespaceURI, \"line\");\n line.setAttribute(\"x1\", String(x1));\n line.setAttribute(\"y1\", String(-y1));\n line.setAttribute(\"x2\", String(x2));\n line.setAttribute(\"y2\", String(-y2));\n line.setAttribute(\"stroke\", \"#111827\");\n line.setAttribute(\"stroke-width\", String(bounds.stroke));\n applyLayer(line, item.layer);\n svg.append(line);\n }\n\n for (const item of circles.slice(0, 1000)) {\n const [cx, cy, radius] = item.value;\n const circle = document.createElementNS(svg.namespaceURI, \"circle\");\n circle.setAttribute(\"cx\", String(cx));\n circle.setAttribute(\"cy\", String(-cy));\n circle.setAttribute(\"r\", String(Math.abs(radius)));\n circle.setAttribute(\"fill\", \"none\");\n circle.setAttribute(\"stroke\", \"#2563eb\");\n circle.setAttribute(\"stroke-width\", String(bounds.stroke));\n applyLayer(circle, item.layer);\n svg.append(circle);\n }\n\n for (const item of arcs.slice(0, 1000)) {\n const [cx, cy, radius, startAngle, endAngle] = item.value;\n const path = document.createElementNS(svg.namespaceURI, \"path\");\n path.setAttribute(\"d\", arcPath(cx, -cy, Math.abs(radius), -startAngle, -endAngle));\n path.setAttribute(\"fill\", \"none\");\n path.setAttribute(\"stroke\", \"#7c3aed\");\n path.setAttribute(\"stroke-width\", String(bounds.stroke));\n applyLayer(path, item.layer);\n svg.append(path);\n }\n\n for (const item of polylines.slice(0, 2000)) {\n const polyline = item.value;\n const path = document.createElementNS(svg.namespaceURI, \"polyline\");\n path.setAttribute(\"points\", polyline.map(([x, y]) => `${x},${-y}`).join(\" \"));\n path.setAttribute(\"fill\", \"none\");\n path.setAttribute(\"stroke\", \"#0f766e\");\n path.setAttribute(\"stroke-width\", String(bounds.stroke));\n applyLayer(path, item.layer);\n svg.append(path);\n }\n\n for (const item of points.slice(0, 3000)) {\n const [x, y] = item.value;\n const point = document.createElementNS(svg.namespaceURI, \"circle\");\n point.setAttribute(\"cx\", String(x));\n point.setAttribute(\"cy\", String(-y));\n point.setAttribute(\"r\", String(bounds.stroke * 2));\n point.setAttribute(\"fill\", \"#dc2626\");\n applyLayer(point, item.layer);\n svg.append(point);\n }\n\n for (const item of texts.slice(0, 500)) {\n const [x, y, text, height] = item.value;\n const label = document.createElementNS(svg.namespaceURI, \"text\");\n label.setAttribute(\"x\", String(x));\n label.setAttribute(\"y\", String(-y));\n label.setAttribute(\"font-size\", String(Math.max(height, bounds.stroke * 8)));\n label.setAttribute(\"fill\", \"currentColor\");\n label.textContent = text;\n applyLayer(label, item.layer);\n svg.append(label);\n }\n\n const layers = Array.from(\n new Set([...lines, ...circles, ...arcs, ...points, ...polylines, ...texts].map((item) => item.layer))\n ).sort((a, b) => a.localeCompare(b));\n if (layers.length > 0) {\n section.append(createLayerControls(svg, layers));\n }\n\n const note = document.createElement(\"p\");\n note.textContent =\n `已提取 LINE ${lines.length} 个、CIRCLE ${circles.length} 个、ARC ${arcs.length} 个、POLYLINE ${polylines.length} 个、POINT ${points.length} 个、TEXT ${texts.length} 个。`\n section.append(note, svg);\n panel.append(section);\n const updateToolbarZoom = () => {\n ctx.toolbar?.setZoom(initialViewBox.width / currentViewBox.width);\n };\n updateToolbarZoom();\n\n return {\n canCommand(command) {\n return command === \"zoom-in\" || command === \"zoom-out\" || command === \"zoom-reset\";\n },\n command(command) {\n if (command === \"zoom-in\" || command === \"zoom-out\") {\n const factor = command === \"zoom-in\" ? 0.82 : 1.18;\n const centerX = currentViewBox.x + currentViewBox.width / 2;\n const centerY = currentViewBox.y + currentViewBox.height / 2;\n currentViewBox.width *= factor;\n currentViewBox.height *= factor;\n currentViewBox.x = centerX - currentViewBox.width / 2;\n currentViewBox.y = centerY - currentViewBox.height / 2;\n applyViewBox();\n updateToolbarZoom();\n return true;\n }\n if (command === \"zoom-reset\") {\n currentViewBox = { ...initialViewBox };\n applyViewBox();\n updateToolbarZoom();\n return true;\n }\n return false;\n },\n destroy() {\n ctx.toolbar?.setZoom(undefined);\n }\n };\n}\n\nfunction applyLayer(element: Element, layer: string): void {\n element.setAttribute(\"data-layer\", layer);\n}\n\nfunction createLayerControls(svg: SVGSVGElement, layers: string[]): HTMLElement {\n const controls = document.createElement(\"div\");\n controls.className = \"ofv-cad-layers\";\n const title = document.createElement(\"strong\");\n title.textContent = `图层 ${layers.length}`;\n controls.append(title);\n\n for (const layer of layers) {\n const label = document.createElement(\"label\");\n const checkbox = document.createElement(\"input\");\n checkbox.type = \"checkbox\";\n checkbox.checked = true;\n checkbox.addEventListener(\"change\", () => {\n for (const element of svg.querySelectorAll<SVGElement>(`[data-layer=\"${escapeCssAttribute(layer)}\"]`)) {\n element.style.display = checkbox.checked ? \"\" : \"none\";\n }\n });\n const name = document.createElement(\"span\");\n name.textContent = layer;\n label.append(checkbox, name);\n controls.append(label);\n }\n return controls;\n}\n\nfunction readEntity(pairs: string[], start: number): Record<string, string> {\n const entity: Record<string, string> = {};\n for (let index = start; index < pairs.length; index += 2) {\n const code = pairs[index];\n const value = pairs[index + 1];\n if (code === \"0\") {\n break;\n }\n entity[code] = value;\n }\n return entity;\n}\n\nfunction readEntityPairs(pairs: string[], start: number): Array<[string, string]> {\n const entityPairs: Array<[string, string]> = [];\n for (let index = start; index < pairs.length; index += 2) {\n const code = pairs[index];\n const value = pairs[index + 1];\n if (code === \"0\") {\n break;\n }\n entityPairs.push([code, value]);\n }\n return entityPairs;\n}\n\nfunction readPolylinePoints(entityPairs: Array<[string, string]>): Array<[number, number]> {\n const points: Array<[number, number]> = [];\n let x: number | undefined;\n for (const [code, value] of entityPairs) {\n if (code === \"10\") {\n x = Number(value);\n }\n if (code === \"20\" && x !== undefined) {\n points.push([x, Number(value)]);\n x = undefined;\n }\n }\n return points;\n}\n\nfunction readLegacyPolyline(\n pairs: string[],\n start: number\n): { layer: string; points: Array<[number, number]>; endIndex: number } {\n let layer = \"0\";\n const points: Array<[number, number]> = [];\n for (let index = start; index < pairs.length; index += 2) {\n const code = pairs[index];\n const value = pairs[index + 1];\n if (code === \"0\" && value === \"SEQEND\") {\n return { layer, points, endIndex: index + 2 };\n }\n if (code === \"8\") {\n layer = normalizeLayerName(value);\n }\n if (code === \"0\" && value === \"VERTEX\") {\n const entity = readEntity(pairs, index + 2);\n points.push([Number(entity[\"10\"] || 0), Number(entity[\"20\"] || 0)]);\n }\n }\n return { layer, points, endIndex: pairs.length };\n}\n\nfunction normalizeLayerName(layer: string | undefined): string {\n return layer?.trim() || \"0\";\n}\n\nfunction escapeCssAttribute(value: string): string {\n if (typeof CSS !== \"undefined\" && CSS.escape) {\n return CSS.escape(value);\n }\n return value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"');\n}\n\nfunction normalizeDxfText(text: string): string {\n return text\n .replace(/\\\\P/g, \"\\n\")\n .replace(/\\{\\\\[^;]+;/g, \"\")\n .replace(/[{}]/g, \"\")\n .trim();\n}\n\nfunction arcPath(cx: number, cy: number, radius: number, startAngle: number, endAngle: number): string {\n const start = polarToCartesian(cx, cy, radius, endAngle);\n const end = polarToCartesian(cx, cy, radius, startAngle);\n const delta = Math.abs(endAngle - startAngle);\n const largeArc = delta <= 180 ? \"0\" : \"1\";\n return `M ${start.x} ${start.y} A ${radius} ${radius} 0 ${largeArc} 0 ${end.x} ${end.y}`;\n}\n\nfunction polarToCartesian(cx: number, cy: number, radius: number, angleDegrees: number): { x: number; y: number } {\n const angle = (angleDegrees * Math.PI) / 180;\n return {\n x: cx + radius * Math.cos(angle),\n y: cy + radius * Math.sin(angle)\n };\n}\n\nfunction computeBounds(\n lines: Array<LayeredValue<[number, number, number, number]>>,\n circles: Array<LayeredValue<[number, number, number]>>,\n arcs: Array<LayeredValue<[number, number, number, number, number]>>,\n points: Array<LayeredValue<[number, number]>>,\n polylines: Array<LayeredValue<Array<[number, number]>>>,\n texts: Array<LayeredValue<[number, number, string, number]>>\n): { minX: number; minY: number; width: number; height: number; stroke: number } {\n const xs = lines.flatMap(({ value: [x1, , x2] }) => [x1, x2]);\n const ys = lines.flatMap(({ value: [, y1, , y2] }) => [-y1, -y2]);\n for (const { value: [cx, cy, radius] } of circles) {\n xs.push(cx - radius, cx + radius);\n ys.push(-cy - radius, -cy + radius);\n }\n for (const { value: [cx, cy, radius] } of arcs) {\n xs.push(cx - radius, cx + radius);\n ys.push(-cy - radius, -cy + radius);\n }\n for (const { value: [x, y] } of points) {\n xs.push(x);\n ys.push(-y);\n }\n for (const { value: polyline } of polylines) {\n for (const [x, y] of polyline) {\n xs.push(x);\n ys.push(-y);\n }\n }\n for (const { value: [x, y, text, height] } of texts) {\n xs.push(x, x + text.length * height * 0.6);\n ys.push(-y, -y - height);\n }\n const minX = Math.min(...xs, 0);\n const maxX = Math.max(...xs, 100);\n const minY = Math.min(...ys, 0);\n const maxY = Math.max(...ys, 100);\n const width = Math.max(1, maxX - minX);\n const height = Math.max(1, maxY - minY);\n return {\n minX,\n minY,\n width,\n height,\n stroke: Math.max(width, height) / 600\n };\n}\n","import type { PreviewContext, PreviewInstance, PreviewPlugin, PreviewSize } from \"../types\";\nimport { createObjectUrl, revokeObjectUrl } from \"../dom\";\nimport { resolveFormat } from \"./utils\";\n\nconst modelExtensions = new Set([\n \"gltf\",\n \"glb\",\n \"obj\",\n \"stl\",\n \"fbx\",\n \"dae\",\n \"ply\",\n \"3mf\",\n \"3ds\",\n \"usd\",\n \"usda\",\n \"usdc\",\n \"usdz\",\n \"wrl\",\n \"vrml\"\n]);\nconst modelMimeTypes = new Set([\n \"model/gltf+json\",\n \"model/gltf-binary\",\n \"model/stl\",\n \"model/obj\",\n \"model/vnd.collada+xml\",\n \"model/3mf\",\n \"model/3ds\",\n \"model/vnd.usd\",\n \"model/vnd.usdz+zip\",\n \"model/vrml\",\n \"application/sla\",\n \"application/vnd.ms-pki.stl\",\n \"application/ply\",\n \"application/vnd.autodesk.fbx\"\n]);\nconst modelMimeFormatMap: Record<string, string> = {\n \"model/gltf+json\": \"gltf\",\n \"model/gltf-binary\": \"glb\",\n \"model/stl\": \"stl\",\n \"model/obj\": \"obj\",\n \"model/vnd.collada+xml\": \"dae\",\n \"model/3mf\": \"3mf\",\n \"model/3ds\": \"3ds\",\n \"model/vnd.usd\": \"usd\",\n \"model/vnd.usdz+zip\": \"usdz\",\n \"model/vrml\": \"wrl\",\n \"application/sla\": \"stl\",\n \"application/vnd.ms-pki.stl\": \"stl\",\n \"application/ply\": \"ply\",\n \"application/vnd.autodesk.fbx\": \"fbx\"\n};\nconst textLikeExtensions = new Set([\"json\", \"txt\", \"md\", \"xml\", \"yaml\", \"yml\", \"csv\", \"tsv\", \"js\", \"ts\", \"tsx\", \"jsx\", \"html\", \"css\"]);\n\nexport function model3dPlugin(): PreviewPlugin {\n return {\n name: \"model3d\",\n match(file) {\n return (\n modelExtensions.has(file.extension) ||\n (modelMimeTypes.has(file.mimeType) && (file.extension === \"\" || file.extension === \"bin\" || !textLikeExtensions.has(file.extension)))\n );\n },\n async render(ctx) {\n const THREE = await import(\"three\");\n const { OrbitControls } = await import(\"three/examples/jsm/controls/OrbitControls.js\");\n const url = createObjectUrl(ctx.file);\n const isExternal = Boolean(ctx.file.url);\n\n const stage = document.createElement(\"div\");\n stage.className = \"ofv-model-stage\";\n ctx.viewport.append(stage);\n\n const scene = new THREE.Scene();\n scene.background = new THREE.Color(0xf3f4f6);\n\n const camera = new THREE.PerspectiveCamera(45, 1, 0.1, 10000);\n camera.position.set(2.5, 2, 3.5);\n\n let renderer: import(\"three\").WebGLRenderer;\n try {\n renderer = new THREE.WebGLRenderer({ antialias: true });\n } catch {\n stage.remove();\n return renderModelFallback(ctx, url, isExternal, \"当前浏览器或设备不支持 WebGL,无法直接渲染 3D 模型。\");\n }\n renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));\n renderer.outputColorSpace = THREE.SRGBColorSpace;\n renderer.toneMapping = THREE.ACESFilmicToneMapping;\n renderer.toneMappingExposure = 1.08;\n stage.append(renderer.domElement);\n\n const controls = new OrbitControls(camera, renderer.domElement);\n controls.enableDamping = true;\n\n scene.add(new THREE.HemisphereLight(0xffffff, 0x94a3b8, 2.8));\n const directional = new THREE.DirectionalLight(0xffffff, 2);\n directional.position.set(4, 6, 5);\n scene.add(directional);\n scene.add(new THREE.GridHelper(10, 10, 0xcbd5e1, 0xe5e7eb));\n\n const extension = resolveFormat(ctx.file, modelMimeFormatMap);\n const loaded = await loadModel(extension, url, THREE).catch(() => undefined);\n if (!loaded) {\n controls.dispose();\n renderer.dispose();\n stage.remove();\n return renderModelFallback(ctx, url, isExternal, \"无法解析当前 3D 模型内容。\");\n }\n if (loaded.message) {\n const message = document.createElement(\"div\");\n message.className = \"ofv-model-message\";\n message.textContent = loaded.message;\n stage.append(message);\n }\n const object = loaded.object;\n scene.add(object);\n const initialFrame = frameObject(object, camera, controls, THREE);\n const measurement = measureObject(object, THREE);\n stage.append(createMeasurementPanel(measurement));\n stage.append(createMaterialPanel(collectMaterialStats(object)));\n\n let animationFrame = 0;\n const animate = () => {\n controls.update();\n renderer.render(scene, camera);\n animationFrame = window.requestAnimationFrame(animate);\n };\n animate();\n\n const resize = (size: PreviewSize) => {\n const width = Math.max(1, size.width);\n const height = Math.max(1, size.height);\n camera.aspect = width / height;\n camera.updateProjectionMatrix();\n renderer.setSize(width, height, false);\n };\n resize(ctx.size);\n const updateToolbarZoom = () => {\n const currentDistance = vectorDistance(camera.position, controls.target);\n const initialDistance = vectorDistance(initialFrame.cameraPosition, initialFrame.target);\n ctx.toolbar?.setZoom(initialDistance > 0 ? initialDistance / currentDistance : undefined);\n };\n updateToolbarZoom();\n\n return {\n canCommand(command) {\n return (\n command === \"zoom-in\" ||\n command === \"zoom-out\" ||\n command === \"zoom-reset\" ||\n command === \"rotate-right\" ||\n command === \"rotate-left\"\n );\n },\n command(command) {\n if (command === \"zoom-in\" || command === \"zoom-out\") {\n const factor = command === \"zoom-in\" ? 0.82 : 1.18;\n camera.position.sub(controls.target).multiplyScalar(factor).add(controls.target);\n camera.updateProjectionMatrix();\n controls.update();\n updateToolbarZoom();\n return true;\n }\n if (command === \"zoom-reset\") {\n camera.position.copy(initialFrame.cameraPosition);\n controls.target.copy(initialFrame.target);\n camera.near = initialFrame.near;\n camera.far = initialFrame.far;\n camera.updateProjectionMatrix();\n controls.update();\n updateToolbarZoom();\n return true;\n }\n if (command === \"rotate-right\" || command === \"rotate-left\") {\n object.rotateY(command === \"rotate-right\" ? Math.PI / 8 : -Math.PI / 8);\n return true;\n }\n return false;\n },\n resize,\n destroy() {\n ctx.toolbar?.setZoom(undefined);\n window.cancelAnimationFrame(animationFrame);\n controls.dispose();\n renderer.dispose();\n disposeObject(object, THREE);\n stage.remove();\n revokeObjectUrl(url, isExternal);\n }\n };\n }\n };\n}\n\nfunction vectorDistance(\n a: { x: number; y: number; z: number; distanceTo?: (value: { x: number; y: number; z: number }) => number },\n b: { x: number; y: number; z: number }\n): number {\n if (typeof a.distanceTo === \"function\") {\n return a.distanceTo(b);\n }\n return Math.hypot(a.x - b.x, a.y - b.y, a.z - b.z);\n}\n\nfunction renderModelFallback(\n ctx: PreviewContext,\n url: string,\n isExternal: boolean,\n message: string\n): PreviewInstance {\n const panel = document.createElement(\"div\");\n panel.className = \"ofv-fallback\";\n\n const title = document.createElement(\"strong\");\n title.textContent = \"3D 预览不可用\";\n\n const detail = document.createElement(\"span\");\n detail.textContent = `${message} ${ctx.file.name}`;\n\n const download = document.createElement(\"a\");\n download.href = url;\n download.download = ctx.file.name;\n download.textContent = \"下载文件\";\n\n panel.append(title, detail, download);\n ctx.viewport.classList.add(\"ofv-center\");\n ctx.viewport.append(panel);\n\n return {\n canCommand() {\n return false;\n },\n destroy() {\n ctx.viewport.classList.remove(\"ofv-center\");\n panel.remove();\n revokeObjectUrl(url, isExternal);\n }\n };\n}\n\nasync function loadModel(\n extension: string,\n url: string,\n THREE: typeof import(\"three\")\n): Promise<{ object: import(\"three\").Object3D; message?: string }> {\n if (extension === \"gltf\" || extension === \"glb\") {\n const { GLTFLoader } = await import(\"three/examples/jsm/loaders/GLTFLoader.js\");\n const gltf = await new GLTFLoader().loadAsync(url);\n return { object: gltf.scene };\n }\n if (extension === \"obj\") {\n const { OBJLoader } = await import(\"three/examples/jsm/loaders/OBJLoader.js\");\n return { object: await new OBJLoader().loadAsync(url) };\n }\n if (extension === \"fbx\") {\n const { FBXLoader } = await import(\"three/examples/jsm/loaders/FBXLoader.js\");\n return { object: await new FBXLoader().loadAsync(url) };\n }\n if (extension === \"dae\") {\n const { ColladaLoader } = await import(\"three/examples/jsm/loaders/ColladaLoader.js\");\n const collada = await new ColladaLoader().loadAsync(url);\n if (!collada) {\n throw new Error(\"Collada loader returned no scene.\");\n }\n return { object: collada.scene };\n }\n if (extension === \"stl\") {\n const { STLLoader } = await import(\"three/examples/jsm/loaders/STLLoader.js\");\n const geometry = await new STLLoader().loadAsync(url);\n const material = new THREE.MeshStandardMaterial({ color: 0x64748b, roughness: 0.55 });\n return { object: new THREE.Mesh(geometry, material) };\n }\n if (extension === \"ply\") {\n const { PLYLoader } = await import(\"three/examples/jsm/loaders/PLYLoader.js\");\n const geometry = await new PLYLoader().loadAsync(url);\n const material = new THREE.MeshStandardMaterial({ color: 0x64748b, roughness: 0.55 });\n return { object: new THREE.Mesh(geometry, material) };\n }\n if (extension === \"3mf\") {\n const { ThreeMFLoader } = await import(\"three/examples/jsm/loaders/3MFLoader.js\");\n return { object: await new ThreeMFLoader().loadAsync(url) };\n }\n if (extension === \"3ds\") {\n const { TDSLoader } = await import(\"three/examples/jsm/loaders/TDSLoader.js\");\n return { object: await new TDSLoader().loadAsync(url) };\n }\n if (extension === \"usd\" || extension === \"usda\" || extension === \"usdc\" || extension === \"usdz\") {\n const { USDLoader } = await import(\"three/examples/jsm/loaders/USDLoader.js\");\n return { object: await new USDLoader().loadAsync(url) };\n }\n if (extension === \"wrl\" || extension === \"vrml\") {\n const { VRMLLoader } = await import(\"three/examples/jsm/loaders/VRMLLoader.js\");\n return { object: await new VRMLLoader().loadAsync(url) };\n }\n const group = new THREE.Group();\n const geometry = new THREE.BoxGeometry(1, 1, 1);\n const material = new THREE.MeshStandardMaterial({ color: 0x64748b });\n const mesh = new THREE.Mesh(geometry, material);\n group.add(mesh);\n return {\n object: group,\n message: `.${extension} 已识别为 3D 格式,当前内置渲染优先支持 gltf/glb/obj/stl/fbx/dae/ply/3mf/3ds/usd/usdz/vrml。`\n };\n}\n\nfunction frameObject(\n object: import(\"three\").Object3D,\n camera: import(\"three\").PerspectiveCamera,\n controls: { target: import(\"three\").Vector3; update: () => void },\n THREE: typeof import(\"three\")\n): {\n cameraPosition: import(\"three\").Vector3;\n target: import(\"three\").Vector3;\n near: number;\n far: number;\n} {\n const box = new THREE.Box3().setFromObject(object);\n const size = box.getSize(new THREE.Vector3());\n const center = box.getCenter(new THREE.Vector3());\n const maxSize = Math.max(size.x, size.y, size.z, 1);\n const distance = maxSize * 2.4;\n camera.position.set(center.x + distance, center.y + distance * 0.7, center.z + distance);\n camera.near = Math.max(distance / 1000, 0.01);\n camera.far = distance * 1000;\n camera.updateProjectionMatrix();\n controls.target.copy(center);\n controls.update();\n return {\n cameraPosition: camera.position.clone(),\n target: controls.target.clone(),\n near: camera.near,\n far: camera.far\n };\n}\n\ntype ModelMeasurement = {\n width: number;\n height: number;\n depth: number;\n diagonal: number;\n center: { x: number; y: number; z: number };\n};\n\ntype MaterialStats = {\n meshes: number;\n materials: number;\n textures: number;\n slots: string[];\n names: string[];\n};\n\nfunction measureObject(object: import(\"three\").Object3D, THREE: typeof import(\"three\")): ModelMeasurement {\n const box = new THREE.Box3().setFromObject(object);\n const size = box.getSize(new THREE.Vector3());\n const center = box.getCenter(new THREE.Vector3());\n return {\n width: size.x,\n height: size.y,\n depth: size.z,\n diagonal: Math.sqrt(size.x ** 2 + size.y ** 2 + size.z ** 2),\n center: { x: center.x, y: center.y, z: center.z }\n };\n}\n\nfunction createMeasurementPanel(measurement: ModelMeasurement): HTMLElement {\n const panel = document.createElement(\"div\");\n panel.className = \"ofv-model-measure\";\n const title = document.createElement(\"strong\");\n title.textContent = \"模型测量\";\n const list = document.createElement(\"dl\");\n appendMeasure(list, \"宽\", measurement.width);\n appendMeasure(list, \"高\", measurement.height);\n appendMeasure(list, \"深\", measurement.depth);\n appendMeasure(list, \"对角线\", measurement.diagonal);\n appendMeasure(\n list,\n \"中心\",\n `${formatMeasure(measurement.center.x)}, ${formatMeasure(measurement.center.y)}, ${formatMeasure(measurement.center.z)}`\n );\n panel.append(title, list);\n return panel;\n}\n\nfunction appendMeasure(list: HTMLDListElement, label: string, value: number | string): void {\n const term = document.createElement(\"dt\");\n term.textContent = label;\n const detail = document.createElement(\"dd\");\n detail.textContent = typeof value === \"number\" ? formatMeasure(value) : value;\n list.append(term, detail);\n}\n\nfunction formatMeasure(value: number): string {\n if (!Number.isFinite(value)) {\n return \"-\";\n }\n const rounded = Math.abs(value) >= 100 ? value.toFixed(1) : value.toFixed(3);\n return rounded.replace(/\\.?0+$/, \"\");\n}\n\nfunction collectMaterialStats(object: import(\"three\").Object3D): MaterialStats {\n const materials = new Set<import(\"three\").Material>();\n const textures = new Set<unknown>();\n const slots = new Set<string>();\n const names = new Set<string>();\n let meshes = 0;\n\n object.traverse((child) => {\n const mesh = child as import(\"three\").Mesh;\n if (!mesh.geometry || !mesh.material) {\n return;\n }\n meshes += 1;\n for (const material of normalizeMaterials(mesh.material)) {\n materials.add(material);\n if (material.name) {\n names.add(material.name);\n }\n for (const slot of textureSlots) {\n const texture = (material as unknown as Record<string, unknown>)[slot];\n if (texture) {\n textures.add(texture);\n slots.add(slot);\n }\n }\n }\n });\n\n return {\n meshes,\n materials: materials.size,\n textures: textures.size,\n slots: [...slots],\n names: [...names].slice(0, 6)\n };\n}\n\nfunction createMaterialPanel(stats: MaterialStats): HTMLElement {\n const panel = document.createElement(\"div\");\n panel.className = \"ofv-model-materials\";\n const title = document.createElement(\"strong\");\n title.textContent = \"材质贴图\";\n\n const list = document.createElement(\"dl\");\n appendMaterialStat(list, \"网格\", stats.meshes);\n appendMaterialStat(list, \"材质\", stats.materials);\n appendMaterialStat(list, \"贴图\", stats.textures);\n appendMaterialStat(list, \"槽位\", stats.slots.length > 0 ? stats.slots.join(\", \") : \"-\");\n if (stats.names.length > 0) {\n appendMaterialStat(list, \"名称\", stats.names.join(\", \"));\n }\n\n panel.append(title, list);\n return panel;\n}\n\nfunction appendMaterialStat(list: HTMLDListElement, label: string, value: number | string): void {\n const term = document.createElement(\"dt\");\n term.textContent = label;\n const detail = document.createElement(\"dd\");\n detail.textContent = String(value);\n list.append(term, detail);\n}\n\nfunction disposeObject(object: import(\"three\").Object3D, THREE: typeof import(\"three\")): void {\n object.traverse((child) => {\n const mesh = child as import(\"three\").Mesh;\n if (mesh.geometry) {\n mesh.geometry.dispose();\n }\n const material = mesh.material;\n for (const item of normalizeMaterials(material)) {\n disposeMaterialTextures(item);\n item.dispose();\n }\n });\n}\n\nconst textureSlots = [\n \"map\",\n \"aoMap\",\n \"alphaMap\",\n \"bumpMap\",\n \"displacementMap\",\n \"emissiveMap\",\n \"envMap\",\n \"lightMap\",\n \"metalnessMap\",\n \"normalMap\",\n \"roughnessMap\"\n];\n\nfunction normalizeMaterials(\n material: import(\"three\").Material | import(\"three\").Material[] | undefined\n): import(\"three\").Material[] {\n if (!material) {\n return [];\n }\n return Array.isArray(material) ? material : [material];\n}\n\nfunction disposeMaterialTextures(material: import(\"three\").Material): void {\n for (const slot of textureSlots) {\n const texture = (material as unknown as Record<string, { dispose?: () => void } | undefined>)[slot];\n texture?.dispose?.();\n }\n}\n","/// <reference path=\"../shims-gis.d.ts\" />\nimport type { PreviewPlugin, PreviewFile } from \"../types\";\nimport { readArrayBuffer, resolveFormat } from \"./utils\";\n\nconst gisExtensions = new Set([\"geojson\", \"topojson\", \"kml\", \"kmz\", \"gpx\", \"shp\"]);\nconst gisMimeFormatMap: Record<string, string> = {\n \"application/geo+json\": \"geojson\",\n \"application/vnd.geo+json\": \"geojson\",\n \"application/topo+json\": \"topojson\",\n \"application/vnd.google-earth.kml+xml\": \"kml\",\n \"application/vnd.google-earth.kmz\": \"kmz\",\n \"application/gpx+xml\": \"gpx\"\n};\n\nfunction loadLeafletCss(): Promise<void> {\n const id = \"ofv-leaflet-css\";\n if (document.getElementById(id)) {\n return Promise.resolve();\n }\n return new Promise((resolve) => {\n const link = document.createElement(\"link\");\n let settled = false;\n const done = () => {\n if (!settled) {\n settled = true;\n resolve();\n }\n };\n link.id = id;\n link.rel = \"stylesheet\";\n link.href = \"https://cdn.jsdelivr.net/npm/leaflet@1.9.4/dist/leaflet.css\";\n link.onload = done;\n link.onerror = done;\n document.head.appendChild(link);\n window.setTimeout(done, 0);\n });\n}\n\nexport function gisPlugin(): PreviewPlugin {\n return {\n name: \"gis\",\n match(file) {\n return gisExtensions.has(file.extension) || Boolean(gisMimeFormatMap[file.mimeType]);\n },\n async render(ctx) {\n // 1. Load Leaflet CSS and dynamic imports\n await loadLeafletCss();\n\n const [L, topojson, toGeoJSON, shpjs, JSZip] = await Promise.all([\n import(\"leaflet\"),\n import(\"topojson-client\"),\n import(\"@mapbox/togeojson\"),\n import(\"shpjs\"),\n import(\"jszip\")\n ]);\n\n const Leaflet = L.default || L;\n const topojsonClient = topojson.default || topojson;\n const togeojsonLib = toGeoJSON.default || toGeoJSON;\n const shpLib = shpjs.default || shpjs;\n const JSZipLib = JSZip.default || JSZip;\n\n // Fix default marker icon paths using inline SVG to avoid asset 404 errors\n const DefaultIcon = Leaflet.icon({\n iconUrl: \"data:image/svg+xml;charset=utf-8,\" + encodeURIComponent(`\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" width=\"32\" height=\"32\">\n <path fill=\"#3b82f6\" d=\"M12 2C8.13 2 5 5.13 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z\"/>\n </svg>\n `),\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowUrl: \"data:image/svg+xml;charset=utf-8,\" + encodeURIComponent(`\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" width=\"32\" height=\"32\">\n <ellipse cx=\"12\" cy=\"20\" rx=\"6\" ry=\"2\" fill=\"#000000\" opacity=\"0.2\"/>\n </svg>\n `),\n shadowSize: [41, 41],\n shadowAnchor: [12, 41]\n });\n Leaflet.Marker.prototype.options.icon = DefaultIcon;\n\n // 2. Read file as ArrayBuffer and Parse to GeoJSON\n const buffer = await readArrayBuffer(ctx.file);\n const geojson = await parseToGeoJson(\n ctx.file,\n buffer,\n togeojsonLib,\n topojsonClient,\n shpLib,\n JSZipLib\n ).catch((error: unknown) => {\n const fallback = createGisFallback(\"GIS 数据解析失败\", normalizeGisError(error, ctx.file.name));\n ctx.viewport.classList.add(\"ofv-center\");\n ctx.viewport.append(fallback);\n return { fallback };\n });\n\n if (isGisFallback(geojson)) {\n return {\n destroy() {\n ctx.viewport.classList.remove(\"ofv-center\");\n geojson.fallback.remove();\n }\n };\n }\n\n // Handle raw unzipped shapefile warning UI\n if (geojson === null && resolveFormat(ctx.file, gisMimeFormatMap) === \"shp\") {\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n\n const title = document.createElement(\"strong\");\n title.textContent = \"无法直接预览单个 .shp 文件\";\n\n const desc = document.createElement(\"span\");\n desc.textContent = \"Shapefile 格式需要包含配套的 .dbf 和 .shx 数据文件。请将它们打包为 .zip 文件后上传预览,或在压缩包列表中直接查看。\";\n\n fallback.append(title, desc);\n ctx.viewport.classList.add(\"ofv-center\");\n ctx.viewport.append(fallback);\n\n return {\n destroy() {\n ctx.viewport.classList.remove(\"ofv-center\");\n fallback.remove();\n }\n };\n }\n\n // 3. Render Leaflet Map\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-gis-viewer\";\n const summary = summarizeGeoJson(geojson);\n wrapper.append(createGisSummary(summary));\n ctx.viewport.appendChild(wrapper);\n\n const mapContainer = document.createElement(\"div\");\n mapContainer.className = \"ofv-map-stage\";\n wrapper.appendChild(mapContainer);\n if (summary.features === 0) {\n mapContainer.append(createEmptyMapState());\n } else {\n mapContainer.append(createMapLegend(summary));\n }\n\n const map = Leaflet.map(mapContainer).setView([0, 0], 2);\n\n Leaflet.tileLayer(\"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png\", {\n attribution: '&copy; <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors'\n }).addTo(map);\n\n // Render GeoJSON elements with premium blue color styles\n const geojsonLayer = Leaflet.geoJSON(geojson, {\n style: () => ({\n className: \"ofv-map-feature\",\n color: \"#e11d48\",\n weight: 2,\n opacity: 0.92,\n fillColor: \"#fb923c\",\n fillOpacity: 0.3,\n lineCap: \"round\",\n lineJoin: \"round\"\n }),\n pointToLayer: (feature: any, latlng: any) => {\n return Leaflet.circleMarker(latlng, {\n className: \"ofv-map-feature ofv-map-point\",\n radius: 7,\n fillColor: \"#e11d48\",\n color: \"#ffffff\",\n weight: 2.5,\n opacity: 1,\n fillOpacity: 0.9\n });\n },\n onEachFeature: (feature: any, layer: any) => {\n const label = feature.properties?.name || feature.properties?.title || feature.properties?.label;\n if (label) {\n layer.bindTooltip?.(String(label), {\n className: \"ofv-map-tooltip\",\n direction: \"top\",\n sticky: true\n });\n }\n layer.on?.({\n mouseover(event: any) {\n event.target?.setStyle?.({\n weight: 4,\n opacity: 1,\n fillOpacity: 0.4\n });\n event.target?.bringToFront?.();\n },\n mouseout(event: any) {\n geojsonLayer.resetStyle?.(event.target);\n }\n });\n if (feature.properties) {\n const props = feature.properties;\n const keys = Object.keys(props);\n if (keys.length > 0) {\n const popupContent = document.createElement(\"div\");\n popupContent.className = \"ofv-map-popup\";\n\n const popupTitle = document.createElement(\"h4\");\n popupTitle.textContent = \"属性信息\";\n popupContent.appendChild(popupTitle);\n\n const table = document.createElement(\"table\");\n table.className = \"ofv-map-popup-table\";\n\n for (const key of keys) {\n const val = props[key];\n if (val === null || val === undefined) continue;\n\n const row = document.createElement(\"tr\");\n const cellKey = document.createElement(\"td\");\n cellKey.className = \"ofv-map-popup-key\";\n cellKey.textContent = key;\n\n const cellVal = document.createElement(\"td\");\n cellVal.className = \"ofv-map-popup-val\";\n cellVal.textContent = typeof val === \"object\" ? JSON.stringify(val) : String(val);\n\n row.append(cellKey, cellVal);\n table.appendChild(row);\n }\n\n popupContent.appendChild(table);\n layer.bindPopup(popupContent);\n }\n }\n }\n }).addTo(map);\n\n // Zoom map to dataset bounds\n try {\n const bounds = geojsonLayer.getBounds();\n if (bounds.isValid()) {\n map.fitBounds(bounds, { padding: [20, 20] });\n map.invalidateSize();\n }\n } catch (e) {\n console.warn(\"Could not fit bounds for GeoJSON data:\", e);\n }\n\n const resizeTimers = [0, 80, 240].map((delay) => window.setTimeout(() => {\n map.invalidateSize();\n }, delay));\n\n return {\n resize() {\n map.invalidateSize();\n },\n destroy() {\n resizeTimers.forEach((timer) => window.clearTimeout(timer));\n map.remove();\n wrapper.remove();\n }\n };\n }\n };\n}\n\nfunction createGisFallback(titleText: string, detailText: string): HTMLElement {\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n const title = document.createElement(\"strong\");\n title.textContent = titleText;\n const detail = document.createElement(\"span\");\n detail.textContent = detailText;\n fallback.append(title, detail);\n return fallback;\n}\n\nfunction normalizeGisError(error: unknown, fileName: string): string {\n const message = error instanceof Error ? error.message : String(error || \"\");\n return message ? `${fileName}: ${message}` : `${fileName}: 文件内容无法转换为地图数据。`;\n}\n\nfunction isGisFallback(value: unknown): value is { fallback: HTMLElement } {\n return typeof value === \"object\" && value !== null && \"fallback\" in value;\n}\n\ntype GisSummary = {\n features: number;\n geometryCounts: Map<string, number>;\n propertyKeys: Set<string>;\n bounds?: [number, number, number, number];\n};\n\nfunction createGisSummary(summary: GisSummary): HTMLElement {\n const bar = document.createElement(\"div\");\n bar.className = \"ofv-gis-summary\";\n appendSummaryItem(bar, \"要素\", String(summary.features));\n appendSummaryItem(bar, \"几何\", formatGeometryCounts(summary.geometryCounts));\n appendSummaryItem(bar, \"属性字段\", String(summary.propertyKeys.size));\n if (summary.propertyKeys.size > 0) {\n appendSummaryItem(bar, \"字段预览\", [...summary.propertyKeys].slice(0, 8).join(\", \"));\n }\n if (summary.bounds) {\n appendSummaryItem(bar, \"范围\", formatBounds(summary.bounds));\n }\n return bar;\n}\n\nfunction createEmptyMapState(): HTMLElement {\n const empty = document.createElement(\"div\");\n empty.className = \"ofv-map-empty\";\n const title = document.createElement(\"strong\");\n title.textContent = \"暂无可展示的地图要素\";\n const detail = document.createElement(\"span\");\n detail.textContent = \"GeoJSON 已识别,但 features 为空。\";\n empty.append(title, detail);\n return empty;\n}\n\nfunction createMapLegend(summary: GisSummary): HTMLElement {\n const legend = document.createElement(\"div\");\n legend.className = \"ofv-map-legend\";\n const title = document.createElement(\"strong\");\n title.textContent = \"GeoJSON\";\n const detail = document.createElement(\"span\");\n detail.textContent = `${summary.features} 个要素 · ${formatGeometryCounts(summary.geometryCounts)}`;\n legend.append(title, detail);\n return legend;\n}\n\nfunction appendSummaryItem(parent: HTMLElement, label: string, value: string): void {\n const item = document.createElement(\"span\");\n const key = document.createElement(\"span\");\n key.textContent = label;\n const content = document.createElement(\"strong\");\n content.textContent = value;\n item.append(key, content);\n parent.append(item);\n}\n\nfunction summarizeGeoJson(geojson: any): GisSummary {\n const summary: GisSummary = {\n features: 0,\n geometryCounts: new Map(),\n propertyKeys: new Set()\n };\n for (const feature of collectFeatures(geojson)) {\n summary.features++;\n if (feature.properties && typeof feature.properties === \"object\") {\n Object.keys(feature.properties).forEach((key) => summary.propertyKeys.add(key));\n }\n summarizeGeometry(feature.geometry, summary);\n }\n return summary;\n}\n\nfunction collectFeatures(value: any): any[] {\n if (!value) {\n return [];\n }\n if (value.type === \"FeatureCollection\" && Array.isArray(value.features)) {\n return value.features;\n }\n if (value.type === \"Feature\") {\n return [value];\n }\n if (value.type && value.coordinates) {\n return [{ type: \"Feature\", properties: {}, geometry: value }];\n }\n return [];\n}\n\nfunction summarizeGeometry(geometry: any, summary: GisSummary): void {\n if (!geometry) {\n summary.geometryCounts.set(\"None\", (summary.geometryCounts.get(\"None\") || 0) + 1);\n return;\n }\n const type = String(geometry.type || \"Unknown\");\n summary.geometryCounts.set(type, (summary.geometryCounts.get(type) || 0) + 1);\n if (type === \"GeometryCollection\" && Array.isArray(geometry.geometries)) {\n for (const child of geometry.geometries) {\n summarizeGeometry(child, summary);\n }\n return;\n }\n updateBounds(summary, geometry.coordinates);\n}\n\nfunction updateBounds(summary: GisSummary, coordinates: unknown): void {\n if (!Array.isArray(coordinates)) {\n return;\n }\n if (typeof coordinates[0] === \"number\" && typeof coordinates[1] === \"number\") {\n const lon = coordinates[0];\n const lat = coordinates[1];\n if (!Number.isFinite(lon) || !Number.isFinite(lat)) {\n return;\n }\n const bounds = summary.bounds || [lon, lat, lon, lat];\n bounds[0] = Math.min(bounds[0], lon);\n bounds[1] = Math.min(bounds[1], lat);\n bounds[2] = Math.max(bounds[2], lon);\n bounds[3] = Math.max(bounds[3], lat);\n summary.bounds = bounds;\n return;\n }\n for (const item of coordinates) {\n updateBounds(summary, item);\n }\n}\n\nfunction formatGeometryCounts(counts: Map<string, number>): string {\n return [...counts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 5)\n .map(([type, count]) => `${type} ${count}`)\n .join(\", \") || \"无\";\n}\n\nfunction formatBounds(bounds: [number, number, number, number]): string {\n return bounds.map((value) => Number(value.toFixed(5))).join(\", \");\n}\n\nasync function parseToGeoJson(\n file: PreviewFile,\n buffer: ArrayBuffer,\n togeojsonLib: any,\n topojsonClient: any,\n shpLib: any,\n JSZipLib: any\n): Promise<any> {\n const ext = resolveFormat(file, gisMimeFormatMap).toLowerCase();\n\n if (ext === \"geojson\") {\n const text = new TextDecoder().decode(buffer);\n return JSON.parse(text);\n }\n\n if (ext === \"topojson\") {\n const text = new TextDecoder().decode(buffer);\n const topology = JSON.parse(text);\n const geojsonFeatures: any[] = [];\n for (const key of Object.keys(topology.objects)) {\n const feature = topojsonClient.feature(topology, topology.objects[key]);\n if (feature.type === \"FeatureCollection\") {\n geojsonFeatures.push(...feature.features);\n } else {\n geojsonFeatures.push(feature);\n }\n }\n return {\n type: \"FeatureCollection\",\n features: geojsonFeatures\n };\n }\n\n if (ext === \"kml\") {\n const text = new TextDecoder().decode(buffer);\n const dom = new DOMParser().parseFromString(text, \"text/xml\");\n return togeojsonLib.kml(dom);\n }\n\n if (ext === \"gpx\") {\n const text = new TextDecoder().decode(buffer);\n const dom = new DOMParser().parseFromString(text, \"text/xml\");\n return togeojsonLib.gpx(dom);\n }\n\n if (ext === \"kmz\") {\n const zip = await JSZipLib.loadAsync(buffer);\n const kmlFile: any = Object.values(zip.files).find((f: any) => f.name.toLowerCase().endsWith(\".kml\"));\n if (!kmlFile) {\n throw new Error(\"No KML file found inside KMZ archive.\");\n }\n const kmlText = await kmlFile.async(\"text\");\n const dom = new DOMParser().parseFromString(kmlText, \"text/xml\");\n return togeojsonLib.kml(dom);\n }\n\n if (ext === \"shp\") {\n const u8 = new Uint8Array(buffer);\n const isZip = u8[0] === 0x50 && u8[1] === 0x4b && u8[2] === 0x03 && u8[3] === 0x04;\n if (!isZip) {\n return null; // Signals raw shapefile\n }\n const parsed = await shpLib(buffer);\n if (Array.isArray(parsed)) {\n const features: any[] = [];\n for (const item of parsed) {\n if (item.type === \"FeatureCollection\") {\n features.push(...item.features);\n } else if (item.type === \"Feature\") {\n features.push(item);\n }\n }\n return {\n type: \"FeatureCollection\",\n features\n };\n }\n return parsed;\n }\n\n // Mime type match fallback\n try {\n const text = new TextDecoder().decode(buffer);\n return JSON.parse(text);\n } catch {\n throw new Error(`Unsupported GIS format: ${ext}`);\n }\n}\n","import { createObjectUrl, revokeObjectUrl } from \"../dom\";\nimport type { PreviewPlugin } from \"../types\";\nimport { appendMeta, createPanel, createSection, readArrayBuffer, resolveFormat } from \"./utils\";\n\nconst assetExtensions = new Set([\n \"ttf\",\n \"otf\",\n \"woff\",\n \"woff2\",\n \"eot\",\n \"psd\",\n \"psb\",\n \"ai\",\n \"eps\",\n \"ps\",\n \"webarchive\",\n \"sqlite\",\n \"sqlite3\",\n \"db\",\n \"wasm\",\n \"parquet\",\n \"avro\"\n]);\n\nconst assetMimeFormatMap: Record<string, string> = {\n \"font/ttf\": \"ttf\",\n \"font/otf\": \"otf\",\n \"font/woff\": \"woff\",\n \"font/woff2\": \"woff2\",\n \"application/vnd.ms-fontobject\": \"eot\",\n \"image/vnd.adobe.photoshop\": \"psd\",\n \"application/postscript\": \"ps\",\n \"application/x-webarchive\": \"webarchive\",\n \"application/vnd.sqlite3\": \"sqlite\",\n \"application/x-sqlite3\": \"sqlite\",\n \"application/wasm\": \"wasm\",\n \"application/vnd.apache.parquet\": \"parquet\",\n \"application/avro\": \"avro\"\n};\n\nconst assetMimeTypes = new Set(Object.keys(assetMimeFormatMap));\n\nexport function assetPlugin(): PreviewPlugin {\n return {\n name: \"asset\",\n match(file) {\n return assetExtensions.has(file.extension) || assetMimeTypes.has(file.mimeType);\n },\n async render(ctx) {\n const panel = createPanel(\"ofv-asset\");\n ctx.viewport.append(panel);\n const url = createObjectUrl(ctx.file);\n const isExternal = Boolean(ctx.file.url);\n const extension = resolveFormat(ctx.file, assetMimeFormatMap).toLowerCase();\n const bytes = new Uint8Array(await readArrayBuffer(ctx.file).catch(() => new ArrayBuffer(0)));\n\n const section = createSection(assetTitle(extension));\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-asset-summary\";\n appendMeta(summary, \"文件\", ctx.file.name);\n appendMeta(summary, \"格式\", extension ? `.${extension}` : ctx.file.mimeType || \"未知\");\n appendMeta(summary, \"大小\", formatBytes(ctx.file.size ?? bytes.byteLength));\n appendMeta(summary, \"签名\", byteSignature(bytes));\n\n const note = document.createElement(\"p\");\n note.textContent = assetGuidance(extension);\n\n const download = document.createElement(\"a\");\n download.className = \"ofv-asset-download\";\n download.href = url;\n download.download = ctx.file.name;\n download.textContent = \"下载文件\";\n\n section.append(summary, note, download);\n if (isFontAsset(extension)) {\n section.append(await createFontPreview(extension, url, ctx.file.name, bytes));\n }\n if (extension === \"wasm\") {\n section.append(createWasmPreview(bytes));\n }\n if (extension === \"psd\" || extension === \"psb\") {\n section.append(createPhotoshopPreview(bytes));\n }\n if (extension === \"sqlite\" || extension === \"sqlite3\" || extension === \"db\") {\n section.append(createSqlitePreview(bytes));\n }\n if (extension === \"parquet\") {\n section.append(createParquetPreview(bytes));\n }\n if (extension === \"avro\") {\n section.append(createAvroPreview(bytes));\n }\n if (extension === \"webarchive\") {\n section.append(createWebArchivePreview(bytes));\n }\n if (extension === \"ai\" || extension === \"eps\" || extension === \"ps\") {\n section.append(createPostScriptPreview(bytes));\n }\n const preview = createHexPreview(bytes);\n if (preview) {\n section.append(preview);\n }\n panel.append(section);\n\n return {\n destroy() {\n revokeObjectUrl(url, isExternal);\n panel.remove();\n }\n };\n }\n };\n}\n\nfunction assetTitle(extension: string): string {\n if (isFontAsset(extension)) {\n return \"字体文件预览\";\n }\n if ([\"psd\", \"psb\", \"ai\", \"eps\", \"ps\"].includes(extension)) {\n return \"设计文件预览\";\n }\n if ([\"sqlite\", \"sqlite3\", \"db\", \"parquet\", \"avro\"].includes(extension)) {\n return \"数据文件预览\";\n }\n if (extension === \"wasm\") {\n return \"WebAssembly 文件预览\";\n }\n if (extension === \"webarchive\") {\n return \"网页归档预览\";\n }\n return \"资产文件预览\";\n}\n\nfunction assetGuidance(extension: string): string {\n if (isFontAsset(extension)) {\n return \"字体文件已识别,当前会使用 FontFace 展示字形样张,并解析 sfnt/WOFF 表目录和 name 元信息。\";\n }\n if (extension === \"psd\" || extension === \"psb\") {\n return \"PSD/PSB 已识别,当前会解析基础画布、通道、位深和颜色模式;图层缩略图可后续接入 psd.js/WASM 或服务端转换。\";\n }\n if ([\"ai\", \"eps\", \"ps\"].includes(extension)) {\n return \"PostScript/Illustrator 文件已识别,当前会解析文档头、BoundingBox 和常见 DSC 元信息;高保真图形可后续接入 Ghostscript/Illustrator 转换。\";\n }\n if ([\"sqlite\", \"sqlite3\", \"db\"].includes(extension)) {\n return \"SQLite 数据库已识别,当前会解析数据库头和 sqlite_schema 摘要;抽样数据可后续接入 sqlite-wasm 增强。\";\n }\n if (extension === \"parquet\" || extension === \"avro\") {\n return \"列式/序列化数据文件已识别,当前会解析容器头、元信息和 schema 摘要;抽样记录可后续接入专用解析器增强。\";\n }\n if (extension === \"wasm\") {\n return \"WASM 模块已识别,当前会解析版本、section 分布、imports、exports 和自定义 section 摘要。\";\n }\n if (extension === \"webarchive\") {\n return \"WebArchive 已识别,当前会解析 XML plist 主资源、MIME、编码和子资源数量;完整网页还原可后续接入资源包转换。\";\n }\n return \"该资产文件已识别,当前提供文件指纹和下载入口,后续可接入专用解析器增强。\";\n}\n\nfunction isFontAsset(extension: string): boolean {\n return [\"ttf\", \"otf\", \"woff\", \"woff2\", \"eot\"].includes(extension);\n}\n\nasync function createFontPreview(extension: string, url: string, fileName: string, bytes: Uint8Array): Promise<HTMLElement> {\n const preview = document.createElement(\"div\");\n preview.className = \"ofv-font-preview\";\n\n const heading = document.createElement(\"strong\");\n heading.textContent = \"字体样张\";\n\n const sample = document.createElement(\"div\");\n sample.className = \"ofv-font-sample\";\n sample.textContent = \"Open File Viewer 预览 1234567890\";\n\n const pangram = document.createElement(\"div\");\n pangram.className = \"ofv-font-pangram\";\n pangram.textContent = \"The quick brown fox jumps over the lazy dog.\";\n\n const meta = document.createElement(\"span\");\n meta.className = \"ofv-font-status\";\n\n preview.append(heading, sample, pangram, meta);\n\n if (!(\"FontFace\" in window) || !document.fonts) {\n meta.textContent = \"当前浏览器不支持 FontFace API,无法生成实时字形样张。\";\n preview.append(createFontInfoPreview(bytes, extension));\n return preview;\n }\n\n const family = `ofv-${fileName.replace(/[^a-z0-9_-]/gi, \"-\")}-${Date.now()}`;\n const format = fontFaceFormat(extension);\n const source = format ? `url(\"${url}\") format(\"${format}\")` : `url(\"${url}\")`;\n\n try {\n const fontFace = new FontFace(family, source);\n const loaded = await fontFace.load();\n document.fonts.add(loaded);\n sample.style.fontFamily = `\"${family}\", sans-serif`;\n pangram.style.fontFamily = `\"${family}\", sans-serif`;\n meta.textContent = \"已使用浏览器 FontFace API 加载字体样张。\";\n } catch (error) {\n meta.textContent = `字体样张加载失败:${error instanceof Error ? error.message : \"当前字体编码暂不受浏览器支持。\"}`;\n }\n\n preview.append(createFontInfoPreview(bytes, extension));\n return preview;\n}\n\nfunction fontFaceFormat(extension: string): string {\n const map: Record<string, string> = {\n ttf: \"truetype\",\n otf: \"opentype\",\n woff: \"woff\",\n woff2: \"woff2\",\n eot: \"embedded-opentype\"\n };\n return map[extension] || \"\";\n}\n\ntype FontTableEntry = {\n tag: string;\n checksum?: number;\n offset: number;\n length: number;\n compressedLength?: number;\n};\n\ntype FontNameRecord = {\n id: number;\n label: string;\n value: string;\n};\n\ntype FontContainerMeta = {\n label: string;\n value: string | number;\n};\n\ntype FontInfo = {\n valid: boolean;\n error?: string;\n container?: string;\n flavor?: string;\n tables: FontTableEntry[];\n names: FontNameRecord[];\n totalSfntSize?: number;\n meta?: FontContainerMeta[];\n};\n\nfunction createFontInfoPreview(bytes: Uint8Array, extension: string): HTMLElement {\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-font-info\";\n\n const heading = document.createElement(\"strong\");\n heading.textContent = \"字体结构\";\n wrapper.append(heading);\n\n const parsed = parseFontInfo(bytes, extension);\n if (!parsed.valid) {\n const error = document.createElement(\"p\");\n error.className = \"ofv-data-error\";\n error.textContent = parsed.error || \"无法解析字体结构。\";\n wrapper.append(error);\n return wrapper;\n }\n\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-data-summary\";\n appendMeta(summary, \"容器\", parsed.container || \"sfnt\");\n appendMeta(summary, \"Flavor\", parsed.flavor || \"未知\");\n appendMeta(summary, \"表数量\", parsed.tables.length);\n if (parsed.totalSfntSize !== undefined) {\n appendMeta(summary, \"展开大小\", formatBytes(parsed.totalSfntSize));\n }\n for (const item of parsed.meta || []) {\n appendMeta(summary, item.label, item.value);\n }\n wrapper.append(summary);\n\n if (parsed.error) {\n const note = document.createElement(\"p\");\n note.className = \"ofv-data-note\";\n note.textContent = parsed.error;\n wrapper.append(note);\n }\n\n if (parsed.names.length > 0) {\n wrapper.append(createKeyValueTable(\"Name\", parsed.names.map((item) => ({ key: item.label, value: item.value }))));\n }\n\n if (parsed.tables.length > 0) {\n wrapper.append(createFontTablePreview(parsed.tables));\n }\n return wrapper;\n}\n\nfunction createFontTablePreview(tables: FontTableEntry[]): HTMLElement {\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-font-tables\";\n const title = document.createElement(\"strong\");\n title.textContent = \"Tables\";\n\n const table = document.createElement(\"table\");\n const thead = document.createElement(\"thead\");\n const headRow = document.createElement(\"tr\");\n for (const label of [\"Tag\", \"Offset\", \"Length\", \"Compressed\", \"Checksum\"]) {\n const th = document.createElement(\"th\");\n th.textContent = label;\n headRow.append(th);\n }\n thead.append(headRow);\n\n const tbody = document.createElement(\"tbody\");\n for (const entry of tables.slice(0, 80)) {\n const row = document.createElement(\"tr\");\n for (const value of [\n entry.tag,\n `0x${entry.offset.toString(16).toUpperCase()}`,\n formatBytes(entry.length),\n entry.compressedLength === undefined ? \"-\" : formatBytes(entry.compressedLength),\n entry.checksum === undefined ? \"-\" : `0x${entry.checksum.toString(16).padStart(8, \"0\").toUpperCase()}`\n ]) {\n const cell = document.createElement(\"td\");\n cell.textContent = value;\n row.append(cell);\n }\n tbody.append(row);\n }\n table.append(thead, tbody);\n wrapper.append(title, table);\n return wrapper;\n}\n\nfunction parseFontInfo(bytes: Uint8Array, extension: string): FontInfo {\n if (bytes.length < 4) {\n return { valid: false, error: \"文件太短,无法读取字体头。\", tables: [], names: [] };\n }\n const signature = asciiAt(bytes, 0, 4);\n if (signature === \"wOFF\") {\n return parseWoffFont(bytes);\n }\n if (signature === \"wOF2\") {\n return parseWoff2Font(bytes);\n }\n if (extension === \"eot\") {\n return parseEotFont(bytes);\n }\n return parseSfntFont(bytes, 0, \"sfnt\");\n}\n\nfunction parseSfntFont(bytes: Uint8Array, offset: number, container: string): FontInfo {\n if (offset + 12 > bytes.length) {\n return { valid: false, error: \"文件太短,无法读取 sfnt offset table。\", tables: [], names: [] };\n }\n const flavor = fontFlavor(bytes, offset);\n if (!flavor) {\n return { valid: false, error: \"缺少有效的 TrueType/OpenType sfnt 头。\", tables: [], names: [] };\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const tableCount = view.getUint16(offset + 4, false);\n const directoryEnd = offset + 12 + tableCount * 16;\n if (tableCount <= 0 || directoryEnd > bytes.length) {\n return { valid: false, error: \"sfnt 表目录超出文件边界。\", tables: [], names: [] };\n }\n const tables: FontTableEntry[] = [];\n for (let index = 0; index < tableCount; index++) {\n const entryOffset = offset + 12 + index * 16;\n tables.push({\n tag: asciiAt(bytes, entryOffset, 4),\n checksum: view.getUint32(entryOffset + 4, false),\n offset: view.getUint32(entryOffset + 8, false),\n length: view.getUint32(entryOffset + 12, false)\n });\n }\n return {\n valid: true,\n container,\n flavor,\n tables,\n names: parseFontNameTable(bytes, tables.find((table) => table.tag === \"name\"))\n };\n}\n\nfunction parseWoffFont(bytes: Uint8Array): FontInfo {\n if (bytes.length < 44) {\n return { valid: false, error: \"文件太短,无法读取 WOFF 头。\", tables: [], names: [] };\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const tableCount = view.getUint16(12, false);\n const directoryEnd = 44 + tableCount * 20;\n if (tableCount <= 0 || directoryEnd > bytes.length) {\n return { valid: false, error: \"WOFF 表目录超出文件边界。\", tables: [], names: [] };\n }\n const tables: FontTableEntry[] = [];\n for (let index = 0; index < tableCount; index++) {\n const entryOffset = 44 + index * 20;\n tables.push({\n tag: asciiAt(bytes, entryOffset, 4),\n offset: view.getUint32(entryOffset + 4, false),\n compressedLength: view.getUint32(entryOffset + 8, false),\n length: view.getUint32(entryOffset + 12, false),\n checksum: view.getUint32(entryOffset + 16, false)\n });\n }\n return {\n valid: true,\n container: \"WOFF\",\n flavor: fontFlavor(bytes, 4) || asciiAt(bytes, 4, 4),\n tables,\n names: parseFontNameTable(bytes, tables.find((table) => table.tag === \"name\" && table.compressedLength === table.length)),\n totalSfntSize: view.getUint32(16, false)\n };\n}\n\nfunction parseWoff2Font(bytes: Uint8Array): FontInfo {\n if (bytes.length < 48) {\n return { valid: false, error: \"文件太短,无法读取 WOFF2 头。\", tables: [], names: [] };\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const tableCount = view.getUint16(12, false);\n let offset = 48;\n const tables: FontTableEntry[] = [];\n for (let index = 0; index < tableCount; index++) {\n if (offset >= bytes.length) {\n return { valid: false, error: \"WOFF2 表目录超出文件边界。\", tables: [], names: [] };\n }\n const flags = bytes[offset++];\n const knownTag = flags & 0x3f;\n let tag = woff2KnownTableTag(knownTag);\n if (knownTag === 0x3f) {\n if (offset + 4 > bytes.length) {\n return { valid: false, error: \"WOFF2 自定义表 tag 超出文件边界。\", tables: [], names: [] };\n }\n tag = asciiAt(bytes, offset, 4);\n offset += 4;\n }\n const originalLength = read255UInt16(bytes, offset);\n if (!originalLength) {\n return { valid: false, error: \"WOFF2 表目录长度字段不完整。\", tables: [], names: [] };\n }\n offset = originalLength.offset;\n let transformedLength: number | undefined;\n const hasTransform = (flags & 0xc0) !== 0 || (tag === \"glyf\" && (flags & 0xc0) !== 0) || (tag === \"loca\" && (flags & 0xc0) !== 0);\n if (hasTransform && tag !== \"loca\") {\n const transformed = read255UInt16(bytes, offset);\n if (!transformed) {\n return { valid: false, error: \"WOFF2 transformLength 字段不完整。\", tables: [], names: [] };\n }\n transformedLength = transformed.value;\n offset = transformed.offset;\n }\n tables.push({\n tag,\n offset: 0,\n length: originalLength.value,\n compressedLength: transformedLength\n });\n }\n return {\n valid: true,\n container: \"WOFF2\",\n flavor: fontFlavor(bytes, 4) || asciiAt(bytes, 4, 4),\n tables,\n names: [],\n totalSfntSize: view.getUint32(16, false),\n meta: [\n { label: \"压缩数据\", value: formatBytes(view.getUint32(20, false)) },\n { label: \"Meta\", value: view.getUint32(32, false) > 0 ? `${formatBytes(view.getUint32(36, false))} @ 0x${view.getUint32(32, false).toString(16).toUpperCase()}` : \"无\" },\n { label: \"Private\", value: view.getUint32(40, false) > 0 ? `${formatBytes(view.getUint32(44, false))} @ 0x${view.getUint32(40, false).toString(16).toUpperCase()}` : \"无\" }\n ],\n error: \"WOFF2 已解析容器头和压缩表目录;name 表内容需 Brotli 解压后才能展开。\"\n };\n}\n\nfunction parseEotFont(bytes: Uint8Array): FontInfo {\n if (bytes.length < 82) {\n return { valid: false, error: \"文件太短,无法读取 EOT 头。\", tables: [], names: [] };\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const eotSize = view.getUint32(0, true);\n const fontDataSize = view.getUint32(4, true);\n const version = view.getUint32(8, true);\n const flags = view.getUint32(12, true);\n const panose = Array.from(bytes.slice(16, 26)).map((item) => item.toString(16).padStart(2, \"0\")).join(\" \");\n const charset = bytes[26];\n const italic = bytes[27];\n const weight = view.getUint32(28, true);\n let offset = 68;\n const names: FontNameRecord[] = [];\n const fields: Array<{ id: number; label: string; padded: boolean }> = [\n { id: 1, label: \"Family\", padded: true },\n { id: 2, label: \"Subfamily\", padded: true },\n { id: 5, label: \"Version\", padded: true },\n { id: 4, label: \"Full name\", padded: true },\n { id: 0, label: \"Root strings\", padded: false }\n ];\n for (const field of fields) {\n const fieldValue = readEotStringField(bytes, offset, field.padded);\n if (!fieldValue) {\n break;\n }\n offset = fieldValue.offset;\n if (field.id > 0 && fieldValue.value) {\n names.push({ id: field.id, label: field.label, value: fieldValue.value });\n }\n }\n if (offset + 4 <= bytes.length) {\n offset += 4;\n }\n const sfntOffset = findEmbeddedSfntOffset(bytes, offset);\n const embedded = sfntOffset === undefined ? undefined : parseSfntFont(bytes, sfntOffset, \"EOT embedded sfnt\");\n return {\n valid: true,\n container: \"EOT\",\n flavor: embedded?.valid ? embedded.flavor : \"Embedded OpenType\",\n tables: embedded?.valid ? embedded.tables : [],\n names: embedded?.valid && embedded.names.length > 0 ? embedded.names : names,\n totalSfntSize: fontDataSize || undefined,\n meta: [\n { label: \"EOT 大小\", value: eotSize ? formatBytes(eotSize) : \"未声明\" },\n { label: \"版本\", value: `0x${version.toString(16).toUpperCase()}` },\n { label: \"Flags\", value: `0x${flags.toString(16).toUpperCase()}` },\n { label: \"Weight\", value: weight || \"未声明\" },\n { label: \"Italic\", value: italic ? \"是\" : \"否\" },\n { label: \"Charset\", value: charset },\n { label: \"PANOSE\", value: panose },\n { label: \"sfnt 偏移\", value: sfntOffset === undefined ? \"未找到\" : `0x${sfntOffset.toString(16).toUpperCase()}` }\n ],\n error: embedded?.valid ? undefined : \"已解析 EOT 容器头和名称字段,但未找到可展开的内嵌 sfnt 表目录。\"\n };\n}\n\nfunction readEotStringField(bytes: Uint8Array, offset: number, padded: boolean): { value: string; offset: number } | undefined {\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n if (padded) {\n if (offset + 2 > bytes.length) {\n return undefined;\n }\n offset += 2;\n }\n if (offset + 2 > bytes.length) {\n return undefined;\n }\n const length = view.getUint16(offset, true);\n offset += 2;\n if (offset + length > bytes.length) {\n return undefined;\n }\n const value = length > 0 ? decodeEotString(bytes.slice(offset, offset + length)) : \"\";\n return { value, offset: offset + length };\n}\n\nfunction woff2KnownTableTag(index: number): string {\n const tags = [\n \"cmap\",\n \"head\",\n \"hhea\",\n \"hmtx\",\n \"maxp\",\n \"name\",\n \"OS/2\",\n \"post\",\n \"cvt \",\n \"fpgm\",\n \"glyf\",\n \"loca\",\n \"prep\",\n \"CFF \",\n \"VORG\",\n \"EBDT\",\n \"EBLC\",\n \"gasp\",\n \"hdmx\",\n \"kern\",\n \"LTSH\",\n \"PCLT\",\n \"VDMX\",\n \"vhea\",\n \"vmtx\",\n \"BASE\",\n \"GDEF\",\n \"GPOS\",\n \"GSUB\",\n \"EBSC\",\n \"JSTF\",\n \"MATH\",\n \"CBDT\",\n \"CBLC\",\n \"COLR\",\n \"CPAL\",\n \"SVG \",\n \"sbix\",\n \"acnt\",\n \"avar\",\n \"bdat\",\n \"bloc\",\n \"bsln\",\n \"cvar\",\n \"fdsc\",\n \"feat\",\n \"fmtx\",\n \"fvar\",\n \"gvar\",\n \"hsty\",\n \"just\",\n \"lcar\",\n \"mort\",\n \"morx\",\n \"opbd\",\n \"prop\",\n \"trak\",\n \"Zapf\",\n \"Silf\",\n \"Glat\",\n \"Gloc\",\n \"Feat\",\n \"Sill\"\n ];\n return tags[index] || `table-${index}`;\n}\n\nfunction read255UInt16(bytes: Uint8Array, offset: number): { value: number; offset: number } | undefined {\n if (offset >= bytes.length) {\n return undefined;\n }\n const code = bytes[offset++];\n if (code === 253) {\n if (offset + 2 > bytes.length) {\n return undefined;\n }\n return { value: (bytes[offset] << 8) | bytes[offset + 1], offset: offset + 2 };\n }\n if (code === 254) {\n if (offset >= bytes.length) {\n return undefined;\n }\n return { value: bytes[offset] + 506, offset: offset + 1 };\n }\n if (code === 255) {\n if (offset >= bytes.length) {\n return undefined;\n }\n return { value: bytes[offset] + 253, offset: offset + 1 };\n }\n return { value: code, offset };\n}\n\nfunction decodeEotString(bytes: Uint8Array): string {\n const text = decodeUtf16Le(bytes).replace(/\\0+$/g, \"\").trim();\n return text || new TextDecoder(\"latin1\").decode(bytes).replace(/\\0+$/g, \"\").trim();\n}\n\nfunction decodeUtf16Le(bytes: Uint8Array): string {\n let value = \"\";\n for (let index = 0; index + 1 < bytes.length; index += 2) {\n value += String.fromCharCode(bytes[index] | (bytes[index + 1] << 8));\n }\n return value;\n}\n\nfunction findEmbeddedSfntOffset(bytes: Uint8Array, start: number): number | undefined {\n for (let offset = Math.max(0, start); offset + 12 <= bytes.length; offset++) {\n const flavor = fontFlavor(bytes, offset);\n if (!flavor) {\n continue;\n }\n const tableCount = (bytes[offset + 4] << 8) | bytes[offset + 5];\n const directoryEnd = offset + 12 + tableCount * 16;\n if (tableCount > 0 && directoryEnd <= bytes.length) {\n return offset;\n }\n }\n return undefined;\n}\n\nfunction fontFlavor(bytes: Uint8Array, offset: number): string | undefined {\n if (offset + 4 > bytes.length) {\n return undefined;\n }\n const ascii = asciiAt(bytes, offset, 4);\n if (ascii === \"OTTO\") {\n return \"OpenType/CFF\";\n }\n if (ascii === \"true\") {\n return \"Apple TrueType\";\n }\n if (ascii === \"typ1\") {\n return \"Type 1 sfnt\";\n }\n if (bytes[offset] === 0x00 && bytes[offset + 1] === 0x01 && bytes[offset + 2] === 0x00 && bytes[offset + 3] === 0x00) {\n return \"TrueType\";\n }\n return undefined;\n}\n\nfunction parseFontNameTable(bytes: Uint8Array, table?: FontTableEntry): FontNameRecord[] {\n if (!table || table.offset + table.length > bytes.length || table.length < 6) {\n return [];\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const offset = table.offset;\n const count = view.getUint16(offset + 2, false);\n const storageOffset = view.getUint16(offset + 4, false);\n const recordsEnd = offset + 6 + count * 12;\n if (recordsEnd > bytes.length || storageOffset > table.length) {\n return [];\n }\n const wanted = new Map<number, string>([\n [1, \"Family\"],\n [2, \"Subfamily\"],\n [4, \"Full name\"],\n [5, \"Version\"],\n [6, \"PostScript name\"],\n [8, \"Manufacturer\"],\n [13, \"License\"],\n [16, \"Typographic family\"],\n [17, \"Typographic subfamily\"]\n ]);\n const names = new Map<number, FontNameRecord>();\n for (let index = 0; index < count; index++) {\n const recordOffset = offset + 6 + index * 12;\n const platformId = view.getUint16(recordOffset, false);\n const encodingId = view.getUint16(recordOffset + 2, false);\n const languageId = view.getUint16(recordOffset + 4, false);\n const nameId = view.getUint16(recordOffset + 6, false);\n const length = view.getUint16(recordOffset + 8, false);\n const stringOffset = view.getUint16(recordOffset + 10, false);\n const label = wanted.get(nameId);\n if (!label || names.has(nameId)) {\n continue;\n }\n const start = offset + storageOffset + stringOffset;\n const end = start + length;\n if (end > bytes.length || end > offset + table.length) {\n continue;\n }\n const value = decodeFontName(bytes.slice(start, end), platformId, encodingId).trim();\n if (value) {\n names.set(nameId, { id: nameId, label: languageId ? `${label} (${languageId.toString(16).toUpperCase()})` : label, value });\n }\n }\n return [...names.values()];\n}\n\nfunction decodeFontName(bytes: Uint8Array, platformId: number, encodingId: number): string {\n if (platformId === 0 || platformId === 3 || (platformId === 2 && encodingId === 1)) {\n return decodeUtf16Be(bytes);\n }\n return new TextDecoder(\"latin1\").decode(bytes);\n}\n\nfunction decodeUtf16Be(bytes: Uint8Array): string {\n let value = \"\";\n for (let index = 0; index + 1 < bytes.length; index += 2) {\n value += String.fromCharCode((bytes[index] << 8) | bytes[index + 1]);\n }\n return value;\n}\n\ntype WasmSection = {\n id: number;\n name: string;\n size: number;\n offset: number;\n customName?: string;\n};\n\ntype WasmImport = {\n module: string;\n name: string;\n kind: string;\n};\n\ntype WasmExport = {\n name: string;\n kind: string;\n index: number;\n};\n\ntype WasmPreview = {\n valid: boolean;\n version?: number;\n error?: string;\n sections: WasmSection[];\n imports: WasmImport[];\n exports: WasmExport[];\n};\n\nfunction createWasmPreview(bytes: Uint8Array): HTMLElement {\n const preview = document.createElement(\"div\");\n preview.className = \"ofv-wasm-preview\";\n const parsed = parseWasm(bytes);\n\n const heading = document.createElement(\"strong\");\n heading.textContent = \"WASM 结构\";\n preview.append(heading);\n\n if (!parsed.valid) {\n const error = document.createElement(\"p\");\n error.className = \"ofv-wasm-error\";\n error.textContent = parsed.error || \"不是有效的 WebAssembly 二进制模块。\";\n preview.append(error);\n return preview;\n }\n\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-wasm-summary\";\n appendMeta(summary, \"版本\", parsed.version ?? \"未知\");\n appendMeta(summary, \"Sections\", parsed.sections.length);\n appendMeta(summary, \"Imports\", parsed.imports.length);\n appendMeta(summary, \"Exports\", parsed.exports.length);\n preview.append(summary);\n\n preview.append(createWasmSectionTable(parsed.sections));\n if (parsed.imports.length > 0) {\n preview.append(createWasmList(\"导入\", parsed.imports.map((item) => `${item.module}.${item.name} · ${item.kind}`)));\n }\n if (parsed.exports.length > 0) {\n preview.append(createWasmList(\"导出\", parsed.exports.map((item) => `${item.name} · ${item.kind} #${item.index}`)));\n }\n\n return preview;\n}\n\nfunction createWasmSectionTable(sections: WasmSection[]): HTMLElement {\n const table = document.createElement(\"table\");\n table.className = \"ofv-wasm-sections\";\n const thead = document.createElement(\"thead\");\n const header = document.createElement(\"tr\");\n for (const label of [\"Section\", \"大小\", \"偏移\"]) {\n const th = document.createElement(\"th\");\n th.textContent = label;\n header.append(th);\n }\n thead.append(header);\n const tbody = document.createElement(\"tbody\");\n for (const section of sections.slice(0, 80)) {\n const row = document.createElement(\"tr\");\n const name = document.createElement(\"td\");\n name.textContent = section.customName ? `${section.name} (${section.customName})` : section.name;\n const size = document.createElement(\"td\");\n size.textContent = formatBytes(section.size);\n const offset = document.createElement(\"td\");\n offset.textContent = `0x${section.offset.toString(16).toUpperCase()}`;\n row.append(name, size, offset);\n tbody.append(row);\n }\n table.append(thead, tbody);\n return table;\n}\n\nfunction createWasmList(titleText: string, rows: string[]): HTMLElement {\n const details = document.createElement(\"details\");\n details.className = \"ofv-details ofv-wasm-list\";\n details.open = true;\n const summary = document.createElement(\"summary\");\n summary.textContent = `${titleText} ${rows.length}`;\n const list = document.createElement(\"ul\");\n for (const row of rows.slice(0, 120)) {\n const item = document.createElement(\"li\");\n item.textContent = row;\n list.append(item);\n }\n if (rows.length > 120) {\n const item = document.createElement(\"li\");\n item.textContent = `还有 ${rows.length - 120} 项未展示。`;\n list.append(item);\n }\n details.append(summary, list);\n return details;\n}\n\nfunction parseWasm(bytes: Uint8Array): WasmPreview {\n if (bytes.length < 8 || bytes[0] !== 0x00 || bytes[1] !== 0x61 || bytes[2] !== 0x73 || bytes[3] !== 0x6d) {\n return { valid: false, error: \"缺少 WebAssembly magic header。\", sections: [], imports: [], exports: [] };\n }\n\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const version = view.getUint32(4, true);\n const sections: WasmSection[] = [];\n const imports: WasmImport[] = [];\n const exports: WasmExport[] = [];\n let offset = 8;\n\n try {\n while (offset < bytes.length) {\n const sectionOffset = offset;\n const id = bytes[offset++];\n const sizeInfo = readVarUint(bytes, offset);\n offset = sizeInfo.offset;\n const payloadOffset = offset;\n const payloadEnd = payloadOffset + sizeInfo.value;\n if (payloadEnd > bytes.length) {\n throw new Error(\"section 长度超过文件边界。\");\n }\n\n const section: WasmSection = {\n id,\n name: wasmSectionName(id),\n size: sizeInfo.value,\n offset: sectionOffset\n };\n if (id === 0) {\n const customName = readWasmName(bytes, payloadOffset, payloadEnd);\n section.customName = customName.value || undefined;\n } else if (id === 2) {\n imports.push(...parseWasmImports(bytes, payloadOffset, payloadEnd));\n } else if (id === 7) {\n exports.push(...parseWasmExports(bytes, payloadOffset, payloadEnd));\n }\n sections.push(section);\n offset = payloadEnd;\n }\n } catch (error) {\n return {\n valid: false,\n version,\n error: error instanceof Error ? error.message : \"WASM section 解析失败。\",\n sections,\n imports,\n exports\n };\n }\n\n return { valid: true, version, sections, imports, exports };\n}\n\nfunction parseWasmImports(bytes: Uint8Array, offset: number, end: number): WasmImport[] {\n const imports: WasmImport[] = [];\n const count = readVarUint(bytes, offset);\n offset = count.offset;\n for (let index = 0; index < count.value && offset < end; index++) {\n const moduleName = readWasmName(bytes, offset, end);\n offset = moduleName.offset;\n const importName = readWasmName(bytes, offset, end);\n offset = importName.offset;\n const kind = bytes[offset++];\n offset = skipWasmImportDescriptor(bytes, offset, end, kind);\n imports.push({ module: moduleName.value, name: importName.value, kind: wasmExternalKind(kind) });\n }\n return imports;\n}\n\nfunction parseWasmExports(bytes: Uint8Array, offset: number, end: number): WasmExport[] {\n const exports: WasmExport[] = [];\n const count = readVarUint(bytes, offset);\n offset = count.offset;\n for (let index = 0; index < count.value && offset < end; index++) {\n const exportName = readWasmName(bytes, offset, end);\n offset = exportName.offset;\n const kind = bytes[offset++];\n const itemIndex = readVarUint(bytes, offset);\n offset = itemIndex.offset;\n exports.push({ name: exportName.value, kind: wasmExternalKind(kind), index: itemIndex.value });\n }\n return exports;\n}\n\nfunction skipWasmImportDescriptor(bytes: Uint8Array, offset: number, end: number, kind: number): number {\n if (kind === 0x00) {\n return readVarUint(bytes, offset).offset;\n }\n if (kind === 0x01) {\n const elementTypeOffset = offset + 1;\n return skipWasmLimits(bytes, elementTypeOffset, end);\n }\n if (kind === 0x02) {\n return skipWasmLimits(bytes, offset, end);\n }\n if (kind === 0x03) {\n return Math.min(end, offset + 2);\n }\n return offset;\n}\n\nfunction skipWasmLimits(bytes: Uint8Array, offset: number, end: number): number {\n const flags = bytes[offset++];\n offset = readVarUint(bytes, offset).offset;\n if ((flags & 0x01) === 0x01 && offset < end) {\n offset = readVarUint(bytes, offset).offset;\n }\n return offset;\n}\n\nfunction readVarUint(bytes: Uint8Array, offset: number): { value: number; offset: number } {\n let result = 0;\n let shift = 0;\n for (let index = 0; index < 5; index++) {\n if (offset >= bytes.length) {\n throw new Error(\"LEB128 数据不完整。\");\n }\n const byte = bytes[offset++];\n result |= (byte & 0x7f) << shift;\n if ((byte & 0x80) === 0) {\n return { value: result >>> 0, offset };\n }\n shift += 7;\n }\n throw new Error(\"LEB128 数据过长。\");\n}\n\nfunction readWasmName(bytes: Uint8Array, offset: number, end: number): { value: string; offset: number } {\n const length = readVarUint(bytes, offset);\n offset = length.offset;\n const nameEnd = offset + length.value;\n if (nameEnd > end) {\n throw new Error(\"字符串长度超过 section 边界。\");\n }\n return { value: new TextDecoder().decode(bytes.slice(offset, nameEnd)), offset: nameEnd };\n}\n\nfunction wasmSectionName(id: number): string {\n const names: Record<number, string> = {\n 0: \"custom\",\n 1: \"type\",\n 2: \"import\",\n 3: \"function\",\n 4: \"table\",\n 5: \"memory\",\n 6: \"global\",\n 7: \"export\",\n 8: \"start\",\n 9: \"element\",\n 10: \"code\",\n 11: \"data\",\n 12: \"data-count\"\n };\n return names[id] || `unknown ${id}`;\n}\n\nfunction wasmExternalKind(kind: number): string {\n const names: Record<number, string> = {\n 0x00: \"function\",\n 0x01: \"table\",\n 0x02: \"memory\",\n 0x03: \"global\"\n };\n return names[kind] || `unknown ${kind}`;\n}\n\ntype PhotoshopHeader = {\n valid: boolean;\n error?: string;\n signature?: string;\n version?: number;\n channels?: number;\n width?: number;\n height?: number;\n depth?: number;\n colorMode?: number;\n};\n\nfunction createPhotoshopPreview(bytes: Uint8Array): HTMLElement {\n const preview = document.createElement(\"div\");\n preview.className = \"ofv-psd-preview\";\n const heading = document.createElement(\"strong\");\n heading.textContent = \"Photoshop 结构\";\n preview.append(heading);\n\n const header = parsePhotoshopHeader(bytes);\n if (!header.valid) {\n const error = document.createElement(\"p\");\n error.className = \"ofv-psd-error\";\n error.textContent = header.error || \"不是有效的 Photoshop 文档头。\";\n preview.append(error);\n return preview;\n }\n\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-psd-summary\";\n appendMeta(summary, \"版本\", header.version === 2 ? \"PSB 大文档\" : \"PSD\");\n appendMeta(summary, \"画布\", `${header.width} x ${header.height}px`);\n appendMeta(summary, \"通道\", header.channels ?? \"未知\");\n appendMeta(summary, \"位深\", `${header.depth ?? \"未知\"} bit`);\n appendMeta(summary, \"颜色模式\", photoshopColorMode(header.colorMode ?? -1));\n preview.append(summary);\n\n return preview;\n}\n\nfunction parsePhotoshopHeader(bytes: Uint8Array): PhotoshopHeader {\n if (bytes.length < 26) {\n return { valid: false, error: \"文件太短,无法读取 PSD/PSB 头信息。\" };\n }\n const signature = new TextDecoder(\"ascii\").decode(bytes.slice(0, 4));\n if (signature !== \"8BPS\") {\n return { valid: false, signature, error: \"缺少 8BPS Photoshop 签名。\" };\n }\n\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const version = view.getUint16(4, false);\n if (version !== 1 && version !== 2) {\n return { valid: false, signature, version, error: `未知 Photoshop 文件版本:${version}。` };\n }\n\n const reserved = bytes.slice(6, 12);\n if (reserved.some((byte) => byte !== 0)) {\n return { valid: false, signature, version, error: \"PSD/PSB 保留字段不为 0,文件头可能已损坏。\" };\n }\n\n return {\n valid: true,\n signature,\n version,\n channels: view.getUint16(12, false),\n height: view.getUint32(14, false),\n width: view.getUint32(18, false),\n depth: view.getUint16(22, false),\n colorMode: view.getUint16(24, false)\n };\n}\n\nfunction photoshopColorMode(mode: number): string {\n const modes: Record<number, string> = {\n 0: \"Bitmap\",\n 1: \"Grayscale\",\n 2: \"Indexed\",\n 3: \"RGB\",\n 4: \"CMYK\",\n 7: \"Multichannel\",\n 8: \"Duotone\",\n 9: \"Lab\"\n };\n return modes[mode] ? `${modes[mode]} (${mode})` : `未知 (${mode})`;\n}\n\ntype SqliteHeader = {\n valid: boolean;\n error?: string;\n pageSize?: number;\n writeVersion?: number;\n readVersion?: number;\n pageCount?: number;\n schemaVersion?: number;\n textEncoding?: number;\n userVersion?: number;\n};\n\ntype SqliteSchemaEntry = {\n type: string;\n name: string;\n tableName: string;\n rootPage: number;\n sql: string;\n};\n\nfunction createSqlitePreview(bytes: Uint8Array): HTMLElement {\n const preview = document.createElement(\"div\");\n preview.className = \"ofv-sqlite-preview\";\n const heading = document.createElement(\"strong\");\n heading.textContent = \"SQLite 结构\";\n preview.append(heading);\n\n const header = parseSqliteHeader(bytes);\n if (!header.valid) {\n const error = document.createElement(\"p\");\n error.className = \"ofv-sqlite-error\";\n error.textContent = header.error || \"不是有效的 SQLite 数据库文件。\";\n preview.append(error);\n return preview;\n }\n\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-sqlite-summary\";\n appendMeta(summary, \"页大小\", `${header.pageSize} B`);\n appendMeta(summary, \"页数\", header.pageCount ?? \"未知\");\n appendMeta(summary, \"读写版本\", `${sqliteJournalMode(header.readVersion)} / ${sqliteJournalMode(header.writeVersion)}`);\n appendMeta(summary, \"Schema\", header.schemaVersion ?? \"未知\");\n appendMeta(summary, \"编码\", sqliteEncoding(header.textEncoding));\n appendMeta(summary, \"User version\", header.userVersion ?? 0);\n preview.append(summary);\n\n const schema = parseSqliteSchema(bytes, header);\n if (schema.length > 0) {\n preview.append(createSqliteSchemaTable(schema));\n } else {\n const empty = document.createElement(\"p\");\n empty.className = \"ofv-sqlite-empty\";\n empty.textContent = \"未从第一页 sqlite_schema 叶子页提取到结构定义;复杂数据库可后续接入 sqlite-wasm 完整读取。\";\n preview.append(empty);\n }\n\n return preview;\n}\n\nfunction parseSqliteHeader(bytes: Uint8Array): SqliteHeader {\n if (bytes.length < 100) {\n return { valid: false, error: \"文件太短,无法读取 SQLite 数据库头。\" };\n }\n const signature = new TextDecoder(\"ascii\").decode(bytes.slice(0, 16));\n if (signature !== \"SQLite format 3\\0\") {\n return { valid: false, error: \"缺少 SQLite format 3 文件签名。\" };\n }\n\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const rawPageSize = view.getUint16(16, false);\n const pageSize = rawPageSize === 1 ? 65536 : rawPageSize;\n if (pageSize < 512 || pageSize > 65536 || (pageSize & (pageSize - 1)) !== 0) {\n return { valid: false, error: `SQLite 页大小无效:${pageSize}。` };\n }\n\n return {\n valid: true,\n pageSize,\n writeVersion: bytes[18],\n readVersion: bytes[19],\n pageCount: view.getUint32(28, false),\n schemaVersion: view.getUint32(40, false),\n textEncoding: view.getUint32(56, false),\n userVersion: view.getUint32(60, false)\n };\n}\n\nfunction parseSqliteSchema(bytes: Uint8Array, header: SqliteHeader): SqliteSchemaEntry[] {\n const pageSize = header.pageSize || 0;\n if (pageSize <= 0 || bytes.length < Math.min(pageSize, 100)) {\n return [];\n }\n const pageStart = 0;\n const btreeStart = 100;\n if (bytes[btreeStart] !== 0x0d) {\n return [];\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const cellCount = view.getUint16(btreeStart + 3, false);\n const entries: SqliteSchemaEntry[] = [];\n for (let index = 0; index < Math.min(cellCount, 80); index++) {\n const pointerOffset = btreeStart + 8 + index * 2;\n if (pointerOffset + 2 > bytes.length) {\n break;\n }\n const cellOffset = pageStart + view.getUint16(pointerOffset, false);\n const entry = parseSqliteSchemaCell(bytes, cellOffset, pageStart + pageSize);\n if (entry) {\n entries.push(entry);\n }\n }\n return entries;\n}\n\nfunction parseSqliteSchemaCell(bytes: Uint8Array, offset: number, pageEnd: number): SqliteSchemaEntry | null {\n try {\n let cursor = offset;\n const payloadLength = readSqliteVarint(bytes, cursor);\n cursor = payloadLength.offset;\n const rowId = readSqliteVarint(bytes, cursor);\n cursor = rowId.offset;\n const payloadEnd = Math.min(pageEnd, cursor + Number(payloadLength.value));\n if (payloadEnd > bytes.length) {\n return null;\n }\n const record = parseSqliteRecord(bytes, cursor, payloadEnd);\n if (record.length < 5) {\n return null;\n }\n return {\n type: String(record[0] ?? \"\"),\n name: String(record[1] ?? \"\"),\n tableName: String(record[2] ?? \"\"),\n rootPage: Number(record[3] ?? 0),\n sql: String(record[4] ?? \"\")\n };\n } catch {\n return null;\n }\n}\n\nfunction parseSqliteRecord(bytes: Uint8Array, offset: number, end: number): Array<string | number | null> {\n const headerSize = readSqliteVarint(bytes, offset);\n let headerCursor = headerSize.offset;\n const bodyStart = offset + Number(headerSize.value);\n let bodyCursor = bodyStart;\n const serialTypes: bigint[] = [];\n while (headerCursor < bodyStart && headerCursor < end) {\n const serial = readSqliteVarint(bytes, headerCursor);\n serialTypes.push(serial.value);\n headerCursor = serial.offset;\n }\n return serialTypes.map((serialType) => {\n const value = readSqliteValue(bytes, bodyCursor, end, serialType);\n bodyCursor = value.offset;\n return value.value;\n });\n}\n\nfunction readSqliteValue(\n bytes: Uint8Array,\n offset: number,\n end: number,\n serialType: bigint\n): { value: string | number | null; offset: number } {\n const type = Number(serialType);\n if (type === 0) {\n return { value: null, offset };\n }\n if (type === 1) {\n return { value: signedInteger(bytes, offset, 1), offset: offset + 1 };\n }\n if (type === 2) {\n return { value: signedInteger(bytes, offset, 2), offset: offset + 2 };\n }\n if (type === 3) {\n return { value: signedInteger(bytes, offset, 3), offset: offset + 3 };\n }\n if (type === 4) {\n return { value: signedInteger(bytes, offset, 4), offset: offset + 4 };\n }\n if (type === 5) {\n return { value: signedInteger(bytes, offset, 6), offset: offset + 6 };\n }\n if (type === 6) {\n return { value: signedInteger(bytes, offset, 8), offset: offset + 8 };\n }\n if (type === 8) {\n return { value: 0, offset };\n }\n if (type === 9) {\n return { value: 1, offset };\n }\n if (type >= 12) {\n const length = Math.floor((type - 12) / 2);\n const valueEnd = Math.min(end, offset + length);\n if (type % 2 === 1) {\n return { value: new TextDecoder().decode(bytes.slice(offset, valueEnd)), offset: offset + length };\n }\n return { value: `<blob ${length} B>`, offset: offset + length };\n }\n return { value: null, offset };\n}\n\nfunction readSqliteVarint(bytes: Uint8Array, offset: number): { value: bigint; offset: number } {\n let value = 0n;\n for (let index = 0; index < 9; index++) {\n if (offset >= bytes.length) {\n throw new Error(\"SQLite varint 数据不完整。\");\n }\n const byte = bytes[offset++];\n if (index === 8) {\n value = (value << 8n) | BigInt(byte);\n return { value, offset };\n }\n value = (value << 7n) | BigInt(byte & 0x7f);\n if ((byte & 0x80) === 0) {\n return { value, offset };\n }\n }\n return { value, offset };\n}\n\nfunction signedInteger(bytes: Uint8Array, offset: number, length: number): number {\n let value = 0n;\n for (let index = 0; index < length; index++) {\n value = (value << 8n) | BigInt(bytes[offset + index] || 0);\n }\n const bits = BigInt(length * 8);\n const signBit = 1n << (bits - 1n);\n if ((value & signBit) !== 0n) {\n value -= 1n << bits;\n }\n return Number(value);\n}\n\nfunction createSqliteSchemaTable(entries: SqliteSchemaEntry[]): HTMLElement {\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-sqlite-schema\";\n const title = document.createElement(\"strong\");\n title.textContent = `Schema 对象 ${entries.length}`;\n const table = document.createElement(\"table\");\n const thead = document.createElement(\"thead\");\n const header = document.createElement(\"tr\");\n for (const label of [\"类型\", \"名称\", \"表\", \"Root\", \"SQL\"]) {\n const th = document.createElement(\"th\");\n th.textContent = label;\n header.append(th);\n }\n thead.append(header);\n const tbody = document.createElement(\"tbody\");\n for (const entry of entries) {\n const row = document.createElement(\"tr\");\n for (const value of [entry.type, entry.name, entry.tableName, String(entry.rootPage), entry.sql]) {\n const cell = document.createElement(\"td\");\n cell.textContent = value;\n row.append(cell);\n }\n tbody.append(row);\n }\n table.append(thead, tbody);\n wrapper.append(title, table);\n return wrapper;\n}\n\nfunction sqliteJournalMode(value?: number): string {\n if (value === 1) {\n return \"rollback\";\n }\n if (value === 2) {\n return \"WAL\";\n }\n return value === undefined ? \"未知\" : String(value);\n}\n\nfunction sqliteEncoding(value?: number): string {\n const encodings: Record<number, string> = {\n 0: \"未声明\",\n 1: \"UTF-8\",\n 2: \"UTF-16le\",\n 3: \"UTF-16be\"\n };\n return value === undefined ? \"未知\" : encodings[value] || `未知 (${value})`;\n}\n\ntype ParquetPreview = {\n valid: boolean;\n error?: string;\n footerLength?: number;\n footerOffset?: number;\n dataBytes?: number;\n};\n\nfunction createParquetPreview(bytes: Uint8Array): HTMLElement {\n const preview = document.createElement(\"div\");\n preview.className = \"ofv-data-preview\";\n const heading = document.createElement(\"strong\");\n heading.textContent = \"Parquet 结构\";\n preview.append(heading);\n\n const parsed = parseParquet(bytes);\n if (!parsed.valid) {\n const error = document.createElement(\"p\");\n error.className = \"ofv-data-error\";\n error.textContent = parsed.error || \"不是有效的 Parquet 文件。\";\n preview.append(error);\n return preview;\n }\n\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-data-summary\";\n appendMeta(summary, \"Magic\", \"PAR1\");\n appendMeta(summary, \"Footer\", `${parsed.footerLength} B`);\n appendMeta(summary, \"Footer offset\", `0x${(parsed.footerOffset || 0).toString(16).toUpperCase()}`);\n appendMeta(summary, \"数据区\", formatBytes(parsed.dataBytes || 0));\n preview.append(summary);\n\n const note = document.createElement(\"p\");\n note.className = \"ofv-data-note\";\n note.textContent = \"Parquet footer 使用 Thrift 编码;当前先展示容器边界,schema/row group 可后续接入 Arrow/Parquet 解码器。\";\n preview.append(note);\n return preview;\n}\n\nfunction parseParquet(bytes: Uint8Array): ParquetPreview {\n if (bytes.length < 12) {\n return { valid: false, error: \"文件太短,无法读取 Parquet 头尾信息。\" };\n }\n if (asciiAt(bytes, 0, 4) !== \"PAR1\" || asciiAt(bytes, bytes.length - 4, 4) !== \"PAR1\") {\n return { valid: false, error: \"缺少 Parquet PAR1 magic header/footer。\" };\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const footerLength = view.getUint32(bytes.length - 8, true);\n const footerOffset = bytes.length - 8 - footerLength;\n if (footerOffset < 4) {\n return { valid: false, error: \"Parquet footer 长度超过文件边界。\" };\n }\n return {\n valid: true,\n footerLength,\n footerOffset,\n dataBytes: Math.max(0, footerOffset - 4)\n };\n}\n\ntype AvroMetadata = {\n key: string;\n value: string;\n};\n\ntype AvroPreview = {\n valid: boolean;\n error?: string;\n metadata: AvroMetadata[];\n schema?: {\n type?: string;\n name?: string;\n namespace?: string;\n fields: string[];\n };\n codec?: string;\n syncMarker?: string;\n};\n\nfunction createAvroPreview(bytes: Uint8Array): HTMLElement {\n const preview = document.createElement(\"div\");\n preview.className = \"ofv-data-preview\";\n const heading = document.createElement(\"strong\");\n heading.textContent = \"Avro 结构\";\n preview.append(heading);\n\n const parsed = parseAvro(bytes);\n if (!parsed.valid) {\n const error = document.createElement(\"p\");\n error.className = \"ofv-data-error\";\n error.textContent = parsed.error || \"不是有效的 Avro Object Container 文件。\";\n preview.append(error);\n return preview;\n }\n\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-data-summary\";\n appendMeta(summary, \"Magic\", \"Obj\\\\x01\");\n appendMeta(summary, \"Codec\", parsed.codec || \"null\");\n appendMeta(summary, \"Metadata\", parsed.metadata.length);\n appendMeta(summary, \"Sync marker\", parsed.syncMarker || \"未知\");\n preview.append(summary);\n\n if (parsed.schema) {\n const schema = document.createElement(\"div\");\n schema.className = \"ofv-avro-schema\";\n const title = document.createElement(\"strong\");\n title.textContent = \"Schema\";\n const meta = document.createElement(\"div\");\n meta.className = \"ofv-data-summary\";\n appendMeta(meta, \"类型\", parsed.schema.type || \"未知\");\n appendMeta(meta, \"名称\", [parsed.schema.namespace, parsed.schema.name].filter(Boolean).join(\".\") || \"未知\");\n appendMeta(meta, \"字段\", parsed.schema.fields.length);\n schema.append(title, meta);\n if (parsed.schema.fields.length > 0) {\n const list = document.createElement(\"ul\");\n for (const field of parsed.schema.fields.slice(0, 80)) {\n const item = document.createElement(\"li\");\n item.textContent = field;\n list.append(item);\n }\n schema.append(list);\n }\n preview.append(schema);\n }\n\n if (parsed.metadata.length > 0) {\n preview.append(createKeyValueTable(\"Metadata\", parsed.metadata));\n }\n\n return preview;\n}\n\nfunction parseAvro(bytes: Uint8Array): AvroPreview {\n if (bytes.length < 4 || bytes[0] !== 0x4f || bytes[1] !== 0x62 || bytes[2] !== 0x6a || bytes[3] !== 0x01) {\n return { valid: false, error: \"缺少 Avro Object Container magic header。\", metadata: [] };\n }\n let offset = 4;\n const metadata: AvroMetadata[] = [];\n try {\n while (true) {\n const blockCount = readAvroLong(bytes, offset);\n offset = blockCount.offset;\n let count = blockCount.value;\n if (count === 0n) {\n break;\n }\n if (count < 0n) {\n count = -count;\n const blockSize = readAvroLong(bytes, offset);\n offset = blockSize.offset;\n }\n for (let index = 0; index < Number(count); index++) {\n const key = readAvroBytes(bytes, offset);\n offset = key.offset;\n const value = readAvroBytes(bytes, offset);\n offset = value.offset;\n metadata.push({\n key: new TextDecoder().decode(key.value),\n value: decodeAvroMetadataValue(key.value, value.value)\n });\n }\n }\n if (offset + 16 > bytes.length) {\n throw new Error(\"Avro sync marker 缺失。\");\n }\n const syncMarker = Array.from(bytes.slice(offset, offset + 16))\n .map((byte) => byte.toString(16).padStart(2, \"0\"))\n .join(\"\");\n const schemaText = metadata.find((item) => item.key === \"avro.schema\")?.value;\n return {\n valid: true,\n metadata,\n codec: metadata.find((item) => item.key === \"avro.codec\")?.value,\n syncMarker,\n schema: schemaText ? summarizeAvroSchema(schemaText) : undefined\n };\n } catch (error) {\n return {\n valid: false,\n error: error instanceof Error ? error.message : \"Avro metadata 解析失败。\",\n metadata\n };\n }\n}\n\nfunction readAvroLong(bytes: Uint8Array, offset: number): { value: bigint; offset: number } {\n let result = 0n;\n let shift = 0n;\n for (let index = 0; index < 10; index++) {\n if (offset >= bytes.length) {\n throw new Error(\"Avro long 数据不完整。\");\n }\n const byte = bytes[offset++];\n result |= BigInt(byte & 0x7f) << shift;\n if ((byte & 0x80) === 0) {\n const value = (result >> 1n) ^ -(result & 1n);\n return { value, offset };\n }\n shift += 7n;\n }\n throw new Error(\"Avro long 数据过长。\");\n}\n\nfunction readAvroBytes(bytes: Uint8Array, offset: number): { value: Uint8Array; offset: number } {\n const length = readAvroLong(bytes, offset);\n offset = length.offset;\n if (length.value < 0n) {\n throw new Error(\"Avro bytes 长度无效。\");\n }\n const size = Number(length.value);\n const end = offset + size;\n if (end > bytes.length) {\n throw new Error(\"Avro bytes 超出文件边界。\");\n }\n return { value: bytes.slice(offset, end), offset: end };\n}\n\nfunction decodeAvroMetadataValue(keyBytes: Uint8Array, valueBytes: Uint8Array): string {\n const key = new TextDecoder().decode(keyBytes);\n if (key === \"avro.schema\" || key === \"avro.codec\" || /^[a-z0-9_.-]+$/i.test(key)) {\n return new TextDecoder().decode(valueBytes);\n }\n return `<${valueBytes.length} B>`;\n}\n\nfunction summarizeAvroSchema(schemaText: string): AvroPreview[\"schema\"] {\n try {\n const schema = JSON.parse(schemaText) as {\n type?: string;\n name?: string;\n namespace?: string;\n fields?: Array<{ name?: string; type?: unknown }>;\n };\n return {\n type: typeof schema.type === \"string\" ? schema.type : undefined,\n name: typeof schema.name === \"string\" ? schema.name : undefined,\n namespace: typeof schema.namespace === \"string\" ? schema.namespace : undefined,\n fields: Array.isArray(schema.fields)\n ? schema.fields.map((field) => `${field.name || \"field\"}: ${formatAvroType(field.type)}`)\n : []\n };\n } catch {\n return { fields: [] };\n }\n}\n\nfunction formatAvroType(type: unknown): string {\n if (typeof type === \"string\") {\n return type;\n }\n if (Array.isArray(type)) {\n return type.map(formatAvroType).join(\" | \");\n }\n if (type && typeof type === \"object\") {\n const value = type as { type?: unknown; name?: unknown; items?: unknown; values?: unknown };\n if (typeof value.name === \"string\") {\n return value.name;\n }\n if (value.type === \"array\") {\n return `array<${formatAvroType(value.items)}>`;\n }\n if (value.type === \"map\") {\n return `map<${formatAvroType(value.values)}>`;\n }\n return formatAvroType(value.type);\n }\n return \"unknown\";\n}\n\nfunction createKeyValueTable(titleText: string, rows: AvroMetadata[]): HTMLElement {\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-data-kv\";\n const title = document.createElement(\"strong\");\n title.textContent = titleText;\n const table = document.createElement(\"table\");\n const tbody = document.createElement(\"tbody\");\n for (const row of rows.slice(0, 80)) {\n const tr = document.createElement(\"tr\");\n const key = document.createElement(\"th\");\n key.textContent = row.key;\n const value = document.createElement(\"td\");\n value.textContent = row.value;\n tr.append(key, value);\n tbody.append(tr);\n }\n table.append(tbody);\n wrapper.append(title, table);\n return wrapper;\n}\n\ntype PlistValue =\n | string\n | Uint8Array\n | PlistValue[]\n | { [key: string]: PlistValue }\n | boolean\n | number\n | null;\n\ntype WebArchivePreview = {\n valid: boolean;\n error?: string;\n binary?: boolean;\n url?: string;\n mimeType?: string;\n encoding?: string;\n mainBytes?: number;\n subresources?: number;\n subframeArchives?: number;\n snippet?: string;\n};\n\nfunction createWebArchivePreview(bytes: Uint8Array): HTMLElement {\n const preview = document.createElement(\"div\");\n preview.className = \"ofv-data-preview ofv-webarchive-preview\";\n const heading = document.createElement(\"strong\");\n heading.textContent = \"WebArchive 结构\";\n preview.append(heading);\n\n const parsed = parseWebArchive(bytes);\n if (!parsed.valid) {\n const error = document.createElement(\"p\");\n error.className = \"ofv-data-error\";\n error.textContent = parsed.error || \"不是有效的 WebArchive plist。\";\n preview.append(error);\n return preview;\n }\n\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-data-summary\";\n appendMeta(summary, \"格式\", parsed.binary ? \"Binary plist\" : \"XML plist\");\n appendMeta(summary, \"主资源\", parsed.url || \"未声明\");\n appendMeta(summary, \"MIME\", parsed.mimeType || \"未知\");\n appendMeta(summary, \"编码\", parsed.encoding || \"未声明\");\n appendMeta(summary, \"主资源大小\", parsed.mainBytes !== undefined ? formatBytes(parsed.mainBytes) : \"未知\");\n appendMeta(summary, \"子资源\", String(parsed.subresources ?? 0));\n appendMeta(summary, \"子归档\", String(parsed.subframeArchives ?? 0));\n preview.append(summary);\n\n if (parsed.binary) {\n const note = document.createElement(\"p\");\n note.className = \"ofv-data-note\";\n note.textContent = \"已识别 binary plist WebArchive;浏览器端需要 binary plist 解码器后才能展开主资源。\";\n preview.append(note);\n }\n\n if (parsed.snippet) {\n const snippet = document.createElement(\"pre\");\n snippet.className = \"ofv-text-block ofv-webarchive-snippet\";\n snippet.textContent = parsed.snippet;\n preview.append(snippet);\n }\n return preview;\n}\n\nfunction parseWebArchive(bytes: Uint8Array): WebArchivePreview {\n if (bytes.length >= 8 && asciiAt(bytes, 0, 8) === \"bplist00\") {\n return { valid: true, binary: true };\n }\n\n const text = new TextDecoder(\"utf-8\", { fatal: false }).decode(bytes.slice(0, Math.min(bytes.length, 1024 * 1024)));\n if (!/<plist[\\s>]/i.test(text) || !text.includes(\"WebMainResource\")) {\n return { valid: false, error: \"缺少 XML plist 或 WebMainResource 标记。\" };\n }\n if (typeof DOMParser === \"undefined\") {\n return { valid: false, error: \"当前环境缺少 DOMParser,无法解析 XML WebArchive。\" };\n }\n\n const documentXml = new DOMParser().parseFromString(text, \"application/xml\");\n if (documentXml.querySelector(\"parsererror\")) {\n return { valid: false, error: \"XML plist 解析失败。\" };\n }\n const rootDict = Array.from(documentXml.documentElement.children).find((child) => child.tagName === \"dict\");\n if (!rootDict) {\n return { valid: false, error: \"XML plist 缺少根 dict。\" };\n }\n\n const plist = parsePlistElement(rootDict);\n if (!isPlistDict(plist)) {\n return { valid: false, error: \"XML plist 根节点不是 dict。\" };\n }\n const mainResource = plist.WebMainResource;\n if (!isPlistDict(mainResource)) {\n return { valid: false, error: \"WebArchive 缺少 WebMainResource dict。\" };\n }\n\n const resourceData = mainResource.WebResourceData;\n const mimeType = plistString(mainResource.WebResourceMIMEType);\n const mainBytes = resourceData instanceof Uint8Array ? resourceData.length : undefined;\n return {\n valid: true,\n url: plistString(mainResource.WebResourceURL),\n mimeType,\n encoding: plistString(mainResource.WebResourceTextEncodingName),\n mainBytes,\n subresources: Array.isArray(plist.WebSubresources) ? plist.WebSubresources.length : 0,\n subframeArchives: Array.isArray(plist.WebSubframeArchives) ? plist.WebSubframeArchives.length : 0,\n snippet: createWebArchiveSnippet(resourceData, mimeType)\n };\n}\n\nfunction parsePlistElement(element: Element): PlistValue {\n switch (element.tagName) {\n case \"dict\": {\n const result: Record<string, PlistValue> = {};\n const children = Array.from(element.children);\n for (let index = 0; index < children.length; index++) {\n const key = children[index];\n if (key.tagName !== \"key\") {\n continue;\n }\n const value = children[index + 1];\n if (value) {\n result[key.textContent || \"\"] = parsePlistElement(value);\n index++;\n }\n }\n return result;\n }\n case \"array\":\n return Array.from(element.children).map(parsePlistElement);\n case \"data\":\n return decodeBase64Data(element.textContent || \"\");\n case \"integer\":\n case \"real\":\n return Number(element.textContent || 0);\n case \"true\":\n return true;\n case \"false\":\n return false;\n case \"string\":\n case \"date\":\n default:\n return element.textContent || \"\";\n }\n}\n\nfunction decodeBase64Data(value: string): Uint8Array {\n const normalized = value.replace(/\\s+/g, \"\");\n if (!normalized) {\n return new Uint8Array();\n }\n const binary = atob(normalized);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index++) {\n bytes[index] = binary.charCodeAt(index);\n }\n return bytes;\n}\n\nfunction createWebArchiveSnippet(value: PlistValue | undefined, mimeType?: string): string | undefined {\n if (!(value instanceof Uint8Array) || value.length === 0) {\n return undefined;\n }\n if (!mimeType || !/^(text\\/|application\\/(xhtml\\+xml|xml|json)|image\\/svg\\+xml)/i.test(mimeType)) {\n return undefined;\n }\n const text = new TextDecoder(\"utf-8\", { fatal: false }).decode(value);\n return text.replace(/\\s+/g, \" \").trim().slice(0, 1600);\n}\n\nfunction isPlistDict(value: PlistValue | undefined): value is { [key: string]: PlistValue } {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value) && !(value instanceof Uint8Array);\n}\n\nfunction plistString(value: PlistValue | undefined): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction asciiAt(bytes: Uint8Array, offset: number, length: number): string {\n if (offset < 0 || offset + length > bytes.length) {\n return \"\";\n }\n return new TextDecoder(\"ascii\").decode(bytes.slice(offset, offset + length));\n}\n\ntype PostScriptPreview = {\n valid: boolean;\n error?: string;\n format?: string;\n title?: string;\n creator?: string;\n creationDate?: string;\n pages?: string;\n boundingBox?: string;\n documentData?: string;\n};\n\nfunction createPostScriptPreview(bytes: Uint8Array): HTMLElement {\n const preview = document.createElement(\"div\");\n preview.className = \"ofv-data-preview\";\n const heading = document.createElement(\"strong\");\n heading.textContent = \"PostScript 结构\";\n preview.append(heading);\n\n const parsed = parsePostScript(bytes);\n if (!parsed.valid) {\n const error = document.createElement(\"p\");\n error.className = \"ofv-data-error\";\n error.textContent = parsed.error || \"不是有效的 PostScript/Illustrator 文档头。\";\n preview.append(error);\n return preview;\n }\n\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-data-summary\";\n appendMeta(summary, \"格式\", parsed.format || \"PostScript\");\n appendMeta(summary, \"Title\", parsed.title || \"未声明\");\n appendMeta(summary, \"Creator\", parsed.creator || \"未声明\");\n appendMeta(summary, \"Pages\", parsed.pages || \"未知\");\n appendMeta(summary, \"BoundingBox\", parsed.boundingBox || \"未声明\");\n appendMeta(summary, \"Created\", parsed.creationDate || \"未声明\");\n if (parsed.documentData) {\n appendMeta(summary, \"Data\", parsed.documentData);\n }\n preview.append(summary);\n return preview;\n}\n\nfunction parsePostScript(bytes: Uint8Array): PostScriptPreview {\n const head = new TextDecoder(\"latin1\").decode(bytes.slice(0, Math.min(bytes.length, 8192)));\n const firstLine = head.split(/\\r?\\n/, 1)[0] || \"\";\n const isPdfCompatible = firstLine.startsWith(\"%PDF-\");\n const isPostScript = firstLine.startsWith(\"%!\");\n if (!isPdfCompatible && !isPostScript) {\n return { valid: false, error: \"缺少 PostScript %! 或 PDF-compatible %PDF 文件头。\" };\n }\n\n const boundingBox = dscValue(head, \"BoundingBox\") || dscValue(head, \"HiResBoundingBox\");\n return {\n valid: true,\n format: isPdfCompatible ? `PDF-compatible Illustrator (${firstLine.replace(/^%/, \"\")})` : firstLine.replace(/^%!/, \"PostScript \"),\n title: dscValue(head, \"Title\"),\n creator: dscValue(head, \"Creator\") || dscValue(head, \"For\"),\n creationDate: dscValue(head, \"CreationDate\"),\n pages: dscValue(head, \"Pages\"),\n boundingBox: normalizeBoundingBox(boundingBox),\n documentData: dscValue(head, \"DocumentData\")\n };\n}\n\nfunction dscValue(text: string, key: string): string | undefined {\n const escaped = key.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const match = text.match(new RegExp(`^%%${escaped}:\\\\s*(.+)$`, \"im\"));\n return match?.[1]?.trim();\n}\n\nfunction normalizeBoundingBox(value?: string): string | undefined {\n if (!value) {\n return undefined;\n }\n const parts = value.trim().split(/\\s+/).map((part) => Number(part));\n if (parts.length < 4 || parts.some((part) => !Number.isFinite(part))) {\n return value;\n }\n const [x1, y1, x2, y2] = parts;\n return `${x1}, ${y1}, ${x2}, ${y2} (${Math.max(0, x2 - x1)} x ${Math.max(0, y2 - y1)} pt)`;\n}\n\nfunction createHexPreview(bytes: Uint8Array): HTMLElement | null {\n if (bytes.length === 0) {\n return null;\n }\n const pre = document.createElement(\"pre\");\n pre.className = \"ofv-text-block ofv-asset-hex\";\n pre.textContent = hexPreview(bytes);\n return pre;\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) {\n return `${bytes} B`;\n }\n if (bytes < 1024 * 1024) {\n return `${(bytes / 1024).toFixed(1)} KB`;\n }\n return `${(bytes / 1024 / 1024).toFixed(2)} MB`;\n}\n\nfunction byteSignature(bytes: Uint8Array): string {\n if (bytes.length === 0) {\n return \"空文件\";\n }\n const ascii = new TextDecoder(\"ascii\").decode(bytes.slice(0, Math.min(bytes.length, 16))).replace(/[^\\x20-\\x7E]/g, \".\");\n const hex = Array.from(bytes.slice(0, Math.min(bytes.length, 8)))\n .map((byte) => byte.toString(16).padStart(2, \"0\").toUpperCase())\n .join(\" \");\n return `${ascii} (${hex})`;\n}\n\nfunction hexPreview(bytes: Uint8Array): string {\n const rows: string[] = [];\n const limit = Math.min(bytes.length, 256);\n for (let offset = 0; offset < limit; offset += 16) {\n const slice = bytes.slice(offset, offset + 16);\n const hex = Array.from(slice)\n .map((byte) => byte.toString(16).padStart(2, \"0\").toUpperCase())\n .join(\" \")\n .padEnd(47, \" \");\n const ascii = Array.from(slice)\n .map((byte) => (byte >= 32 && byte <= 126 ? String.fromCharCode(byte) : \".\"))\n .join(\"\");\n rows.push(`${offset.toString(16).padStart(8, \"0\").toUpperCase()} ${hex} ${ascii}`);\n }\n if (bytes.length > limit) {\n rows.push(`... 仅展示前 ${limit} 字节,共 ${bytes.length} 字节`);\n }\n return rows.join(\"\\n\");\n}\n"],"mappings":"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","names":["name","extension","view","asciiAt","readUint32Be","timescale","duration","readUint32Le","appendMediaInfo","asciiAt","readUint32Le","readUint16Le","formatDuration","readUint32Be","view","PrismModule","Prism","DOMPurify","normalizeFileName","appendMeta","JSZip","JSZip","appendMeta","getXmlAttribute","countMatches","JSZip","DOMPurify","JSZip","getXmlAttribute","countMatches","decodeXml","DOMPurify","JSZip","JSZip","finiteNumber","mimeTypeFromPath","JSZip","JSZip","formatBytes","view","readUint64Le","DOMPurify","DOMPurify","document","pako","finiteNumber","pako","appendMeta","formatBytes","byteSignature","height","geometry","material","JSZip","formatBytes","byteSignature","asciiAt","view","hexPreview"]}
1
+ {"version":3,"sources":["../src/detect.ts","../src/dom.ts","../src/plugins/fallback.ts","../src/viewer.ts","../src/plugins/image.ts","../src/plugins/video.ts","../src/plugins/audio.ts","../src/plugins/utils.ts","../src/plugins/text.ts","../src/plugins/pdf.ts","../src/plugins/epub.ts","../src/plugins/xps.ts","../src/plugins/office.ts","../src/plugins/ofd.ts","../src/plugins/archive.ts","../src/plugins/email.ts","../src/plugins/drawing.ts","../src/plugins/cad.ts","../src/plugins/model3d.ts","../src/plugins/gis.ts","../src/plugins/asset.ts"],"sourcesContent":["import type { PreviewFile, PreviewSource } from \"./types\";\n\nconst extensionMimeMap: Record<string, string> = {\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n jfif: \"image/jpeg\",\n pjpe: \"image/pjpeg\",\n pjpeg: \"image/pjpeg\",\n png: \"image/png\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n avif: \"image/avif\",\n jxl: \"image/jxl\",\n svg: \"image/svg+xml\",\n bmp: \"image/bmp\",\n ico: \"image/x-icon\",\n cur: \"image/x-icon\",\n tif: \"image/tiff\",\n tiff: \"image/tiff\",\n apng: \"image/apng\",\n heic: \"image/heic\",\n heif: \"image/heif\",\n mp4: \"video/mp4\",\n mpg: \"video/mpeg\",\n mpeg: \"video/mpeg\",\n mpe: \"video/mpeg\",\n mpv: \"video/mpv\",\n webm: \"video/webm\",\n ogg: \"audio/ogg\",\n ogv: \"video/ogg\",\n mov: \"video/quicktime\",\n m4v: \"video/x-m4v\",\n avi: \"video/x-msvideo\",\n mkv: \"video/x-matroska\",\n flv: \"video/x-flv\",\n wmv: \"video/x-ms-wmv\",\n \"3gp\": \"video/3gpp\",\n \"3g2\": \"video/3gpp2\",\n m2ts: \"video/mp2t\",\n m3u8: \"application/vnd.apple.mpegurl\",\n mp3: \"audio/mpeg\",\n wav: \"audio/wav\",\n aif: \"audio/aiff\",\n aiff: \"audio/aiff\",\n aifc: \"audio/aiff\",\n aac: \"audio/aac\",\n m4a: \"audio/mp4\",\n flac: \"audio/flac\",\n opus: \"audio/opus\",\n oga: \"audio/ogg\",\n weba: \"audio/webm\",\n amr: \"audio/amr\",\n mid: \"audio/midi\",\n midi: \"audio/midi\",\n caf: \"audio/x-caf\",\n au: \"audio/basic\",\n snd: \"audio/basic\",\n wma: \"audio/x-ms-wma\",\n pdf: \"application/pdf\",\n epub: \"application/epub+zip\",\n xps: \"application/vnd.ms-xpsdocument\",\n oxps: \"application/oxps\",\n txt: \"text/plain\",\n log: \"text/plain\",\n env: \"text/plain\",\n gitignore: \"text/plain\",\n dockerignore: \"text/plain\",\n npmrc: \"text/plain\",\n yarnrc: \"text/plain\",\n pnpmrc: \"text/plain\",\n editorconfig: \"text/plain\",\n browserslistrc: \"text/plain\",\n prettierrc: \"application/json\",\n eslintrc: \"application/json\",\n stylelintrc: \"application/json\",\n conf: \"text/plain\",\n config: \"text/plain\",\n properties: \"text/plain\",\n lock: \"text/plain\",\n json: \"application/json\",\n jsonc: \"application/json\",\n json5: \"application/json5\",\n ipynb: \"application/x-ipynb+json\",\n jsonl: \"application/x-ndjson\",\n ndjson: \"application/x-ndjson\",\n xml: \"application/xml\",\n yaml: \"text/yaml\",\n yml: \"text/yaml\",\n csv: \"text/csv\",\n tsv: \"text/tab-separated-values\",\n md: \"text/markdown\",\n markdown: \"text/markdown\",\n toml: \"application/toml\",\n ini: \"text/plain\",\n proto: \"text/x-protobuf\",\n tf: \"text/x-hcl\",\n tfvars: \"text/x-hcl\",\n hcl: \"text/x-hcl\",\n tex: \"application/x-tex\",\n latex: \"application/x-tex\",\n bib: \"text/x-bibtex\",\n gv: \"text/vnd.graphviz\",\n http: \"message/http\",\n css: \"text/css\",\n scss: \"text/css\",\n less: \"text/css\",\n js: \"text/javascript\",\n mjs: \"text/javascript\",\n cjs: \"text/javascript\",\n ts: \"text/typescript\",\n tsx: \"text/typescript\",\n jsx: \"text/javascript\",\n htm: \"text/html\",\n html: \"text/html\",\n vue: \"text/plain\",\n py: \"text/x-python\",\n java: \"text/x-java-source\",\n go: \"text/x-go\",\n rs: \"text/rust\",\n rb: \"text/x-ruby\",\n swift: \"text/x-swift\",\n kt: \"text/x-kotlin\",\n kts: \"text/x-kotlin\",\n scala: \"text/x-scala\",\n lua: \"text/x-lua\",\n r: \"text/x-r\",\n dart: \"text/x-dart\",\n svelte: \"text/plain\",\n astro: \"text/plain\",\n elm: \"text/x-elm\",\n ex: \"text/x-elixir\",\n exs: \"text/x-elixir\",\n clj: \"text/x-clojure\",\n cljs: \"text/x-clojure\",\n erl: \"text/x-erlang\",\n hrl: \"text/x-erlang\",\n fs: \"text/x-fsharp\",\n fsx: \"text/x-fsharp\",\n hs: \"text/x-haskell\",\n lhs: \"text/x-haskell\",\n php: \"application/x-httpd-php\",\n c: \"text/x-c\",\n cpp: \"text/x-c++src\",\n h: \"text/x-c\",\n hpp: \"text/x-c++hdr\",\n cs: \"text/x-csharp\",\n sql: \"application/sql\",\n sh: \"application/x-sh\",\n bash: \"application/x-sh\",\n zsh: \"application/x-sh\",\n fish: \"application/x-sh\",\n ps1: \"text/plain\",\n bat: \"text/plain\",\n cmd: \"text/plain\",\n dockerfile: \"text/plain\",\n nginxconf: \"text/plain\",\n gradle: \"text/plain\",\n graphql: \"application/graphql\",\n gql: \"application/graphql\",\n pem: \"application/x-pem-file\",\n crt: \"application/x-x509-ca-cert\",\n cer: \"application/pkix-cert\",\n ics: \"text/calendar\",\n vcf: \"text/vcard\",\n diff: \"text/x-diff\",\n patch: \"text/x-diff\",\n geojson: \"application/geo+json\",\n topojson: \"application/topo+json\",\n kml: \"application/vnd.google-earth.kml+xml\",\n kmz: \"application/vnd.google-earth.kmz\",\n gpx: \"application/gpx+xml\",\n shp: \"application/octet-stream\",\n drawio: \"application/vnd.jgraph.mxfile\",\n dio: \"application/vnd.jgraph.mxfile\",\n excalidraw: \"application/vnd.excalidraw+json\",\n tldraw: \"application/json\",\n zip: \"application/zip\",\n rar: \"application/vnd.rar\",\n \"7z\": \"application/x-7z-compressed\",\n tar: \"application/x-tar\",\n gz: \"application/gzip\",\n tgz: \"application/gzip\",\n bz2: \"application/x-bzip2\",\n xz: \"application/x-xz\",\n docx: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n docm: \"application/vnd.ms-word.document.macroenabled.12\",\n dotx: \"application/vnd.openxmlformats-officedocument.wordprocessingml.template\",\n dotm: \"application/vnd.ms-word.template.macroenabled.12\",\n dot: \"application/msword\",\n doc: \"application/msword\",\n rtf: \"application/rtf\",\n odt: \"application/vnd.oasis.opendocument.text\",\n fodt: \"application/vnd.oasis.opendocument.text-flat-xml\",\n wps: \"application/vnd.ms-works\",\n xlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n xltx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.template\",\n xls: \"application/vnd.ms-excel\",\n xlsm: \"application/vnd.ms-excel.sheet.macroenabled.12\",\n xltm: \"application/vnd.ms-excel.template.macroenabled.12\",\n xlsb: \"application/vnd.ms-excel.sheet.binary.macroenabled.12\",\n ods: \"application/vnd.oasis.opendocument.spreadsheet\",\n fods: \"application/vnd.oasis.opendocument.spreadsheet-flat-xml\",\n numbers: \"application/vnd.apple.numbers\",\n et: \"application/vnd.ms-excel\",\n pptx: \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n pptm: \"application/vnd.ms-powerpoint.presentation.macroenabled.12\",\n ppsx: \"application/vnd.openxmlformats-officedocument.presentationml.slideshow\",\n ppsm: \"application/vnd.ms-powerpoint.slideshow.macroenabled.12\",\n potx: \"application/vnd.openxmlformats-officedocument.presentationml.template\",\n potm: \"application/vnd.ms-powerpoint.template.macroenabled.12\",\n ppt: \"application/vnd.ms-powerpoint\",\n pps: \"application/vnd.ms-powerpoint\",\n odp: \"application/vnd.oasis.opendocument.presentation\",\n fodp: \"application/vnd.oasis.opendocument.presentation-flat-xml\",\n key: \"application/vnd.apple.keynote\",\n dps: \"application/vnd.ms-powerpoint\",\n eml: \"message/rfc822\",\n msg: \"application/vnd.ms-outlook\",\n mbox: \"application/mbox\",\n ofd: \"application/ofd\",\n gltf: \"model/gltf+json\",\n glb: \"model/gltf-binary\",\n stl: \"model/stl\",\n obj: \"model/obj\",\n \"3ds\": \"model/3ds\",\n fbx: \"application/vnd.autodesk.fbx\",\n dae: \"model/vnd.collada+xml\",\n ply: \"application/ply\",\n \"3mf\": \"model/3mf\",\n usdz: \"model/vnd.usdz+zip\",\n usdc: \"model/vnd.usd\",\n usda: \"model/vnd.usd\",\n usd: \"model/vnd.usd\",\n wrl: \"model/vrml\",\n vrml: \"model/vrml\",\n dxf: \"image/vnd.dxf\",\n dwg: \"application/acad\",\n dwf: \"model/vnd.dwf\",\n step: \"model/step\",\n stp: \"model/step\",\n iges: \"application/iges\",\n igs: \"application/iges\",\n ifc: \"application/x-step\",\n sat: \"application/sat\",\n sab: \"application/sab\",\n \"x_t\": \"application/x-parasolid\",\n \"x_b\": \"application/x-parasolid\",\n \"3dm\": \"model/vnd.3dm\",\n skp: \"application/vnd.sketchup.skp\",\n sldprt: \"application/sldworks\",\n sldasm: \"application/sldworks\",\n ttf: \"font/ttf\",\n otf: \"font/otf\",\n woff: \"font/woff\",\n woff2: \"font/woff2\",\n eot: \"application/vnd.ms-fontobject\",\n psd: \"image/vnd.adobe.photoshop\",\n psb: \"image/vnd.adobe.photoshop\",\n ai: \"application/postscript\",\n eps: \"application/postscript\",\n ps: \"application/postscript\",\n webarchive: \"application/x-webarchive\",\n sqlite: \"application/vnd.sqlite3\",\n sqlite3: \"application/vnd.sqlite3\",\n db: \"application/vnd.sqlite3\",\n wasm: \"application/wasm\",\n parquet: \"application/vnd.apache.parquet\",\n avro: \"application/avro\"\n};\n\nexport async function normalizeFile(\n source: PreviewSource,\n fileName?: string,\n mimeType?: string\n): Promise<PreviewFile> {\n if (typeof source === \"string\") {\n const name = fileName || source.split(\"?\")[0]?.split(\"/\").pop() || \"remote-file\";\n const extension = getExtension(name);\n return {\n source,\n name,\n extension,\n mimeType: mimeType || extensionMimeMap[extension] || \"\",\n url: source\n };\n }\n\n if (source instanceof File) {\n const extension = getExtension(fileName || source.name);\n return {\n source,\n name: fileName || source.name,\n extension,\n mimeType: mimeType || source.type || extensionMimeMap[extension] || \"\",\n size: source.size,\n blob: source\n };\n }\n\n if (source instanceof Blob) {\n const name = fileName || \"blob\";\n const extension = getExtension(name);\n return {\n source,\n name,\n extension,\n mimeType: mimeType || source.type || extensionMimeMap[extension] || \"\",\n size: source.size,\n blob: source\n };\n }\n\n const name = fileName || \"buffer\";\n const extension = getExtension(name);\n const blob = new Blob([source], { type: mimeType || extensionMimeMap[extension] || \"\" });\n return {\n source,\n name,\n extension,\n mimeType: blob.type,\n size: blob.size,\n blob\n };\n}\n\nexport function getExtension(name: string): string {\n const clean = name.split(\"?\")[0]?.split(\"#\")[0] || \"\";\n const index = clean.lastIndexOf(\".\");\n return index >= 0 ? clean.slice(index + 1).toLowerCase() : \"\";\n}\n\nexport function isTextLike(file: PreviewFile): boolean {\n const textFileName = normalizeFileName(file.name);\n const textFileStem = textFileName.split(\".\")[0];\n return (\n file.mimeType.startsWith(\"text/\") ||\n [\n \"application/json\",\n \"application/json5\",\n \"application/x-ipynb+json\",\n \"application/xml\",\n \"application/yaml\",\n \"application/x-yaml\",\n \"application/sql\",\n \"application/x-sh\",\n \"application/x-httpd-php\",\n \"application/javascript\",\n \"application/x-javascript\",\n \"application/typescript\",\n \"application/x-typescript\",\n \"application/toml\",\n \"application/x-toml\",\n \"application/x-ndjson\",\n \"application/graphql\",\n \"application/x-pem-file\",\n \"application/x-x509-ca-cert\",\n \"application/pkix-cert\",\n \"application/x-tex\",\n \"message/http\",\n \"text/calendar\",\n \"text/vcard\",\n \"text/x-bibtex\",\n \"text/x-hcl\",\n \"text/x-protobuf\",\n \"text/vnd.graphviz\"\n ].includes(file.mimeType) ||\n [\n \"txt\",\n \"json\",\n \"jsonc\",\n \"json5\",\n \"ipynb\",\n \"jsonl\",\n \"ndjson\",\n \"xml\",\n \"yaml\",\n \"yml\",\n \"csv\",\n \"log\",\n \"env\",\n \"gitignore\",\n \"dockerignore\",\n \"npmrc\",\n \"yarnrc\",\n \"pnpmrc\",\n \"editorconfig\",\n \"browserslistrc\",\n \"prettierrc\",\n \"eslintrc\",\n \"stylelintrc\",\n \"conf\",\n \"config\",\n \"properties\",\n \"lock\",\n \"md\",\n \"markdown\",\n \"js\",\n \"mjs\",\n \"cjs\",\n \"ts\",\n \"tsx\",\n \"jsx\",\n \"vue\",\n \"css\",\n \"scss\",\n \"less\",\n \"html\",\n \"htm\",\n \"toml\",\n \"ini\",\n \"proto\",\n \"tf\",\n \"tfvars\",\n \"hcl\",\n \"tex\",\n \"latex\",\n \"bib\",\n \"gv\",\n \"http\",\n \"java\",\n \"py\",\n \"go\",\n \"rs\",\n \"rb\",\n \"swift\",\n \"kt\",\n \"kts\",\n \"scala\",\n \"lua\",\n \"r\",\n \"dart\",\n \"svelte\",\n \"astro\",\n \"elm\",\n \"ex\",\n \"exs\",\n \"clj\",\n \"cljs\",\n \"erl\",\n \"hrl\",\n \"fs\",\n \"fsx\",\n \"hs\",\n \"lhs\",\n \"php\",\n \"c\",\n \"cpp\",\n \"h\",\n \"hpp\",\n \"cs\",\n \"sql\",\n \"sh\",\n \"bash\",\n \"zsh\",\n \"fish\",\n \"ps1\",\n \"bat\",\n \"cmd\",\n \"dockerfile\",\n \"nginxconf\",\n \"gradle\",\n \"graphql\",\n \"gql\",\n \"pem\",\n \"crt\",\n \"cer\",\n \"ics\",\n \"vcf\",\n \"diff\",\n \"patch\"\n ].includes(file.extension) ||\n [\n \"dockerfile\",\n \"makefile\",\n \"rakefile\",\n \"gemfile\",\n \"procfile\",\n \"jenkinsfile\",\n \"vagrantfile\",\n \"brewfile\",\n \"podfile\",\n \"go.mod\",\n \"go.sum\",\n \"cargo.toml\",\n \"cargo.lock\",\n \".gitignore\",\n \".dockerignore\",\n \".npmrc\",\n \".yarnrc\",\n \".pnpmrc\",\n \".editorconfig\",\n \".browserslistrc\",\n \".prettierrc\",\n \".eslintrc\",\n \".stylelintrc\"\n ].includes(textFileName) ||\n [\n \"readme\",\n \"changelog\",\n \"changes\",\n \"history\",\n \"license\",\n \"licence\",\n \"copying\",\n \"notice\",\n \"authors\",\n \"contributors\",\n \"codeowners\"\n ].includes(textFileStem)\n );\n}\n\nfunction normalizeFileName(name: string): string {\n const baseName = name.split(/[\\\\/]/).pop() || name;\n return baseName.toLowerCase();\n}\n","import type { PreviewSize } from \"./types\";\n\nexport function resolveContainer(container: HTMLElement | string): HTMLElement {\n if (typeof container !== \"string\") {\n return container;\n }\n\n const element = document.querySelector<HTMLElement>(container);\n if (!element) {\n throw new Error(`File viewer container not found: ${container}`);\n }\n return element;\n}\n\nexport function applyBoxSize(\n element: HTMLElement,\n width?: number | string,\n height?: number | string\n): void {\n if (width !== undefined) {\n element.style.width = typeof width === \"number\" ? `${width}px` : width;\n }\n if (height !== undefined) {\n element.style.height = typeof height === \"number\" ? `${height}px` : height;\n }\n}\n\nexport function getElementSize(element: HTMLElement): PreviewSize {\n const rect = element.getBoundingClientRect();\n return {\n width: Math.max(0, Math.round(rect.width)),\n height: Math.max(0, Math.round(rect.height))\n };\n}\n\nexport function createObjectUrl(file: { url?: string; blob?: Blob }): string {\n if (file.url) {\n return file.url;\n }\n if (!file.blob) {\n throw new Error(\"File source cannot be converted to an object URL.\");\n }\n return URL.createObjectURL(file.blob);\n}\n\nexport function revokeObjectUrl(url: string, isExternal: boolean): void {\n if (!isExternal) {\n URL.revokeObjectURL(url);\n }\n}\n","import { createObjectUrl, revokeObjectUrl } from \"../dom\";\nimport type { PreviewPlugin } from \"../types\";\n\nexport function fallbackPlugin(): PreviewPlugin {\n return {\n name: \"fallback\",\n match() {\n return true;\n },\n render(ctx) {\n ctx.options.onUnsupported?.(ctx.file);\n if (ctx.options.fallback === \"custom\" && ctx.options.renderFallback) {\n return ctx.options.renderFallback(ctx);\n }\n\n const url = createObjectUrl(ctx.file);\n const isExternal = Boolean(ctx.file.url);\n const panel = document.createElement(\"div\");\n panel.className = \"ofv-fallback\";\n\n const title = document.createElement(\"strong\");\n title.textContent =\n ctx.options.fallback === \"download\"\n ? \"当前文件可下载后查看\"\n : \"当前文件暂不支持在线预览\";\n\n const meta = createFallbackMeta(ctx.file);\n\n const download = document.createElement(\"a\");\n download.href = url;\n download.download = ctx.file.name;\n download.textContent = \"下载文件\";\n\n panel.append(title, meta, download);\n ctx.viewport.classList.add(\"ofv-center\");\n ctx.viewport.append(panel);\n\n if (ctx.options.fallback === \"download\") {\n download.focus();\n }\n\n return {\n destroy() {\n ctx.viewport.classList.remove(\"ofv-center\");\n revokeObjectUrl(url, isExternal);\n }\n };\n }\n };\n}\n\nfunction createFallbackMeta(file: { name: string; extension: string; mimeType: string; size?: number; url?: string }): HTMLElement {\n const meta = document.createElement(\"dl\");\n meta.className = \"ofv-fallback-meta\";\n appendFallbackMeta(meta, \"文件\", file.name || \"未命名文件\");\n appendFallbackMeta(meta, \"格式\", file.extension ? `.${file.extension}` : \"未知\");\n appendFallbackMeta(meta, \"MIME\", file.mimeType || \"未声明\");\n appendFallbackMeta(meta, \"大小\", file.size === undefined ? \"未知\" : formatFallbackBytes(file.size));\n appendFallbackMeta(meta, \"来源\", file.url ? \"远程 URL\" : \"本地/内存文件\");\n return meta;\n}\n\nfunction appendFallbackMeta(parent: HTMLElement, label: string, value: string): void {\n const key = document.createElement(\"dt\");\n key.textContent = label;\n const content = document.createElement(\"dd\");\n content.textContent = value;\n parent.append(key, content);\n}\n\nfunction formatFallbackBytes(bytes: number): string {\n if (bytes < 1024) {\n return `${bytes} B`;\n }\n if (bytes < 1024 * 1024) {\n return `${(bytes / 1024).toFixed(1)} KB`;\n }\n return `${(bytes / 1024 / 1024).toFixed(2)} MB`;\n}\n","import { normalizeFile } from \"./detect\";\nimport { applyBoxSize, createObjectUrl, getElementSize, resolveContainer, revokeObjectUrl } from \"./dom\";\nimport { fallbackPlugin } from \"./plugins/fallback\";\nimport type {\n FileViewer,\n PreviewFile,\n PreviewCommand,\n PreviewInstance,\n PreviewItem,\n PreviewOptions,\n PreviewPlugin,\n PreviewSource,\n PreviewToolbarActionId,\n PreviewToolbarBuiltInAction,\n PreviewToolbarCustomAction,\n PreviewToolbarOptions\n} from \"./types\";\n\nexport function createViewer(options: PreviewOptions): FileViewer {\n const container = resolveContainer(options.container);\n applyBoxSize(container, options.width, options.height);\n\n container.classList.add(\"ofv-root\");\n if (options.className) {\n container.classList.add(options.className);\n }\n const theme = applyTheme(container, options.theme || \"light\");\n\n const host = document.createElement(\"div\");\n host.className = \"ofv-host\";\n\n const status = document.createElement(\"div\");\n status.className = \"ofv-status\";\n status.hidden = true;\n\n const viewport = document.createElement(\"div\");\n viewport.className = \"ofv-viewport\";\n\n const queue = normalizeQueue(options);\n let currentIndex = clampIndex(options.initialIndex || 0, queue.length);\n let currentInstance: PreviewInstance | undefined;\n\n const goTo = async (index: number) => {\n if (destroyed || queue.length === 0) {\n return;\n }\n currentIndex = clampIndex(index, queue.length);\n await renderQueueItem(currentIndex);\n };\n\n const toolbar = createToolbar(options.toolbar, viewport, {\n getLength: () => queue.length,\n next: () => goTo(currentIndex + 1),\n previous: () => goTo(currentIndex - 1),\n command: (command) => currentInstance?.command?.(command)\n });\n if (toolbar) {\n host.append(toolbar.element);\n }\n\n host.append(status, viewport);\n container.replaceChildren(host);\n\n const normalizedOptions = {\n fit: options.fit || \"contain\",\n fallback: options.fallback || \"inline\",\n ...options\n };\n\n let destroyed = false;\n let renderToken = 0;\n\n const setLoading = (loading: boolean) => {\n status.hidden = !loading;\n status.textContent = loading ? \"Loading preview...\" : \"\";\n };\n\n const setError = (error: Error | string) => {\n status.hidden = false;\n status.textContent = typeof error === \"string\" ? error : error.message;\n };\n\n const resize = () => {\n if (destroyed) {\n return;\n }\n const size = getElementSize(viewport);\n currentInstance?.resize?.(size);\n };\n\n const resizeObserver = observeResize(container, resize);\n\n const renderFile = async (file: PreviewFile) => {\n const token = (renderToken += 1);\n currentInstance?.destroy();\n currentInstance = undefined;\n viewport.replaceChildren();\n setLoading(true);\n toolbar?.update(file, currentIndex, queue.length);\n\n const plugins = [...(options.plugins || []), fallbackPlugin()];\n const plugin = await findPlugin(plugins, file);\n if (destroyed || token !== renderToken) {\n return;\n }\n\n try {\n const nextInstance = await plugin.render({\n host,\n viewport,\n file,\n size: getElementSize(viewport),\n options: normalizedOptions,\n toolbar: toolbar?.getContext(),\n setLoading,\n setError\n });\n if (destroyed || token !== renderToken) {\n nextInstance.destroy();\n return;\n }\n currentInstance = nextInstance;\n setLoading(false);\n toolbar?.setCommandSupport((command) =>\n Boolean(nextInstance.command) && (nextInstance.canCommand ? nextInstance.canCommand(command) : true)\n );\n options.onLoad?.(file);\n resize();\n } catch (error) {\n if (destroyed || token !== renderToken) {\n return;\n }\n const normalizedError = error instanceof Error ? error : new Error(String(error));\n setLoading(false);\n setError(normalizedError);\n options.onError?.(normalizedError, file);\n }\n };\n\n async function renderQueueItem(index: number) {\n const item = queue[index];\n const file = await normalizeFile(item.file, item.fileName, item.mimeType);\n await renderFile(file);\n }\n\n void goTo(currentIndex);\n\n return {\n async reload(file) {\n if (destroyed) {\n return;\n }\n if (file !== undefined) {\n const currentItem = queue[currentIndex];\n queue.splice(currentIndex, 1, createReloadItem(file, currentItem, options));\n }\n await renderQueueItem(currentIndex);\n },\n async next() {\n await goTo(currentIndex + 1);\n },\n async previous() {\n await goTo(currentIndex - 1);\n },\n goTo,\n getCurrentIndex() {\n return currentIndex;\n },\n resize,\n destroy() {\n destroyed = true;\n renderToken += 1;\n resizeObserver.destroy();\n currentInstance?.destroy();\n toolbar?.destroy();\n theme.destroy();\n container.replaceChildren();\n container.classList.remove(\"ofv-root\");\n if (options.className) {\n container.classList.remove(options.className);\n }\n }\n };\n}\n\nfunction normalizeQueue(options: PreviewOptions): PreviewItem[] {\n if (options.files && options.files.length > 0) {\n return options.files.map((item) =>\n isPreviewItem(item)\n ? item\n : {\n file: item\n }\n );\n }\n if (options.file === undefined) {\n throw new Error(\"File viewer requires either file or files.\");\n }\n return [\n {\n file: options.file,\n fileName: options.fileName,\n mimeType: options.mimeType\n }\n ];\n}\n\nfunction isPreviewItem(item: PreviewSource | PreviewItem): item is PreviewItem {\n return typeof item === \"object\" && item !== null && \"file\" in item;\n}\n\nfunction createReloadItem(\n file: PreviewSource,\n currentItem: PreviewItem | undefined,\n options: PreviewOptions\n): PreviewItem {\n if (typeof File !== \"undefined\" && file instanceof File) {\n return { file };\n }\n return {\n file,\n fileName: currentItem?.fileName || options.fileName,\n mimeType: currentItem?.mimeType || options.mimeType\n };\n}\n\nfunction clampIndex(index: number, length: number): number {\n if (length <= 0) {\n return 0;\n }\n return Math.min(Math.max(index, 0), length - 1);\n}\n\nfunction applyTheme(\n container: HTMLElement,\n theme: NonNullable<PreviewOptions[\"theme\"]>\n): { destroy: () => void } {\n const media = window.matchMedia?.(\"(prefers-color-scheme: dark)\");\n const classes = [\"ofv-theme-light\", \"ofv-theme-dark\"];\n\n const setThemeClass = () => {\n container.classList.remove(...classes);\n const resolvedTheme = theme === \"auto\" && media?.matches ? \"dark\" : theme === \"auto\" ? \"light\" : theme;\n container.classList.add(`ofv-theme-${resolvedTheme}`);\n };\n\n setThemeClass();\n if (theme === \"auto\") {\n addMediaListener(media, setThemeClass);\n }\n\n return {\n destroy() {\n if (theme === \"auto\") {\n removeMediaListener(media, setThemeClass);\n }\n container.classList.remove(...classes);\n }\n };\n}\n\nfunction observeResize(element: HTMLElement, callback: () => void): { destroy: () => void } {\n if (typeof ResizeObserver !== \"undefined\") {\n const observer = new ResizeObserver(callback);\n observer.observe(element);\n return {\n destroy() {\n observer.disconnect();\n }\n };\n }\n\n window.addEventListener(\"resize\", callback);\n return {\n destroy() {\n window.removeEventListener(\"resize\", callback);\n }\n };\n}\n\ntype CompatibleMediaQueryList = MediaQueryList & {\n addListener?: (listener: () => void) => void;\n removeListener?: (listener: () => void) => void;\n};\n\nfunction addMediaListener(media: CompatibleMediaQueryList | undefined, listener: () => void): void {\n if (!media) {\n return;\n }\n if (typeof media.addEventListener === \"function\") {\n media.addEventListener(\"change\", listener);\n return;\n }\n media.addListener?.(listener);\n}\n\nfunction removeMediaListener(media: CompatibleMediaQueryList | undefined, listener: () => void): void {\n if (!media) {\n return;\n }\n if (typeof media.removeEventListener === \"function\") {\n media.removeEventListener(\"change\", listener);\n return;\n }\n media.removeListener?.(listener);\n}\n\nfunction createToolbar(\n toolbar: PreviewOptions[\"toolbar\"],\n viewport: HTMLElement,\n queue: {\n getLength: () => number;\n next: () => void | Promise<void>;\n previous: () => void | Promise<void>;\n command: (command: PreviewCommand) => void | boolean | undefined;\n }\n):\n | {\n element: HTMLElement;\n update: (file: PreviewFile, index: number, length: number) => void;\n setCommandSupport: (isSupported: (command: PreviewCommand) => boolean) => void;\n getContext: () => ReturnType<typeof createToolbarContext>;\n setZoom: (zoom?: number) => void;\n destroy: () => void;\n }\n | undefined {\n if (!toolbar) {\n return undefined;\n }\n\n const options: PreviewToolbarOptions =\n typeof toolbar === \"boolean\"\n ? { zoom: true, rotate: true, download: true, fullscreen: true, print: true, search: true }\n : toolbar;\n\n const element = document.createElement(\"div\");\n element.className = \"ofv-toolbar\";\n element.setAttribute(\"role\", \"toolbar\");\n element.setAttribute(\"aria-label\", \"File preview toolbar\");\n\n let file: PreviewFile | undefined;\n let currentIndex = 0;\n let currentLength = queue.getLength();\n let queueLabel: HTMLSpanElement | undefined;\n let previousButton: HTMLButtonElement | undefined;\n let nextButton: HTMLButtonElement | undefined;\n let zoomResetButton: HTMLButtonElement | undefined;\n let currentZoom: number | undefined;\n const commandButtons: Array<{ button: HTMLButtonElement; command: PreviewCommand }> = [];\n const customButtons: Array<{ button: HTMLButtonElement; action: PreviewToolbarCustomAction }> = [];\n const disposers: Array<() => void> = [];\n const search = createSearchController(viewport);\n let searchInput: HTMLInputElement | undefined;\n let searchCount: HTMLSpanElement | undefined;\n let canRunCommand = (_command: PreviewCommand) => false;\n\n const getContext = () =>\n createToolbarContext({\n file,\n index: currentIndex,\n length: currentLength,\n viewport,\n queue,\n element,\n search,\n canCommand: canRunCommand,\n zoom: currentZoom,\n setZoom\n });\n\n const addButton = (\n label: string,\n title: string,\n action: () => void,\n className?: string,\n icon?: string | HTMLElement | SVGElement\n ) => {\n const button = document.createElement(\"button\");\n button.type = \"button\";\n setToolbarButtonContent(button, label, icon);\n button.title = title;\n button.setAttribute(\"aria-label\", title);\n if (className) {\n button.className = className;\n }\n button.addEventListener(\"click\", action);\n element.append(button);\n disposers.push(() => button.removeEventListener(\"click\", action));\n return button;\n };\n\n const addCommandButton = (\n id: PreviewToolbarBuiltInAction,\n label: string,\n title: string,\n command: PreviewCommand\n ) => {\n const button = addButton(label, title, () => {\n queue.command(command);\n }, undefined, options.icons?.[id]);\n button.disabled = true;\n commandButtons.push({ button, command });\n };\n\n const renderDefaultAction = (id: PreviewToolbarActionId) => {\n if (!isBuiltInToolbarAction(id)) {\n const customAction = options.actions?.find((action) => action.id === id);\n if (customAction) {\n renderCustomAction(customAction);\n }\n return;\n }\n\n if (id === \"previous\" && queue.getLength() > 1) {\n previousButton = addButton(\n getToolbarLabel(options, \"previous\"),\n getToolbarTitle(options, \"previous\"),\n () => void queue.previous(),\n undefined,\n options.icons?.previous\n );\n return;\n }\n if (id === \"next\" && queue.getLength() > 1) {\n nextButton = addButton(\n getToolbarLabel(options, \"next\"),\n getToolbarTitle(options, \"next\"),\n () => void queue.next(),\n undefined,\n options.icons?.next\n );\n return;\n }\n if (id === \"queue\" && queue.getLength() > 1) {\n queueLabel = document.createElement(\"span\");\n queueLabel.className = \"ofv-toolbar-queue\";\n element.append(queueLabel);\n return;\n }\n if (id === \"zoom-out\" && options.zoom) {\n addCommandButton(id, getToolbarLabel(options, id), getToolbarTitle(options, id), \"zoom-out\");\n return;\n }\n if (id === \"zoom-in\" && options.zoom) {\n addCommandButton(id, getToolbarLabel(options, id), getToolbarTitle(options, id), \"zoom-in\");\n return;\n }\n if (id === \"zoom-reset\" && options.zoom) {\n addCommandButton(id, getToolbarLabel(options, id), getToolbarTitle(options, id), \"zoom-reset\");\n zoomResetButton = commandButtons[commandButtons.length - 1]?.button;\n updateZoomLabel();\n return;\n }\n if (id === \"rotate-right\" && options.rotate) {\n addCommandButton(id, getToolbarLabel(options, id), getToolbarTitle(options, id), \"rotate-right\");\n return;\n }\n if (id === \"download\" && options.download !== false) {\n addButton(\n getToolbarLabel(options, id),\n getToolbarTitle(options, id),\n () => getContext().download(),\n undefined,\n options.icons?.download\n );\n return;\n }\n if (id === \"fullscreen\" && options.fullscreen !== false) {\n addButton(\n getToolbarLabel(options, id),\n getToolbarTitle(options, id),\n () => getContext().fullscreen(),\n undefined,\n options.icons?.fullscreen\n );\n return;\n }\n if (id === \"print\" && options.print) {\n addButton(\n getToolbarLabel(options, id),\n getToolbarTitle(options, id),\n () => getContext().print(),\n undefined,\n options.icons?.print\n );\n return;\n }\n if (id === \"search\" && options.search !== false) {\n renderSearchControl();\n return;\n }\n\n };\n\n const renderCustomAction = (action: PreviewToolbarCustomAction) => {\n const button = addButton(\n action.label,\n action.title || action.label,\n () => void action.onClick(getContext()),\n action.className,\n action.icon\n );\n button.dataset.ofvToolbarAction = action.id;\n customButtons.push({ button, action });\n };\n\n const renderSearchControl = () => {\n const searchGroup = document.createElement(\"div\");\n searchGroup.className = \"ofv-toolbar-search\";\n searchGroup.title = getToolbarTitle(options, \"search\");\n const nextSearchInput = document.createElement(\"input\");\n nextSearchInput.type = \"search\";\n nextSearchInput.placeholder = getToolbarLabel(options, \"search\");\n nextSearchInput.setAttribute(\"aria-label\", getToolbarTitle(options, \"search\"));\n const nextSearchCount = document.createElement(\"span\");\n nextSearchCount.className = \"ofv-toolbar-search-count\";\n searchInput = nextSearchInput;\n searchCount = nextSearchCount;\n\n const runSearch = () => {\n const count = search.search(nextSearchInput.value);\n nextSearchCount.textContent = nextSearchInput.value ? String(count) : \"\";\n };\n\n nextSearchInput.addEventListener(\"input\", runSearch);\n searchGroup.append(nextSearchInput, nextSearchCount);\n element.append(searchGroup);\n disposers.push(() => nextSearchInput.removeEventListener(\"input\", runSearch));\n };\n\n const renderToolbar = () => {\n if (options.render) {\n element.replaceChildren();\n const customElement = options.render(getContext());\n if (customElement) {\n element.append(customElement);\n }\n return;\n }\n getToolbarOrder(options, queue.getLength()).forEach(renderDefaultAction);\n getImplicitCustomActions(options).forEach(renderCustomAction);\n };\n\n renderToolbar();\n\n const updateCustomButtons = () => {\n const context = getContext();\n for (const { button, action } of customButtons) {\n button.disabled = evaluateToolbarFlag(action.disabled, context);\n button.hidden = evaluateToolbarFlag(action.hidden, context);\n }\n };\n\n const resetSearch = () => {\n search.clear();\n if (searchInput) {\n searchInput.value = \"\";\n }\n if (searchCount) {\n searchCount.textContent = \"\";\n }\n };\n\n function setZoom(zoom?: number) {\n currentZoom = typeof zoom === \"number\" && Number.isFinite(zoom) && zoom > 0 ? zoom : undefined;\n updateZoomLabel();\n updateCustomButtons();\n refreshCustomRender();\n }\n\n function updateZoomLabel() {\n if (!zoomResetButton) {\n return;\n }\n setToolbarButtonContent(\n zoomResetButton,\n currentZoom === undefined ? getToolbarLabel(options, \"zoom-reset\") : formatToolbarZoom(currentZoom),\n options.icons?.[\"zoom-reset\"]\n );\n }\n\n const refreshCustomRender = () => {\n if (!options.render) {\n return;\n }\n element.replaceChildren();\n const customElement = options.render(getContext());\n if (customElement) {\n element.append(customElement);\n }\n };\n\n return {\n element,\n update(nextFile, index, length) {\n file = nextFile;\n currentIndex = index;\n currentLength = length;\n currentZoom = undefined;\n updateZoomLabel();\n resetSearch();\n commandButtons.forEach(({ button }) => {\n button.disabled = true;\n });\n if (queueLabel) {\n queueLabel.textContent = `${index + 1} / ${length}`;\n }\n if (previousButton) {\n previousButton.disabled = index <= 0;\n }\n if (nextButton) {\n nextButton.disabled = index >= length - 1;\n }\n updateCustomButtons();\n refreshCustomRender();\n },\n setCommandSupport(isSupported) {\n canRunCommand = isSupported;\n commandButtons.forEach(({ button, command }) => {\n button.disabled = !isSupported(command);\n });\n updateCustomButtons();\n refreshCustomRender();\n },\n getContext,\n setZoom,\n destroy() {\n search.clear();\n for (const dispose of disposers) {\n dispose();\n }\n element.replaceChildren();\n }\n };\n}\n\nfunction createToolbarContext({\n file,\n index,\n length,\n viewport,\n queue,\n element,\n search,\n canCommand,\n zoom,\n setZoom\n}: {\n file?: PreviewFile;\n index: number;\n length: number;\n viewport: HTMLElement;\n queue: {\n next: () => void | Promise<void>;\n previous: () => void | Promise<void>;\n command: (command: PreviewCommand) => void | boolean | undefined;\n };\n element: HTMLElement;\n search: ReturnType<typeof createSearchController>;\n canCommand: (command: PreviewCommand) => boolean;\n zoom?: number;\n setZoom: (zoom?: number) => void;\n}) {\n return {\n file,\n index,\n length,\n viewport,\n canPrevious: index > 0,\n canNext: index < length - 1,\n zoom,\n zoomLabel: zoom === undefined ? undefined : formatToolbarZoom(zoom),\n async previous() {\n await queue.previous();\n },\n async next() {\n await queue.next();\n },\n command: queue.command,\n canCommand,\n setZoom,\n download() {\n if (file) {\n downloadFile(file);\n }\n },\n fullscreen() {\n void element.parentElement?.requestFullscreen?.();\n },\n print() {\n printPreview(viewport);\n },\n search: search.search,\n clearSearch: search.clear\n };\n}\n\nconst defaultToolbarLabels: Record<PreviewToolbarBuiltInAction, string> = {\n previous: \"Prev\",\n next: \"Next\",\n queue: \"\",\n \"zoom-out\": \"-\",\n \"zoom-in\": \"+\",\n \"zoom-reset\": \"100%\",\n \"rotate-right\": \"Rotate\",\n download: \"Download\",\n fullscreen: \"Fullscreen\",\n print: \"Print\",\n search: \"Search\"\n};\n\nconst defaultToolbarTitles: Record<PreviewToolbarBuiltInAction, string> = {\n previous: \"Previous file\",\n next: \"Next file\",\n queue: \"Current file position\",\n \"zoom-out\": \"Zoom out\",\n \"zoom-in\": \"Zoom in\",\n \"zoom-reset\": \"Reset zoom\",\n \"rotate-right\": \"Rotate right\",\n download: \"Download file\",\n fullscreen: \"Open preview fullscreen\",\n print: \"Print preview\",\n search: \"Search preview text\"\n};\n\nfunction getToolbarLabel(options: PreviewToolbarOptions, id: PreviewToolbarBuiltInAction): string {\n return options.labels?.[id] ?? defaultToolbarLabels[id];\n}\n\nfunction getToolbarTitle(options: PreviewToolbarOptions, id: PreviewToolbarBuiltInAction): string {\n return options.titles?.[id] ?? options.labels?.[id] ?? defaultToolbarTitles[id];\n}\n\nfunction formatToolbarZoom(zoom: number): string {\n return `${Math.round(zoom * 100)}%`;\n}\n\nfunction getToolbarOrder(options: PreviewToolbarOptions, queueLength: number): PreviewToolbarActionId[] {\n if (options.order) {\n return options.order;\n }\n\n const actions: PreviewToolbarActionId[] = [];\n if (queueLength > 1) {\n actions.push(\"previous\", \"next\", \"queue\");\n }\n if (options.zoom) {\n actions.push(\"zoom-out\", \"zoom-in\", \"zoom-reset\");\n }\n if (options.rotate) {\n actions.push(\"rotate-right\");\n }\n if (options.download !== false) {\n actions.push(\"download\");\n }\n if (options.fullscreen !== false) {\n actions.push(\"fullscreen\");\n }\n if (options.print) {\n actions.push(\"print\");\n }\n if (options.search !== false) {\n actions.push(\"search\");\n }\n return actions;\n}\n\nfunction getImplicitCustomActions(options: PreviewToolbarOptions): PreviewToolbarCustomAction[] {\n if (options.order || !options.actions) {\n return [];\n }\n return [...options.actions].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n}\n\nfunction evaluateToolbarFlag(\n value: boolean | ((ctx: ReturnType<typeof createToolbarContext>) => boolean) | undefined,\n context: ReturnType<typeof createToolbarContext>\n): boolean {\n return typeof value === \"function\" ? value(context) : Boolean(value);\n}\n\nfunction setToolbarButtonContent(\n button: HTMLButtonElement,\n label: string,\n icon?: string | HTMLElement | SVGElement\n): void {\n button.replaceChildren();\n if (!icon) {\n button.textContent = label;\n return;\n }\n\n const iconElement = document.createElement(\"span\");\n iconElement.className = \"ofv-toolbar-icon\";\n iconElement.setAttribute(\"aria-hidden\", \"true\");\n if (typeof icon === \"string\") {\n iconElement.append(sanitizeToolbarIcon(icon));\n } else {\n iconElement.append(icon.cloneNode(true));\n }\n\n const labelElement = document.createElement(\"span\");\n labelElement.className = \"ofv-toolbar-label\";\n labelElement.textContent = label;\n button.append(iconElement, labelElement);\n}\n\nconst allowedToolbarIconTags = new Set([\n \"svg\",\n \"g\",\n \"path\",\n \"circle\",\n \"rect\",\n \"line\",\n \"polyline\",\n \"polygon\",\n \"ellipse\",\n \"defs\",\n \"title\",\n \"desc\"\n]);\n\nconst allowedToolbarIconAttrs = new Set([\n \"aria-hidden\",\n \"class\",\n \"cx\",\n \"cy\",\n \"d\",\n \"fill\",\n \"focusable\",\n \"height\",\n \"id\",\n \"points\",\n \"r\",\n \"rx\",\n \"ry\",\n \"stroke\",\n \"stroke-linecap\",\n \"stroke-linejoin\",\n \"stroke-width\",\n \"transform\",\n \"viewBox\",\n \"width\",\n \"x\",\n \"x1\",\n \"x2\",\n \"y\",\n \"y1\",\n \"y2\"\n]);\n\nfunction sanitizeToolbarIcon(icon: string): Node {\n const template = document.createElement(\"template\");\n template.innerHTML = icon.trim();\n const fragment = document.createDocumentFragment();\n for (const child of Array.from(template.content.childNodes)) {\n const sanitized = sanitizeToolbarIconNode(child);\n if (sanitized) {\n fragment.append(sanitized);\n }\n }\n return fragment;\n}\n\nfunction sanitizeToolbarIconNode(node: Node): Node | null {\n if (node.nodeType === Node.TEXT_NODE) {\n const text = node.textContent || \"\";\n return text.trim() ? document.createTextNode(text) : null;\n }\n\n if (!(node instanceof Element)) {\n return null;\n }\n\n const tagName = node.tagName.toLowerCase();\n if (!allowedToolbarIconTags.has(tagName)) {\n return null;\n }\n\n const sanitized = document.createElementNS(\"http://www.w3.org/2000/svg\", tagName);\n for (const attr of Array.from(node.attributes)) {\n if (isSafeToolbarIconAttribute(attr.name, attr.value)) {\n sanitized.setAttribute(attr.name, attr.value);\n }\n }\n\n for (const child of Array.from(node.childNodes)) {\n const sanitizedChild = sanitizeToolbarIconNode(child);\n if (sanitizedChild) {\n sanitized.append(sanitizedChild);\n }\n }\n\n return sanitized;\n}\n\nfunction isSafeToolbarIconAttribute(name: string, value: string): boolean {\n const attrName = name.toLowerCase();\n if (attrName.startsWith(\"on\") || attrName.includes(\":\")) {\n return false;\n }\n if (!allowedToolbarIconAttrs.has(name) && !allowedToolbarIconAttrs.has(attrName) && !attrName.startsWith(\"data-\")) {\n return false;\n }\n return !/^\\s*(?:javascript|data:text\\/html|vbscript):/i.test(value);\n}\n\nfunction isBuiltInToolbarAction(id: PreviewToolbarActionId): id is PreviewToolbarBuiltInAction {\n return id in defaultToolbarLabels;\n}\n\nfunction createSearchController(root: HTMLElement): {\n search: (query: string) => number;\n clear: () => void;\n} {\n const markerClass = \"ofv-search-match\";\n\n const clear = () => {\n const markers = collectSearchRoots(root).flatMap((searchRoot) => [\n ...searchRoot.querySelectorAll(`mark.${markerClass}`)\n ]);\n for (const marker of markers) {\n marker.replaceWith(document.createTextNode(marker.textContent || \"\"));\n }\n collectSearchRoots(root).forEach((searchRoot) => searchRoot.normalize());\n };\n\n const search = (query: string): number => {\n clear();\n const normalizedQuery = query.trim();\n if (!normalizedQuery) {\n return 0;\n }\n\n const textNodes = collectSearchRoots(root).flatMap((searchRoot) => collectSearchableTextNodes(searchRoot));\n let count = 0;\n let firstMatch: HTMLElement | undefined;\n\n for (const node of textNodes) {\n const text = node.nodeValue || \"\";\n const lowerText = text.toLowerCase();\n const lowerQuery = normalizedQuery.toLowerCase();\n let start = 0;\n let index = lowerText.indexOf(lowerQuery, start);\n if (index < 0) {\n continue;\n }\n\n const fragment = document.createDocumentFragment();\n while (index >= 0) {\n if (index > start) {\n fragment.append(document.createTextNode(text.slice(start, index)));\n }\n const marker = document.createElement(\"mark\");\n marker.className = markerClass;\n marker.textContent = text.slice(index, index + normalizedQuery.length);\n fragment.append(marker);\n firstMatch ||= marker;\n count += 1;\n start = index + normalizedQuery.length;\n index = lowerText.indexOf(lowerQuery, start);\n }\n if (start < text.length) {\n fragment.append(document.createTextNode(text.slice(start)));\n }\n node.replaceWith(fragment);\n }\n\n firstMatch?.scrollIntoView?.({ block: \"center\", inline: \"nearest\" });\n return count;\n };\n\n return { search, clear };\n}\n\nfunction collectSearchRoots(root: HTMLElement): HTMLElement[] {\n const roots = [root];\n for (const iframe of root.querySelectorAll<HTMLIFrameElement>(\"iframe\")) {\n try {\n const body = iframe.contentDocument?.body;\n if (body) {\n roots.push(body);\n }\n } catch {\n // Cross-origin or sandboxed frames without DOM access are skipped.\n }\n }\n return roots;\n}\n\nfunction collectSearchableTextNodes(root: HTMLElement): Text[] {\n const nodes: Text[] = [];\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, {\n acceptNode(node) {\n const parent = node.parentElement;\n if (!parent || !node.nodeValue?.trim()) {\n return NodeFilter.FILTER_REJECT;\n }\n if ([\"SCRIPT\", \"STYLE\", \"TEXTAREA\", \"INPUT\", \"BUTTON\"].includes(parent.tagName)) {\n return NodeFilter.FILTER_REJECT;\n }\n return NodeFilter.FILTER_ACCEPT;\n }\n });\n\n let current = walker.nextNode();\n while (current) {\n nodes.push(current as Text);\n current = walker.nextNode();\n }\n return nodes;\n}\n\nfunction printPreview(viewport: HTMLElement): void {\n const frame = document.createElement(\"iframe\");\n frame.className = \"ofv-print-frame\";\n frame.setAttribute(\"aria-hidden\", \"true\");\n document.body.append(frame);\n\n const clone = viewport.cloneNode(true) as HTMLElement;\n copyCanvasContent(viewport, clone);\n clone.classList.add(\"ofv-print-root\", \"ofv-root\"); // Add ofv-root class so CSS variables can resolve\n\n // Handle PPTX printing layout adaptation\n const pptxViewer = clone.querySelector(\".ofv-pptx-viewer\") || (clone.classList.contains(\"ofv-pptx-viewer\") ? clone : null);\n let intrinsicWidth = 960;\n let intrinsicHeight = 540;\n let hasSlides = false;\n\n if (pptxViewer) {\n const slides = pptxViewer.querySelectorAll(\"[data-slide-index]\");\n if (slides.length > 0) {\n hasSlides = true;\n const firstWrapper = slides[0].firstElementChild as HTMLElement | null;\n const firstSlide = firstWrapper?.firstElementChild as HTMLElement | null;\n if (firstSlide) {\n intrinsicWidth = parseInt(firstSlide.style.width) || 960;\n intrinsicHeight = parseInt(firstSlide.style.height) || 540;\n }\n\n slides.forEach((slideEl) => {\n const item = slideEl as HTMLElement;\n item.style.width = \"100%\";\n item.style.margin = \"0 0 20px 0\";\n\n const wrapper = item.firstElementChild as HTMLElement | null;\n if (wrapper) {\n wrapper.style.width = `${intrinsicWidth}px`;\n wrapper.style.height = `${intrinsicHeight}px`;\n wrapper.style.boxShadow = \"none\";\n wrapper.style.margin = \"0 auto\";\n\n const slideContent = wrapper.firstElementChild as HTMLElement | null;\n if (slideContent) {\n slideContent.style.transform = \"none\";\n slideContent.style.width = `${intrinsicWidth}px`;\n slideContent.style.height = `${intrinsicHeight}px`;\n }\n }\n });\n }\n }\n\n const doc = frame.contentDocument;\n if (!doc) {\n frame.remove();\n return;\n }\n\n // 1. Write the basic HTML skeleton\n doc.open();\n doc.write(`<!doctype html>\n <html>\n <head>\n <meta charset=\"utf-8\" />\n <title>Print preview</title>\n </head>\n <body></body>\n </html>`);\n doc.close();\n\n // 2. Copy all stylesheets from parent document to print iframe\n Array.from(document.querySelectorAll(\"style, link[rel='stylesheet']\")).forEach((el) => {\n doc.head.appendChild(el.cloneNode(true));\n });\n\n // 3. Inject our base print style override element AFTER parent stylesheets\n const baseStyle = doc.createElement(\"style\");\n baseStyle.textContent = `\n * { box-sizing: border-box; }\n html, body {\n margin: 0;\n padding: 0;\n background: #fff;\n color: #111827;\n font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n }\n body { padding: 16px; }\n img, video, canvas, svg { max-width: 100%; }\n pre {\n white-space: pre-wrap;\n word-break: break-word;\n font: 12px/1.5 ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n }\n .ofv-viewport, .ofv-print-root {\n width: 100% !important;\n height: auto !important;\n overflow: visible !important;\n background: #fff !important;\n color: #111827 !important;\n border: none !important;\n box-shadow: none !important;\n }\n .ofv-pdf {\n padding: 0;\n overflow: visible;\n background: #fff;\n }\n .ofv-pdf-page {\n display: block;\n max-width: 100%;\n height: auto;\n margin: 0 auto 16px;\n box-shadow: none;\n }\n .ofv-panel,\n .ofv-text,\n .ofv-text-block,\n .ofv-file-list {\n max-height: none;\n min-height: 0;\n overflow: visible;\n }\n .ofv-section {\n break-inside: avoid;\n page-break-inside: avoid;\n }\n `;\n doc.head.appendChild(baseStyle);\n\n // 4. Inject PPTX-specific style overrides if slides are present\n if (hasSlides) {\n const pptxStyle = doc.createElement(\"style\");\n pptxStyle.textContent = `\n @media print {\n @page {\n size: ${intrinsicWidth > intrinsicHeight ? \"landscape\" : \"portrait\"};\n margin: 0;\n }\n html, body {\n background: #fff;\n }\n body {\n width: ${intrinsicWidth}px !important;\n margin: 0 !important;\n padding: 0 !important;\n }\n .ofv-print-root {\n width: ${intrinsicWidth}px !important;\n padding: 0 !important;\n }\n .ofv-pptx-viewer {\n width: ${intrinsicWidth}px !important;\n padding: 0 !important;\n background: #fff !important;\n overflow: visible !important;\n }\n .ofv-pptx-viewer > div[data-slide-index] {\n page-break-after: always;\n break-after: page;\n break-inside: avoid;\n page-break-inside: avoid;\n margin: 0 !important;\n padding: 0 !important;\n overflow: visible !important;\n }\n .ofv-pptx-viewer > div[data-slide-index]:last-child {\n page-break-after: avoid;\n break-after: avoid;\n }\n }\n `;\n doc.head.appendChild(pptxStyle);\n }\n\n doc.body.append(clone);\n\n let printed = false;\n const printAndCleanup = () => {\n if (printed) {\n return;\n }\n printed = true;\n frame.contentWindow?.focus();\n frame.contentWindow?.print();\n window.setTimeout(() => frame.remove(), 1000);\n };\n\n frame.onload = () => {\n printAndCleanup();\n };\n\n window.setTimeout(() => {\n printAndCleanup();\n }, 100);\n}\n\nfunction copyCanvasContent(sourceRoot: HTMLElement, targetRoot: HTMLElement): void {\n const sourceCanvases = [...sourceRoot.querySelectorAll(\"canvas\")];\n const targetCanvases = [...targetRoot.querySelectorAll(\"canvas\")];\n\n sourceCanvases.forEach((sourceCanvas, index) => {\n const targetCanvas = targetCanvases[index];\n if (!targetCanvas) {\n return;\n }\n const image = document.createElement(\"img\");\n image.className = targetCanvas.className;\n image.alt = \"Canvas preview page\";\n try {\n image.src = sourceCanvas.toDataURL(\"image/png\");\n } catch {\n return;\n }\n image.width = sourceCanvas.width;\n image.height = sourceCanvas.height;\n targetCanvas.replaceWith(image);\n });\n}\n\nfunction downloadFile(file: PreviewFile): void {\n const url = createObjectUrl(file);\n const isExternal = Boolean(file.url);\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = file.name;\n link.rel = \"noopener\";\n link.hidden = true;\n document.body.append(link);\n link.click();\n window.setTimeout(() => {\n link.remove();\n revokeObjectUrl(url, isExternal);\n }, 0);\n}\n\nasync function findPlugin(plugins: PreviewPlugin[], file: PreviewFile): Promise<PreviewPlugin> {\n for (const plugin of plugins) {\n if (await plugin.match(file)) {\n return plugin;\n }\n }\n return fallbackPlugin();\n}\n","/// <reference path=\"../shims-heic.d.ts\" />\nimport { createObjectUrl, revokeObjectUrl } from \"../dom\";\nimport type { PreviewPlugin, PreviewSize } from \"../types\";\n\nconst imageExtensions = new Set([\n \"jpg\",\n \"jpeg\",\n \"jfif\",\n \"pjpe\",\n \"pjpeg\",\n \"png\",\n \"gif\",\n \"webp\",\n \"avif\",\n \"jxl\",\n \"svg\",\n \"bmp\",\n \"ico\",\n \"cur\",\n \"tif\",\n \"tiff\",\n \"apng\",\n \"heic\",\n \"heif\"\n]);\nconst nonRasterImageExtensions = new Set([\"dxf\"]);\nconst nonRasterImageMimeTypes = new Set([\"image/vnd.dxf\", \"image/vnd.adobe.photoshop\"]);\nconst heicMimeTypes = new Set([\"image/heic\", \"image/heif\", \"image/heic-sequence\", \"image/heif-sequence\"]);\n\nexport function imagePlugin(): PreviewPlugin {\n return {\n name: \"image\",\n match(file) {\n if (nonRasterImageExtensions.has(file.extension) || nonRasterImageMimeTypes.has(file.mimeType)) {\n return false;\n }\n return file.mimeType.startsWith(\"image/\") || imageExtensions.has(file.extension);\n },\n async render(ctx) {\n const ext = ctx.file.extension.toLowerCase();\n const isHeic = ext === \"heic\" || ext === \"heif\" || heicMimeTypes.has(ctx.file.mimeType.toLowerCase());\n const sourceBytesPromise = readImageBytes(ctx.file.blob);\n\n let url = \"\";\n let convertedBlob: Blob | null = null;\n let isExternal = Boolean(ctx.file.url);\n\n if (isHeic) {\n ctx.setLoading(true);\n try {\n let blob = ctx.file.blob;\n if (!blob && typeof ctx.file.source === \"string\") {\n const res = await fetch(ctx.file.source);\n if (!res.ok) {\n throw new Error(`Failed to fetch HEIC file: ${res.status}`);\n }\n blob = await res.blob();\n }\n if (!blob) {\n throw new Error(\"HEIC file source cannot be resolved to a Blob.\");\n }\n\n const heic2anyModule = await import(\"heic2any\");\n const heic2any = heic2anyModule.default || heic2anyModule;\n const converted = await heic2any({\n blob,\n toType: \"image/jpeg\",\n quality: 0.8\n });\n\n convertedBlob = Array.isArray(converted) ? converted[0] : converted;\n url = URL.createObjectURL(convertedBlob);\n isExternal = false;\n } catch (err: any) {\n console.error(\"HEIC image conversion failed:\", err);\n // Fallback to raw object URL\n url = createObjectUrl(ctx.file);\n isExternal = Boolean(ctx.file.url);\n } finally {\n ctx.setLoading(false);\n }\n } else {\n url = createObjectUrl(ctx.file);\n }\n\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-image-viewer\";\n\n const showInlineControls = !ctx.options.toolbar;\n const controls = document.createElement(\"div\");\n controls.className = \"ofv-image-controls\";\n\n const stage = document.createElement(\"div\");\n stage.className = \"ofv-image-stage\";\n const infoBar = createImageInfoBar(await sourceBytesPromise, ext, ctx.file.mimeType, ctx.file.name);\n\n const image = document.createElement(\"img\");\n image.className = \"ofv-media ofv-image-content\";\n image.alt = ctx.file.name;\n image.draggable = false;\n image.src = url;\n image.style.objectFit = objectFit(ctx.options.fit);\n\n let scale = 1;\n let rotation = 0;\n let offsetX = 0;\n let offsetY = 0;\n let dragging = false;\n let dragStartX = 0;\n let dragStartY = 0;\n let startOffsetX = 0;\n let startOffsetY = 0;\n\n const zoomLabel = document.createElement(\"span\");\n zoomLabel.className = \"ofv-image-zoom\";\n\n const updateTransform = () => {\n image.style.transform = `translate(${offsetX}px, ${offsetY}px) scale(${scale}) rotate(${rotation}deg)`;\n zoomLabel.textContent = `${Math.round(scale * 100)}%`;\n ctx.toolbar?.setZoom(scale);\n };\n\n const showImageFallback = () => {\n stage.replaceChildren(createImageFallback(ctx.file.name, url));\n };\n\n const setScale = (nextScale: number) => {\n scale = Math.min(8, Math.max(0.1, nextScale));\n updateTransform();\n };\n\n const reset = () => {\n scale = 1;\n rotation = 0;\n offsetX = 0;\n offsetY = 0;\n updateTransform();\n };\n\n const addButton = (label: string, title: string, action: () => void) => {\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.textContent = label;\n button.title = title;\n button.setAttribute(\"aria-label\", title);\n button.addEventListener(\"click\", action);\n controls.append(button);\n return () => button.removeEventListener(\"click\", action);\n };\n\n const disposers = showInlineControls\n ? [\n addButton(\"-\", \"Zoom out\", () => setScale(scale - 0.25)),\n addButton(\"+\", \"Zoom in\", () => setScale(scale + 0.25)),\n addButton(\"Rotate\", \"Rotate image\", () => {\n rotation += 90;\n updateTransform();\n }),\n addButton(\"Reset\", \"Reset image view\", reset)\n ]\n : [];\n if (showInlineControls) {\n controls.append(zoomLabel);\n }\n\n const onPointerDown = (event: PointerEvent) => {\n if (event.button !== 0) {\n return;\n }\n dragging = true;\n dragStartX = event.clientX;\n dragStartY = event.clientY;\n startOffsetX = offsetX;\n startOffsetY = offsetY;\n stage.classList.add(\"is-dragging\");\n stage.setPointerCapture(event.pointerId);\n };\n\n const onPointerMove = (event: PointerEvent) => {\n if (!dragging) {\n return;\n }\n offsetX = startOffsetX + event.clientX - dragStartX;\n offsetY = startOffsetY + event.clientY - dragStartY;\n updateTransform();\n };\n\n const onPointerUp = (event: PointerEvent) => {\n dragging = false;\n stage.classList.remove(\"is-dragging\");\n if (stage.hasPointerCapture(event.pointerId)) {\n stage.releasePointerCapture(event.pointerId);\n }\n };\n\n const onWheel = (event: WheelEvent) => {\n if (!event.ctrlKey && !event.metaKey) {\n return;\n }\n event.preventDefault();\n setScale(scale + (event.deltaY > 0 ? -0.1 : 0.1));\n };\n\n stage.addEventListener(\"pointerdown\", onPointerDown);\n stage.addEventListener(\"pointermove\", onPointerMove);\n stage.addEventListener(\"pointerup\", onPointerUp);\n stage.addEventListener(\"pointercancel\", onPointerUp);\n stage.addEventListener(\"wheel\", onWheel, { passive: false });\n image.addEventListener(\"error\", showImageFallback);\n\n stage.append(image);\n wrapper.append(...(showInlineControls ? [controls, stage, infoBar] : [stage, infoBar]));\n ctx.viewport.append(wrapper);\n updateTransform();\n\n return {\n canCommand(command) {\n return (\n command === \"zoom-in\" ||\n command === \"zoom-out\" ||\n command === \"zoom-reset\" ||\n command === \"rotate-right\" ||\n command === \"rotate-left\"\n );\n },\n command(command) {\n if (command === \"zoom-in\") {\n setScale(scale + 0.25);\n return true;\n }\n if (command === \"zoom-out\") {\n setScale(scale - 0.25);\n return true;\n }\n if (command === \"zoom-reset\") {\n reset();\n return true;\n }\n if (command === \"rotate-right\") {\n rotation += 90;\n updateTransform();\n return true;\n }\n if (command === \"rotate-left\") {\n rotation -= 90;\n updateTransform();\n return true;\n }\n return false;\n },\n resize(size: PreviewSize) {\n image.style.maxWidth = `${size.width}px`;\n image.style.maxHeight = `${Math.max(0, size.height - controls.offsetHeight)}px`;\n },\n destroy() {\n ctx.toolbar?.setZoom(undefined);\n for (const dispose of disposers) {\n dispose();\n }\n stage.removeEventListener(\"pointerdown\", onPointerDown);\n stage.removeEventListener(\"pointermove\", onPointerMove);\n stage.removeEventListener(\"pointerup\", onPointerUp);\n stage.removeEventListener(\"pointercancel\", onPointerUp);\n stage.removeEventListener(\"wheel\", onWheel);\n image.removeEventListener(\"error\", showImageFallback);\n wrapper.remove();\n if (convertedBlob) {\n URL.revokeObjectURL(url);\n } else {\n revokeObjectUrl(url, isExternal);\n }\n }\n };\n }\n };\n}\n\nfunction createImageFallback(fileName: string, url: string): HTMLElement {\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n\n const title = document.createElement(\"strong\");\n title.textContent = \"图片预览失败\";\n\n const meta = document.createElement(\"span\");\n meta.textContent = \"当前浏览器无法直接显示该图片,文件可能已损坏或编码暂不受支持。\";\n\n const download = document.createElement(\"a\");\n download.href = url;\n download.download = fileName;\n download.textContent = \"下载图片\";\n\n fallback.append(title, meta, download);\n return fallback;\n}\n\ntype ImageInfo = {\n format: string;\n width?: number;\n height?: number;\n bitDepth?: string;\n color?: string;\n frames?: number;\n count?: number;\n note?: string;\n};\n\nasync function readImageBytes(blob?: Blob): Promise<Uint8Array> {\n if (!blob) {\n return new Uint8Array();\n }\n return new Uint8Array(await blob.arrayBuffer().catch(() => new ArrayBuffer(0)));\n}\n\nfunction createImageInfoBar(bytes: Uint8Array, extension: string, mimeType: string, fileName: string): HTMLElement {\n const info = parseImageInfo(bytes, extension, mimeType, fileName);\n const bar = document.createElement(\"div\");\n bar.className = \"ofv-image-info\";\n appendImageInfo(bar, \"格式\", info.format);\n if (info.width && info.height) {\n appendImageInfo(bar, \"尺寸\", `${info.width} x ${info.height}px`);\n }\n if (info.bitDepth) {\n appendImageInfo(bar, \"位深\", info.bitDepth);\n }\n if (info.color) {\n appendImageInfo(bar, \"颜色\", info.color);\n }\n if (info.frames !== undefined) {\n appendImageInfo(bar, \"帧\", String(info.frames));\n }\n if (info.count !== undefined) {\n appendImageInfo(bar, \"图像\", String(info.count));\n }\n if (info.note) {\n appendImageInfo(bar, \"说明\", info.note);\n }\n return bar;\n}\n\nfunction appendImageInfo(parent: HTMLElement, label: string, value: string): void {\n const row = document.createElement(\"span\");\n row.className = \"ofv-image-info-item\";\n const key = document.createElement(\"span\");\n key.textContent = label;\n const content = document.createElement(\"strong\");\n content.textContent = value;\n row.append(key, content);\n parent.append(row);\n}\n\nfunction parseImageInfo(bytes: Uint8Array, extension: string, mimeType: string, fileName: string): ImageInfo {\n const fallbackFormat = (extension || mimeType || fileName.split(\".\").pop() || \"image\").toUpperCase();\n if (bytes.length === 0) {\n return { format: fallbackFormat, note: \"无法读取本地头信息\" };\n }\n return (\n parsePngInfo(bytes) ||\n parseJpegInfo(bytes) ||\n parseGifInfo(bytes) ||\n parseWebpInfo(bytes) ||\n parseAvifInfo(bytes) ||\n parseBmpInfo(bytes) ||\n parseIcoInfo(bytes) ||\n parseSvgInfo(bytes) ||\n { format: fallbackFormat, note: \"暂未识别图片头结构\" }\n );\n}\n\nfunction parsePngInfo(bytes: Uint8Array): ImageInfo | null {\n if (bytes.length < 33 || !bytesMatch(bytes, 0, [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a])) {\n return null;\n }\n const view = dataView(bytes);\n const frames = countPngChunks(bytes, \"fcTL\");\n return {\n format: frames > 0 ? \"APNG\" : \"PNG\",\n width: view.getUint32(16, false),\n height: view.getUint32(20, false),\n bitDepth: `${bytes[24]} bit`,\n color: pngColorType(bytes[25]),\n frames: frames > 0 ? frames : undefined\n };\n}\n\nfunction parseJpegInfo(bytes: Uint8Array): ImageInfo | null {\n if (bytes.length < 4 || bytes[0] !== 0xff || bytes[1] !== 0xd8) {\n return null;\n }\n let offset = 2;\n while (offset + 9 < bytes.length) {\n if (bytes[offset] !== 0xff) {\n offset++;\n continue;\n }\n const marker = bytes[offset + 1];\n offset += 2;\n while (bytes[offset] === 0xff) {\n offset++;\n }\n if (marker === 0xd9 || marker === 0xda) {\n break;\n }\n if (offset + 2 > bytes.length) {\n break;\n }\n const length = (bytes[offset] << 8) | bytes[offset + 1];\n if (length < 2 || offset + length > bytes.length) {\n break;\n }\n if ((marker >= 0xc0 && marker <= 0xc3) || (marker >= 0xc5 && marker <= 0xc7) || (marker >= 0xc9 && marker <= 0xcb) || (marker >= 0xcd && marker <= 0xcf)) {\n return {\n format: \"JPEG\",\n width: (bytes[offset + 5] << 8) | bytes[offset + 6],\n height: (bytes[offset + 3] << 8) | bytes[offset + 4],\n bitDepth: `${bytes[offset + 2]} bit`,\n color: `${bytes[offset + 7]} component`\n };\n }\n offset += length;\n }\n return { format: \"JPEG\", note: \"未在头部扫描到 SOF 尺寸段\" };\n}\n\nfunction parseGifInfo(bytes: Uint8Array): ImageInfo | null {\n const header = asciiAt(bytes, 0, 6);\n if (header !== \"GIF87a\" && header !== \"GIF89a\") {\n return null;\n }\n const packed = bytes[10] || 0;\n return {\n format: header,\n width: readUint16Le(bytes, 6),\n height: readUint16Le(bytes, 8),\n bitDepth: `${(packed & 0x07) + 1} bit`,\n color: (packed & 0x80) ? \"Global color table\" : \"No global color table\",\n frames: countGifFrames(bytes)\n };\n}\n\nfunction parseWebpInfo(bytes: Uint8Array): ImageInfo | null {\n if (bytes.length < 16 || asciiAt(bytes, 0, 4) !== \"RIFF\" || asciiAt(bytes, 8, 4) !== \"WEBP\") {\n return null;\n }\n const chunk = asciiAt(bytes, 12, 4);\n if (chunk === \"VP8X\" && bytes.length >= 30) {\n const flags = bytes[20];\n return {\n format: \"WebP\",\n width: 1 + readUint24Le(bytes, 24),\n height: 1 + readUint24Le(bytes, 27),\n frames: (flags & 0x02) !== 0 ? countWebpAnimationFrames(bytes) : undefined,\n color: (flags & 0x10) !== 0 ? \"Alpha\" : undefined\n };\n }\n if (chunk === \"VP8 \" && bytes.length >= 30) {\n const start = 20;\n if (bytes[start + 3] === 0x9d && bytes[start + 4] === 0x01 && bytes[start + 5] === 0x2a) {\n return {\n format: \"WebP\",\n width: readUint16Le(bytes, start + 6) & 0x3fff,\n height: readUint16Le(bytes, start + 8) & 0x3fff\n };\n }\n }\n if (chunk === \"VP8L\" && bytes.length >= 25) {\n const b0 = bytes[21];\n const b1 = bytes[22];\n const b2 = bytes[23];\n const b3 = bytes[24];\n return {\n format: \"WebP\",\n width: 1 + (((b1 & 0x3f) << 8) | b0),\n height: 1 + (((b3 & 0x0f) << 10) | (b2 << 2) | ((b1 & 0xc0) >> 6)),\n color: \"Lossless\"\n };\n }\n return { format: \"WebP\", note: `未知 ${chunk || \"chunk\"} 头` };\n}\n\nfunction parseAvifInfo(bytes: Uint8Array): ImageInfo | null {\n const boxes = collectBmffBoxes(bytes, 0, bytes.length);\n const ftyp = boxes.find((box) => box.type === \"ftyp\");\n if (!ftyp) {\n return null;\n }\n const majorBrand = asciiAt(bytes, ftyp.dataStart, 4);\n const compatibleBrands = asciiAt(bytes, ftyp.dataStart + 8, Math.max(0, ftyp.dataEnd - ftyp.dataStart - 8));\n if (!/\\b(avif|avis|mif1|msf1|heic|heix|hevc|hevx)\\b/.test(`${majorBrand} ${compatibleBrands}`)) {\n return null;\n }\n const ispe = findBmffBox(bytes, boxes, \"ispe\");\n return {\n format: majorBrand === \"avis\" || compatibleBrands.includes(\"avis\") ? \"AVIF Sequence\" : majorBrand.startsWith(\"hei\") ? \"HEIF\" : \"AVIF\",\n width: ispe && ispe.dataStart + 12 <= ispe.dataEnd ? readUint32Be(bytes, ispe.dataStart + 4) : undefined,\n height: ispe && ispe.dataStart + 12 <= ispe.dataEnd ? readUint32Be(bytes, ispe.dataStart + 8) : undefined,\n note: `brand ${majorBrand}${compatibleBrands.trim() ? ` · ${formatBmffBrands(compatibleBrands)}` : \"\"}`\n };\n}\n\ntype BmffBox = {\n type: string;\n start: number;\n dataStart: number;\n dataEnd: number;\n end: number;\n};\n\nfunction collectBmffBoxes(bytes: Uint8Array, start: number, end: number): BmffBox[] {\n const boxes: BmffBox[] = [];\n let offset = start;\n while (offset + 8 <= end && boxes.length < 512) {\n let size = readUint32Be(bytes, offset);\n const type = asciiAt(bytes, offset + 4, 4);\n let headerSize = 8;\n if (!/^[A-Za-z0-9 _-]{4}$/.test(type)) {\n break;\n }\n if (size === 1 && offset + 16 <= end) {\n const high = readUint32Be(bytes, offset + 8);\n const low = readUint32Be(bytes, offset + 12);\n size = high > 0 ? end - offset : low;\n headerSize = 16;\n } else if (size === 0) {\n size = end - offset;\n }\n if (size < headerSize || offset + size > end) {\n break;\n }\n boxes.push({\n type,\n start: offset,\n dataStart: offset + headerSize,\n dataEnd: offset + size,\n end: offset + size\n });\n offset += size;\n }\n return boxes;\n}\n\nfunction findBmffBox(bytes: Uint8Array, boxes: BmffBox[], type: string): BmffBox | undefined {\n for (const box of boxes) {\n if (box.type === type) {\n return box;\n }\n if ([\"meta\", \"iprp\", \"ipco\", \"moov\", \"trak\", \"mdia\", \"minf\", \"stbl\"].includes(box.type)) {\n const childStart = box.type === \"meta\" ? box.dataStart + 4 : box.dataStart;\n const found = findBmffBox(bytes, collectBmffBoxes(bytes, childStart, box.dataEnd), type);\n if (found) {\n return found;\n }\n }\n }\n return undefined;\n}\n\nfunction formatBmffBrands(value: string): string {\n const brands = value.match(/.{1,4}/g)?.map((brand) => brand.trim()).filter(Boolean) || [];\n return brands.slice(0, 6).join(\", \");\n}\n\nfunction parseBmpInfo(bytes: Uint8Array): ImageInfo | null {\n if (bytes.length < 30 || asciiAt(bytes, 0, 2) !== \"BM\") {\n return null;\n }\n const dibSize = readUint32Le(bytes, 14);\n if (dibSize < 12) {\n return { format: \"BMP\", note: \"DIB header 太短\" };\n }\n if (dibSize === 12 && bytes.length >= 26) {\n return {\n format: \"BMP\",\n width: readUint16Le(bytes, 18),\n height: readUint16Le(bytes, 20),\n bitDepth: `${readUint16Le(bytes, 24)} bit`\n };\n }\n return {\n format: \"BMP\",\n width: readInt32Le(bytes, 18),\n height: Math.abs(readInt32Le(bytes, 22)),\n bitDepth: `${readUint16Le(bytes, 28)} bit`\n };\n}\n\nfunction parseIcoInfo(bytes: Uint8Array): ImageInfo | null {\n if (bytes.length < 6 || readUint16Le(bytes, 0) !== 0 || ![1, 2].includes(readUint16Le(bytes, 2))) {\n return null;\n }\n const count = readUint16Le(bytes, 4);\n if (count < 1 || bytes.length < 6 + count * 16) {\n return { format: \"ICO/CUR\", count };\n }\n const width = bytes[6] || 256;\n const height = bytes[7] || 256;\n return {\n format: readUint16Le(bytes, 2) === 1 ? \"ICO\" : \"CUR\",\n width,\n height,\n bitDepth: `${readUint16Le(bytes, 12)} bit`,\n count\n };\n}\n\nfunction parseSvgInfo(bytes: Uint8Array): ImageInfo | null {\n const text = new TextDecoder(\"utf-8\", { fatal: false }).decode(bytes.slice(0, Math.min(bytes.length, 8192)));\n if (!/<svg[\\s>]/i.test(text)) {\n return null;\n }\n const tag = text.match(/<svg\\b[^>]*>/i)?.[0] || \"\";\n const width = numberAttribute(tag, \"width\");\n const height = numberAttribute(tag, \"height\");\n const viewBox = tag.match(/\\bviewBox=[\"']([^\"']+)[\"']/i)?.[1]?.trim();\n const viewBoxParts = viewBox?.split(/[\\s,]+/).map(Number).filter(Number.isFinite);\n return {\n format: \"SVG\",\n width: width || (viewBoxParts?.length === 4 ? viewBoxParts[2] : undefined),\n height: height || (viewBoxParts?.length === 4 ? viewBoxParts[3] : undefined),\n note: viewBox ? `viewBox ${viewBox}` : undefined\n };\n}\n\nfunction countPngChunks(bytes: Uint8Array, chunkType: string): number {\n let offset = 8;\n let count = 0;\n while (offset + 12 <= bytes.length) {\n const length = readUint32Be(bytes, offset);\n const type = asciiAt(bytes, offset + 4, 4);\n if (type === chunkType) {\n count++;\n }\n offset += 12 + length;\n }\n return count;\n}\n\nfunction countGifFrames(bytes: Uint8Array): number {\n let count = 0;\n for (let index = 13; index < bytes.length; index++) {\n if (bytes[index] === 0x2c) {\n count++;\n }\n }\n return count || 1;\n}\n\nfunction countWebpAnimationFrames(bytes: Uint8Array): number {\n let count = 0;\n for (let offset = 12; offset + 8 <= bytes.length; ) {\n const type = asciiAt(bytes, offset, 4);\n const size = readUint32Le(bytes, offset + 4);\n if (type === \"ANMF\") {\n count++;\n }\n offset += 8 + size + (size % 2);\n }\n return count || 1;\n}\n\nfunction pngColorType(value: number): string {\n const colors: Record<number, string> = {\n 0: \"Grayscale\",\n 2: \"Truecolor\",\n 3: \"Indexed color\",\n 4: \"Grayscale + alpha\",\n 6: \"Truecolor + alpha\"\n };\n return colors[value] || `Unknown (${value})`;\n}\n\nfunction numberAttribute(tag: string, name: string): number | undefined {\n const value = tag.match(new RegExp(`\\\\b${name}=[\"']([0-9.]+)`, \"i\"))?.[1];\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nfunction bytesMatch(bytes: Uint8Array, offset: number, expected: number[]): boolean {\n return expected.every((byte, index) => bytes[offset + index] === byte);\n}\n\nfunction dataView(bytes: Uint8Array): DataView {\n return new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n}\n\nfunction asciiAt(bytes: Uint8Array, offset: number, length: number): string {\n if (offset < 0 || offset + length > bytes.length) {\n return \"\";\n }\n return new TextDecoder(\"ascii\").decode(bytes.slice(offset, offset + length));\n}\n\nfunction readUint16Le(bytes: Uint8Array, offset: number): number {\n return dataView(bytes).getUint16(offset, true);\n}\n\nfunction readUint24Le(bytes: Uint8Array, offset: number): number {\n return bytes[offset] | (bytes[offset + 1] << 8) | (bytes[offset + 2] << 16);\n}\n\nfunction readUint32Le(bytes: Uint8Array, offset: number): number {\n return dataView(bytes).getUint32(offset, true);\n}\n\nfunction readUint32Be(bytes: Uint8Array, offset: number): number {\n return dataView(bytes).getUint32(offset, false);\n}\n\nfunction readInt32Le(bytes: Uint8Array, offset: number): number {\n return dataView(bytes).getInt32(offset, true);\n}\n\nfunction objectFit(fit: string): string {\n if (fit === \"cover\") {\n return \"cover\";\n }\n if (fit === \"actual\") {\n return \"none\";\n }\n if (fit === \"scale-down\") {\n return \"scale-down\";\n }\n return \"contain\";\n}\n","import { createObjectUrl, revokeObjectUrl } from \"../dom\";\nimport type { PreviewPlugin } from \"../types\";\n\nconst videoExtensions = new Set([\n \"mp4\",\n \"mpg\",\n \"mpeg\",\n \"mpe\",\n \"mpv\",\n \"webm\",\n \"ogv\",\n \"mov\",\n \"m4v\",\n \"avi\",\n \"mkv\",\n \"flv\",\n \"wmv\",\n \"3gp\",\n \"3g2\",\n \"m2ts\",\n \"m3u8\"\n]);\nconst videoMimeTypes = new Set([\n \"application/vnd.apple.mpegurl\",\n \"application/x-mpegurl\",\n \"application/mpegurl\",\n \"application/dash+xml\"\n]);\nconst hlsMimeTypes = new Set([\"application/vnd.apple.mpegurl\", \"application/x-mpegurl\", \"application/mpegurl\"]);\n\nexport function videoPlugin(): PreviewPlugin {\n return {\n name: \"video\",\n match(file) {\n return file.mimeType.startsWith(\"video/\") || videoMimeTypes.has(file.mimeType) || videoExtensions.has(file.extension);\n },\n async render(ctx) {\n const url = createObjectUrl(ctx.file);\n const isExternal = Boolean(ctx.file.url);\n const mimeType = ctx.file.mimeType.toLowerCase();\n const bytes = await readVideoBytes(ctx.file.blob);\n \n const container = document.createElement(\"div\");\n container.className = \"ofv-video-container\";\n const stage = document.createElement(\"div\");\n stage.className = \"ofv-video-stage\";\n\n const video = document.createElement(\"video\");\n video.className = \"ofv-media\";\n video.controls = true;\n video.playsInline = true;\n video.preload = \"metadata\";\n video.style.objectFit = ctx.options.fit === \"cover\" ? \"cover\" : \"contain\";\n \n const ext = ctx.file.extension.toLowerCase();\n const infoBar = createVideoInfo(parseVideoInfo(bytes, ext, mimeType, ctx.file.name));\n stage.append(video);\n container.append(stage, infoBar);\n ctx.viewport.classList.add(\"ofv-center\");\n ctx.viewport.append(container);\n\n let hlsInstance: any = null;\n let mpegtsPlayer: any = null;\n const isHls = ext === \"m3u8\" || hlsMimeTypes.has(mimeType);\n const isMpegTs = ext === \"m2ts\" || mimeType === \"video/mp2t\";\n const isDash = mimeType === \"application/dash+xml\";\n const isFlv = ext === \"flv\" || mimeType === \"video/x-flv\";\n const formatLabel = (ctx.file.extension || ctx.file.mimeType || \"video\").toUpperCase();\n\n const showTranscodeFallback = () => {\n video.style.display = \"none\";\n video.pause();\n \n // Remove any existing fallback UI first\n const oldFallback = stage.querySelector(\".ofv-fallback\");\n if (oldFallback) {\n oldFallback.remove();\n }\n\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n \n const title = document.createElement(\"strong\");\n title.textContent = `当前浏览器不支持直接播放该视频格式 (${formatLabel})`;\n \n const meta = document.createElement(\"span\");\n meta.textContent = \"建议转换为 MP4 格式播放,或直接下载在本地播放。\";\n \n const download = document.createElement(\"a\");\n download.href = url;\n download.download = ctx.file.name;\n download.textContent = \"下载视频\";\n \n fallback.append(title, meta, download);\n stage.append(fallback);\n };\n\n const onVideoError = () => {\n showTranscodeFallback();\n };\n\n video.addEventListener(\"error\", onVideoError);\n\n try {\n if (isDash) {\n showTranscodeFallback();\n } else if (isHls) {\n const Hls = (await import(\"hls.js\")).default;\n if (Hls.isSupported()) {\n hlsInstance = new Hls();\n hlsInstance.loadSource(url);\n hlsInstance.attachMedia(video);\n hlsInstance.on(Hls.Events.ERROR, (_event: any, data: any) => {\n if (data.fatal) {\n showTranscodeFallback();\n }\n });\n } else if (video.canPlayType(\"application/vnd.apple.mpegurl\")) {\n video.src = url;\n } else {\n showTranscodeFallback();\n }\n } else if (isFlv || isMpegTs) {\n const mpegts = (await import(\"mpegts.js\")).default;\n if (mpegts.isSupported()) {\n mpegtsPlayer = mpegts.createPlayer({\n type: isFlv ? \"flv\" : \"mpegts\",\n url: url\n });\n mpegtsPlayer.attachMediaElement(video);\n mpegtsPlayer.load();\n mpegtsPlayer.on(mpegts.Events.ERROR, () => {\n showTranscodeFallback();\n });\n } else {\n showTranscodeFallback();\n }\n } else {\n // Native playback for mp4, webm, mov, ogg, etc.\n video.src = url;\n }\n } catch (err) {\n showTranscodeFallback();\n }\n\n return {\n resize() {\n video.style.width = \"100%\";\n video.style.height = \"100%\";\n },\n destroy() {\n video.removeEventListener(\"error\", onVideoError);\n video.pause();\n \n if (hlsInstance) {\n hlsInstance.destroy();\n }\n if (mpegtsPlayer) {\n mpegtsPlayer.unload();\n mpegtsPlayer.destroy();\n }\n\n ctx.viewport.classList.remove(\"ofv-center\");\n revokeObjectUrl(url, isExternal);\n container.remove();\n }\n };\n }\n };\n}\n\ntype VideoInfo = {\n format: string;\n codec?: string;\n width?: number;\n height?: number;\n duration?: string;\n bitrate?: string;\n tracks?: number;\n variants?: number;\n segments?: number;\n note?: string;\n};\n\nasync function readVideoBytes(blob?: Blob): Promise<Uint8Array> {\n if (!blob) {\n return new Uint8Array();\n }\n return new Uint8Array(await blob.arrayBuffer().catch(() => new ArrayBuffer(0)));\n}\n\nfunction createVideoInfo(info: VideoInfo): HTMLElement {\n const bar = document.createElement(\"div\");\n bar.className = \"ofv-media-info\";\n appendMediaInfo(bar, \"格式\", info.format);\n if (info.codec) {\n appendMediaInfo(bar, \"编码\", info.codec);\n }\n if (info.width && info.height) {\n appendMediaInfo(bar, \"尺寸\", `${info.width} x ${info.height}px`);\n }\n if (info.duration) {\n appendMediaInfo(bar, \"时长\", info.duration);\n }\n if (info.bitrate) {\n appendMediaInfo(bar, \"码率\", info.bitrate);\n }\n if (info.tracks !== undefined) {\n appendMediaInfo(bar, \"轨道\", String(info.tracks));\n }\n if (info.variants !== undefined) {\n appendMediaInfo(bar, \"变体\", String(info.variants));\n }\n if (info.segments !== undefined) {\n appendMediaInfo(bar, \"片段\", String(info.segments));\n }\n if (info.note) {\n appendMediaInfo(bar, \"说明\", info.note);\n }\n return bar;\n}\n\nfunction appendMediaInfo(parent: HTMLElement, label: string, value: string): void {\n const item = document.createElement(\"span\");\n item.className = \"ofv-media-info-item\";\n const key = document.createElement(\"span\");\n key.textContent = label;\n const content = document.createElement(\"strong\");\n content.textContent = value;\n item.append(key, content);\n parent.append(item);\n}\n\nfunction parseVideoInfo(bytes: Uint8Array, extension: string, mimeType: string, fileName: string): VideoInfo {\n const fallback = (extension || mimeType || fileName.split(\".\").pop() || \"video\").toUpperCase();\n if (bytes.length === 0) {\n return { format: fallback, note: \"无法读取本地头信息\" };\n }\n return parseHlsInfo(bytes) || parseDashInfo(bytes) || parseMp4Info(bytes) || parseAviInfo(bytes) || parseEbmlInfo(bytes) || {\n format: fallback,\n note: \"暂未识别视频头结构\"\n };\n}\n\nfunction parseMp4Info(bytes: Uint8Array): VideoInfo | null {\n if (bytes.length < 12 || asciiAt(bytes, 4, 4) !== \"ftyp\") {\n return null;\n }\n const majorBrand = asciiAt(bytes, 8, 4);\n const info: VideoInfo = { format: [\"qt \"].includes(majorBrand) ? \"MOV\" : \"MP4\", codec: majorBrand };\n const atoms = collectMp4Atoms(bytes, 0, bytes.length);\n const moov = atoms.find((atom) => atom.type === \"moov\");\n if (moov) {\n const children = collectMp4Atoms(bytes, moov.start + moov.headerSize, moov.end);\n const mvhd = children.find((atom) => atom.type === \"mvhd\");\n if (mvhd) {\n const duration = readMp4MvhdDuration(bytes, mvhd.start + mvhd.headerSize);\n if (duration !== undefined) {\n info.duration = formatDuration(duration);\n }\n }\n const tracks = children.filter((atom) => atom.type === \"trak\");\n info.tracks = tracks.length;\n for (const track of tracks) {\n const tkhd = collectMp4Atoms(bytes, track.start + track.headerSize, track.end).find((atom) => atom.type === \"tkhd\");\n if (tkhd) {\n const size = readMp4TkhdSize(bytes, tkhd.start + tkhd.headerSize);\n if (size.width && size.height) {\n info.width = size.width;\n info.height = size.height;\n break;\n }\n }\n }\n }\n return info;\n}\n\ntype Mp4Atom = {\n type: string;\n start: number;\n end: number;\n headerSize: number;\n};\n\nfunction collectMp4Atoms(bytes: Uint8Array, start: number, end: number): Mp4Atom[] {\n const atoms: Mp4Atom[] = [];\n let offset = start;\n while (offset + 8 <= end) {\n let size = readUint32Be(bytes, offset);\n const type = asciiAt(bytes, offset + 4, 4);\n let headerSize = 8;\n if (size === 1 && offset + 16 <= end) {\n size = Number(readUint64Be(bytes, offset + 8));\n headerSize = 16;\n }\n if (size < headerSize || offset + size > end || !/^[\\w ]{4}$/.test(type)) {\n break;\n }\n atoms.push({ type, start: offset, end: offset + size, headerSize });\n offset += size;\n }\n return atoms;\n}\n\nfunction readMp4MvhdDuration(bytes: Uint8Array, offset: number): number | undefined {\n if (offset + 20 > bytes.length) {\n return undefined;\n }\n const version = bytes[offset];\n if (version === 1 && offset + 32 <= bytes.length) {\n const timescale = readUint32Be(bytes, offset + 20);\n const duration = readUint64Be(bytes, offset + 24);\n return timescale ? Number(duration) / timescale : undefined;\n }\n const timescale = readUint32Be(bytes, offset + 12);\n const duration = readUint32Be(bytes, offset + 16);\n return timescale ? duration / timescale : undefined;\n}\n\nfunction readMp4TkhdSize(bytes: Uint8Array, offset: number): { width?: number; height?: number } {\n const version = bytes[offset];\n const sizeOffset = version === 1 ? offset + 84 : offset + 72;\n if (sizeOffset + 8 > bytes.length) {\n return {};\n }\n return {\n width: readUint32Be(bytes, sizeOffset) / 65536,\n height: readUint32Be(bytes, sizeOffset + 4) / 65536\n };\n}\n\nfunction parseAviInfo(bytes: Uint8Array): VideoInfo | null {\n if (bytes.length < 64 || asciiAt(bytes, 0, 4) !== \"RIFF\" || asciiAt(bytes, 8, 4) !== \"AVI \") {\n return null;\n }\n const avihOffset = findAscii(bytes, \"avih\", 12);\n if (avihOffset < 0 || avihOffset + 56 > bytes.length) {\n return { format: \"AVI\", note: \"未找到 avih header\" };\n }\n const microSecPerFrame = readUint32Le(bytes, avihOffset + 8);\n const maxBytesPerSec = readUint32Le(bytes, avihOffset + 16);\n const totalFrames = readUint32Le(bytes, avihOffset + 24);\n const streams = readUint32Le(bytes, avihOffset + 32);\n const width = readUint32Le(bytes, avihOffset + 40);\n const height = readUint32Le(bytes, avihOffset + 44);\n return {\n format: \"AVI\",\n width,\n height,\n tracks: streams,\n bitrate: maxBytesPerSec ? `${Math.round((maxBytesPerSec * 8) / 1000)} kbps` : undefined,\n duration: microSecPerFrame && totalFrames ? formatDuration((microSecPerFrame * totalFrames) / 1_000_000) : undefined\n };\n}\n\nfunction parseEbmlInfo(bytes: Uint8Array): VideoInfo | null {\n if (bytes.length < 8 || bytes[0] !== 0x1a || bytes[1] !== 0x45 || bytes[2] !== 0xdf || bytes[3] !== 0xa3) {\n return null;\n }\n const root = collectEbmlElements(bytes, 0, bytes.length);\n const header = root.find((element) => element.id === 0x1a45dfa3);\n const headerChildren = header ? collectEbmlElements(bytes, header.dataStart, header.dataEnd) : [];\n const docTypeValue = readEbmlString(bytes, headerChildren.find((element) => element.id === 0x4282));\n const segment = root.find((element) => element.id === 0x18538067);\n const segmentChildren = segment ? collectEbmlElements(bytes, segment.dataStart, segment.dataEnd) : [];\n const info = parseEbmlSegmentInfo(bytes, segmentChildren.find((element) => element.id === 0x1549a966));\n const tracks = parseEbmlTracks(bytes, segmentChildren.find((element) => element.id === 0x1654ae6b));\n const docType = docTypeValue?.toLowerCase().includes(\"webm\")\n ? \"WebM\"\n : docTypeValue?.toLowerCase().includes(\"matroska\")\n ? \"Matroska\"\n : \"EBML\";\n return {\n format: docType,\n codec: tracks.codecs.length > 0 ? tracks.codecs.slice(0, 4).join(\", \") : undefined,\n width: tracks.width,\n height: tracks.height,\n duration: info.duration === undefined ? undefined : formatDuration(info.duration),\n tracks: tracks.count || undefined,\n note: docTypeValue ? `EBML DocType ${docTypeValue}` : \"已识别 EBML 容器\"\n };\n}\n\ntype EbmlElement = {\n id: number;\n start: number;\n dataStart: number;\n dataEnd: number;\n end: number;\n};\n\nfunction collectEbmlElements(bytes: Uint8Array, start: number, end: number, limit = 256): EbmlElement[] {\n const elements: EbmlElement[] = [];\n let offset = start;\n while (offset < end && elements.length < limit) {\n const id = readEbmlId(bytes, offset, end);\n if (!id) {\n break;\n }\n const size = readEbmlSize(bytes, id.offset, end);\n if (!size) {\n break;\n }\n const dataStart = size.offset;\n const dataEnd = size.unknown ? end : dataStart + size.value;\n if (dataEnd < dataStart || dataEnd > end) {\n break;\n }\n elements.push({\n id: id.value,\n start: offset,\n dataStart,\n dataEnd,\n end: dataEnd\n });\n offset = dataEnd;\n }\n return elements;\n}\n\nfunction readEbmlId(bytes: Uint8Array, offset: number, end: number): { value: number; offset: number } | undefined {\n const length = ebmlVintLength(bytes[offset]);\n if (!length || length > 4 || offset + length > end) {\n return undefined;\n }\n let value = 0;\n for (let index = 0; index < length; index++) {\n value = value * 256 + bytes[offset + index];\n }\n return { value, offset: offset + length };\n}\n\nfunction readEbmlSize(bytes: Uint8Array, offset: number, end: number): { value: number; offset: number; unknown: boolean } | undefined {\n const length = ebmlVintLength(bytes[offset]);\n if (!length || length > 8 || offset + length > end) {\n return undefined;\n }\n const firstMask = 0xff >> length;\n let value = bytes[offset] & firstMask;\n let max = firstMask;\n for (let index = 1; index < length; index++) {\n value = value * 256 + bytes[offset + index];\n max = max * 256 + 0xff;\n }\n return { value, offset: offset + length, unknown: value === max };\n}\n\nfunction ebmlVintLength(firstByte: number | undefined): number {\n if (!firstByte) {\n return 0;\n }\n for (let length = 1; length <= 8; length++) {\n if (firstByte & (0x80 >> (length - 1))) {\n return length;\n }\n }\n return 0;\n}\n\nfunction parseEbmlSegmentInfo(bytes: Uint8Array, element?: EbmlElement): { duration?: number } {\n if (!element) {\n return {};\n }\n const children = collectEbmlElements(bytes, element.dataStart, element.dataEnd);\n const timecodeScale = readEbmlUInt(bytes, children.find((child) => child.id === 0x2ad7b1)) || 1_000_000;\n const duration = readEbmlFloat(bytes, children.find((child) => child.id === 0x4489));\n return {\n duration: duration === undefined ? undefined : (duration * timecodeScale) / 1_000_000_000\n };\n}\n\nfunction parseEbmlTracks(bytes: Uint8Array, element?: EbmlElement): { count: number; codecs: string[]; width?: number; height?: number } {\n if (!element) {\n return { count: 0, codecs: [] };\n }\n const trackEntries = collectEbmlElements(bytes, element.dataStart, element.dataEnd).filter((child) => child.id === 0xae);\n const codecs: string[] = [];\n let width: number | undefined;\n let height: number | undefined;\n for (const track of trackEntries) {\n const children = collectEbmlElements(bytes, track.dataStart, track.dataEnd);\n const codec = readEbmlString(bytes, children.find((child) => child.id === 0x86));\n if (codec && !codecs.includes(codec)) {\n codecs.push(codec);\n }\n const type = readEbmlUInt(bytes, children.find((child) => child.id === 0x83));\n const video = children.find((child) => child.id === 0xe0);\n if (type === 1 && video) {\n const videoChildren = collectEbmlElements(bytes, video.dataStart, video.dataEnd);\n width = readEbmlUInt(bytes, videoChildren.find((child) => child.id === 0xb0)) || width;\n height = readEbmlUInt(bytes, videoChildren.find((child) => child.id === 0xba)) || height;\n }\n }\n return { count: trackEntries.length, codecs, width, height };\n}\n\nfunction readEbmlString(bytes: Uint8Array, element?: EbmlElement): string | undefined {\n if (!element || element.dataEnd <= element.dataStart || element.dataEnd - element.dataStart > 4096) {\n return undefined;\n }\n return new TextDecoder(\"utf-8\", { fatal: false }).decode(bytes.slice(element.dataStart, element.dataEnd)).replace(/\\0+$/g, \"\").trim();\n}\n\nfunction readEbmlUInt(bytes: Uint8Array, element?: EbmlElement): number | undefined {\n if (!element || element.dataEnd <= element.dataStart || element.dataEnd - element.dataStart > 6) {\n return undefined;\n }\n let value = 0;\n for (let offset = element.dataStart; offset < element.dataEnd; offset++) {\n value = value * 256 + bytes[offset];\n }\n return value;\n}\n\nfunction readEbmlFloat(bytes: Uint8Array, element?: EbmlElement): number | undefined {\n if (!element) {\n return undefined;\n }\n const data = view(bytes);\n if (element.dataEnd - element.dataStart === 4) {\n return data.getFloat32(element.dataStart, false);\n }\n if (element.dataEnd - element.dataStart === 8) {\n return data.getFloat64(element.dataStart, false);\n }\n return undefined;\n}\n\nfunction parseHlsInfo(bytes: Uint8Array): VideoInfo | null {\n const text = decodeTextHead(bytes);\n if (!text.startsWith(\"#EXTM3U\")) {\n return null;\n }\n const segments = countMatches(text, /^#EXTINF:/gm);\n const variants = countMatches(text, /^#EXT-X-STREAM-INF:/gm);\n const durations = [...text.matchAll(/^#EXTINF:([0-9.]+)/gm)].map((match) => Number(match[1])).filter(Number.isFinite);\n const bandwidth = text.match(/BANDWIDTH=(\\d+)/i)?.[1];\n return {\n format: \"HLS\",\n variants,\n segments,\n duration: durations.length > 0 ? formatDuration(durations.reduce((sum, value) => sum + value, 0)) : undefined,\n bitrate: bandwidth ? `${Math.round(Number(bandwidth) / 1000)} kbps` : undefined\n };\n}\n\nfunction parseDashInfo(bytes: Uint8Array): VideoInfo | null {\n const text = decodeTextHead(bytes);\n if (!/<MPD[\\s>]/i.test(text)) {\n return null;\n }\n return {\n format: \"DASH\",\n duration: isoDurationToClock(text.match(/mediaPresentationDuration=[\"']([^\"']+)[\"']/i)?.[1]),\n variants: countMatches(text, /<Representation\\b/gi),\n segments: countMatches(text, /<SegmentURL\\b|<S\\b/gi)\n };\n}\n\nfunction decodeTextHead(bytes: Uint8Array): string {\n return new TextDecoder(\"utf-8\", { fatal: false }).decode(bytes.slice(0, Math.min(bytes.length, 65536))).trim();\n}\n\nfunction countMatches(value: string, pattern: RegExp): number {\n return [...value.matchAll(pattern)].length;\n}\n\nfunction isoDurationToClock(value?: string): string | undefined {\n if (!value) {\n return undefined;\n }\n const match = value.match(/^PT(?:(\\d+(?:\\.\\d+)?)H)?(?:(\\d+(?:\\.\\d+)?)M)?(?:(\\d+(?:\\.\\d+)?)S)?$/i);\n if (!match) {\n return value;\n }\n const seconds = Number(match[1] || 0) * 3600 + Number(match[2] || 0) * 60 + Number(match[3] || 0);\n return formatDuration(seconds);\n}\n\nfunction formatDuration(seconds: number): string {\n if (!Number.isFinite(seconds) || seconds <= 0) {\n return \"\";\n }\n const total = Math.round(seconds);\n const hours = Math.floor(total / 3600);\n const minutes = Math.floor((total % 3600) / 60);\n const rest = total % 60;\n return hours > 0 ? `${hours}:${String(minutes).padStart(2, \"0\")}:${String(rest).padStart(2, \"0\")}` : `${minutes}:${String(rest).padStart(2, \"0\")}`;\n}\n\nfunction asciiAt(bytes: Uint8Array, offset: number, length: number): string {\n if (offset < 0 || offset + length > bytes.length) {\n return \"\";\n }\n return new TextDecoder(\"latin1\").decode(bytes.slice(offset, offset + length));\n}\n\nfunction findAscii(bytes: Uint8Array, value: string, start = 0): number {\n const encoded = new TextEncoder().encode(value);\n for (let offset = start; offset + encoded.length <= bytes.length; offset++) {\n if (encoded.every((byte, index) => bytes[offset + index] === byte)) {\n return offset;\n }\n }\n return -1;\n}\n\nfunction view(bytes: Uint8Array): DataView {\n return new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n}\n\nfunction readUint32Le(bytes: Uint8Array, offset: number): number {\n return view(bytes).getUint32(offset, true);\n}\n\nfunction readUint32Be(bytes: Uint8Array, offset: number): number {\n return view(bytes).getUint32(offset, false);\n}\n\nfunction readUint64Be(bytes: Uint8Array, offset: number): bigint {\n return (BigInt(readUint32Be(bytes, offset)) << 32n) | BigInt(readUint32Be(bytes, offset + 4));\n}\n","import { createObjectUrl, revokeObjectUrl } from \"../dom\";\nimport type { PreviewPlugin } from \"../types\";\n\nconst audioExtensions = new Set([\n \"mp3\",\n \"wav\",\n \"aif\",\n \"aiff\",\n \"aifc\",\n \"ogg\",\n \"oga\",\n \"aac\",\n \"m4a\",\n \"flac\",\n \"opus\",\n \"weba\",\n \"amr\",\n \"mid\",\n \"midi\",\n \"caf\",\n \"au\",\n \"snd\",\n \"wma\"\n]);\n\nexport function audioPlugin(): PreviewPlugin {\n return {\n name: \"audio\",\n match(file) {\n return file.mimeType.startsWith(\"audio/\") || audioExtensions.has(file.extension);\n },\n async render(ctx) {\n const url = createObjectUrl(ctx.file);\n const isExternal = Boolean(ctx.file.url);\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-audio\";\n const bytes = await readAudioBytes(ctx.file.blob);\n\n const title = document.createElement(\"div\");\n title.className = \"ofv-audio-title\";\n title.textContent = ctx.file.name;\n\n const audio = document.createElement(\"audio\");\n audio.src = url;\n audio.controls = true;\n audio.preload = \"metadata\";\n\n wrapper.append(title, audio, createAudioInfo(parseAudioInfo(bytes, ctx.file.extension, ctx.file.mimeType)));\n ctx.viewport.classList.add(\"ofv-center\");\n ctx.viewport.append(wrapper);\n\n const formatLabel = (ctx.file.extension || ctx.file.mimeType || \"audio\").toUpperCase();\n const showPlaybackFallback = () => {\n audio.pause();\n audio.remove();\n\n if (wrapper.querySelector(\".ofv-fallback\")) {\n return;\n }\n\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n\n const fallbackTitle = document.createElement(\"strong\");\n fallbackTitle.textContent = `当前浏览器不支持直接播放该音频格式 (${formatLabel})`;\n\n const meta = document.createElement(\"span\");\n meta.textContent = \"建议转换为 MP3/AAC/OGG 等浏览器兼容格式,或直接下载在本地播放。\";\n\n const download = document.createElement(\"a\");\n download.href = url;\n download.download = ctx.file.name;\n download.textContent = \"下载音频\";\n\n fallback.append(fallbackTitle, meta, download);\n wrapper.append(fallback);\n };\n\n audio.addEventListener(\"error\", showPlaybackFallback);\n\n return {\n destroy() {\n audio.removeEventListener(\"error\", showPlaybackFallback);\n audio.pause();\n ctx.viewport.classList.remove(\"ofv-center\");\n revokeObjectUrl(url, isExternal);\n }\n };\n }\n };\n}\n\ntype AudioInfo = {\n format: string;\n codec?: string;\n sampleRate?: number;\n channels?: number;\n bitDepth?: number;\n bitrate?: string;\n duration?: string;\n tags?: string;\n note?: string;\n};\n\nasync function readAudioBytes(blob?: Blob): Promise<Uint8Array> {\n if (!blob) {\n return new Uint8Array();\n }\n return new Uint8Array(await blob.arrayBuffer().catch(() => new ArrayBuffer(0)));\n}\n\nfunction createAudioInfo(info: AudioInfo): HTMLElement {\n const bar = document.createElement(\"div\");\n bar.className = \"ofv-media-info\";\n appendMediaInfo(bar, \"格式\", info.format);\n if (info.codec) {\n appendMediaInfo(bar, \"编码\", info.codec);\n }\n if (info.sampleRate) {\n appendMediaInfo(bar, \"采样率\", `${info.sampleRate} Hz`);\n }\n if (info.channels) {\n appendMediaInfo(bar, \"声道\", String(info.channels));\n }\n if (info.bitDepth) {\n appendMediaInfo(bar, \"位深\", `${info.bitDepth} bit`);\n }\n if (info.bitrate) {\n appendMediaInfo(bar, \"码率\", info.bitrate);\n }\n if (info.duration) {\n appendMediaInfo(bar, \"时长\", info.duration);\n }\n if (info.tags) {\n appendMediaInfo(bar, \"标签\", info.tags);\n }\n if (info.note) {\n appendMediaInfo(bar, \"说明\", info.note);\n }\n return bar;\n}\n\nfunction appendMediaInfo(parent: HTMLElement, label: string, value: string): void {\n const item = document.createElement(\"span\");\n item.className = \"ofv-media-info-item\";\n const key = document.createElement(\"span\");\n key.textContent = label;\n const content = document.createElement(\"strong\");\n content.textContent = value;\n item.append(key, content);\n parent.append(item);\n}\n\nfunction parseAudioInfo(bytes: Uint8Array, extension: string, mimeType: string): AudioInfo {\n const fallback = (extension || mimeType || \"audio\").toUpperCase();\n if (bytes.length === 0) {\n return { format: fallback, note: \"无法读取本地头信息\" };\n }\n return parseWaveInfo(bytes) || parseFlacInfo(bytes) || parseOggInfo(bytes) || parseAiffInfo(bytes) || parseAuInfo(bytes) || parseMidiInfo(bytes) || parseId3Mp3Info(bytes) || {\n format: fallback,\n note: \"暂未识别音频头结构\"\n };\n}\n\nfunction parseWaveInfo(bytes: Uint8Array): AudioInfo | null {\n if (bytes.length < 44 || asciiAt(bytes, 0, 4) !== \"RIFF\" || asciiAt(bytes, 8, 4) !== \"WAVE\") {\n return null;\n }\n let offset = 12;\n let channels = 0;\n let sampleRate = 0;\n let bitDepth = 0;\n let byteRate = 0;\n let dataBytes = 0;\n while (offset + 8 <= bytes.length) {\n const chunk = asciiAt(bytes, offset, 4);\n const size = readUint32Le(bytes, offset + 4);\n const dataOffset = offset + 8;\n if (chunk === \"fmt \" && dataOffset + 16 <= bytes.length) {\n channels = readUint16Le(bytes, dataOffset + 2);\n sampleRate = readUint32Le(bytes, dataOffset + 4);\n byteRate = readUint32Le(bytes, dataOffset + 8);\n bitDepth = readUint16Le(bytes, dataOffset + 14);\n }\n if (chunk === \"data\") {\n dataBytes = size;\n }\n offset += 8 + size + (size % 2);\n }\n return {\n format: \"WAV\",\n codec: \"PCM\",\n sampleRate,\n channels,\n bitDepth,\n bitrate: byteRate ? `${Math.round((byteRate * 8) / 1000)} kbps` : undefined,\n duration: byteRate && dataBytes ? formatDuration(dataBytes / byteRate) : undefined\n };\n}\n\nfunction parseFlacInfo(bytes: Uint8Array): AudioInfo | null {\n if (bytes.length < 42 || asciiAt(bytes, 0, 4) !== \"fLaC\") {\n return null;\n }\n let offset = 4;\n while (offset + 4 <= bytes.length) {\n const type = bytes[offset] & 0x7f;\n const length = (bytes[offset + 1] << 16) | (bytes[offset + 2] << 8) | bytes[offset + 3];\n const dataOffset = offset + 4;\n if (type === 0 && dataOffset + 34 <= bytes.length) {\n const b10 = bytes[dataOffset + 10];\n const b11 = bytes[dataOffset + 11];\n const b12 = bytes[dataOffset + 12];\n const b13 = bytes[dataOffset + 13];\n const b14 = bytes[dataOffset + 14];\n const b15 = bytes[dataOffset + 15];\n const b16 = bytes[dataOffset + 16];\n const b17 = bytes[dataOffset + 17];\n const sampleRate = (b10 << 12) | (b11 << 4) | ((b12 & 0xf0) >> 4);\n const channels = ((b12 & 0x0e) >> 1) + 1;\n const bitDepth = (((b12 & 0x01) << 4) | ((b13 & 0xf0) >> 4)) + 1;\n const totalSamples = ((BigInt(b13 & 0x0f) << 32n) | (BigInt(b14) << 24n) | (BigInt(b15) << 16n) | (BigInt(b16) << 8n) | BigInt(b17));\n return {\n format: \"FLAC\",\n codec: \"FLAC\",\n sampleRate,\n channels,\n bitDepth,\n duration: sampleRate && totalSamples > 0n ? formatDuration(Number(totalSamples) / sampleRate) : undefined\n };\n }\n offset += 4 + length;\n }\n return { format: \"FLAC\", codec: \"FLAC\", note: \"未找到 STREAMINFO metadata block\" };\n}\n\nfunction parseId3Mp3Info(bytes: Uint8Array): AudioInfo | null {\n let offset = 0;\n let tags: string | undefined;\n if (bytes.length >= 10 && asciiAt(bytes, 0, 3) === \"ID3\") {\n tags = `ID3v2.${bytes[3]}.${bytes[4]}`;\n offset = 10 + readSynchsafe(bytes, 6);\n }\n for (let index = offset; index + 3 < Math.min(bytes.length, offset + 4096); index++) {\n if (bytes[index] === 0xff && (bytes[index + 1] & 0xe0) === 0xe0) {\n const versionBits = (bytes[index + 1] >> 3) & 0x03;\n const layerBits = (bytes[index + 1] >> 1) & 0x03;\n const bitrateIndex = (bytes[index + 2] >> 4) & 0x0f;\n const sampleIndex = (bytes[index + 2] >> 2) & 0x03;\n const channelMode = (bytes[index + 3] >> 6) & 0x03;\n return {\n format: \"MP3\",\n codec: `${mpegVersion(versionBits)} Layer ${mpegLayer(layerBits)}`,\n sampleRate: mp3SampleRate(versionBits, sampleIndex),\n channels: channelMode === 3 ? 1 : 2,\n bitrate: mp3Bitrate(versionBits, layerBits, bitrateIndex),\n tags\n };\n }\n }\n return tags ? { format: \"MP3\", tags, note: \"未在头部扫描到 MPEG frame\" } : null;\n}\n\nfunction parseOggInfo(bytes: Uint8Array): AudioInfo | null {\n if (bytes.length < 36 || asciiAt(bytes, 0, 4) !== \"OggS\") {\n return null;\n }\n const pages = collectOggPages(bytes);\n const firstPacket = pages[0]?.packets[0];\n const lastGranule = [...pages].reverse().find((page) => page.granule > 0n)?.granule;\n if (firstPacket && asciiAt(firstPacket, 0, 8) === \"OpusHead\") {\n const preSkip = firstPacket.length >= 12 ? readUint16Le(firstPacket, 10) : 0;\n const sampleRate = firstPacket.length >= 16 ? readUint32Le(firstPacket, 12) : 48000;\n const totalSamples = lastGranule === undefined ? undefined : lastGranule - BigInt(preSkip);\n return {\n format: \"Ogg\",\n codec: \"Opus\",\n channels: firstPacket[9],\n sampleRate,\n duration: totalSamples !== undefined && totalSamples > 0n ? formatDuration(Number(totalSamples) / 48000) : undefined,\n note: `${pages.length} 页`\n };\n }\n if (firstPacket && firstPacket[0] === 0x01 && asciiAt(firstPacket, 1, 6) === \"vorbis\") {\n const sampleRate = firstPacket.length >= 16 ? readUint32Le(firstPacket, 12) : undefined;\n return {\n format: \"Ogg\",\n codec: \"Vorbis\",\n channels: firstPacket[11],\n sampleRate,\n bitrate: firstPacket.length >= 28 ? oggVorbisBitrate(firstPacket) : undefined,\n duration: sampleRate && lastGranule !== undefined && lastGranule > 0n ? formatDuration(Number(lastGranule) / sampleRate) : undefined,\n note: `${pages.length} 页`\n };\n }\n return { format: \"Ogg\", note: pages.length > 0 ? `未识别 Ogg codec header,${pages.length} 页` : \"未识别 Ogg codec header\" };\n}\n\ntype OggPage = {\n granule: bigint;\n packets: Uint8Array[];\n};\n\nfunction collectOggPages(bytes: Uint8Array): OggPage[] {\n const pages: OggPage[] = [];\n let offset = 0;\n let continuedPacket: number[] = [];\n while (offset + 27 <= bytes.length && asciiAt(bytes, offset, 4) === \"OggS\") {\n const segmentCount = bytes[offset + 26];\n const segmentTableOffset = offset + 27;\n const dataOffset = segmentTableOffset + segmentCount;\n if (dataOffset > bytes.length) {\n break;\n }\n const sizes = Array.from(bytes.slice(segmentTableOffset, dataOffset));\n const payloadLength = sizes.reduce((sum, value) => sum + value, 0);\n const payloadEnd = dataOffset + payloadLength;\n if (payloadEnd > bytes.length) {\n break;\n }\n const pagePackets: Uint8Array[] = [];\n let packetOffset = dataOffset;\n for (const size of sizes) {\n continuedPacket.push(...bytes.slice(packetOffset, packetOffset + size));\n packetOffset += size;\n if (size < 255) {\n pagePackets.push(new Uint8Array(continuedPacket));\n continuedPacket = [];\n }\n }\n pages.push({\n granule: readUint64Le(bytes, offset + 6),\n packets: pagePackets\n });\n offset = payloadEnd;\n }\n return pages;\n}\n\nfunction oggVorbisBitrate(packet: Uint8Array): string | undefined {\n const nominal = readUint32Le(packet, 20);\n if (nominal > 0) {\n return `${Math.round(nominal / 1000)} kbps`;\n }\n const upper = readUint32Le(packet, 16);\n const lower = readUint32Le(packet, 24);\n if (upper > 0 && lower > 0) {\n return `${Math.round(((upper + lower) / 2) / 1000)} kbps`;\n }\n return undefined;\n}\n\nfunction parseAiffInfo(bytes: Uint8Array): AudioInfo | null {\n if (bytes.length < 12 || asciiAt(bytes, 0, 4) !== \"FORM\" || ![\"AIFF\", \"AIFC\"].includes(asciiAt(bytes, 8, 4))) {\n return null;\n }\n const format = asciiAt(bytes, 8, 4);\n let offset = 12;\n while (offset + 26 <= bytes.length) {\n const chunk = asciiAt(bytes, offset, 4);\n const size = readUint32Be(bytes, offset + 4);\n if (chunk === \"COMM\") {\n return {\n format,\n channels: readUint16Be(bytes, offset + 8),\n bitDepth: readUint16Be(bytes, offset + 14),\n sampleRate: Math.round(readAiffExtended(bytes, offset + 16))\n };\n }\n offset += 8 + size + (size % 2);\n }\n return { format, note: \"未找到 COMM chunk\" };\n}\n\nfunction parseAuInfo(bytes: Uint8Array): AudioInfo | null {\n if (bytes.length < 24 || asciiAt(bytes, 0, 4) !== \".snd\") {\n return null;\n }\n const dataOffset = readUint32Be(bytes, 4);\n const dataSize = readUint32Be(bytes, 8);\n const encoding = readUint32Be(bytes, 12);\n const sampleRate = readUint32Be(bytes, 16);\n const channels = readUint32Be(bytes, 20);\n const bitDepth = auBitDepth(encoding);\n const bytesPerSample = bitDepth ? bitDepth / 8 : 0;\n const resolvedDataSize = dataSize === 0xffffffff ? Math.max(0, bytes.length - dataOffset) : dataSize;\n return {\n format: \"AU/SND\",\n codec: auEncodingName(encoding),\n sampleRate,\n channels,\n bitDepth,\n duration: sampleRate && channels && bytesPerSample && resolvedDataSize ? formatDuration(resolvedDataSize / (sampleRate * channels * bytesPerSample)) : undefined,\n note: `data @ ${dataOffset} B`\n };\n}\n\nfunction auEncodingName(value: number): string {\n const names: Record<number, string> = {\n 1: \"8-bit μ-law\",\n 2: \"8-bit linear PCM\",\n 3: \"16-bit linear PCM\",\n 4: \"24-bit linear PCM\",\n 5: \"32-bit linear PCM\",\n 6: \"32-bit float\",\n 7: \"64-bit float\",\n 23: \"G.721 ADPCM\",\n 24: \"G.722 ADPCM\",\n 25: \"G.723 3-bit ADPCM\",\n 26: \"G.723 5-bit ADPCM\",\n 27: \"8-bit A-law\"\n };\n return names[value] || `encoding ${value}`;\n}\n\nfunction auBitDepth(value: number): number | undefined {\n const depths: Record<number, number> = {\n 1: 8,\n 2: 8,\n 3: 16,\n 4: 24,\n 5: 32,\n 6: 32,\n 7: 64,\n 27: 8\n };\n return depths[value];\n}\n\nfunction parseMidiInfo(bytes: Uint8Array): AudioInfo | null {\n if (bytes.length < 14 || asciiAt(bytes, 0, 4) !== \"MThd\") {\n return null;\n }\n return {\n format: \"MIDI\",\n codec: `SMF ${readUint16Be(bytes, 8)}`,\n channels: readUint16Be(bytes, 10),\n note: `${readUint16Be(bytes, 12)} ticks/quarter`\n };\n}\n\nfunction formatDuration(seconds: number): string {\n if (!Number.isFinite(seconds) || seconds <= 0) {\n return \"\";\n }\n const total = Math.round(seconds);\n const minutes = Math.floor(total / 60);\n const rest = total % 60;\n return `${minutes}:${String(rest).padStart(2, \"0\")}`;\n}\n\nfunction asciiAt(bytes: Uint8Array, offset: number, length: number): string {\n if (offset < 0 || offset + length > bytes.length) {\n return \"\";\n }\n return new TextDecoder(\"ascii\").decode(bytes.slice(offset, offset + length));\n}\n\nfunction view(bytes: Uint8Array): DataView {\n return new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n}\n\nfunction readUint16Le(bytes: Uint8Array, offset: number): number {\n return view(bytes).getUint16(offset, true);\n}\n\nfunction readUint16Be(bytes: Uint8Array, offset: number): number {\n return view(bytes).getUint16(offset, false);\n}\n\nfunction readUint32Le(bytes: Uint8Array, offset: number): number {\n return view(bytes).getUint32(offset, true);\n}\n\nfunction readUint32Be(bytes: Uint8Array, offset: number): number {\n return view(bytes).getUint32(offset, false);\n}\n\nfunction readUint64Le(bytes: Uint8Array, offset: number): bigint {\n return (BigInt(readUint32Le(bytes, offset + 4)) << 32n) | BigInt(readUint32Le(bytes, offset));\n}\n\nfunction readSynchsafe(bytes: Uint8Array, offset: number): number {\n return ((bytes[offset] & 0x7f) << 21) | ((bytes[offset + 1] & 0x7f) << 14) | ((bytes[offset + 2] & 0x7f) << 7) | (bytes[offset + 3] & 0x7f);\n}\n\nfunction mpegVersion(bits: number): string {\n return bits === 3 ? \"MPEG-1\" : bits === 2 ? \"MPEG-2\" : bits === 0 ? \"MPEG-2.5\" : \"MPEG\";\n}\n\nfunction mpegLayer(bits: number): string {\n return bits === 3 ? \"I\" : bits === 2 ? \"II\" : bits === 1 ? \"III\" : \"?\";\n}\n\nfunction mp3SampleRate(versionBits: number, index: number): number | undefined {\n const rates = versionBits === 3 ? [44100, 48000, 32000] : versionBits === 2 ? [22050, 24000, 16000] : [11025, 12000, 8000];\n return rates[index];\n}\n\nfunction mp3Bitrate(versionBits: number, layerBits: number, index: number): string | undefined {\n const mpeg1Layer3 = [0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320];\n const mpeg2Layer3 = [0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160];\n if (index <= 0 || index >= 15 || layerBits !== 1) {\n return undefined;\n }\n return `${(versionBits === 3 ? mpeg1Layer3 : mpeg2Layer3)[index]} kbps`;\n}\n\nfunction readAiffExtended(bytes: Uint8Array, offset: number): number {\n const exponent = readUint16Be(bytes, offset) & 0x7fff;\n let mantissa = 0;\n for (let index = 0; index < 8; index++) {\n mantissa = mantissa * 256 + bytes[offset + 2 + index];\n }\n return mantissa * Math.pow(2, exponent - 16383 - 63);\n}\n","import type { PreviewFile } from \"../types\";\n\nexport async function readArrayBuffer(file: PreviewFile): Promise<ArrayBuffer> {\n if (file.source instanceof ArrayBuffer) {\n return file.source;\n }\n if (file.blob) {\n return file.blob.arrayBuffer();\n }\n if (typeof file.source === \"string\") {\n const response = await fetch(file.source);\n if (!response.ok) {\n throw new Error(`Failed to fetch file: ${response.status}`);\n }\n return response.arrayBuffer();\n }\n throw new Error(\"Unsupported file source.\");\n}\n\nexport async function readTextFile(file: PreviewFile): Promise<string> {\n const decode = (buffer: ArrayBuffer) => decodeTextBuffer(buffer);\n if (typeof file.source === \"string\") {\n const response = await fetch(file.source);\n if (!response.ok) {\n throw new Error(`Failed to fetch text file: ${response.status}`);\n }\n return decode(await response.arrayBuffer());\n }\n if (file.blob) {\n return decode(await file.blob.arrayBuffer());\n }\n if (file.source instanceof ArrayBuffer) {\n return decode(file.source);\n }\n return String(file.source);\n}\n\nexport function createPanel(className = \"\"): HTMLElement {\n const panel = document.createElement(\"div\");\n panel.className = `ofv-panel ${className}`.trim();\n return panel;\n}\n\nexport function createSection(title: string): HTMLElement {\n const section = document.createElement(\"section\");\n section.className = \"ofv-section\";\n const heading = document.createElement(\"h3\");\n heading.textContent = title;\n section.append(heading);\n return section;\n}\n\nexport function appendMeta(parent: HTMLElement, label: string, value: string | number): void {\n const row = document.createElement(\"div\");\n row.className = \"ofv-meta-row\";\n const key = document.createElement(\"span\");\n key.textContent = label;\n const content = document.createElement(\"strong\");\n content.textContent = String(value);\n row.append(key, content);\n parent.append(row);\n}\n\nexport function escapeHtml(value: string): string {\n return value\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll('\"', \"&quot;\")\n .replaceAll(\"'\", \"&#039;\");\n}\n\nexport function bytesToText(bytes: Uint8Array): string {\n return decodeTextBytes(bytes);\n}\n\nexport function decodeTextBuffer(buffer: ArrayBuffer): string {\n return decodeTextBytes(new Uint8Array(buffer));\n}\n\nexport function decodeTextBytes(bytes: Uint8Array): string {\n if (bytes.length >= 3 && bytes[0] === 0xef && bytes[1] === 0xbb && bytes[2] === 0xbf) {\n return new TextDecoder(\"utf-8\").decode(bytes.subarray(3));\n }\n if (bytes.length >= 2) {\n if (bytes[0] === 0xff && bytes[1] === 0xfe) {\n return new TextDecoder(\"utf-16le\").decode(bytes.subarray(2));\n }\n if (bytes[0] === 0xfe && bytes[1] === 0xff) {\n return new TextDecoder(\"utf-16be\").decode(bytes.subarray(2));\n }\n }\n try {\n return new TextDecoder(\"utf-8\", { fatal: true }).decode(bytes);\n } catch {\n return decodeWithFallback(bytes, \"gb18030\") || decodeWithFallback(bytes, \"gbk\") || new TextDecoder(\"utf-8\").decode(bytes);\n }\n}\n\nfunction decodeWithFallback(bytes: Uint8Array, encoding: string): string | undefined {\n try {\n return new TextDecoder(encoding).decode(bytes);\n } catch {\n return undefined;\n }\n}\n\nexport function resolveFormat(\n file: Pick<PreviewFile, \"extension\" | \"mimeType\">,\n mimeMap: Record<string, string>\n): string {\n return file.extension || mimeMap[file.mimeType] || \"\";\n}\n","/// <reference path=\"../shims-text.d.ts\" />\nimport { isTextLike } from \"../detect\";\nimport type { PreviewPlugin } from \"../types\";\nimport { decodeTextBuffer } from \"./utils\";\n\nconst langMap: Record<string, string> = {\n js: \"javascript\",\n mjs: \"javascript\",\n cjs: \"javascript\",\n ts: \"typescript\",\n tsx: \"tsx\",\n jsx: \"jsx\",\n html: \"markup\",\n htm: \"markup\",\n vue: \"markup\",\n xml: \"markup\",\n css: \"css\",\n scss: \"scss\",\n less: \"less\",\n json: \"json\",\n jsonc: \"json\",\n json5: \"json5\",\n ipynb: \"json\",\n jsonl: \"json\",\n ndjson: \"json\",\n toml: \"toml\",\n ini: \"ini\",\n properties: \"properties\",\n proto: \"protobuf\",\n tf: \"hcl\",\n tfvars: \"hcl\",\n hcl: \"hcl\",\n tex: \"latex\",\n latex: \"latex\",\n bib: \"latex\",\n gv: \"dot\",\n http: \"http\",\n py: \"python\",\n java: \"java\",\n cpp: \"cpp\",\n c: \"c\",\n h: \"c\",\n hpp: \"cpp\",\n cs: \"csharp\",\n go: \"go\",\n rs: \"rust\",\n rb: \"ruby\",\n swift: \"swift\",\n kt: \"kotlin\",\n kts: \"kotlin\",\n scala: \"scala\",\n lua: \"lua\",\n r: \"r\",\n dart: \"dart\",\n svelte: \"markup\",\n astro: \"markup\",\n elm: \"elm\",\n ex: \"elixir\",\n exs: \"elixir\",\n clj: \"clojure\",\n cljs: \"clojure\",\n erl: \"erlang\",\n hrl: \"erlang\",\n fs: \"fsharp\",\n fsx: \"fsharp\",\n hs: \"haskell\",\n lhs: \"haskell\",\n sql: \"sql\",\n sh: \"bash\",\n bash: \"bash\",\n zsh: \"bash\",\n fish: \"bash\",\n ps1: \"powershell\",\n bat: \"batch\",\n cmd: \"batch\",\n dockerfile: \"docker\",\n nginxconf: \"nginx\",\n gradle: \"groovy\",\n graphql: \"graphql\",\n gql: \"graphql\",\n yaml: \"yaml\",\n yml: \"yaml\",\n diff: \"diff\",\n patch: \"diff\",\n php: \"php\",\n md: \"markdown\",\n markdown: \"markdown\"\n};\nconst filenameLangMap: Record<string, string> = {\n dockerfile: \"docker\",\n makefile: \"makefile\",\n gemfile: \"ruby\",\n rakefile: \"ruby\",\n procfile: \"bash\",\n jenkinsfile: \"groovy\",\n vagrantfile: \"ruby\",\n brewfile: \"ruby\",\n podfile: \"ruby\",\n \"go.mod\": \"go\",\n \"go.sum\": \"go\",\n \"cargo.toml\": \"toml\",\n \"cargo.lock\": \"toml\",\n \".gitignore\": \"none\",\n \".dockerignore\": \"ignore\",\n \".npmrc\": \"none\",\n \".yarnrc\": \"none\",\n \".pnpmrc\": \"none\",\n \".editorconfig\": \"editorconfig\",\n \".browserslistrc\": \"none\",\n \".prettierrc\": \"json\",\n \".eslintrc\": \"json\",\n \".stylelintrc\": \"json\",\n readme: \"markdown\",\n changelog: \"markdown\",\n changes: \"markdown\",\n history: \"markdown\",\n license: \"none\",\n licence: \"none\",\n copying: \"none\",\n notice: \"none\",\n authors: \"none\",\n contributors: \"none\",\n codeowners: \"none\"\n};\nconst mimeLangMap: Record<string, string> = {\n \"text/markdown\": \"markdown\",\n \"text/html\": \"markup\",\n \"application/xml\": \"markup\",\n \"text/xml\": \"markup\",\n \"application/json\": \"json\",\n \"application/json5\": \"json5\",\n \"application/x-ipynb+json\": \"json\",\n \"application/x-ndjson\": \"json\",\n \"application/yaml\": \"yaml\",\n \"application/x-yaml\": \"yaml\",\n \"text/yaml\": \"yaml\",\n \"application/javascript\": \"javascript\",\n \"application/x-javascript\": \"javascript\",\n \"text/javascript\": \"javascript\",\n \"application/typescript\": \"typescript\",\n \"application/x-typescript\": \"typescript\",\n \"text/typescript\": \"typescript\",\n \"application/sql\": \"sql\",\n \"application/x-sh\": \"bash\",\n \"application/graphql\": \"graphql\",\n \"text/calendar\": \"none\",\n \"text/vcard\": \"none\",\n \"application/x-pem-file\": \"none\",\n \"application/x-x509-ca-cert\": \"none\",\n \"application/pkix-cert\": \"none\",\n \"application/x-httpd-php\": \"php\",\n \"application/x-tex\": \"latex\",\n \"message/http\": \"http\",\n \"text/x-bibtex\": \"latex\",\n \"text/x-hcl\": \"hcl\",\n \"text/x-protobuf\": \"protobuf\",\n \"text/vnd.graphviz\": \"dot\",\n \"text/css\": \"css\"\n};\n\nconst MAX_HIGHLIGHT_CHARS = 180_000;\nconst MAX_RENDER_CHARS = 600_000;\n\nfunction loadPrismCss(theme: \"light\" | \"dark\"): Promise<void> {\n const lightId = \"ofv-prism-css-light\";\n const darkId = \"ofv-prism-css-dark\";\n\n const activeId = theme === \"dark\" ? darkId : lightId;\n const inactiveId = theme === \"dark\" ? lightId : darkId;\n\n document.getElementById(inactiveId)?.remove();\n\n if (document.getElementById(activeId)) {\n return Promise.resolve();\n }\n\n const href =\n theme === \"dark\"\n ? \"https://cdn.jsdelivr.net/npm/prismjs@1.29.0/themes/prism-tomorrow.min.css\"\n : \"https://cdn.jsdelivr.net/npm/prismjs@1.29.0/themes/prism.min.css\";\n\n return new Promise((resolve, reject) => {\n const link = document.createElement(\"link\");\n link.id = activeId;\n link.rel = \"stylesheet\";\n link.href = href;\n link.onload = () => resolve();\n link.onerror = () => reject(new Error(`Failed to load Prism CSS: ${href}`));\n document.head.appendChild(link);\n });\n}\n\nexport function textPlugin(): PreviewPlugin {\n return {\n name: \"text\",\n match(file) {\n return isTextLike(file);\n },\n async render(ctx) {\n const ext = ctx.file.extension.toLowerCase();\n const lang = getTextLanguage(ctx.file.name, ext, ctx.file.mimeType);\n const defaultWrapped = lang === \"none\";\n const isMarkdown = lang === \"markdown\";\n const text = await readText(ctx.file.source).catch((error: unknown) => undefined);\n if (text === undefined) {\n const fallback = createTextFallback(ctx.file.name, ctx.file.url);\n ctx.viewport.classList.add(\"ofv-center\");\n ctx.viewport.append(fallback);\n return {\n destroy() {\n ctx.viewport.classList.remove(\"ofv-center\");\n fallback.remove();\n }\n };\n }\n\n // Detect dark theme active state\n const isDark =\n ctx.host.parentElement?.classList.contains(\"ofv-theme-dark\") ||\n document.body.classList.contains(\"ofv-theme-dark\") ||\n (ctx.options.theme === \"auto\" && window.matchMedia?.(\"(prefers-color-scheme: dark)\").matches) ||\n ctx.options.theme === \"dark\";\n\n // 1. Markdown path\n if (isMarkdown) {\n const [markedModule, PrismModule, DOMPurifyModule] = await Promise.all([\n import(\"marked\"),\n import(\"prismjs\"),\n import(\"dompurify\")\n ]);\n\n const parseMarkdown =\n markedModule.marked?.parse || markedModule.parse || (markedModule as any).default?.parse;\n const Prism = PrismModule.default || PrismModule;\n const DOMPurify = DOMPurifyModule.default || DOMPurifyModule;\n\n const container = document.createElement(\"div\");\n container.className = \"ofv-markdown-body\";\n container.innerHTML = DOMPurify.sanitize(parseMarkdown(text), {\n USE_PROFILES: { html: true },\n ADD_ATTR: [\"target\"]\n });\n secureMarkdownLinks(container);\n ctx.viewport.appendChild(container);\n\n // Highlight code blocks inside markdown\n try {\n const codeBlocks = container.querySelectorAll(\"pre code\");\n if (codeBlocks.length > 0) {\n await loadPrismCss(isDark ? \"dark\" : \"light\");\n codeBlocks.forEach((block) => {\n const parent = block.parentElement;\n if (parent && !parent.className.includes(\"language-\")) {\n parent.className = \"language-none\";\n }\n Prism.highlightElement(block);\n });\n }\n } catch (e) {\n console.warn(\"Prism highlight for markdown failed:\", e);\n }\n\n return {\n destroy() {\n container.remove();\n }\n };\n }\n\n // 2. Syntax-highlighted code path\n const [PrismModule] = await Promise.all([import(\"prismjs\")]);\n const Prism = PrismModule.default || PrismModule;\n\n // Load specific language component dynamically if needed\n if (lang !== \"none\") {\n try {\n if (lang === \"typescript\" || lang === \"tsx\") {\n await import(\"prismjs/components/prism-typescript\");\n } else if (lang === \"python\") {\n await import(\"prismjs/components/prism-python\");\n } else if (lang === \"json\") {\n await import(\"prismjs/components/prism-json\");\n } else if (lang === \"json5\") {\n await import(\"prismjs/components/prism-json5\");\n } else if (lang === \"yaml\") {\n await import(\"prismjs/components/prism-yaml\");\n } else if (lang === \"toml\") {\n await import(\"prismjs/components/prism-toml\");\n } else if (lang === \"ini\") {\n await import(\"prismjs/components/prism-ini\");\n } else if (lang === \"properties\") {\n await import(\"prismjs/components/prism-properties\");\n } else if (lang === \"editorconfig\") {\n await import(\"prismjs/components/prism-editorconfig\");\n } else if (lang === \"ignore\") {\n await import(\"prismjs/components/prism-ignore\");\n } else if (lang === \"protobuf\") {\n await import(\"prismjs/components/prism-protobuf\");\n } else if (lang === \"hcl\") {\n await import(\"prismjs/components/prism-hcl\");\n } else if (lang === \"latex\") {\n await import(\"prismjs/components/prism-latex\");\n } else if (lang === \"dot\") {\n await import(\"prismjs/components/prism-dot\");\n } else if (lang === \"http\") {\n await import(\"prismjs/components/prism-http\");\n } else if (lang === \"bash\") {\n await import(\"prismjs/components/prism-bash\");\n } else if (lang === \"powershell\") {\n await import(\"prismjs/components/prism-powershell\");\n } else if (lang === \"batch\") {\n await import(\"prismjs/components/prism-batch\");\n } else if (lang === \"docker\") {\n await import(\"prismjs/components/prism-docker\");\n } else if (lang === \"makefile\") {\n await import(\"prismjs/components/prism-makefile\");\n } else if (lang === \"ruby\") {\n await import(\"prismjs/components/prism-ruby\");\n } else if (lang === \"nginx\") {\n await import(\"prismjs/components/prism-nginx\");\n } else if (lang === \"groovy\") {\n await import(\"prismjs/components/prism-groovy\");\n } else if (lang === \"graphql\") {\n await import(\"prismjs/components/prism-graphql\");\n } else if (lang === \"csharp\") {\n await import(\"prismjs/components/prism-csharp\");\n } else if (lang === \"rust\") {\n await import(\"prismjs/components/prism-rust\");\n } else if (lang === \"go\") {\n await import(\"prismjs/components/prism-go\");\n } else if (lang === \"ruby\") {\n await import(\"prismjs/components/prism-ruby\");\n } else if (lang === \"swift\") {\n await import(\"prismjs/components/prism-swift\");\n } else if (lang === \"kotlin\") {\n await import(\"prismjs/components/prism-kotlin\");\n } else if (lang === \"scala\") {\n await import(\"prismjs/components/prism-scala\");\n } else if (lang === \"lua\") {\n await import(\"prismjs/components/prism-lua\");\n } else if (lang === \"r\") {\n await import(\"prismjs/components/prism-r\");\n } else if (lang === \"dart\") {\n await import(\"prismjs/components/prism-dart\");\n } else if (lang === \"elm\") {\n await import(\"prismjs/components/prism-elm\");\n } else if (lang === \"elixir\") {\n await import(\"prismjs/components/prism-elixir\");\n } else if (lang === \"clojure\") {\n await import(\"prismjs/components/prism-clojure\");\n } else if (lang === \"erlang\") {\n await import(\"prismjs/components/prism-erlang\");\n } else if (lang === \"fsharp\") {\n await import(\"prismjs/components/prism-fsharp\");\n } else if (lang === \"haskell\") {\n await import(\"prismjs/components/prism-haskell\");\n } else if (lang === \"sql\") {\n await import(\"prismjs/components/prism-sql\");\n } else if (lang === \"cpp\") {\n await import(\"prismjs/components/prism-c\");\n await import(\"prismjs/components/prism-cpp\");\n } else if (lang === \"java\") {\n await import(\"prismjs/components/prism-java\");\n } else if (lang === \"php\") {\n await import(\"prismjs/components/prism-markup-templating\");\n await import(\"prismjs/components/prism-php\");\n }\n } catch (e) {\n console.warn(`Prism failed to load language component for: ${lang}`, e);\n }\n }\n\n await loadPrismCss(isDark ? \"dark\" : \"light\").catch((error) => {\n console.warn(\"Prism CSS failed to load; rendering code without external theme:\", error);\n });\n\n const codeText = text.length > MAX_RENDER_CHARS ? text.slice(0, MAX_RENDER_CHARS) : text;\n const totalLines = countLines(text);\n const shownLines = countLines(codeText);\n const truncated = codeText.length < text.length;\n const shouldHighlight = codeText.length <= MAX_HIGHLIGHT_CHARS;\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-code-container\";\n if (truncated) {\n wrapper.classList.add(\"is-truncated\");\n }\n if (defaultWrapped) {\n wrapper.classList.add(\"is-wrapped\");\n }\n\n const header = document.createElement(\"div\");\n header.className = \"ofv-code-header\";\n\n const title = document.createElement(\"div\");\n title.className = \"ofv-code-title\";\n const fileName = document.createElement(\"strong\");\n fileName.textContent = ctx.file.name;\n const meta = document.createElement(\"span\");\n meta.textContent = [\n lang === \"none\" ? \"plain text\" : lang,\n `${totalLines.toLocaleString()} lines`,\n formatBytes(ctx.file.size ?? (ctx.file.source instanceof Blob ? ctx.file.source.size : text.length))\n ].join(\" · \");\n title.append(fileName, meta);\n\n const actions = document.createElement(\"div\");\n actions.className = \"ofv-code-actions\";\n\n const status = document.createElement(\"span\");\n status.className = \"ofv-code-status\";\n status.setAttribute(\"role\", \"status\");\n\n const wrapButton = document.createElement(\"button\");\n wrapButton.type = \"button\";\n wrapButton.className = \"ofv-code-action\";\n wrapButton.textContent = \"Wrap\";\n wrapButton.setAttribute(\"aria-pressed\", String(defaultWrapped));\n wrapButton.addEventListener(\"click\", () => {\n const wrapped = wrapper.classList.toggle(\"is-wrapped\");\n wrapButton.setAttribute(\"aria-pressed\", String(wrapped));\n });\n\n const copyButton = document.createElement(\"button\");\n copyButton.type = \"button\";\n copyButton.className = \"ofv-code-action\";\n copyButton.textContent = \"Copy\";\n copyButton.addEventListener(\"click\", async () => {\n copyButton.disabled = true;\n try {\n await copyToClipboard(text);\n status.textContent = \"Copied\";\n } catch {\n status.textContent = \"Copy failed\";\n } finally {\n copyButton.disabled = false;\n }\n });\n\n const downloadButton = document.createElement(\"button\");\n downloadButton.type = \"button\";\n downloadButton.className = \"ofv-code-action\";\n downloadButton.textContent = \"Download\";\n downloadButton.addEventListener(\"click\", () => {\n downloadText(ctx.file.name, text);\n status.textContent = \"Download ready\";\n });\n\n actions.append(wrapButton, copyButton, downloadButton, status);\n header.append(title, actions);\n const structureSummary = createTextStructureSummary(text, ext, lang, ctx.file.mimeType);\n\n const body = document.createElement(\"div\");\n body.className = \"ofv-code-body\";\n\n const gutter = document.createElement(\"pre\");\n gutter.className = \"ofv-code-gutter\";\n gutter.setAttribute(\"aria-hidden\", \"true\");\n gutter.textContent = createLineNumbers(shownLines);\n\n const pre = document.createElement(\"pre\");\n pre.className = `language-${lang}`;\n\n const code = document.createElement(\"code\");\n code.className = `language-${lang}`;\n code.textContent = codeText;\n\n pre.appendChild(code);\n body.append(gutter, pre);\n wrapper.append(header);\n if (structureSummary) {\n wrapper.append(structureSummary);\n }\n if (truncated) {\n const notice = document.createElement(\"div\");\n notice.className = \"ofv-code-notice\";\n notice.textContent = `文件较大,当前展示前 ${formatBytes(codeText.length)},复制和下载仍会使用完整内容。`;\n wrapper.append(notice);\n }\n if (!shouldHighlight) {\n const notice = document.createElement(\"div\");\n notice.className = \"ofv-code-notice\";\n notice.textContent = \"内容较大,已跳过语法高亮以保持滚动流畅。\";\n wrapper.append(notice);\n }\n wrapper.appendChild(body);\n ctx.viewport.appendChild(wrapper);\n\n if (shouldHighlight) {\n try {\n Prism.highlightElement(code);\n } catch (err) {\n console.error(\"Prism syntax highlighting failed:\", err);\n }\n }\n\n return {\n destroy() {\n wrapper.remove();\n }\n };\n }\n };\n}\n\nfunction getTextLanguage(fileName: string, extension: string, mimeType: string): string {\n const normalizedFileName = normalizeFileName(fileName);\n return (\n langMap[extension] ||\n filenameLangMap[normalizedFileName] ||\n filenameLangMap[normalizedFileName.split(\".\")[0]] ||\n mimeLangMap[mimeType.toLowerCase()] ||\n \"none\"\n );\n}\n\nfunction normalizeFileName(name: string): string {\n const baseName = name.split(/[\\\\/]/).pop() || name;\n return baseName.toLowerCase();\n}\n\nfunction createTextFallback(fileName: string, url?: string): HTMLElement {\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n\n const title = document.createElement(\"strong\");\n title.textContent = \"文本预览失败\";\n\n const meta = document.createElement(\"span\");\n meta.textContent = \"无法读取该文本内容,可能是远程文件不可访问或响应状态异常。\";\n\n fallback.append(title, meta);\n if (url) {\n const download = document.createElement(\"a\");\n download.href = url;\n download.download = fileName;\n download.textContent = \"打开原文件\";\n fallback.append(download);\n }\n return fallback;\n}\n\nfunction secureMarkdownLinks(container: HTMLElement): void {\n for (const link of container.querySelectorAll<HTMLAnchorElement>(\"a[href]\")) {\n const href = link.getAttribute(\"href\") || \"\";\n if (!isSafeMarkdownHref(href)) {\n link.removeAttribute(\"href\");\n link.removeAttribute(\"target\");\n link.removeAttribute(\"rel\");\n continue;\n }\n if (/^(https?:)?\\/\\//i.test(href)) {\n link.target = \"_blank\";\n link.rel = \"noopener noreferrer\";\n }\n }\n}\n\nfunction isSafeMarkdownHref(href: string): boolean {\n const trimmed = href.trim();\n return (\n trimmed.startsWith(\"#\") ||\n trimmed.startsWith(\"/\") ||\n trimmed.startsWith(\"./\") ||\n trimmed.startsWith(\"../\") ||\n /^(https?:|mailto:|tel:)/i.test(trimmed)\n );\n}\n\nfunction countLines(text: string): number {\n if (!text) {\n return 1;\n }\n return text.split(/\\r\\n|\\r|\\n/).length;\n}\n\nfunction createTextStructureSummary(text: string, extension: string, language: string, mimeType: string): HTMLElement | null {\n if (text.length > MAX_RENDER_CHARS) {\n return null;\n }\n const items = summarizeTextStructure(text, extension, language, mimeType);\n if (items.length === 0) {\n return null;\n }\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-text-structure\";\n for (const item of items) {\n const row = document.createElement(\"span\");\n const label = document.createElement(\"span\");\n label.textContent = item.label;\n const value = document.createElement(\"strong\");\n value.textContent = item.value;\n row.append(label, value);\n summary.append(row);\n }\n return summary;\n}\n\nfunction summarizeTextStructure(\n text: string,\n extension: string,\n language: string,\n mimeType: string\n): Array<{ label: string; value: string }> {\n if (extension === \"ipynb\" || mimeType === \"application/x-ipynb+json\") {\n return summarizeNotebook(text);\n }\n if (extension === \"ndjson\" || extension === \"jsonl\" || mimeType === \"application/x-ndjson\") {\n return summarizeNdjson(text);\n }\n if (language === \"json\" || language === \"json5\") {\n return summarizeJson(text);\n }\n return [];\n}\n\nfunction summarizeJson(text: string): Array<{ label: string; value: string }> {\n try {\n const data = JSON.parse(text) as unknown;\n if (Array.isArray(data)) {\n return [\n { label: \"结构\", value: \"Array\" },\n { label: \"条目\", value: String(data.length) }\n ];\n }\n if (data && typeof data === \"object\") {\n const keys = Object.keys(data as Record<string, unknown>);\n return [\n { label: \"结构\", value: \"Object\" },\n { label: \"键\", value: String(keys.length) },\n { label: \"预览\", value: keys.slice(0, 8).join(\", \") || \"无键\" }\n ];\n }\n return [{ label: \"结构\", value: typeof data }];\n } catch {\n return [];\n }\n}\n\nfunction summarizeNotebook(text: string): Array<{ label: string; value: string }> {\n try {\n const notebook = JSON.parse(text) as {\n cells?: Array<{ cell_type?: string; source?: string | string[] }>;\n metadata?: { kernelspec?: { display_name?: string; name?: string }; language_info?: { name?: string } };\n };\n if (!Array.isArray(notebook.cells)) {\n return summarizeJson(text);\n }\n const counts = new Map<string, number>();\n for (const cell of notebook.cells) {\n const type = cell.cell_type || \"unknown\";\n counts.set(type, (counts.get(type) || 0) + 1);\n }\n const kernel = notebook.metadata?.kernelspec?.display_name || notebook.metadata?.kernelspec?.name || notebook.metadata?.language_info?.name;\n return [\n { label: \"Notebook\", value: `${notebook.cells.length} cells` },\n { label: \"类型\", value: [...counts.entries()].map(([type, count]) => `${type} ${count}`).join(\", \") || \"未知\" },\n ...(kernel ? [{ label: \"Kernel\", value: kernel }] : [])\n ];\n } catch {\n return [];\n }\n}\n\nfunction summarizeNdjson(text: string): Array<{ label: string; value: string }> {\n const lines = text.split(/\\r\\n|\\r|\\n/).filter((line) => line.trim());\n let parsed = 0;\n let objects = 0;\n let arrays = 0;\n for (const line of lines.slice(0, 1000)) {\n try {\n const value = JSON.parse(line);\n parsed++;\n if (Array.isArray(value)) {\n arrays++;\n } else if (value && typeof value === \"object\") {\n objects++;\n }\n } catch {\n // keep counting valid rows only\n }\n }\n return [\n { label: \"NDJSON\", value: `${lines.length} lines` },\n { label: \"可解析\", value: String(parsed) },\n { label: \"类型\", value: `object ${objects}, array ${arrays}` }\n ];\n}\n\nfunction createLineNumbers(lines: number): string {\n return Array.from({ length: Math.max(lines, 1) }, (_, index) => String(index + 1)).join(\"\\n\");\n}\n\nfunction formatBytes(bytes: number): string {\n if (!Number.isFinite(bytes) || bytes < 0) {\n return \"0 B\";\n }\n if (bytes < 1024) {\n return `${bytes} B`;\n }\n const units = [\"KB\", \"MB\", \"GB\"];\n let value = bytes / 1024;\n let unitIndex = 0;\n while (value >= 1024 && unitIndex < units.length - 1) {\n value /= 1024;\n unitIndex += 1;\n }\n return `${value.toFixed(value >= 10 ? 1 : 2)} ${units[unitIndex]}`;\n}\n\nasync function copyToClipboard(text: string): Promise<void> {\n if (navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n return;\n }\n\n const textarea = document.createElement(\"textarea\");\n textarea.value = text;\n textarea.setAttribute(\"readonly\", \"\");\n textarea.style.position = \"fixed\";\n textarea.style.left = \"-9999px\";\n document.body.append(textarea);\n textarea.select();\n const copied = document.execCommand?.(\"copy\");\n textarea.remove();\n if (!copied) {\n throw new Error(\"Clipboard API is not available.\");\n }\n}\n\nfunction downloadText(fileName: string, text: string): void {\n const blob = new Blob([text], { type: \"text/plain;charset=utf-8\" });\n const url = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = fileName;\n document.body.append(link);\n link.click();\n link.remove();\n URL.revokeObjectURL(url);\n}\n\nasync function readText(source: unknown): Promise<string> {\n if (typeof source === \"string\") {\n const response = await fetch(source);\n if (!response.ok) {\n throw new Error(`Failed to fetch text file: ${response.status}`);\n }\n return decodeTextBuffer(await response.arrayBuffer());\n }\n if (source instanceof Blob) {\n return decodeTextBuffer(await source.arrayBuffer());\n }\n if (source instanceof ArrayBuffer) {\n return decodeTextBuffer(source);\n }\n return String(source);\n}\n","import { createObjectUrl, revokeObjectUrl } from \"../dom\";\nimport type { PreviewPlugin, PreviewSize } from \"../types\";\n\ntype PdfJsModule = typeof import(\"pdfjs-dist\");\n\nexport interface PdfPluginOptions {\n pdfjs?: PdfJsModule;\n workerSrc?: string;\n cMapUrl?: string;\n cMapPacked?: boolean;\n standardFontDataUrl?: string;\n useSystemFonts?: boolean;\n}\n\n// 2D affine transform matrix multiplication helper\nfunction multiplyMatrices(m1: number[], m2: number[]): number[] {\n return [\n m1[0] * m2[0] + m1[2] * m2[1],\n m1[1] * m2[0] + m1[3] * m2[1],\n m1[0] * m2[2] + m1[2] * m2[3],\n m1[1] * m2[2] + m1[3] * m2[3],\n m1[0] * m2[4] + m1[2] * m2[5] + m1[4],\n m1[1] * m2[4] + m1[3] * m2[5] + m1[5]\n ];\n}\n\nexport function pdfPlugin(options: PdfJsModule | PdfPluginOptions = {}): PreviewPlugin {\n return {\n name: \"pdf\",\n match(file) {\n return file.mimeType === \"application/pdf\" || file.extension === \"pdf\";\n },\n async render(ctx) {\n const normalizedOptions = normalizePdfOptions(options);\n const pdf = normalizedOptions.pdfjs || (await import(\"pdfjs-dist\"));\n configurePdfWorker(pdf, normalizedOptions.workerSrc);\n const url = createObjectUrl(ctx.file);\n const isExternal = Boolean(ctx.file.url);\n\n const viewer = document.createElement(\"div\");\n viewer.className = \"ofv-pdf-viewer\";\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-pdf-summary\";\n const scroller = document.createElement(\"div\");\n scroller.className = \"ofv-pdf ofv-pdf-pages\";\n viewer.append(summary, scroller);\n ctx.viewport.append(viewer);\n\n const documentTask = pdf.getDocument({\n url,\n cMapUrl: normalizedOptions.cMapUrl ?? `https://cdn.jsdelivr.net/npm/pdfjs-dist@${pdf.version}/cmaps/`,\n cMapPacked: normalizedOptions.cMapPacked ?? true,\n standardFontDataUrl:\n normalizedOptions.standardFontDataUrl ??\n `https://cdn.jsdelivr.net/npm/pdfjs-dist@${pdf.version}/standard_fonts/`,\n useSystemFonts: normalizedOptions.useSystemFonts ?? true\n });\n const doc = await documentTask.promise.catch((error: unknown) => {\n viewer.remove();\n ctx.viewport.classList.add(\"ofv-center\");\n const fallback = createPdfFallback(ctx.file.name, url, normalizePdfError(error));\n ctx.viewport.append(fallback);\n return undefined;\n });\n if (!doc) {\n return {\n destroy() {\n ctx.viewport.classList.remove(\"ofv-center\");\n documentTask.destroy?.();\n revokeObjectUrl(url, isExternal);\n }\n };\n }\n\n // Fast-extract page dimensions\n const pagesMeta: Array<{ width: number; height: number }> = [];\n for (let pageNumber = 1; pageNumber <= doc.numPages; pageNumber += 1) {\n try {\n const page = await doc.getPage(pageNumber);\n const baseViewport = page.getViewport({ scale: 1 });\n pagesMeta.push({\n width: baseViewport.width,\n height: baseViewport.height\n });\n } catch {\n pagesMeta.push({ width: 612, height: 792 });\n }\n }\n\n const pageStates: Array<{\n wrapper: HTMLDivElement;\n canvas: HTMLCanvasElement | null;\n renderTask: any | null;\n rendered: boolean;\n }> = [];\n\n let observer: IntersectionObserver | null = null;\n let currentSize = ctx.size;\n let zoomFactor = 1;\n\n const updateSummary = () => {\n renderPdfSummary(summary, doc.numPages, pagesMeta, ctx.options.fit, zoomFactor);\n ctx.toolbar?.setZoom(zoomFactor);\n };\n\n // Cancel page rendering and free canvas memory\n const clearPage = (pageIdx: number) => {\n const state = pageStates[pageIdx];\n if (!state || !state.rendered) return;\n\n if (state.renderTask) {\n try {\n state.renderTask.cancel();\n } catch (e) {\n // Ignore cancel errors\n }\n state.renderTask = null;\n }\n\n state.canvas = null;\n state.rendered = false;\n state.wrapper.replaceChildren();\n state.wrapper.append(createPageStatus(\"ofv-pdf-skeleton\", `页面 ${pageIdx + 1} 加载中...`));\n };\n\n // Perform actual on-demand rendering on canvas and build text layer\n const renderPage = async (pageIdx: number, size: PreviewSize) => {\n const state = pageStates[pageIdx];\n if (!state || state.rendered) return;\n\n state.rendered = true;\n\n try {\n const page = await doc.getPage(pageIdx + 1);\n const meta = pagesMeta[pageIdx];\n const scale =\n ctx.options.fit === \"actual\"\n ? zoomFactor\n : Math.max(0.05, Math.min(5, (getPdfAvailableWidth(size.width) / meta.width) * zoomFactor));\n \n const viewport = page.getViewport({ scale });\n const outputScale = getPdfOutputScale();\n const cssWidth = Math.floor(viewport.width);\n const cssHeight = Math.floor(viewport.height);\n\n const canvas = document.createElement(\"canvas\");\n canvas.className = \"ofv-pdf-page\";\n canvas.width = Math.floor(cssWidth * outputScale);\n canvas.height = Math.floor(cssHeight * outputScale);\n canvas.style.width = `${cssWidth}px`;\n canvas.style.height = `${cssHeight}px`;\n\n const context = canvas.getContext(\"2d\");\n if (!context) {\n throw new Error(\"Canvas 2D context is not available.\");\n }\n\n state.wrapper.replaceChildren(canvas);\n state.canvas = canvas;\n\n const renderTask = page.render({\n canvasContext: context,\n viewport,\n transform: outputScale === 1 ? undefined : [outputScale, 0, 0, outputScale, 0, 0]\n });\n state.renderTask = renderTask;\n \n await renderTask.promise;\n state.renderTask = null;\n\n // Build absolute-positioned selectable text layer overlay\n const textContent = await page.getTextContent();\n const textLayer = document.createElement(\"div\");\n textLayer.className = \"ofv-pdf-text-layer\";\n textLayer.style.width = `${cssWidth}px`;\n textLayer.style.height = `${cssHeight}px`;\n state.wrapper.appendChild(textLayer);\n\n for (const item of textContent.items) {\n if (!(\"str\" in item)) continue;\n const str = (item as any).str;\n if (!str.trim()) continue;\n\n const tx = multiplyMatrices(viewport.transform, (item as any).transform);\n const fontHeight = Math.sqrt(tx[2] * tx[2] + tx[3] * tx[3]);\n\n const span = document.createElement(\"span\");\n span.textContent = str;\n span.style.fontSize = `${fontHeight}px`;\n span.style.fontFamily = (item as any).fontName || \"sans-serif\";\n span.style.left = `${tx[4]}px`;\n span.style.top = `${tx[5] - fontHeight}px`;\n span.style.transformOrigin = \"0% 0%\";\n\n textLayer.appendChild(span);\n\n // Scale text width horizontally if specified to match visual width perfectly\n if ((item as any).width) {\n const itemWidth = (item as any).width * scale;\n const actualWidth = span.offsetWidth || span.getBoundingClientRect().width;\n if (actualWidth > 0 && Math.abs(actualWidth - itemWidth) > 1) {\n span.style.transform = `scaleX(${itemWidth / actualWidth})`;\n }\n }\n }\n } catch (err) {\n console.error(`Failed to render PDF page ${pageIdx + 1}:`, err);\n state.rendered = false;\n state.wrapper.replaceChildren(createPageStatus(\"ofv-pdf-error\", \"无法渲染该页面\"));\n }\n };\n\n const renderLayout = (size: PreviewSize) => {\n observer?.disconnect();\n updateSummary();\n scroller.replaceChildren();\n pageStates.length = 0;\n\n if (typeof IntersectionObserver !== \"undefined\") {\n observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n const pageIdx = parseInt(entry.target.getAttribute(\"data-page-index\") || \"0\", 10);\n const state = pageStates[pageIdx];\n if (!state) return;\n\n if (entry.isIntersecting) {\n if (!state.rendered) {\n void renderPage(pageIdx, size);\n }\n } else {\n if (state.rendered && doc.numPages > 8) {\n clearPage(pageIdx);\n }\n }\n });\n },\n {\n root: scroller,\n rootMargin: \"400px 0px 400px 0px\"\n }\n );\n }\n\n for (let i = 0; i < doc.numPages; i++) {\n const meta = pagesMeta[i];\n const scale =\n ctx.options.fit === \"actual\"\n ? zoomFactor\n : Math.max(0.05, Math.min(5, (getPdfAvailableWidth(size.width) / meta.width) * zoomFactor));\n \n const w = Math.floor(meta.width * scale);\n const h = Math.floor(meta.height * scale);\n\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-pdf-page-wrapper\";\n wrapper.setAttribute(\"data-page-index\", String(i));\n wrapper.style.width = `${w}px`;\n wrapper.style.height = `${h}px`;\n wrapper.append(createPageStatus(\"ofv-pdf-skeleton\", `页面 ${i + 1} 加载中...`));\n\n scroller.appendChild(wrapper);\n\n pageStates.push({\n wrapper,\n canvas: null,\n renderTask: null,\n rendered: false\n });\n\n if (observer) {\n observer.observe(wrapper);\n } else {\n void renderPage(i, size);\n }\n }\n };\n\n renderLayout(ctx.size);\n\n let resizeTimer: number | undefined;\n return {\n canCommand(command) {\n return command === \"zoom-in\" || command === \"zoom-out\" || command === \"zoom-reset\";\n },\n command(command) {\n if (command === \"zoom-in\") {\n zoomFactor = Math.min(4, zoomFactor + 0.15);\n renderLayout(currentSize);\n return true;\n }\n if (command === \"zoom-out\") {\n zoomFactor = Math.max(0.25, zoomFactor - 0.15);\n renderLayout(currentSize);\n return true;\n }\n if (command === \"zoom-reset\") {\n zoomFactor = 1;\n renderLayout(currentSize);\n return true;\n }\n return false;\n },\n resize(size) {\n currentSize = size;\n window.clearTimeout(resizeTimer);\n resizeTimer = window.setTimeout(() => {\n renderLayout(size);\n }, 120);\n },\n destroy() {\n ctx.toolbar?.setZoom(undefined);\n window.clearTimeout(resizeTimer);\n observer?.disconnect();\n \n pageStates.forEach((state) => {\n if (state.renderTask) {\n try {\n state.renderTask.cancel();\n } catch (e) {\n // Ignore\n }\n }\n });\n pageStates.length = 0;\n\n revokeObjectUrl(url, isExternal);\n void doc.destroy();\n }\n };\n }\n };\n}\n\nfunction getPdfOutputScale(): number {\n if (typeof window === \"undefined\") {\n return 1;\n }\n return Math.max(1, Math.min(window.devicePixelRatio || 1, 2.5));\n}\n\nfunction getPdfAvailableWidth(width: number): number {\n if (!Number.isFinite(width) || width <= 0) {\n return 1;\n }\n const gutter = width < 160 ? 16 : 32;\n return Math.max(1, width - gutter);\n}\n\nfunction renderPdfSummary(\n summary: HTMLElement,\n pages: number,\n pagesMeta: Array<{ width: number; height: number }>,\n fit: string,\n zoomFactor: number\n): void {\n summary.replaceChildren();\n appendPdfSummary(summary, \"页数\", String(pages));\n const pageSizes = formatPdfPageSizes(pagesMeta);\n if (pageSizes) {\n appendPdfSummary(summary, \"页面尺寸\", pageSizes);\n }\n appendPdfSummary(summary, \"适配\", fit === \"actual\" ? \"原始大小\" : \"适合宽度\");\n appendPdfSummary(summary, \"缩放\", `${Math.round(zoomFactor * 100)}%`);\n}\n\nfunction appendPdfSummary(parent: HTMLElement, label: string, value: string): void {\n const item = document.createElement(\"span\");\n const key = document.createElement(\"span\");\n key.textContent = label;\n const content = document.createElement(\"strong\");\n content.textContent = value;\n item.append(key, content);\n parent.append(item);\n}\n\nfunction formatPdfPageSizes(pagesMeta: Array<{ width: number; height: number }>): string {\n const counts = new Map<string, number>();\n for (const page of pagesMeta) {\n const key = `${Math.round(page.width)} x ${Math.round(page.height)}`;\n counts.set(key, (counts.get(key) || 0) + 1);\n }\n return [...counts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 4)\n .map(([size, count]) => (count > 1 ? `${size} (${count})` : size))\n .join(\", \");\n}\n\nfunction normalizePdfOptions(options: PdfJsModule | PdfPluginOptions): PdfPluginOptions {\n if (\"getDocument\" in options) {\n return { pdfjs: options };\n }\n return options;\n}\n\nfunction createPageStatus(className: string, text: string): HTMLDivElement {\n const status = document.createElement(\"div\");\n status.className = className;\n status.textContent = text;\n return status;\n}\n\nfunction createPdfFallback(fileName: string, url: string, message: string): HTMLElement {\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n\n const title = document.createElement(\"strong\");\n title.textContent = \"PDF 预览失败\";\n\n const meta = document.createElement(\"span\");\n meta.textContent = `${message} ${fileName}`;\n\n const download = document.createElement(\"a\");\n download.href = url;\n download.download = fileName;\n download.textContent = \"下载 PDF\";\n\n fallback.append(title, meta, download);\n return fallback;\n}\n\nfunction normalizePdfError(error: unknown): string {\n const message = error instanceof Error ? error.message : String(error || \"\");\n const name = typeof error === \"object\" && error !== null && \"name\" in error ? String((error as { name?: unknown }).name) : \"\";\n const lower = `${name} ${message}`.toLowerCase();\n if (lower.includes(\"password\")) {\n return \"该 PDF 受密码保护,当前无法在浏览器内直接预览。\";\n }\n if (lower.includes(\"invalid\") || lower.includes(\"missing\") || lower.includes(\"corrupt\")) {\n return \"该 PDF 文件可能已损坏或格式无效。\";\n }\n return \"当前浏览器无法加载该 PDF。\";\n}\n\nfunction configurePdfWorker(pdf: PdfJsModule, workerSrc?: string): void {\n if (workerSrc) {\n pdf.GlobalWorkerOptions.workerSrc = workerSrc;\n return;\n }\n\n if (!pdf.GlobalWorkerOptions.workerSrc && typeof window !== \"undefined\") {\n pdf.GlobalWorkerOptions.workerSrc = `https://cdn.jsdelivr.net/npm/pdfjs-dist@${pdf.version}/build/pdf.worker.mjs`;\n }\n}\n","import JSZip from \"jszip\";\nimport DOMPurify from \"dompurify\";\nimport type { PreviewPlugin } from \"../types\";\nimport { createPanel, createSection, readArrayBuffer } from \"./utils\";\n\nconst epubMimeTypes = new Set([\"application/epub+zip\", \"application/x-epub+zip\"]);\n\ntype EpubManifestItem = {\n id: string;\n href: string;\n mediaType: string;\n properties: string;\n};\n\ntype EpubMetadata = {\n title: string;\n creator: string;\n language: string;\n identifier: string;\n publisher: string;\n modified: string;\n};\n\ntype EpubStructureSummary = {\n manifestItems: number;\n spineItems: number;\n chapters: number;\n images: number;\n styles: number;\n fonts: number;\n audio: number;\n video: number;\n navItems: number;\n tocItems: number;\n coverItems: number;\n otherItems: number;\n missingSpineItems: number;\n};\n\nexport function epubPlugin(): PreviewPlugin {\n return {\n name: \"epub\",\n match(file) {\n return file.extension === \"epub\" || epubMimeTypes.has(file.mimeType);\n },\n async render(ctx) {\n const panel = createPanel(\"ofv-epub\");\n ctx.viewport.append(panel);\n\n try {\n const zip = await JSZip.loadAsync(await readArrayBuffer(ctx.file));\n await renderEpub(panel, zip);\n } catch (error) {\n renderEpubFallback(panel, error);\n }\n\n return {\n destroy() {\n panel.remove();\n }\n };\n }\n };\n}\n\nasync function renderEpub(panel: HTMLElement, zip: JSZip): Promise<void> {\n const opfPath = await resolvePackagePath(zip);\n const opfText = await zip.file(opfPath)?.async(\"text\");\n if (!opfText) {\n throw new Error(\"EPUB 缺少 OPF package 文件。\");\n }\n\n const opf = parseXml(opfText, \"EPUB package 文件解析失败。\");\n const basePath = directoryName(opfPath);\n const manifest = readManifest(opf);\n const spine = readSpine(opf, manifest);\n const metadata = readMetadata(opf);\n const structure = summarizeEpubStructure(opf, manifest, spine);\n const assets = await readEpubAssets(zip, basePath, manifest);\n\n const summary = createSection(\"EPUB 图书信息\");\n const meta = document.createElement(\"div\");\n meta.className = \"ofv-epub-meta\";\n appendMeta(meta, \"标题\", metadata.title || \"未命名 EPUB\");\n appendMeta(meta, \"作者\", metadata.creator || \"未知\");\n appendMeta(meta, \"语言\", metadata.language || \"未声明\");\n if (metadata.publisher) {\n appendMeta(meta, \"出版方\", metadata.publisher);\n }\n if (metadata.identifier) {\n appendMeta(meta, \"标识\", metadata.identifier);\n }\n if (metadata.modified) {\n appendMeta(meta, \"修改时间\", metadata.modified);\n }\n appendMeta(meta, \"章节\", spine.length || \"未解析到阅读顺序\");\n appendMeta(meta, \"Manifest\", structure.manifestItems);\n appendMeta(meta, \"Spine\", structure.spineItems);\n appendMeta(meta, \"导航\", structure.navItems + structure.tocItems);\n appendMeta(meta, \"封面\", structure.coverItems);\n appendMeta(meta, \"图片\", structure.images);\n appendMeta(meta, \"样式\", structure.styles);\n appendMeta(meta, \"字体\", structure.fonts);\n if (structure.audio || structure.video) {\n appendMeta(meta, \"音视频\", `${structure.audio} / ${structure.video}`);\n }\n if (structure.otherItems) {\n appendMeta(meta, \"其他资源\", structure.otherItems);\n }\n if (structure.missingSpineItems) {\n appendMeta(meta, \"缺失章节引用\", structure.missingSpineItems);\n }\n summary.append(meta);\n panel.append(summary);\n\n const chapters = createSection(\"EPUB 正文预览\");\n const article = document.createElement(\"article\");\n article.className = \"ofv-epub-reader\";\n\n if (spine.length === 0) {\n const empty = document.createElement(\"p\");\n empty.textContent = \"未解析到可展示章节。\";\n article.append(empty);\n } else {\n for (const [index, item] of spine.slice(0, 40).entries()) {\n const chapterPath = joinZipPath(basePath, item.href);\n const chapterText = await zip.file(chapterPath)?.async(\"text\");\n if (!chapterText) {\n continue;\n }\n const section = document.createElement(\"section\");\n section.className = \"ofv-epub-chapter\";\n const heading = document.createElement(\"h3\");\n heading.textContent = chapterTitle(chapterText) || `章节 ${index + 1}`;\n const content = document.createElement(\"div\");\n content.className = \"ofv-epub-content\";\n content.innerHTML = sanitizeChapterHtml(rewriteAssetReferences(chapterText, assets, directoryName(chapterPath)));\n section.append(heading, content);\n article.append(section);\n }\n }\n\n chapters.append(article);\n panel.append(chapters);\n}\n\nasync function resolvePackagePath(zip: JSZip): Promise<string> {\n const containerXml = await zip.file(\"META-INF/container.xml\")?.async(\"text\");\n if (containerXml) {\n const container = parseXml(containerXml, \"EPUB container.xml 解析失败。\");\n const rootfile = Array.from(container.getElementsByTagName(\"*\")).find(\n (element) => element.localName === \"rootfile\" && getXmlAttribute(element, \"full-path\")\n );\n const fullPath = rootfile ? getXmlAttribute(rootfile, \"full-path\") : null;\n if (fullPath && zip.file(fullPath)) {\n return fullPath;\n }\n }\n\n const fallback = Object.values(zip.files).find((entry) => !entry.dir && entry.name.endsWith(\".opf\"));\n if (!fallback) {\n throw new Error(\"EPUB 未找到 package OPF 文件。\");\n }\n return fallback.name;\n}\n\nfunction readManifest(opf: Document): Map<string, EpubManifestItem> {\n const manifest = new Map<string, EpubManifestItem>();\n for (const item of Array.from(opf.getElementsByTagName(\"*\")).filter((element) => element.localName === \"item\")) {\n const id = getXmlAttribute(item, \"id\");\n const href = getXmlAttribute(item, \"href\");\n if (!id || !href) {\n continue;\n }\n manifest.set(id, {\n id,\n href,\n mediaType: getXmlAttribute(item, \"media-type\") || \"\",\n properties: getXmlAttribute(item, \"properties\") || \"\"\n });\n }\n return manifest;\n}\n\nfunction readSpine(opf: Document, manifest: Map<string, EpubManifestItem>): EpubManifestItem[] {\n const items: EpubManifestItem[] = [];\n for (const itemref of Array.from(opf.getElementsByTagName(\"*\")).filter((element) => element.localName === \"itemref\")) {\n const idref = getXmlAttribute(itemref, \"idref\");\n const item = idref ? manifest.get(idref) : undefined;\n if (item && isChapterMediaType(item.mediaType)) {\n items.push(item);\n }\n }\n if (items.length > 0) {\n return items;\n }\n return Array.from(manifest.values()).filter((item) => isChapterMediaType(item.mediaType));\n}\n\nfunction readMetadata(opf: Document): EpubMetadata {\n return {\n title: textByLocalName(opf, \"title\"),\n creator: textByLocalName(opf, \"creator\"),\n language: textByLocalName(opf, \"language\"),\n identifier: textByLocalName(opf, \"identifier\"),\n publisher: textByLocalName(opf, \"publisher\"),\n modified: metaPropertyText(opf, \"dcterms:modified\")\n };\n}\n\nfunction summarizeEpubStructure(opf: Document, manifest: Map<string, EpubManifestItem>, spine: EpubManifestItem[]): EpubStructureSummary {\n const items = Array.from(manifest.values());\n const chapters = spine.length;\n const images = items.filter((item) => item.mediaType.startsWith(\"image/\")).length;\n const styles = items.filter((item) => item.mediaType === \"text/css\").length;\n const fonts = items.filter((item) => item.mediaType.startsWith(\"font/\") || /font|opentype|truetype/i.test(item.mediaType)).length;\n const audio = items.filter((item) => item.mediaType.startsWith(\"audio/\")).length;\n const video = items.filter((item) => item.mediaType.startsWith(\"video/\")).length;\n const navItems = items.filter((item) => propertyTokens(item.properties).has(\"nav\")).length;\n const tocItems = items.filter((item) => item.mediaType === \"application/x-dtbncx+xml\" || propertyTokens(item.properties).has(\"toc\")).length;\n const coverItems = items.filter((item) => item.id.toLowerCase().includes(\"cover\") || propertyTokens(item.properties).has(\"cover-image\")).length;\n const otherItems = items.filter((item) => !isKnownEpubResource(item)).length;\n return {\n manifestItems: items.length,\n spineItems: spine.length,\n chapters,\n images,\n styles,\n fonts,\n audio,\n video,\n navItems,\n tocItems,\n coverItems,\n otherItems,\n missingSpineItems: Math.max(0, readSpineRefCount(opf) - spine.length)\n };\n}\n\nfunction isKnownEpubResource(item: EpubManifestItem): boolean {\n const properties = propertyTokens(item.properties);\n return (\n isChapterMediaType(item.mediaType) ||\n item.mediaType.startsWith(\"image/\") ||\n item.mediaType === \"text/css\" ||\n item.mediaType.startsWith(\"font/\") ||\n /font|opentype|truetype/i.test(item.mediaType) ||\n item.mediaType.startsWith(\"audio/\") ||\n item.mediaType.startsWith(\"video/\") ||\n item.mediaType === \"application/x-dtbncx+xml\" ||\n properties.has(\"nav\") ||\n properties.has(\"toc\")\n );\n}\n\nasync function readEpubAssets(\n zip: JSZip,\n basePath: string,\n manifest: Map<string, EpubManifestItem>\n): Promise<Map<string, string>> {\n const assets = new Map<string, string>();\n for (const item of manifest.values()) {\n if (!item.mediaType.startsWith(\"image/\")) {\n continue;\n }\n const path = joinZipPath(basePath, item.href);\n const entry = zip.file(path);\n if (!entry) {\n continue;\n }\n assets.set(path, `data:${item.mediaType};base64,${await entry.async(\"base64\")}`);\n }\n return assets;\n}\n\nfunction rewriteAssetReferences(html: string, assets: Map<string, string>, chapterDir: string): string {\n const documentHtml = new DOMParser().parseFromString(html, \"text/html\");\n for (const image of Array.from(documentHtml.querySelectorAll<HTMLImageElement>(\"img[src], image[href], image[xlink\\\\:href]\"))) {\n const raw = image.getAttribute(\"src\") || image.getAttribute(\"href\") || image.getAttribute(\"xlink:href\") || \"\";\n const path = joinZipPath(chapterDir, raw.split(\"#\")[0] || raw);\n const src = assets.get(path);\n if (!src) {\n continue;\n }\n image.setAttribute(\"src\", src);\n image.setAttribute(\"href\", src);\n image.setAttribute(\"xlink:href\", src);\n }\n return documentHtml.body.innerHTML;\n}\n\nfunction sanitizeChapterHtml(html: string): string {\n return DOMPurify.sanitize(html, {\n USE_PROFILES: { html: true, svg: true, svgFilters: false },\n ADD_ATTR: [\"target\", \"xlink:href\"]\n });\n}\n\nfunction chapterTitle(html: string): string {\n const documentHtml = new DOMParser().parseFromString(html, \"text/html\");\n const heading = documentHtml.querySelector(\"h1, h2, h3, title\");\n return heading?.textContent?.trim() || \"\";\n}\n\nfunction renderEpubFallback(panel: HTMLElement, error: unknown): void {\n panel.replaceChildren();\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n const title = document.createElement(\"strong\");\n title.textContent = \"EPUB 解析失败\";\n const meta = document.createElement(\"span\");\n meta.textContent = error instanceof Error ? error.message : \"文件可能已损坏,或不是有效的 EPUB。\";\n fallback.append(title, meta);\n panel.append(fallback);\n}\n\nfunction parseXml(xml: string, message: string): Document {\n const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n if (doc.querySelector(\"parsererror\")) {\n throw new Error(message);\n }\n return doc;\n}\n\nfunction appendMeta(parent: HTMLElement, label: string, value: string | number): void {\n const row = document.createElement(\"div\");\n row.className = \"ofv-meta-row\";\n const key = document.createElement(\"span\");\n key.textContent = label;\n const content = document.createElement(\"strong\");\n content.textContent = String(value);\n row.append(key, content);\n parent.append(row);\n}\n\nfunction textByLocalName(doc: Document, localName: string): string {\n return (\n Array.from(doc.getElementsByTagName(\"*\"))\n .find((element) => element.localName === localName)\n ?.textContent?.trim() || \"\"\n );\n}\n\nfunction metaPropertyText(doc: Document, property: string): string {\n return (\n Array.from(doc.getElementsByTagName(\"*\"))\n .find((element) => element.localName === \"meta\" && getXmlAttribute(element, \"property\") === property)\n ?.textContent?.trim() || \"\"\n );\n}\n\nfunction propertyTokens(value: string): Set<string> {\n return new Set(value.split(/\\s+/).map((item) => item.trim()).filter(Boolean));\n}\n\nfunction readSpineRefCount(opf: Document): number {\n return Array.from(opf.getElementsByTagName(\"*\")).filter((element) => element.localName === \"itemref\").length;\n}\n\nfunction getXmlAttribute(element: Element, localName: string): string | null {\n const direct = element.getAttribute(localName);\n if (direct !== null) {\n return direct;\n }\n for (const attribute of Array.from(element.attributes)) {\n if (attribute.localName === localName) {\n return attribute.value;\n }\n }\n return null;\n}\n\nfunction isChapterMediaType(mediaType: string): boolean {\n return mediaType === \"application/xhtml+xml\" || mediaType === \"text/html\" || mediaType === \"application/xml\";\n}\n\nfunction directoryName(path: string): string {\n const index = path.lastIndexOf(\"/\");\n return index >= 0 ? path.slice(0, index + 1) : \"\";\n}\n\nfunction joinZipPath(basePath: string, path: string): string {\n const parts = `${basePath}${path}`.split(\"/\");\n const normalized: string[] = [];\n for (const part of parts) {\n if (!part || part === \".\") {\n continue;\n }\n if (part === \"..\") {\n normalized.pop();\n } else {\n normalized.push(part);\n }\n }\n return normalized.join(\"/\");\n}\n","import JSZip from \"jszip\";\nimport type { PreviewPlugin } from \"../types\";\nimport { createPanel, createSection, readArrayBuffer } from \"./utils\";\n\nconst xpsMimeTypes = new Set([\n \"application/oxps\",\n \"application/vnd.ms-xpsdocument\"\n]);\n\nexport function xpsPlugin(): PreviewPlugin {\n return {\n name: \"xps\",\n match(file) {\n return file.extension === \"xps\" || file.extension === \"oxps\" || xpsMimeTypes.has(file.mimeType);\n },\n async render(ctx) {\n const panel = createPanel(\"ofv-xps\");\n ctx.viewport.append(panel);\n\n try {\n const zip = await JSZip.loadAsync(await readArrayBuffer(ctx.file));\n await renderXps(panel, zip);\n } catch (error) {\n renderXpsFallback(panel, error);\n }\n\n return {\n destroy() {\n panel.remove();\n }\n };\n }\n };\n}\n\nasync function renderXps(panel: HTMLElement, zip: JSZip): Promise<void> {\n const entries = Object.values(zip.files).filter((entry) => !entry.dir);\n const fixedPages = entries\n .filter((entry) => /(?:^|\\/)Pages\\/[^/]+\\.fpage$/i.test(entry.name) || entry.name.endsWith(\".fpage\"))\n .sort((a, b) => a.name.localeCompare(b.name, undefined, { numeric: true }));\n const resourceEntries = entries.filter((entry) => /\\.(?:png|jpe?g|tiff?|wdp|bmp|gif|odttf|ttf)$/i.test(entry.name));\n const pagePreviews = await Promise.all(\n fixedPages.slice(0, 80).map(async (entry, index) => {\n const xml = await entry.async(\"text\");\n return {\n entry,\n index,\n xml,\n info: parseXpsPageInfo(xml)\n };\n })\n );\n\n const summary = createSection(\"XPS 基础预览\");\n const note = document.createElement(\"p\");\n note.textContent = \"当前版本提取 XPS/OXPS 包内 FixedPage 文本、页面顺序和资源结构。完整版式渲染可后续接入专用渲染器。\";\n summary.append(note);\n summary.append(createXpsSummary(entries, fixedPages, resourceEntries, pagePreviews.map((page) => page.info)));\n panel.append(summary);\n\n const pages = createSection(`页面文本 ${fixedPages.length}`);\n const reader = document.createElement(\"div\");\n reader.className = \"ofv-xps-pages\";\n\n if (fixedPages.length === 0) {\n const empty = document.createElement(\"p\");\n empty.textContent = \"未解析到 FixedPage 页面。\";\n reader.append(empty);\n } else {\n for (const page of pagePreviews) {\n reader.append(renderXpsPage(page.xml, page.entry.name, page.index));\n }\n }\n pages.append(reader);\n panel.append(pages);\n\n const structure = createSection(`文件结构 ${entries.length}`);\n const list = document.createElement(\"ul\");\n for (const entry of entries.slice(0, 240)) {\n const item = document.createElement(\"li\");\n item.textContent = entry.name;\n list.append(item);\n }\n structure.append(list);\n panel.append(structure);\n}\n\ntype XpsPageInfo = {\n width?: number;\n height?: number;\n glyphs: number;\n imageBrushes: number;\n canvases: number;\n paths: number;\n};\n\nfunction createXpsSummary(\n entries: JSZip.JSZipObject[],\n fixedPages: JSZip.JSZipObject[],\n resourceEntries: JSZip.JSZipObject[],\n pageInfos: XpsPageInfo[]\n): HTMLElement {\n const meta = document.createElement(\"div\");\n meta.className = \"ofv-xps-meta ofv-xps-summary\";\n appendMeta(meta, \"页面\", fixedPages.length);\n appendMeta(meta, \"文件\", entries.length);\n appendMeta(meta, \"FixedDocument\", entries.filter((entry) => /\\.fdoc$/i.test(entry.name)).length);\n appendMeta(meta, \"FixedDocSeq\", entries.filter((entry) => /\\.fdseq$/i.test(entry.name)).length);\n appendMeta(meta, \"关系文件\", entries.filter((entry) => /(?:^|\\/)_rels\\/[^/]+\\.rels$/i.test(entry.name) || entry.name.endsWith(\".rels\")).length);\n appendMeta(meta, \"资源\", resourceEntries.length);\n appendMeta(meta, \"图片资源\", resourceEntries.filter((entry) => /\\.(?:png|jpe?g|tiff?|wdp|bmp|gif)$/i.test(entry.name)).length);\n appendMeta(meta, \"字体资源\", resourceEntries.filter((entry) => /\\.(?:odttf|ttf)$/i.test(entry.name)).length);\n const glyphs = pageInfos.reduce((count, page) => count + page.glyphs, 0);\n appendMeta(meta, \"Glyphs\", glyphs);\n const pageSizes = formatXpsPageSizes(pageInfos);\n if (pageSizes) {\n appendMeta(meta, \"页面尺寸\", pageSizes);\n }\n const pageObjects = formatXpsPageObjects(pageInfos);\n if (pageObjects) {\n appendMeta(meta, \"页面对象\", pageObjects);\n }\n return meta;\n}\n\nfunction parseXpsPageInfo(xml: string): XpsPageInfo {\n const fallback = parseXpsPageInfoByRegex(xml);\n const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n if (doc.querySelector(\"parsererror\")) {\n return fallback;\n }\n const root = doc.documentElement;\n const elements = Array.from(doc.getElementsByTagName(\"*\"));\n return {\n width: finiteNumber(getXmlAttribute(root, \"Width\"), fallback.width),\n height: finiteNumber(getXmlAttribute(root, \"Height\"), fallback.height),\n glyphs: elements.filter((element) => element.localName === \"Glyphs\").length,\n imageBrushes: elements.filter((element) => element.localName === \"ImageBrush\").length,\n canvases: elements.filter((element) => element.localName === \"Canvas\").length,\n paths: elements.filter((element) => element.localName === \"Path\").length\n };\n}\n\nfunction parseXpsPageInfoByRegex(xml: string): XpsPageInfo {\n return {\n width: finiteNumber(firstAttributeValue(xml, \"Width\"), undefined),\n height: finiteNumber(firstAttributeValue(xml, \"Height\"), undefined),\n glyphs: countMatches(xml, /<[\\w:.-]*Glyphs\\b/g),\n imageBrushes: countMatches(xml, /<[\\w:.-]*ImageBrush\\b/g),\n canvases: countMatches(xml, /<[\\w:.-]*Canvas\\b/g),\n paths: countMatches(xml, /<[\\w:.-]*Path\\b/g)\n };\n}\n\nfunction formatXpsPageSizes(pageInfos: XpsPageInfo[]): string {\n const counts = new Map<string, number>();\n for (const page of pageInfos) {\n if (!Number.isFinite(page.width) || !Number.isFinite(page.height)) {\n continue;\n }\n const key = `${Math.round(page.width as number)} x ${Math.round(page.height as number)}`;\n counts.set(key, (counts.get(key) || 0) + 1);\n }\n return [...counts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 4)\n .map(([size, count]) => (count > 1 ? `${size} (${count})` : size))\n .join(\", \");\n}\n\nfunction formatXpsPageObjects(pageInfos: XpsPageInfo[]): string {\n const totals = pageInfos.reduce(\n (result, page) => ({\n imageBrushes: result.imageBrushes + page.imageBrushes,\n canvases: result.canvases + page.canvases,\n paths: result.paths + page.paths\n }),\n { imageBrushes: 0, canvases: 0, paths: 0 }\n );\n return [\n totals.imageBrushes ? `ImageBrush ${totals.imageBrushes}` : \"\",\n totals.canvases ? `Canvas ${totals.canvases}` : \"\",\n totals.paths ? `Path ${totals.paths}` : \"\"\n ].filter(Boolean).join(\", \");\n}\n\nfunction renderXpsPage(xml: string, path: string, index: number): HTMLElement {\n const page = document.createElement(\"article\");\n page.className = \"ofv-xps-page\";\n const heading = document.createElement(\"h4\");\n heading.textContent = `Page ${index + 1}`;\n const pathMeta = document.createElement(\"span\");\n pathMeta.textContent = path;\n\n const text = document.createElement(\"div\");\n text.className = \"ofv-xps-text\";\n const fragments = extractXpsText(xml);\n if (fragments.length > 0) {\n for (const fragment of fragments) {\n const paragraph = document.createElement(\"p\");\n paragraph.textContent = fragment;\n text.append(paragraph);\n }\n } else {\n const empty = document.createElement(\"p\");\n empty.textContent = \"这一页未提取到 Glyphs 文本。\";\n text.append(empty);\n }\n\n page.append(heading, pathMeta, text);\n return page;\n}\n\nfunction extractXpsText(xml: string): string[] {\n const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n if (doc.querySelector(\"parsererror\")) {\n return extractXpsTextByRegex(xml);\n }\n return Array.from(doc.getElementsByTagName(\"*\"))\n .filter((element) => element.localName === \"Glyphs\")\n .map((glyph) => getXmlAttribute(glyph, \"UnicodeString\") || \"\")\n .map((value) => value.replace(/\\s+/g, \" \").trim())\n .filter(Boolean);\n}\n\nfunction extractXpsTextByRegex(xml: string): string[] {\n return [...xml.matchAll(/\\bUnicodeString=(?:\"([^\"]*)\"|'([^']*)')/g)]\n .map((match) => decodeXml(match[1] || match[2] || \"\"))\n .map((value) => value.replace(/\\s+/g, \" \").trim())\n .filter(Boolean);\n}\n\nfunction firstAttributeValue(xml: string, name: string): string | undefined {\n const match = xml.match(new RegExp(`\\\\b${name}=(?:\"([^\"]*)\"|'([^']*)')`));\n return match?.[1] || match?.[2];\n}\n\nfunction countMatches(value: string, pattern: RegExp): number {\n return [...value.matchAll(pattern)].length;\n}\n\nfunction renderXpsFallback(panel: HTMLElement, error: unknown): void {\n panel.replaceChildren();\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n const title = document.createElement(\"strong\");\n title.textContent = \"XPS 解析失败\";\n const meta = document.createElement(\"span\");\n meta.textContent = error instanceof Error ? error.message : \"文件可能已损坏,或不是有效的 XPS/OXPS 包。\";\n fallback.append(title, meta);\n panel.append(fallback);\n}\n\nfunction appendMeta(parent: HTMLElement, label: string, value: string | number): void {\n const row = document.createElement(\"div\");\n row.className = \"ofv-meta-row\";\n const key = document.createElement(\"span\");\n key.textContent = label;\n const content = document.createElement(\"strong\");\n content.textContent = String(value);\n row.append(key, content);\n parent.append(row);\n}\n\nfunction getXmlAttribute(element: Element, localName: string): string | null {\n const direct = element.getAttribute(localName);\n if (direct !== null) {\n return direct;\n }\n for (const attribute of Array.from(element.attributes)) {\n if (attribute.localName === localName) {\n return attribute.value;\n }\n }\n return null;\n}\n\nfunction finiteNumber(value: unknown, fallback: number | undefined): number | undefined {\n const parsed = typeof value === \"number\" ? value : Number(value);\n return Number.isFinite(parsed) ? parsed : fallback;\n}\n\nfunction decodeXml(value: string): string {\n return value\n .replaceAll(\"&lt;\", \"<\")\n .replaceAll(\"&gt;\", \">\")\n .replaceAll(\"&amp;\", \"&\")\n .replaceAll(\"&quot;\", '\"')\n .replaceAll(\"&apos;\", \"'\");\n}\n","import JSZip from \"jszip\";\nimport DOMPurify from \"dompurify\";\nimport type { WorkBook } from \"xlsx\";\nimport type { PreviewPlugin } from \"../types\";\nimport { createPanel, createSection, decodeTextBuffer, readArrayBuffer, resolveFormat } from \"./utils\";\n\nconst wordExtensions = new Set([\"docx\", \"docm\", \"doc\", \"dotx\", \"dotm\", \"dot\", \"rtf\", \"odt\", \"fodt\", \"wps\"]);\nconst sheetExtensions = new Set([\"xlsx\", \"xls\", \"xlsm\", \"xlsb\", \"xlt\", \"xltx\", \"xltm\", \"csv\", \"tsv\", \"ods\", \"fods\", \"numbers\", \"et\"]);\nconst presentationExtensions = new Set([\"pptx\", \"pptm\", \"ppt\", \"pps\", \"ppsx\", \"ppsm\", \"potx\", \"potm\", \"odp\", \"fodp\", \"key\", \"dps\"]);\nconst packagedOfficeCandidates = new Set([\"wps\", \"et\", \"dps\", \"numbers\", \"key\"]);\nconst SHEET_WINDOW_ROWS = 200;\nconst SHEET_WINDOW_COLUMNS = 80;\nconst PPTX_REL_NS = \"http://schemas.openxmlformats.org/package/2006/relationships\";\nconst officeMimeTypes = new Set([\n \"application/msword\",\n \"application/rtf\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n \"application/vnd.ms-word.document.macroenabled.12\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.template\",\n \"application/vnd.ms-word.template.macroenabled.12\",\n \"application/vnd.oasis.opendocument.text\",\n \"application/vnd.oasis.opendocument.text-flat-xml\",\n \"application/vnd.ms-works\",\n \"application/vnd.ms-excel\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.template\",\n \"application/vnd.ms-excel.sheet.macroenabled.12\",\n \"application/vnd.ms-excel.sheet.binary.macroenabled.12\",\n \"application/vnd.ms-excel.template.macroenabled.12\",\n \"application/vnd.oasis.opendocument.spreadsheet\",\n \"application/vnd.oasis.opendocument.spreadsheet-flat-xml\",\n \"application/vnd.apple.numbers\",\n \"application/vnd.ms-powerpoint\",\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n \"application/vnd.ms-powerpoint.presentation.macroenabled.12\",\n \"application/vnd.openxmlformats-officedocument.presentationml.slideshow\",\n \"application/vnd.ms-powerpoint.slideshow.macroenabled.12\",\n \"application/vnd.openxmlformats-officedocument.presentationml.template\",\n \"application/vnd.ms-powerpoint.template.macroenabled.12\",\n \"application/vnd.oasis.opendocument.presentation\",\n \"application/vnd.oasis.opendocument.presentation-flat-xml\",\n \"application/vnd.apple.keynote\"\n]);\nconst officeMimeFormatMap: Record<string, string> = {\n \"application/msword\": \"doc\",\n \"application/rtf\": \"rtf\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\": \"docx\",\n \"application/vnd.ms-word.document.macroenabled.12\": \"docm\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.template\": \"dotx\",\n \"application/vnd.ms-word.template.macroenabled.12\": \"dotm\",\n \"application/vnd.oasis.opendocument.text\": \"odt\",\n \"application/vnd.oasis.opendocument.text-flat-xml\": \"fodt\",\n \"application/vnd.ms-works\": \"wps\",\n \"application/vnd.ms-excel\": \"xls\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\": \"xlsx\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.template\": \"xltx\",\n \"application/vnd.ms-excel.sheet.macroenabled.12\": \"xlsm\",\n \"application/vnd.ms-excel.sheet.binary.macroenabled.12\": \"xlsb\",\n \"application/vnd.ms-excel.template.macroenabled.12\": \"xltm\",\n \"application/vnd.oasis.opendocument.spreadsheet\": \"ods\",\n \"application/vnd.oasis.opendocument.spreadsheet-flat-xml\": \"fods\",\n \"application/vnd.apple.numbers\": \"numbers\",\n \"application/vnd.ms-powerpoint\": \"ppt\",\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\": \"pptx\",\n \"application/vnd.ms-powerpoint.presentation.macroenabled.12\": \"pptm\",\n \"application/vnd.openxmlformats-officedocument.presentationml.slideshow\": \"ppsx\",\n \"application/vnd.ms-powerpoint.slideshow.macroenabled.12\": \"ppsm\",\n \"application/vnd.openxmlformats-officedocument.presentationml.template\": \"potx\",\n \"application/vnd.ms-powerpoint.template.macroenabled.12\": \"potm\",\n \"application/vnd.oasis.opendocument.presentation\": \"odp\",\n \"application/vnd.oasis.opendocument.presentation-flat-xml\": \"fodp\",\n \"application/vnd.apple.keynote\": \"key\"\n};\n\ntype LegacyOfficeTextSource = \"ascii\" | \"utf16\";\n\ntype PresentationSlideInsight = {\n title: string;\n layout?: string;\n textCount: number;\n imageCount: number;\n notesCount: number;\n hasTransition: boolean;\n animationCount: number;\n sampleTexts: string[];\n};\n\ntype PresentationInsight = {\n title: string;\n slideCount: number;\n imageCount: number;\n notesCount: number;\n transitionCount: number;\n animationCount: number;\n layouts: string[];\n slides: PresentationSlideInsight[];\n};\n\ntype IWorkMetadata = {\n title?: string;\n author?: string;\n company?: string;\n subject?: string;\n keywords?: string[];\n created?: string;\n modified?: string;\n};\n\nexport function officePlugin(): PreviewPlugin {\n return {\n name: \"office\",\n match(file) {\n return (\n wordExtensions.has(file.extension) ||\n sheetExtensions.has(file.extension) ||\n presentationExtensions.has(file.extension) ||\n officeMimeTypes.has(file.mimeType)\n );\n },\n async render(ctx) {\n const panel = createPanel(\"ofv-office\");\n ctx.viewport.append(panel);\n const extension = resolveFormat(ctx.file, officeMimeFormatMap);\n const arrayBuffer = await readArrayBuffer(ctx.file);\n const packageFormat = shouldSniffPackagedOffice(extension) ? await detectPackagedOfficeFormat(arrayBuffer) : undefined;\n let disposeDocxFit: (() => void) | undefined;\n\n if (packageFormat === \"docx\" && !fileIsDocx(extension)) {\n disposeDocxFit = await renderDocx(panel, arrayBuffer);\n } else if (packageFormat === \"xlsx\" && !sheetExtensions.has(extension)) {\n await renderSheet(panel, arrayBuffer, \"xlsx\");\n } else if (packageFormat === \"pptx\" && ![\"pptx\", \"pptm\", \"ppsx\", \"ppsm\", \"potx\", \"potm\"].includes(extension)) {\n await renderPptx(panel, arrayBuffer);\n } else if (fileIsDocx(extension)) {\n disposeDocxFit = await renderDocx(panel, arrayBuffer);\n } else if (extension === \"rtf\") {\n renderPlainDocument(panel, \"RTF 文档\", rtfToText(await readTextFromBuffer(arrayBuffer)));\n } else if (extension === \"odt\") {\n await renderOdt(panel, arrayBuffer);\n } else if (extension === \"fodt\") {\n renderOpenDocumentXml(panel, \"FODT 文档\", await readTextFromBuffer(arrayBuffer));\n } else if (extension === \"fods\") {\n renderFlatOds(panel, await readTextFromBuffer(arrayBuffer));\n } else if (packagedOfficeCandidates.has(extension) && (await renderPackagedOfficePreview(panel, arrayBuffer, extension))) {\n // Rendered by package sniffing.\n } else if (sheetExtensions.has(extension)) {\n await renderSheet(panel, arrayBuffer, extension);\n } else if ([\"pptx\", \"pptm\", \"ppsx\", \"ppsm\", \"potx\", \"potm\"].includes(extension)) {\n await renderPptx(panel, arrayBuffer);\n } else if (extension === \"odp\") {\n await renderOdp(panel, arrayBuffer);\n } else if (extension === \"fodp\") {\n renderOpenDocumentPresentationXml(panel, await readTextFromBuffer(arrayBuffer));\n } else if (isLegacyOfficeBinary(extension)) {\n renderLegacyOfficeBinary(panel, extension, arrayBuffer);\n } else {\n renderUnsupportedOffice(panel, extension || ctx.file.extension || \"office\");\n }\n\n return {\n destroy() {\n disposeDocxFit?.();\n panel.remove();\n }\n };\n }\n };\n}\n\nfunction fileIsDocx(extension: string): boolean {\n return extension === \"docx\" || extension === \"docm\" || extension === \"dotx\" || extension === \"dotm\";\n}\n\nfunction shouldSniffPackagedOffice(extension: string): boolean {\n return isLegacyOfficeBinary(extension) || packagedOfficeCandidates.has(extension) || extension === \"\";\n}\n\nasync function detectPackagedOfficeFormat(arrayBuffer: ArrayBuffer): Promise<\"docx\" | \"xlsx\" | \"pptx\" | undefined> {\n try {\n const zip = await JSZip.loadAsync(arrayBuffer);\n const entries = Object.values(zip.files).filter((entry) => !entry.dir);\n const hasEntry = (path: string) => entries.some((entry) => entry.name.toLowerCase() === path.toLowerCase());\n if (hasEntry(\"word/document.xml\")) {\n return \"docx\";\n }\n if (hasEntry(\"xl/workbook.xml\")) {\n return \"xlsx\";\n }\n if (hasEntry(\"ppt/presentation.xml\")) {\n return \"pptx\";\n }\n } catch {\n return undefined;\n }\n return undefined;\n}\n\nasync function renderDocx(panel: HTMLElement, arrayBuffer: ArrayBuffer): Promise<() => void> {\n const content = document.createElement(\"div\");\n content.className = \"ofv-docx-document\";\n panel.append(content);\n\n try {\n const docxPreview = await import(\"docx-preview\");\n await docxPreview.renderAsync(arrayBuffer, content, content, {\n className: \"ofv-docx\",\n inWrapper: true,\n breakPages: true,\n ignoreWidth: false,\n ignoreHeight: false,\n ignoreFonts: false,\n renderHeaders: true,\n renderFooters: true,\n renderFootnotes: true,\n renderEndnotes: true,\n renderComments: true,\n renderAltChunks: true,\n experimental: true,\n useBase64URL: true\n });\n normalizeDocxLayout(content);\n return fitDocxPages(content);\n } catch (error) {\n content.replaceChildren();\n const fallbackNote = document.createElement(\"div\");\n fallbackNote.className = \"ofv-docx-fallback-note\";\n fallbackNote.textContent = \"高保真 DOCX 渲染失败,已切换为基础内容预览。\";\n content.append(fallbackNote);\n try {\n await renderDocxWithMammoth(content, arrayBuffer);\n } catch (fallbackError) {\n await renderDocxTextFallback(content, arrayBuffer);\n console.warn(\"DOCX content fallback failed, used raw OpenXML text extraction:\", fallbackError);\n }\n console.warn(\"DOCX layout preview failed, fell back to Mammoth:\", error);\n }\n return () => undefined;\n}\n\nfunction normalizeDocxLayout(container: HTMLElement): void {\n const pages = container.querySelectorAll<HTMLElement>(\"section.ofv-docx\");\n for (const page of pages) {\n for (const element of page.querySelectorAll<HTMLElement>(\"[style*='line-height']\")) {\n const lineHeight = parseCssLineHeight(element.style.lineHeight);\n if (lineHeight > 0 && lineHeight < 1) {\n element.style.lineHeight = \"1.2\";\n }\n }\n }\n}\n\nfunction parseCssLineHeight(value: string): number {\n const trimmed = value.trim();\n if (!trimmed || trimmed === \"normal\") {\n return 0;\n }\n if (trimmed.endsWith(\"%\")) {\n const parsedPercent = Number.parseFloat(trimmed);\n return Number.isFinite(parsedPercent) ? parsedPercent / 100 : 0;\n }\n const parsed = Number.parseFloat(trimmed);\n return Number.isFinite(parsed) ? parsed : 0;\n}\n\nfunction fitDocxPages(container: HTMLElement): () => void {\n const wrapper = container.querySelector<HTMLElement>(\".ofv-docx-wrapper\");\n if (!wrapper) {\n return () => undefined;\n }\n\n const update = () => {\n const frames = ensureDocxPageFrames(wrapper);\n if (frames.length === 0) {\n wrapper.style.removeProperty(\"--ofv-docx-scale\");\n return;\n }\n\n const availableWidth = Math.max(1, container.clientWidth - 48);\n const pageWidth = Math.max(\n 1,\n ...frames.map(({ page }) => {\n const rectWidth = page.getBoundingClientRect().width;\n return page.offsetWidth || rectWidth || parseCssPixelValue(page.style.width) || 794;\n })\n );\n const scale = Math.min(1, Math.max(0.35, availableWidth / pageWidth));\n wrapper.style.setProperty(\"--ofv-docx-scale\", formatCssNumber(scale));\n wrapper.style.setProperty(\"--ofv-docx-page-width\", `${pageWidth}px`);\n\n for (const { frame, page } of frames) {\n const pageHeight = page.offsetHeight || page.getBoundingClientRect().height || parseCssPixelValue(page.style.height);\n if (pageHeight > 0) {\n frame.style.height = `${Math.ceil(pageHeight * scale)}px`;\n }\n }\n };\n\n update();\n const timers = [0, 80, 240].map((delay) => window.setTimeout(update, delay));\n\n if (typeof ResizeObserver === \"undefined\") {\n window.addEventListener(\"resize\", update);\n return () => {\n timers.forEach((timer) => window.clearTimeout(timer));\n window.removeEventListener(\"resize\", update);\n };\n }\n\n const observer = new ResizeObserver(update);\n observer.observe(container);\n observer.observe(wrapper);\n return () => {\n timers.forEach((timer) => window.clearTimeout(timer));\n observer.disconnect();\n };\n}\n\nfunction ensureDocxPageFrames(wrapper: HTMLElement): Array<{ frame: HTMLElement; page: HTMLElement }> {\n const pages = Array.from(wrapper.querySelectorAll<HTMLElement>(\"section.ofv-docx\"));\n return pages.map((page) => {\n const parent = page.parentElement;\n if (parent?.classList.contains(\"ofv-docx-page-frame\")) {\n return { frame: parent, page };\n }\n const frame = document.createElement(\"div\");\n frame.className = \"ofv-docx-page-frame\";\n page.before(frame);\n frame.append(page);\n return { frame, page };\n });\n}\n\nfunction parseCssPixelValue(value: string): number {\n const parsed = Number.parseFloat(value);\n return Number.isFinite(parsed) ? parsed : 0;\n}\n\nfunction formatCssNumber(value: number): string {\n return Number.isFinite(value) ? value.toFixed(4).replace(/0+$/, \"\").replace(/\\.$/, \"\") : \"1\";\n}\n\nasync function renderDocxTextFallback(container: HTMLElement, arrayBuffer: ArrayBuffer): Promise<void> {\n const article = document.createElement(\"article\");\n article.className = \"ofv-document\";\n\n try {\n const zip = await JSZip.loadAsync(arrayBuffer);\n const documentXml = await zip.file(\"word/document.xml\")?.async(\"text\");\n const paragraphs = documentXml ? extractWordParagraphs(documentXml) : [];\n if (paragraphs.length > 0) {\n for (const paragraphText of paragraphs) {\n const paragraph = document.createElement(\"p\");\n paragraph.textContent = paragraphText;\n article.append(paragraph);\n }\n } else {\n const empty = document.createElement(\"p\");\n empty.textContent = \"DOCX 内容解析失败,未提取到可展示文本。\";\n article.append(empty);\n }\n } catch {\n const empty = document.createElement(\"p\");\n empty.textContent = \"DOCX 内容解析失败,文件可能已损坏或不是有效的 DOCX。\";\n article.append(empty);\n }\n\n container.append(article);\n}\n\nasync function renderDocxWithMammoth(container: HTMLElement, arrayBuffer: ArrayBuffer): Promise<void> {\n const mammoth = await import(\"mammoth\");\n const result = await mammoth.convertToHtml(\n { arrayBuffer },\n {\n convertImage: mammoth.images.imgElement(async (image) => ({\n src: `data:${image.contentType};base64,${await image.read(\"base64\")}`\n }))\n }\n );\n const content = document.createElement(\"article\");\n content.className = \"ofv-document\";\n content.innerHTML = sanitizeHtml(result.value || \"<p>未解析到可展示内容。</p>\");\n container.append(content);\n\n if (result.messages.length > 0) {\n const notes = document.createElement(\"details\");\n notes.className = \"ofv-details\";\n const summary = document.createElement(\"summary\");\n summary.textContent = `解析提示 ${result.messages.length}`;\n const list = document.createElement(\"ul\");\n for (const message of result.messages) {\n const item = document.createElement(\"li\");\n item.textContent = message.message;\n list.append(item);\n }\n notes.append(summary, list);\n container.append(notes);\n }\n}\n\nasync function renderOdt(panel: HTMLElement, arrayBuffer: ArrayBuffer): Promise<void> {\n const zip = await JSZip.loadAsync(arrayBuffer);\n const content = zip.file(\"content.xml\");\n if (!content) {\n renderPlainDocument(panel, \"ODT 文档\", \"未找到 content.xml。\");\n return;\n }\n renderOpenDocumentXml(panel, \"ODT 文档\", await content.async(\"text\"));\n}\n\nfunction renderOpenDocumentXml(panel: HTMLElement, title: string, xml: string): void {\n const section = createSection(title);\n const article = document.createElement(\"article\");\n article.className = \"ofv-document\";\n const blocks = extractOpenDocumentBlocks(xml);\n if (blocks.length > 0) {\n for (const block of blocks) {\n const paragraph = document.createElement(\"p\");\n paragraph.textContent = block;\n article.append(paragraph);\n }\n } else {\n const empty = document.createElement(\"p\");\n empty.textContent = \"未提取到可展示文本。\";\n article.append(empty);\n }\n section.append(article);\n panel.append(section);\n}\n\nfunction renderPlainDocument(panel: HTMLElement, title: string, text: string): void {\n const section = createSection(title);\n const pre = document.createElement(\"pre\");\n pre.className = \"ofv-text-block\";\n pre.textContent = text || \"未提取到可展示文本。\";\n section.append(pre);\n panel.append(section);\n}\n\nasync function renderSheet(\n panel: HTMLElement,\n arrayBuffer: ArrayBuffer,\n extension: string\n): Promise<void> {\n const xlsx = await import(\"xlsx\");\n let workbook: WorkBook;\n try {\n workbook =\n extension === \"csv\" || extension === \"tsv\"\n ? (xlsx.read(decodeTextBuffer(arrayBuffer), { type: \"string\", FS: extension === \"tsv\" ? \"\\t\" : \",\" }) as WorkBook)\n : (xlsx.read(arrayBuffer, { type: \"array\" }) as WorkBook);\n } catch (error) {\n if (isLegacyOfficeBinary(extension)) {\n renderLegacyOfficeBinary(panel, extension, arrayBuffer, `表格解析失败:${normalizeOfficeError(error)}`);\n return;\n }\n renderSheetFallback(panel, extension, normalizeOfficeError(error));\n return;\n }\n const chartPreviews = await readWorkbookCharts(arrayBuffer).catch(() => []);\n const tabs = document.createElement(\"div\");\n tabs.className = \"ofv-tabs\";\n tabs.setAttribute(\"role\", \"tablist\");\n const content = document.createElement(\"div\");\n content.className = \"ofv-sheet\";\n content.setAttribute(\"role\", \"tabpanel\");\n const buttons = new Map<string, HTMLButtonElement>();\n\n const renderSheetByName = (sheetName: string, sheetIndex: number) => {\n content.replaceChildren();\n buttons.forEach((button, name) => {\n const active = name === sheetName;\n button.classList.toggle(\"is-active\", active);\n button.setAttribute(\"aria-selected\", String(active));\n });\n content.setAttribute(\"aria-label\", sheetName);\n\n const heading = document.createElement(\"h3\");\n heading.textContent = sheetName;\n const sheet = workbook.Sheets[sheetName];\n const range = xlsx.utils.decode_range(sheet[\"!ref\"] || \"A1:A1\");\n const rowCount = range.e.r - range.s.r + 1;\n const columnCount = range.e.c - range.s.c + 1;\n const formulaRows = collectFormulaRows(sheet, range, xlsx.utils.encode_cell);\n\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-sheet-summary\";\n summary.textContent = `${rowCount} 行 x ${columnCount} 列${\n formulaRows.length > 0 ? `,包含 ${formulaRows.length} 个公式单元格` : \"\"\n }`;\n\n const tableWrapper = document.createElement(\"div\");\n tableWrapper.className = \"ofv-table-scroll\";\n const viewport = createSheetViewport(rowCount, columnCount);\n const windowControls = createSheetWindowControls(viewport, () => renderTableWindow());\n const renderTableWindow = () => {\n tableWrapper.replaceChildren(\n createWorkbookSheetTable(\n sheet,\n range,\n sheetIndex,\n viewport,\n xlsx.utils.encode_cell,\n xlsx.utils.format_cell\n )\n );\n windowControls?.update();\n };\n\n content.append(heading, summary);\n if (windowControls) {\n content.append(windowControls.element);\n }\n content.append(tableWrapper);\n renderTableWindow();\n\n if (formulaRows.length > 0) {\n const details = document.createElement(\"details\");\n details.className = \"ofv-details ofv-formula-list\";\n const detailsSummary = document.createElement(\"summary\");\n detailsSummary.textContent = \"公式明细\";\n const list = document.createElement(\"ul\");\n for (const item of formulaRows.slice(0, 200)) {\n const row = document.createElement(\"li\");\n row.textContent = `${item.address}: ${item.formula}`;\n list.append(row);\n }\n if (formulaRows.length > 200) {\n const row = document.createElement(\"li\");\n row.textContent = `还有 ${formulaRows.length - 200} 个公式未展示。`;\n list.append(row);\n }\n details.append(detailsSummary, list);\n content.append(details);\n }\n };\n\n if (workbook.SheetNames.length === 0) {\n content.textContent = extension === \"numbers\" ? \"Numbers 文件需要服务端转换后高保真预览。\" : \"未解析到表格。\";\n } else {\n for (const [index, sheetName] of workbook.SheetNames.entries()) {\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.setAttribute(\"role\", \"tab\");\n button.setAttribute(\"aria-selected\", \"false\");\n button.textContent = sheetName;\n button.title = sheetName;\n button.addEventListener(\"click\", () => renderSheetByName(sheetName, index));\n buttons.set(sheetName, button);\n tabs.append(button);\n if (index === 0) {\n renderSheetByName(sheetName, index);\n }\n }\n }\n\n panel.append(tabs, content);\n if (chartPreviews.length > 0) {\n panel.append(renderChartPreviewSection(chartPreviews));\n }\n}\n\nfunction renderSheetFallback(panel: HTMLElement, extension: string, detail: string): void {\n const section = createSection(\"表格解析失败\");\n const title = document.createElement(\"p\");\n title.textContent = `.${extension || \"sheet\"} 文件无法解析为可预览表格。`;\n const meta = document.createElement(\"p\");\n meta.textContent = detail;\n const support = document.createElement(\"p\");\n support.textContent = \"请确认文件未加密、未损坏,或先转换为 XLSX/CSV/ODS 后再预览。\";\n section.append(title, meta, support);\n panel.append(section);\n}\n\ntype ChartPreview = {\n name: string;\n type: string;\n title: string;\n categories: string[];\n series: Array<{ name: string; values: number[] }>;\n};\n\ntype ParsedSheet = {\n name: string;\n rows: string[][];\n formulas: Array<{ address: string; formula: string }>;\n};\n\nfunction renderFlatOds(panel: HTMLElement, xml: string): void {\n const sheets = parseFlatOds(xml);\n renderParsedSheets(panel, sheets, \"FODS 文件未解析到表格。\");\n}\n\nfunction renderParsedSheets(panel: HTMLElement, sheets: ParsedSheet[], emptyMessage: string): void {\n const tabs = document.createElement(\"div\");\n tabs.className = \"ofv-tabs\";\n tabs.setAttribute(\"role\", \"tablist\");\n const content = document.createElement(\"div\");\n content.className = \"ofv-sheet\";\n content.setAttribute(\"role\", \"tabpanel\");\n const buttons = new Map<string, HTMLButtonElement>();\n\n const renderSheetByIndex = (sheet: ParsedSheet, sheetIndex: number) => {\n content.replaceChildren();\n buttons.forEach((button, name) => {\n const active = name === sheet.name;\n button.classList.toggle(\"is-active\", active);\n button.setAttribute(\"aria-selected\", String(active));\n });\n content.setAttribute(\"aria-label\", sheet.name);\n\n const heading = document.createElement(\"h3\");\n heading.textContent = sheet.name;\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-sheet-summary\";\n const rowCount = sheet.rows.length;\n const columnCount = Math.max(0, ...sheet.rows.map((row) => row.length));\n summary.textContent = `${rowCount} 行 x ${columnCount} 列${\n sheet.formulas.length > 0 ? `,包含 ${sheet.formulas.length} 个公式单元格` : \"\"\n }`;\n\n const tableWrapper = document.createElement(\"div\");\n tableWrapper.className = \"ofv-table-scroll\";\n const viewport = createSheetViewport(rowCount, columnCount);\n const windowControls = createSheetWindowControls(viewport, () => renderTableWindow());\n const renderTableWindow = () => {\n tableWrapper.replaceChildren(createParsedSheetTable(sheet, sheetIndex, viewport));\n windowControls?.update();\n };\n\n content.append(heading, summary);\n if (windowControls) {\n content.append(windowControls.element);\n }\n content.append(tableWrapper);\n renderTableWindow();\n\n if (sheet.formulas.length > 0) {\n const details = document.createElement(\"details\");\n details.className = \"ofv-details ofv-formula-list\";\n const detailsSummary = document.createElement(\"summary\");\n detailsSummary.textContent = \"公式明细\";\n const list = document.createElement(\"ul\");\n for (const item of sheet.formulas.slice(0, 200)) {\n const row = document.createElement(\"li\");\n row.textContent = `${item.address}: ${item.formula}`;\n list.append(row);\n }\n if (sheet.formulas.length > 200) {\n const row = document.createElement(\"li\");\n row.textContent = `还有 ${sheet.formulas.length - 200} 个公式未展示。`;\n list.append(row);\n }\n details.append(detailsSummary, list);\n content.append(details);\n }\n };\n\n if (sheets.length === 0) {\n content.textContent = emptyMessage;\n } else {\n for (const [index, sheet] of sheets.entries()) {\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.setAttribute(\"role\", \"tab\");\n button.setAttribute(\"aria-selected\", \"false\");\n button.textContent = sheet.name;\n button.title = sheet.name;\n button.addEventListener(\"click\", () => renderSheetByIndex(sheet, index));\n buttons.set(sheet.name, button);\n tabs.append(button);\n if (index === 0) {\n renderSheetByIndex(sheet, index);\n }\n }\n }\n\n panel.append(tabs, content);\n}\n\nasync function readWorkbookCharts(arrayBuffer: ArrayBuffer): Promise<ChartPreview[]> {\n const zip = await JSZip.loadAsync(arrayBuffer);\n const chartEntries = Object.values(zip.files)\n .filter((entry) => !entry.dir && /^xl\\/charts\\/chart\\d+\\.xml$/i.test(entry.name))\n .sort((a, b) => a.name.localeCompare(b.name));\n const charts: ChartPreview[] = [];\n for (const [index, entry] of chartEntries.entries()) {\n const xml = await entry.async(\"text\");\n const chart = parseChartXml(xml, entry.name.split(\"/\").pop() || `chart${index + 1}.xml`);\n if (chart) {\n charts.push(chart);\n }\n }\n return charts;\n}\n\nfunction parseChartXml(xml: string, fallbackName: string): ChartPreview | null {\n const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n if (doc.querySelector(\"parsererror\")) {\n return null;\n }\n\n const type = detectChartType(doc);\n const title = textFromFirst(doc, \"title\") || fallbackName.replace(/\\.xml$/i, \"\");\n const seriesElements = Array.from(doc.getElementsByTagName(\"*\")).filter((element) => element.localName === \"ser\");\n const series = seriesElements\n .map((element, index) => parseChartSeries(element, index))\n .filter((item): item is { name: string; values: number[]; categories: string[] } => item.values.length > 0);\n\n if (series.length === 0) {\n return null;\n }\n\n return {\n name: fallbackName,\n type,\n title,\n categories: series.find((item) => item.categories.length > 0)?.categories || [],\n series: series.map((item) => ({ name: item.name, values: item.values }))\n };\n}\n\nfunction detectChartType(doc: Document): string {\n const chartType = Array.from(doc.getElementsByTagName(\"*\")).find(\n (element) => element.localName.endsWith(\"Chart\") && element.localName !== \"chart\"\n )?.localName;\n if (!chartType) {\n return \"chart\";\n }\n return chartType.replace(/Chart$/i, \"\").toLowerCase();\n}\n\nfunction parseChartSeries(\n element: Element,\n index: number\n): { name: string; values: number[]; categories: string[] } {\n return {\n name: textFromFirst(element, \"tx\") || `Series ${index + 1}`,\n values: numbersFromFirst(element, \"val\"),\n categories: stringsFromFirst(element, \"cat\")\n };\n}\n\nfunction renderChartPreviewSection(charts: ChartPreview[]): HTMLElement {\n const section = createSection(\"表格图表预览\");\n const grid = document.createElement(\"div\");\n grid.className = \"ofv-chart-grid\";\n for (const chart of charts) {\n grid.append(renderChartCard(chart));\n }\n section.append(grid);\n return section;\n}\n\nfunction renderChartCard(chart: ChartPreview): HTMLElement {\n const card = document.createElement(\"article\");\n card.className = \"ofv-chart-card\";\n\n const header = document.createElement(\"header\");\n const title = document.createElement(\"h4\");\n title.textContent = chart.title;\n const meta = document.createElement(\"span\");\n meta.textContent = `${chart.type} · ${chart.series.length} 个系列`;\n header.append(title, meta);\n\n const svg = renderChartSvg(chart);\n const details = document.createElement(\"details\");\n details.className = \"ofv-details ofv-chart-data\";\n const summary = document.createElement(\"summary\");\n summary.textContent = \"数据摘要\";\n const list = document.createElement(\"ul\");\n for (const item of chart.series) {\n const row = document.createElement(\"li\");\n row.textContent = `${item.name}: ${item.values.slice(0, 12).join(\", \")}${\n item.values.length > 12 ? ` ... 共 ${item.values.length} 项` : \"\"\n }`;\n list.append(row);\n }\n details.append(summary, list);\n card.append(header, svg, details);\n return card;\n}\n\nfunction renderChartSvg(chart: ChartPreview): SVGSVGElement {\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svg.setAttribute(\"viewBox\", \"0 0 640 260\");\n svg.setAttribute(\"role\", \"img\");\n svg.setAttribute(\"aria-label\", chart.title);\n svg.classList.add(\"ofv-chart-svg\");\n\n const allValues = chart.series.flatMap((item) => item.values).filter((value) => Number.isFinite(value));\n const max = Math.max(1, ...allValues);\n const min = Math.min(0, ...allValues);\n const span = max - min || 1;\n const colors = [\"#2563eb\", \"#059669\", \"#d97706\", \"#dc2626\", \"#7c3aed\"];\n const plot = { x: 48, y: 24, width: 552, height: 178 };\n\n appendSvg(svg, \"line\", { x1: plot.x, y1: plot.y, x2: plot.x, y2: plot.y + plot.height, class: \"ofv-chart-axis\" });\n appendSvg(svg, \"line\", {\n x1: plot.x,\n y1: plot.y + plot.height,\n x2: plot.x + plot.width,\n y2: plot.y + plot.height,\n class: \"ofv-chart-axis\"\n });\n\n chart.series.forEach((series, seriesIndex) => {\n const color = colors[seriesIndex % colors.length];\n const step = series.values.length > 1 ? plot.width / (series.values.length - 1) : plot.width;\n const points = series.values.map((value, index) => ({\n x: plot.x + index * step,\n y: plot.y + plot.height - ((value - min) / span) * plot.height\n }));\n\n if (chart.type.includes(\"bar\") || chart.type.includes(\"col\")) {\n const barWidth = Math.max(4, Math.min(28, step * 0.6)) / Math.max(1, chart.series.length);\n points.forEach((point, index) => {\n const zeroY = plot.y + plot.height - ((0 - min) / span) * plot.height;\n const x = point.x - (barWidth * chart.series.length) / 2 + seriesIndex * barWidth;\n appendSvg(svg, \"rect\", {\n x,\n y: Math.min(point.y, zeroY),\n width: barWidth,\n height: Math.max(1, Math.abs(zeroY - point.y)),\n fill: color,\n \"data-index\": index\n });\n });\n } else {\n appendSvg(svg, \"polyline\", {\n points: points.map((point) => `${point.x.toFixed(1)},${point.y.toFixed(1)}`).join(\" \"),\n fill: \"none\",\n stroke: color,\n \"stroke-width\": 3,\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\"\n });\n for (const point of points.slice(0, 80)) {\n appendSvg(svg, \"circle\", { cx: point.x, cy: point.y, r: 3, fill: color });\n }\n }\n\n appendLegend(svg, series.name, color, 52 + seriesIndex * 118, 236);\n });\n\n return svg;\n}\n\nfunction appendLegend(svg: SVGSVGElement, label: string, color: string, x: number, y: number): void {\n appendSvg(svg, \"rect\", { x, y: y - 10, width: 12, height: 12, rx: 2, fill: color });\n const text = appendSvg(svg, \"text\", { x: x + 18, y, class: \"ofv-chart-label\" });\n text.textContent = label.length > 16 ? `${label.slice(0, 16)}...` : label;\n}\n\nfunction appendSvg<K extends keyof SVGElementTagNameMap>(\n parent: SVGElement,\n tag: K,\n attributes: Record<string, string | number>\n): SVGElementTagNameMap[K] {\n const element = document.createElementNS(\"http://www.w3.org/2000/svg\", tag);\n for (const [key, value] of Object.entries(attributes)) {\n element.setAttribute(key, String(value));\n }\n parent.append(element);\n return element;\n}\n\nfunction textFromFirst(root: ParentNode, localName: string): string {\n const element = Array.from(root.querySelectorAll(\"*\")).find((item) => item.localName === localName);\n return element ? chartText(element) : \"\";\n}\n\nfunction stringsFromFirst(root: ParentNode, localName: string): string[] {\n const element = Array.from(root.querySelectorAll(\"*\")).find((item) => item.localName === localName);\n if (!element) {\n return [];\n }\n return chartStringValues(element);\n}\n\nfunction numbersFromFirst(root: ParentNode, localName: string): number[] {\n const element = Array.from(root.querySelectorAll(\"*\")).find((item) => item.localName === localName);\n if (!element) {\n return [];\n }\n return Array.from(element.querySelectorAll(\"*\"))\n .filter((item) => item.localName === \"v\")\n .map((item) => Number(item.textContent || \"\"))\n .filter((value) => Number.isFinite(value));\n}\n\nfunction chartText(element: Element): string {\n return (\n Array.from(element.querySelectorAll(\"*\"))\n .filter((item) => item.localName === \"v\" || item.localName === \"t\")\n .map((item) => item.textContent?.trim() || \"\")\n .find(Boolean) || \"\"\n );\n}\n\nfunction chartStringValues(element: Element): string[] {\n return Array.from(element.querySelectorAll(\"*\"))\n .filter((item) => item.localName === \"v\" || item.localName === \"t\")\n .map((item) => item.textContent?.trim() || \"\")\n .filter(Boolean);\n}\n\ntype SheetViewport = {\n rowStart: number;\n columnStart: number;\n rowCount: number;\n columnCount: number;\n};\n\ntype SheetWindowControls = {\n element: HTMLElement;\n update: () => void;\n};\n\nfunction createSheetViewport(rowCount: number, columnCount: number): SheetViewport {\n return {\n rowStart: 0,\n columnStart: 0,\n rowCount,\n columnCount\n };\n}\n\nfunction createSheetWindowControls(viewport: SheetViewport, render: () => void): SheetWindowControls | null {\n const needsRows = viewport.rowCount > SHEET_WINDOW_ROWS;\n const needsColumns = viewport.columnCount > SHEET_WINDOW_COLUMNS;\n if (!needsRows && !needsColumns) {\n return null;\n }\n\n const controls = document.createElement(\"div\");\n controls.className = \"ofv-sheet-window\";\n\n const note = document.createElement(\"span\");\n note.className = \"ofv-sheet-window-note\";\n\n const rowBack = createWindowButton(\"上 200 行\", () => {\n viewport.rowStart = Math.max(0, viewport.rowStart - SHEET_WINDOW_ROWS);\n render();\n });\n const rowNext = createWindowButton(\"下 200 行\", () => {\n viewport.rowStart = Math.min(maxStart(viewport.rowCount, SHEET_WINDOW_ROWS), viewport.rowStart + SHEET_WINDOW_ROWS);\n render();\n });\n const colBack = createWindowButton(\"左 80 列\", () => {\n viewport.columnStart = Math.max(0, viewport.columnStart - SHEET_WINDOW_COLUMNS);\n render();\n });\n const colNext = createWindowButton(\"右 80 列\", () => {\n viewport.columnStart = Math.min(\n maxStart(viewport.columnCount, SHEET_WINDOW_COLUMNS),\n viewport.columnStart + SHEET_WINDOW_COLUMNS\n );\n render();\n });\n\n controls.append(note, rowBack, rowNext, colBack, colNext);\n\n const update = () => {\n const rowEnd = Math.min(viewport.rowStart + SHEET_WINDOW_ROWS, viewport.rowCount);\n const columnEnd = Math.min(viewport.columnStart + SHEET_WINDOW_COLUMNS, viewport.columnCount);\n note.textContent = `大表格窗口化渲染:当前 ${viewport.rowStart + 1}-${rowEnd} 行,${viewport.columnStart + 1}-${columnEnd} 列`;\n rowBack.disabled = viewport.rowStart === 0;\n rowNext.disabled = viewport.rowStart >= maxStart(viewport.rowCount, SHEET_WINDOW_ROWS);\n colBack.disabled = viewport.columnStart === 0;\n colNext.disabled = viewport.columnStart >= maxStart(viewport.columnCount, SHEET_WINDOW_COLUMNS);\n rowBack.hidden = rowNext.hidden = !needsRows;\n colBack.hidden = colNext.hidden = !needsColumns;\n };\n\n update();\n return { element: controls, update };\n}\n\nfunction createWindowButton(label: string, onClick: () => void): HTMLButtonElement {\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.textContent = label;\n button.addEventListener(\"click\", onClick);\n return button;\n}\n\nfunction maxStart(total: number, size: number): number {\n return Math.max(0, total - size);\n}\n\nfunction createWorkbookSheetTable(\n sheet: Record<string, any>,\n range: { s: { r: number; c: number }; e: { r: number; c: number } },\n sheetIndex: number,\n viewport: SheetViewport,\n encodeCell: (cell: { r: number; c: number }) => string,\n formatCell: (cell: any) => string\n): HTMLTableElement {\n const table = document.createElement(\"table\");\n table.id = `ofv-sheet-${sheetIndex + 1}`;\n const rowEnd = Math.min(range.s.r + viewport.rowStart + SHEET_WINDOW_ROWS - 1, range.e.r);\n const columnEnd = Math.min(range.s.c + viewport.columnStart + SHEET_WINDOW_COLUMNS - 1, range.e.c);\n\n for (let rowIndex = range.s.r + viewport.rowStart; rowIndex <= rowEnd; rowIndex += 1) {\n const row = document.createElement(\"tr\");\n for (let columnIndex = range.s.c + viewport.columnStart; columnIndex <= columnEnd; columnIndex += 1) {\n const cell = document.createElement(rowIndex === range.s.r ? \"th\" : \"td\");\n const address = encodeCell({ r: rowIndex, c: columnIndex });\n const sourceCell = sheet[address];\n cell.dataset.cell = address;\n const text = sourceCell ? formatCell(sourceCell) : \"\";\n cell.textContent = text;\n if (text) {\n cell.title = text;\n }\n if (sourceCell?.f) {\n cell.classList.add(\"ofv-cell-formula\");\n cell.title = `=${sourceCell.f}`;\n }\n row.append(cell);\n }\n table.append(row);\n }\n\n return table;\n}\n\nfunction createParsedSheetTable(sheet: ParsedSheet, sheetIndex: number, viewport: SheetViewport): HTMLTableElement {\n const table = document.createElement(\"table\");\n table.id = `ofv-sheet-${sheetIndex + 1}`;\n const formulaMap = new Map(sheet.formulas.map((item) => [item.address, item.formula]));\n const rowEnd = Math.min(viewport.rowStart + SHEET_WINDOW_ROWS, sheet.rows.length);\n for (let rowIndex = viewport.rowStart; rowIndex < rowEnd; rowIndex += 1) {\n const sourceRow = sheet.rows[rowIndex] || [];\n const row = document.createElement(\"tr\");\n const columnEnd = Math.min(viewport.columnStart + SHEET_WINDOW_COLUMNS, viewport.columnCount);\n for (let columnIndex = viewport.columnStart; columnIndex < columnEnd; columnIndex += 1) {\n const value = sourceRow[columnIndex] || \"\";\n const cell = document.createElement(rowIndex === 0 ? \"th\" : \"td\");\n const address = encodeA1(rowIndex, columnIndex);\n cell.dataset.cell = address;\n cell.textContent = value;\n if (value) {\n cell.title = value;\n }\n const formula = formulaMap.get(address);\n if (formula) {\n cell.classList.add(\"ofv-cell-formula\");\n cell.title = formula;\n }\n row.append(cell);\n }\n table.append(row);\n }\n return table;\n}\n\nfunction parseFlatOds(xml: string): ParsedSheet[] {\n const documentXml = new DOMParser().parseFromString(xml, \"application/xml\");\n if (documentXml.querySelector(\"parsererror\")) {\n return [];\n }\n\n return Array.from(documentXml.getElementsByTagName(\"*\"))\n .filter((element) => element.localName === \"table\")\n .map((tableElement, tableIndex) => parseFlatOdsTable(tableElement, tableIndex))\n .filter((sheet) => sheet.rows.length > 0);\n}\n\nfunction parseFlatOdsTable(tableElement: Element, tableIndex: number): ParsedSheet {\n const rows: string[][] = [];\n const formulas: Array<{ address: string; formula: string }> = [];\n const sheetName = getXmlAttribute(tableElement, \"name\") || `Sheet ${tableIndex + 1}`;\n for (const rowElement of Array.from(tableElement.children).filter((element) => element.localName === \"table-row\")) {\n const repeatRows = clampRepeat(getXmlAttribute(rowElement, \"number-rows-repeated\"), 200);\n const parsedRow = parseFlatOdsRow(rowElement, rows.length, formulas);\n for (let index = 0; index < repeatRows; index += 1) {\n rows.push([...parsedRow]);\n }\n }\n trimEmptyTrailingRows(rows);\n return { name: sheetName, rows, formulas };\n}\n\nfunction parseFlatOdsRow(\n rowElement: Element,\n rowIndex: number,\n formulas: Array<{ address: string; formula: string }>\n): string[] {\n const row: string[] = [];\n for (const cellElement of Array.from(rowElement.children).filter(\n (element) => element.localName === \"table-cell\" || element.localName === \"covered-table-cell\"\n )) {\n const repeatColumns = clampRepeat(getXmlAttribute(cellElement, \"number-columns-repeated\"), 256);\n const value = extractFlatOdsCellValue(cellElement);\n const formula = getXmlAttribute(cellElement, \"formula\");\n for (let index = 0; index < repeatColumns; index += 1) {\n const columnIndex = row.length;\n row.push(value);\n if (formula) {\n formulas.push({ address: encodeA1(rowIndex, columnIndex), formula });\n }\n }\n }\n trimEmptyTrailingCells(row);\n return row;\n}\n\nfunction extractFlatOdsCellValue(cellElement: Element): string {\n const text = extractOpenDocumentTextFromElement(cellElement);\n if (text) {\n return text;\n }\n return (\n getXmlAttribute(cellElement, \"value\") ||\n getXmlAttribute(cellElement, \"date-value\") ||\n getXmlAttribute(cellElement, \"time-value\") ||\n getXmlAttribute(cellElement, \"boolean-value\") ||\n \"\"\n );\n}\n\nfunction extractOpenDocumentTextFromElement(element: Element): string {\n const fragments: string[] = [];\n const visit = (node: Node) => {\n if (node.nodeType === Node.TEXT_NODE) {\n fragments.push(node.textContent || \"\");\n return;\n }\n if (!(node instanceof Element)) {\n return;\n }\n if (node.localName === \"s\") {\n fragments.push(\" \".repeat(clampRepeat(getXmlAttribute(node, \"c\"), 64)));\n return;\n }\n if (node.localName === \"tab\") {\n fragments.push(\"\\t\");\n return;\n }\n if (node.localName === \"line-break\") {\n fragments.push(\"\\n\");\n return;\n }\n for (const child of Array.from(node.childNodes)) {\n visit(child);\n }\n if (node.localName === \"p\" || node.localName === \"h\") {\n fragments.push(\"\\n\");\n }\n };\n visit(element);\n return fragments.join(\"\").replace(/\\n+$/g, \"\").trim();\n}\n\nfunction getXmlAttribute(element: Element, localName: string): string | null {\n const direct = element.getAttribute(localName);\n if (direct !== null) {\n return direct;\n }\n for (const attribute of Array.from(element.attributes)) {\n if (attribute.localName === localName) {\n return attribute.value;\n }\n }\n return null;\n}\n\nfunction clampRepeat(value: string | null, max: number): number {\n const parsed = value ? Number.parseInt(value, 10) : 1;\n if (!Number.isFinite(parsed) || parsed < 1) {\n return 1;\n }\n return Math.min(parsed, max);\n}\n\nfunction trimEmptyTrailingRows(rows: string[][]): void {\n while (rows.length > 0 && rows[rows.length - 1].every((cell) => cell === \"\")) {\n rows.pop();\n }\n}\n\nfunction trimEmptyTrailingCells(row: string[]): void {\n while (row.length > 0 && row[row.length - 1] === \"\") {\n row.pop();\n }\n}\n\nfunction collectFormulaRows(\n sheet: Record<string, any>,\n range: { s: { r: number; c: number }; e: { r: number; c: number } },\n encodeCell: (cell: { r: number; c: number }) => string\n): Array<{ address: string; formula: string }> {\n const formulas: Array<{ address: string; formula: string }> = [];\n for (let row = range.s.r; row <= range.e.r; row += 1) {\n for (let column = range.s.c; column <= range.e.c; column += 1) {\n const address = encodeCell({ r: row, c: column });\n const cell = sheet[address];\n if (cell?.f) {\n formulas.push({ address, formula: `=${cell.f}` });\n }\n }\n }\n return formulas;\n}\n\nfunction encodeA1(rowIndex: number, columnIndex: number): string {\n let column = \"\";\n let value = columnIndex + 1;\n while (value > 0) {\n const remainder = (value - 1) % 26;\n column = String.fromCharCode(65 + remainder) + column;\n value = Math.floor((value - 1) / 26);\n }\n return `${column}${rowIndex + 1}`;\n}\n\nasync function renderPptx(panel: HTMLElement, arrayBuffer: ArrayBuffer): Promise<void> {\n const container = document.createElement(\"div\");\n container.className = \"ofv-pptx-viewer\";\n\n try {\n const zip = await JSZip.loadAsync(arrayBuffer);\n await renderPresentationInsight(panel, await inspectPptxPresentation(zip));\n } catch (error) {\n console.warn(\"PPTX structure insight extraction failed:\", error);\n }\n\n panel.append(container);\n try {\n const { PptxViewer } = await import(\"@aiden0z/pptx-renderer\");\n await PptxViewer.open(arrayBuffer, container);\n normalizePptxLayout(container);\n } catch {\n container.textContent = \"PPTX 渲染失败,请检查文件是否损坏。\";\n }\n}\n\nfunction normalizePptxLayout(container: HTMLElement): void {\n const slideCanvases = findPptxSlideCanvases(container);\n for (const slide of slideCanvases) {\n slide.style.backgroundColor = \"#FFFFFF\";\n }\n}\n\nfunction findPptxSlideCanvases(container: HTMLElement): HTMLElement[] {\n const slideWrappers = Array.from(container.querySelectorAll<HTMLElement>(\"div[data-slide-index]\"));\n const candidates = slideWrappers.flatMap((wrapper) =>\n Array.from(wrapper.querySelectorAll<HTMLElement>(\"div\")).filter(isPptxSlideCanvas)\n );\n if (candidates.length > 0) {\n return Array.from(new Set(candidates));\n }\n return Array.from(container.querySelectorAll<HTMLElement>(\"div\")).filter(isPptxSlideCanvas);\n}\n\nfunction isPptxSlideCanvas(element: HTMLElement): boolean {\n return element.style.position === \"relative\" && parseCssPixelValue(element.style.width) > 0 && parseCssPixelValue(element.style.height) > 0;\n}\n\nasync function renderOdp(panel: HTMLElement, arrayBuffer: ArrayBuffer): Promise<void> {\n const zip = await JSZip.loadAsync(arrayBuffer);\n const content = zip.file(\"content.xml\");\n if (!content) {\n panel.textContent = \"未解析到 ODP 内容。\";\n return;\n }\n const xml = await content.async(\"text\");\n const images = await extractZipImages(zip, /^Pictures\\//);\n renderPresentationInsight(panel, inspectOpenDocumentPresentation(titleFromOdf(xml, \"ODP 演示文稿\"), xml, images.length));\n renderOpenDocumentPresentation(panel, \"ODP 演示文稿\", xml, images);\n}\n\nfunction renderOpenDocumentPresentationXml(panel: HTMLElement, xml: string): void {\n renderPresentationInsight(panel, inspectOpenDocumentPresentation(\"FODP 演示文稿\", xml, 0));\n renderOpenDocumentPresentation(panel, \"FODP 演示文稿\", xml, []);\n}\n\nasync function renderPackagedOfficePreview(\n panel: HTMLElement,\n arrayBuffer: ArrayBuffer,\n extension: string\n): Promise<boolean> {\n let zip: JSZip;\n try {\n zip = await JSZip.loadAsync(arrayBuffer);\n } catch {\n return false;\n }\n\n const entries = Object.values(zip.files).filter((entry) => !entry.dir);\n const hasEntry = (path: string) => entries.some((entry) => entry.name.toLowerCase() === path.toLowerCase());\n const contentXml = zip.file(/(^|\\/)content\\.xml$/i)[0];\n\n if (hasEntry(\"word/document.xml\")) {\n await renderDocx(panel, arrayBuffer);\n return true;\n }\n\n if (hasEntry(\"xl/workbook.xml\")) {\n await renderSheet(panel, arrayBuffer, extension);\n return true;\n }\n\n if (hasEntry(\"ppt/presentation.xml\")) {\n await renderPptx(panel, arrayBuffer);\n return true;\n }\n\n if (contentXml) {\n const xml = await contentXml.async(\"text\");\n if (/<office:spreadsheet\\b|<table:table\\b/i.test(xml)) {\n renderParsedSheets(panel, parseFlatOds(xml), `${extension.toUpperCase()} 文件未解析到表格。`);\n return true;\n }\n if (/<office:presentation\\b|<draw:page\\b/i.test(xml)) {\n renderOpenDocumentPresentation(panel, `${extension.toUpperCase()} 演示文稿`, xml, await extractZipImages(zip, /^Pictures\\//));\n return true;\n }\n if (/<office:text\\b|<text:p\\b/i.test(xml)) {\n renderOpenDocumentXml(panel, `${extension.toUpperCase()} 文档`, xml);\n return true;\n }\n }\n\n if (entries.some((entry) => /^index\\//i.test(entry.name) || /\\.iwa$/i.test(entry.name))) {\n renderOfficePackageStructure(\n panel,\n extension,\n entries.map((entry) => entry.name),\n \"检测到 Apple iWork 包结构。当前解析包内 plist 元数据并展示 IWA/资源结构;正文 IWA 数据可后续接入专用解析器增强。\",\n await extractIWorkMetadata(entries)\n );\n return true;\n }\n\n if (entries.length > 0) {\n renderOfficePackageStructure(\n panel,\n extension,\n entries.map((entry) => entry.name),\n \"检测到 ZIP 包结构,但未发现标准 OOXML/ODF 入口。可后续接入对应厂商格式解析器或服务端转换。\"\n );\n return true;\n }\n\n return false;\n}\n\nfunction renderOfficePackageStructure(\n panel: HTMLElement,\n extension: string,\n entries: string[],\n message: string,\n metadata?: IWorkMetadata\n): void {\n const section = createSection(\"Office 包结构预览\");\n const note = document.createElement(\"p\");\n note.className = \"ofv-office-package-note\";\n note.textContent = `.${extension} ${message}`;\n\n if (metadata && Object.keys(metadata).length > 0) {\n section.append(createIWorkMetadataSummary(metadata));\n }\n\n const list = document.createElement(\"ul\");\n list.className = \"ofv-office-package-list\";\n for (const name of entries.slice(0, 120)) {\n const item = document.createElement(\"li\");\n item.textContent = name;\n list.append(item);\n }\n if (entries.length > 120) {\n const item = document.createElement(\"li\");\n item.textContent = `还有 ${entries.length - 120} 个文件未展示。`;\n list.append(item);\n }\n\n section.append(note, list);\n panel.append(section);\n}\n\nasync function extractIWorkMetadata(entries: JSZip.JSZipObject[]): Promise<IWorkMetadata> {\n const metadataEntries = entries.filter((entry) => /^metadata\\/.*\\.plist$/i.test(entry.name) || /properties\\.plist$/i.test(entry.name));\n const metadata: IWorkMetadata = {};\n for (const entry of metadataEntries.slice(0, 6)) {\n const text = await entry.async(\"text\").catch(() => \"\");\n if (!text || !/<plist[\\s>]/i.test(text)) {\n continue;\n }\n const plist = parsePlistDict(text);\n mergeIWorkMetadata(metadata, plist);\n }\n return metadata;\n}\n\nfunction createIWorkMetadataSummary(metadata: IWorkMetadata): HTMLElement {\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-iwork-meta\";\n const title = document.createElement(\"strong\");\n title.textContent = \"iWork 元数据\";\n const grid = document.createElement(\"div\");\n grid.className = \"ofv-iwork-meta-grid\";\n appendIWorkMeta(grid, \"标题\", metadata.title);\n appendIWorkMeta(grid, \"作者\", metadata.author);\n appendIWorkMeta(grid, \"公司\", metadata.company);\n appendIWorkMeta(grid, \"主题\", metadata.subject);\n appendIWorkMeta(grid, \"关键词\", metadata.keywords?.join(\", \"));\n appendIWorkMeta(grid, \"创建时间\", metadata.created);\n appendIWorkMeta(grid, \"修改时间\", metadata.modified);\n wrapper.append(title, grid);\n return wrapper;\n}\n\nfunction appendIWorkMeta(parent: HTMLElement, label: string, value?: string): void {\n if (!value) {\n return;\n }\n const row = document.createElement(\"div\");\n row.className = \"ofv-meta-row\";\n const key = document.createElement(\"span\");\n key.textContent = label;\n const content = document.createElement(\"strong\");\n content.textContent = value;\n row.append(key, content);\n parent.append(row);\n}\n\nfunction mergeIWorkMetadata(metadata: IWorkMetadata, plist: Record<string, unknown>): void {\n metadata.title ||= plistText(plist, [\"Title\", \"title\", \"DocumentTitle\", \"SFDocumentTitle\", \"kMDItemTitle\"]);\n metadata.author ||= plistText(plist, [\"Author\", \"author\", \"Authors\", \"kMDItemAuthors\", \"creator\"]);\n metadata.company ||= plistText(plist, [\"Company\", \"company\", \"Organization\"]);\n metadata.subject ||= plistText(plist, [\"Subject\", \"subject\", \"Description\", \"comment\"]);\n metadata.created ||= plistText(plist, [\"CreationDate\", \"created\", \"kMDItemFSCreationDate\"]);\n metadata.modified ||= plistText(plist, [\"ModificationDate\", \"modified\", \"kMDItemFSContentChangeDate\"]);\n metadata.keywords ||= plistArray(plist, [\"Keywords\", \"keywords\", \"kMDItemKeywords\"]);\n}\n\nfunction parsePlistDict(xml: string): Record<string, unknown> {\n if (typeof DOMParser === \"undefined\") {\n return {};\n }\n const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n if (doc.querySelector(\"parsererror\")) {\n return {};\n }\n const dict = Array.from(doc.documentElement.children).find((child) => child.tagName === \"dict\");\n const value = dict ? parsePlistValue(dict) : undefined;\n return value && typeof value === \"object\" && !Array.isArray(value) ? (value as Record<string, unknown>) : {};\n}\n\nfunction parsePlistValue(element: Element): unknown {\n switch (element.tagName) {\n case \"dict\": {\n const result: Record<string, unknown> = {};\n const children = Array.from(element.children);\n for (let index = 0; index < children.length; index++) {\n const key = children[index];\n if (key.tagName !== \"key\") {\n continue;\n }\n const value = children[index + 1];\n if (value) {\n result[key.textContent || \"\"] = parsePlistValue(value);\n index++;\n }\n }\n return result;\n }\n case \"array\":\n return Array.from(element.children).map(parsePlistValue);\n case \"true\":\n return true;\n case \"false\":\n return false;\n case \"integer\":\n case \"real\":\n return Number(element.textContent || 0);\n case \"string\":\n case \"date\":\n default:\n return element.textContent?.trim() || \"\";\n }\n}\n\nfunction plistText(plist: Record<string, unknown>, keys: string[]): string | undefined {\n for (const key of keys) {\n const value = plist[key];\n if (typeof value === \"string\" && value.trim()) {\n return value.trim();\n }\n if (Array.isArray(value)) {\n const text = value.filter((item): item is string => typeof item === \"string\" && Boolean(item.trim())).join(\", \");\n if (text) {\n return text;\n }\n }\n }\n return undefined;\n}\n\nfunction plistArray(plist: Record<string, unknown>, keys: string[]): string[] | undefined {\n for (const key of keys) {\n const value = plist[key];\n if (Array.isArray(value)) {\n const items = value.filter((item): item is string => typeof item === \"string\" && Boolean(item.trim()));\n if (items.length > 0) {\n return items;\n }\n }\n if (typeof value === \"string\" && value.trim()) {\n return value.split(/[,;]/).map((item) => item.trim()).filter(Boolean);\n }\n }\n return undefined;\n}\n\nfunction renderOpenDocumentPresentation(\n panel: HTMLElement,\n title: string,\n xml: string,\n images: Array<{ name: string; src: string }>\n): void {\n const pages = xml.split(/<draw:page\\b/).slice(1);\n const pageSources = pages.length > 0 ? pages : [xml];\n for (const [index, pageXml] of pageSources.entries()) {\n const section = createSection(`${title} ${index + 1}`);\n const body = document.createElement(\"div\");\n body.className = \"ofv-slide\";\n const texts = extractOpenDocumentBlocks(pageXml);\n if (texts.length > 0) {\n for (const text of texts) {\n const paragraph = document.createElement(\"p\");\n paragraph.textContent = text;\n body.append(paragraph);\n }\n } else {\n const empty = document.createElement(\"p\");\n empty.textContent = \"这一页没有可提取文本。\";\n body.append(empty);\n }\n for (const image of images.slice(index === 0 ? 0 : images.length, index === 0 ? images.length : images.length)) {\n const figure = document.createElement(\"figure\");\n figure.className = \"ofv-slide-image\";\n const img = document.createElement(\"img\");\n img.src = image.src;\n img.alt = image.name;\n const caption = document.createElement(\"figcaption\");\n caption.textContent = image.name;\n figure.append(img, caption);\n body.append(figure);\n }\n section.append(body);\n panel.append(section);\n }\n}\n\nasync function inspectPptxPresentation(zip: JSZip): Promise<PresentationInsight> {\n const slideEntries = Object.values(zip.files)\n .filter((entry) => !entry.dir && /^ppt\\/slides\\/slide\\d+\\.xml$/i.test(entry.name))\n .sort((a, b) => slideNumberFromPath(a.name) - slideNumberFromPath(b.name));\n\n const slides: PresentationSlideInsight[] = [];\n let imageCount = 0;\n let notesCount = 0;\n let transitionCount = 0;\n let animationCount = 0;\n const layouts = new Set<string>();\n\n for (const entry of slideEntries) {\n const xml = await entry.async(\"text\");\n const texts = extractOpenXmlText(xml);\n const rels = await readPptxRelationships(zip, entry.name);\n const layout = await resolvePptxSlideLayout(zip, entry.name, rels);\n if (layout) {\n layouts.add(layout);\n }\n\n const slideImageCount = countPptxSlideImages(xml, rels);\n const notesPath = resolvePptxRelationshipTarget(entry.name, rels.find((rel) => /\\/notesSlide$/i.test(rel.type))?.target);\n const notesXml = notesPath ? await zip.file(notesPath)?.async(\"text\") : undefined;\n const slideNotesCount = notesXml ? extractOpenXmlText(notesXml).length : 0;\n const hasTransition = /<p:transition\\b/i.test(xml);\n const slideAnimationCount = countMatches(xml, /<p:(?:anim|animEffect|animMotion|animRot|animScale|cmd|set)\\b/gi);\n\n imageCount += slideImageCount;\n notesCount += slideNotesCount;\n transitionCount += hasTransition ? 1 : 0;\n animationCount += slideAnimationCount;\n slides.push({\n title: texts[0] || `Slide ${slides.length + 1}`,\n layout,\n textCount: texts.length,\n imageCount: slideImageCount,\n notesCount: slideNotesCount,\n hasTransition,\n animationCount: slideAnimationCount,\n sampleTexts: texts.slice(0, 4)\n });\n }\n\n return {\n title: \"PPTX 演示文稿结构\",\n slideCount: slides.length,\n imageCount,\n notesCount,\n transitionCount,\n animationCount,\n layouts: Array.from(layouts),\n slides\n };\n}\n\nfunction inspectOpenDocumentPresentation(title: string, xml: string, totalImages: number): PresentationInsight {\n const pages = xml.split(/<draw:page\\b/).slice(1);\n const pageSources = pages.length > 0 ? pages : [xml];\n const slides = pageSources.map((pageXml, index) => {\n const texts = extractOpenDocumentBlocks(pageXml);\n const layout =\n matchXmlAttribute(pageXml, /presentation:class=\"([^\"]+)\"/i) ||\n matchXmlAttribute(pageXml, /draw:style-name=\"([^\"]+)\"/i) ||\n undefined;\n const imageCount = countMatches(pageXml, /<draw:image\\b/gi);\n const hasTransition = /presentation:transition-type=|presentation:transition-style=|smil:type=/i.test(pageXml);\n const animationCount = countMatches(pageXml, /<anim:|<presentation:animations\\b|<presentation:show-shape\\b/gi);\n return {\n title: texts[0] || `Slide ${index + 1}`,\n layout,\n textCount: texts.length,\n imageCount,\n notesCount: countMatches(pageXml, /<presentation:notes\\b/gi),\n hasTransition,\n animationCount,\n sampleTexts: texts.slice(0, 4)\n };\n });\n\n const layouts = new Set(slides.map((slide) => slide.layout).filter(Boolean) as string[]);\n return {\n title,\n slideCount: slides.length,\n imageCount: Math.max(totalImages, slides.reduce((sum, slide) => sum + slide.imageCount, 0)),\n notesCount: slides.reduce((sum, slide) => sum + slide.notesCount, 0),\n transitionCount: slides.filter((slide) => slide.hasTransition).length,\n animationCount: slides.reduce((sum, slide) => sum + slide.animationCount, 0),\n layouts: Array.from(layouts),\n slides\n };\n}\n\nasync function renderPresentationInsight(panel: HTMLElement, insight: PresentationInsight): Promise<void> {\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-presentation-summary\";\n summary.hidden = true;\n summary.setAttribute(\"aria-hidden\", \"true\");\n summary.dataset.slideCount = String(insight.slideCount);\n summary.dataset.imageCount = String(insight.imageCount);\n summary.dataset.notesCount = String(insight.notesCount);\n summary.dataset.transitionCount = String(insight.transitionCount);\n summary.dataset.animationCount = String(insight.animationCount);\n const stats = [\n `${insight.slideCount} 页`,\n `${insight.layouts.length || 0} 种布局`,\n `${insight.imageCount} 张图片`,\n `${insight.notesCount} 条备注`,\n `${insight.transitionCount} 页切换`,\n `${insight.animationCount} 个动画标记`\n ];\n summary.append(createPresentationMetric(insight.title, stats.join(\" · \")));\n\n if (insight.layouts.length > 0) {\n summary.append(createPresentationMetric(\"布局\", insight.layouts.join(\"、\")));\n }\n panel.append(summary);\n}\n\nfunction createPresentationMetric(label: string, value: string): HTMLElement {\n const metric = document.createElement(\"p\");\n const strong = document.createElement(\"strong\");\n strong.textContent = label;\n const span = document.createElement(\"span\");\n span.textContent = value;\n metric.append(strong, span);\n return metric;\n}\n\ntype PptxRelationship = {\n id: string;\n type: string;\n target: string;\n};\n\nasync function readPptxRelationships(zip: JSZip, partPath: string): Promise<PptxRelationship[]> {\n const relsPath = relationshipPathForPart(partPath);\n const xml = await zip.file(relsPath)?.async(\"text\");\n if (!xml) {\n return [];\n }\n const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n if (doc.querySelector(\"parsererror\")) {\n return [];\n }\n return Array.from(doc.getElementsByTagNameNS(PPTX_REL_NS, \"Relationship\")).map((element) => ({\n id: element.getAttribute(\"Id\") || \"\",\n type: element.getAttribute(\"Type\") || \"\",\n target: element.getAttribute(\"Target\") || \"\"\n }));\n}\n\nasync function resolvePptxSlideLayout(zip: JSZip, slidePath: string, rels: PptxRelationship[]): Promise<string | undefined> {\n const layoutRel = rels.find((rel) => /\\/slideLayout$/i.test(rel.type));\n const layoutPath = resolvePptxRelationshipTarget(slidePath, layoutRel?.target);\n const xml = layoutPath ? await zip.file(layoutPath)?.async(\"text\") : undefined;\n if (!xml) {\n return layoutPath?.split(\"/\").pop()?.replace(/\\.xml$/i, \"\");\n }\n return matchXmlAttribute(xml, /<p:cSld\\b[^>]*name=\"([^\"]+)\"/i) || layoutPath?.split(\"/\").pop()?.replace(/\\.xml$/i, \"\");\n}\n\nfunction countPptxSlideImages(xml: string, rels: PptxRelationship[]): number {\n const relImageIds = new Set(rels.filter((rel) => /\\/image$/i.test(rel.type)).map((rel) => rel.id));\n const embeddedIds = [...xml.matchAll(/<a:blip\\b[^>]*(?:r:embed|r:link)=\"([^\"]+)\"/gi)].map((match) => match[1]);\n if (embeddedIds.length > 0) {\n return embeddedIds.filter((id) => relImageIds.size === 0 || relImageIds.has(id)).length;\n }\n return relImageIds.size;\n}\n\nfunction relationshipPathForPart(partPath: string): string {\n const parts = partPath.split(\"/\");\n const fileName = parts.pop() || partPath;\n return `${parts.join(\"/\")}/_rels/${fileName}.rels`;\n}\n\nfunction resolvePptxRelationshipTarget(sourcePath: string, target?: string): string | undefined {\n if (!target || /^[a-z]+:/i.test(target)) {\n return undefined;\n }\n if (target.startsWith(\"/\")) {\n return target.slice(1);\n }\n const base = sourcePath.split(\"/\").slice(0, -1);\n for (const segment of target.split(\"/\")) {\n if (!segment || segment === \".\") {\n continue;\n }\n if (segment === \"..\") {\n base.pop();\n } else {\n base.push(segment);\n }\n }\n return base.join(\"/\");\n}\n\nfunction slideNumberFromPath(path: string): number {\n return Number(path.match(/slide(\\d+)\\.xml$/i)?.[1] || \"0\");\n}\n\nfunction countMatches(value: string, pattern: RegExp): number {\n return [...value.matchAll(pattern)].length;\n}\n\nfunction matchXmlAttribute(value: string, pattern: RegExp): string | null {\n const match = value.match(pattern);\n return match ? decodeXml(match[1] || \"\") : null;\n}\n\nfunction titleFromOdf(xml: string, fallback: string): string {\n return matchXmlAttribute(xml, /<office:meta[\\s\\S]*?<dc:title[^>]*>([\\s\\S]*?)<\\/dc:title>/i) || fallback;\n}\n\nfunction isLegacyOfficeBinary(extension: string): boolean {\n return [\"doc\", \"dot\", \"xls\", \"xlt\", \"ppt\", \"pps\"].includes(extension);\n}\n\nfunction legacyOfficeFormatLabel(extension: string): string {\n if (extension === \"doc\" || extension === \"dot\") {\n return \"Word Binary File Format\";\n }\n if (extension === \"xls\" || extension === \"xlt\") {\n return \"Excel Binary File Format\";\n }\n return \"PowerPoint Binary File Format\";\n}\n\nfunction renderLegacyOfficeBinary(panel: HTMLElement, extension: string, arrayBuffer: ArrayBuffer, parseError?: string): void {\n const fragments = extractLegacyOfficeText(arrayBuffer);\n panel.replaceChildren();\n const section = createSection(\"Office 转换提示\");\n section.classList.add(\"ofv-office-conversion\");\n const format = document.createElement(\"p\");\n const strong = document.createElement(\"strong\");\n strong.textContent = `.${extension}`;\n format.append(\n strong,\n document.createTextNode(\n \" 属于旧版 Microsoft Office 二进制格式,浏览器内无法高保真解析;当前仅展示可信文本片段和结构指纹,完整排版建议接入 LibreOffice/OnlyOffice 服务端转换为 PDF/HTML。\"\n )\n );\n\n const meta = document.createElement(\"dl\");\n meta.className = \"ofv-office-binary-meta\";\n appendOfficeBinaryMeta(meta, \"格式类型\", legacyOfficeFormatLabel(extension));\n appendOfficeBinaryMeta(meta, \"文件结构\", hasOleSignature(arrayBuffer) ? \"检测到 OLE Compound File 签名\" : \"未检测到标准 OLE 签名,按原始二进制尝试提取\");\n appendOfficeBinaryMeta(meta, \"文本片段\", `${fragments.length} 段`);\n if (parseError) {\n appendOfficeBinaryMeta(meta, \"解析状态\", parseError);\n }\n\n section.append(format, meta);\n\n if (fragments.length > 0) {\n const article = document.createElement(\"article\");\n article.className = \"ofv-document ofv-office-binary-fragments\";\n const heading = document.createElement(\"h4\");\n heading.textContent = \"可读文本片段\";\n article.append(heading);\n for (const fragment of fragments.slice(0, 80)) {\n const paragraph = document.createElement(\"p\");\n paragraph.textContent = fragment;\n article.append(paragraph);\n }\n section.append(article);\n } else {\n const empty = document.createElement(\"p\");\n empty.className = \"ofv-office-binary-empty\";\n empty.textContent = \"未提取到稳定可读文本。该文件可能经过压缩、加密,或文本编码无法在浏览器端可靠识别;请使用服务端 LibreOffice/OnlyOffice 转换后预览。\";\n section.append(empty);\n }\n\n panel.append(section);\n}\n\nfunction appendOfficeBinaryMeta(list: HTMLDListElement, label: string, value: string): void {\n const term = document.createElement(\"dt\");\n term.textContent = label;\n const detail = document.createElement(\"dd\");\n detail.textContent = value;\n list.append(term, detail);\n}\n\nfunction renderUnsupportedOffice(panel: HTMLElement, extension: string): void {\n const legacyBinary = new Set([\"doc\", \"dot\", \"wps\", \"ppt\", \"pps\", \"key\", \"dps\"]);\n const message = legacyBinary.has(extension)\n ? \"该格式属于老二进制或专有格式,浏览器内无法可靠解析;建议接入 LibreOffice/OnlyOffice 服务端转换为 PDF/HTML 后预览。\"\n : \"该格式通常需要服务端转换或专用解析器才能高保真预览。\";\n panel.replaceChildren();\n const section = createSection(\"Office 基础预览\");\n const format = document.createElement(\"p\");\n const strong = document.createElement(\"strong\");\n strong.textContent = `.${extension}`;\n format.append(strong, document.createTextNode(` 已进入 Office 插件。${message}`));\n\n const support = document.createElement(\"p\");\n support.textContent = \"当前版本优先支持 docx、rtf、odt/fodt、xlsx/xls/csv/ods、pptx/ppsx、odp/fodp 的基础内容预览。\";\n\n section.append(format, support);\n panel.append(section);\n}\n\nfunction normalizeOfficeError(error: unknown): string {\n const message = error instanceof Error ? error.message : String(error || \"\");\n return message ? `解析器返回:${message}` : \"解析器未返回具体错误信息。\";\n}\n\nfunction extractLegacyOfficeText(arrayBuffer: ArrayBuffer): string[] {\n const bytes = new Uint8Array(arrayBuffer);\n const fragments = [\n ...extractPrintableRuns(bytes).map((text) => ({ text, source: \"ascii\" as const })),\n ...extractUtf16Runs(bytes).map((text) => ({ text, source: \"utf16\" as const }))\n ]\n .map(({ text, source }) => ({ text: normalizeLegacyText(text), source }))\n .filter(({ text, source }) => isReadableLegacyTextFragment(text, source));\n const unique: string[] = [];\n const seen = new Set<string>();\n for (const { text: fragment } of fragments) {\n const key = fragment.toLowerCase();\n if (!seen.has(key)) {\n seen.add(key);\n unique.push(fragment);\n }\n }\n return unique.slice(0, 160);\n}\n\nfunction isReadableLegacyTextFragment(fragment: string, source: LegacyOfficeTextSource): boolean {\n if (fragment.length > 600) {\n return false;\n }\n if (isLegacyOfficeMetadataNoise(fragment)) {\n return false;\n }\n if (!/[\\p{L}\\p{N}]/u.test(fragment)) {\n return false;\n }\n const chars = Array.from(fragment);\n const letters = chars.filter((char) => /\\p{L}/u.test(char)).length;\n const digits = chars.filter((char) => /\\p{N}/u.test(char)).length;\n const spaces = chars.filter((char) => /\\s/u.test(char)).length;\n const asciiLetters = chars.filter((char) => /[A-Za-z]/.test(char)).length;\n const cjkLetters = chars.filter((char) => /[\\u3400-\\u9fff]/u.test(char)).length;\n const punctuation = chars.filter((char) => /[^\\p{L}\\p{N}\\s]/u.test(char)).length;\n const alphaNumeric = letters + digits;\n const readableRatio = alphaNumeric / chars.length;\n const punctuationRatio = punctuation / chars.length;\n\n if (fragment.length < 4 || readableRatio < 0.55 || punctuationRatio > 0.24) {\n return false;\n }\n if (/([\\p{L}\\p{N}])\\1{4,}/u.test(fragment)) {\n return false;\n }\n if (cjkLetters >= 2) {\n const suspiciousCjk = chars.filter((char) => isAsciiBytePairCjk(char)).length;\n if (suspiciousCjk / cjkLetters > 0.65) {\n return false;\n }\n if (isLikelyCjkHeading(fragment)) {\n return true;\n }\n if (punctuation > 0 && fragment.length < 12) {\n return false;\n }\n return cjkLetters >= 8 || (cjkLetters >= 4 && spaces > 0);\n }\n if (asciiLetters >= 4) {\n if (punctuation > 0 && spaces === 0) {\n return false;\n }\n if (source === \"ascii\" && /^[A-Z]{2,8}$/.test(fragment)) {\n return false;\n }\n if (spaces > 0) {\n return letters >= 3;\n }\n return fragment.length >= 6;\n }\n if (spaces > 0 && letters >= 3) {\n return true;\n }\n return false;\n}\n\nfunction isLegacyOfficeMetadataNoise(fragment: string): boolean {\n if (/[$�\\uFFFD]/u.test(fragment)) {\n return true;\n }\n if (/^(?:Root Entry|WordDocument|Workbook|Book|SummaryInformation|DocumentSummaryInformation|CompObj|ObjectPool|Data|PowerPoint Document|Pictures)$/i.test(fragment)) {\n return true;\n }\n if (/\\.(dotm?|docm?|pptx?|ppsx?|xlsm?|xlsx?)\\b/i.test(fragment)) {\n return true;\n }\n if (/^(?:默认段落字体|普通表格|正文|标题|副标题|目录|页眉|页脚|批注|超链接)(?:\\s*\\d+)?$/.test(fragment)) {\n return true;\n }\n if (/\\b(?:Normal|Default|Calibri|Times New Roman|WPS Office|Microsoft Office|KSOP?ProductBuildVer)\\b/i.test(fragment)) {\n return true;\n }\n if (/^\\d+(?:Table|List|Heading|Title|Style)$/i.test(fragment)) {\n return true;\n }\n if (/[{(]?[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}[})]?/i.test(fragment)) {\n return true;\n }\n if (/^[A-Z_]{3,}$/.test(fragment) || /^[A-Za-z]+(?:Information|Document|Storage|Stream|Table|Data|Pool|Obj|Props)$/i.test(fragment)) {\n return true;\n }\n return false;\n}\n\nfunction isLikelyCjkHeading(fragment: string): boolean {\n return /^(?:标题|第[一二三四五六七八九十\\d]+[章节条]|[一二三四五六七八九十\\d]+[、..])\\s*[\\p{L}\\p{N}\\s-]*$/u.test(fragment);\n}\n\nfunction isAsciiBytePairCjk(char: string): boolean {\n const code = char.codePointAt(0) || 0;\n if (code < 0x3400 || code > 0x9fff) {\n return false;\n }\n const low = code & 0xff;\n const high = code >> 8;\n return isPrintableAsciiByte(low) && isPrintableAsciiByte(high);\n}\n\nfunction isPrintableAsciiByte(value: number): boolean {\n return value >= 0x20 && value <= 0x7e;\n}\n\nfunction extractPrintableRuns(bytes: Uint8Array): string[] {\n const fragments: string[] = [];\n let current = \"\";\n for (const byte of bytes) {\n if ((byte >= 32 && byte <= 126) || byte === 9) {\n current += String.fromCharCode(byte);\n } else {\n if (current.length >= 4) {\n fragments.push(current);\n }\n current = \"\";\n }\n }\n if (current.length >= 4) {\n fragments.push(current);\n }\n return fragments;\n}\n\nfunction extractUtf16Runs(bytes: Uint8Array): string[] {\n const fragments: string[] = [];\n let current = \"\";\n for (let index = 0; index < bytes.length - 1; index += 2) {\n if (looksLikeMisalignedAsciiUtf16(bytes[index], bytes[index + 1])) {\n if (current.length >= 3) {\n fragments.push(current);\n }\n current = \"\";\n continue;\n }\n const code = bytes[index] | (bytes[index + 1] << 8);\n if ((code >= 32 && code <= 0xd7ff) || code === 9) {\n current += String.fromCharCode(code);\n } else {\n if (current.length >= 3) {\n fragments.push(current);\n }\n current = \"\";\n }\n }\n if (current.length >= 3) {\n fragments.push(current);\n }\n return fragments;\n}\n\nfunction looksLikeMisalignedAsciiUtf16(lowByte: number, highByte: number): boolean {\n return lowByte === 0 && ((highByte >= 48 && highByte <= 57) || (highByte >= 65 && highByte <= 90) || (highByte >= 97 && highByte <= 122));\n}\n\nfunction normalizeLegacyText(value: string): string {\n return value.replace(/[\\u0000-\\u001f]+/g, \" \").replace(/\\s+/g, \" \").trim();\n}\n\nfunction hasOleSignature(arrayBuffer: ArrayBuffer): boolean {\n const signature = Array.from(new Uint8Array(arrayBuffer.slice(0, 8)));\n return signature.join(\",\") === \"208,207,17,224,161,177,26,225\";\n}\n\nasync function extractZipImages(\n zip: JSZip,\n pattern: RegExp\n): Promise<Array<{ name: string; src: string }>> {\n const images: Array<{ name: string; src: string }> = [];\n for (const entry of Object.values(zip.files).filter((item) => !item.dir && pattern.test(item.name))) {\n const mimeType = mimeTypeFromPath(entry.name);\n if (!mimeType.startsWith(\"image/\")) {\n continue;\n }\n images.push({\n name: entry.name.split(\"/\").pop() || entry.name,\n src: `data:${mimeType};base64,${await entry.async(\"base64\")}`\n });\n }\n return images;\n}\n\nfunction extractOpenXmlText(xml: string): string[] {\n return [...xml.matchAll(/<a:t>([\\s\\S]*?)<\\/a:t>|<w:t[^>]*>([\\s\\S]*?)<\\/w:t>/g)]\n .map((match) => decodeXml(match[1] || match[2] || \"\").trim())\n .filter(Boolean);\n}\n\nfunction extractWordParagraphs(xml: string): string[] {\n return [...xml.matchAll(/<w:p\\b[\\s\\S]*?<\\/w:p>/g)]\n .map((match) => extractOpenXmlText(match[0]).join(\"\"))\n .map((text) => text.trim())\n .filter(Boolean);\n}\n\nfunction extractOpenDocumentBlocks(xml: string): string[] {\n return [...xml.matchAll(/<(?:text:p|text:h)[^>]*>([\\s\\S]*?)<\\/(?:text:p|text:h)>/g)]\n .map((match) => stripXmlTags(match[1] || \"\"))\n .map((text) => decodeXml(text).trim())\n .filter(Boolean);\n}\n\nfunction stripXmlTags(value: string): string {\n return value\n .replace(/<text:line-break\\s*\\/>/g, \"\\n\")\n .replace(/<text:tab\\s*\\/>/g, \"\\t\")\n .replace(/<[^>]+>/g, \"\");\n}\n\nfunction rtfToText(rtf: string): string {\n return rtf\n .replace(/\\\\'[0-9a-fA-F]{2}/g, \"\")\n .replace(/\\\\par[d]?/g, \"\\n\")\n .replace(/\\\\tab/g, \"\\t\")\n .replace(/\\\\[a-zA-Z]+\\d* ?/g, \"\")\n .replace(/[{}]/g, \"\")\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .trim();\n}\n\nasync function readTextFromBuffer(arrayBuffer: ArrayBuffer): Promise<string> {\n return decodeTextBuffer(arrayBuffer);\n}\n\n\nfunction mimeTypeFromPath(path: string): string {\n const extension = path.split(\".\").pop()?.toLowerCase();\n const map: Record<string, string> = {\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n bmp: \"image/bmp\",\n svg: \"image/svg+xml\",\n webp: \"image/webp\"\n };\n return extension ? map[extension] || \"application/octet-stream\" : \"application/octet-stream\";\n}\n\nfunction decodeXml(value: string): string {\n return value\n .replaceAll(\"&lt;\", \"<\")\n .replaceAll(\"&gt;\", \">\")\n .replaceAll(\"&amp;\", \"&\")\n .replaceAll(\"&quot;\", '\"')\n .replaceAll(\"&apos;\", \"'\");\n}\n\nfunction sanitizeHtml(html: string): string {\n return DOMPurify.sanitize(html, {\n USE_PROFILES: { html: true },\n ADD_ATTR: [\"target\"]\n });\n}\n","import JSZip from \"jszip\";\nimport { createObjectUrl, revokeObjectUrl } from \"../dom\";\nimport type { PreviewPlugin } from \"../types\";\nimport { createPanel, readArrayBuffer } from \"./utils\";\n\nexport function ofdPlugin(): PreviewPlugin {\n return {\n name: \"ofd\",\n match(file) {\n return file.extension === \"ofd\" || file.mimeType === \"application/ofd\";\n },\n async render(ctx) {\n const panel = createPanel(\"ofv-ofd\");\n const url = createObjectUrl(ctx.file);\n const isExternal = Boolean(ctx.file.url);\n ctx.viewport.append(panel);\n let zip: JSZip;\n try {\n zip = await JSZip.loadAsync(await readArrayBuffer(ctx.file));\n } catch (error) {\n panel.append(createOfdFallback(ctx.file.name, url, normalizeOfdError(error)));\n return {\n destroy() {\n panel.remove();\n revokeObjectUrl(url, isExternal);\n }\n };\n }\n\n const entries = Object.values(zip.files).filter((entry) => !entry.dir);\n const textFragments: string[] = [];\n\n try {\n for (const entry of entries.filter((item) => item.name.endsWith(\".xml\")).slice(0, 40)) {\n const xml = await entry.async(\"text\");\n const matches = [...xml.matchAll(/>([^<>]{2,})</g)]\n .map((match) => match[1]?.trim())\n .filter(Boolean) as string[];\n textFragments.push(...matches);\n }\n } catch (error) {\n panel.append(createOfdFallback(ctx.file.name, url, normalizeOfdError(error)));\n return {\n destroy() {\n panel.remove();\n revokeObjectUrl(url, isExternal);\n }\n };\n }\n\n const context = await readOfdContext(entries);\n const pages = await readOfdPages(entries, context);\n let zoom = 1;\n let rotation = 0;\n const applyZoom = () => {\n panel.style.setProperty(\"--ofv-ofd-zoom\", formatOfdCssNumber(zoom));\n ctx.toolbar?.setZoom(zoom);\n };\n const applyRotation = () => {\n const normalizedRotation = ((rotation % 360) + 360) % 360;\n panel.style.setProperty(\"--ofv-ofd-rotation\", `${normalizedRotation}deg`);\n panel.classList.toggle(\"is-ofd-rotated-sideways\", normalizedRotation === 90 || normalizedRotation === 270);\n };\n\n if (pages.length > 0) {\n const pagesWrap = document.createElement(\"div\");\n pagesWrap.className = \"ofv-ofd-pages\";\n for (const page of pages) {\n pagesWrap.append(renderOfdPage(page));\n }\n panel.append(pagesWrap);\n applyZoom();\n applyRotation();\n }\n if (pages.length === 0) {\n const content = document.createElement(\"pre\");\n content.className = \"ofv-text-block\";\n content.textContent = textFragments.slice(0, 300).join(\"\\n\") || \"未提取到可读文本。\";\n panel.append(content);\n }\n\n return {\n canCommand(command) {\n return (\n pages.length > 0 &&\n (command === \"zoom-in\" ||\n command === \"zoom-out\" ||\n command === \"zoom-reset\" ||\n command === \"rotate-right\" ||\n command === \"rotate-left\")\n );\n },\n command(command) {\n if (pages.length === 0) {\n return false;\n }\n if (command === \"zoom-in\") {\n zoom = Math.min(4, zoom + 0.15);\n applyZoom();\n return true;\n }\n if (command === \"zoom-out\") {\n zoom = Math.max(0.25, zoom - 0.15);\n applyZoom();\n return true;\n }\n if (command === \"zoom-reset\") {\n zoom = 1;\n applyZoom();\n return true;\n }\n if (command === \"rotate-right\") {\n rotation += 90;\n applyRotation();\n return true;\n }\n if (command === \"rotate-left\") {\n rotation -= 90;\n applyRotation();\n return true;\n }\n return false;\n },\n destroy() {\n ctx.toolbar?.setZoom(undefined);\n panel.remove();\n revokeObjectUrl(url, isExternal);\n }\n };\n }\n };\n}\n\ntype OfdTextObject = {\n text: string;\n x: number;\n y: number;\n width: number;\n height: number;\n size: number;\n color: string;\n weight: string;\n fontFamily: string;\n letterSpacing?: number;\n deltaX?: number[];\n vertical?: boolean;\n align?: \"start\" | \"end\";\n};\n\ntype OfdPathObject = {\n d: string;\n x: number;\n y: number;\n width: number;\n height: number;\n stroke: string;\n fill: string;\n strokeWidth: number;\n transform: string;\n};\n\ntype OfdLineObject = {\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n stroke: string;\n strokeWidth: number;\n};\n\ntype OfdImageObject = {\n x: number;\n y: number;\n width: number;\n height: number;\n resourceId: string;\n href?: string;\n};\n\ntype OfdPagePreview = {\n name: string;\n width: number;\n height: number;\n texts: OfdTextObject[];\n paths: OfdPathObject[];\n lines: OfdLineObject[];\n images: OfdImageObject[];\n};\n\ntype OfdContext = {\n images: Map<string, string>;\n templates: Map<string, string>;\n fonts: Map<string, string>;\n pageSize?: { width: number; height: number };\n};\n\nasync function readOfdPages(\n entries: JSZip.JSZipObject[],\n context: OfdContext\n): Promise<OfdPagePreview[]> {\n const pages: OfdPagePreview[] = [];\n const pageEntries = entries\n .filter((entry) => /(^|\\/)Pages\\/Page_[^/]+\\/Content\\.xml$/i.test(entry.name) || /(^|\\/)Page_[^/]+\\/Content\\.xml$/i.test(entry.name))\n .slice(0, 80);\n for (const entry of pageEntries) {\n const xml = await entry.async(\"text\");\n const templates = await readPageTemplates(xml, context, entries);\n const page = parseOfdPage(entry.name, xml, context.images, context.fonts, templates, context.pageSize);\n if (page.texts.length > 0 || page.paths.length > 0 || page.lines.length > 0 || page.images.length > 0) {\n pages.push(page);\n }\n }\n return pages;\n}\n\nasync function readPageTemplates(xml: string, context: OfdContext, entries: JSZip.JSZipObject[]): Promise<string[]> {\n const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n if (doc.querySelector(\"parsererror\")) {\n return [];\n }\n const templateIds = Array.from(doc.getElementsByTagName(\"*\"))\n .filter((element) => element.localName === \"Template\")\n .map((element) => getOfdAttribute(element, \"TemplateID\") || getOfdAttribute(element, \"ID\"))\n .filter((id): id is string => Boolean(id));\n const templates: string[] = [];\n for (const id of templateIds) {\n const path = context.templates.get(id);\n const entry = path ? findOfdEntry(entries, path) : undefined;\n if (entry) {\n templates.push(await entry.async(\"text\"));\n }\n }\n return templates;\n}\n\nfunction parseOfdPage(\n name: string,\n xml: string,\n images: Map<string, string>,\n fonts: Map<string, string>,\n templateXmls: string[] = [],\n defaultPageSize?: { width: number; height: number }\n): OfdPagePreview {\n const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n if (doc.querySelector(\"parsererror\")) {\n return { name, width: 210, height: 297, texts: [], paths: [], lines: [], images: [] };\n }\n const pageSize = parseOfdPageSize(doc, defaultPageSize);\n const templatePages = templateXmls.map((templateXml) => {\n const templateDoc = new DOMParser().parseFromString(templateXml, \"application/xml\");\n return templateDoc.querySelector(\"parsererror\") ? emptyOfdPageContent() : parseOfdPageContent(templateDoc, images, fonts);\n });\n const pageContent = parseOfdPageContent(doc, images, fonts);\n const texts = [...templatePages.flatMap((page) => page.texts), ...pageContent.texts];\n const paths = [...templatePages.flatMap((page) => page.paths), ...pageContent.paths];\n const lines = [...templatePages.flatMap((page) => page.lines), ...pageContent.lines];\n const imageObjects = [...templatePages.flatMap((page) => page.images), ...pageContent.images];\n if (pageSize.explicit) {\n return { name, width: pageSize.width, height: pageSize.height, texts, paths, lines, images: imageObjects };\n }\n const bounds = createOfdBounds(texts, paths, lines, imageObjects);\n const width = Math.max(pageSize.width, ...bounds.map((item) => item.x + item.width + 12));\n const height = Math.max(pageSize.height, ...bounds.map((item) => item.y + item.height + 12));\n return { name, width, height, texts, paths, lines, images: imageObjects };\n}\n\nfunction parseOfdPageContent(\n doc: Document,\n images: Map<string, string>,\n fonts: Map<string, string>\n): Omit<OfdPagePreview, \"name\" | \"width\" | \"height\"> {\n const textObjects = Array.from(doc.getElementsByTagName(\"*\")).filter((element) => element.localName === \"TextObject\");\n const texts = textObjects.flatMap((element) => parseOfdTextObject(element, fonts));\n const paths = Array.from(doc.getElementsByTagName(\"*\"))\n .filter((element) => element.localName === \"PathObject\")\n .flatMap((element) => parseOfdPathObject(element));\n const lines = Array.from(doc.getElementsByTagName(\"*\"))\n .filter((element) => element.localName === \"LineObject\")\n .flatMap((element) => parseOfdLineObject(element));\n const imageObjects = Array.from(doc.getElementsByTagName(\"*\"))\n .filter((element) => element.localName === \"ImageObject\")\n .flatMap((element) => parseOfdImageObject(element, images));\n return { texts, paths, lines, images: imageObjects };\n}\n\nfunction emptyOfdPageContent(): Omit<OfdPagePreview, \"name\" | \"width\" | \"height\"> {\n return { texts: [], paths: [], lines: [], images: [] };\n}\n\nfunction createOfdBounds(\n texts: OfdTextObject[],\n paths: OfdPathObject[],\n lines: OfdLineObject[],\n imageObjects: OfdImageObject[]\n): Array<{ x: number; y: number; width: number; height: number }> {\n return [\n ...texts.map((item) => ({ x: item.x, y: item.y, width: item.width, height: item.height })),\n ...paths.map((item) => ({ x: item.x, y: item.y, width: item.width, height: item.height })),\n ...lines.map((item) => ({\n x: Math.min(item.x1, item.x2),\n y: Math.min(item.y1, item.y2),\n width: Math.abs(item.x2 - item.x1),\n height: Math.abs(item.y2 - item.y1)\n })),\n ...imageObjects.map((item) => ({ x: item.x, y: item.y, width: item.width, height: item.height }))\n ];\n}\n\nfunction parseOfdTextObject(element: Element, fonts: Map<string, string>): OfdTextObject[] {\n const boundary = parseBoundary(getOfdAttribute(element, \"Boundary\"));\n const size = finiteNumber(getOfdAttribute(element, \"Size\"), Math.max(4, boundary.height || 5));\n const color = parseOfdColor(element, \"#111827\");\n const weight = finiteNumber(getOfdAttribute(element, \"Weight\"), 400) >= 600 ? \"700\" : \"400\";\n const fontFamily = fontStackForOfdFont(fonts.get(getOfdAttribute(element, \"Font\") || \"\"));\n const objectLetterSpacing = getOfdAttribute(element, \"DeltaX\") ? 0.5 : undefined;\n const textCodes = Array.from(element.getElementsByTagName(\"*\")).filter((child) => child.localName === \"TextCode\");\n if (textCodes.length === 0) {\n return [];\n }\n return textCodes.flatMap((code): OfdTextObject[] => {\n const x = boundary.x + finiteNumber(getOfdAttribute(code, \"X\"), 0);\n const y = boundary.y + finiteNumber(getOfdAttribute(code, \"Y\"), 0);\n const text = code.textContent?.trim() || \"\";\n const deltaX = parseOfdDeltaX(getOfdAttribute(code, \"DeltaX\"));\n const align = deltaX ? \"start\" : inferOfdTextAlign(text, boundary);\n const deltaY = getOfdAttribute(code, \"DeltaY\");\n if (deltaY && text.length > 1) {\n const step = parseOfdDeltaStep(deltaY, size);\n return Array.from(text).map((char, index) => ({\n text: char,\n x,\n y: y + index * step,\n width: boundary.width,\n height: boundary.height,\n size,\n color,\n weight,\n fontFamily,\n letterSpacing: objectLetterSpacing,\n vertical: true,\n align\n }));\n }\n return [\n {\n text,\n x,\n y,\n width: boundary.width,\n height: boundary.height,\n size,\n color,\n weight,\n fontFamily,\n letterSpacing: deltaX ? undefined : objectLetterSpacing,\n deltaX,\n align\n }\n ];\n }).filter((item) => item.text);\n}\n\nfunction parseOfdPathObject(element: Element): OfdPathObject[] {\n const boundary = parseBoundary(getOfdAttribute(element, \"Boundary\"));\n const ctm = parseOfdCtm(getOfdAttribute(element, \"CTM\"));\n const commands = Array.from(element.getElementsByTagName(\"*\")).filter(\n (child) => child.localName === \"AbbreviatedData\" || child.localName === \"PathData\"\n );\n const raw = commands.map((child) => child.textContent || \"\").join(\" \").trim();\n if (!raw) {\n return [];\n }\n return [\n {\n d: normalizeOfdPathData(raw),\n x: boundary.x,\n y: boundary.y,\n width: boundary.width,\n height: boundary.height,\n stroke: parseOfdColor(element, \"#111827\", \"StrokeColor\"),\n fill: parseOfdFill(element),\n strokeWidth: finiteNumber(getOfdAttribute(element, \"LineWidth\"), 1),\n transform: createOfdPathTransform(boundary.x, boundary.y, ctm)\n }\n ];\n}\n\nfunction parseOfdLineObject(element: Element): OfdLineObject[] {\n const boundary = parseBoundary(getOfdAttribute(element, \"Boundary\"));\n const start = parsePoint(getOfdAttribute(element, \"StartPoint\"), { x: 0, y: 0 });\n const end = parsePoint(getOfdAttribute(element, \"EndPoint\"), {\n x: boundary.width,\n y: boundary.height\n });\n return [\n {\n x1: boundary.x + start.x,\n y1: boundary.y + start.y,\n x2: boundary.x + end.x,\n y2: boundary.y + end.y,\n stroke: parseOfdColor(element, \"#111827\"),\n strokeWidth: finiteNumber(getOfdAttribute(element, \"LineWidth\"), 1)\n }\n ];\n}\n\nfunction parseOfdImageObject(element: Element, images: Map<string, string>): OfdImageObject[] {\n const boundary = parseBoundary(getOfdAttribute(element, \"Boundary\"));\n const resourceId = getOfdAttribute(element, \"ResourceID\") || getOfdAttribute(element, \"ResourceId\") || \"\";\n return [\n {\n x: boundary.x,\n y: boundary.y,\n width: boundary.width || 32,\n height: boundary.height || 32,\n resourceId,\n href: images.get(resourceId)\n }\n ];\n}\n\nfunction renderOfdPage(page: OfdPagePreview): HTMLElement {\n const figure = document.createElement(\"figure\");\n figure.className = \"ofv-ofd-page\";\n figure.style.setProperty(\"--ofv-ofd-page-width\", `${formatOfdCssNumber(page.width)}mm`);\n figure.style.setProperty(\"--ofv-ofd-page-height\", `${formatOfdCssNumber(page.height)}mm`);\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svg.setAttribute(\"viewBox\", `0 0 ${page.width} ${page.height}`);\n svg.setAttribute(\"role\", \"img\");\n svg.setAttribute(\"aria-label\", page.name);\n\n const paper = document.createElementNS(svg.namespaceURI, \"rect\");\n paper.setAttribute(\"x\", \"0\");\n paper.setAttribute(\"y\", \"0\");\n paper.setAttribute(\"width\", String(page.width));\n paper.setAttribute(\"height\", String(page.height));\n paper.setAttribute(\"fill\", \"white\");\n svg.append(paper);\n\n for (const item of page.images) {\n if (item.href) {\n const image = document.createElementNS(svg.namespaceURI, \"image\");\n image.setAttribute(\"x\", String(item.x));\n image.setAttribute(\"y\", String(item.y));\n image.setAttribute(\"width\", String(item.width));\n image.setAttribute(\"height\", String(item.height));\n image.setAttribute(\"href\", item.href);\n image.setAttribute(\"preserveAspectRatio\", \"xMidYMid meet\");\n svg.append(image);\n } else {\n const placeholder = document.createElementNS(svg.namespaceURI, \"rect\");\n placeholder.setAttribute(\"x\", String(item.x));\n placeholder.setAttribute(\"y\", String(item.y));\n placeholder.setAttribute(\"width\", String(item.width));\n placeholder.setAttribute(\"height\", String(item.height));\n placeholder.setAttribute(\"fill\", \"#f8fafc\");\n placeholder.setAttribute(\"stroke\", \"#94a3b8\");\n placeholder.setAttribute(\"stroke-dasharray\", \"4 3\");\n svg.append(placeholder);\n }\n }\n\n for (const item of page.paths) {\n const path = document.createElementNS(svg.namespaceURI, \"path\");\n path.setAttribute(\"d\", item.d);\n path.setAttribute(\"transform\", item.transform);\n path.setAttribute(\"fill\", item.fill);\n path.setAttribute(\"stroke\", item.stroke);\n path.setAttribute(\"stroke-width\", String(item.strokeWidth));\n svg.append(path);\n }\n\n for (const item of page.lines) {\n const line = document.createElementNS(svg.namespaceURI, \"line\");\n line.setAttribute(\"x1\", String(item.x1));\n line.setAttribute(\"y1\", String(item.y1));\n line.setAttribute(\"x2\", String(item.x2));\n line.setAttribute(\"y2\", String(item.y2));\n line.setAttribute(\"stroke\", item.stroke);\n line.setAttribute(\"stroke-width\", String(item.strokeWidth));\n line.setAttribute(\"stroke-linecap\", \"round\");\n svg.append(line);\n }\n\n for (const item of page.texts) {\n const text = document.createElementNS(svg.namespaceURI, \"text\");\n text.setAttribute(\"x\", String(item.align === \"end\" ? item.x + item.width : item.x));\n text.setAttribute(\"y\", String(item.y));\n text.setAttribute(\"font-size\", String(item.size));\n text.setAttribute(\"fill\", item.color);\n text.setAttribute(\"font-weight\", item.weight);\n text.setAttribute(\"font-family\", item.fontFamily);\n if (item.letterSpacing !== undefined) {\n text.setAttribute(\"letter-spacing\", String(item.letterSpacing));\n }\n if (item.deltaX && item.deltaX.length > 0 && item.align !== \"end\") {\n const chars = Array.from(item.text);\n let x = item.x;\n for (let index = 0; index < chars.length; index += 1) {\n const span = document.createElementNS(svg.namespaceURI, \"tspan\");\n span.setAttribute(\"x\", String(x));\n span.setAttribute(\"y\", String(item.y));\n if (index < chars.length - 1) {\n x += item.deltaX[Math.min(index, item.deltaX.length - 1)] || item.size;\n }\n span.textContent = chars[index];\n text.append(span);\n }\n } else {\n if (item.align === \"end\") {\n text.setAttribute(\"text-anchor\", \"end\");\n }\n text.textContent = item.text;\n }\n svg.append(text);\n }\n\n figure.append(svg);\n return figure;\n}\n\nasync function readOfdContext(entries: JSZip.JSZipObject[]): Promise<OfdContext> {\n const images = await readOfdImages(entries);\n const fonts = await readOfdFonts(entries);\n const { templates, pageSize } = await readOfdDocumentInfo(entries);\n return { images, templates, fonts, pageSize };\n}\n\nasync function readOfdFonts(entries: JSZip.JSZipObject[]): Promise<Map<string, string>> {\n const fonts = new Map<string, string>();\n for (const entry of entries.filter((item) => /(?:^|\\/)(?:DocumentRes|PublicRes)\\.xml$/i.test(item.name))) {\n const xml = await entry.async(\"text\");\n const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n if (doc.querySelector(\"parsererror\")) {\n continue;\n }\n for (const font of Array.from(doc.getElementsByTagName(\"*\")).filter((element) => element.localName === \"Font\")) {\n const id = getOfdAttribute(font, \"ID\");\n const name = getOfdAttribute(font, \"FontName\") || getOfdAttribute(font, \"FamilyName\");\n if (id && name) {\n fonts.set(id, name.trim());\n }\n }\n }\n return fonts;\n}\n\nasync function readOfdImages(entries: JSZip.JSZipObject[]): Promise<Map<string, string>> {\n const images = new Map<string, string>();\n for (const entry of entries.filter((item) => /\\.(?:png|jpe?g|gif|bmp|webp)$/i.test(item.name)).slice(0, 80)) {\n const id = entry.name.split(\"/\").pop()?.replace(/\\.[^.]+$/, \"\") || entry.name;\n const mimeType = mimeTypeFromPath(entry.name);\n if (!mimeType.startsWith(\"image/\")) {\n continue;\n }\n const base64 = await entry.async(\"base64\");\n const href = `data:${mimeType};base64,${base64}`;\n images.set(id, href);\n images.set(entry.name, href);\n images.set(entry.name.split(\"/\").pop() || entry.name, href);\n }\n for (const entry of entries.filter((item) => /(?:^|\\/)(?:DocumentRes|PublicRes)\\.xml$/i.test(item.name))) {\n const xml = await entry.async(\"text\");\n const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n if (doc.querySelector(\"parsererror\")) {\n continue;\n }\n const baseLoc = getOfdAttribute(doc.documentElement, \"BaseLoc\") || \"\";\n const resourceDir = joinOfdPath(directoryName(entry.name), baseLoc);\n for (const media of Array.from(doc.getElementsByTagName(\"*\")).filter((element) => element.localName === \"MultiMedia\")) {\n const id = getOfdAttribute(media, \"ID\");\n const mediaFile = findOfdChild(media, \"MediaFile\")?.textContent?.trim();\n if (!id || !mediaFile) {\n continue;\n }\n const imageEntry = findOfdEntry(entries, joinOfdPath(resourceDir, mediaFile)) || findOfdEntry(entries, mediaFile);\n const href = imageEntry ? images.get(imageEntry.name) || images.get(imageEntry.name.split(\"/\").pop() || imageEntry.name) : undefined;\n if (href) {\n images.set(id, href);\n }\n }\n }\n return images;\n}\n\nasync function readOfdDocumentInfo(entries: JSZip.JSZipObject[]): Promise<{ templates: Map<string, string>; pageSize?: { width: number; height: number } }> {\n const templates = new Map<string, string>();\n let pageSize: { width: number; height: number } | undefined;\n for (const entry of entries.filter((item) => /(?:^|\\/)Document\\.xml$/i.test(item.name))) {\n const xml = await entry.async(\"text\");\n const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n if (doc.querySelector(\"parsererror\")) {\n continue;\n }\n const documentDir = directoryName(entry.name);\n const physicalBox = Array.from(doc.getElementsByTagName(\"*\")).find((element) => element.localName === \"PageArea\")\n ?.getElementsByTagName(\"*\");\n const pageAreaBox = physicalBox\n ? Array.from(physicalBox).find((element) => element.localName === \"PhysicalBox\")\n : undefined;\n if (pageAreaBox?.textContent) {\n const box = parseBoundary(pageAreaBox.textContent);\n if (box.width > 0 && box.height > 0) {\n pageSize = { width: box.width, height: box.height };\n }\n }\n for (const template of Array.from(doc.getElementsByTagName(\"*\")).filter((element) => element.localName === \"TemplatePage\")) {\n const id = getOfdAttribute(template, \"ID\");\n const baseLoc = getOfdAttribute(template, \"BaseLoc\");\n if (id && baseLoc) {\n templates.set(id, joinOfdPath(documentDir, baseLoc));\n }\n }\n }\n return { templates, pageSize };\n}\n\nfunction parseOfdPageSize(doc: Document, defaultPageSize?: { width: number; height: number }): { width: number; height: number; explicit: boolean } {\n if (defaultPageSize) {\n return { ...defaultPageSize, explicit: true };\n }\n const physicalBox = Array.from(doc.getElementsByTagName(\"*\")).find((element) => element.localName === \"PhysicalBox\");\n if (physicalBox?.textContent) {\n const box = parseBoundary(physicalBox.textContent);\n if (box.width > 0 && box.height > 0) {\n return { width: box.width, height: box.height, explicit: true };\n }\n }\n return { width: 210, height: 297, explicit: false };\n}\n\nfunction parseOfdColor(element: Element, fallback: string, preferredLocalName = \"FillColor\"): string {\n const colorElement = findOfdChild(element, preferredLocalName) || findOfdChild(element, \"StrokeColor\") || findOfdChild(element, \"FillColor\");\n const value = colorElement ? getOfdAttribute(colorElement, \"Value\") : null;\n if (!value) {\n return fallback;\n }\n const parts = value.trim().split(/\\s+/).map((part) => Number(part));\n if (parts.length >= 3 && parts.every((part) => Number.isFinite(part))) {\n return `rgb(${parts.slice(0, 3).map((part) => Math.max(0, Math.min(255, part))).join(\" \")})`;\n }\n return fallback;\n}\n\nfunction parseOfdFill(element: Element): string {\n const fillElement = findOfdChild(element, \"FillColor\");\n return fillElement ? parseOfdColor(element, \"transparent\", \"FillColor\") : \"transparent\";\n}\n\nfunction findOfdChild(element: Element, localName: string): Element | undefined {\n return Array.from(element.children).find((child) => child.localName === localName);\n}\n\nfunction parsePoint(value: string | null, fallback: { x: number; y: number }): { x: number; y: number } {\n const parts = (value || \"\").trim().split(/\\s+/).map((part) => Number(part));\n return {\n x: Number.isFinite(parts[0]) ? parts[0] : fallback.x,\n y: Number.isFinite(parts[1]) ? parts[1] : fallback.y\n };\n}\n\nfunction normalizeOfdPathData(value: string): string {\n return value\n .replace(/\\bM\\s+/gi, \"M \")\n .replace(/\\bL\\s+/gi, \"L \")\n .replace(/\\bC\\s+/gi, \"C \")\n .replace(/\\bQ\\s+/gi, \"Q \")\n .replace(/\\bA\\s+/gi, \"A \")\n .replace(/\\bB\\s+/gi, \"C \")\n .replace(/\\bZ\\b/gi, \"Z\")\n .replace(/\\s+/g, \" \")\n .trim();\n}\n\nfunction parseOfdCtm(value: string | null): [number, number, number, number, number, number] | undefined {\n const parts = (value || \"\")\n .trim()\n .split(/\\s+/)\n .map((part) => Number(part));\n if (parts.length !== 6 || parts.some((part) => !Number.isFinite(part))) {\n return undefined;\n }\n return parts as [number, number, number, number, number, number];\n}\n\nfunction createOfdPathTransform(x: number, y: number, ctm?: [number, number, number, number, number, number]): string {\n if (!ctm) {\n return `translate(${x} ${y})`;\n }\n const [a, b, c, d, e, f] = ctm;\n return `translate(${x} ${y}) matrix(${a} ${b} ${c} ${d} ${e} ${f})`;\n}\n\nfunction parseOfdDeltaStep(value: string, fallback: number): number {\n const numbers = value.match(/-?\\d+(?:\\.\\d+)?/g)?.map((part) => Number(part)).filter((part) => Number.isFinite(part)) || [];\n return numbers.length > 0 ? numbers[numbers.length - 1] : fallback;\n}\n\nfunction parseOfdDeltaX(value: string | null): number[] | undefined {\n if (!value) {\n return undefined;\n }\n const parts = value.match(/[a-z]+|-?\\d+(?:\\.\\d+)?/gi) || [];\n const deltas: number[] = [];\n for (let index = 0; index < parts.length; index += 1) {\n const token = parts[index];\n if (/^g$/i.test(token)) {\n const count = Number(parts[index + 1]);\n const step = Number(parts[index + 2]);\n if (Number.isFinite(count) && Number.isFinite(step)) {\n deltas.push(...Array.from({ length: Math.max(0, Math.floor(count)) }, () => step));\n }\n index += 2;\n continue;\n }\n const numeric = Number(token);\n if (Number.isFinite(numeric)) {\n deltas.push(numeric);\n }\n }\n return deltas.length > 0 ? deltas : undefined;\n}\n\nfunction fontStackForOfdFont(fontName: string | undefined): string {\n const normalized = (fontName || \"\").trim().toLowerCase();\n if (normalized.includes(\"courier\")) {\n return '\"Courier New\", Courier, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace';\n }\n if (normalized.includes(\"kaiti\") || normalized.includes(\"kai\") || normalized.includes(\"楷\")) {\n return '\"STKaiti\", \"Kaiti SC\", \"KaiTi\", \"楷体\", serif';\n }\n if (normalized.includes(\"simsun\") || normalized.includes(\"simsong\") || normalized.includes(\"song\") || normalized.includes(\"宋\")) {\n return '\"SimSong\", \"Songti SC\", \"STSong\", SimSun, \"宋体\", serif';\n }\n if (normalized.includes(\"hei\") || normalized.includes(\"黑\")) {\n return '\"PingFang SC\", \"Microsoft YaHei\", SimHei, sans-serif';\n }\n return '\"SimSong\", \"Songti SC\", \"STSong\", SimSun, \"Noto Serif CJK SC\", serif';\n}\n\nfunction inferOfdTextAlign(text: string, boundary: { x: number; y: number; width: number; height: number }): \"start\" | \"end\" {\n const normalized = text.trim();\n if (!/^[¥¥]?\\d+(?:\\.\\d+)?%?$/.test(normalized)) {\n return \"start\";\n }\n if (boundary.x >= 75 || boundary.width <= 30) {\n return \"end\";\n }\n return \"start\";\n}\n\nfunction findOfdEntry(entries: JSZip.JSZipObject[], path: string): JSZip.JSZipObject | undefined {\n const normalized = normalizeOfdPath(path);\n return entries.find((entry) => normalizeOfdPath(entry.name) === normalized || normalizeOfdPath(entry.name).endsWith(`/${normalized}`));\n}\n\nfunction joinOfdPath(...parts: string[]): string {\n const joined = parts.filter(Boolean).join(\"/\");\n const segments: string[] = [];\n for (const segment of joined.split(\"/\")) {\n if (!segment || segment === \".\") {\n continue;\n }\n if (segment === \"..\") {\n segments.pop();\n continue;\n }\n segments.push(segment);\n }\n return segments.join(\"/\");\n}\n\nfunction directoryName(path: string): string {\n const normalized = normalizeOfdPath(path);\n const index = normalized.lastIndexOf(\"/\");\n return index >= 0 ? normalized.slice(0, index) : \"\";\n}\n\nfunction normalizeOfdPath(path: string): string {\n return path.replace(/\\\\/g, \"/\").replace(/^\\/+/, \"\").replace(/\\/+/g, \"/\");\n}\n\nfunction mimeTypeFromPath(path: string): string {\n const extension = path.split(\".\").pop()?.toLowerCase();\n const map: Record<string, string> = {\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n bmp: \"image/bmp\",\n webp: \"image/webp\"\n };\n return extension ? map[extension] || \"application/octet-stream\" : \"application/octet-stream\";\n}\n\nfunction parseBoundary(value: string | null): { x: number; y: number; width: number; height: number } {\n const parts = (value || \"\").trim().split(/\\s+/).map((part) => Number(part));\n return {\n x: Number.isFinite(parts[0]) ? parts[0] : 0,\n y: Number.isFinite(parts[1]) ? parts[1] : 0,\n width: Number.isFinite(parts[2]) ? parts[2] : 0,\n height: Number.isFinite(parts[3]) ? parts[3] : 0\n };\n}\n\nfunction getOfdAttribute(element: Element, localName: string): string | null {\n const direct = element.getAttribute(localName);\n if (direct !== null) {\n return direct;\n }\n for (const attribute of Array.from(element.attributes)) {\n if (attribute.localName === localName) {\n return attribute.value;\n }\n }\n return null;\n}\n\nfunction finiteNumber(value: string | null, fallback: number): number {\n const parsed = value === null ? Number.NaN : Number(value);\n return Number.isFinite(parsed) ? parsed : fallback;\n}\n\nfunction formatOfdCssNumber(value: number): string {\n return Number.isInteger(value) ? String(value) : value.toFixed(3).replace(/0+$/, \"\").replace(/\\.$/, \"\");\n}\n\nfunction createOfdFallback(fileName: string, url: string, detail: string): HTMLElement {\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n\n const title = document.createElement(\"strong\");\n title.textContent = \"OFD 解析失败\";\n\n const meta = document.createElement(\"span\");\n meta.textContent = `${detail}。可下载 ${fileName} 后使用本地 OFD 阅读器查看。`;\n\n const download = document.createElement(\"a\");\n download.href = url;\n download.download = fileName;\n download.textContent = \"下载 OFD\";\n\n fallback.append(title, meta, download);\n return fallback;\n}\n\nfunction normalizeOfdError(error: unknown): string {\n if (error instanceof Error && error.message) {\n return error.message;\n }\n return \"文件可能已损坏,或不是有效的 OFD 包\";\n}\n","import JSZip from \"jszip\";\nimport pako from \"pako\";\nimport type { PreviewPlugin, PreviewFile } from \"../types\";\nimport { normalizeFile } from \"../detect\";\nimport { fallbackPlugin } from \"./fallback\";\nimport { createObjectUrl, revokeObjectUrl } from \"../dom\";\nimport { appendMeta, createPanel, createSection, readArrayBuffer, resolveFormat } from \"./utils\";\n\nconst archiveExtensions = new Set([\"zip\", \"rar\", \"7z\", \"tar\", \"gz\", \"tgz\", \"bz2\", \"xz\"]);\nconst archiveMimeTypes = new Set([\n \"application/zip\",\n \"application/x-zip-compressed\",\n \"application/vnd.rar\",\n \"application/x-rar-compressed\",\n \"application/x-7z-compressed\",\n \"application/x-tar\",\n \"application/gzip\",\n \"application/x-gzip\",\n \"application/x-bzip2\",\n \"application/x-xz\"\n]);\nconst archiveMimeFormatMap: Record<string, string> = {\n \"application/zip\": \"zip\",\n \"application/x-zip-compressed\": \"zip\",\n \"application/vnd.rar\": \"rar\",\n \"application/x-rar-compressed\": \"rar\",\n \"application/x-7z-compressed\": \"7z\",\n \"application/x-tar\": \"tar\",\n \"application/gzip\": \"gz\",\n \"application/x-gzip\": \"gz\",\n \"application/x-bzip2\": \"bz2\",\n \"application/x-xz\": \"xz\"\n};\n\ninterface ArchiveEntry {\n name: string;\n unsafeName?: string;\n size: number;\n dir: boolean;\n read: () => Promise<ArrayBuffer>;\n}\n\ninterface ArchiveProbe {\n format: string;\n valid: boolean;\n error?: string;\n meta: Array<{ label: string; value: string }>;\n entries: Array<{ name: string; size?: number; packedSize?: number }>;\n note: string;\n}\n\nexport function archivePlugin(): PreviewPlugin {\n return {\n name: \"archive\",\n match(file) {\n return archiveExtensions.has(file.extension) || archiveMimeTypes.has(file.mimeType);\n },\n async render(ctx) {\n const url = createObjectUrl(ctx.file);\n const isExternal = Boolean(ctx.file.url);\n const panel = createPanel(\"ofv-archive\");\n ctx.viewport.append(panel);\n\n const ext = resolveFormat(ctx.file, archiveMimeFormatMap).toLowerCase();\n let archiveEntries: ArchiveEntry[] = [];\n let isEncrypted = false;\n let parseError: string | null = null;\n let archiveProbe: ArchiveProbe | null = null;\n\n // 1. Parse different archive formats\n try {\n if (ext === \"zip\") {\n try {\n const zip = await JSZip.loadAsync(await readArrayBuffer(ctx.file));\n archiveEntries = Object.values(zip.files).map((entry) => ({\n name: entry.name,\n unsafeName: (entry as any).unsafeOriginalName,\n size: (entry as any)._data?.uncompressedSize || 0,\n dir: entry.dir,\n read: () => entry.async(\"arraybuffer\")\n }));\n } catch (zipErr: any) {\n // Check for encryption errors\n if (\n zipErr.message &&\n (zipErr.message.includes(\"encrypted\") ||\n zipErr.message.includes(\"password\") ||\n zipErr.message.includes(\"protected\"))\n ) {\n isEncrypted = true;\n } else {\n throw zipErr;\n }\n }\n } else if (ext === \"tar\") {\n archiveEntries = untar(await readArrayBuffer(ctx.file));\n } else if (ext === \"gz\" || ext === \"tgz\" || ext === \"tar.gz\") {\n const u8 = new Uint8Array(await readArrayBuffer(ctx.file));\n const decompressed = pako.ungzip(u8);\n const originalName = ctx.file.name.endsWith(\".gz\")\n ? ctx.file.name.slice(0, -3)\n : ctx.file.name.endsWith(\".tgz\")\n ? ctx.file.name.slice(0, -4) + \".tar\"\n : ctx.file.name;\n\n if (ext === \"tgz\" || ext === \"tar.gz\" || originalName.endsWith(\".tar\")) {\n archiveEntries = untar(decompressed.buffer);\n } else {\n // Single decompressed file\n archiveEntries = [\n {\n name: originalName,\n size: decompressed.byteLength,\n dir: false,\n read: async () => decompressed.buffer\n }\n ];\n }\n } else if ([\"rar\", \"7z\", \"bz2\", \"xz\"].includes(ext)) {\n archiveProbe = probeArchiveHeader(await readArrayBuffer(ctx.file), ext);\n } else {\n parseError = `该格式 (.${ext.toUpperCase()}) 目前暂不支持直接在浏览器端在线解压和目录预览。`;\n }\n } catch (err: any) {\n parseError = `压缩包解析失败:${err.message || err}`;\n }\n\n // 2. Encrypted Archive Prompt UI\n if (isEncrypted) {\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n \n const title = document.createElement(\"strong\");\n title.textContent = \"该压缩包已被加密保护\";\n \n const meta = document.createElement(\"span\");\n meta.textContent = \"为了您的数据安全,本预览器不支持直接在线解密。请下载文件后在本地输入密码解压。\";\n \n const download = document.createElement(\"a\");\n download.href = url;\n download.download = ctx.file.name;\n download.textContent = \"下载文件\";\n \n fallback.append(title, meta, download);\n panel.append(fallback);\n ctx.viewport.classList.add(\"ofv-center\");\n \n return {\n destroy() {\n ctx.viewport.classList.remove(\"ofv-center\");\n revokeObjectUrl(url, isExternal);\n panel.remove();\n }\n };\n }\n\n if (archiveProbe) {\n renderArchiveProbe(panel, archiveProbe, ctx.file.name, url);\n return {\n destroy() {\n revokeObjectUrl(url, isExternal);\n panel.remove();\n }\n };\n }\n\n // 3. Fallback Unsupported message (RAR, 7z, etc.)\n if (parseError) {\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n \n const title = document.createElement(\"strong\");\n title.textContent = parseError;\n \n const meta = document.createElement(\"span\");\n meta.textContent = \"建议下载视频/文档等文件至本地查看,或使用原生解压工具提取内容。\";\n \n const download = document.createElement(\"a\");\n download.href = url;\n download.download = ctx.file.name;\n download.textContent = \"下载压缩包\";\n \n fallback.append(title, meta, download);\n panel.append(fallback);\n ctx.viewport.classList.add(\"ofv-center\");\n\n return {\n destroy() {\n ctx.viewport.classList.remove(\"ofv-center\");\n revokeObjectUrl(url, isExternal);\n panel.remove();\n }\n };\n }\n\n // 4. Split Layout UI for interactive preview\n const layout = document.createElement(\"div\");\n layout.className = \"ofv-archive-layout\";\n\n const sidebar = document.createElement(\"div\");\n sidebar.className = \"ofv-archive-sidebar\";\n const sidebarPanel = document.createElement(\"div\");\n sidebarPanel.className = \"ofv-archive-sidebar-panel\";\n\n const header = document.createElement(\"div\");\n header.className = \"ofv-archive-header\";\n const sidebarTitle = document.createElement(\"span\");\n sidebarTitle.className = \"ofv-archive-header-title\";\n sidebarTitle.textContent = `文件列表 (${archiveEntries.filter(e => !e.dir).length})`;\n const sidebarToggle = document.createElement(\"button\");\n sidebarToggle.className = \"ofv-archive-sidebar-toggle\";\n sidebarToggle.type = \"button\";\n sidebarToggle.setAttribute(\"aria-label\", \"展开文件列表\");\n sidebarToggle.setAttribute(\"aria-expanded\", \"false\");\n sidebarToggle.title = \"展开文件列表\";\n sidebarToggle.textContent = \"‹\";\n header.append(sidebarToggle, sidebarTitle);\n sidebarPanel.append(header);\n\n const tree = document.createElement(\"div\");\n tree.className = \"ofv-archive-tree\";\n sidebarPanel.append(tree);\n sidebar.append(sidebarPanel);\n\n const mainPanel = document.createElement(\"div\");\n mainPanel.className = \"ofv-archive-main\";\n\n layout.append(sidebar, mainPanel);\n panel.append(layout);\n\n let currentSubInstance: any = null;\n const getSidebarViewportWidth = () => ctx.viewport.clientWidth || ctx.size.width;\n const shouldAutoCollapseSidebar = () => getSidebarViewportWidth() <= 520;\n const setSidebarCollapsed = (collapsed: boolean) => {\n layout.classList.toggle(\"is-sidebar-collapsed\", collapsed);\n sidebarToggle.setAttribute(\"aria-expanded\", String(!collapsed));\n const label = collapsed ? \"展开文件列表\" : \"收起文件列表\";\n sidebarToggle.setAttribute(\"aria-label\", label);\n sidebarToggle.title = label;\n sidebarToggle.textContent = collapsed ? \"›\" : \"‹\";\n };\n setSidebarCollapsed(false);\n sidebarToggle.addEventListener(\"click\", () => {\n setSidebarCollapsed(!layout.classList.contains(\"is-sidebar-collapsed\"));\n });\n\n // Render default metadata summary\n const showDefaultSummary = () => {\n mainPanel.replaceChildren();\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-archive-info\";\n \n const heading = document.createElement(\"h3\");\n heading.textContent = ctx.file.name;\n\n const info = document.createElement(\"div\");\n info.className = \"ofv-archive-info-meta\";\n \n const fileCount = archiveEntries.filter(e => !e.dir).length;\n const dirCount = archiveEntries.filter(e => e.dir).length;\n \n appendArchiveInfo(info, \"格式类型\", `.${ext.toUpperCase()} 压缩文件`);\n appendArchiveInfo(info, \"包含文件数\", `${fileCount} 个`);\n appendArchiveInfo(info, \"包含目录数\", `${dirCount} 个`);\n appendArchiveInfo(info, \"操作提示\", \"请点击左侧栏中的文件进行联动预览。\");\n \n summary.append(heading, info, createArchiveSummary(archiveEntries));\n mainPanel.append(summary);\n };\n\n showDefaultSummary();\n\n // Filter and render items (max 500 to keep DOM lightweight)\n const visibleEntries = archiveEntries.filter(e => !e.dir).slice(0, 500);\n let destroyed = false;\n let renderToken = 0;\n\n visibleEntries.forEach((entry) => {\n const item = document.createElement(\"button\");\n item.className = \"ofv-archive-item\";\n item.type = \"button\";\n item.title = entry.name;\n\n const icon = document.createElement(\"span\");\n icon.className = \"ofv-archive-item-icon\";\n icon.textContent = getIcon(entry.name, entry.dir);\n\n const name = document.createElement(\"span\");\n name.className = \"ofv-archive-item-name\";\n name.textContent = entry.name;\n name.title = entry.name;\n\n item.append(icon, name);\n tree.append(item);\n\n item.addEventListener(\"click\", async () => {\n if (destroyed) {\n return;\n }\n if (shouldAutoCollapseSidebar()) {\n setSidebarCollapsed(true);\n }\n const token = ++renderToken;\n // Highlight active item\n sidebar.querySelectorAll(\".ofv-archive-item\").forEach((el) => {\n el.classList.remove(\"is-active\");\n el.removeAttribute(\"aria-current\");\n });\n item.classList.add(\"is-active\");\n item.setAttribute(\"aria-current\", \"true\");\n\n // Cleanup previous sub-preview\n if (currentSubInstance) {\n currentSubInstance.destroy();\n currentSubInstance = null;\n }\n\n // Show loading state\n mainPanel.replaceChildren(createArchiveLoading(entry.name.split(\"/\").pop() || entry.name));\n\n try {\n let buffer = await entry.read();\n if (destroyed || token !== renderToken) {\n return;\n }\n const subName = entry.name.split(\"/\").pop() || entry.name;\n const subExt = subName.split(\".\").pop()?.toLowerCase() || \"\";\n\n // Shapefile components linkage mechanism:\n // Combine adjacent .dbf, .shx, and .prj files into a single ZIP buffer in memory\n if (subExt === \"shp\") {\n const basePath = entry.name.slice(0, -4);\n const dbfEntry = archiveEntries.find(\n (e) => e.name.toLowerCase() === basePath.toLowerCase() + \".dbf\"\n );\n const shxEntry = archiveEntries.find(\n (e) => e.name.toLowerCase() === basePath.toLowerCase() + \".shx\"\n );\n if (dbfEntry && shxEntry) {\n const prjEntry = archiveEntries.find(\n (e) => e.name.toLowerCase() === basePath.toLowerCase() + \".prj\"\n );\n const newZip = new JSZip();\n newZip.file(subName, buffer);\n newZip.file(dbfEntry.name.split(\"/\").pop()!, await dbfEntry.read());\n newZip.file(shxEntry.name.split(\"/\").pop()!, await shxEntry.read());\n if (prjEntry) {\n newZip.file(prjEntry.name.split(\"/\").pop()!, await prjEntry.read());\n }\n buffer = await newZip.generateAsync({ type: \"arraybuffer\" });\n if (destroyed || token !== renderToken) {\n return;\n }\n }\n }\n\n const subContainer = document.createElement(\"div\");\n subContainer.style.cssText = \"width: 100%; height: 100%; position: relative; display: flex; flex-direction: column;\";\n mainPanel.replaceChildren(subContainer);\n\n const subViewport = document.createElement(\"div\");\n subViewport.className = \"ofv-viewport\";\n subViewport.style.cssText = \"flex: 1; width: 100%; height: 100%; position: relative; overflow: auto;\";\n subContainer.append(subViewport);\n\n const subFile: PreviewFile = await normalizeFile(buffer, subName);\n\n const plugins = [...(ctx.options.plugins || []), fallbackPlugin()];\n let matchedPlugin = await findSubPreviewPlugin(plugins, subFile);\n if (destroyed || token !== renderToken) {\n return;\n }\n if (matchedPlugin.name === \"archive\") {\n matchedPlugin = fallbackPlugin();\n }\n\n let previewError: Error | undefined;\n const nextSubInstance = await Promise.resolve()\n .then(() =>\n matchedPlugin.render({\n host: ctx.host,\n viewport: subViewport,\n file: subFile,\n size: { width: subViewport.clientWidth || 600, height: subViewport.clientHeight || 400 },\n options: ctx.options,\n setLoading: () => {},\n setError: (err) => {\n previewError = err instanceof Error ? err : new Error(String(err));\n subViewport.replaceChildren(createInlineError(\"文件预览失败\", previewError.message));\n }\n })\n )\n .catch((error: unknown) => {\n previewError = error instanceof Error ? error : new Error(String(error));\n subViewport.replaceChildren(createInlineError(\"文件预览失败\", previewError.message));\n return undefined;\n });\n if (destroyed || token !== renderToken) {\n nextSubInstance?.destroy();\n return;\n }\n if (nextSubInstance && !previewError) {\n currentSubInstance = nextSubInstance;\n } else if (nextSubInstance) {\n nextSubInstance.destroy();\n }\n } catch (err: any) {\n if (destroyed || token !== renderToken) {\n return;\n }\n mainPanel.replaceChildren(createInlineError(\"解压加载失败\", String(err.message || err)));\n }\n });\n });\n\n return {\n resize(size) {\n currentSubInstance?.resize?.(size);\n },\n destroy() {\n destroyed = true;\n renderToken += 1;\n if (currentSubInstance) {\n currentSubInstance.destroy();\n }\n revokeObjectUrl(url, isExternal);\n panel.remove();\n }\n };\n }\n };\n}\n\nasync function findSubPreviewPlugin(plugins: PreviewPlugin[], file: PreviewFile): Promise<PreviewPlugin> {\n for (const plugin of plugins) {\n if (await plugin.match(file)) {\n return plugin;\n }\n }\n return fallbackPlugin();\n}\n\nfunction createInlineError(titleText: string, detailText: string): HTMLElement {\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n const title = document.createElement(\"strong\");\n title.textContent = titleText;\n const detail = document.createElement(\"span\");\n detail.textContent = detailText;\n fallback.append(title, detail);\n return fallback;\n}\n\nfunction appendArchiveInfo(parent: HTMLElement, label: string, value: string): void {\n const row = document.createElement(\"div\");\n const key = document.createElement(\"strong\");\n key.textContent = `${label}:`;\n row.append(key, document.createTextNode(value));\n parent.append(row);\n}\n\nfunction createArchiveSummary(entries: ArchiveEntry[]): HTMLElement {\n const files = entries.filter((entry) => !entry.dir);\n const summary = document.createElement(\"dl\");\n summary.className = \"ofv-archive-summary\";\n const totalSize = files.reduce((sum, entry) => sum + entry.size, 0);\n const largest = files.reduce<ArchiveEntry | undefined>((current, entry) => (!current || entry.size > current.size ? entry : current), undefined);\n appendArchiveSummary(summary, \"总解压大小\", formatBytes(totalSize));\n appendArchiveSummary(summary, \"最大文件\", largest ? `${largest.name} · ${formatBytes(largest.size)}` : \"无\");\n appendArchiveSummary(summary, \"类型分布\", formatArchiveExtensions(files));\n appendArchiveSummary(summary, \"可预览条目\", String(files.slice(0, 500).length));\n appendArchiveSummary(summary, \"风险路径\", String(files.filter((entry) => isRiskyArchivePath(entry.unsafeName || entry.name)).length));\n return summary;\n}\n\nfunction appendArchiveSummary(parent: HTMLElement, label: string, value: string): void {\n const key = document.createElement(\"dt\");\n key.textContent = label;\n const content = document.createElement(\"dd\");\n content.textContent = value;\n parent.append(key, content);\n}\n\nfunction formatArchiveExtensions(entries: ArchiveEntry[]): string {\n const counts = new Map<string, number>();\n for (const entry of entries) {\n const name = entry.name.split(\"/\").pop() || entry.name;\n const index = name.lastIndexOf(\".\");\n const extension = index > 0 ? name.slice(index + 1).toLowerCase() : \"(无扩展名)\";\n counts.set(extension, (counts.get(extension) || 0) + 1);\n }\n return [...counts.entries()]\n .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))\n .slice(0, 6)\n .map(([extension, count]) => `${extension} ${count}`)\n .join(\", \") || \"无\";\n}\n\nfunction isRiskyArchivePath(name: string): boolean {\n return name.startsWith(\"/\") || /^[A-Za-z]:[\\\\/]/.test(name) || name.split(/[\\\\/]+/).includes(\"..\");\n}\n\nfunction createArchiveLoading(fileName: string): HTMLElement {\n const loading = document.createElement(\"div\");\n loading.className = \"ofv-archive-loading\";\n const spinner = document.createElement(\"div\");\n spinner.className = \"ofv-archive-loading-spinner\";\n const text = document.createElement(\"span\");\n text.textContent = `正在解压并加载 [${fileName}]...`;\n loading.append(spinner, text);\n return loading;\n}\n\nfunction renderArchiveProbe(panel: HTMLElement, probe: ArchiveProbe, fileName: string, url: string): void {\n const section = createSection(`${probe.format} 结构预览`);\n const note = document.createElement(\"p\");\n note.textContent = probe.note;\n\n const meta = document.createElement(\"div\");\n meta.className = \"ofv-archive-probe-meta\";\n appendArchiveInfo(meta, \"文件\", fileName);\n appendArchiveInfo(meta, \"格式\", probe.format);\n for (const item of probe.meta) {\n appendArchiveInfo(meta, item.label, item.value);\n }\n\n const download = document.createElement(\"a\");\n download.className = \"ofv-asset-download\";\n download.href = url;\n download.download = fileName;\n download.textContent = \"下载压缩包\";\n\n section.append(note, meta, download);\n\n if (!probe.valid) {\n const error = document.createElement(\"p\");\n error.className = \"ofv-data-error\";\n error.textContent = probe.error || \"压缩包头信息无法识别。\";\n section.append(error);\n }\n\n if (probe.entries.length > 0) {\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-table-scroll ofv-archive-probe-table\";\n const table = document.createElement(\"table\");\n const thead = document.createElement(\"thead\");\n const header = document.createElement(\"tr\");\n for (const label of [\"文件\", \"原始大小\", \"压缩大小\"]) {\n const th = document.createElement(\"th\");\n th.textContent = label;\n header.append(th);\n }\n thead.append(header);\n const tbody = document.createElement(\"tbody\");\n for (const entry of probe.entries.slice(0, 200)) {\n const tr = document.createElement(\"tr\");\n for (const value of [\n entry.name,\n entry.size === undefined ? \"未知\" : formatBytes(entry.size),\n entry.packedSize === undefined ? \"未知\" : formatBytes(entry.packedSize)\n ]) {\n const td = document.createElement(\"td\");\n td.textContent = value;\n tr.append(td);\n }\n tbody.append(tr);\n }\n table.append(thead, tbody);\n wrapper.append(table);\n section.append(wrapper);\n }\n\n panel.append(section);\n}\n\nfunction probeArchiveHeader(arrayBuffer: ArrayBuffer, extension: string): ArchiveProbe {\n const bytes = new Uint8Array(arrayBuffer);\n if (extension === \"rar\") {\n return probeRar(bytes);\n }\n if (extension === \"7z\") {\n return probe7z(bytes);\n }\n if (extension === \"bz2\") {\n return probeBzip2(bytes);\n }\n if (extension === \"xz\") {\n return probeXz(bytes);\n }\n return {\n format: extension.toUpperCase(),\n valid: false,\n error: \"暂不支持该压缩格式的头信息解析。\",\n meta: [],\n entries: [],\n note: \"当前仅提供压缩包识别和下载入口。\"\n };\n}\n\nfunction probeRar(bytes: Uint8Array): ArchiveProbe {\n const rar4 = bytes.length >= 7 && bytes[0] === 0x52 && bytes[1] === 0x61 && bytes[2] === 0x72 && bytes[3] === 0x21 && bytes[4] === 0x1a && bytes[5] === 0x07 && bytes[6] === 0x00;\n const rar5 = bytes.length >= 8 && bytes[0] === 0x52 && bytes[1] === 0x61 && bytes[2] === 0x72 && bytes[3] === 0x21 && bytes[4] === 0x1a && bytes[5] === 0x07 && bytes[6] === 0x01 && bytes[7] === 0x00;\n const entries = rar4 ? parseRar4Entries(bytes) : [];\n return {\n format: \"RAR\",\n valid: rar4 || rar5,\n error: rar4 || rar5 ? undefined : \"缺少 RAR signature。\",\n meta: [\n { label: \"版本\", value: rar5 ? \"RAR5\" : rar4 ? \"RAR4\" : \"未知\" },\n { label: \"签名\", value: byteSignature(bytes) },\n { label: \"可见条目\", value: String(entries.length) }\n ],\n entries,\n note: rar4\n ? \"当前轻量读取 RAR4 未加密文件头,用于目录确认;实际解压仍建议接入 unrar WASM 或本地工具。\"\n : \"当前识别 RAR 容器和版本;RAR5 目录解析需要专用解码器。\"\n };\n}\n\nfunction parseRar4Entries(bytes: Uint8Array): ArchiveProbe[\"entries\"] {\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const entries: ArchiveProbe[\"entries\"] = [];\n let offset = 7;\n while (offset + 7 <= bytes.length && entries.length < 200) {\n const type = bytes[offset + 2];\n const flags = view.getUint16(offset + 3, true);\n let headerSize = view.getUint16(offset + 5, true);\n if (headerSize < 7 || offset + headerSize > bytes.length) {\n break;\n }\n if ((flags & 0x8000) !== 0) {\n if (offset + 11 > bytes.length) {\n break;\n }\n headerSize += view.getUint32(offset + 7, true);\n }\n if (type === 0x74 && offset + 32 <= bytes.length) {\n const packedSize = view.getUint32(offset + 7, true);\n const unpackedSize = view.getUint32(offset + 11, true);\n const nameSize = view.getUint16(offset + 26, true);\n const nameOffset = offset + 32;\n const nameEnd = Math.min(nameOffset + nameSize, offset + headerSize, bytes.length);\n const nameBytes = bytes.slice(nameOffset, nameEnd);\n const name = new TextDecoder(\"latin1\").decode(nameBytes).replace(/\\0.*$/, \"\");\n if (name) {\n entries.push({ name, size: unpackedSize, packedSize });\n }\n }\n offset += headerSize;\n }\n return entries;\n}\n\nfunction probe7z(bytes: Uint8Array): ArchiveProbe {\n const valid = bytes.length >= 32 && bytes[0] === 0x37 && bytes[1] === 0x7a && bytes[2] === 0xbc && bytes[3] === 0xaf && bytes[4] === 0x27 && bytes[5] === 0x1c;\n const meta: ArchiveProbe[\"meta\"] = [{ label: \"签名\", value: byteSignature(bytes) }];\n if (valid) {\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n meta.push({ label: \"版本\", value: `${bytes[6]}.${bytes[7]}` });\n meta.push({ label: \"Next header offset\", value: String(readUint64Le(view, 12)) });\n meta.push({ label: \"Next header size\", value: String(readUint64Le(view, 20)) });\n meta.push({ label: \"Next header CRC\", value: `0x${view.getUint32(28, true).toString(16).toUpperCase()}` });\n }\n return {\n format: \"7Z\",\n valid,\n error: valid ? undefined : \"缺少 7z signature。\",\n meta,\n entries: [],\n note: \"当前识别 7z 容器和 next header 边界;目录和解压需要 LZMA/7z 专用解码器。\"\n };\n}\n\nfunction probeBzip2(bytes: Uint8Array): ArchiveProbe {\n const valid = bytes.length >= 4 && bytes[0] === 0x42 && bytes[1] === 0x5a && bytes[2] === 0x68 && bytes[3] >= 0x31 && bytes[3] <= 0x39;\n return {\n format: \"BZIP2\",\n valid,\n error: valid ? undefined : \"缺少 BZh magic header。\",\n meta: [\n { label: \"签名\", value: byteSignature(bytes) },\n { label: \"块大小\", value: valid ? `${String.fromCharCode(bytes[3])}00 KB` : \"未知\" }\n ],\n entries: [],\n note: \"BZIP2 通常是单文件压缩流,本预览器当前展示容器头信息;解压可后续接入 bzip2 解码器。\"\n };\n}\n\nfunction probeXz(bytes: Uint8Array): ArchiveProbe {\n const valid = bytes.length >= 6 && bytes[0] === 0xfd && bytes[1] === 0x37 && bytes[2] === 0x7a && bytes[3] === 0x58 && bytes[4] === 0x5a && bytes[5] === 0x00;\n return {\n format: \"XZ\",\n valid,\n error: valid ? undefined : \"缺少 XZ magic header。\",\n meta: [\n { label: \"签名\", value: byteSignature(bytes) },\n { label: \"Stream flags\", value: bytes.length >= 8 ? `0x${bytes[6].toString(16).padStart(2, \"0\").toUpperCase()} 0x${bytes[7].toString(16).padStart(2, \"0\").toUpperCase()}` : \"未知\" }\n ],\n entries: [],\n note: \"XZ 通常是单文件 LZMA2 压缩流,本预览器当前展示容器头信息;解压可后续接入 xz/lzma 解码器。\"\n };\n}\n\nfunction readUint64Le(view: DataView, offset: number): bigint {\n return BigInt(view.getUint32(offset, true)) | (BigInt(view.getUint32(offset + 4, true)) << 32n);\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) {\n return `${bytes} B`;\n }\n if (bytes < 1024 * 1024) {\n return `${(bytes / 1024).toFixed(1)} KB`;\n }\n return `${(bytes / 1024 / 1024).toFixed(2)} MB`;\n}\n\nfunction byteSignature(bytes: Uint8Array): string {\n if (bytes.length === 0) {\n return \"空文件\";\n }\n const ascii = new TextDecoder(\"ascii\").decode(bytes.slice(0, Math.min(bytes.length, 16))).replace(/[^\\x20-\\x7E]/g, \".\");\n const hex = Array.from(bytes.slice(0, Math.min(bytes.length, 8)))\n .map((byte) => byte.toString(16).padStart(2, \"0\").toUpperCase())\n .join(\" \");\n return `${ascii} (${hex})`;\n}\n\n// 5. Lightweight TAR parser\nfunction untar(arrayBuffer: ArrayBuffer): ArchiveEntry[] {\n const entries: ArchiveEntry[] = [];\n const u8 = new Uint8Array(arrayBuffer);\n let offset = 0;\n\n const readString = (start: number, length: number): string => {\n let end = start;\n while (end < start + length && u8[end] !== 0) {\n end++;\n }\n return new TextDecoder().decode(u8.subarray(start, end)).trim();\n };\n\n while (offset + 512 <= arrayBuffer.byteLength) {\n const magic = readString(offset + 257, 6);\n if (magic !== \"ustar\" && magic !== \"ustar\\0\") {\n let allZero = true;\n for (let i = 0; i < 512; i++) {\n if (u8[offset + i] !== 0) {\n allZero = false;\n break;\n }\n }\n if (allZero) {\n break; // End of archive\n }\n break;\n }\n\n const name = readString(offset, 100);\n const prefix = readString(offset + 345, 155);\n const fullName = prefix ? `${prefix}/${name}` : name;\n\n const sizeStr = readString(offset + 124, 12);\n const size = parseInt(sizeStr, 8) || 0;\n const typeflag = readString(offset + 156, 1);\n const dir = typeflag === \"5\" || fullName.endsWith(\"/\");\n\n const contentOffset = offset + 512;\n entries.push({\n name: fullName,\n size,\n dir,\n read: async () => arrayBuffer.slice(contentOffset, contentOffset + size)\n });\n\n offset += 512 + Math.ceil(size / 512) * 512;\n }\n\n return entries;\n}\n\n// 6. UI Helpers\nfunction getIcon(name: string, dir: boolean): string {\n if (dir) return \"📁\";\n const ext = name.split(\".\").pop()?.toLowerCase();\n switch (ext) {\n case \"png\":\n case \"jpg\":\n case \"jpeg\":\n case \"gif\":\n case \"svg\":\n case \"webp\":\n return \"🖼️\";\n case \"pdf\":\n return \"📕\";\n case \"doc\":\n case \"docx\":\n return \"📘\";\n case \"xls\":\n case \"xlsx\":\n return \"📗\";\n case \"ppt\":\n case \"pptx\":\n return \"📙\";\n case \"zip\":\n case \"rar\":\n case \"7z\":\n case \"tar\":\n case \"gz\":\n return \"📦\";\n case \"mp4\":\n case \"mkv\":\n case \"avi\":\n case \"webm\":\n return \"🎥\";\n case \"mp3\":\n case \"wav\":\n case \"ogg\":\n return \"🎵\";\n case \"txt\":\n case \"md\":\n case \"html\":\n case \"js\":\n case \"ts\":\n case \"json\":\n case \"css\":\n return \"📄\";\n default:\n return \"📄\";\n }\n}\n","import DOMPurify from \"dompurify\";\nimport type { PreviewPlugin } from \"../types\";\nimport { appendMeta, createPanel, createSection, readArrayBuffer, readTextFile, resolveFormat } from \"./utils\";\nimport { createObjectUrl, revokeObjectUrl } from \"../dom\";\n\nconst emailExtensions = new Set([\"eml\", \"msg\", \"mbox\"]);\nconst emailMimeTypes = new Set([\"message/rfc822\", \"application/vnd.ms-outlook\", \"application/mbox\"]);\nconst emailMimeFormatMap: Record<string, string> = {\n \"message/rfc822\": \"eml\",\n \"application/vnd.ms-outlook\": \"msg\",\n \"application/mbox\": \"mbox\"\n};\n\ninterface EmailAttachment {\n name: string;\n mimeType: string;\n content: Uint8Array;\n contentId?: string;\n}\n\ninterface EmailData {\n from: string;\n to: string;\n cc?: string;\n subject: string;\n date: string;\n bodyText?: string;\n bodyHtml?: string;\n attachments: EmailAttachment[];\n}\n\ninterface MboxMessageSummary {\n from: string;\n subject: string;\n date: string;\n}\n\nexport function emailPlugin(): PreviewPlugin {\n return {\n name: \"email\",\n match(file) {\n return emailExtensions.has(file.extension) || emailMimeTypes.has(file.mimeType);\n },\n async render(ctx) {\n const panel = createPanel(\"ofv-email\");\n ctx.viewport.append(panel);\n\n const url = createObjectUrl(ctx.file);\n const isExternal = Boolean(ctx.file.url);\n const ext = resolveFormat(ctx.file, emailMimeFormatMap).toLowerCase();\n let emailData: EmailData;\n const objectUrlsToRevoke: string[] = [];\n const attachmentObjectUrls = new Map<EmailAttachment, string>();\n const timersToClear: number[] = [];\n let mboxSummary: MboxMessageSummary[] = [];\n\n try {\n if (ext === \"msg\") {\n // Parse Outlook binary MSG format\n const MsgReader = (await import(\"@kenjiuno/msgreader\")).default;\n const buffer = await readArrayBuffer(ctx.file);\n const reader = new MsgReader(buffer);\n const parsed = reader.getFileData();\n\n if (parsed.error) {\n throw new Error(parsed.error);\n }\n\n const from = parsed.senderName\n ? `${parsed.senderName} <${parsed.senderEmail || parsed.senderSmtpAddress || \"\"}>`.trim()\n : parsed.senderEmail || parsed.senderSmtpAddress || \"\";\n\n const recipients = parsed.recipients || [];\n const to = recipients\n .filter((r) => r.recipType === \"to\")\n .map((r) => `${r.name || \"\"} <${r.email || r.smtpAddress || \"\"}>`.trim())\n .join(\"; \");\n const cc = recipients\n .filter((r) => r.recipType === \"cc\")\n .map((r) => `${r.name || \"\"} <${r.email || r.smtpAddress || \"\"}>`.trim())\n .join(\"; \");\n\n const attachments: EmailAttachment[] = [];\n if (Array.isArray(parsed.attachments)) {\n parsed.attachments.forEach((att) => {\n try {\n const fullAtt = reader.getAttachment(att);\n attachments.push({\n name: fullAtt.fileName || \"未命名附件\",\n mimeType: getAttachmentMimeType(fullAtt, att),\n content: fullAtt.content,\n contentId: att.pidContentId\n });\n } catch (attErr) {\n console.warn(\"Failed to parse attachment:\", attErr);\n }\n });\n }\n\n let bodyHtml = parsed.bodyHtml;\n if (!bodyHtml && parsed.html instanceof Uint8Array) {\n bodyHtml = new TextDecoder(\"utf-8\").decode(parsed.html);\n }\n\n emailData = {\n from: from || \"-\",\n to: to || \"-\",\n cc: cc || \"\",\n subject: parsed.subject || \"(无主题)\",\n date: parsed.messageDeliveryTime || parsed.clientSubmitTime || parsed.creationTime || \"-\",\n bodyText: parsed.body,\n bodyHtml,\n attachments\n };\n } else {\n // Parse EML or MBOX text formats\n const PostalMime = (await import(\"postal-mime\")).default;\n const parser = new PostalMime();\n \n let rawText = await readTextFile(ctx.file);\n if (ext === \"mbox\") {\n const messages = splitMboxMessages(rawText);\n mboxSummary = messages.map(summarizeMboxMessage);\n rawText = messages[0] || rawText;\n }\n\n const parsed = await parser.parse(rawText);\n\n const from = parsed.from ? `${parsed.from.name || \"\"} <${parsed.from.address || \"\"}>`.trim() : \"\";\n const to = Array.isArray(parsed.to)\n ? parsed.to.map((t) => `${t.name || \"\"} <${t.address || \"\"}>`.trim()).join(\"; \")\n : \"\";\n const cc = Array.isArray(parsed.cc)\n ? parsed.cc.map((c) => `${c.name || \"\"} <${c.address || \"\"}>`.trim()).join(\"; \")\n : \"\";\n\n emailData = {\n from: from || \"-\",\n to: to || \"-\",\n cc: cc || \"\",\n subject: parsed.subject || \"(无主题)\",\n date: parsed.date || \"-\",\n bodyText: parsed.text,\n bodyHtml: parsed.html,\n attachments: (parsed.attachments || []).map((att) => ({\n name: att.filename || \"未命名附件\",\n mimeType: att.mimeType || \"application/octet-stream\",\n content: att.content instanceof Uint8Array ? att.content : new Uint8Array(att.content as any),\n contentId: att.contentId\n }))\n };\n }\n\n if (mboxSummary.length > 0) {\n panel.append(createMboxSummarySection(mboxSummary));\n }\n\n // 1. Render Header information section\n const headerSection = createSection(\"邮件信息\");\n appendMeta(headerSection, \"Subject\", emailData.subject);\n appendMeta(headerSection, \"From\", emailData.from);\n appendMeta(headerSection, \"To\", emailData.to);\n if (emailData.cc) {\n appendMeta(headerSection, \"Cc\", emailData.cc);\n }\n appendMeta(headerSection, \"Date\", emailData.date);\n panel.append(headerSection);\n\n // 2. Render Attachments section if present\n if (emailData.attachments.length > 0) {\n const attachmentsSection = createSection(\"附件列表\");\n const container = document.createElement(\"div\");\n container.className = \"ofv-email-attachments\";\n\n emailData.attachments.forEach((att) => {\n const blobUrl = getAttachmentObjectUrl(att, attachmentObjectUrls, objectUrlsToRevoke);\n\n const item = document.createElement(\"a\");\n item.className = \"ofv-email-attachment-item\";\n item.href = blobUrl;\n item.download = att.name;\n item.rel = \"noopener noreferrer\";\n \n // Format attachment size helper\n const sizeKB = Math.round(att.content.byteLength / 1024);\n item.textContent = `Attachment: ${att.name} (${sizeKB} KB)`;\n container.append(item);\n });\n \n attachmentsSection.append(container);\n panel.append(attachmentsSection);\n }\n\n // 3. Render Body section (support inline cid images)\n const bodySection = createSection(\"正文\");\n panel.append(bodySection);\n\n let html = emailData.bodyHtml;\n if (html) {\n // Replace inline cid: content IDs with local blob URLs\n let nextHtml = html;\n emailData.attachments.forEach((att) => {\n const contentId = att.contentId;\n if (contentId) {\n const blobUrl = getAttachmentObjectUrl(att, attachmentObjectUrls, objectUrlsToRevoke);\n\n const cleanCid = contentId.replace(/[<>]/g, \"\");\n nextHtml = replaceCidResourceUrls(nextHtml, contentId, blobUrl);\n if (cleanCid !== contentId) {\n nextHtml = replaceCidResourceUrls(nextHtml, cleanCid, blobUrl);\n }\n }\n });\n html = nextHtml;\n const sanitizedHtml = sanitizeEmailHtml(html);\n\n // Render in a sandboxed iframe to prevent styles leaking\n const iframe = document.createElement(\"iframe\");\n iframe.className = \"ofv-email-body-iframe\";\n iframe.setAttribute(\"sandbox\", \"allow-popups allow-popups-to-escape-sandbox\");\n iframe.style.cssText = \"width: 100%; border: none; background: #fff; min-height: 200px;\";\n bodySection.append(iframe);\n\n iframe.onload = () => {\n try {\n const idoc = iframe.contentDocument || iframe.contentWindow?.document;\n if (idoc) {\n idoc.open();\n idoc.write(`\n <!doctype html>\n <html>\n <head>\n <meta charset=\"utf-8\" />\n <style>\n body {\n margin: 16px;\n padding: 0;\n font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n font-size: 14px;\n line-height: 1.6;\n color: #1f2937;\n }\n img { max-width: 100%; height: auto; display: block; margin: 12px 0; }\n a { color: #2563eb; }\n blockquote {\n margin: 12px 0;\n padding-left: 12px;\n border-left: 3px solid #d1d5db;\n color: #4b5563;\n }\n </style>\n </head>\n <body>${sanitizedHtml}</body>\n </html>\n `);\n idoc.close();\n secureEmailLinks(idoc);\n\n // Auto-adjust height to avoid double scrolling\n const resize = () => {\n const body = idoc.body;\n const docEl = idoc.documentElement;\n const height = Math.max(\n body.scrollHeight,\n body.offsetHeight,\n docEl.clientHeight,\n docEl.scrollHeight,\n docEl.offsetHeight\n );\n iframe.style.height = `${height + 32}px`;\n };\n\n resize();\n timersToClear.push(window.setTimeout(resize, 300));\n timersToClear.push(window.setTimeout(resize, 1000));\n }\n } catch (err) {\n console.error(\"Failed to write html body to email iframe:\", err);\n }\n };\n } else {\n // Render plain text body\n const pre = document.createElement(\"pre\");\n pre.className = \"ofv-text-block\";\n pre.textContent = emailData.bodyText || \"未解析到正文。\";\n bodySection.append(pre);\n }\n\n } catch (err: any) {\n panel.replaceChildren();\n const errorSection = createSection(\"邮件解析出错\");\n const pre = document.createElement(\"pre\");\n pre.className = \"ofv-text-block\";\n pre.style.color = \"#ef4444\";\n pre.textContent = `解析邮件时发生错误:\\n${err.message || err}`;\n errorSection.append(pre);\n panel.append(errorSection);\n }\n\n return {\n destroy() {\n timersToClear.forEach((timer) => window.clearTimeout(timer));\n objectUrlsToRevoke.forEach((u) => {\n URL.revokeObjectURL(u);\n });\n revokeObjectUrl(url, isExternal);\n panel.remove();\n }\n };\n }\n };\n}\n\nfunction getAttachmentObjectUrl(\n attachment: EmailAttachment,\n cache: Map<EmailAttachment, string>,\n urlsToRevoke: string[]\n): string {\n const cached = cache.get(attachment);\n if (cached) {\n return cached;\n }\n const blob = new Blob([attachment.content as BlobPart], { type: attachment.mimeType });\n const url = URL.createObjectURL(blob);\n cache.set(attachment, url);\n urlsToRevoke.push(url);\n return url;\n}\n\nfunction getAttachmentMimeType(fullAttachment: unknown, attachmentMeta?: unknown): string {\n const candidates = [fullAttachment, attachmentMeta];\n for (const candidate of candidates) {\n if (!candidate || typeof candidate !== \"object\") {\n continue;\n }\n const record = candidate as Record<string, unknown>;\n const explicitMime =\n normalizeMimeValue(record.attachMimeTag) ||\n normalizeMimeValue(record.mimeType) ||\n normalizeMimeValue(record.contentType) ||\n normalizeMimeValue(record.mime) ||\n normalizeMimeValue(record[\"content-type\"]);\n if (explicitMime) {\n return explicitMime;\n }\n }\n\n const fileName =\n (fullAttachment && typeof fullAttachment === \"object\" ? (fullAttachment as { fileName?: unknown }).fileName : undefined) ||\n (attachmentMeta && typeof attachmentMeta === \"object\" ? (attachmentMeta as { fileName?: unknown }).fileName : undefined);\n return getMimeType(typeof fileName === \"string\" ? fileName : \"\");\n}\n\nfunction normalizeMimeValue(value: unknown): string {\n if (typeof value !== \"string\") {\n return \"\";\n }\n const mimeType = value.split(\";\")[0]?.trim().toLowerCase() || \"\";\n return mimeType.includes(\"/\") ? mimeType : \"\";\n}\n\nfunction replaceCidResourceUrls(html: string, contentId: string, blobUrl: string): string {\n const escapedCid = escapeRegExp(contentId);\n return html.replace(\n new RegExp(`\\\\b(src|poster|background)=([\"'])cid:${escapedCid}\\\\2`, \"gi\"),\n (_match, attribute: string, quote: string) => `${attribute}=${quote}${blobUrl}${quote}`\n );\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction createMboxSummarySection(messages: MboxMessageSummary[]): HTMLElement {\n const section = createSection(\"MBOX 邮箱摘要\");\n const meta = document.createElement(\"div\");\n meta.className = \"ofv-email-mbox-meta\";\n appendMeta(meta, \"邮件数\", String(messages.length));\n appendMeta(meta, \"预览\", \"当前正文显示第一封邮件\");\n\n const tableWrap = document.createElement(\"div\");\n tableWrap.className = \"ofv-table-scroll ofv-email-mbox-table\";\n const table = document.createElement(\"table\");\n const thead = document.createElement(\"thead\");\n const header = document.createElement(\"tr\");\n for (const label of [\"#\", \"Subject\", \"From\", \"Date\"]) {\n const th = document.createElement(\"th\");\n th.textContent = label;\n header.append(th);\n }\n thead.append(header);\n const tbody = document.createElement(\"tbody\");\n messages.slice(0, 100).forEach((message, index) => {\n const row = document.createElement(\"tr\");\n for (const value of [String(index + 1), message.subject || \"(无主题)\", message.from || \"-\", message.date || \"-\"]) {\n const cell = document.createElement(\"td\");\n cell.textContent = value;\n row.append(cell);\n }\n tbody.append(row);\n });\n table.append(thead, tbody);\n tableWrap.append(table);\n section.append(meta, tableWrap);\n return section;\n}\n\nfunction splitMboxMessages(mboxText: string): string[] {\n const lines = mboxText.replace(/\\r\\n/g, \"\\n\").split(\"\\n\");\n const messages: string[][] = [];\n let current: string[] | null = null;\n let foundFirstFrom = false;\n\n for (const line of lines) {\n if (line.startsWith(\"From \")) {\n if (current && current.length > 0) {\n messages.push(current);\n }\n current = [];\n foundFirstFrom = true;\n continue;\n }\n if (foundFirstFrom && current) {\n current.push(line.startsWith(\">From \") ? line.slice(1) : line);\n }\n }\n if (current && current.length > 0) {\n messages.push(current);\n }\n return messages.length > 0 ? messages.map((message) => message.join(\"\\n\")) : [mboxText];\n}\n\nfunction summarizeMboxMessage(message: string): MboxMessageSummary {\n return {\n from: unfoldHeader(readHeaderValue(message, \"From\")),\n subject: unfoldHeader(readHeaderValue(message, \"Subject\")),\n date: unfoldHeader(readHeaderValue(message, \"Date\"))\n };\n}\n\nfunction readHeaderValue(message: string, name: string): string {\n const headers = message.split(/\\n\\s*\\n/, 1)[0] || \"\";\n const escaped = name.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const match = headers.match(new RegExp(`^${escaped}:\\\\s*([\\\\s\\\\S]*?)(?=\\\\n[^\\\\s:]+:|\\\\n\\\\s*\\\\n|$)`, \"im\"));\n return match?.[1]?.trim() || \"\";\n}\n\nfunction unfoldHeader(value: string): string {\n return value.replace(/\\n[ \\t]+/g, \" \").trim();\n}\n\n// File extension to MIME type helper for attachment previews\nfunction getMimeType(name: string): string {\n const ext = name.split(\".\").pop()?.toLowerCase();\n const map: Record<string, string> = {\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n svg: \"image/svg+xml\",\n pdf: \"application/pdf\",\n docx: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n xlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n pptx: \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n txt: \"text/plain\",\n md: \"text/markdown\",\n html: \"text/html\",\n mp4: \"video/mp4\",\n mp3: \"audio/mpeg\",\n wav: \"audio/wav\"\n };\n return ext ? map[ext] || \"application/octet-stream\" : \"application/octet-stream\";\n}\n\nfunction sanitizeEmailHtml(html: string): string {\n return DOMPurify.sanitize(html, {\n USE_PROFILES: { html: true },\n ADD_ATTR: [\"target\"],\n ALLOWED_URI_REGEXP: /^(?:(?:https?|mailto|tel|blob|cid):|[^a-z]|[a-z+.-]+(?:[^a-z+.-:]|$))/i\n });\n}\n\nfunction secureEmailLinks(document: Document): void {\n for (const link of document.querySelectorAll<HTMLAnchorElement>(\"a[href]\")) {\n const href = link.getAttribute(\"href\") || \"\";\n if (!isSafeEmailHref(href)) {\n link.removeAttribute(\"href\");\n link.removeAttribute(\"target\");\n link.removeAttribute(\"rel\");\n continue;\n }\n if (/^(https?:)?\\/\\//i.test(href)) {\n link.target = \"_blank\";\n link.rel = \"noopener noreferrer\";\n }\n }\n}\n\nfunction isSafeEmailHref(href: string): boolean {\n const trimmed = href.trim();\n return (\n trimmed.startsWith(\"#\") ||\n trimmed.startsWith(\"/\") ||\n trimmed.startsWith(\"./\") ||\n trimmed.startsWith(\"../\") ||\n trimmed.startsWith(\"blob:\") ||\n /^(https?:|mailto:|tel:)/i.test(trimmed)\n );\n}\n","import pako from \"pako\";\nimport type { PreviewPlugin } from \"../types\";\nimport { createPanel, createSection, readTextFile, resolveFormat } from \"./utils\";\n\nconst drawingExtensions = new Set([\"drawio\", \"dio\", \"excalidraw\", \"tldraw\"]);\nconst drawingMimeFormatMap: Record<string, string> = {\n \"application/vnd.jgraph.mxfile\": \"drawio\",\n \"application/vnd.excalidraw+json\": \"excalidraw\",\n \"application/x-excalidraw+json\": \"excalidraw\"\n};\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\n\nexport function drawingPlugin(): PreviewPlugin {\n return {\n name: \"drawing\",\n match(file) {\n return drawingExtensions.has(file.extension) || Boolean(drawingMimeFormatMap[file.mimeType]);\n },\n async render(ctx) {\n const panel = createPanel(\"ofv-drawing\");\n ctx.viewport.append(panel);\n const text = await readTextFile(ctx.file);\n const extension = resolveFormat(ctx.file, drawingMimeFormatMap);\n\n try {\n if (extension === \"excalidraw\") {\n renderExcalidraw(panel, text);\n } else if (extension === \"tldraw\") {\n renderTldraw(panel, text);\n } else if (extension === \"drawio\" || extension === \"dio\") {\n renderDrawio(panel, text);\n } else {\n renderRawDrawing(panel, extension || \"drawing\", text);\n }\n } catch (error) {\n renderDrawingParseFallback(panel, extension || \"drawing\", text, error);\n }\n\n return {\n destroy() {\n panel.remove();\n }\n };\n }\n };\n}\n\ntype DrawingSummaryItem = {\n type: string;\n x?: number;\n y?: number;\n width?: number;\n height?: number;\n text?: string;\n image?: boolean;\n embed?: boolean;\n edge?: boolean;\n};\n\nfunction createDrawingSummary(items: DrawingSummaryItem[]): HTMLElement {\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-drawing-summary\";\n const typeCounts = countDrawingTypes(items);\n appendDrawingSummary(summary, \"对象\", String(items.length));\n appendDrawingSummary(summary, \"类型\", formatDrawingTypes(typeCounts));\n appendDrawingSummary(summary, \"文本\", String(items.filter((item) => item.text && item.text.trim()).length));\n appendDrawingSummary(summary, \"连线\", String(items.filter((item) => item.edge).length));\n const media = items.filter((item) => item.image || item.embed).length;\n if (media > 0) {\n appendDrawingSummary(summary, \"媒体/嵌入\", String(media));\n }\n const bounds = drawingBounds(items);\n if (bounds) {\n appendDrawingSummary(summary, \"范围\", `${Math.round(bounds[0])}, ${Math.round(bounds[1])}, ${Math.round(bounds[2])}, ${Math.round(bounds[3])}`);\n }\n return summary;\n}\n\nfunction appendDrawingSummary(parent: HTMLElement, label: string, value: string): void {\n const item = document.createElement(\"span\");\n const key = document.createElement(\"span\");\n key.textContent = label;\n const content = document.createElement(\"strong\");\n content.textContent = value;\n item.append(key, content);\n parent.append(item);\n}\n\nfunction countDrawingTypes(items: DrawingSummaryItem[]): Map<string, number> {\n const counts = new Map<string, number>();\n for (const item of items) {\n counts.set(item.type, (counts.get(item.type) || 0) + 1);\n }\n return counts;\n}\n\nfunction formatDrawingTypes(counts: Map<string, number>): string {\n return [...counts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 6)\n .map(([type, count]) => `${type} ${count}`)\n .join(\", \") || \"无\";\n}\n\nfunction drawingBounds(items: DrawingSummaryItem[]): [number, number, number, number] | undefined {\n const boxes = items\n .map((item) => {\n if (!Number.isFinite(item.x) || !Number.isFinite(item.y)) {\n return undefined;\n }\n const x = item.x as number;\n const y = item.y as number;\n const width = Math.max(0, finiteNumber(item.width, 0));\n const height = Math.max(0, finiteNumber(item.height, 0));\n return [x, y, x + width, y + height] as [number, number, number, number];\n })\n .filter((item): item is [number, number, number, number] => Boolean(item));\n if (boxes.length === 0) {\n return undefined;\n }\n return [\n Math.min(...boxes.map((box) => box[0])),\n Math.min(...boxes.map((box) => box[1])),\n Math.max(...boxes.map((box) => box[2])),\n Math.max(...boxes.map((box) => box[3]))\n ];\n}\n\nfunction excalidrawSummaryItem(element: Record<string, unknown>): DrawingSummaryItem {\n return {\n type: String(element.type || \"unknown\"),\n x: finiteNumber(element.x, 0),\n y: finiteNumber(element.y, 0),\n width: finiteNumber(element.width, 0),\n height: finiteNumber(element.height, 0),\n text: String(element.text || element.name || \"\"),\n image: element.type === \"image\",\n embed: element.type === \"embeddable\",\n edge: element.type === \"arrow\" || element.type === \"line\"\n };\n}\n\nfunction tldrawSummaryItem(shape: TldrawShape): DrawingSummaryItem {\n const props = shape.props || {};\n return {\n type: String(shape.type || props.type || \"unknown\"),\n x: finiteNumber(shape.x, 0),\n y: finiteNumber(shape.y, 0),\n width: finiteNumber(props.w, finiteNumber(props.width, 0)),\n height: finiteNumber(props.h, finiteNumber(props.height, 0)),\n text: String(props.text || \"\"),\n edge: shape.type === \"arrow\" || shape.type === \"line\"\n };\n}\n\nfunction drawioSummaryItem(shape: DrawioShape): DrawingSummaryItem {\n return {\n type: shape.edge ? \"edge\" : drawioShapeName(shape.style),\n x: shape.x,\n y: shape.y,\n width: shape.width,\n height: shape.height,\n text: shape.value,\n image: drawioShapeName(shape.style) === \"image\",\n edge: shape.edge\n };\n}\n\nfunction renderExcalidraw(panel: HTMLElement, text: string): void {\n const data = JSON.parse(text) as {\n elements?: Array<Record<string, unknown>>;\n files?: Record<string, { dataURL?: string; mimeType?: string; id?: string }>;\n };\n const files = data.files || {};\n const elements = (data.elements || []).filter((element) => !element.isDeleted);\n const section = createSection(`Excalidraw ${elements.length} elements`);\n section.append(createDrawingSummary(elements.map(excalidrawSummaryItem)));\n const svg = document.createElementNS(SVG_NS, \"svg\");\n svg.setAttribute(\"class\", \"ofv-svg-stage\");\n svg.setAttribute(\"viewBox\", createExcalidrawViewBox(elements));\n const defs = document.createElementNS(SVG_NS, \"defs\");\n svg.append(defs);\n\n for (const element of elements) {\n const type = String(element.type || \"\");\n const x = Number(element.x || 0);\n const y = Number(element.y || 0);\n const width = Number(element.width || 80);\n const height = Number(element.height || 40);\n const stroke = String(element.strokeColor || \"#111827\");\n const fill = excalidrawFill(svg, defs, element, stroke);\n const common = getExcalidrawCommonAttrs(element);\n const transform = excalidrawTransform(element, x, y, width, height);\n\n if (type === \"frame\") {\n const frame = document.createElementNS(SVG_NS, \"rect\");\n applySvgAttrs(frame, {\n x,\n y,\n width,\n height,\n rx: 4,\n fill: \"transparent\",\n stroke: \"#94a3b8\",\n \"stroke-width\": 2,\n \"stroke-dasharray\": \"8 6\",\n opacity: common.opacity,\n transform\n });\n svg.append(frame);\n appendSvgMultilineText(svg, String(element.name || \"Frame\"), x + 12, y + 24, \"#64748b\", {\n fontSize: 14,\n transform\n });\n } else if (type === \"image\") {\n renderExcalidrawImage(svg, element, files, x, y, width, height, common, transform);\n } else if (type === \"embeddable\") {\n renderExcalidrawEmbeddable(svg, element, x, y, width, height, common, transform);\n } else if (type === \"rectangle\" || type === \"diamond\") {\n if (type === \"diamond\") {\n const polygon = document.createElementNS(SVG_NS, \"polygon\");\n polygon.setAttribute(\n \"points\",\n `${x + width / 2},${y} ${x + width},${y + height / 2} ${x + width / 2},${y + height} ${x},${y + height / 2}`\n );\n applySvgAttrs(polygon, { fill, stroke, ...common, transform });\n svg.append(polygon);\n } else {\n const rect = document.createElementNS(SVG_NS, \"rect\");\n applySvgAttrs(rect, {\n x,\n y,\n width,\n height,\n rx: finiteNumber(element.roundness && typeof element.roundness === \"object\" ? (element.roundness as Record<string, unknown>).value : undefined, 0),\n fill,\n stroke,\n ...common,\n transform\n });\n svg.append(rect);\n }\n } else if (type === \"ellipse\") {\n const ellipse = document.createElementNS(SVG_NS, \"ellipse\");\n applySvgAttrs(ellipse, {\n cx: x + width / 2,\n cy: y + height / 2,\n rx: Math.abs(width / 2),\n ry: Math.abs(height / 2),\n fill,\n stroke,\n ...common,\n transform\n });\n svg.append(ellipse);\n } else if (type === \"line\" || type === \"arrow\") {\n const points = excalidrawPoints(element, x, y, width, height);\n if (points.length > 2) {\n const polyline = document.createElementNS(SVG_NS, \"polyline\");\n applySvgAttrs(polyline, {\n points: points.map((point) => `${point.x},${point.y}`).join(\" \"),\n fill: \"none\",\n stroke,\n ...common,\n transform\n });\n svg.append(polyline);\n appendExcalidrawArrowHeads(svg, element, points, stroke);\n } else {\n const start = points[0] || { x, y };\n const end = points[points.length - 1] || { x: x + width, y: y + height };\n const line = document.createElementNS(SVG_NS, \"line\");\n applySvgAttrs(line, {\n x1: start.x,\n y1: start.y,\n x2: end.x,\n y2: end.y,\n stroke,\n ...common,\n transform\n });\n svg.append(line);\n appendExcalidrawArrowHeads(svg, element, [start, end], stroke);\n }\n } else if (type === \"freedraw\") {\n const path = createExcalidrawFreedrawPath(element, x, y);\n if (path) {\n applySvgAttrs(path, { fill: \"none\", stroke, ...common, transform });\n svg.append(path);\n }\n } else if (type === \"text\") {\n const fontSize = finiteNumber(element.fontSize, 18);\n const lines = String(element.text || \"\").split(/\\r?\\n/);\n const textAlign = String(element.textAlign || \"left\");\n const verticalAlign = String(element.verticalAlign || \"top\");\n const anchor = textAlign === \"center\" ? \"middle\" : textAlign === \"right\" ? \"end\" : \"start\";\n const textX = textAlign === \"center\" ? x + width / 2 : textAlign === \"right\" ? x + width : x;\n const textY =\n verticalAlign === \"middle\"\n ? y + height / 2 - ((lines.length - 1) * fontSize * 1.25) / 2\n : verticalAlign === \"bottom\"\n ? y + height - (lines.length - 1) * fontSize * 1.25\n : y + fontSize;\n appendSvgMultilineText(svg, String(element.text || \"\"), textX, textY, stroke, {\n fontSize,\n fontFamily: String(element.fontFamily || \"Inter, ui-sans-serif, system-ui, sans-serif\"),\n anchor,\n dominantBaseline: verticalAlign === \"middle\" ? \"middle\" : \"auto\",\n opacity: common.opacity,\n transform\n });\n }\n }\n\n section.append(svg);\n panel.append(section);\n}\n\nfunction renderExcalidrawImage(\n svg: SVGSVGElement,\n element: Record<string, unknown>,\n files: Record<string, { dataURL?: string; mimeType?: string; id?: string }>,\n x: number,\n y: number,\n width: number,\n height: number,\n common: Record<string, string | number>,\n transform: string\n): void {\n const fileId = String(element.fileId || \"\");\n const file = fileId ? files[fileId] : undefined;\n const dataUrl = file?.dataURL || \"\";\n if (isSafeExcalidrawImageDataUrl(dataUrl)) {\n const image = document.createElementNS(SVG_NS, \"image\");\n applySvgAttrs(image, {\n x,\n y,\n width,\n height,\n href: dataUrl,\n preserveAspectRatio: \"xMidYMid meet\",\n opacity: common.opacity,\n transform\n });\n svg.append(image);\n return;\n }\n\n const rect = document.createElementNS(SVG_NS, \"rect\");\n applySvgAttrs(rect, {\n x,\n y,\n width,\n height,\n rx: 8,\n fill: \"#f8fafc\",\n stroke: \"#94a3b8\",\n \"stroke-width\": 1.5,\n \"stroke-dasharray\": \"6 4\",\n opacity: common.opacity,\n transform\n });\n svg.append(rect);\n appendSvgMultilineText(svg, fileId ? `Image\\n${fileId}` : \"Image\", x + width / 2, y + height / 2 - 8, \"#64748b\", {\n fontSize: 13,\n anchor: \"middle\",\n transform\n });\n}\n\nfunction renderExcalidrawEmbeddable(\n svg: SVGSVGElement,\n element: Record<string, unknown>,\n x: number,\n y: number,\n width: number,\n height: number,\n common: Record<string, string | number>,\n transform: string\n): void {\n const rect = document.createElementNS(SVG_NS, \"rect\");\n applySvgAttrs(rect, {\n x,\n y,\n width,\n height,\n rx: 10,\n fill: \"#eef2ff\",\n stroke: \"#6366f1\",\n \"stroke-width\": 1.5,\n \"stroke-dasharray\": \"8 5\",\n opacity: common.opacity,\n transform\n });\n svg.append(rect);\n const link = String(element.link || element.url || \"Embedded content\");\n appendSvgMultilineText(svg, `Embed\\n${shortenText(link, 48)}`, x + width / 2, y + height / 2 - 10, \"#4338ca\", {\n fontSize: 13,\n anchor: \"middle\",\n transform\n });\n}\n\nfunction appendSvgMultilineText(\n svg: SVGSVGElement,\n text: string,\n x: number,\n y: number,\n fill: string,\n options: {\n fontSize?: number;\n fontFamily?: string;\n anchor?: string;\n dominantBaseline?: string;\n opacity?: string | number;\n transform?: string;\n } = {}\n): SVGTextElement {\n const textNode = document.createElementNS(SVG_NS, \"text\");\n applySvgAttrs(textNode, {\n x,\n y,\n fill,\n \"font-size\": options.fontSize || 18,\n \"font-family\": options.fontFamily || \"Inter, ui-sans-serif, system-ui, sans-serif\",\n \"text-anchor\": options.anchor,\n \"dominant-baseline\": options.dominantBaseline,\n opacity: options.opacity,\n transform: options.transform\n });\n for (const [index, line] of text.split(/\\r?\\n/).entries()) {\n const span = document.createElementNS(SVG_NS, \"tspan\");\n span.setAttribute(\"x\", String(x));\n span.setAttribute(\"dy\", index === 0 ? \"0\" : \"1.25em\");\n span.textContent = line;\n textNode.append(span);\n }\n svg.append(textNode);\n return textNode;\n}\n\nfunction isSafeExcalidrawImageDataUrl(value: string): boolean {\n return /^data:image\\/(?:png|jpe?g|gif|webp|bmp);base64,/i.test(value);\n}\n\nfunction shortenText(value: string, maxLength: number): string {\n return value.length > maxLength ? `${value.slice(0, Math.max(0, maxLength - 3))}...` : value;\n}\n\nfunction createExcalidrawViewBox(elements: Array<Record<string, unknown>>): string {\n if (elements.length === 0) {\n return \"0 0 1200 800\";\n }\n const bounds = elements.map((element) => {\n const x = finiteNumber(element.x, 0);\n const y = finiteNumber(element.y, 0);\n const points = Array.isArray(element.points) ? element.points.map((point) => pointFromValue(point, { x: 0, y: 0 })) : [];\n const width = Math.max(1, finiteNumber(element.width, Math.max(80, ...points.map((point) => point.x))));\n const height = Math.max(1, finiteNumber(element.height, Math.max(40, ...points.map((point) => point.y))));\n return { x, y, width, height };\n });\n const minX = Math.min(...bounds.map((bound) => bound.x)) - 40;\n const minY = Math.min(...bounds.map((bound) => bound.y)) - 40;\n const maxX = Math.max(...bounds.map((bound) => bound.x + bound.width)) + 40;\n const maxY = Math.max(...bounds.map((bound) => bound.y + bound.height)) + 40;\n return `${minX} ${minY} ${Math.max(320, maxX - minX)} ${Math.max(240, maxY - minY)}`;\n}\n\nfunction getExcalidrawCommonAttrs(element: Record<string, unknown>): Record<string, string | number> {\n const strokeWidth = finiteNumber(element.strokeWidth, 1.5);\n const opacity = Math.max(0, Math.min(1, finiteNumber(element.opacity, 100) / 100));\n const style = String(element.strokeStyle || \"solid\");\n return {\n \"stroke-width\": strokeWidth,\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n \"stroke-dasharray\": style === \"dashed\" ? `${strokeWidth * 6} ${strokeWidth * 4}` : style === \"dotted\" ? `${strokeWidth} ${strokeWidth * 4}` : \"\",\n opacity\n };\n}\n\nfunction excalidrawFill(\n svg: SVGSVGElement,\n defs: SVGDefsElement,\n element: Record<string, unknown>,\n stroke: string\n): string {\n const value = String(element.backgroundColor || \"transparent\");\n if (!value || value === \"transparent\") {\n return \"transparent\";\n }\n const fillStyle = String(element.fillStyle || \"solid\");\n if (fillStyle === \"solid\") {\n return value;\n }\n const id = `ofv-excalidraw-${fillStyle}-${defs.children.length}`;\n const pattern = document.createElementNS(SVG_NS, \"pattern\");\n applySvgAttrs(pattern, {\n id,\n width: 10,\n height: 10,\n patternUnits: \"userSpaceOnUse\"\n });\n const background = document.createElementNS(SVG_NS, \"rect\");\n applySvgAttrs(background, { width: 10, height: 10, fill: value, opacity: 0.35 });\n pattern.append(background);\n if (fillStyle === \"cross-hatch\") {\n pattern.append(createPatternLine(svg, \"M 0 10 L 10 0\", stroke));\n pattern.append(createPatternLine(svg, \"M 0 0 L 10 10\", stroke));\n } else if (fillStyle === \"dots\") {\n const dot = document.createElementNS(SVG_NS, \"circle\");\n applySvgAttrs(dot, { cx: 5, cy: 5, r: 1.2, fill: stroke, opacity: 0.48 });\n pattern.append(dot);\n } else {\n pattern.append(createPatternLine(svg, \"M 0 10 L 10 0\", stroke));\n }\n defs.append(pattern);\n return `url(#${id})`;\n}\n\nfunction createPatternLine(svg: SVGSVGElement, d: string, stroke: string): SVGPathElement {\n const path = document.createElementNS(SVG_NS, \"path\");\n applySvgAttrs(path, {\n d,\n stroke,\n \"stroke-width\": 1,\n \"stroke-linecap\": \"round\",\n opacity: 0.42\n });\n return path;\n}\n\nfunction excalidrawTransform(\n element: Record<string, unknown>,\n x: number,\n y: number,\n width: number,\n height: number\n): string {\n const angle = finiteNumber(element.angle, 0);\n if (!angle) {\n return \"\";\n }\n return `rotate(${(angle * 180) / Math.PI} ${x + width / 2} ${y + height / 2})`;\n}\n\nfunction excalidrawPoints(\n element: Record<string, unknown>,\n x: number,\n y: number,\n width: number,\n height: number\n): Array<{ x: number; y: number }> {\n if (!Array.isArray(element.points)) {\n return [\n { x, y },\n { x: x + width, y: y + height }\n ];\n }\n return element.points.map((point) => {\n const parsed = pointFromValue(point, { x: 0, y: 0 });\n return { x: x + parsed.x, y: y + parsed.y };\n });\n}\n\nfunction createExcalidrawFreedrawPath(element: Record<string, unknown>, x: number, y: number): SVGPathElement | null {\n const points = excalidrawPoints(element, x, y, 0, 0);\n if (points.length < 2) {\n return null;\n }\n const path = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n path.setAttribute(\n \"d\",\n points\n .map((point, index) => `${index === 0 ? \"M\" : \"L\"} ${point.x} ${point.y}`)\n .join(\" \")\n );\n return path;\n}\n\nfunction appendExcalidrawArrowHeads(\n svg: SVGSVGElement,\n element: Record<string, unknown>,\n points: Array<{ x: number; y: number }>,\n stroke: string\n): void {\n if (String(element.type || \"\") !== \"arrow\" || points.length < 2) {\n return;\n }\n const startHead = String(element.startArrowhead || \"\");\n const endHead = String(element.endArrowhead || \"arrow\");\n if (startHead && startHead !== \"none\") {\n appendArrowHead(svg, points[1].x, points[1].y, points[0].x, points[0].y, stroke, startHead);\n }\n if (endHead && endHead !== \"none\") {\n const previous = points[points.length - 2];\n const end = points[points.length - 1];\n appendArrowHead(svg, previous.x, previous.y, end.x, end.y, stroke, endHead);\n }\n}\n\nfunction applySvgAttrs(element: SVGElement, attributes: Record<string, string | number | undefined>): void {\n for (const [key, value] of Object.entries(attributes)) {\n if (value === undefined || value === \"\") {\n continue;\n }\n element.setAttribute(key, String(value));\n }\n}\n\ntype TldrawShape = Record<string, unknown> & {\n props?: Record<string, unknown>;\n};\n\nfunction renderTldraw(panel: HTMLElement, text: string): void {\n const data = JSON.parse(text) as unknown;\n const shapes = extractTldrawShapes(data);\n const section = createSection(`tldraw 基础预览 ${shapes.length} shapes`);\n section.append(createDrawingSummary(shapes.map(tldrawSummaryItem)));\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svg.setAttribute(\"class\", \"ofv-svg-stage\");\n svg.setAttribute(\"viewBox\", createTldrawViewBox(shapes));\n\n if (shapes.length === 0) {\n const empty = document.createElementNS(svg.namespaceURI, \"text\");\n empty.setAttribute(\"x\", \"24\");\n empty.setAttribute(\"y\", \"40\");\n empty.setAttribute(\"fill\", \"#64748b\");\n empty.textContent = \"未解析到可展示的 tldraw 图形。\";\n svg.append(empty);\n } else {\n for (const shape of shapes) {\n renderTldrawShape(svg, shape);\n }\n }\n\n section.append(svg);\n panel.append(section);\n}\n\nfunction extractTldrawShapes(data: unknown): TldrawShape[] {\n if (!data || typeof data !== \"object\") {\n return [];\n }\n const source = data as Record<string, unknown>;\n const candidates: unknown[] = [];\n if (Array.isArray(source.records)) {\n candidates.push(...source.records);\n }\n if (Array.isArray(source.shapes)) {\n candidates.push(...source.shapes);\n }\n if (source.store && typeof source.store === \"object\") {\n candidates.push(...Object.values(source.store as Record<string, unknown>));\n }\n if (source.document && typeof source.document === \"object\") {\n const documentRecord = source.document as Record<string, unknown>;\n if (Array.isArray(documentRecord.shapes)) {\n candidates.push(...documentRecord.shapes);\n }\n }\n\n return candidates.filter((item): item is TldrawShape => {\n if (!item || typeof item !== \"object\") {\n return false;\n }\n const record = item as Record<string, unknown>;\n return record.typeName === \"shape\" || String(record.id || \"\").startsWith(\"shape:\");\n });\n}\n\nfunction renderTldrawShape(svg: SVGSVGElement, shape: TldrawShape): void {\n const props = shape.props || {};\n const type = String(shape.type || props.type || \"\");\n const x = finiteNumber(shape.x, 0);\n const y = finiteNumber(shape.y, 0);\n const width = Math.max(1, finiteNumber(props.w, finiteNumber(props.width, 120)));\n const height = Math.max(1, finiteNumber(props.h, finiteNumber(props.height, 80)));\n const stroke = tldrawColor(String(props.color || shape.color || \"black\"));\n const fill = tldrawFill(String(props.fill || \"none\"), stroke);\n\n if (type === \"geo\" || type === \"frame\" || type === \"highlight\") {\n const geo = String(props.geo || (type === \"frame\" ? \"rectangle\" : \"rectangle\"));\n if (geo === \"ellipse\" || geo === \"oval\") {\n const ellipse = document.createElementNS(svg.namespaceURI, \"ellipse\");\n ellipse.setAttribute(\"cx\", String(x + width / 2));\n ellipse.setAttribute(\"cy\", String(y + height / 2));\n ellipse.setAttribute(\"rx\", String(width / 2));\n ellipse.setAttribute(\"ry\", String(height / 2));\n ellipse.setAttribute(\"fill\", fill);\n ellipse.setAttribute(\"stroke\", stroke);\n ellipse.setAttribute(\"stroke-width\", \"2\");\n svg.append(ellipse);\n } else if (geo === \"diamond\") {\n const polygon = document.createElementNS(svg.namespaceURI, \"polygon\");\n polygon.setAttribute(\n \"points\",\n `${x + width / 2},${y} ${x + width},${y + height / 2} ${x + width / 2},${y + height} ${x},${y + height / 2}`\n );\n polygon.setAttribute(\"fill\", fill);\n polygon.setAttribute(\"stroke\", stroke);\n polygon.setAttribute(\"stroke-width\", \"2\");\n svg.append(polygon);\n } else if (geo === \"triangle\") {\n const polygon = document.createElementNS(svg.namespaceURI, \"polygon\");\n polygon.setAttribute(\"points\", `${x + width / 2},${y} ${x + width},${y + height} ${x},${y + height}`);\n polygon.setAttribute(\"fill\", fill);\n polygon.setAttribute(\"stroke\", stroke);\n polygon.setAttribute(\"stroke-width\", \"2\");\n svg.append(polygon);\n } else {\n const rect = document.createElementNS(svg.namespaceURI, \"rect\");\n rect.setAttribute(\"x\", String(x));\n rect.setAttribute(\"y\", String(y));\n rect.setAttribute(\"width\", String(width));\n rect.setAttribute(\"height\", String(height));\n rect.setAttribute(\"rx\", type === \"frame\" ? \"0\" : \"8\");\n rect.setAttribute(\"fill\", fill);\n rect.setAttribute(\"stroke\", stroke);\n rect.setAttribute(\"stroke-width\", \"2\");\n svg.append(rect);\n }\n appendTldrawText(svg, String(props.text || \"\"), x + 12, y + 24, stroke);\n } else if (type === \"text\" || type === \"note\") {\n if (type === \"note\") {\n const note = document.createElementNS(svg.namespaceURI, \"rect\");\n note.setAttribute(\"x\", String(x));\n note.setAttribute(\"y\", String(y));\n note.setAttribute(\"width\", String(width));\n note.setAttribute(\"height\", String(height));\n note.setAttribute(\"rx\", \"6\");\n note.setAttribute(\"fill\", tldrawColor(String(props.color || \"yellow\"), 0.24));\n note.setAttribute(\"stroke\", stroke);\n svg.append(note);\n }\n appendTldrawText(svg, String(props.text || \"\"), x, y + 18, stroke);\n } else if (type === \"arrow\" || type === \"line\") {\n renderTldrawLine(svg, shape, stroke);\n } else if (type === \"draw\") {\n renderTldrawDraw(svg, shape, stroke);\n } else {\n const rect = document.createElementNS(svg.namespaceURI, \"rect\");\n rect.setAttribute(\"x\", String(x));\n rect.setAttribute(\"y\", String(y));\n rect.setAttribute(\"width\", String(width));\n rect.setAttribute(\"height\", String(height));\n rect.setAttribute(\"fill\", \"transparent\");\n rect.setAttribute(\"stroke\", stroke);\n rect.setAttribute(\"stroke-dasharray\", \"6 4\");\n svg.append(rect);\n appendTldrawText(svg, type || \"shape\", x + 8, y + 20, stroke);\n }\n}\n\nfunction renderTldrawLine(svg: SVGSVGElement, shape: TldrawShape, stroke: string): void {\n const props = shape.props || {};\n const x = finiteNumber(shape.x, 0);\n const y = finiteNumber(shape.y, 0);\n const start = pointFromValue(props.start, { x: 0, y: 0 });\n const end = pointFromValue(props.end, {\n x: finiteNumber(props.w, finiteNumber(props.width, 120)),\n y: finiteNumber(props.h, finiteNumber(props.height, 0))\n });\n const line = document.createElementNS(svg.namespaceURI, \"line\");\n line.setAttribute(\"x1\", String(x + start.x));\n line.setAttribute(\"y1\", String(y + start.y));\n line.setAttribute(\"x2\", String(x + end.x));\n line.setAttribute(\"y2\", String(y + end.y));\n line.setAttribute(\"stroke\", stroke);\n line.setAttribute(\"stroke-width\", \"3\");\n line.setAttribute(\"stroke-linecap\", \"round\");\n svg.append(line);\n if (String(shape.type || \"\") === \"arrow\") {\n appendArrowHead(svg, x + start.x, y + start.y, x + end.x, y + end.y, stroke);\n }\n}\n\nfunction renderTldrawDraw(svg: SVGSVGElement, shape: TldrawShape, stroke: string): void {\n const props = shape.props || {};\n const x = finiteNumber(shape.x, 0);\n const y = finiteNumber(shape.y, 0);\n const points = extractTldrawDrawPoints(props.segments);\n if (points.length < 2) {\n return;\n }\n const polyline = document.createElementNS(svg.namespaceURI, \"polyline\");\n polyline.setAttribute(\"points\", points.map((point) => `${x + point.x},${y + point.y}`).join(\" \"));\n polyline.setAttribute(\"fill\", \"none\");\n polyline.setAttribute(\"stroke\", stroke);\n polyline.setAttribute(\"stroke-width\", \"3\");\n polyline.setAttribute(\"stroke-linecap\", \"round\");\n polyline.setAttribute(\"stroke-linejoin\", \"round\");\n svg.append(polyline);\n}\n\nfunction appendTldrawText(svg: SVGSVGElement, text: string, x: number, y: number, fill: string): void {\n if (!text.trim()) {\n return;\n }\n const textNode = document.createElementNS(svg.namespaceURI, \"text\");\n textNode.setAttribute(\"x\", String(x));\n textNode.setAttribute(\"y\", String(y));\n textNode.setAttribute(\"fill\", fill);\n textNode.setAttribute(\"font-size\", \"16\");\n textNode.setAttribute(\"font-family\", \"Inter, ui-sans-serif, system-ui, sans-serif\");\n for (const [index, line] of text.split(/\\r?\\n/).entries()) {\n const span = document.createElementNS(svg.namespaceURI, \"tspan\");\n span.setAttribute(\"x\", String(x));\n span.setAttribute(\"dy\", index === 0 ? \"0\" : \"1.3em\");\n span.textContent = line;\n textNode.append(span);\n }\n svg.append(textNode);\n}\n\nfunction appendArrowHead(\n svg: SVGSVGElement,\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n fill: string,\n type = \"arrow\"\n): void {\n const angle = Math.atan2(y2 - y1, x2 - x1);\n const size = 10;\n if (type === \"bar\") {\n const line = document.createElementNS(SVG_NS, \"line\");\n const dx = Math.sin(angle) * size * 0.65;\n const dy = Math.cos(angle) * size * 0.65;\n applySvgAttrs(line, {\n x1: x2 - dx,\n y1: y2 + dy,\n x2: x2 + dx,\n y2: y2 - dy,\n stroke: fill,\n \"stroke-width\": 2,\n \"stroke-linecap\": \"round\"\n });\n svg.append(line);\n return;\n }\n if (type === \"dot\" || type === \"circle\") {\n const circle = document.createElementNS(SVG_NS, \"circle\");\n applySvgAttrs(circle, { cx: x2, cy: y2, r: size * 0.42, fill });\n svg.append(circle);\n return;\n }\n const points = [\n [x2, y2],\n [x2 - size * Math.cos(angle - Math.PI / 6), y2 - size * Math.sin(angle - Math.PI / 6)],\n [x2 - size * Math.cos(angle + Math.PI / 6), y2 - size * Math.sin(angle + Math.PI / 6)]\n ];\n const polygon = document.createElementNS(svg.namespaceURI, \"polygon\");\n polygon.setAttribute(\"points\", points.map((point) => point.join(\",\")).join(\" \"));\n polygon.setAttribute(\"fill\", type === \"triangle_outline\" || type === \"arrow_outline\" ? \"transparent\" : fill);\n polygon.setAttribute(\"stroke\", fill);\n svg.append(polygon);\n}\n\nfunction createTldrawViewBox(shapes: TldrawShape[]): string {\n if (shapes.length === 0) {\n return \"0 0 800 500\";\n }\n const bounds = shapes.map((shape) => {\n const props = shape.props || {};\n const x = finiteNumber(shape.x, 0);\n const y = finiteNumber(shape.y, 0);\n const width = Math.max(1, finiteNumber(props.w, finiteNumber(props.width, 120)));\n const height = Math.max(1, finiteNumber(props.h, finiteNumber(props.height, 80)));\n return { x, y, width, height };\n });\n const minX = Math.min(...bounds.map((bound) => bound.x)) - 40;\n const minY = Math.min(...bounds.map((bound) => bound.y)) - 40;\n const maxX = Math.max(...bounds.map((bound) => bound.x + bound.width)) + 40;\n const maxY = Math.max(...bounds.map((bound) => bound.y + bound.height)) + 40;\n return `${minX} ${minY} ${Math.max(240, maxX - minX)} ${Math.max(180, maxY - minY)}`;\n}\n\nfunction extractTldrawDrawPoints(value: unknown): Array<{ x: number; y: number }> {\n if (!Array.isArray(value)) {\n return [];\n }\n return value.flatMap((segment) => {\n if (!segment || typeof segment !== \"object\") {\n return [];\n }\n const points = (segment as Record<string, unknown>).points;\n if (!Array.isArray(points)) {\n return [];\n }\n return points.map((point) => pointFromValue(point, { x: 0, y: 0 }));\n });\n}\n\nfunction pointFromValue(value: unknown, fallback: { x: number; y: number }): { x: number; y: number } {\n if (Array.isArray(value)) {\n return {\n x: finiteNumber(value[0], fallback.x),\n y: finiteNumber(value[1], fallback.y)\n };\n }\n if (!value || typeof value !== \"object\") {\n return fallback;\n }\n const point = value as Record<string, unknown>;\n return {\n x: finiteNumber(point.x, fallback.x),\n y: finiteNumber(point.y, fallback.y)\n };\n}\n\nfunction finiteNumber(value: unknown, fallback: number): number {\n const parsed = typeof value === \"number\" ? value : Number(value);\n return Number.isFinite(parsed) ? parsed : fallback;\n}\n\nfunction tldrawFill(fill: string, stroke: string): string {\n return fill === \"solid\" || fill === \"semi\" || fill === \"pattern\" ? tldrawColor(stroke, 0.14) : \"transparent\";\n}\n\nfunction tldrawColor(value: string, alpha = 1): string {\n const colors: Record<string, [number, number, number]> = {\n black: [17, 24, 39],\n grey: [100, 116, 139],\n light: [203, 213, 225],\n red: [220, 38, 38],\n orange: [234, 88, 12],\n yellow: [202, 138, 4],\n green: [22, 163, 74],\n blue: [37, 99, 235],\n violet: [124, 58, 237],\n purple: [147, 51, 234],\n pink: [219, 39, 119]\n };\n if (value.startsWith(\"#\") || value.startsWith(\"rgb\")) {\n return value;\n }\n const color = colors[value] || colors.black;\n return alpha >= 1 ? `rgb(${color.join(\" \")})` : `rgb(${color.join(\" \")} / ${alpha})`;\n}\n\nfunction renderDrawio(panel: HTMLElement, text: string): void {\n const diagrams = extractDrawioDiagrams(text);\n if (diagrams.length === 0) {\n renderRawDrawing(panel, \"Draw.io\", text);\n return;\n }\n\n for (const [index, diagram] of diagrams.entries()) {\n const section = createSection(`Draw.io 图形预览 ${index + 1}`);\n const shapes = parseDrawioShapes(diagram);\n if (shapes.length > 0) {\n section.append(createDrawingSummary(shapes.map(drawioSummaryItem)));\n const svg = document.createElementNS(SVG_NS, \"svg\");\n svg.setAttribute(\"class\", \"ofv-svg-stage\");\n svg.setAttribute(\"viewBox\", createDrawioViewBox(shapes));\n for (const shape of shapes) {\n renderDrawioShape(svg, shape);\n }\n section.append(svg);\n }\n\n const details = document.createElement(\"details\");\n details.className = \"ofv-details\";\n const summary = document.createElement(\"summary\");\n summary.textContent = shapes.length > 0 ? `原始 XML 摘要(${shapes.length} cells)` : \"Draw.io 原始内容\";\n const pre = document.createElement(\"pre\");\n pre.className = \"ofv-text-block\";\n pre.textContent = diagram.slice(0, 30000);\n details.append(summary, pre);\n section.append(details);\n panel.append(section);\n }\n}\n\ntype DrawioShape = {\n id: string;\n value: string;\n style: Record<string, string>;\n vertex: boolean;\n edge: boolean;\n x: number;\n y: number;\n width: number;\n height: number;\n source?: string;\n target?: string;\n points?: Array<{ x: number; y: number }>;\n};\n\nfunction extractDrawioDiagrams(text: string): string[] {\n const matches = [...text.matchAll(/<diagram[^>]*>([\\s\\S]*?)<\\/diagram>/g)].map((match) => decodeDrawioDiagram(match[1] || \"\"));\n if (matches.length > 0) {\n return matches;\n }\n return text.includes(\"<mxGraphModel\") ? [text] : [];\n}\n\nfunction parseDrawioShapes(xml: string): DrawioShape[] {\n const doc = new DOMParser().parseFromString(xml, \"application/xml\");\n if (doc.querySelector(\"parsererror\")) {\n return [];\n }\n return Array.from(doc.querySelectorAll(\"mxCell\")).flatMap((cell) => {\n const geometry = Array.from(cell.children).find((child) => child.localName === \"mxGeometry\");\n const vertex = cell.getAttribute(\"vertex\") === \"1\";\n const edge = cell.getAttribute(\"edge\") === \"1\";\n if (!vertex && !edge) {\n return [];\n }\n const shape: DrawioShape = {\n id: cell.getAttribute(\"id\") || \"\",\n value: decodeXmlText(cell.getAttribute(\"value\") || \"\"),\n style: parseDrawioStyle(cell.getAttribute(\"style\") || \"\"),\n vertex,\n edge,\n x: finiteNumber(geometry?.getAttribute(\"x\"), 0),\n y: finiteNumber(geometry?.getAttribute(\"y\"), 0),\n width: Math.max(1, finiteNumber(geometry?.getAttribute(\"width\"), 120)),\n height: Math.max(1, finiteNumber(geometry?.getAttribute(\"height\"), edge ? 1 : 60)),\n source: cell.getAttribute(\"source\") || undefined,\n target: cell.getAttribute(\"target\") || undefined\n };\n\n if (edge && geometry) {\n const points = Array.from(geometry.children)\n .filter((child) => child.localName === \"mxPoint\")\n .map((point) => ({\n x: finiteNumber(point.getAttribute(\"x\"), 0),\n y: finiteNumber(point.getAttribute(\"y\"), 0)\n }));\n if (points.length >= 2) {\n shape.x = points[0].x;\n shape.y = points[0].y;\n shape.width = points[points.length - 1].x - points[0].x;\n shape.height = points[points.length - 1].y - points[0].y;\n shape.points = points;\n }\n }\n return [shape];\n });\n}\n\nfunction parseDrawioStyle(style: string): Record<string, string> {\n const result: Record<string, string> = {};\n const imageMatch = style.match(/(?:^|;)image=(data:image\\/[^;]+;base64,[^;]+)/i);\n const protectedStyle = imageMatch ? style.replace(imageMatch[0], imageMatch[0].startsWith(\";\") ? \";image=__OFV_IMAGE__\" : \"image=__OFV_IMAGE__\") : style;\n for (const part of protectedStyle.split(\";\")) {\n if (!part) {\n continue;\n }\n const separator = part.indexOf(\"=\");\n const key = separator >= 0 ? part.slice(0, separator) : part;\n const value = separator >= 0 ? part.slice(separator + 1) : \"1\";\n if (key) {\n result[key] = value === \"__OFV_IMAGE__\" && imageMatch ? imageMatch[1] : value;\n }\n }\n return result;\n}\n\nfunction createDrawioViewBox(shapes: DrawioShape[]): string {\n const bounds = shapes.map((shape) => ({\n x: Math.min(shape.x, shape.x + shape.width),\n y: Math.min(shape.y, shape.y + shape.height),\n width: Math.abs(shape.width),\n height: Math.abs(shape.height)\n }));\n const minX = Math.min(...bounds.map((bound) => bound.x)) - 40;\n const minY = Math.min(...bounds.map((bound) => bound.y)) - 40;\n const maxX = Math.max(...bounds.map((bound) => bound.x + bound.width)) + 40;\n const maxY = Math.max(...bounds.map((bound) => bound.y + bound.height)) + 40;\n return `${minX} ${minY} ${Math.max(320, maxX - minX)} ${Math.max(240, maxY - minY)}`;\n}\n\nfunction renderDrawioShape(svg: SVGSVGElement, shape: DrawioShape): void {\n const stroke = drawioColor(shape.style.strokeColor, \"#334155\");\n const fill = shape.style.fillColor === \"none\" ? \"transparent\" : drawioColor(shape.style.fillColor, \"#f8fafc\");\n const strokeWidth = finiteNumber(shape.style.strokeWidth, 1.5);\n const opacity = Math.max(0, Math.min(1, finiteNumber(shape.style.opacity, 100) / 100));\n const strokeAttrs = drawioStrokeAttrs(shape.style, strokeWidth);\n const transform = drawioTransform(shape);\n\n if (shape.edge) {\n const points = shape.points || [\n { x: shape.x, y: shape.y },\n { x: shape.x + shape.width, y: shape.y + shape.height }\n ];\n if (points.length > 2) {\n const polyline = document.createElementNS(SVG_NS, \"polyline\");\n applySvgAttrs(polyline, {\n points: points.map((point) => `${point.x},${point.y}`).join(\" \"),\n fill: \"none\",\n stroke,\n ...strokeAttrs,\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n opacity\n });\n svg.append(polyline);\n } else {\n const line = document.createElementNS(SVG_NS, \"line\");\n applySvgAttrs(line, {\n x1: points[0].x,\n y1: points[0].y,\n x2: points[1].x,\n y2: points[1].y,\n stroke,\n ...strokeAttrs,\n \"stroke-linecap\": \"round\",\n opacity\n });\n svg.append(line);\n }\n if (shape.style.endArrow && shape.style.endArrow !== \"none\") {\n const tail = points[Math.max(0, points.length - 2)];\n const head = points[points.length - 1];\n appendArrowHead(svg, tail.x, tail.y, head.x, head.y, stroke);\n }\n return;\n }\n\n const shapeName = drawioShapeName(shape.style);\n if (shapeName === \"image\") {\n renderDrawioImage(svg, shape, opacity, transform);\n } else if (shapeName === \"ellipse\") {\n const ellipse = document.createElementNS(SVG_NS, \"ellipse\");\n applySvgAttrs(ellipse, {\n cx: shape.x + shape.width / 2,\n cy: shape.y + shape.height / 2,\n rx: shape.width / 2,\n ry: shape.height / 2,\n fill,\n stroke,\n ...strokeAttrs,\n opacity,\n transform\n });\n svg.append(ellipse);\n } else if (shapeName === \"rhombus\" || shapeName === \"diamond\") {\n const polygon = document.createElementNS(SVG_NS, \"polygon\");\n applySvgAttrs(polygon, {\n points: `${shape.x + shape.width / 2},${shape.y} ${shape.x + shape.width},${shape.y + shape.height / 2} ${shape.x + shape.width / 2},${shape.y + shape.height} ${shape.x},${shape.y + shape.height / 2}`,\n fill,\n stroke,\n ...strokeAttrs,\n opacity,\n transform\n });\n svg.append(polygon);\n } else if (shapeName === \"hexagon\" || shapeName === \"process\") {\n const polygon = document.createElementNS(SVG_NS, \"polygon\");\n const inset = shapeName === \"process\" ? shape.width * 0.12 : shape.width * 0.22;\n applySvgAttrs(polygon, {\n points:\n shapeName === \"process\"\n ? `${shape.x},${shape.y} ${shape.x + shape.width - inset},${shape.y} ${shape.x + shape.width},${shape.y + shape.height / 2} ${shape.x + shape.width - inset},${shape.y + shape.height} ${shape.x},${shape.y + shape.height}`\n : `${shape.x + inset},${shape.y} ${shape.x + shape.width - inset},${shape.y} ${shape.x + shape.width},${shape.y + shape.height / 2} ${shape.x + shape.width - inset},${shape.y + shape.height} ${shape.x + inset},${shape.y + shape.height} ${shape.x},${shape.y + shape.height / 2}`,\n fill,\n stroke,\n ...strokeAttrs,\n opacity,\n transform\n });\n svg.append(polygon);\n } else if (shapeName === \"triangle\") {\n const polygon = document.createElementNS(SVG_NS, \"polygon\");\n applySvgAttrs(polygon, {\n points: `${shape.x + shape.width / 2},${shape.y} ${shape.x + shape.width},${shape.y + shape.height} ${shape.x},${shape.y + shape.height}`,\n fill,\n stroke,\n ...strokeAttrs,\n opacity,\n transform\n });\n svg.append(polygon);\n } else if (shapeName === \"actor\" || shapeName === \"umlActor\") {\n renderDrawioActor(svg, shape, stroke, strokeAttrs, opacity, transform);\n } else if (shapeName === \"document\") {\n const path = document.createElementNS(SVG_NS, \"path\");\n applySvgAttrs(path, {\n d: createDrawioDocumentPath(shape.x, shape.y, shape.width, shape.height),\n fill,\n stroke,\n ...strokeAttrs,\n opacity,\n transform\n });\n svg.append(path);\n } else if (shapeName === \"cylinder\") {\n const group = document.createElementNS(SVG_NS, \"g\");\n applySvgAttrs(group, { transform });\n const body = document.createElementNS(SVG_NS, \"rect\");\n applySvgAttrs(body, {\n x: shape.x,\n y: shape.y + Math.min(18, shape.height * 0.18) / 2,\n width: shape.width,\n height: shape.height - Math.min(18, shape.height * 0.18),\n fill,\n stroke,\n ...strokeAttrs,\n opacity\n });\n const top = document.createElementNS(SVG_NS, \"ellipse\");\n const bottom = document.createElementNS(SVG_NS, \"ellipse\");\n const capHeight = Math.min(18, shape.height * 0.18);\n applySvgAttrs(top, {\n cx: shape.x + shape.width / 2,\n cy: shape.y + capHeight / 2,\n rx: shape.width / 2,\n ry: capHeight / 2,\n fill,\n stroke,\n ...strokeAttrs,\n opacity\n });\n applySvgAttrs(bottom, {\n cx: shape.x + shape.width / 2,\n cy: shape.y + shape.height - capHeight / 2,\n rx: shape.width / 2,\n ry: capHeight / 2,\n fill: \"none\",\n stroke,\n ...strokeAttrs,\n opacity\n });\n group.append(body, top, bottom);\n svg.append(group);\n } else if (shapeName === \"cloud\") {\n const path = document.createElementNS(SVG_NS, \"path\");\n applySvgAttrs(path, {\n d: createDrawioCloudPath(shape.x, shape.y, shape.width, shape.height),\n fill,\n stroke,\n ...strokeAttrs,\n opacity,\n transform\n });\n svg.append(path);\n } else if (shapeName === \"swimlane\") {\n const rect = document.createElementNS(SVG_NS, \"rect\");\n applySvgAttrs(rect, {\n x: shape.x,\n y: shape.y,\n width: shape.width,\n height: shape.height,\n rx: shape.style.rounded === \"1\" ? Math.min(12, shape.height / 5) : 0,\n fill,\n stroke,\n ...strokeAttrs,\n opacity,\n transform\n });\n const header = document.createElementNS(SVG_NS, \"rect\");\n const headerHeight = Math.min(shape.height, finiteNumber(shape.style.startSize, 30));\n applySvgAttrs(header, {\n x: shape.x,\n y: shape.y,\n width: shape.width,\n height: headerHeight,\n rx: shape.style.rounded === \"1\" ? Math.min(12, headerHeight / 3) : 0,\n fill: drawioColor(shape.style.swimlaneFillColor || shape.style.fillColor, \"#e2e8f0\"),\n stroke,\n ...strokeAttrs,\n opacity,\n transform\n });\n svg.append(rect, header);\n } else {\n const rect = document.createElementNS(SVG_NS, \"rect\");\n applySvgAttrs(rect, {\n x: shape.x,\n y: shape.y,\n width: shape.width,\n height: shape.height,\n rx: shape.style.rounded === \"1\" ? Math.min(12, shape.height / 5) : 0,\n fill,\n stroke,\n ...strokeAttrs,\n opacity,\n transform\n });\n svg.append(rect);\n }\n\n appendDrawioText(\n svg,\n shape.value,\n shape.x + shape.width / 2,\n shape.y + shape.height / 2,\n drawioColor(shape.style.fontColor, \"#111827\"),\n shape.style,\n transform\n );\n}\n\nfunction drawioShapeName(style: Record<string, string>): string {\n if (style.shape) {\n return style.shape;\n }\n if (style.image) {\n return \"image\";\n }\n if (style.ellipse === \"1\") {\n return \"ellipse\";\n }\n if (style.rhombus === \"1\") {\n return \"rhombus\";\n }\n if (style.swimlane === \"1\") {\n return \"swimlane\";\n }\n if (style.text === \"1\") {\n return \"text\";\n }\n return \"rectangle\";\n}\n\nfunction renderDrawioImage(svg: SVGSVGElement, shape: DrawioShape, opacity: number, transform: string): void {\n const src = shape.style.image || \"\";\n if (/^data:image\\/(?:png|jpe?g|gif|webp|svg\\+xml);base64,/i.test(src)) {\n const image = document.createElementNS(SVG_NS, \"image\");\n applySvgAttrs(image, {\n x: shape.x,\n y: shape.y,\n width: shape.width,\n height: shape.height,\n href: src,\n preserveAspectRatio: \"xMidYMid meet\",\n opacity,\n transform\n });\n svg.append(image);\n return;\n }\n const rect = document.createElementNS(SVG_NS, \"rect\");\n applySvgAttrs(rect, {\n x: shape.x,\n y: shape.y,\n width: shape.width,\n height: shape.height,\n rx: 6,\n fill: \"#f8fafc\",\n stroke: \"#94a3b8\",\n \"stroke-dasharray\": \"6 4\",\n opacity,\n transform\n });\n svg.append(rect);\n}\n\nfunction renderDrawioActor(\n svg: SVGSVGElement,\n shape: DrawioShape,\n stroke: string,\n strokeAttrs: Record<string, string | number>,\n opacity: number,\n transform: string\n): void {\n const group = document.createElementNS(SVG_NS, \"g\");\n applySvgAttrs(group, { opacity, transform });\n const cx = shape.x + shape.width / 2;\n const headRadius = Math.min(shape.width, shape.height) * 0.15;\n const head = document.createElementNS(SVG_NS, \"circle\");\n applySvgAttrs(head, {\n cx,\n cy: shape.y + headRadius * 1.4,\n r: headRadius,\n fill: \"transparent\",\n stroke,\n ...strokeAttrs\n });\n const body = createSvgLine(cx, shape.y + headRadius * 2.4, cx, shape.y + shape.height * 0.68, stroke, strokeAttrs);\n const arms = createSvgLine(shape.x + shape.width * 0.22, shape.y + shape.height * 0.42, shape.x + shape.width * 0.78, shape.y + shape.height * 0.42, stroke, strokeAttrs);\n const leftLeg = createSvgLine(cx, shape.y + shape.height * 0.68, shape.x + shape.width * 0.25, shape.y + shape.height, stroke, strokeAttrs);\n const rightLeg = createSvgLine(cx, shape.y + shape.height * 0.68, shape.x + shape.width * 0.75, shape.y + shape.height, stroke, strokeAttrs);\n group.append(head, body, arms, leftLeg, rightLeg);\n svg.append(group);\n}\n\nfunction createSvgLine(\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n stroke: string,\n strokeAttrs: Record<string, string | number>\n): SVGLineElement {\n const line = document.createElementNS(SVG_NS, \"line\");\n applySvgAttrs(line, {\n x1,\n y1,\n x2,\n y2,\n stroke,\n ...strokeAttrs,\n \"stroke-linecap\": \"round\"\n });\n return line;\n}\n\nfunction createDrawioDocumentPath(x: number, y: number, width: number, height: number): string {\n const wave = Math.min(18, height * 0.18);\n return [\n `M ${x} ${y}`,\n `H ${x + width}`,\n `V ${y + height - wave}`,\n `C ${x + width * 0.72} ${y + height - wave * 2}, ${x + width * 0.58} ${y + height + wave * 0.5}, ${x + width * 0.34} ${y + height - wave * 0.4}`,\n `C ${x + width * 0.18} ${y + height - wave}, ${x + width * 0.08} ${y + height - wave * 0.2}, ${x} ${y + height - wave * 0.45}`,\n \"Z\"\n ].join(\" \");\n}\n\nfunction drawioStrokeAttrs(style: Record<string, string>, strokeWidth: number): Record<string, string | number> {\n const attrs: Record<string, string | number> = {\n \"stroke-width\": strokeWidth\n };\n if (style.dashed === \"1\") {\n attrs[\"stroke-dasharray\"] = style.dashPattern || `${strokeWidth * 4} ${strokeWidth * 3}`;\n }\n return attrs;\n}\n\nfunction drawioTransform(shape: DrawioShape): string {\n const rotation = finiteNumber(shape.style.rotation, 0);\n if (!rotation) {\n return \"\";\n }\n return `rotate(${rotation} ${shape.x + shape.width / 2} ${shape.y + shape.height / 2})`;\n}\n\nfunction createDrawioCloudPath(x: number, y: number, width: number, height: number): string {\n const cx = x + width / 2;\n const cy = y + height / 2;\n return [\n `M ${x + width * 0.24} ${y + height * 0.72}`,\n `C ${x - width * 0.02} ${y + height * 0.68}, ${x + width * 0.02} ${y + height * 0.34}, ${x + width * 0.28} ${y + height * 0.38}`,\n `C ${x + width * 0.32} ${y + height * 0.12}, ${cx} ${y + height * 0.06}, ${x + width * 0.62} ${y + height * 0.26}`,\n `C ${x + width * 0.86} ${y + height * 0.2}, ${x + width * 1.02} ${y + height * 0.42}, ${x + width * 0.88} ${y + height * 0.62}`,\n `C ${x + width * 0.86} ${y + height * 0.84}, ${x + width * 0.42} ${y + height * 0.9}, ${x + width * 0.24} ${y + height * 0.72}`,\n \"Z\"\n ].join(\" \");\n}\n\nfunction appendDrawioText(\n svg: SVGSVGElement,\n text: string,\n x: number,\n y: number,\n fill: string,\n style: Record<string, string> = {},\n transform = \"\"\n): void {\n if (!text.trim()) {\n return;\n }\n const lines = normalizeDrawioLabel(text).split(/\\r?\\n/).filter(Boolean);\n if (lines.length === 0) {\n return;\n }\n const textNode = document.createElementNS(SVG_NS, \"text\");\n const align = style.align || \"center\";\n const fontStyle = Number.parseInt(style.fontStyle || \"0\", 10);\n applySvgAttrs(textNode, {\n x: align === \"left\" ? x - finiteNumber(style.spacingLeft, 0) : align === \"right\" ? x + finiteNumber(style.spacingRight, 0) : x,\n y,\n fill,\n \"font-size\": finiteNumber(style.fontSize, 14),\n \"font-family\": \"Inter, ui-sans-serif, system-ui, sans-serif\",\n \"font-weight\": fontStyle & 1 ? \"700\" : undefined,\n \"font-style\": fontStyle & 2 ? \"italic\" : undefined,\n \"text-decoration\": fontStyle & 4 ? \"underline\" : undefined,\n \"text-anchor\": align === \"left\" ? \"start\" : align === \"right\" ? \"end\" : \"middle\",\n \"dominant-baseline\": \"middle\",\n transform\n });\n const firstDy = lines.length > 1 ? `${-0.55 * (lines.length - 1)}em` : \"0\";\n for (const [index, line] of lines.entries()) {\n const span = document.createElementNS(SVG_NS, \"tspan\");\n span.setAttribute(\"x\", String(x));\n span.setAttribute(\"dy\", index === 0 ? firstDy : \"1.2em\");\n span.textContent = line;\n textNode.append(span);\n }\n svg.append(textNode);\n}\n\nfunction normalizeDrawioLabel(text: string): string {\n const decoded = decodeXmlText(text);\n return decoded\n .replace(/<br\\s*\\/?>/gi, \"\\n\")\n .replace(/<\\/(?:div|p|li|h\\d)>/gi, \"\\n\")\n .replace(/<[^>]+>/g, \"\")\n .split(/\\r?\\n/)\n .map((line) => decodeXmlText(line).replace(/\\u00a0/g, \" \").replace(/[ \\t]+/g, \" \").trim())\n .filter(Boolean)\n .join(\"\\n\");\n}\n\nfunction drawioColor(value: string | undefined, fallback: string): string {\n if (!value || value === \"default\") {\n return fallback;\n }\n return value.startsWith(\"#\") ? value : `#${value}`;\n}\n\nfunction decodeXmlText(value: string): string {\n const textarea = document.createElement(\"textarea\");\n textarea.innerHTML = value;\n return textarea.value;\n}\n\nfunction renderRawDrawing(panel: HTMLElement, extension: string, text: string): void {\n const section = createSection(`${extension} 基础预览`);\n const pre = document.createElement(\"pre\");\n pre.className = \"ofv-text-block\";\n pre.textContent = text.slice(0, 30000);\n section.append(pre);\n panel.append(section);\n}\n\nfunction renderDrawingParseFallback(panel: HTMLElement, extension: string, text: string, error: unknown): void {\n panel.replaceChildren();\n const section = createSection(`${extension} 解析失败`);\n const message = document.createElement(\"p\");\n message.textContent = error instanceof Error ? error.message : String(error);\n const pre = document.createElement(\"pre\");\n pre.className = \"ofv-text-block\";\n pre.textContent = text.slice(0, 30000) || \"文件内容为空。\";\n section.append(message, pre);\n panel.append(section);\n}\n\nfunction decodeDrawioDiagram(value: string): string {\n try {\n const decoded = decodeURIComponent(escape(atob(value)));\n return pako.inflateRaw(Uint8Array.from(decoded, (char) => char.charCodeAt(0)), {\n to: \"string\"\n }) as string;\n } catch {\n return value;\n }\n}\n","import type { PreviewContext, PreviewPlugin } from \"../types\";\nimport { createPanel, createSection, readArrayBuffer, readTextFile, resolveFormat } from \"./utils\";\n\ninterface LayeredValue<T> {\n layer: string;\n value: T;\n}\n\nconst cadExtensions = new Set([\n \"dxf\",\n \"dwg\",\n \"dwf\",\n \"step\",\n \"stp\",\n \"iges\",\n \"igs\",\n \"ifc\",\n \"sat\",\n \"sab\",\n \"x_t\",\n \"x_b\",\n \"3dm\",\n \"skp\",\n \"sldprt\",\n \"sldasm\"\n]);\nconst cadMimeTypes = new Set([\n \"application/acad\",\n \"application/dxf\",\n \"application/x-dxf\",\n \"image/vnd.dxf\",\n \"model/vnd.dwf\",\n \"model/step\",\n \"application/step\",\n \"application/iges\",\n \"application/x-step\",\n \"application/sat\",\n \"application/sab\",\n \"application/x-parasolid\",\n \"model/vnd.3dm\",\n \"application/vnd.sketchup.skp\",\n \"application/sldworks\"\n]);\nconst cadMimeFormatMap: Record<string, string> = {\n \"application/acad\": \"dwg\",\n \"application/dxf\": \"dxf\",\n \"application/x-dxf\": \"dxf\",\n \"image/vnd.dxf\": \"dxf\",\n \"model/vnd.dwf\": \"dwf\",\n \"model/step\": \"step\",\n \"application/step\": \"step\",\n \"application/iges\": \"iges\",\n \"application/x-step\": \"ifc\",\n \"application/sat\": \"sat\",\n \"application/sab\": \"sab\",\n \"application/x-parasolid\": \"x_t\",\n \"model/vnd.3dm\": \"3dm\",\n \"application/vnd.sketchup.skp\": \"skp\",\n \"application/sldworks\": \"sldprt\"\n};\n\nexport function cadPlugin(): PreviewPlugin {\n return {\n name: \"cad\",\n match(file) {\n return cadExtensions.has(file.extension) || cadMimeTypes.has(file.mimeType);\n },\n async render(ctx) {\n const panel = createPanel(\"ofv-cad\");\n ctx.viewport.append(panel);\n\n const extension = resolveFormat(ctx.file, cadMimeFormatMap);\n if (extension === \"step\" || extension === \"stp\") {\n renderStep(panel, await readTextFile(ctx.file), extension);\n return { destroy: () => panel.remove() };\n }\n if (extension === \"iges\" || extension === \"igs\") {\n renderIges(panel, await readTextFile(ctx.file), extension);\n return { destroy: () => panel.remove() };\n }\n if (extension === \"ifc\") {\n renderIfc(panel, await readTextFile(ctx.file));\n return { destroy: () => panel.remove() };\n }\n if (extension === \"dwg\" || extension === \"dwf\") {\n renderBinaryCad(panel, await readArrayBuffer(ctx.file), extension, ctx.file.name);\n return { destroy: () => panel.remove() };\n }\n if (extension !== \"dxf\") {\n const section = createSection(\"CAD 基础预览\");\n section.append(`.${extension || \"cad\"} 已识别为图纸/工程格式,当前前端插件优先渲染 DXF。该格式建议接入服务端转换或 WASM 专用引擎。`);\n panel.append(section);\n return { destroy: () => panel.remove() };\n }\n\n const dxf = await readTextFile(ctx.file);\n const viewer = renderDxf(panel, dxf, ctx);\n return {\n canCommand(command) {\n return viewer.canCommand(command);\n },\n command(command) {\n return viewer.command(command);\n },\n destroy() {\n panel.remove();\n }\n };\n }\n };\n}\n\nfunction renderStep(panel: HTMLElement, text: string, extension: string): void {\n const records = parseStepRecords(text);\n const typeCounts = countBy(records.map((record) => record.type));\n const section = createSection(`${extension.toUpperCase()} 结构预览`);\n const note = document.createElement(\"p\");\n note.textContent = \"当前版本提取 STEP 文本实体、类型统计和关键几何参数。精确 B-Rep/曲面渲染建议后续接入 CAD 内核或服务端转换。\";\n\n const meta = document.createElement(\"div\");\n meta.className = \"ofv-cad-summary\";\n appendMeta(meta, \"实体\", records.length);\n appendMeta(meta, \"类型\", typeCounts.size);\n appendMeta(meta, \"点\", typeCounts.get(\"CARTESIAN_POINT\") || 0);\n appendMeta(meta, \"方向\", typeCounts.get(\"DIRECTION\") || 0);\n section.append(note, meta, createCadTypeList(typeCounts));\n\n const table = createCadEntityTable(\n records.slice(0, 200).map((record) => ({\n id: record.id,\n type: record.type,\n detail: summarizeStepRecord(record)\n }))\n );\n section.append(table);\n panel.append(section);\n}\n\nfunction renderIges(panel: HTMLElement, text: string, extension: string): void {\n const records = parseIgesRecords(text);\n const typeCounts = countBy(records.map((record) => record.type));\n const section = createSection(`${extension.toUpperCase()} 结构预览`);\n const note = document.createElement(\"p\");\n note.textContent = \"当前版本提取 IGES 参数区实体、类型统计和基础参数。精确曲线/曲面渲染建议后续接入 CAD 内核或服务端转换。\";\n\n const meta = document.createElement(\"div\");\n meta.className = \"ofv-cad-summary\";\n appendMeta(meta, \"实体\", records.length);\n appendMeta(meta, \"类型\", typeCounts.size);\n appendMeta(meta, \"点实体\", typeCounts.get(\"116\") || 0);\n appendMeta(meta, \"线实体\", typeCounts.get(\"110\") || 0);\n section.append(note, meta, createCadTypeList(typeCounts, \"类型号统计\"));\n\n const table = createCadEntityTable(\n records.slice(0, 200).map((record, index) => ({\n id: String(index + 1),\n type: igesTypeName(record.type),\n detail: record.params.slice(0, 8).join(\", \")\n }))\n );\n section.append(table);\n panel.append(section);\n}\n\nfunction renderIfc(panel: HTMLElement, text: string): void {\n const records = parseStepRecords(text);\n const typeCounts = countBy(records.map((record) => record.type));\n const section = createSection(\"IFC BIM 结构预览\");\n const note = document.createElement(\"p\");\n note.textContent = \"当前版本提取 IFC STEP 实体、BIM 层级和常见构件统计。几何网格、材质和属性集可后续接入 IfcOpenShell/IFC.js 增强。\";\n\n const meta = document.createElement(\"div\");\n meta.className = \"ofv-cad-summary\";\n appendMeta(meta, \"实体\", records.length);\n appendMeta(meta, \"类型\", typeCounts.size);\n appendMeta(meta, \"项目\", typeCounts.get(\"IFCPROJECT\") || 0);\n appendMeta(meta, \"建筑\", typeCounts.get(\"IFCBUILDING\") || 0);\n appendMeta(meta, \"楼层\", typeCounts.get(\"IFCBUILDINGSTOREY\") || 0);\n appendMeta(meta, \"空间\", typeCounts.get(\"IFCSPACE\") || 0);\n appendMeta(meta, \"构件\", countIfcElements(typeCounts));\n section.append(note, meta, createCadTypeList(typeCounts, \"IFC 实体统计\"));\n\n const hierarchy = createIfcHierarchy(records);\n if (hierarchy) {\n section.append(hierarchy);\n }\n\n const table = createCadEntityTable(\n records.slice(0, 240).map((record) => ({\n id: record.id,\n type: record.type,\n detail: summarizeIfcRecord(record)\n }))\n );\n section.append(table);\n panel.append(section);\n}\n\ntype StepRecord = {\n id: string;\n type: string;\n args: string;\n};\n\ntype IgesRecord = {\n type: string;\n params: string[];\n};\n\nfunction renderBinaryCad(panel: HTMLElement, arrayBuffer: ArrayBuffer, extension: string, fileName: string): void {\n const bytes = new Uint8Array(arrayBuffer);\n const section = createSection(`${extension.toUpperCase()} 文件预览`);\n const note = document.createElement(\"p\");\n note.textContent =\n extension === \"dwg\"\n ? \"DWG 是 AutoCAD 专有二进制格式,当前前端插件提供文件识别、版本提示和转换建议;几何渲染建议接入 ODA/LibreDWG/服务端转换。\"\n : \"DWF 是发布用图纸格式,当前前端插件提供容器识别和转换建议;高保真页面渲染建议接入专用解析器或服务端转换。\";\n\n const meta = document.createElement(\"div\");\n meta.className = \"ofv-cad-summary\";\n appendMeta(meta, \"文件\", fileName);\n appendMeta(meta, \"格式\", extension.toUpperCase());\n appendMeta(meta, \"大小\", formatBytes(bytes.byteLength));\n appendMeta(meta, \"签名\", byteSignature(bytes));\n appendMeta(meta, \"版本\", detectCadVersion(bytes, extension));\n appendMeta(meta, \"容器\", detectCadContainer(bytes));\n\n const actions = document.createElement(\"ol\");\n actions.className = \"ofv-cad-conversion\";\n const suggestions =\n extension === \"dwg\"\n ? [\n \"服务端使用 ODA File Converter / Teigha 将 DWG 转为 DXF、SVG 或 PDF。\",\n \"浏览器端可后续接入 LibreDWG WASM,但需处理字体、块参照、外部参照和许可证。\",\n \"若业务只需预览,建议转换为 PDF/SVG 后走现有 PDF 或图像预览链路。\"\n ]\n : [\n \"优先在服务端转换为 PDF/SVG,保留图层、页面和标注信息。\",\n \"若 DWF 为压缩容器,可后续读取 manifest/descriptor 再还原页面资源。\",\n \"若业务只需下载/归档,保留当前文件元信息和转换提示即可。\"\n ];\n for (const suggestion of suggestions) {\n const item = document.createElement(\"li\");\n item.textContent = suggestion;\n actions.append(item);\n }\n\n const preview = document.createElement(\"pre\");\n preview.className = \"ofv-text-block\";\n preview.textContent = hexPreview(bytes);\n\n section.append(note, meta, createBinaryCadProbe(bytes, extension), actions, preview);\n panel.append(section);\n}\n\nfunction createBinaryCadProbe(bytes: Uint8Array, extension: string): HTMLElement {\n const probe = probeBinaryCad(bytes);\n const details = document.createElement(\"details\");\n details.className = \"ofv-details ofv-cad-binary-probe\";\n details.open = true;\n const summary = document.createElement(\"summary\");\n summary.textContent = \"二进制结构探测\";\n const meta = document.createElement(\"div\");\n meta.className = \"ofv-archive-probe-meta\";\n appendMeta(meta, \"可读片段\", probe.tokens.length);\n appendMeta(meta, \"实体关键词\", formatCadKeywordCounts(probe.entityCounts));\n appendMeta(meta, \"图层线索\", String(probe.layerHints.length));\n appendMeta(meta, \"块/引用线索\", String(probe.blockHints.length));\n appendMeta(meta, \"外部引用\", String(probe.externalRefs.length));\n appendMeta(meta, \"解析级别\", extension === \"dwg\" ? \"启发式扫描\" : \"容器/文本扫描\");\n details.append(summary, meta);\n\n const hints = [...probe.layerHints, ...probe.blockHints, ...probe.externalRefs].slice(0, 18);\n if (hints.length > 0) {\n const list = document.createElement(\"ul\");\n list.className = \"ofv-cad-probe-list\";\n for (const hint of hints) {\n const item = document.createElement(\"li\");\n item.textContent = hint;\n list.append(item);\n }\n details.append(list);\n }\n\n if (probe.tokens.length > 0) {\n const preview = document.createElement(\"pre\");\n preview.className = \"ofv-text-block\";\n preview.textContent = probe.tokens.slice(0, 80).join(\"\\n\");\n details.append(preview);\n }\n return details;\n}\n\ntype BinaryCadProbe = {\n tokens: string[];\n entityCounts: Map<string, number>;\n layerHints: string[];\n blockHints: string[];\n externalRefs: string[];\n};\n\nfunction probeBinaryCad(bytes: Uint8Array): BinaryCadProbe {\n const text = extractAsciiRuns(bytes.slice(0, Math.min(bytes.length, 65536)));\n const tokens = text\n .map((item) => item.trim())\n .filter((item) => item.length >= 3)\n .slice(0, 240);\n const entityKeywords = [\"LINE\", \"CIRCLE\", \"ARC\", \"LWPOLYLINE\", \"POLYLINE\", \"TEXT\", \"MTEXT\", \"INSERT\", \"BLOCK\", \"LAYER\", \"XREF\", \"DIMENSION\"];\n const entityCounts = new Map<string, number>();\n for (const token of tokens) {\n const normalized = token.toUpperCase();\n for (const keyword of entityKeywords) {\n if (normalized.includes(keyword)) {\n entityCounts.set(keyword, (entityCounts.get(keyword) || 0) + 1);\n }\n }\n }\n return {\n tokens,\n entityCounts,\n layerHints: uniqueHints(tokens.filter((item) => /layer|图层/i.test(item))),\n blockHints: uniqueHints(tokens.filter((item) => /block|insert|块/i.test(item))),\n externalRefs: uniqueHints(tokens.filter((item) => /xref|\\.dwg|\\.dxf|\\.pdf|\\.png|\\.jpe?g/i.test(item)))\n };\n}\n\nfunction extractAsciiRuns(bytes: Uint8Array): string[] {\n const result: string[] = [];\n let current = \"\";\n for (const byte of bytes) {\n if (byte >= 32 && byte <= 126) {\n current += String.fromCharCode(byte);\n continue;\n }\n if (current.length >= 3) {\n result.push(current);\n }\n current = \"\";\n }\n if (current.length >= 3) {\n result.push(current);\n }\n return result;\n}\n\nfunction uniqueHints(values: string[]): string[] {\n return Array.from(new Set(values.map((value) => value.trim()).filter(Boolean))).slice(0, 12);\n}\n\nfunction formatCadKeywordCounts(counts: Map<string, number>): string {\n const text = [...counts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 6)\n .map(([type, count]) => `${type} ${count}`)\n .join(\", \");\n return text || \"未发现\";\n}\n\nfunction parseStepRecords(text: string): StepRecord[] {\n return [...text.matchAll(/#(\\d+)\\s*=\\s*([A-Z0-9_]+)\\s*\\(([\\s\\S]*?)\\)\\s*;/gi)].map((match) => ({\n id: `#${match[1]}`,\n type: (match[2] || \"\").toUpperCase(),\n args: (match[3] || \"\").replace(/\\s+/g, \" \").trim()\n }));\n}\n\nfunction parseIgesRecords(text: string): IgesRecord[] {\n const parameterText = text\n .split(/\\r?\\n/)\n .filter((line) => line.slice(72, 73).toUpperCase() === \"P\" || /^\\s*\\d+\\s*,/.test(line))\n .map((line) => line.slice(0, 72).trim())\n .join(\"\");\n if (!parameterText) {\n return [];\n }\n return parameterText\n .split(\";\")\n .map((record) => record.trim())\n .filter(Boolean)\n .map((record) => {\n const params = record.split(\",\").map((part) => part.trim()).filter(Boolean);\n return { type: params[0] || \"UNKNOWN\", params };\n });\n}\n\nfunction summarizeStepRecord(record: StepRecord): string {\n if (record.type === \"CARTESIAN_POINT\") {\n const point = record.args.match(/\\(([-+0-9., E]+)\\)/i)?.[1];\n return point ? `坐标 ${point.replace(/\\s+/g, \"\")}` : record.args;\n }\n if (record.type === \"DIRECTION\" || record.type === \"VECTOR\") {\n const direction = record.args.match(/\\(([-+0-9., E]+)\\)/i)?.[1];\n return direction ? `向量 ${direction.replace(/\\s+/g, \"\")}` : record.args;\n }\n if (record.type === \"LINE\" || record.type === \"CIRCLE\" || record.type === \"ADVANCED_FACE\") {\n return record.args.slice(0, 180);\n }\n return record.args.slice(0, 120);\n}\n\nfunction summarizeIfcRecord(record: StepRecord): string {\n const strings = extractStepStrings(record.args);\n const globalId = strings[0];\n const name = strings[2] || strings[1];\n const label = [globalId, name].filter(Boolean).join(\" · \");\n if (label) {\n return label;\n }\n return summarizeStepRecord(record);\n}\n\nfunction createIfcHierarchy(records: StepRecord[]): HTMLElement | null {\n const rows = records\n .filter((record) => [\"IFCPROJECT\", \"IFCSITE\", \"IFCBUILDING\", \"IFCBUILDINGSTOREY\", \"IFCSPACE\"].includes(record.type))\n .slice(0, 80)\n .map((record) => ({\n id: record.id,\n type: ifcTypeName(record.type),\n detail: summarizeIfcRecord(record)\n }));\n if (rows.length === 0) {\n return null;\n }\n\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-table-scroll ofv-cad-entities\";\n const title = document.createElement(\"strong\");\n title.textContent = \"BIM 层级\";\n const table = document.createElement(\"table\");\n const thead = document.createElement(\"thead\");\n const header = document.createElement(\"tr\");\n for (const label of [\"ID\", \"层级\", \"名称\"]) {\n const cell = document.createElement(\"th\");\n cell.textContent = label;\n header.append(cell);\n }\n thead.append(header);\n const tbody = document.createElement(\"tbody\");\n for (const row of rows) {\n const tr = document.createElement(\"tr\");\n for (const value of [row.id, row.type, row.detail]) {\n const cell = document.createElement(\"td\");\n cell.textContent = value;\n tr.append(cell);\n }\n tbody.append(tr);\n }\n table.append(thead, tbody);\n wrapper.append(title, table);\n return wrapper;\n}\n\nfunction extractStepStrings(args: string): string[] {\n const values: string[] = [];\n const pattern = /'((?:''|[^'])*)'/g;\n let match: RegExpExecArray | null;\n while ((match = pattern.exec(args))) {\n values.push((match[1] || \"\").replace(/''/g, \"'\"));\n }\n return values;\n}\n\nfunction countIfcElements(counts: Map<string, number>): number {\n const elementTypes = [\n \"IFCBEAM\",\n \"IFCBUILDINGELEMENTPROXY\",\n \"IFCCOLUMN\",\n \"IFCCOVERING\",\n \"IFCCURTAINWALL\",\n \"IFCDOOR\",\n \"IFCFLOWSEGMENT\",\n \"IFCFURNISHINGELEMENT\",\n \"IFCMEMBER\",\n \"IFCPLATE\",\n \"IFCRAILING\",\n \"IFCRAMP\",\n \"IFCRAMPFLIGHT\",\n \"IFCROOF\",\n \"IFCSLAB\",\n \"IFCSTAIR\",\n \"IFCSTAIRFLIGHT\",\n \"IFCWALL\",\n \"IFCWALLSTANDARDCASE\",\n \"IFCWINDOW\"\n ];\n return elementTypes.reduce((sum, type) => sum + (counts.get(type) || 0), 0);\n}\n\nfunction ifcTypeName(type: string): string {\n const names: Record<string, string> = {\n IFCPROJECT: \"项目\",\n IFCSITE: \"场地\",\n IFCBUILDING: \"建筑\",\n IFCBUILDINGSTOREY: \"楼层\",\n IFCSPACE: \"空间\"\n };\n return names[type] || type;\n}\n\nfunction igesTypeName(type: string): string {\n const names: Record<string, string> = {\n \"100\": \"100 Circular Arc\",\n \"110\": \"110 Line\",\n \"112\": \"112 Parametric Spline Curve\",\n \"114\": \"114 Parametric Spline Surface\",\n \"116\": \"116 Point\",\n \"118\": \"118 Ruled Surface\",\n \"120\": \"120 Surface of Revolution\",\n \"126\": \"126 Rational B-Spline Curve\",\n \"128\": \"128 Rational B-Spline Surface\",\n \"144\": \"144 Trimmed Surface\"\n };\n return names[type] || type;\n}\n\nfunction createCadTypeList(counts: Map<string, number>, titleText = \"类型统计\"): HTMLElement {\n const details = document.createElement(\"details\");\n details.className = \"ofv-details ofv-cad-types\";\n details.open = true;\n const summary = document.createElement(\"summary\");\n summary.textContent = titleText;\n const list = document.createElement(\"ul\");\n for (const [type, count] of [...counts.entries()].sort((a, b) => b[1] - a[1]).slice(0, 80)) {\n const item = document.createElement(\"li\");\n item.textContent = `${type}: ${count}`;\n list.append(item);\n }\n details.append(summary, list);\n return details;\n}\n\nfunction createCadEntityTable(rows: Array<{ id: string; type: string; detail: string }>): HTMLElement {\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-table-scroll ofv-cad-entities\";\n const table = document.createElement(\"table\");\n const thead = document.createElement(\"thead\");\n const header = document.createElement(\"tr\");\n for (const label of [\"ID\", \"类型\", \"摘要\"]) {\n const cell = document.createElement(\"th\");\n cell.textContent = label;\n header.append(cell);\n }\n thead.append(header);\n const tbody = document.createElement(\"tbody\");\n for (const row of rows) {\n const tr = document.createElement(\"tr\");\n for (const value of [row.id, row.type, row.detail]) {\n const cell = document.createElement(\"td\");\n cell.textContent = value;\n tr.append(cell);\n }\n tbody.append(tr);\n }\n table.append(thead, tbody);\n wrapper.append(table);\n return wrapper;\n}\n\nfunction countBy(values: string[]): Map<string, number> {\n const counts = new Map<string, number>();\n for (const value of values) {\n counts.set(value, (counts.get(value) || 0) + 1);\n }\n return counts;\n}\n\nfunction appendMeta(parent: HTMLElement, label: string, value: string | number): void {\n const row = document.createElement(\"div\");\n row.className = \"ofv-meta-row\";\n const key = document.createElement(\"span\");\n key.textContent = label;\n const content = document.createElement(\"strong\");\n content.textContent = String(value);\n row.append(key, content);\n parent.append(row);\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) {\n return `${bytes} B`;\n }\n if (bytes < 1024 * 1024) {\n return `${(bytes / 1024).toFixed(1)} KB`;\n }\n return `${(bytes / 1024 / 1024).toFixed(2)} MB`;\n}\n\nfunction byteSignature(bytes: Uint8Array): string {\n if (bytes.length === 0) {\n return \"空文件\";\n }\n const ascii = new TextDecoder(\"ascii\").decode(bytes.slice(0, Math.min(bytes.length, 16))).replace(/[^\\x20-\\x7E]/g, \".\");\n const hex = Array.from(bytes.slice(0, Math.min(bytes.length, 8)))\n .map((byte) => byte.toString(16).padStart(2, \"0\").toUpperCase())\n .join(\" \");\n return `${ascii} (${hex})`;\n}\n\nfunction detectCadVersion(bytes: Uint8Array, extension: string): string {\n const header = new TextDecoder(\"ascii\").decode(bytes.slice(0, Math.min(bytes.length, 32)));\n if (extension === \"dwg\") {\n const match = header.match(/AC\\d{4}/);\n if (!match) {\n return \"未知 DWG 版本\";\n }\n const names: Record<string, string> = {\n AC1009: \"AutoCAD R12\",\n AC1012: \"AutoCAD R13\",\n AC1014: \"AutoCAD R14\",\n AC1015: \"AutoCAD 2000/2002\",\n AC1018: \"AutoCAD 2004/2005/2006\",\n AC1021: \"AutoCAD 2007/2008/2009\",\n AC1024: \"AutoCAD 2010/2011/2012\",\n AC1027: \"AutoCAD 2013/2014/2015/2016/2017\",\n AC1032: \"AutoCAD 2018+\"\n };\n return `${match[0]}${names[match[0]] ? ` · ${names[match[0]]}` : \"\"}`;\n }\n if (header.startsWith(\"(DWF\") || header.includes(\"DWF\")) {\n return header.split(/\\s+/)[0] || \"DWF\";\n }\n return \"未知版本\";\n}\n\nfunction detectCadContainer(bytes: Uint8Array): string {\n if (bytes[0] === 0x50 && bytes[1] === 0x4b) {\n return \"ZIP/PK 压缩容器\";\n }\n if (bytes[0] === 0x1f && bytes[1] === 0x8b) {\n return \"GZIP 压缩流\";\n }\n if (bytes[0] === 0x28 && bytes[1] === 0x44 && bytes[2] === 0x57 && bytes[3] === 0x46) {\n return \"DWF ASCII 头\";\n }\n return \"二进制流\";\n}\n\nfunction hexPreview(bytes: Uint8Array): string {\n const rows: string[] = [];\n const limit = Math.min(bytes.length, 256);\n for (let offset = 0; offset < limit; offset += 16) {\n const slice = bytes.slice(offset, offset + 16);\n const hex = Array.from(slice)\n .map((byte) => byte.toString(16).padStart(2, \"0\").toUpperCase())\n .join(\" \")\n .padEnd(47, \" \");\n const ascii = Array.from(slice)\n .map((byte) => (byte >= 32 && byte <= 126 ? String.fromCharCode(byte) : \".\"))\n .join(\"\");\n rows.push(`${offset.toString(16).padStart(8, \"0\").toUpperCase()} ${hex} ${ascii}`);\n }\n if (bytes.length > limit) {\n rows.push(`... 仅展示前 ${limit} 字节,共 ${bytes.length} 字节`);\n }\n return rows.join(\"\\n\") || \"无可展示字节。\";\n}\n\nfunction renderDxf(\n panel: HTMLElement,\n dxf: string,\n ctx: Pick<PreviewContext, \"toolbar\">\n): {\n canCommand: (command: string) => boolean;\n command: (command: string) => boolean;\n destroy: () => void;\n} {\n const pairs = dxf.split(/\\r?\\n/).map((line) => line.trim());\n const lines: Array<LayeredValue<[number, number, number, number]>> = [];\n const circles: Array<LayeredValue<[number, number, number]>> = [];\n const arcs: Array<LayeredValue<[number, number, number, number, number]>> = [];\n const points: Array<LayeredValue<[number, number]>> = [];\n const polylines: Array<LayeredValue<Array<[number, number]>>> = [];\n const texts: Array<LayeredValue<[number, number, string, number]>> = [];\n\n for (let index = 0; index < pairs.length; index += 2) {\n const code = pairs[index];\n const value = pairs[index + 1];\n if (code === \"0\" && value === \"LINE\") {\n const entity = readEntity(pairs, index + 2);\n lines.push({\n layer: normalizeLayerName(entity[\"8\"]),\n value: [\n Number(entity[\"10\"] || 0),\n Number(entity[\"20\"] || 0),\n Number(entity[\"11\"] || 0),\n Number(entity[\"21\"] || 0)\n ]\n });\n }\n if (code === \"0\" && value === \"CIRCLE\") {\n const entity = readEntity(pairs, index + 2);\n circles.push({\n layer: normalizeLayerName(entity[\"8\"]),\n value: [\n Number(entity[\"10\"] || 0),\n Number(entity[\"20\"] || 0),\n Number(entity[\"40\"] || 0)\n ]\n });\n }\n if (code === \"0\" && value === \"ARC\") {\n const entity = readEntity(pairs, index + 2);\n arcs.push({\n layer: normalizeLayerName(entity[\"8\"]),\n value: [\n Number(entity[\"10\"] || 0),\n Number(entity[\"20\"] || 0),\n Number(entity[\"40\"] || 0),\n Number(entity[\"50\"] || 0),\n Number(entity[\"51\"] || 0)\n ]\n });\n }\n if (code === \"0\" && value === \"POINT\") {\n const entity = readEntity(pairs, index + 2);\n points.push({\n layer: normalizeLayerName(entity[\"8\"]),\n value: [Number(entity[\"10\"] || 0), Number(entity[\"20\"] || 0)]\n });\n }\n if (code === \"0\" && value === \"LWPOLYLINE\") {\n const entity = readEntity(pairs, index + 2);\n const entityPairs = readEntityPairs(pairs, index + 2);\n const polyline = readPolylinePoints(entityPairs);\n if (polyline.length > 1) {\n polylines.push({ layer: normalizeLayerName(entity[\"8\"]), value: polyline });\n }\n }\n if (code === \"0\" && value === \"POLYLINE\") {\n const result = readLegacyPolyline(pairs, index + 2);\n if (result.points.length > 1) {\n polylines.push({ layer: result.layer, value: result.points });\n }\n index = Math.max(index, result.endIndex - 2);\n }\n if (code === \"0\" && (value === \"TEXT\" || value === \"MTEXT\")) {\n const entity = readEntity(pairs, index + 2);\n const text = normalizeDxfText(entity[\"1\"] || entity[\"3\"] || \"\");\n if (text) {\n texts.push({\n layer: normalizeLayerName(entity[\"8\"]),\n value: [\n Number(entity[\"10\"] || 0),\n Number(entity[\"20\"] || 0),\n text,\n Math.max(1, Number(entity[\"40\"] || 12))\n ]\n });\n }\n }\n }\n\n const section = createSection(`DXF 基础预览`);\n const svg = document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svg.setAttribute(\"class\", \"ofv-svg-stage\");\n\n const bounds = computeBounds(lines, circles, arcs, points, polylines, texts);\n const initialViewBox = {\n x: bounds.minX,\n y: bounds.minY,\n width: bounds.width,\n height: bounds.height\n };\n let currentViewBox = { ...initialViewBox };\n const applyViewBox = () => {\n svg.setAttribute(\n \"viewBox\",\n `${currentViewBox.x} ${currentViewBox.y} ${currentViewBox.width} ${currentViewBox.height}`\n );\n };\n applyViewBox();\n\n for (const item of lines.slice(0, 3000)) {\n const [x1, y1, x2, y2] = item.value;\n const line = document.createElementNS(svg.namespaceURI, \"line\");\n line.setAttribute(\"x1\", String(x1));\n line.setAttribute(\"y1\", String(-y1));\n line.setAttribute(\"x2\", String(x2));\n line.setAttribute(\"y2\", String(-y2));\n line.setAttribute(\"stroke\", \"#111827\");\n line.setAttribute(\"stroke-width\", String(bounds.stroke));\n applyLayer(line, item.layer);\n svg.append(line);\n }\n\n for (const item of circles.slice(0, 1000)) {\n const [cx, cy, radius] = item.value;\n const circle = document.createElementNS(svg.namespaceURI, \"circle\");\n circle.setAttribute(\"cx\", String(cx));\n circle.setAttribute(\"cy\", String(-cy));\n circle.setAttribute(\"r\", String(Math.abs(radius)));\n circle.setAttribute(\"fill\", \"none\");\n circle.setAttribute(\"stroke\", \"#2563eb\");\n circle.setAttribute(\"stroke-width\", String(bounds.stroke));\n applyLayer(circle, item.layer);\n svg.append(circle);\n }\n\n for (const item of arcs.slice(0, 1000)) {\n const [cx, cy, radius, startAngle, endAngle] = item.value;\n const path = document.createElementNS(svg.namespaceURI, \"path\");\n path.setAttribute(\"d\", arcPath(cx, -cy, Math.abs(radius), -startAngle, -endAngle));\n path.setAttribute(\"fill\", \"none\");\n path.setAttribute(\"stroke\", \"#7c3aed\");\n path.setAttribute(\"stroke-width\", String(bounds.stroke));\n applyLayer(path, item.layer);\n svg.append(path);\n }\n\n for (const item of polylines.slice(0, 2000)) {\n const polyline = item.value;\n const path = document.createElementNS(svg.namespaceURI, \"polyline\");\n path.setAttribute(\"points\", polyline.map(([x, y]) => `${x},${-y}`).join(\" \"));\n path.setAttribute(\"fill\", \"none\");\n path.setAttribute(\"stroke\", \"#0f766e\");\n path.setAttribute(\"stroke-width\", String(bounds.stroke));\n applyLayer(path, item.layer);\n svg.append(path);\n }\n\n for (const item of points.slice(0, 3000)) {\n const [x, y] = item.value;\n const point = document.createElementNS(svg.namespaceURI, \"circle\");\n point.setAttribute(\"cx\", String(x));\n point.setAttribute(\"cy\", String(-y));\n point.setAttribute(\"r\", String(bounds.stroke * 2));\n point.setAttribute(\"fill\", \"#dc2626\");\n applyLayer(point, item.layer);\n svg.append(point);\n }\n\n for (const item of texts.slice(0, 500)) {\n const [x, y, text, height] = item.value;\n const label = document.createElementNS(svg.namespaceURI, \"text\");\n label.setAttribute(\"x\", String(x));\n label.setAttribute(\"y\", String(-y));\n label.setAttribute(\"font-size\", String(Math.max(height, bounds.stroke * 8)));\n label.setAttribute(\"fill\", \"currentColor\");\n label.textContent = text;\n applyLayer(label, item.layer);\n svg.append(label);\n }\n\n const layers = Array.from(\n new Set([...lines, ...circles, ...arcs, ...points, ...polylines, ...texts].map((item) => item.layer))\n ).sort((a, b) => a.localeCompare(b));\n if (layers.length > 0) {\n section.append(createLayerControls(svg, layers));\n }\n\n const note = document.createElement(\"p\");\n note.textContent =\n `已提取 LINE ${lines.length} 个、CIRCLE ${circles.length} 个、ARC ${arcs.length} 个、POLYLINE ${polylines.length} 个、POINT ${points.length} 个、TEXT ${texts.length} 个。`\n section.append(note, svg);\n panel.append(section);\n const updateToolbarZoom = () => {\n ctx.toolbar?.setZoom(initialViewBox.width / currentViewBox.width);\n };\n updateToolbarZoom();\n\n return {\n canCommand(command) {\n return command === \"zoom-in\" || command === \"zoom-out\" || command === \"zoom-reset\";\n },\n command(command) {\n if (command === \"zoom-in\" || command === \"zoom-out\") {\n const factor = command === \"zoom-in\" ? 0.82 : 1.18;\n const centerX = currentViewBox.x + currentViewBox.width / 2;\n const centerY = currentViewBox.y + currentViewBox.height / 2;\n currentViewBox.width *= factor;\n currentViewBox.height *= factor;\n currentViewBox.x = centerX - currentViewBox.width / 2;\n currentViewBox.y = centerY - currentViewBox.height / 2;\n applyViewBox();\n updateToolbarZoom();\n return true;\n }\n if (command === \"zoom-reset\") {\n currentViewBox = { ...initialViewBox };\n applyViewBox();\n updateToolbarZoom();\n return true;\n }\n return false;\n },\n destroy() {\n ctx.toolbar?.setZoom(undefined);\n }\n };\n}\n\nfunction applyLayer(element: Element, layer: string): void {\n element.setAttribute(\"data-layer\", layer);\n}\n\nfunction createLayerControls(svg: SVGSVGElement, layers: string[]): HTMLElement {\n const controls = document.createElement(\"div\");\n controls.className = \"ofv-cad-layers\";\n const title = document.createElement(\"strong\");\n title.textContent = `图层 ${layers.length}`;\n controls.append(title);\n\n for (const layer of layers) {\n const label = document.createElement(\"label\");\n const checkbox = document.createElement(\"input\");\n checkbox.type = \"checkbox\";\n checkbox.checked = true;\n checkbox.addEventListener(\"change\", () => {\n for (const element of svg.querySelectorAll<SVGElement>(`[data-layer=\"${escapeCssAttribute(layer)}\"]`)) {\n element.style.display = checkbox.checked ? \"\" : \"none\";\n }\n });\n const name = document.createElement(\"span\");\n name.textContent = layer;\n label.append(checkbox, name);\n controls.append(label);\n }\n return controls;\n}\n\nfunction readEntity(pairs: string[], start: number): Record<string, string> {\n const entity: Record<string, string> = {};\n for (let index = start; index < pairs.length; index += 2) {\n const code = pairs[index];\n const value = pairs[index + 1];\n if (code === \"0\") {\n break;\n }\n entity[code] = value;\n }\n return entity;\n}\n\nfunction readEntityPairs(pairs: string[], start: number): Array<[string, string]> {\n const entityPairs: Array<[string, string]> = [];\n for (let index = start; index < pairs.length; index += 2) {\n const code = pairs[index];\n const value = pairs[index + 1];\n if (code === \"0\") {\n break;\n }\n entityPairs.push([code, value]);\n }\n return entityPairs;\n}\n\nfunction readPolylinePoints(entityPairs: Array<[string, string]>): Array<[number, number]> {\n const points: Array<[number, number]> = [];\n let x: number | undefined;\n for (const [code, value] of entityPairs) {\n if (code === \"10\") {\n x = Number(value);\n }\n if (code === \"20\" && x !== undefined) {\n points.push([x, Number(value)]);\n x = undefined;\n }\n }\n return points;\n}\n\nfunction readLegacyPolyline(\n pairs: string[],\n start: number\n): { layer: string; points: Array<[number, number]>; endIndex: number } {\n let layer = \"0\";\n const points: Array<[number, number]> = [];\n for (let index = start; index < pairs.length; index += 2) {\n const code = pairs[index];\n const value = pairs[index + 1];\n if (code === \"0\" && value === \"SEQEND\") {\n return { layer, points, endIndex: index + 2 };\n }\n if (code === \"8\") {\n layer = normalizeLayerName(value);\n }\n if (code === \"0\" && value === \"VERTEX\") {\n const entity = readEntity(pairs, index + 2);\n points.push([Number(entity[\"10\"] || 0), Number(entity[\"20\"] || 0)]);\n }\n }\n return { layer, points, endIndex: pairs.length };\n}\n\nfunction normalizeLayerName(layer: string | undefined): string {\n return layer?.trim() || \"0\";\n}\n\nfunction escapeCssAttribute(value: string): string {\n if (typeof CSS !== \"undefined\" && CSS.escape) {\n return CSS.escape(value);\n }\n return value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"');\n}\n\nfunction normalizeDxfText(text: string): string {\n return text\n .replace(/\\\\P/g, \"\\n\")\n .replace(/\\{\\\\[^;]+;/g, \"\")\n .replace(/[{}]/g, \"\")\n .trim();\n}\n\nfunction arcPath(cx: number, cy: number, radius: number, startAngle: number, endAngle: number): string {\n const start = polarToCartesian(cx, cy, radius, endAngle);\n const end = polarToCartesian(cx, cy, radius, startAngle);\n const delta = Math.abs(endAngle - startAngle);\n const largeArc = delta <= 180 ? \"0\" : \"1\";\n return `M ${start.x} ${start.y} A ${radius} ${radius} 0 ${largeArc} 0 ${end.x} ${end.y}`;\n}\n\nfunction polarToCartesian(cx: number, cy: number, radius: number, angleDegrees: number): { x: number; y: number } {\n const angle = (angleDegrees * Math.PI) / 180;\n return {\n x: cx + radius * Math.cos(angle),\n y: cy + radius * Math.sin(angle)\n };\n}\n\nfunction computeBounds(\n lines: Array<LayeredValue<[number, number, number, number]>>,\n circles: Array<LayeredValue<[number, number, number]>>,\n arcs: Array<LayeredValue<[number, number, number, number, number]>>,\n points: Array<LayeredValue<[number, number]>>,\n polylines: Array<LayeredValue<Array<[number, number]>>>,\n texts: Array<LayeredValue<[number, number, string, number]>>\n): { minX: number; minY: number; width: number; height: number; stroke: number } {\n const xs = lines.flatMap(({ value: [x1, , x2] }) => [x1, x2]);\n const ys = lines.flatMap(({ value: [, y1, , y2] }) => [-y1, -y2]);\n for (const { value: [cx, cy, radius] } of circles) {\n xs.push(cx - radius, cx + radius);\n ys.push(-cy - radius, -cy + radius);\n }\n for (const { value: [cx, cy, radius] } of arcs) {\n xs.push(cx - radius, cx + radius);\n ys.push(-cy - radius, -cy + radius);\n }\n for (const { value: [x, y] } of points) {\n xs.push(x);\n ys.push(-y);\n }\n for (const { value: polyline } of polylines) {\n for (const [x, y] of polyline) {\n xs.push(x);\n ys.push(-y);\n }\n }\n for (const { value: [x, y, text, height] } of texts) {\n xs.push(x, x + text.length * height * 0.6);\n ys.push(-y, -y - height);\n }\n const minX = Math.min(...xs, 0);\n const maxX = Math.max(...xs, 100);\n const minY = Math.min(...ys, 0);\n const maxY = Math.max(...ys, 100);\n const width = Math.max(1, maxX - minX);\n const height = Math.max(1, maxY - minY);\n return {\n minX,\n minY,\n width,\n height,\n stroke: Math.max(width, height) / 600\n };\n}\n","import type { PreviewContext, PreviewInstance, PreviewPlugin, PreviewSize } from \"../types\";\nimport { createObjectUrl, revokeObjectUrl } from \"../dom\";\nimport { resolveFormat } from \"./utils\";\n\nconst modelExtensions = new Set([\n \"gltf\",\n \"glb\",\n \"obj\",\n \"stl\",\n \"fbx\",\n \"dae\",\n \"ply\",\n \"3mf\",\n \"3ds\",\n \"usd\",\n \"usda\",\n \"usdc\",\n \"usdz\",\n \"wrl\",\n \"vrml\"\n]);\nconst modelMimeTypes = new Set([\n \"model/gltf+json\",\n \"model/gltf-binary\",\n \"model/stl\",\n \"model/obj\",\n \"model/vnd.collada+xml\",\n \"model/3mf\",\n \"model/3ds\",\n \"model/vnd.usd\",\n \"model/vnd.usdz+zip\",\n \"model/vrml\",\n \"application/sla\",\n \"application/vnd.ms-pki.stl\",\n \"application/ply\",\n \"application/vnd.autodesk.fbx\"\n]);\nconst modelMimeFormatMap: Record<string, string> = {\n \"model/gltf+json\": \"gltf\",\n \"model/gltf-binary\": \"glb\",\n \"model/stl\": \"stl\",\n \"model/obj\": \"obj\",\n \"model/vnd.collada+xml\": \"dae\",\n \"model/3mf\": \"3mf\",\n \"model/3ds\": \"3ds\",\n \"model/vnd.usd\": \"usd\",\n \"model/vnd.usdz+zip\": \"usdz\",\n \"model/vrml\": \"wrl\",\n \"application/sla\": \"stl\",\n \"application/vnd.ms-pki.stl\": \"stl\",\n \"application/ply\": \"ply\",\n \"application/vnd.autodesk.fbx\": \"fbx\"\n};\nconst textLikeExtensions = new Set([\"json\", \"txt\", \"md\", \"xml\", \"yaml\", \"yml\", \"csv\", \"tsv\", \"js\", \"ts\", \"tsx\", \"jsx\", \"html\", \"css\"]);\n\nexport function model3dPlugin(): PreviewPlugin {\n return {\n name: \"model3d\",\n match(file) {\n return (\n modelExtensions.has(file.extension) ||\n (modelMimeTypes.has(file.mimeType) && (file.extension === \"\" || file.extension === \"bin\" || !textLikeExtensions.has(file.extension)))\n );\n },\n async render(ctx) {\n const THREE = await import(\"three\");\n const { OrbitControls } = await import(\"three/examples/jsm/controls/OrbitControls.js\");\n const url = createObjectUrl(ctx.file);\n const isExternal = Boolean(ctx.file.url);\n\n const stage = document.createElement(\"div\");\n stage.className = \"ofv-model-stage\";\n ctx.viewport.append(stage);\n\n const scene = new THREE.Scene();\n scene.background = new THREE.Color(0xf3f4f6);\n\n const camera = new THREE.PerspectiveCamera(45, 1, 0.1, 10000);\n camera.position.set(2.5, 2, 3.5);\n\n let renderer: import(\"three\").WebGLRenderer;\n try {\n renderer = new THREE.WebGLRenderer({ antialias: true });\n } catch {\n stage.remove();\n return renderModelFallback(ctx, url, isExternal, \"当前浏览器或设备不支持 WebGL,无法直接渲染 3D 模型。\");\n }\n renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));\n renderer.outputColorSpace = THREE.SRGBColorSpace;\n renderer.toneMapping = THREE.ACESFilmicToneMapping;\n renderer.toneMappingExposure = 1.08;\n stage.append(renderer.domElement);\n\n const controls = new OrbitControls(camera, renderer.domElement);\n controls.enableDamping = true;\n\n scene.add(new THREE.HemisphereLight(0xffffff, 0x94a3b8, 2.8));\n const directional = new THREE.DirectionalLight(0xffffff, 2);\n directional.position.set(4, 6, 5);\n scene.add(directional);\n scene.add(new THREE.GridHelper(10, 10, 0xcbd5e1, 0xe5e7eb));\n\n const extension = resolveFormat(ctx.file, modelMimeFormatMap);\n const loaded = await loadModel(extension, url, THREE).catch(() => undefined);\n if (!loaded) {\n controls.dispose();\n renderer.dispose();\n stage.remove();\n return renderModelFallback(ctx, url, isExternal, \"无法解析当前 3D 模型内容。\");\n }\n if (loaded.message) {\n const message = document.createElement(\"div\");\n message.className = \"ofv-model-message\";\n message.textContent = loaded.message;\n stage.append(message);\n }\n const object = loaded.object;\n scene.add(object);\n const initialFrame = frameObject(object, camera, controls, THREE);\n const measurement = measureObject(object, THREE);\n stage.append(createMeasurementPanel(measurement));\n stage.append(createMaterialPanel(collectMaterialStats(object)));\n\n let animationFrame = 0;\n const animate = () => {\n controls.update();\n renderer.render(scene, camera);\n animationFrame = window.requestAnimationFrame(animate);\n };\n animate();\n\n const resize = (size: PreviewSize) => {\n const width = Math.max(1, size.width);\n const height = Math.max(1, size.height);\n camera.aspect = width / height;\n camera.updateProjectionMatrix();\n renderer.setSize(width, height, false);\n };\n resize(ctx.size);\n const updateToolbarZoom = () => {\n const currentDistance = vectorDistance(camera.position, controls.target);\n const initialDistance = vectorDistance(initialFrame.cameraPosition, initialFrame.target);\n ctx.toolbar?.setZoom(initialDistance > 0 ? initialDistance / currentDistance : undefined);\n };\n updateToolbarZoom();\n\n return {\n canCommand(command) {\n return (\n command === \"zoom-in\" ||\n command === \"zoom-out\" ||\n command === \"zoom-reset\" ||\n command === \"rotate-right\" ||\n command === \"rotate-left\"\n );\n },\n command(command) {\n if (command === \"zoom-in\" || command === \"zoom-out\") {\n const factor = command === \"zoom-in\" ? 0.82 : 1.18;\n camera.position.sub(controls.target).multiplyScalar(factor).add(controls.target);\n camera.updateProjectionMatrix();\n controls.update();\n updateToolbarZoom();\n return true;\n }\n if (command === \"zoom-reset\") {\n camera.position.copy(initialFrame.cameraPosition);\n controls.target.copy(initialFrame.target);\n camera.near = initialFrame.near;\n camera.far = initialFrame.far;\n camera.updateProjectionMatrix();\n controls.update();\n updateToolbarZoom();\n return true;\n }\n if (command === \"rotate-right\" || command === \"rotate-left\") {\n object.rotateY(command === \"rotate-right\" ? Math.PI / 8 : -Math.PI / 8);\n return true;\n }\n return false;\n },\n resize,\n destroy() {\n ctx.toolbar?.setZoom(undefined);\n window.cancelAnimationFrame(animationFrame);\n controls.dispose();\n renderer.dispose();\n disposeObject(object, THREE);\n stage.remove();\n revokeObjectUrl(url, isExternal);\n }\n };\n }\n };\n}\n\nfunction vectorDistance(\n a: { x: number; y: number; z: number; distanceTo?: (value: { x: number; y: number; z: number }) => number },\n b: { x: number; y: number; z: number }\n): number {\n if (typeof a.distanceTo === \"function\") {\n return a.distanceTo(b);\n }\n return Math.hypot(a.x - b.x, a.y - b.y, a.z - b.z);\n}\n\nfunction renderModelFallback(\n ctx: PreviewContext,\n url: string,\n isExternal: boolean,\n message: string\n): PreviewInstance {\n const panel = document.createElement(\"div\");\n panel.className = \"ofv-fallback\";\n\n const title = document.createElement(\"strong\");\n title.textContent = \"3D 预览不可用\";\n\n const detail = document.createElement(\"span\");\n detail.textContent = `${message} ${ctx.file.name}`;\n\n const download = document.createElement(\"a\");\n download.href = url;\n download.download = ctx.file.name;\n download.textContent = \"下载文件\";\n\n panel.append(title, detail, download);\n ctx.viewport.classList.add(\"ofv-center\");\n ctx.viewport.append(panel);\n\n return {\n canCommand() {\n return false;\n },\n destroy() {\n ctx.viewport.classList.remove(\"ofv-center\");\n panel.remove();\n revokeObjectUrl(url, isExternal);\n }\n };\n}\n\nasync function loadModel(\n extension: string,\n url: string,\n THREE: typeof import(\"three\")\n): Promise<{ object: import(\"three\").Object3D; message?: string }> {\n if (extension === \"gltf\" || extension === \"glb\") {\n const { GLTFLoader } = await import(\"three/examples/jsm/loaders/GLTFLoader.js\");\n const gltf = await new GLTFLoader().loadAsync(url);\n return { object: gltf.scene };\n }\n if (extension === \"obj\") {\n const { OBJLoader } = await import(\"three/examples/jsm/loaders/OBJLoader.js\");\n return { object: await new OBJLoader().loadAsync(url) };\n }\n if (extension === \"fbx\") {\n const { FBXLoader } = await import(\"three/examples/jsm/loaders/FBXLoader.js\");\n return { object: await new FBXLoader().loadAsync(url) };\n }\n if (extension === \"dae\") {\n const { ColladaLoader } = await import(\"three/examples/jsm/loaders/ColladaLoader.js\");\n const collada = await new ColladaLoader().loadAsync(url);\n if (!collada) {\n throw new Error(\"Collada loader returned no scene.\");\n }\n return { object: collada.scene };\n }\n if (extension === \"stl\") {\n const { STLLoader } = await import(\"three/examples/jsm/loaders/STLLoader.js\");\n const geometry = await new STLLoader().loadAsync(url);\n const material = new THREE.MeshStandardMaterial({ color: 0x64748b, roughness: 0.55 });\n return { object: new THREE.Mesh(geometry, material) };\n }\n if (extension === \"ply\") {\n const { PLYLoader } = await import(\"three/examples/jsm/loaders/PLYLoader.js\");\n const geometry = await new PLYLoader().loadAsync(url);\n const material = new THREE.MeshStandardMaterial({ color: 0x64748b, roughness: 0.55 });\n return { object: new THREE.Mesh(geometry, material) };\n }\n if (extension === \"3mf\") {\n const { ThreeMFLoader } = await import(\"three/examples/jsm/loaders/3MFLoader.js\");\n return { object: await new ThreeMFLoader().loadAsync(url) };\n }\n if (extension === \"3ds\") {\n const { TDSLoader } = await import(\"three/examples/jsm/loaders/TDSLoader.js\");\n return { object: await new TDSLoader().loadAsync(url) };\n }\n if (extension === \"usd\" || extension === \"usda\" || extension === \"usdc\" || extension === \"usdz\") {\n const { USDLoader } = await import(\"three/examples/jsm/loaders/USDLoader.js\");\n return { object: await new USDLoader().loadAsync(url) };\n }\n if (extension === \"wrl\" || extension === \"vrml\") {\n const { VRMLLoader } = await import(\"three/examples/jsm/loaders/VRMLLoader.js\");\n return { object: await new VRMLLoader().loadAsync(url) };\n }\n const group = new THREE.Group();\n const geometry = new THREE.BoxGeometry(1, 1, 1);\n const material = new THREE.MeshStandardMaterial({ color: 0x64748b });\n const mesh = new THREE.Mesh(geometry, material);\n group.add(mesh);\n return {\n object: group,\n message: `.${extension} 已识别为 3D 格式,当前内置渲染优先支持 gltf/glb/obj/stl/fbx/dae/ply/3mf/3ds/usd/usdz/vrml。`\n };\n}\n\nfunction frameObject(\n object: import(\"three\").Object3D,\n camera: import(\"three\").PerspectiveCamera,\n controls: { target: import(\"three\").Vector3; update: () => void },\n THREE: typeof import(\"three\")\n): {\n cameraPosition: import(\"three\").Vector3;\n target: import(\"three\").Vector3;\n near: number;\n far: number;\n} {\n const box = new THREE.Box3().setFromObject(object);\n const size = box.getSize(new THREE.Vector3());\n const center = box.getCenter(new THREE.Vector3());\n const maxSize = Math.max(size.x, size.y, size.z, 1);\n const distance = maxSize * 2.4;\n camera.position.set(center.x + distance, center.y + distance * 0.7, center.z + distance);\n camera.near = Math.max(distance / 1000, 0.01);\n camera.far = distance * 1000;\n camera.updateProjectionMatrix();\n controls.target.copy(center);\n controls.update();\n return {\n cameraPosition: camera.position.clone(),\n target: controls.target.clone(),\n near: camera.near,\n far: camera.far\n };\n}\n\ntype ModelMeasurement = {\n width: number;\n height: number;\n depth: number;\n diagonal: number;\n center: { x: number; y: number; z: number };\n};\n\ntype MaterialStats = {\n meshes: number;\n materials: number;\n textures: number;\n slots: string[];\n names: string[];\n};\n\nfunction measureObject(object: import(\"three\").Object3D, THREE: typeof import(\"three\")): ModelMeasurement {\n const box = new THREE.Box3().setFromObject(object);\n const size = box.getSize(new THREE.Vector3());\n const center = box.getCenter(new THREE.Vector3());\n return {\n width: size.x,\n height: size.y,\n depth: size.z,\n diagonal: Math.sqrt(size.x ** 2 + size.y ** 2 + size.z ** 2),\n center: { x: center.x, y: center.y, z: center.z }\n };\n}\n\nfunction createMeasurementPanel(measurement: ModelMeasurement): HTMLElement {\n const panel = document.createElement(\"div\");\n panel.className = \"ofv-model-measure\";\n const title = document.createElement(\"strong\");\n title.textContent = \"模型测量\";\n const list = document.createElement(\"dl\");\n appendMeasure(list, \"宽\", measurement.width);\n appendMeasure(list, \"高\", measurement.height);\n appendMeasure(list, \"深\", measurement.depth);\n appendMeasure(list, \"对角线\", measurement.diagonal);\n appendMeasure(\n list,\n \"中心\",\n `${formatMeasure(measurement.center.x)}, ${formatMeasure(measurement.center.y)}, ${formatMeasure(measurement.center.z)}`\n );\n panel.append(title, list);\n return panel;\n}\n\nfunction appendMeasure(list: HTMLDListElement, label: string, value: number | string): void {\n const term = document.createElement(\"dt\");\n term.textContent = label;\n const detail = document.createElement(\"dd\");\n detail.textContent = typeof value === \"number\" ? formatMeasure(value) : value;\n list.append(term, detail);\n}\n\nfunction formatMeasure(value: number): string {\n if (!Number.isFinite(value)) {\n return \"-\";\n }\n const rounded = Math.abs(value) >= 100 ? value.toFixed(1) : value.toFixed(3);\n return rounded.replace(/\\.?0+$/, \"\");\n}\n\nfunction collectMaterialStats(object: import(\"three\").Object3D): MaterialStats {\n const materials = new Set<import(\"three\").Material>();\n const textures = new Set<unknown>();\n const slots = new Set<string>();\n const names = new Set<string>();\n let meshes = 0;\n\n object.traverse((child) => {\n const mesh = child as import(\"three\").Mesh;\n if (!mesh.geometry || !mesh.material) {\n return;\n }\n meshes += 1;\n for (const material of normalizeMaterials(mesh.material)) {\n materials.add(material);\n if (material.name) {\n names.add(material.name);\n }\n for (const slot of textureSlots) {\n const texture = (material as unknown as Record<string, unknown>)[slot];\n if (texture) {\n textures.add(texture);\n slots.add(slot);\n }\n }\n }\n });\n\n return {\n meshes,\n materials: materials.size,\n textures: textures.size,\n slots: [...slots],\n names: [...names].slice(0, 6)\n };\n}\n\nfunction createMaterialPanel(stats: MaterialStats): HTMLElement {\n const panel = document.createElement(\"div\");\n panel.className = \"ofv-model-materials\";\n const title = document.createElement(\"strong\");\n title.textContent = \"材质贴图\";\n\n const list = document.createElement(\"dl\");\n appendMaterialStat(list, \"网格\", stats.meshes);\n appendMaterialStat(list, \"材质\", stats.materials);\n appendMaterialStat(list, \"贴图\", stats.textures);\n appendMaterialStat(list, \"槽位\", stats.slots.length > 0 ? stats.slots.join(\", \") : \"-\");\n if (stats.names.length > 0) {\n appendMaterialStat(list, \"名称\", stats.names.join(\", \"));\n }\n\n panel.append(title, list);\n return panel;\n}\n\nfunction appendMaterialStat(list: HTMLDListElement, label: string, value: number | string): void {\n const term = document.createElement(\"dt\");\n term.textContent = label;\n const detail = document.createElement(\"dd\");\n detail.textContent = String(value);\n list.append(term, detail);\n}\n\nfunction disposeObject(object: import(\"three\").Object3D, THREE: typeof import(\"three\")): void {\n object.traverse((child) => {\n const mesh = child as import(\"three\").Mesh;\n if (mesh.geometry) {\n mesh.geometry.dispose();\n }\n const material = mesh.material;\n for (const item of normalizeMaterials(material)) {\n disposeMaterialTextures(item);\n item.dispose();\n }\n });\n}\n\nconst textureSlots = [\n \"map\",\n \"aoMap\",\n \"alphaMap\",\n \"bumpMap\",\n \"displacementMap\",\n \"emissiveMap\",\n \"envMap\",\n \"lightMap\",\n \"metalnessMap\",\n \"normalMap\",\n \"roughnessMap\"\n];\n\nfunction normalizeMaterials(\n material: import(\"three\").Material | import(\"three\").Material[] | undefined\n): import(\"three\").Material[] {\n if (!material) {\n return [];\n }\n return Array.isArray(material) ? material : [material];\n}\n\nfunction disposeMaterialTextures(material: import(\"three\").Material): void {\n for (const slot of textureSlots) {\n const texture = (material as unknown as Record<string, { dispose?: () => void } | undefined>)[slot];\n texture?.dispose?.();\n }\n}\n","/// <reference path=\"../shims-gis.d.ts\" />\nimport type { PreviewPlugin, PreviewFile } from \"../types\";\nimport { readArrayBuffer, resolveFormat } from \"./utils\";\n\nconst gisExtensions = new Set([\"geojson\", \"topojson\", \"kml\", \"kmz\", \"gpx\", \"shp\"]);\nconst gisMimeFormatMap: Record<string, string> = {\n \"application/geo+json\": \"geojson\",\n \"application/vnd.geo+json\": \"geojson\",\n \"application/topo+json\": \"topojson\",\n \"application/vnd.google-earth.kml+xml\": \"kml\",\n \"application/vnd.google-earth.kmz\": \"kmz\",\n \"application/gpx+xml\": \"gpx\"\n};\n\nfunction loadLeafletCss(): Promise<void> {\n const id = \"ofv-leaflet-css\";\n if (document.getElementById(id)) {\n return Promise.resolve();\n }\n return new Promise((resolve) => {\n const link = document.createElement(\"link\");\n let settled = false;\n const done = () => {\n if (!settled) {\n settled = true;\n resolve();\n }\n };\n link.id = id;\n link.rel = \"stylesheet\";\n link.href = \"https://cdn.jsdelivr.net/npm/leaflet@1.9.4/dist/leaflet.css\";\n link.onload = done;\n link.onerror = done;\n document.head.appendChild(link);\n window.setTimeout(done, 0);\n });\n}\n\nexport function gisPlugin(): PreviewPlugin {\n return {\n name: \"gis\",\n match(file) {\n return gisExtensions.has(file.extension) || Boolean(gisMimeFormatMap[file.mimeType]);\n },\n async render(ctx) {\n // 1. Load Leaflet CSS and dynamic imports\n await loadLeafletCss();\n\n const [L, topojson, toGeoJSON, shpjs, JSZip] = await Promise.all([\n import(\"leaflet\"),\n import(\"topojson-client\"),\n import(\"@mapbox/togeojson\"),\n import(\"shpjs\"),\n import(\"jszip\")\n ]);\n\n const Leaflet = L.default || L;\n const topojsonClient = topojson.default || topojson;\n const togeojsonLib = toGeoJSON.default || toGeoJSON;\n const shpLib = shpjs.default || shpjs;\n const JSZipLib = JSZip.default || JSZip;\n\n // Fix default marker icon paths using inline SVG to avoid asset 404 errors\n const DefaultIcon = Leaflet.icon({\n iconUrl: \"data:image/svg+xml;charset=utf-8,\" + encodeURIComponent(`\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" width=\"32\" height=\"32\">\n <path fill=\"#3b82f6\" d=\"M12 2C8.13 2 5 5.13 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7zm0 9.5c-1.38 0-2.5-1.12-2.5-2.5s1.12-2.5 2.5-2.5 2.5 1.12 2.5 2.5-1.12 2.5-2.5 2.5z\"/>\n </svg>\n `),\n iconSize: [25, 41],\n iconAnchor: [12, 41],\n popupAnchor: [1, -34],\n shadowUrl: \"data:image/svg+xml;charset=utf-8,\" + encodeURIComponent(`\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" width=\"32\" height=\"32\">\n <ellipse cx=\"12\" cy=\"20\" rx=\"6\" ry=\"2\" fill=\"#000000\" opacity=\"0.2\"/>\n </svg>\n `),\n shadowSize: [41, 41],\n shadowAnchor: [12, 41]\n });\n Leaflet.Marker.prototype.options.icon = DefaultIcon;\n\n // 2. Read file as ArrayBuffer and Parse to GeoJSON\n const buffer = await readArrayBuffer(ctx.file);\n const geojson = await parseToGeoJson(\n ctx.file,\n buffer,\n togeojsonLib,\n topojsonClient,\n shpLib,\n JSZipLib\n ).catch((error: unknown) => {\n const fallback = createGisFallback(\"GIS 数据解析失败\", normalizeGisError(error, ctx.file.name));\n ctx.viewport.classList.add(\"ofv-center\");\n ctx.viewport.append(fallback);\n return { fallback };\n });\n\n if (isGisFallback(geojson)) {\n return {\n destroy() {\n ctx.viewport.classList.remove(\"ofv-center\");\n geojson.fallback.remove();\n }\n };\n }\n\n // Handle raw unzipped shapefile warning UI\n if (geojson === null && resolveFormat(ctx.file, gisMimeFormatMap) === \"shp\") {\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n\n const title = document.createElement(\"strong\");\n title.textContent = \"无法直接预览单个 .shp 文件\";\n\n const desc = document.createElement(\"span\");\n desc.textContent = \"Shapefile 格式需要包含配套的 .dbf 和 .shx 数据文件。请将它们打包为 .zip 文件后上传预览,或在压缩包列表中直接查看。\";\n\n fallback.append(title, desc);\n ctx.viewport.classList.add(\"ofv-center\");\n ctx.viewport.append(fallback);\n\n return {\n destroy() {\n ctx.viewport.classList.remove(\"ofv-center\");\n fallback.remove();\n }\n };\n }\n\n // 3. Render Leaflet Map\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-gis-viewer\";\n const summary = summarizeGeoJson(geojson);\n wrapper.append(createGisSummary(summary));\n ctx.viewport.appendChild(wrapper);\n\n const mapContainer = document.createElement(\"div\");\n mapContainer.className = \"ofv-map-stage\";\n wrapper.appendChild(mapContainer);\n if (summary.features === 0) {\n mapContainer.append(createEmptyMapState());\n } else {\n mapContainer.append(createMapLegend(summary));\n }\n\n const map = Leaflet.map(mapContainer).setView([0, 0], 2);\n\n Leaflet.tileLayer(\"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png\", {\n attribution: '&copy; <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors'\n }).addTo(map);\n\n // Render GeoJSON elements with premium blue color styles\n const geojsonLayer = Leaflet.geoJSON(geojson, {\n style: () => ({\n className: \"ofv-map-feature\",\n color: \"#e11d48\",\n weight: 2,\n opacity: 0.92,\n fillColor: \"#fb923c\",\n fillOpacity: 0.3,\n lineCap: \"round\",\n lineJoin: \"round\"\n }),\n pointToLayer: (feature: any, latlng: any) => {\n return Leaflet.circleMarker(latlng, {\n className: \"ofv-map-feature ofv-map-point\",\n radius: 7,\n fillColor: \"#e11d48\",\n color: \"#ffffff\",\n weight: 2.5,\n opacity: 1,\n fillOpacity: 0.9\n });\n },\n onEachFeature: (feature: any, layer: any) => {\n const label = feature.properties?.name || feature.properties?.title || feature.properties?.label;\n if (label) {\n layer.bindTooltip?.(String(label), {\n className: \"ofv-map-tooltip\",\n direction: \"top\",\n sticky: true\n });\n }\n layer.on?.({\n mouseover(event: any) {\n event.target?.setStyle?.({\n weight: 4,\n opacity: 1,\n fillOpacity: 0.4\n });\n event.target?.bringToFront?.();\n },\n mouseout(event: any) {\n geojsonLayer.resetStyle?.(event.target);\n }\n });\n if (feature.properties) {\n const props = feature.properties;\n const keys = Object.keys(props);\n if (keys.length > 0) {\n const popupContent = document.createElement(\"div\");\n popupContent.className = \"ofv-map-popup\";\n\n const popupTitle = document.createElement(\"h4\");\n popupTitle.textContent = \"属性信息\";\n popupContent.appendChild(popupTitle);\n\n const table = document.createElement(\"table\");\n table.className = \"ofv-map-popup-table\";\n\n for (const key of keys) {\n const val = props[key];\n if (val === null || val === undefined) continue;\n\n const row = document.createElement(\"tr\");\n const cellKey = document.createElement(\"td\");\n cellKey.className = \"ofv-map-popup-key\";\n cellKey.textContent = key;\n\n const cellVal = document.createElement(\"td\");\n cellVal.className = \"ofv-map-popup-val\";\n cellVal.textContent = typeof val === \"object\" ? JSON.stringify(val) : String(val);\n\n row.append(cellKey, cellVal);\n table.appendChild(row);\n }\n\n popupContent.appendChild(table);\n layer.bindPopup(popupContent);\n }\n }\n }\n }).addTo(map);\n\n // Zoom map to dataset bounds\n try {\n const bounds = geojsonLayer.getBounds();\n if (bounds.isValid()) {\n map.fitBounds(bounds, { padding: [20, 20] });\n map.invalidateSize();\n }\n } catch (e) {\n console.warn(\"Could not fit bounds for GeoJSON data:\", e);\n }\n\n const resizeTimers = [0, 80, 240].map((delay) => window.setTimeout(() => {\n map.invalidateSize();\n }, delay));\n\n return {\n resize() {\n map.invalidateSize();\n },\n destroy() {\n resizeTimers.forEach((timer) => window.clearTimeout(timer));\n map.remove();\n wrapper.remove();\n }\n };\n }\n };\n}\n\nfunction createGisFallback(titleText: string, detailText: string): HTMLElement {\n const fallback = document.createElement(\"div\");\n fallback.className = \"ofv-fallback\";\n const title = document.createElement(\"strong\");\n title.textContent = titleText;\n const detail = document.createElement(\"span\");\n detail.textContent = detailText;\n fallback.append(title, detail);\n return fallback;\n}\n\nfunction normalizeGisError(error: unknown, fileName: string): string {\n const message = error instanceof Error ? error.message : String(error || \"\");\n return message ? `${fileName}: ${message}` : `${fileName}: 文件内容无法转换为地图数据。`;\n}\n\nfunction isGisFallback(value: unknown): value is { fallback: HTMLElement } {\n return typeof value === \"object\" && value !== null && \"fallback\" in value;\n}\n\ntype GisSummary = {\n features: number;\n geometryCounts: Map<string, number>;\n propertyKeys: Set<string>;\n bounds?: [number, number, number, number];\n};\n\nfunction createGisSummary(summary: GisSummary): HTMLElement {\n const bar = document.createElement(\"div\");\n bar.className = \"ofv-gis-summary\";\n appendSummaryItem(bar, \"要素\", String(summary.features));\n appendSummaryItem(bar, \"几何\", formatGeometryCounts(summary.geometryCounts));\n appendSummaryItem(bar, \"属性字段\", String(summary.propertyKeys.size));\n if (summary.propertyKeys.size > 0) {\n appendSummaryItem(bar, \"字段预览\", [...summary.propertyKeys].slice(0, 8).join(\", \"));\n }\n if (summary.bounds) {\n appendSummaryItem(bar, \"范围\", formatBounds(summary.bounds));\n }\n return bar;\n}\n\nfunction createEmptyMapState(): HTMLElement {\n const empty = document.createElement(\"div\");\n empty.className = \"ofv-map-empty\";\n const title = document.createElement(\"strong\");\n title.textContent = \"暂无可展示的地图要素\";\n const detail = document.createElement(\"span\");\n detail.textContent = \"GeoJSON 已识别,但 features 为空。\";\n empty.append(title, detail);\n return empty;\n}\n\nfunction createMapLegend(summary: GisSummary): HTMLElement {\n const legend = document.createElement(\"div\");\n legend.className = \"ofv-map-legend\";\n const title = document.createElement(\"strong\");\n title.textContent = \"GeoJSON\";\n const detail = document.createElement(\"span\");\n detail.textContent = `${summary.features} 个要素 · ${formatGeometryCounts(summary.geometryCounts)}`;\n legend.append(title, detail);\n return legend;\n}\n\nfunction appendSummaryItem(parent: HTMLElement, label: string, value: string): void {\n const item = document.createElement(\"span\");\n const key = document.createElement(\"span\");\n key.textContent = label;\n const content = document.createElement(\"strong\");\n content.textContent = value;\n item.append(key, content);\n parent.append(item);\n}\n\nfunction summarizeGeoJson(geojson: any): GisSummary {\n const summary: GisSummary = {\n features: 0,\n geometryCounts: new Map(),\n propertyKeys: new Set()\n };\n for (const feature of collectFeatures(geojson)) {\n summary.features++;\n if (feature.properties && typeof feature.properties === \"object\") {\n Object.keys(feature.properties).forEach((key) => summary.propertyKeys.add(key));\n }\n summarizeGeometry(feature.geometry, summary);\n }\n return summary;\n}\n\nfunction collectFeatures(value: any): any[] {\n if (!value) {\n return [];\n }\n if (value.type === \"FeatureCollection\" && Array.isArray(value.features)) {\n return value.features;\n }\n if (value.type === \"Feature\") {\n return [value];\n }\n if (value.type && value.coordinates) {\n return [{ type: \"Feature\", properties: {}, geometry: value }];\n }\n return [];\n}\n\nfunction summarizeGeometry(geometry: any, summary: GisSummary): void {\n if (!geometry) {\n summary.geometryCounts.set(\"None\", (summary.geometryCounts.get(\"None\") || 0) + 1);\n return;\n }\n const type = String(geometry.type || \"Unknown\");\n summary.geometryCounts.set(type, (summary.geometryCounts.get(type) || 0) + 1);\n if (type === \"GeometryCollection\" && Array.isArray(geometry.geometries)) {\n for (const child of geometry.geometries) {\n summarizeGeometry(child, summary);\n }\n return;\n }\n updateBounds(summary, geometry.coordinates);\n}\n\nfunction updateBounds(summary: GisSummary, coordinates: unknown): void {\n if (!Array.isArray(coordinates)) {\n return;\n }\n if (typeof coordinates[0] === \"number\" && typeof coordinates[1] === \"number\") {\n const lon = coordinates[0];\n const lat = coordinates[1];\n if (!Number.isFinite(lon) || !Number.isFinite(lat)) {\n return;\n }\n const bounds = summary.bounds || [lon, lat, lon, lat];\n bounds[0] = Math.min(bounds[0], lon);\n bounds[1] = Math.min(bounds[1], lat);\n bounds[2] = Math.max(bounds[2], lon);\n bounds[3] = Math.max(bounds[3], lat);\n summary.bounds = bounds;\n return;\n }\n for (const item of coordinates) {\n updateBounds(summary, item);\n }\n}\n\nfunction formatGeometryCounts(counts: Map<string, number>): string {\n return [...counts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 5)\n .map(([type, count]) => `${type} ${count}`)\n .join(\", \") || \"无\";\n}\n\nfunction formatBounds(bounds: [number, number, number, number]): string {\n return bounds.map((value) => Number(value.toFixed(5))).join(\", \");\n}\n\nasync function parseToGeoJson(\n file: PreviewFile,\n buffer: ArrayBuffer,\n togeojsonLib: any,\n topojsonClient: any,\n shpLib: any,\n JSZipLib: any\n): Promise<any> {\n const ext = resolveFormat(file, gisMimeFormatMap).toLowerCase();\n\n if (ext === \"geojson\") {\n const text = new TextDecoder().decode(buffer);\n return JSON.parse(text);\n }\n\n if (ext === \"topojson\") {\n const text = new TextDecoder().decode(buffer);\n const topology = JSON.parse(text);\n const geojsonFeatures: any[] = [];\n for (const key of Object.keys(topology.objects)) {\n const feature = topojsonClient.feature(topology, topology.objects[key]);\n if (feature.type === \"FeatureCollection\") {\n geojsonFeatures.push(...feature.features);\n } else {\n geojsonFeatures.push(feature);\n }\n }\n return {\n type: \"FeatureCollection\",\n features: geojsonFeatures\n };\n }\n\n if (ext === \"kml\") {\n const text = new TextDecoder().decode(buffer);\n const dom = new DOMParser().parseFromString(text, \"text/xml\");\n return togeojsonLib.kml(dom);\n }\n\n if (ext === \"gpx\") {\n const text = new TextDecoder().decode(buffer);\n const dom = new DOMParser().parseFromString(text, \"text/xml\");\n return togeojsonLib.gpx(dom);\n }\n\n if (ext === \"kmz\") {\n const zip = await JSZipLib.loadAsync(buffer);\n const kmlFile: any = Object.values(zip.files).find((f: any) => f.name.toLowerCase().endsWith(\".kml\"));\n if (!kmlFile) {\n throw new Error(\"No KML file found inside KMZ archive.\");\n }\n const kmlText = await kmlFile.async(\"text\");\n const dom = new DOMParser().parseFromString(kmlText, \"text/xml\");\n return togeojsonLib.kml(dom);\n }\n\n if (ext === \"shp\") {\n const u8 = new Uint8Array(buffer);\n const isZip = u8[0] === 0x50 && u8[1] === 0x4b && u8[2] === 0x03 && u8[3] === 0x04;\n if (!isZip) {\n return null; // Signals raw shapefile\n }\n const parsed = await shpLib(buffer);\n if (Array.isArray(parsed)) {\n const features: any[] = [];\n for (const item of parsed) {\n if (item.type === \"FeatureCollection\") {\n features.push(...item.features);\n } else if (item.type === \"Feature\") {\n features.push(item);\n }\n }\n return {\n type: \"FeatureCollection\",\n features\n };\n }\n return parsed;\n }\n\n // Mime type match fallback\n try {\n const text = new TextDecoder().decode(buffer);\n return JSON.parse(text);\n } catch {\n throw new Error(`Unsupported GIS format: ${ext}`);\n }\n}\n","import { createObjectUrl, revokeObjectUrl } from \"../dom\";\nimport type { PreviewPlugin } from \"../types\";\nimport { appendMeta, createPanel, createSection, readArrayBuffer, resolveFormat } from \"./utils\";\n\nconst assetExtensions = new Set([\n \"ttf\",\n \"otf\",\n \"woff\",\n \"woff2\",\n \"eot\",\n \"psd\",\n \"psb\",\n \"ai\",\n \"eps\",\n \"ps\",\n \"webarchive\",\n \"sqlite\",\n \"sqlite3\",\n \"db\",\n \"wasm\",\n \"parquet\",\n \"avro\"\n]);\n\nconst assetMimeFormatMap: Record<string, string> = {\n \"font/ttf\": \"ttf\",\n \"font/otf\": \"otf\",\n \"font/woff\": \"woff\",\n \"font/woff2\": \"woff2\",\n \"application/vnd.ms-fontobject\": \"eot\",\n \"image/vnd.adobe.photoshop\": \"psd\",\n \"application/postscript\": \"ps\",\n \"application/x-webarchive\": \"webarchive\",\n \"application/vnd.sqlite3\": \"sqlite\",\n \"application/x-sqlite3\": \"sqlite\",\n \"application/wasm\": \"wasm\",\n \"application/vnd.apache.parquet\": \"parquet\",\n \"application/avro\": \"avro\"\n};\n\nconst assetMimeTypes = new Set(Object.keys(assetMimeFormatMap));\n\nexport function assetPlugin(): PreviewPlugin {\n return {\n name: \"asset\",\n match(file) {\n return assetExtensions.has(file.extension) || assetMimeTypes.has(file.mimeType);\n },\n async render(ctx) {\n const panel = createPanel(\"ofv-asset\");\n ctx.viewport.append(panel);\n const url = createObjectUrl(ctx.file);\n const isExternal = Boolean(ctx.file.url);\n const extension = resolveFormat(ctx.file, assetMimeFormatMap).toLowerCase();\n const bytes = new Uint8Array(await readArrayBuffer(ctx.file).catch(() => new ArrayBuffer(0)));\n\n const section = createSection(assetTitle(extension));\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-asset-summary\";\n appendMeta(summary, \"文件\", ctx.file.name);\n appendMeta(summary, \"格式\", extension ? `.${extension}` : ctx.file.mimeType || \"未知\");\n appendMeta(summary, \"大小\", formatBytes(ctx.file.size ?? bytes.byteLength));\n appendMeta(summary, \"签名\", byteSignature(bytes));\n\n const note = document.createElement(\"p\");\n note.textContent = assetGuidance(extension);\n\n const download = document.createElement(\"a\");\n download.className = \"ofv-asset-download\";\n download.href = url;\n download.download = ctx.file.name;\n download.textContent = \"下载文件\";\n\n section.append(summary, note, download);\n if (isFontAsset(extension)) {\n section.append(await createFontPreview(extension, url, ctx.file.name, bytes));\n }\n if (extension === \"wasm\") {\n section.append(createWasmPreview(bytes));\n }\n if (extension === \"psd\" || extension === \"psb\") {\n section.append(createPhotoshopPreview(bytes));\n }\n if (extension === \"sqlite\" || extension === \"sqlite3\" || extension === \"db\") {\n section.append(createSqlitePreview(bytes));\n }\n if (extension === \"parquet\") {\n section.append(createParquetPreview(bytes));\n }\n if (extension === \"avro\") {\n section.append(createAvroPreview(bytes));\n }\n if (extension === \"webarchive\") {\n section.append(createWebArchivePreview(bytes));\n }\n if (extension === \"ai\" || extension === \"eps\" || extension === \"ps\") {\n section.append(createPostScriptPreview(bytes));\n }\n const preview = createHexPreview(bytes);\n if (preview) {\n section.append(preview);\n }\n panel.append(section);\n\n return {\n destroy() {\n revokeObjectUrl(url, isExternal);\n panel.remove();\n }\n };\n }\n };\n}\n\nfunction assetTitle(extension: string): string {\n if (isFontAsset(extension)) {\n return \"字体文件预览\";\n }\n if ([\"psd\", \"psb\", \"ai\", \"eps\", \"ps\"].includes(extension)) {\n return \"设计文件预览\";\n }\n if ([\"sqlite\", \"sqlite3\", \"db\", \"parquet\", \"avro\"].includes(extension)) {\n return \"数据文件预览\";\n }\n if (extension === \"wasm\") {\n return \"WebAssembly 文件预览\";\n }\n if (extension === \"webarchive\") {\n return \"网页归档预览\";\n }\n return \"资产文件预览\";\n}\n\nfunction assetGuidance(extension: string): string {\n if (isFontAsset(extension)) {\n return \"字体文件已识别,当前会使用 FontFace 展示字形样张,并解析 sfnt/WOFF 表目录和 name 元信息。\";\n }\n if (extension === \"psd\" || extension === \"psb\") {\n return \"PSD/PSB 已识别,当前会解析基础画布、通道、位深和颜色模式;图层缩略图可后续接入 psd.js/WASM 或服务端转换。\";\n }\n if ([\"ai\", \"eps\", \"ps\"].includes(extension)) {\n return \"PostScript/Illustrator 文件已识别,当前会解析文档头、BoundingBox 和常见 DSC 元信息;高保真图形可后续接入 Ghostscript/Illustrator 转换。\";\n }\n if ([\"sqlite\", \"sqlite3\", \"db\"].includes(extension)) {\n return \"SQLite 数据库已识别,当前会解析数据库头和 sqlite_schema 摘要;抽样数据可后续接入 sqlite-wasm 增强。\";\n }\n if (extension === \"parquet\" || extension === \"avro\") {\n return \"列式/序列化数据文件已识别,当前会解析容器头、元信息和 schema 摘要;抽样记录可后续接入专用解析器增强。\";\n }\n if (extension === \"wasm\") {\n return \"WASM 模块已识别,当前会解析版本、section 分布、imports、exports 和自定义 section 摘要。\";\n }\n if (extension === \"webarchive\") {\n return \"WebArchive 已识别,当前会解析 XML plist 主资源、MIME、编码和子资源数量;完整网页还原可后续接入资源包转换。\";\n }\n return \"该资产文件已识别,当前提供文件指纹和下载入口,后续可接入专用解析器增强。\";\n}\n\nfunction isFontAsset(extension: string): boolean {\n return [\"ttf\", \"otf\", \"woff\", \"woff2\", \"eot\"].includes(extension);\n}\n\nasync function createFontPreview(extension: string, url: string, fileName: string, bytes: Uint8Array): Promise<HTMLElement> {\n const preview = document.createElement(\"div\");\n preview.className = \"ofv-font-preview\";\n\n const heading = document.createElement(\"strong\");\n heading.textContent = \"字体样张\";\n\n const sample = document.createElement(\"div\");\n sample.className = \"ofv-font-sample\";\n sample.textContent = \"Open File Viewer 预览 1234567890\";\n\n const pangram = document.createElement(\"div\");\n pangram.className = \"ofv-font-pangram\";\n pangram.textContent = \"The quick brown fox jumps over the lazy dog.\";\n\n const meta = document.createElement(\"span\");\n meta.className = \"ofv-font-status\";\n\n preview.append(heading, sample, pangram, meta);\n\n if (!(\"FontFace\" in window) || !document.fonts) {\n meta.textContent = \"当前浏览器不支持 FontFace API,无法生成实时字形样张。\";\n preview.append(createFontInfoPreview(bytes, extension));\n return preview;\n }\n\n const family = `ofv-${fileName.replace(/[^a-z0-9_-]/gi, \"-\")}-${Date.now()}`;\n const format = fontFaceFormat(extension);\n const source = format ? `url(\"${url}\") format(\"${format}\")` : `url(\"${url}\")`;\n\n try {\n const fontFace = new FontFace(family, source);\n const loaded = await fontFace.load();\n document.fonts.add(loaded);\n sample.style.fontFamily = `\"${family}\", sans-serif`;\n pangram.style.fontFamily = `\"${family}\", sans-serif`;\n meta.textContent = \"已使用浏览器 FontFace API 加载字体样张。\";\n } catch (error) {\n meta.textContent = `字体样张加载失败:${error instanceof Error ? error.message : \"当前字体编码暂不受浏览器支持。\"}`;\n }\n\n preview.append(createFontInfoPreview(bytes, extension));\n return preview;\n}\n\nfunction fontFaceFormat(extension: string): string {\n const map: Record<string, string> = {\n ttf: \"truetype\",\n otf: \"opentype\",\n woff: \"woff\",\n woff2: \"woff2\",\n eot: \"embedded-opentype\"\n };\n return map[extension] || \"\";\n}\n\ntype FontTableEntry = {\n tag: string;\n checksum?: number;\n offset: number;\n length: number;\n compressedLength?: number;\n};\n\ntype FontNameRecord = {\n id: number;\n label: string;\n value: string;\n};\n\ntype FontContainerMeta = {\n label: string;\n value: string | number;\n};\n\ntype FontInfo = {\n valid: boolean;\n error?: string;\n container?: string;\n flavor?: string;\n tables: FontTableEntry[];\n names: FontNameRecord[];\n totalSfntSize?: number;\n meta?: FontContainerMeta[];\n};\n\nfunction createFontInfoPreview(bytes: Uint8Array, extension: string): HTMLElement {\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-font-info\";\n\n const heading = document.createElement(\"strong\");\n heading.textContent = \"字体结构\";\n wrapper.append(heading);\n\n const parsed = parseFontInfo(bytes, extension);\n if (!parsed.valid) {\n const error = document.createElement(\"p\");\n error.className = \"ofv-data-error\";\n error.textContent = parsed.error || \"无法解析字体结构。\";\n wrapper.append(error);\n return wrapper;\n }\n\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-data-summary\";\n appendMeta(summary, \"容器\", parsed.container || \"sfnt\");\n appendMeta(summary, \"Flavor\", parsed.flavor || \"未知\");\n appendMeta(summary, \"表数量\", parsed.tables.length);\n if (parsed.totalSfntSize !== undefined) {\n appendMeta(summary, \"展开大小\", formatBytes(parsed.totalSfntSize));\n }\n for (const item of parsed.meta || []) {\n appendMeta(summary, item.label, item.value);\n }\n wrapper.append(summary);\n\n if (parsed.error) {\n const note = document.createElement(\"p\");\n note.className = \"ofv-data-note\";\n note.textContent = parsed.error;\n wrapper.append(note);\n }\n\n if (parsed.names.length > 0) {\n wrapper.append(createKeyValueTable(\"Name\", parsed.names.map((item) => ({ key: item.label, value: item.value }))));\n }\n\n if (parsed.tables.length > 0) {\n wrapper.append(createFontTablePreview(parsed.tables));\n }\n return wrapper;\n}\n\nfunction createFontTablePreview(tables: FontTableEntry[]): HTMLElement {\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-font-tables\";\n const title = document.createElement(\"strong\");\n title.textContent = \"Tables\";\n\n const table = document.createElement(\"table\");\n const thead = document.createElement(\"thead\");\n const headRow = document.createElement(\"tr\");\n for (const label of [\"Tag\", \"Offset\", \"Length\", \"Compressed\", \"Checksum\"]) {\n const th = document.createElement(\"th\");\n th.textContent = label;\n headRow.append(th);\n }\n thead.append(headRow);\n\n const tbody = document.createElement(\"tbody\");\n for (const entry of tables.slice(0, 80)) {\n const row = document.createElement(\"tr\");\n for (const value of [\n entry.tag,\n `0x${entry.offset.toString(16).toUpperCase()}`,\n formatBytes(entry.length),\n entry.compressedLength === undefined ? \"-\" : formatBytes(entry.compressedLength),\n entry.checksum === undefined ? \"-\" : `0x${entry.checksum.toString(16).padStart(8, \"0\").toUpperCase()}`\n ]) {\n const cell = document.createElement(\"td\");\n cell.textContent = value;\n row.append(cell);\n }\n tbody.append(row);\n }\n table.append(thead, tbody);\n wrapper.append(title, table);\n return wrapper;\n}\n\nfunction parseFontInfo(bytes: Uint8Array, extension: string): FontInfo {\n if (bytes.length < 4) {\n return { valid: false, error: \"文件太短,无法读取字体头。\", tables: [], names: [] };\n }\n const signature = asciiAt(bytes, 0, 4);\n if (signature === \"wOFF\") {\n return parseWoffFont(bytes);\n }\n if (signature === \"wOF2\") {\n return parseWoff2Font(bytes);\n }\n if (extension === \"eot\") {\n return parseEotFont(bytes);\n }\n return parseSfntFont(bytes, 0, \"sfnt\");\n}\n\nfunction parseSfntFont(bytes: Uint8Array, offset: number, container: string): FontInfo {\n if (offset + 12 > bytes.length) {\n return { valid: false, error: \"文件太短,无法读取 sfnt offset table。\", tables: [], names: [] };\n }\n const flavor = fontFlavor(bytes, offset);\n if (!flavor) {\n return { valid: false, error: \"缺少有效的 TrueType/OpenType sfnt 头。\", tables: [], names: [] };\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const tableCount = view.getUint16(offset + 4, false);\n const directoryEnd = offset + 12 + tableCount * 16;\n if (tableCount <= 0 || directoryEnd > bytes.length) {\n return { valid: false, error: \"sfnt 表目录超出文件边界。\", tables: [], names: [] };\n }\n const tables: FontTableEntry[] = [];\n for (let index = 0; index < tableCount; index++) {\n const entryOffset = offset + 12 + index * 16;\n tables.push({\n tag: asciiAt(bytes, entryOffset, 4),\n checksum: view.getUint32(entryOffset + 4, false),\n offset: view.getUint32(entryOffset + 8, false),\n length: view.getUint32(entryOffset + 12, false)\n });\n }\n return {\n valid: true,\n container,\n flavor,\n tables,\n names: parseFontNameTable(bytes, tables.find((table) => table.tag === \"name\"))\n };\n}\n\nfunction parseWoffFont(bytes: Uint8Array): FontInfo {\n if (bytes.length < 44) {\n return { valid: false, error: \"文件太短,无法读取 WOFF 头。\", tables: [], names: [] };\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const tableCount = view.getUint16(12, false);\n const directoryEnd = 44 + tableCount * 20;\n if (tableCount <= 0 || directoryEnd > bytes.length) {\n return { valid: false, error: \"WOFF 表目录超出文件边界。\", tables: [], names: [] };\n }\n const tables: FontTableEntry[] = [];\n for (let index = 0; index < tableCount; index++) {\n const entryOffset = 44 + index * 20;\n tables.push({\n tag: asciiAt(bytes, entryOffset, 4),\n offset: view.getUint32(entryOffset + 4, false),\n compressedLength: view.getUint32(entryOffset + 8, false),\n length: view.getUint32(entryOffset + 12, false),\n checksum: view.getUint32(entryOffset + 16, false)\n });\n }\n return {\n valid: true,\n container: \"WOFF\",\n flavor: fontFlavor(bytes, 4) || asciiAt(bytes, 4, 4),\n tables,\n names: parseFontNameTable(bytes, tables.find((table) => table.tag === \"name\" && table.compressedLength === table.length)),\n totalSfntSize: view.getUint32(16, false)\n };\n}\n\nfunction parseWoff2Font(bytes: Uint8Array): FontInfo {\n if (bytes.length < 48) {\n return { valid: false, error: \"文件太短,无法读取 WOFF2 头。\", tables: [], names: [] };\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const tableCount = view.getUint16(12, false);\n let offset = 48;\n const tables: FontTableEntry[] = [];\n for (let index = 0; index < tableCount; index++) {\n if (offset >= bytes.length) {\n return { valid: false, error: \"WOFF2 表目录超出文件边界。\", tables: [], names: [] };\n }\n const flags = bytes[offset++];\n const knownTag = flags & 0x3f;\n let tag = woff2KnownTableTag(knownTag);\n if (knownTag === 0x3f) {\n if (offset + 4 > bytes.length) {\n return { valid: false, error: \"WOFF2 自定义表 tag 超出文件边界。\", tables: [], names: [] };\n }\n tag = asciiAt(bytes, offset, 4);\n offset += 4;\n }\n const originalLength = read255UInt16(bytes, offset);\n if (!originalLength) {\n return { valid: false, error: \"WOFF2 表目录长度字段不完整。\", tables: [], names: [] };\n }\n offset = originalLength.offset;\n let transformedLength: number | undefined;\n const hasTransform = (flags & 0xc0) !== 0 || (tag === \"glyf\" && (flags & 0xc0) !== 0) || (tag === \"loca\" && (flags & 0xc0) !== 0);\n if (hasTransform && tag !== \"loca\") {\n const transformed = read255UInt16(bytes, offset);\n if (!transformed) {\n return { valid: false, error: \"WOFF2 transformLength 字段不完整。\", tables: [], names: [] };\n }\n transformedLength = transformed.value;\n offset = transformed.offset;\n }\n tables.push({\n tag,\n offset: 0,\n length: originalLength.value,\n compressedLength: transformedLength\n });\n }\n return {\n valid: true,\n container: \"WOFF2\",\n flavor: fontFlavor(bytes, 4) || asciiAt(bytes, 4, 4),\n tables,\n names: [],\n totalSfntSize: view.getUint32(16, false),\n meta: [\n { label: \"压缩数据\", value: formatBytes(view.getUint32(20, false)) },\n { label: \"Meta\", value: view.getUint32(32, false) > 0 ? `${formatBytes(view.getUint32(36, false))} @ 0x${view.getUint32(32, false).toString(16).toUpperCase()}` : \"无\" },\n { label: \"Private\", value: view.getUint32(40, false) > 0 ? `${formatBytes(view.getUint32(44, false))} @ 0x${view.getUint32(40, false).toString(16).toUpperCase()}` : \"无\" }\n ],\n error: \"WOFF2 已解析容器头和压缩表目录;name 表内容需 Brotli 解压后才能展开。\"\n };\n}\n\nfunction parseEotFont(bytes: Uint8Array): FontInfo {\n if (bytes.length < 82) {\n return { valid: false, error: \"文件太短,无法读取 EOT 头。\", tables: [], names: [] };\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const eotSize = view.getUint32(0, true);\n const fontDataSize = view.getUint32(4, true);\n const version = view.getUint32(8, true);\n const flags = view.getUint32(12, true);\n const panose = Array.from(bytes.slice(16, 26)).map((item) => item.toString(16).padStart(2, \"0\")).join(\" \");\n const charset = bytes[26];\n const italic = bytes[27];\n const weight = view.getUint32(28, true);\n let offset = 68;\n const names: FontNameRecord[] = [];\n const fields: Array<{ id: number; label: string; padded: boolean }> = [\n { id: 1, label: \"Family\", padded: true },\n { id: 2, label: \"Subfamily\", padded: true },\n { id: 5, label: \"Version\", padded: true },\n { id: 4, label: \"Full name\", padded: true },\n { id: 0, label: \"Root strings\", padded: false }\n ];\n for (const field of fields) {\n const fieldValue = readEotStringField(bytes, offset, field.padded);\n if (!fieldValue) {\n break;\n }\n offset = fieldValue.offset;\n if (field.id > 0 && fieldValue.value) {\n names.push({ id: field.id, label: field.label, value: fieldValue.value });\n }\n }\n if (offset + 4 <= bytes.length) {\n offset += 4;\n }\n const sfntOffset = findEmbeddedSfntOffset(bytes, offset);\n const embedded = sfntOffset === undefined ? undefined : parseSfntFont(bytes, sfntOffset, \"EOT embedded sfnt\");\n return {\n valid: true,\n container: \"EOT\",\n flavor: embedded?.valid ? embedded.flavor : \"Embedded OpenType\",\n tables: embedded?.valid ? embedded.tables : [],\n names: embedded?.valid && embedded.names.length > 0 ? embedded.names : names,\n totalSfntSize: fontDataSize || undefined,\n meta: [\n { label: \"EOT 大小\", value: eotSize ? formatBytes(eotSize) : \"未声明\" },\n { label: \"版本\", value: `0x${version.toString(16).toUpperCase()}` },\n { label: \"Flags\", value: `0x${flags.toString(16).toUpperCase()}` },\n { label: \"Weight\", value: weight || \"未声明\" },\n { label: \"Italic\", value: italic ? \"是\" : \"否\" },\n { label: \"Charset\", value: charset },\n { label: \"PANOSE\", value: panose },\n { label: \"sfnt 偏移\", value: sfntOffset === undefined ? \"未找到\" : `0x${sfntOffset.toString(16).toUpperCase()}` }\n ],\n error: embedded?.valid ? undefined : \"已解析 EOT 容器头和名称字段,但未找到可展开的内嵌 sfnt 表目录。\"\n };\n}\n\nfunction readEotStringField(bytes: Uint8Array, offset: number, padded: boolean): { value: string; offset: number } | undefined {\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n if (padded) {\n if (offset + 2 > bytes.length) {\n return undefined;\n }\n offset += 2;\n }\n if (offset + 2 > bytes.length) {\n return undefined;\n }\n const length = view.getUint16(offset, true);\n offset += 2;\n if (offset + length > bytes.length) {\n return undefined;\n }\n const value = length > 0 ? decodeEotString(bytes.slice(offset, offset + length)) : \"\";\n return { value, offset: offset + length };\n}\n\nfunction woff2KnownTableTag(index: number): string {\n const tags = [\n \"cmap\",\n \"head\",\n \"hhea\",\n \"hmtx\",\n \"maxp\",\n \"name\",\n \"OS/2\",\n \"post\",\n \"cvt \",\n \"fpgm\",\n \"glyf\",\n \"loca\",\n \"prep\",\n \"CFF \",\n \"VORG\",\n \"EBDT\",\n \"EBLC\",\n \"gasp\",\n \"hdmx\",\n \"kern\",\n \"LTSH\",\n \"PCLT\",\n \"VDMX\",\n \"vhea\",\n \"vmtx\",\n \"BASE\",\n \"GDEF\",\n \"GPOS\",\n \"GSUB\",\n \"EBSC\",\n \"JSTF\",\n \"MATH\",\n \"CBDT\",\n \"CBLC\",\n \"COLR\",\n \"CPAL\",\n \"SVG \",\n \"sbix\",\n \"acnt\",\n \"avar\",\n \"bdat\",\n \"bloc\",\n \"bsln\",\n \"cvar\",\n \"fdsc\",\n \"feat\",\n \"fmtx\",\n \"fvar\",\n \"gvar\",\n \"hsty\",\n \"just\",\n \"lcar\",\n \"mort\",\n \"morx\",\n \"opbd\",\n \"prop\",\n \"trak\",\n \"Zapf\",\n \"Silf\",\n \"Glat\",\n \"Gloc\",\n \"Feat\",\n \"Sill\"\n ];\n return tags[index] || `table-${index}`;\n}\n\nfunction read255UInt16(bytes: Uint8Array, offset: number): { value: number; offset: number } | undefined {\n if (offset >= bytes.length) {\n return undefined;\n }\n const code = bytes[offset++];\n if (code === 253) {\n if (offset + 2 > bytes.length) {\n return undefined;\n }\n return { value: (bytes[offset] << 8) | bytes[offset + 1], offset: offset + 2 };\n }\n if (code === 254) {\n if (offset >= bytes.length) {\n return undefined;\n }\n return { value: bytes[offset] + 506, offset: offset + 1 };\n }\n if (code === 255) {\n if (offset >= bytes.length) {\n return undefined;\n }\n return { value: bytes[offset] + 253, offset: offset + 1 };\n }\n return { value: code, offset };\n}\n\nfunction decodeEotString(bytes: Uint8Array): string {\n const text = decodeUtf16Le(bytes).replace(/\\0+$/g, \"\").trim();\n return text || new TextDecoder(\"latin1\").decode(bytes).replace(/\\0+$/g, \"\").trim();\n}\n\nfunction decodeUtf16Le(bytes: Uint8Array): string {\n let value = \"\";\n for (let index = 0; index + 1 < bytes.length; index += 2) {\n value += String.fromCharCode(bytes[index] | (bytes[index + 1] << 8));\n }\n return value;\n}\n\nfunction findEmbeddedSfntOffset(bytes: Uint8Array, start: number): number | undefined {\n for (let offset = Math.max(0, start); offset + 12 <= bytes.length; offset++) {\n const flavor = fontFlavor(bytes, offset);\n if (!flavor) {\n continue;\n }\n const tableCount = (bytes[offset + 4] << 8) | bytes[offset + 5];\n const directoryEnd = offset + 12 + tableCount * 16;\n if (tableCount > 0 && directoryEnd <= bytes.length) {\n return offset;\n }\n }\n return undefined;\n}\n\nfunction fontFlavor(bytes: Uint8Array, offset: number): string | undefined {\n if (offset + 4 > bytes.length) {\n return undefined;\n }\n const ascii = asciiAt(bytes, offset, 4);\n if (ascii === \"OTTO\") {\n return \"OpenType/CFF\";\n }\n if (ascii === \"true\") {\n return \"Apple TrueType\";\n }\n if (ascii === \"typ1\") {\n return \"Type 1 sfnt\";\n }\n if (bytes[offset] === 0x00 && bytes[offset + 1] === 0x01 && bytes[offset + 2] === 0x00 && bytes[offset + 3] === 0x00) {\n return \"TrueType\";\n }\n return undefined;\n}\n\nfunction parseFontNameTable(bytes: Uint8Array, table?: FontTableEntry): FontNameRecord[] {\n if (!table || table.offset + table.length > bytes.length || table.length < 6) {\n return [];\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const offset = table.offset;\n const count = view.getUint16(offset + 2, false);\n const storageOffset = view.getUint16(offset + 4, false);\n const recordsEnd = offset + 6 + count * 12;\n if (recordsEnd > bytes.length || storageOffset > table.length) {\n return [];\n }\n const wanted = new Map<number, string>([\n [1, \"Family\"],\n [2, \"Subfamily\"],\n [4, \"Full name\"],\n [5, \"Version\"],\n [6, \"PostScript name\"],\n [8, \"Manufacturer\"],\n [13, \"License\"],\n [16, \"Typographic family\"],\n [17, \"Typographic subfamily\"]\n ]);\n const names = new Map<number, FontNameRecord>();\n for (let index = 0; index < count; index++) {\n const recordOffset = offset + 6 + index * 12;\n const platformId = view.getUint16(recordOffset, false);\n const encodingId = view.getUint16(recordOffset + 2, false);\n const languageId = view.getUint16(recordOffset + 4, false);\n const nameId = view.getUint16(recordOffset + 6, false);\n const length = view.getUint16(recordOffset + 8, false);\n const stringOffset = view.getUint16(recordOffset + 10, false);\n const label = wanted.get(nameId);\n if (!label || names.has(nameId)) {\n continue;\n }\n const start = offset + storageOffset + stringOffset;\n const end = start + length;\n if (end > bytes.length || end > offset + table.length) {\n continue;\n }\n const value = decodeFontName(bytes.slice(start, end), platformId, encodingId).trim();\n if (value) {\n names.set(nameId, { id: nameId, label: languageId ? `${label} (${languageId.toString(16).toUpperCase()})` : label, value });\n }\n }\n return [...names.values()];\n}\n\nfunction decodeFontName(bytes: Uint8Array, platformId: number, encodingId: number): string {\n if (platformId === 0 || platformId === 3 || (platformId === 2 && encodingId === 1)) {\n return decodeUtf16Be(bytes);\n }\n return new TextDecoder(\"latin1\").decode(bytes);\n}\n\nfunction decodeUtf16Be(bytes: Uint8Array): string {\n let value = \"\";\n for (let index = 0; index + 1 < bytes.length; index += 2) {\n value += String.fromCharCode((bytes[index] << 8) | bytes[index + 1]);\n }\n return value;\n}\n\ntype WasmSection = {\n id: number;\n name: string;\n size: number;\n offset: number;\n customName?: string;\n};\n\ntype WasmImport = {\n module: string;\n name: string;\n kind: string;\n};\n\ntype WasmExport = {\n name: string;\n kind: string;\n index: number;\n};\n\ntype WasmPreview = {\n valid: boolean;\n version?: number;\n error?: string;\n sections: WasmSection[];\n imports: WasmImport[];\n exports: WasmExport[];\n};\n\nfunction createWasmPreview(bytes: Uint8Array): HTMLElement {\n const preview = document.createElement(\"div\");\n preview.className = \"ofv-wasm-preview\";\n const parsed = parseWasm(bytes);\n\n const heading = document.createElement(\"strong\");\n heading.textContent = \"WASM 结构\";\n preview.append(heading);\n\n if (!parsed.valid) {\n const error = document.createElement(\"p\");\n error.className = \"ofv-wasm-error\";\n error.textContent = parsed.error || \"不是有效的 WebAssembly 二进制模块。\";\n preview.append(error);\n return preview;\n }\n\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-wasm-summary\";\n appendMeta(summary, \"版本\", parsed.version ?? \"未知\");\n appendMeta(summary, \"Sections\", parsed.sections.length);\n appendMeta(summary, \"Imports\", parsed.imports.length);\n appendMeta(summary, \"Exports\", parsed.exports.length);\n preview.append(summary);\n\n preview.append(createWasmSectionTable(parsed.sections));\n if (parsed.imports.length > 0) {\n preview.append(createWasmList(\"导入\", parsed.imports.map((item) => `${item.module}.${item.name} · ${item.kind}`)));\n }\n if (parsed.exports.length > 0) {\n preview.append(createWasmList(\"导出\", parsed.exports.map((item) => `${item.name} · ${item.kind} #${item.index}`)));\n }\n\n return preview;\n}\n\nfunction createWasmSectionTable(sections: WasmSection[]): HTMLElement {\n const table = document.createElement(\"table\");\n table.className = \"ofv-wasm-sections\";\n const thead = document.createElement(\"thead\");\n const header = document.createElement(\"tr\");\n for (const label of [\"Section\", \"大小\", \"偏移\"]) {\n const th = document.createElement(\"th\");\n th.textContent = label;\n header.append(th);\n }\n thead.append(header);\n const tbody = document.createElement(\"tbody\");\n for (const section of sections.slice(0, 80)) {\n const row = document.createElement(\"tr\");\n const name = document.createElement(\"td\");\n name.textContent = section.customName ? `${section.name} (${section.customName})` : section.name;\n const size = document.createElement(\"td\");\n size.textContent = formatBytes(section.size);\n const offset = document.createElement(\"td\");\n offset.textContent = `0x${section.offset.toString(16).toUpperCase()}`;\n row.append(name, size, offset);\n tbody.append(row);\n }\n table.append(thead, tbody);\n return table;\n}\n\nfunction createWasmList(titleText: string, rows: string[]): HTMLElement {\n const details = document.createElement(\"details\");\n details.className = \"ofv-details ofv-wasm-list\";\n details.open = true;\n const summary = document.createElement(\"summary\");\n summary.textContent = `${titleText} ${rows.length}`;\n const list = document.createElement(\"ul\");\n for (const row of rows.slice(0, 120)) {\n const item = document.createElement(\"li\");\n item.textContent = row;\n list.append(item);\n }\n if (rows.length > 120) {\n const item = document.createElement(\"li\");\n item.textContent = `还有 ${rows.length - 120} 项未展示。`;\n list.append(item);\n }\n details.append(summary, list);\n return details;\n}\n\nfunction parseWasm(bytes: Uint8Array): WasmPreview {\n if (bytes.length < 8 || bytes[0] !== 0x00 || bytes[1] !== 0x61 || bytes[2] !== 0x73 || bytes[3] !== 0x6d) {\n return { valid: false, error: \"缺少 WebAssembly magic header。\", sections: [], imports: [], exports: [] };\n }\n\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const version = view.getUint32(4, true);\n const sections: WasmSection[] = [];\n const imports: WasmImport[] = [];\n const exports: WasmExport[] = [];\n let offset = 8;\n\n try {\n while (offset < bytes.length) {\n const sectionOffset = offset;\n const id = bytes[offset++];\n const sizeInfo = readVarUint(bytes, offset);\n offset = sizeInfo.offset;\n const payloadOffset = offset;\n const payloadEnd = payloadOffset + sizeInfo.value;\n if (payloadEnd > bytes.length) {\n throw new Error(\"section 长度超过文件边界。\");\n }\n\n const section: WasmSection = {\n id,\n name: wasmSectionName(id),\n size: sizeInfo.value,\n offset: sectionOffset\n };\n if (id === 0) {\n const customName = readWasmName(bytes, payloadOffset, payloadEnd);\n section.customName = customName.value || undefined;\n } else if (id === 2) {\n imports.push(...parseWasmImports(bytes, payloadOffset, payloadEnd));\n } else if (id === 7) {\n exports.push(...parseWasmExports(bytes, payloadOffset, payloadEnd));\n }\n sections.push(section);\n offset = payloadEnd;\n }\n } catch (error) {\n return {\n valid: false,\n version,\n error: error instanceof Error ? error.message : \"WASM section 解析失败。\",\n sections,\n imports,\n exports\n };\n }\n\n return { valid: true, version, sections, imports, exports };\n}\n\nfunction parseWasmImports(bytes: Uint8Array, offset: number, end: number): WasmImport[] {\n const imports: WasmImport[] = [];\n const count = readVarUint(bytes, offset);\n offset = count.offset;\n for (let index = 0; index < count.value && offset < end; index++) {\n const moduleName = readWasmName(bytes, offset, end);\n offset = moduleName.offset;\n const importName = readWasmName(bytes, offset, end);\n offset = importName.offset;\n const kind = bytes[offset++];\n offset = skipWasmImportDescriptor(bytes, offset, end, kind);\n imports.push({ module: moduleName.value, name: importName.value, kind: wasmExternalKind(kind) });\n }\n return imports;\n}\n\nfunction parseWasmExports(bytes: Uint8Array, offset: number, end: number): WasmExport[] {\n const exports: WasmExport[] = [];\n const count = readVarUint(bytes, offset);\n offset = count.offset;\n for (let index = 0; index < count.value && offset < end; index++) {\n const exportName = readWasmName(bytes, offset, end);\n offset = exportName.offset;\n const kind = bytes[offset++];\n const itemIndex = readVarUint(bytes, offset);\n offset = itemIndex.offset;\n exports.push({ name: exportName.value, kind: wasmExternalKind(kind), index: itemIndex.value });\n }\n return exports;\n}\n\nfunction skipWasmImportDescriptor(bytes: Uint8Array, offset: number, end: number, kind: number): number {\n if (kind === 0x00) {\n return readVarUint(bytes, offset).offset;\n }\n if (kind === 0x01) {\n const elementTypeOffset = offset + 1;\n return skipWasmLimits(bytes, elementTypeOffset, end);\n }\n if (kind === 0x02) {\n return skipWasmLimits(bytes, offset, end);\n }\n if (kind === 0x03) {\n return Math.min(end, offset + 2);\n }\n return offset;\n}\n\nfunction skipWasmLimits(bytes: Uint8Array, offset: number, end: number): number {\n const flags = bytes[offset++];\n offset = readVarUint(bytes, offset).offset;\n if ((flags & 0x01) === 0x01 && offset < end) {\n offset = readVarUint(bytes, offset).offset;\n }\n return offset;\n}\n\nfunction readVarUint(bytes: Uint8Array, offset: number): { value: number; offset: number } {\n let result = 0;\n let shift = 0;\n for (let index = 0; index < 5; index++) {\n if (offset >= bytes.length) {\n throw new Error(\"LEB128 数据不完整。\");\n }\n const byte = bytes[offset++];\n result |= (byte & 0x7f) << shift;\n if ((byte & 0x80) === 0) {\n return { value: result >>> 0, offset };\n }\n shift += 7;\n }\n throw new Error(\"LEB128 数据过长。\");\n}\n\nfunction readWasmName(bytes: Uint8Array, offset: number, end: number): { value: string; offset: number } {\n const length = readVarUint(bytes, offset);\n offset = length.offset;\n const nameEnd = offset + length.value;\n if (nameEnd > end) {\n throw new Error(\"字符串长度超过 section 边界。\");\n }\n return { value: new TextDecoder().decode(bytes.slice(offset, nameEnd)), offset: nameEnd };\n}\n\nfunction wasmSectionName(id: number): string {\n const names: Record<number, string> = {\n 0: \"custom\",\n 1: \"type\",\n 2: \"import\",\n 3: \"function\",\n 4: \"table\",\n 5: \"memory\",\n 6: \"global\",\n 7: \"export\",\n 8: \"start\",\n 9: \"element\",\n 10: \"code\",\n 11: \"data\",\n 12: \"data-count\"\n };\n return names[id] || `unknown ${id}`;\n}\n\nfunction wasmExternalKind(kind: number): string {\n const names: Record<number, string> = {\n 0x00: \"function\",\n 0x01: \"table\",\n 0x02: \"memory\",\n 0x03: \"global\"\n };\n return names[kind] || `unknown ${kind}`;\n}\n\ntype PhotoshopHeader = {\n valid: boolean;\n error?: string;\n signature?: string;\n version?: number;\n channels?: number;\n width?: number;\n height?: number;\n depth?: number;\n colorMode?: number;\n};\n\nfunction createPhotoshopPreview(bytes: Uint8Array): HTMLElement {\n const preview = document.createElement(\"div\");\n preview.className = \"ofv-psd-preview\";\n const heading = document.createElement(\"strong\");\n heading.textContent = \"Photoshop 结构\";\n preview.append(heading);\n\n const header = parsePhotoshopHeader(bytes);\n if (!header.valid) {\n const error = document.createElement(\"p\");\n error.className = \"ofv-psd-error\";\n error.textContent = header.error || \"不是有效的 Photoshop 文档头。\";\n preview.append(error);\n return preview;\n }\n\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-psd-summary\";\n appendMeta(summary, \"版本\", header.version === 2 ? \"PSB 大文档\" : \"PSD\");\n appendMeta(summary, \"画布\", `${header.width} x ${header.height}px`);\n appendMeta(summary, \"通道\", header.channels ?? \"未知\");\n appendMeta(summary, \"位深\", `${header.depth ?? \"未知\"} bit`);\n appendMeta(summary, \"颜色模式\", photoshopColorMode(header.colorMode ?? -1));\n preview.append(summary);\n\n return preview;\n}\n\nfunction parsePhotoshopHeader(bytes: Uint8Array): PhotoshopHeader {\n if (bytes.length < 26) {\n return { valid: false, error: \"文件太短,无法读取 PSD/PSB 头信息。\" };\n }\n const signature = new TextDecoder(\"ascii\").decode(bytes.slice(0, 4));\n if (signature !== \"8BPS\") {\n return { valid: false, signature, error: \"缺少 8BPS Photoshop 签名。\" };\n }\n\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const version = view.getUint16(4, false);\n if (version !== 1 && version !== 2) {\n return { valid: false, signature, version, error: `未知 Photoshop 文件版本:${version}。` };\n }\n\n const reserved = bytes.slice(6, 12);\n if (reserved.some((byte) => byte !== 0)) {\n return { valid: false, signature, version, error: \"PSD/PSB 保留字段不为 0,文件头可能已损坏。\" };\n }\n\n return {\n valid: true,\n signature,\n version,\n channels: view.getUint16(12, false),\n height: view.getUint32(14, false),\n width: view.getUint32(18, false),\n depth: view.getUint16(22, false),\n colorMode: view.getUint16(24, false)\n };\n}\n\nfunction photoshopColorMode(mode: number): string {\n const modes: Record<number, string> = {\n 0: \"Bitmap\",\n 1: \"Grayscale\",\n 2: \"Indexed\",\n 3: \"RGB\",\n 4: \"CMYK\",\n 7: \"Multichannel\",\n 8: \"Duotone\",\n 9: \"Lab\"\n };\n return modes[mode] ? `${modes[mode]} (${mode})` : `未知 (${mode})`;\n}\n\ntype SqliteHeader = {\n valid: boolean;\n error?: string;\n pageSize?: number;\n writeVersion?: number;\n readVersion?: number;\n pageCount?: number;\n schemaVersion?: number;\n textEncoding?: number;\n userVersion?: number;\n};\n\ntype SqliteSchemaEntry = {\n type: string;\n name: string;\n tableName: string;\n rootPage: number;\n sql: string;\n};\n\nfunction createSqlitePreview(bytes: Uint8Array): HTMLElement {\n const preview = document.createElement(\"div\");\n preview.className = \"ofv-sqlite-preview\";\n const heading = document.createElement(\"strong\");\n heading.textContent = \"SQLite 结构\";\n preview.append(heading);\n\n const header = parseSqliteHeader(bytes);\n if (!header.valid) {\n const error = document.createElement(\"p\");\n error.className = \"ofv-sqlite-error\";\n error.textContent = header.error || \"不是有效的 SQLite 数据库文件。\";\n preview.append(error);\n return preview;\n }\n\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-sqlite-summary\";\n appendMeta(summary, \"页大小\", `${header.pageSize} B`);\n appendMeta(summary, \"页数\", header.pageCount ?? \"未知\");\n appendMeta(summary, \"读写版本\", `${sqliteJournalMode(header.readVersion)} / ${sqliteJournalMode(header.writeVersion)}`);\n appendMeta(summary, \"Schema\", header.schemaVersion ?? \"未知\");\n appendMeta(summary, \"编码\", sqliteEncoding(header.textEncoding));\n appendMeta(summary, \"User version\", header.userVersion ?? 0);\n preview.append(summary);\n\n const schema = parseSqliteSchema(bytes, header);\n if (schema.length > 0) {\n preview.append(createSqliteSchemaTable(schema));\n } else {\n const empty = document.createElement(\"p\");\n empty.className = \"ofv-sqlite-empty\";\n empty.textContent = \"未从第一页 sqlite_schema 叶子页提取到结构定义;复杂数据库可后续接入 sqlite-wasm 完整读取。\";\n preview.append(empty);\n }\n\n return preview;\n}\n\nfunction parseSqliteHeader(bytes: Uint8Array): SqliteHeader {\n if (bytes.length < 100) {\n return { valid: false, error: \"文件太短,无法读取 SQLite 数据库头。\" };\n }\n const signature = new TextDecoder(\"ascii\").decode(bytes.slice(0, 16));\n if (signature !== \"SQLite format 3\\0\") {\n return { valid: false, error: \"缺少 SQLite format 3 文件签名。\" };\n }\n\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const rawPageSize = view.getUint16(16, false);\n const pageSize = rawPageSize === 1 ? 65536 : rawPageSize;\n if (pageSize < 512 || pageSize > 65536 || (pageSize & (pageSize - 1)) !== 0) {\n return { valid: false, error: `SQLite 页大小无效:${pageSize}。` };\n }\n\n return {\n valid: true,\n pageSize,\n writeVersion: bytes[18],\n readVersion: bytes[19],\n pageCount: view.getUint32(28, false),\n schemaVersion: view.getUint32(40, false),\n textEncoding: view.getUint32(56, false),\n userVersion: view.getUint32(60, false)\n };\n}\n\nfunction parseSqliteSchema(bytes: Uint8Array, header: SqliteHeader): SqliteSchemaEntry[] {\n const pageSize = header.pageSize || 0;\n if (pageSize <= 0 || bytes.length < Math.min(pageSize, 100)) {\n return [];\n }\n const pageStart = 0;\n const btreeStart = 100;\n if (bytes[btreeStart] !== 0x0d) {\n return [];\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const cellCount = view.getUint16(btreeStart + 3, false);\n const entries: SqliteSchemaEntry[] = [];\n for (let index = 0; index < Math.min(cellCount, 80); index++) {\n const pointerOffset = btreeStart + 8 + index * 2;\n if (pointerOffset + 2 > bytes.length) {\n break;\n }\n const cellOffset = pageStart + view.getUint16(pointerOffset, false);\n const entry = parseSqliteSchemaCell(bytes, cellOffset, pageStart + pageSize);\n if (entry) {\n entries.push(entry);\n }\n }\n return entries;\n}\n\nfunction parseSqliteSchemaCell(bytes: Uint8Array, offset: number, pageEnd: number): SqliteSchemaEntry | null {\n try {\n let cursor = offset;\n const payloadLength = readSqliteVarint(bytes, cursor);\n cursor = payloadLength.offset;\n const rowId = readSqliteVarint(bytes, cursor);\n cursor = rowId.offset;\n const payloadEnd = Math.min(pageEnd, cursor + Number(payloadLength.value));\n if (payloadEnd > bytes.length) {\n return null;\n }\n const record = parseSqliteRecord(bytes, cursor, payloadEnd);\n if (record.length < 5) {\n return null;\n }\n return {\n type: String(record[0] ?? \"\"),\n name: String(record[1] ?? \"\"),\n tableName: String(record[2] ?? \"\"),\n rootPage: Number(record[3] ?? 0),\n sql: String(record[4] ?? \"\")\n };\n } catch {\n return null;\n }\n}\n\nfunction parseSqliteRecord(bytes: Uint8Array, offset: number, end: number): Array<string | number | null> {\n const headerSize = readSqliteVarint(bytes, offset);\n let headerCursor = headerSize.offset;\n const bodyStart = offset + Number(headerSize.value);\n let bodyCursor = bodyStart;\n const serialTypes: bigint[] = [];\n while (headerCursor < bodyStart && headerCursor < end) {\n const serial = readSqliteVarint(bytes, headerCursor);\n serialTypes.push(serial.value);\n headerCursor = serial.offset;\n }\n return serialTypes.map((serialType) => {\n const value = readSqliteValue(bytes, bodyCursor, end, serialType);\n bodyCursor = value.offset;\n return value.value;\n });\n}\n\nfunction readSqliteValue(\n bytes: Uint8Array,\n offset: number,\n end: number,\n serialType: bigint\n): { value: string | number | null; offset: number } {\n const type = Number(serialType);\n if (type === 0) {\n return { value: null, offset };\n }\n if (type === 1) {\n return { value: signedInteger(bytes, offset, 1), offset: offset + 1 };\n }\n if (type === 2) {\n return { value: signedInteger(bytes, offset, 2), offset: offset + 2 };\n }\n if (type === 3) {\n return { value: signedInteger(bytes, offset, 3), offset: offset + 3 };\n }\n if (type === 4) {\n return { value: signedInteger(bytes, offset, 4), offset: offset + 4 };\n }\n if (type === 5) {\n return { value: signedInteger(bytes, offset, 6), offset: offset + 6 };\n }\n if (type === 6) {\n return { value: signedInteger(bytes, offset, 8), offset: offset + 8 };\n }\n if (type === 8) {\n return { value: 0, offset };\n }\n if (type === 9) {\n return { value: 1, offset };\n }\n if (type >= 12) {\n const length = Math.floor((type - 12) / 2);\n const valueEnd = Math.min(end, offset + length);\n if (type % 2 === 1) {\n return { value: new TextDecoder().decode(bytes.slice(offset, valueEnd)), offset: offset + length };\n }\n return { value: `<blob ${length} B>`, offset: offset + length };\n }\n return { value: null, offset };\n}\n\nfunction readSqliteVarint(bytes: Uint8Array, offset: number): { value: bigint; offset: number } {\n let value = 0n;\n for (let index = 0; index < 9; index++) {\n if (offset >= bytes.length) {\n throw new Error(\"SQLite varint 数据不完整。\");\n }\n const byte = bytes[offset++];\n if (index === 8) {\n value = (value << 8n) | BigInt(byte);\n return { value, offset };\n }\n value = (value << 7n) | BigInt(byte & 0x7f);\n if ((byte & 0x80) === 0) {\n return { value, offset };\n }\n }\n return { value, offset };\n}\n\nfunction signedInteger(bytes: Uint8Array, offset: number, length: number): number {\n let value = 0n;\n for (let index = 0; index < length; index++) {\n value = (value << 8n) | BigInt(bytes[offset + index] || 0);\n }\n const bits = BigInt(length * 8);\n const signBit = 1n << (bits - 1n);\n if ((value & signBit) !== 0n) {\n value -= 1n << bits;\n }\n return Number(value);\n}\n\nfunction createSqliteSchemaTable(entries: SqliteSchemaEntry[]): HTMLElement {\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-sqlite-schema\";\n const title = document.createElement(\"strong\");\n title.textContent = `Schema 对象 ${entries.length}`;\n const table = document.createElement(\"table\");\n const thead = document.createElement(\"thead\");\n const header = document.createElement(\"tr\");\n for (const label of [\"类型\", \"名称\", \"表\", \"Root\", \"SQL\"]) {\n const th = document.createElement(\"th\");\n th.textContent = label;\n header.append(th);\n }\n thead.append(header);\n const tbody = document.createElement(\"tbody\");\n for (const entry of entries) {\n const row = document.createElement(\"tr\");\n for (const value of [entry.type, entry.name, entry.tableName, String(entry.rootPage), entry.sql]) {\n const cell = document.createElement(\"td\");\n cell.textContent = value;\n row.append(cell);\n }\n tbody.append(row);\n }\n table.append(thead, tbody);\n wrapper.append(title, table);\n return wrapper;\n}\n\nfunction sqliteJournalMode(value?: number): string {\n if (value === 1) {\n return \"rollback\";\n }\n if (value === 2) {\n return \"WAL\";\n }\n return value === undefined ? \"未知\" : String(value);\n}\n\nfunction sqliteEncoding(value?: number): string {\n const encodings: Record<number, string> = {\n 0: \"未声明\",\n 1: \"UTF-8\",\n 2: \"UTF-16le\",\n 3: \"UTF-16be\"\n };\n return value === undefined ? \"未知\" : encodings[value] || `未知 (${value})`;\n}\n\ntype ParquetPreview = {\n valid: boolean;\n error?: string;\n footerLength?: number;\n footerOffset?: number;\n dataBytes?: number;\n};\n\nfunction createParquetPreview(bytes: Uint8Array): HTMLElement {\n const preview = document.createElement(\"div\");\n preview.className = \"ofv-data-preview\";\n const heading = document.createElement(\"strong\");\n heading.textContent = \"Parquet 结构\";\n preview.append(heading);\n\n const parsed = parseParquet(bytes);\n if (!parsed.valid) {\n const error = document.createElement(\"p\");\n error.className = \"ofv-data-error\";\n error.textContent = parsed.error || \"不是有效的 Parquet 文件。\";\n preview.append(error);\n return preview;\n }\n\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-data-summary\";\n appendMeta(summary, \"Magic\", \"PAR1\");\n appendMeta(summary, \"Footer\", `${parsed.footerLength} B`);\n appendMeta(summary, \"Footer offset\", `0x${(parsed.footerOffset || 0).toString(16).toUpperCase()}`);\n appendMeta(summary, \"数据区\", formatBytes(parsed.dataBytes || 0));\n preview.append(summary);\n\n const note = document.createElement(\"p\");\n note.className = \"ofv-data-note\";\n note.textContent = \"Parquet footer 使用 Thrift 编码;当前先展示容器边界,schema/row group 可后续接入 Arrow/Parquet 解码器。\";\n preview.append(note);\n return preview;\n}\n\nfunction parseParquet(bytes: Uint8Array): ParquetPreview {\n if (bytes.length < 12) {\n return { valid: false, error: \"文件太短,无法读取 Parquet 头尾信息。\" };\n }\n if (asciiAt(bytes, 0, 4) !== \"PAR1\" || asciiAt(bytes, bytes.length - 4, 4) !== \"PAR1\") {\n return { valid: false, error: \"缺少 Parquet PAR1 magic header/footer。\" };\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const footerLength = view.getUint32(bytes.length - 8, true);\n const footerOffset = bytes.length - 8 - footerLength;\n if (footerOffset < 4) {\n return { valid: false, error: \"Parquet footer 长度超过文件边界。\" };\n }\n return {\n valid: true,\n footerLength,\n footerOffset,\n dataBytes: Math.max(0, footerOffset - 4)\n };\n}\n\ntype AvroMetadata = {\n key: string;\n value: string;\n};\n\ntype AvroPreview = {\n valid: boolean;\n error?: string;\n metadata: AvroMetadata[];\n schema?: {\n type?: string;\n name?: string;\n namespace?: string;\n fields: string[];\n };\n codec?: string;\n syncMarker?: string;\n};\n\nfunction createAvroPreview(bytes: Uint8Array): HTMLElement {\n const preview = document.createElement(\"div\");\n preview.className = \"ofv-data-preview\";\n const heading = document.createElement(\"strong\");\n heading.textContent = \"Avro 结构\";\n preview.append(heading);\n\n const parsed = parseAvro(bytes);\n if (!parsed.valid) {\n const error = document.createElement(\"p\");\n error.className = \"ofv-data-error\";\n error.textContent = parsed.error || \"不是有效的 Avro Object Container 文件。\";\n preview.append(error);\n return preview;\n }\n\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-data-summary\";\n appendMeta(summary, \"Magic\", \"Obj\\\\x01\");\n appendMeta(summary, \"Codec\", parsed.codec || \"null\");\n appendMeta(summary, \"Metadata\", parsed.metadata.length);\n appendMeta(summary, \"Sync marker\", parsed.syncMarker || \"未知\");\n preview.append(summary);\n\n if (parsed.schema) {\n const schema = document.createElement(\"div\");\n schema.className = \"ofv-avro-schema\";\n const title = document.createElement(\"strong\");\n title.textContent = \"Schema\";\n const meta = document.createElement(\"div\");\n meta.className = \"ofv-data-summary\";\n appendMeta(meta, \"类型\", parsed.schema.type || \"未知\");\n appendMeta(meta, \"名称\", [parsed.schema.namespace, parsed.schema.name].filter(Boolean).join(\".\") || \"未知\");\n appendMeta(meta, \"字段\", parsed.schema.fields.length);\n schema.append(title, meta);\n if (parsed.schema.fields.length > 0) {\n const list = document.createElement(\"ul\");\n for (const field of parsed.schema.fields.slice(0, 80)) {\n const item = document.createElement(\"li\");\n item.textContent = field;\n list.append(item);\n }\n schema.append(list);\n }\n preview.append(schema);\n }\n\n if (parsed.metadata.length > 0) {\n preview.append(createKeyValueTable(\"Metadata\", parsed.metadata));\n }\n\n return preview;\n}\n\nfunction parseAvro(bytes: Uint8Array): AvroPreview {\n if (bytes.length < 4 || bytes[0] !== 0x4f || bytes[1] !== 0x62 || bytes[2] !== 0x6a || bytes[3] !== 0x01) {\n return { valid: false, error: \"缺少 Avro Object Container magic header。\", metadata: [] };\n }\n let offset = 4;\n const metadata: AvroMetadata[] = [];\n try {\n while (true) {\n const blockCount = readAvroLong(bytes, offset);\n offset = blockCount.offset;\n let count = blockCount.value;\n if (count === 0n) {\n break;\n }\n if (count < 0n) {\n count = -count;\n const blockSize = readAvroLong(bytes, offset);\n offset = blockSize.offset;\n }\n for (let index = 0; index < Number(count); index++) {\n const key = readAvroBytes(bytes, offset);\n offset = key.offset;\n const value = readAvroBytes(bytes, offset);\n offset = value.offset;\n metadata.push({\n key: new TextDecoder().decode(key.value),\n value: decodeAvroMetadataValue(key.value, value.value)\n });\n }\n }\n if (offset + 16 > bytes.length) {\n throw new Error(\"Avro sync marker 缺失。\");\n }\n const syncMarker = Array.from(bytes.slice(offset, offset + 16))\n .map((byte) => byte.toString(16).padStart(2, \"0\"))\n .join(\"\");\n const schemaText = metadata.find((item) => item.key === \"avro.schema\")?.value;\n return {\n valid: true,\n metadata,\n codec: metadata.find((item) => item.key === \"avro.codec\")?.value,\n syncMarker,\n schema: schemaText ? summarizeAvroSchema(schemaText) : undefined\n };\n } catch (error) {\n return {\n valid: false,\n error: error instanceof Error ? error.message : \"Avro metadata 解析失败。\",\n metadata\n };\n }\n}\n\nfunction readAvroLong(bytes: Uint8Array, offset: number): { value: bigint; offset: number } {\n let result = 0n;\n let shift = 0n;\n for (let index = 0; index < 10; index++) {\n if (offset >= bytes.length) {\n throw new Error(\"Avro long 数据不完整。\");\n }\n const byte = bytes[offset++];\n result |= BigInt(byte & 0x7f) << shift;\n if ((byte & 0x80) === 0) {\n const value = (result >> 1n) ^ -(result & 1n);\n return { value, offset };\n }\n shift += 7n;\n }\n throw new Error(\"Avro long 数据过长。\");\n}\n\nfunction readAvroBytes(bytes: Uint8Array, offset: number): { value: Uint8Array; offset: number } {\n const length = readAvroLong(bytes, offset);\n offset = length.offset;\n if (length.value < 0n) {\n throw new Error(\"Avro bytes 长度无效。\");\n }\n const size = Number(length.value);\n const end = offset + size;\n if (end > bytes.length) {\n throw new Error(\"Avro bytes 超出文件边界。\");\n }\n return { value: bytes.slice(offset, end), offset: end };\n}\n\nfunction decodeAvroMetadataValue(keyBytes: Uint8Array, valueBytes: Uint8Array): string {\n const key = new TextDecoder().decode(keyBytes);\n if (key === \"avro.schema\" || key === \"avro.codec\" || /^[a-z0-9_.-]+$/i.test(key)) {\n return new TextDecoder().decode(valueBytes);\n }\n return `<${valueBytes.length} B>`;\n}\n\nfunction summarizeAvroSchema(schemaText: string): AvroPreview[\"schema\"] {\n try {\n const schema = JSON.parse(schemaText) as {\n type?: string;\n name?: string;\n namespace?: string;\n fields?: Array<{ name?: string; type?: unknown }>;\n };\n return {\n type: typeof schema.type === \"string\" ? schema.type : undefined,\n name: typeof schema.name === \"string\" ? schema.name : undefined,\n namespace: typeof schema.namespace === \"string\" ? schema.namespace : undefined,\n fields: Array.isArray(schema.fields)\n ? schema.fields.map((field) => `${field.name || \"field\"}: ${formatAvroType(field.type)}`)\n : []\n };\n } catch {\n return { fields: [] };\n }\n}\n\nfunction formatAvroType(type: unknown): string {\n if (typeof type === \"string\") {\n return type;\n }\n if (Array.isArray(type)) {\n return type.map(formatAvroType).join(\" | \");\n }\n if (type && typeof type === \"object\") {\n const value = type as { type?: unknown; name?: unknown; items?: unknown; values?: unknown };\n if (typeof value.name === \"string\") {\n return value.name;\n }\n if (value.type === \"array\") {\n return `array<${formatAvroType(value.items)}>`;\n }\n if (value.type === \"map\") {\n return `map<${formatAvroType(value.values)}>`;\n }\n return formatAvroType(value.type);\n }\n return \"unknown\";\n}\n\nfunction createKeyValueTable(titleText: string, rows: AvroMetadata[]): HTMLElement {\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"ofv-data-kv\";\n const title = document.createElement(\"strong\");\n title.textContent = titleText;\n const table = document.createElement(\"table\");\n const tbody = document.createElement(\"tbody\");\n for (const row of rows.slice(0, 80)) {\n const tr = document.createElement(\"tr\");\n const key = document.createElement(\"th\");\n key.textContent = row.key;\n const value = document.createElement(\"td\");\n value.textContent = row.value;\n tr.append(key, value);\n tbody.append(tr);\n }\n table.append(tbody);\n wrapper.append(title, table);\n return wrapper;\n}\n\ntype PlistValue =\n | string\n | Uint8Array\n | PlistValue[]\n | { [key: string]: PlistValue }\n | boolean\n | number\n | null;\n\ntype WebArchivePreview = {\n valid: boolean;\n error?: string;\n binary?: boolean;\n url?: string;\n mimeType?: string;\n encoding?: string;\n mainBytes?: number;\n subresources?: number;\n subframeArchives?: number;\n snippet?: string;\n};\n\nfunction createWebArchivePreview(bytes: Uint8Array): HTMLElement {\n const preview = document.createElement(\"div\");\n preview.className = \"ofv-data-preview ofv-webarchive-preview\";\n const heading = document.createElement(\"strong\");\n heading.textContent = \"WebArchive 结构\";\n preview.append(heading);\n\n const parsed = parseWebArchive(bytes);\n if (!parsed.valid) {\n const error = document.createElement(\"p\");\n error.className = \"ofv-data-error\";\n error.textContent = parsed.error || \"不是有效的 WebArchive plist。\";\n preview.append(error);\n return preview;\n }\n\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-data-summary\";\n appendMeta(summary, \"格式\", parsed.binary ? \"Binary plist\" : \"XML plist\");\n appendMeta(summary, \"主资源\", parsed.url || \"未声明\");\n appendMeta(summary, \"MIME\", parsed.mimeType || \"未知\");\n appendMeta(summary, \"编码\", parsed.encoding || \"未声明\");\n appendMeta(summary, \"主资源大小\", parsed.mainBytes !== undefined ? formatBytes(parsed.mainBytes) : \"未知\");\n appendMeta(summary, \"子资源\", String(parsed.subresources ?? 0));\n appendMeta(summary, \"子归档\", String(parsed.subframeArchives ?? 0));\n preview.append(summary);\n\n if (parsed.binary) {\n const note = document.createElement(\"p\");\n note.className = \"ofv-data-note\";\n note.textContent = \"已识别 binary plist WebArchive;浏览器端需要 binary plist 解码器后才能展开主资源。\";\n preview.append(note);\n }\n\n if (parsed.snippet) {\n const snippet = document.createElement(\"pre\");\n snippet.className = \"ofv-text-block ofv-webarchive-snippet\";\n snippet.textContent = parsed.snippet;\n preview.append(snippet);\n }\n return preview;\n}\n\nfunction parseWebArchive(bytes: Uint8Array): WebArchivePreview {\n if (bytes.length >= 8 && asciiAt(bytes, 0, 8) === \"bplist00\") {\n return { valid: true, binary: true };\n }\n\n const text = new TextDecoder(\"utf-8\", { fatal: false }).decode(bytes.slice(0, Math.min(bytes.length, 1024 * 1024)));\n if (!/<plist[\\s>]/i.test(text) || !text.includes(\"WebMainResource\")) {\n return { valid: false, error: \"缺少 XML plist 或 WebMainResource 标记。\" };\n }\n if (typeof DOMParser === \"undefined\") {\n return { valid: false, error: \"当前环境缺少 DOMParser,无法解析 XML WebArchive。\" };\n }\n\n const documentXml = new DOMParser().parseFromString(text, \"application/xml\");\n if (documentXml.querySelector(\"parsererror\")) {\n return { valid: false, error: \"XML plist 解析失败。\" };\n }\n const rootDict = Array.from(documentXml.documentElement.children).find((child) => child.tagName === \"dict\");\n if (!rootDict) {\n return { valid: false, error: \"XML plist 缺少根 dict。\" };\n }\n\n const plist = parsePlistElement(rootDict);\n if (!isPlistDict(plist)) {\n return { valid: false, error: \"XML plist 根节点不是 dict。\" };\n }\n const mainResource = plist.WebMainResource;\n if (!isPlistDict(mainResource)) {\n return { valid: false, error: \"WebArchive 缺少 WebMainResource dict。\" };\n }\n\n const resourceData = mainResource.WebResourceData;\n const mimeType = plistString(mainResource.WebResourceMIMEType);\n const mainBytes = resourceData instanceof Uint8Array ? resourceData.length : undefined;\n return {\n valid: true,\n url: plistString(mainResource.WebResourceURL),\n mimeType,\n encoding: plistString(mainResource.WebResourceTextEncodingName),\n mainBytes,\n subresources: Array.isArray(plist.WebSubresources) ? plist.WebSubresources.length : 0,\n subframeArchives: Array.isArray(plist.WebSubframeArchives) ? plist.WebSubframeArchives.length : 0,\n snippet: createWebArchiveSnippet(resourceData, mimeType)\n };\n}\n\nfunction parsePlistElement(element: Element): PlistValue {\n switch (element.tagName) {\n case \"dict\": {\n const result: Record<string, PlistValue> = {};\n const children = Array.from(element.children);\n for (let index = 0; index < children.length; index++) {\n const key = children[index];\n if (key.tagName !== \"key\") {\n continue;\n }\n const value = children[index + 1];\n if (value) {\n result[key.textContent || \"\"] = parsePlistElement(value);\n index++;\n }\n }\n return result;\n }\n case \"array\":\n return Array.from(element.children).map(parsePlistElement);\n case \"data\":\n return decodeBase64Data(element.textContent || \"\");\n case \"integer\":\n case \"real\":\n return Number(element.textContent || 0);\n case \"true\":\n return true;\n case \"false\":\n return false;\n case \"string\":\n case \"date\":\n default:\n return element.textContent || \"\";\n }\n}\n\nfunction decodeBase64Data(value: string): Uint8Array {\n const normalized = value.replace(/\\s+/g, \"\");\n if (!normalized) {\n return new Uint8Array();\n }\n const binary = atob(normalized);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index++) {\n bytes[index] = binary.charCodeAt(index);\n }\n return bytes;\n}\n\nfunction createWebArchiveSnippet(value: PlistValue | undefined, mimeType?: string): string | undefined {\n if (!(value instanceof Uint8Array) || value.length === 0) {\n return undefined;\n }\n if (!mimeType || !/^(text\\/|application\\/(xhtml\\+xml|xml|json)|image\\/svg\\+xml)/i.test(mimeType)) {\n return undefined;\n }\n const text = new TextDecoder(\"utf-8\", { fatal: false }).decode(value);\n return text.replace(/\\s+/g, \" \").trim().slice(0, 1600);\n}\n\nfunction isPlistDict(value: PlistValue | undefined): value is { [key: string]: PlistValue } {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value) && !(value instanceof Uint8Array);\n}\n\nfunction plistString(value: PlistValue | undefined): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction asciiAt(bytes: Uint8Array, offset: number, length: number): string {\n if (offset < 0 || offset + length > bytes.length) {\n return \"\";\n }\n return new TextDecoder(\"ascii\").decode(bytes.slice(offset, offset + length));\n}\n\ntype PostScriptPreview = {\n valid: boolean;\n error?: string;\n format?: string;\n title?: string;\n creator?: string;\n creationDate?: string;\n pages?: string;\n boundingBox?: string;\n documentData?: string;\n};\n\nfunction createPostScriptPreview(bytes: Uint8Array): HTMLElement {\n const preview = document.createElement(\"div\");\n preview.className = \"ofv-data-preview\";\n const heading = document.createElement(\"strong\");\n heading.textContent = \"PostScript 结构\";\n preview.append(heading);\n\n const parsed = parsePostScript(bytes);\n if (!parsed.valid) {\n const error = document.createElement(\"p\");\n error.className = \"ofv-data-error\";\n error.textContent = parsed.error || \"不是有效的 PostScript/Illustrator 文档头。\";\n preview.append(error);\n return preview;\n }\n\n const summary = document.createElement(\"div\");\n summary.className = \"ofv-data-summary\";\n appendMeta(summary, \"格式\", parsed.format || \"PostScript\");\n appendMeta(summary, \"Title\", parsed.title || \"未声明\");\n appendMeta(summary, \"Creator\", parsed.creator || \"未声明\");\n appendMeta(summary, \"Pages\", parsed.pages || \"未知\");\n appendMeta(summary, \"BoundingBox\", parsed.boundingBox || \"未声明\");\n appendMeta(summary, \"Created\", parsed.creationDate || \"未声明\");\n if (parsed.documentData) {\n appendMeta(summary, \"Data\", parsed.documentData);\n }\n preview.append(summary);\n return preview;\n}\n\nfunction parsePostScript(bytes: Uint8Array): PostScriptPreview {\n const head = new TextDecoder(\"latin1\").decode(bytes.slice(0, Math.min(bytes.length, 8192)));\n const firstLine = head.split(/\\r?\\n/, 1)[0] || \"\";\n const isPdfCompatible = firstLine.startsWith(\"%PDF-\");\n const isPostScript = firstLine.startsWith(\"%!\");\n if (!isPdfCompatible && !isPostScript) {\n return { valid: false, error: \"缺少 PostScript %! 或 PDF-compatible %PDF 文件头。\" };\n }\n\n const boundingBox = dscValue(head, \"BoundingBox\") || dscValue(head, \"HiResBoundingBox\");\n return {\n valid: true,\n format: isPdfCompatible ? `PDF-compatible Illustrator (${firstLine.replace(/^%/, \"\")})` : firstLine.replace(/^%!/, \"PostScript \"),\n title: dscValue(head, \"Title\"),\n creator: dscValue(head, \"Creator\") || dscValue(head, \"For\"),\n creationDate: dscValue(head, \"CreationDate\"),\n pages: dscValue(head, \"Pages\"),\n boundingBox: normalizeBoundingBox(boundingBox),\n documentData: dscValue(head, \"DocumentData\")\n };\n}\n\nfunction dscValue(text: string, key: string): string | undefined {\n const escaped = key.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const match = text.match(new RegExp(`^%%${escaped}:\\\\s*(.+)$`, \"im\"));\n return match?.[1]?.trim();\n}\n\nfunction normalizeBoundingBox(value?: string): string | undefined {\n if (!value) {\n return undefined;\n }\n const parts = value.trim().split(/\\s+/).map((part) => Number(part));\n if (parts.length < 4 || parts.some((part) => !Number.isFinite(part))) {\n return value;\n }\n const [x1, y1, x2, y2] = parts;\n return `${x1}, ${y1}, ${x2}, ${y2} (${Math.max(0, x2 - x1)} x ${Math.max(0, y2 - y1)} pt)`;\n}\n\nfunction createHexPreview(bytes: Uint8Array): HTMLElement | null {\n if (bytes.length === 0) {\n return null;\n }\n const pre = document.createElement(\"pre\");\n pre.className = \"ofv-text-block ofv-asset-hex\";\n pre.textContent = hexPreview(bytes);\n return pre;\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) {\n return `${bytes} B`;\n }\n if (bytes < 1024 * 1024) {\n return `${(bytes / 1024).toFixed(1)} KB`;\n }\n return `${(bytes / 1024 / 1024).toFixed(2)} MB`;\n}\n\nfunction byteSignature(bytes: Uint8Array): string {\n if (bytes.length === 0) {\n return \"空文件\";\n }\n const ascii = new TextDecoder(\"ascii\").decode(bytes.slice(0, Math.min(bytes.length, 16))).replace(/[^\\x20-\\x7E]/g, \".\");\n const hex = Array.from(bytes.slice(0, Math.min(bytes.length, 8)))\n .map((byte) => byte.toString(16).padStart(2, \"0\").toUpperCase())\n .join(\" \");\n return `${ascii} (${hex})`;\n}\n\nfunction hexPreview(bytes: Uint8Array): string {\n const rows: string[] = [];\n const limit = Math.min(bytes.length, 256);\n for (let offset = 0; offset < limit; offset += 16) {\n const slice = bytes.slice(offset, offset + 16);\n const hex = Array.from(slice)\n .map((byte) => byte.toString(16).padStart(2, \"0\").toUpperCase())\n .join(\" \")\n .padEnd(47, \" \");\n const ascii = Array.from(slice)\n .map((byte) => (byte >= 32 && byte <= 126 ? String.fromCharCode(byte) : \".\"))\n .join(\"\");\n rows.push(`${offset.toString(16).padStart(8, \"0\").toUpperCase()} ${hex} ${ascii}`);\n }\n if (bytes.length > limit) {\n rows.push(`... 仅展示前 ${limit} 字节,共 ${bytes.length} 字节`);\n }\n return rows.join(\"\\n\");\n}\n"],"mappings":"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","names":["name","extension","view","asciiAt","readUint32Be","timescale","duration","readUint32Le","appendMediaInfo","asciiAt","readUint32Le","readUint16Le","formatDuration","readUint32Be","view","PrismModule","Prism","DOMPurify","normalizeFileName","appendMeta","JSZip","JSZip","appendMeta","getXmlAttribute","countMatches","JSZip","DOMPurify","JSZip","getXmlAttribute","countMatches","decodeXml","DOMPurify","JSZip","JSZip","finiteNumber","mimeTypeFromPath","directoryName","JSZip","JSZip","formatBytes","view","readUint64Le","DOMPurify","DOMPurify","document","pako","finiteNumber","pako","appendMeta","formatBytes","byteSignature","height","geometry","material","JSZip","formatBytes","byteSignature","asciiAt","view","hexPreview"]}