@flyfish-group/file-viewer 1.0.13 → 1.0.14

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.
Files changed (211) hide show
  1. package/README.md +109 -30
  2. package/dist/components/3MFLoader.js +1 -0
  3. package/dist/components/AMFLoader.js +1 -0
  4. package/dist/components/ArchiveViewer.js +1 -0
  5. package/dist/components/AudioViewer.js +1 -0
  6. package/dist/components/CadViewer.js +1 -1
  7. package/dist/components/CodeViewer.js +1 -1
  8. package/dist/components/ColladaLoader.js +1 -0
  9. package/dist/components/DrawingViewer.js +1 -0
  10. package/dist/components/EdaViewer.js +1 -0
  11. package/dist/components/EmailViewer.js +1 -0
  12. package/dist/components/EpubViewer.js +1 -0
  13. package/dist/components/FBXLoader.js +1 -0
  14. package/dist/components/GLTFLoader.js +1 -0
  15. package/dist/components/ImageViewer.js +1 -1
  16. package/dist/components/KMZLoader.js +1 -0
  17. package/dist/components/MarkdownViewer.js +1 -1
  18. package/dist/components/ModelViewer.js +26885 -0
  19. package/dist/components/OBJLoader.js +1 -0
  20. package/dist/components/OfdViewer.js +1 -1
  21. package/dist/components/PCDLoader.js +1 -0
  22. package/dist/components/PLYLoader.js +1 -0
  23. package/dist/components/PdfView.js +30722 -1
  24. package/dist/components/PptxRender.js +1 -1
  25. package/dist/components/STLLoader.js +1 -0
  26. package/dist/components/TDSLoader.js +1 -0
  27. package/dist/components/USDLoader.js +1 -0
  28. package/dist/components/UmdViewer.js +2 -0
  29. package/dist/components/VRMLLoader.js +1 -0
  30. package/dist/components/VTKLoader.js +1 -0
  31. package/dist/components/XYZLoader.js +1 -0
  32. package/dist/components/XlsxTable.js +1 -1
  33. package/dist/components/___vite-browser-external_commonjs-proxy.js +1 -0
  34. package/dist/components/_commonjs-dynamic-modules.js +1 -0
  35. package/dist/components/_commonjsHelpers.js +1 -1
  36. package/dist/components/ar-SA-G6X2FPQ2.js +1 -0
  37. package/dist/components/arc.js +1 -0
  38. package/dist/components/architecture-7EHR7CIX.js +1 -0
  39. package/dist/components/architectureDiagram-3BPJPVTR.js +1 -0
  40. package/dist/components/az-AZ-76LH7QW2.js +1 -0
  41. package/dist/components/bg-BG-XCXSNQG7.js +1 -0
  42. package/dist/components/blockDiagram-GPEHLZMM.js +1 -0
  43. package/dist/components/bn-BD-2XOGV67Q.js +1 -0
  44. package/dist/components/c4Diagram-AAUBKEIU.js +1 -0
  45. package/dist/components/ca-ES-6MX7JW3Y.js +1 -0
  46. package/dist/components/cfb.js +1 -0
  47. package/dist/components/channel.js +1 -0
  48. package/dist/components/chunk-2J33WTMH.js +1 -0
  49. package/dist/components/chunk-4BX2VUAB.js +1 -0
  50. package/dist/components/chunk-55IACEB6.js +1 -0
  51. package/dist/components/chunk-727SXJPM.js +1 -0
  52. package/dist/components/chunk-AQP2D5EJ.js +1 -0
  53. package/dist/components/chunk-EIO257PC.js +1722 -0
  54. package/dist/components/chunk-FMBD7UC4.js +1 -0
  55. package/dist/components/chunk-ND2GUHAM.js +1 -0
  56. package/dist/components/chunk-QZHKN3VN.js +1 -0
  57. package/dist/components/classDiagram-4FO5ZUOK.js +1 -0
  58. package/dist/components/classDiagram-v2-Q7XG4LA2.js +1 -0
  59. package/dist/components/cose-bilkent-S5V4N54A.js +1 -0
  60. package/dist/components/cs-CZ-2BRQDIVT.js +1 -0
  61. package/dist/components/cytoscape.esm.js +1 -0
  62. package/dist/components/da-DK-5WZEPLOC.js +1 -0
  63. package/dist/components/dagre-BM42HDAG.js +1 -0
  64. package/dist/components/de-DE-XR44H4JA.js +1 -0
  65. package/dist/components/defaultLocale.js +1 -0
  66. package/dist/components/diagram-2AECGRRQ.js +1 -0
  67. package/dist/components/diagram-5GNKFQAL.js +1 -0
  68. package/dist/components/diagram-KO2AKTUF.js +1 -0
  69. package/dist/components/diagram-LMA3HP47.js +1 -0
  70. package/dist/components/diagram-OG6HWLK6.js +1 -0
  71. package/dist/components/directory-open-01563666.js +1 -0
  72. package/dist/components/directory-open-4ed118d0.js +1 -0
  73. package/dist/components/docx-preview.js +2 -2
  74. package/dist/components/el-GR-BZB4AONW.js +1 -0
  75. package/dist/components/en-B4ZKOASM.js +1 -0
  76. package/dist/components/erDiagram-TEJ5UH35.js +1 -0
  77. package/dist/components/es-ES-U4NZUMDT.js +1 -0
  78. package/dist/components/eu-ES-A7QVB2H4.js +1 -0
  79. package/dist/components/eventmodeling-FCH6USID.js +1 -0
  80. package/dist/components/fa-IR-HGAKTJCU.js +1 -0
  81. package/dist/components/fflate.module.js +1 -0
  82. package/dist/components/fi-FI-Z5N7JZ37.js +1 -0
  83. package/dist/components/file-open-002ab408.js +1 -0
  84. package/dist/components/file-open-7c801643.js +1 -0
  85. package/dist/components/file-save-3189631c.js +1 -0
  86. package/dist/components/file-save-745eba88.js +1 -0
  87. package/dist/components/flowDiagram-I6XJVG4X.js +1 -0
  88. package/dist/components/fr-FR-RHASNOE6.js +1 -0
  89. package/dist/components/ganttDiagram-6RSMTGT7.js +1 -0
  90. package/dist/components/gitGraph-WXDBUCRP.js +1 -0
  91. package/dist/components/gitGraphDiagram-PVQCEYII.js +1 -0
  92. package/dist/components/gl-ES-HMX3MZ6V.js +1 -0
  93. package/dist/components/graph.js +1 -0
  94. package/dist/components/he-IL-6SHJWFNN.js +1 -0
  95. package/dist/components/hi-IN-IWLTKZ5I.js +1 -0
  96. package/dist/components/hu-HU-A5ZG7DT2.js +1 -0
  97. package/dist/components/id-ID-SAP4L64H.js +1 -0
  98. package/dist/components/image-GAAHSSAO.js +1 -0
  99. package/dist/components/image-blob-reduce.esm.js +2 -0
  100. package/dist/components/index.js +23989 -1
  101. package/dist/components/index10.js +1 -0
  102. package/dist/components/index11.js +1 -0
  103. package/dist/components/index12.js +1 -0
  104. package/dist/components/index13.js +1 -0
  105. package/dist/components/index14.js +1 -0
  106. package/dist/components/index15.js +1 -0
  107. package/dist/components/index16.js +1 -0
  108. package/dist/components/index17.js +1 -0
  109. package/dist/components/index18.js +1 -0
  110. package/dist/components/index19.js +1 -0
  111. package/dist/components/index2.js +1 -1
  112. package/dist/components/index20.js +1 -0
  113. package/dist/components/index21.js +2 -0
  114. package/dist/components/index22.js +1 -0
  115. package/dist/components/index23.js +1 -0
  116. package/dist/components/index24.js +1 -0
  117. package/dist/components/index3.js +1 -0
  118. package/dist/components/index4.js +1 -0
  119. package/dist/components/index5.js +1 -0
  120. package/dist/components/index6.js +1 -0
  121. package/dist/components/index7.js +1 -0
  122. package/dist/components/index8.js +1 -0
  123. package/dist/components/index9.js +1 -0
  124. package/dist/components/info-J43DQDTF.js +1 -0
  125. package/dist/components/infoDiagram-5YYISTIA.js +1 -0
  126. package/dist/components/init.js +1 -0
  127. package/dist/components/ishikawaDiagram-YF4QCWOH.js +1 -0
  128. package/dist/components/it-IT-JPQ66NNP.js +1 -0
  129. package/dist/components/ja-JP-DBVTYXUO.js +1 -0
  130. package/dist/components/journeyDiagram-JHISSGLW.js +1 -0
  131. package/dist/components/jszip.min.js +1 -1
  132. package/dist/components/kaa-6HZHGXH3.js +1 -0
  133. package/dist/components/kab-KAB-ZGHBKWFO.js +1 -0
  134. package/dist/components/kanban-definition-UN3LZRKU.js +1 -0
  135. package/dist/components/katex.js +1 -0
  136. package/dist/components/kk-KZ-P5N5QNE5.js +1 -0
  137. package/dist/components/km-KH-HSX4SM5Z.js +1 -0
  138. package/dist/components/ko-KR-MTYHY66A.js +1 -0
  139. package/dist/components/ku-TR-6OUDTVRD.js +1 -0
  140. package/dist/components/layout.js +1 -0
  141. package/dist/components/libarchive.js +6 -0
  142. package/dist/components/linear.js +1 -0
  143. package/dist/components/lt-LT-XHIRWOB4.js +1 -0
  144. package/dist/components/lv-LV-5QDEKY6T.js +1 -0
  145. package/dist/components/mermaid-parser.core.js +14 -0
  146. package/dist/components/mindmap-definition-RKZ34NQL.js +1 -0
  147. package/dist/components/mr-IN-CRQNXWMA.js +1 -0
  148. package/dist/components/my-MM-5M5IBNSE.js +1 -0
  149. package/dist/components/nb-NO-T6EIAALU.js +1 -0
  150. package/dist/components/nestedRender.js +1 -0
  151. package/dist/components/nl-NL-IS3SIHDZ.js +1 -0
  152. package/dist/components/nn-NO-6E72VCQL.js +1 -0
  153. package/dist/components/oc-FR-POXYY2M6.js +1 -0
  154. package/dist/components/ofd.js +1 -1
  155. package/dist/components/ordinal.js +1 -0
  156. package/dist/components/pa-IN-N4M65BXN.js +1 -0
  157. package/dist/components/packet-YPE3B663.js +1 -0
  158. package/dist/components/percentages-BXMCSKIN.js +1 -0
  159. package/dist/components/pica.js +1 -0
  160. package/dist/components/pie-LRSECV5Y.js +1 -0
  161. package/dist/components/pie.js +1 -0
  162. package/dist/components/pieDiagram-4H26LBE5.js +1 -0
  163. package/dist/components/pl-PL-T2D74RX3.js +1 -0
  164. package/dist/components/postal-mime.js +1 -0
  165. package/dist/components/pt-BR-5N22H2LF.js +1 -0
  166. package/dist/components/pt-PT-UZXXM6DQ.js +1 -0
  167. package/dist/components/quadrantDiagram-W4KKPZXB.js +1 -0
  168. package/dist/components/radar-GUYGQ44K.js +1 -0
  169. package/dist/components/requirementDiagram-4Y6WPE33.js +1 -0
  170. package/dist/components/ro-RO-JPDTUUEW.js +1 -0
  171. package/dist/components/rough.esm.js +1 -0
  172. package/dist/components/roundRect.js +1 -0
  173. package/dist/components/ru-RU-B4JR7IUQ.js +1 -0
  174. package/dist/components/sankeyDiagram-5OEKKPKP.js +1 -0
  175. package/dist/components/sequenceDiagram-3UESZ5HK.js +1 -0
  176. package/dist/components/si-LK-N5RQ5JYF.js +1 -0
  177. package/dist/components/sk-SK-C5VTKIMK.js +1 -0
  178. package/dist/components/sl-SI-NN7IZMDC.js +1 -0
  179. package/dist/components/stateDiagram-AJRCARHV.js +1 -0
  180. package/dist/components/stateDiagram-v2-BHNVJYJU.js +1 -0
  181. package/dist/components/subset-shared.chunk.js +1 -0
  182. package/dist/components/subset-worker.chunk.js +1 -0
  183. package/dist/components/sv-SE-XGPEYMSR.js +1 -0
  184. package/dist/components/ta-IN-2NMHFXQM.js +1 -0
  185. package/dist/components/th-TH-HPSO5L25.js +1 -0
  186. package/dist/components/time.js +1 -0
  187. package/dist/components/timeline-definition-PNZ67QCA.js +1 -0
  188. package/dist/components/tr-TR-DEFEU3FU.js +1 -0
  189. package/dist/components/transform.js +1 -0
  190. package/dist/components/treeView-BLDUP644.js +1 -0
  191. package/dist/components/treemap-LRROVOQU.js +1 -0
  192. package/dist/components/uk-UA-QMV73CPH.js +1 -0
  193. package/dist/components/vennDiagram-CIIHVFJN.js +1 -0
  194. package/dist/components/vi-VN-M7AON7JQ.js +1 -0
  195. package/dist/components/wardley-L42UT6IY.js +1 -0
  196. package/dist/components/wardleyDiagram-YWT4CUSO.js +1 -0
  197. package/dist/components/worker-bundle.js +1 -0
  198. package/dist/components/worker-ref.js +1 -1
  199. package/dist/components/xychartDiagram-2RQKCTM6.js +1 -0
  200. package/dist/components/zh-CN-LNUGB5OW.js +1 -0
  201. package/dist/components/zh-HK-E62DVLB3.js +1 -0
  202. package/dist/components/zh-TW-RAJ6MFWO.js +1 -0
  203. package/dist/index.d.ts +74 -3
  204. package/dist/index.mjs +1 -1
  205. package/dist/package/index.d.ts +10 -3
  206. package/dist/style.css +11 -11
  207. package/dist/worker/pptx.worker.js +1 -1
  208. package/package.json +17 -3
  209. package/dist/index.umd.js +0 -7
  210. package/dist/worker/pdf.worker.js +0 -1
  211. package/dist/worker/sheet.worker.js +0 -1
package/README.md CHANGED
@@ -1,41 +1,55 @@
1
1
  # Flyfish Viewer
2
2
 
3
- 把 Word、Excel、PPT、PDF 和图片稳稳带进浏览器里。
3
+ 把 Word、Excel、PPT、PDF、压缩包、邮件、音频和电子书稳稳带进浏览器里。
4
4
 
5
- `@flyfish-group/file-viewer3` 是一款基于 Vue 3、TypeScript 和 Vite 构建的纯前端文件预览组件。Vue2.7 项目请使用同能力包 `@flyfish-group/file-viewer`。两条 npm 包线保持一致的格式覆盖、示例体验和 API 语义,在线 Demo 始终使用 `v3` 分支产物作为最新体验基准。
5
+ `@flyfish-group/file-viewer3` 是一款基于 Vue 3、TypeScript 和 Vite 构建的纯前端文件预览组件。Vue2.7 项目请使用同能力包 `@flyfish-group/file-viewer`。两条 npm 包线保持一致的格式覆盖、示例体验和 API 语义,Vue3 构建产物作为 React、纯 Web 和其他适配层的统一预览基线。
6
6
 
7
7
  它不依赖后端转码服务,适合接入 OA、知识库、附件中心、流程系统和需要离线能力的业务场景。这个项目的目标很直接: 让文档预览不再像临时拼出来的功能,而是像一个可以放心交付、能独立演示、能持续维护的产品模块。
8
8
 
9
- - 在线 Demo: [viewer.flyfish.dev](https://viewer.flyfish.dev)
10
- - 官方文档/组件主页: [doc.flyfish.dev](https://doc.flyfish.dev)
11
9
  - npm(Vue3): [@flyfish-group/file-viewer3](https://www.npmjs.com/package/@flyfish-group/file-viewer3)
12
10
  - npm(Vue2): [@flyfish-group/file-viewer](https://www.npmjs.com/package/@flyfish-group/file-viewer)
11
+ - npm(React): [@flyfish-group/file-viewer-react](https://www.npmjs.com/package/@flyfish-group/file-viewer-react)
12
+ - npm(纯 JS): [@flyfish-group/file-viewer-web](https://www.npmjs.com/package/@flyfish-group/file-viewer-web)
13
+ - 官方文档: [doc.flyfish.dev](https://doc.flyfish.dev)
14
+ - 在线 Demo: [viewer.flyfish.dev](https://viewer.flyfish.dev)
13
15
  - 公开成品仓库: [github.com/flyfish-dev/file-viewer](https://github.com/flyfish-dev/file-viewer)
14
- - 源码自助开通: [dev.flyfish.group/shop](https://dev.flyfish.group/shop)
16
+ - 源码自助开通: [https://dev.flyfish.group/shop](https://dev.flyfish.group/shop)
15
17
 
16
18
  ## 当前发布版本
17
19
 
18
20
  | 技术栈 | npm 包 | 最新版本 | 推荐分支 | 说明 |
19
21
  | --- | --- | --- | --- | --- |
20
- | Vue3 | `@flyfish-group/file-viewer3` | `1.0.13` | `v3` | 主推版本,在线 Demo 与后续上线均以此为准 |
21
- | Vue2.7 | `@flyfish-group/file-viewer` | `1.0.13` | `main` | 兼容 Vue2 项目,格式能力与 Vue3 保持一致 |
22
+ | Vue3 | `@flyfish-group/file-viewer3` | `1.0.12` | `v3` | 主推版本,也是 React / 纯 Web 私有化 iframe 适配层的构建基线 |
23
+ | Vue2.7 | `@flyfish-group/file-viewer` | `1.0.12` | `main` | 兼容 Vue2 项目,格式能力与 Vue3 保持一致 |
24
+ | React 17 / 18 / 19 | `@flyfish-group/file-viewer-react` | `1.0.12` | 当前仓库子工程 | iframe 组件,默认加载 `/file-viewer/index.html` |
25
+ | 纯 JS | `@flyfish-group/file-viewer-web` | `1.0.12` | 当前仓库子工程 | iframe helper 和 viewer 产物复制工具 |
26
+
27
+ 如果你在内网、离线环境,或者 npm 发布权限还没有完成配置,也可以直接使用公开成品仓库 `artifacts/` 里的 tarball。离线安装 React 包时请先安装同版本 web 包:
28
+
29
+ ```bash
30
+ npm install ./artifacts/flyfish-group-file-viewer-web-1.0.12.tgz
31
+ npm install ./artifacts/flyfish-group-file-viewer-react-1.0.12.tgz
32
+ ```
22
33
 
23
- ![Flyfish Viewer demo](https://doc.flyfish.dev/_images/demo-main.png)
34
+ React / 纯 JS 包推荐用 `npm install` 获得安装即复制的体验。pnpm 10 默认会拦截依赖包的 `postinstall`,如果看到 `Ignored build scripts: @flyfish-group/file-viewer-web`,请执行 `pnpm approve-builds` 允许该包,或安装后运行 `pnpm exec file-viewer-copy-assets ./public/file-viewer`。
35
+
36
+ ![Flyfish Viewer demo](docs/_images/demo-main.png)
24
37
 
25
38
  ## 为什么值得接入
26
39
 
27
40
  - **纯前端 Serverless。** 文档解析和展示全部在浏览器内完成,部署简单,不依赖 Office 服务端、LibreOffice 守护进程或额外转码链路。
28
- - **格式覆盖完整。** 当前内置 59 个扩展名映射,覆盖 Word、Excel、PowerPoint、PDF、OFD、CAD、Markdown、图片、代码/文本和 MP4,能覆盖绝大多数业务附件场景。
29
- - **按需异步加载。** PDF、OFD、CAD、Office、Markdown 和代码高亮渲染器都按需加载,重型解析依赖不会进入其他格式的首屏路径。
41
+ - **格式覆盖完整。** 当前内置 135 个扩展名映射,覆盖 Word、Excel、PowerPoint、PDF、OFD、压缩包、邮件、OLB/DRA、CAD、3D 模型、Excalidraw、draw.io、EPUB、UMD、Markdown、图片、音频、代码/文本和 MP4,能覆盖绝大多数业务附件场景。
42
+ - **按需异步加载。** PDF、OFD、压缩包、邮件、OLB/DRA、CAD、3D 模型、绘图、Office、EPUB、UMD、Markdown 和代码高亮渲染器都按需加载,重型解析依赖不会进入其他格式的首屏路径。
43
+ - **预览器操作完整。** 内置下载原文件、打印完整渲染结果、导出渲染后 HTML、水印开关和水印 options;PDF 会逐页输出完整页面,不依赖当前视口,适合合同、归档和审批类场景。
30
44
  - **阅读体验更像产品。** `.doc`、`.docx`、PDF 都保留灰色工作台、白色纸张、居中阅读和自适应缩放,避免“内容能打开但不好读”的落差。
31
45
  - **Demo 更适合验收。** 示例文件按文档、表格、图纸、代码、图片等类型分组展示,点击样例即可打开并自动收起选择器。
32
46
  - **Vue2 / Vue3 体验一致。** `main` 分支面向 Vue2.7,`v3` 分支面向 Vue3;两边共享完整格式覆盖、示例文件盒子、文档站和 iframe 集成体验。
33
47
  - **组件和独立站两用。** 既支持在 Vue 项目里直接作为组件使用,也支持独立部署后通过 iframe 嵌入到任意系统,方便多业务线复用。
34
- - **适合成品交付。** 官方文档、在线 Demo、公开成品仓库、混淆压缩产物、npm tarball 和静态部署产物都一起维护,便于下载、验收和二次接入。
48
+ - **适合成品交付。** 公开成品仓库、混淆压缩产物、npm tarball、静态部署产物和私有化 iframe 适配包都一起维护,便于下载、验收和二次接入。
35
49
 
36
50
  ## 支持格式
37
51
 
38
- 当前版本内置 59 个扩展名映射,覆盖 11 条预览链路。
52
+ 当前版本内置 135 个扩展名映射,覆盖 19 条预览链路。
39
53
 
40
54
  | 类别 | 扩展名 | 当前表现 | 适合场景 |
41
55
  | --- | --- | --- | --- |
@@ -43,21 +57,30 @@
43
57
  | Word | `doc` | `msdoc-viewer` + Word 风格页面容器 | 历史 `.doc` 老文档 |
44
58
  | Excel | `xlsx` | `styled-exceljs` + 虚拟滚动,支持尺寸、合并和常见样式 | 需要保留表格结构和样式的业务 |
45
59
  | Excel 兼容格式 | `xlsm`、`xlsb`、`xls`、`csv`、`ods`、`fods`、`numbers` | 统一解析,按格式可用信息渐进还原样式 | 老表格、轻量数据查看 |
46
- | PowerPoint | `pptx` | 浏览幻灯片内容 | 汇报材料、课件、方案 |
47
- | PDF | `pdf` | 基于 `pdfjs-dist` 预览,支持缩放工具栏、页码状态和可显隐导航窗格 | 合同、票据、版式成品 |
60
+ | PowerPoint | `pptx` | 浏览幻灯片内容,增强组合图形、主题背景、图片裁剪与 EMF 矢量图预览 | 汇报材料、课件、方案 |
61
+ | PDF | `pdf` | 基于 `pdfjs-dist` 预览,支持缩放工具栏、页码状态、可显隐导航窗格、宽度自适应、完整打印和导出 HTML | 合同、票据、版式成品 |
48
62
  | OFD | `ofd` | 基于 `DLTech21/ofd.js` 仓库源码在线预览国产版式文档,避开 npm dist 授权 wasm 分支 | 电子发票、公文、归档材料 |
63
+ | 压缩包 | `zip`、`zipx`、`7z`、`rar`、`tar`、`gz`、`gzip`、`tgz`、`bz2`、`bzip2`、`tbz`、`tbz2`、`xz`、`txz`、`lzma`、`zst`、`tzst`、`cab`、`ar`、`cpio`、`iso`、`xar`、`lha`、`lzh`、`jar`、`war`、`ear`、`apk`、`cbz`、`cbr` | 基于 `libarchive.js` 的 WASM Worker 读取目录,点击后按需解压内部文件并复用统一预览器,支持 IndexedDB 缓存和体积上限 | 归档附件、批量交付包、压缩包内文档快速查看 |
64
+ | 邮件 | `eml`、`msg` | EML 使用 `postal-mime`,MSG 使用 `@kenjiuno/msgreader`,支持头信息、HTML/文本正文、附件下载与附件预览 | 邮件归档、工单邮件、客户来信附件 |
65
+ | EDA | `olb`、`dra` | 使用 `cfb` 解析 OrCAD/Allegro 常见 CFB 容器,展示结构树、元件/封装/Padstack 候选、属性、诊断和可读字符串;退化时提供安全二进制索引 | 元件库、封装图纸、EDA 附件初筛 |
49
66
  | CAD | `dxf` | 基于 `@cadview/core` 预览图纸,支持缩放、平移、图层控制 | 工程图纸、二维 CAD 附件 |
50
- | CAD 兼容入口 | `dwg` | 提示转换为 DXF 后预览,不内置 GPL DWG 解析器 | 需要兼容上传入口的业务 |
67
+ | CAD 兼容入口 | `dwg` | 优先识别误命名 DXF;真实 DWG 会尽量提取内嵌预览图,并说明未完整解析几何的原因 | 需要兼容上传入口的业务 |
68
+ | 3D 模型 | `glb`、`gltf`、`obj`、`stl`、`ply`、`fbx`、`dae`、`3ds`、`3mf`、`amf`、`usd`、`usda`、`usdc`、`usdz`、`kmz`、`pcd`、`wrl`、`vrml`、`xyz`、`vtk`、`vtp`、`step`、`stp`、`iges`、`igs`、`ifc`、`3dm` | 基于 Three.js 交互预览;工程 CAD/BIM 格式会给出不内置几何内核的原因和转换建议 | 设计模型、点云、三维资产、工程模型 |
69
+ | Excalidraw | `excalidraw` | 基于官方 `@excalidraw/excalidraw` 的 `restore` + `exportToSvg` 输出只读预览 | 白板草图、流程草稿、产品沟通图 |
70
+ | draw.io | `drawio`、`dio` | 基于官方 diagrams.net `GraphViewer` 预览 mxGraphModel / mxfile | 流程图、架构图、业务泳道图 |
71
+ | 电子书 | `epub` | 基于 `epubjs` 解析目录和章节资源,使用兼容性更好的滚动阅读 | 电子书、培训手册、长篇阅读材料 |
72
+ | 电子书 | `umd` | 按 UMD 移动电子书结构解析元数据、目录和 zlib 压缩正文 | 旧移动电子书、历史小说附件 |
51
73
  | Markdown | `md`、`markdown` | Markdown 阅读样式 | README、知识文档、说明文档 |
52
74
  | 图片 | `gif`、`jpg`、`jpeg`、`bmp`、`tiff`、`tif`、`png`、`svg`、`webp` | 原生图片浏览 | 图片附件、设计稿、Logo |
53
- | 代码/文本 | `txt`、`json`、`js`、`mjs`、`cjs`、`css`、`java`、`py`、`html`、`htm`、`jsx`、`ts`、`tsx`、`xml`、`log`、`vue`、`yaml`、`yml`、`ini`、`sh`、`bash`、`sql`、`go`、`rs`、`php`、`c`、`cpp`、`cc`、`h`、`hpp`、`cs`、`diff` | 使用 `highlight.js` 轻量高亮,HTML 按源码展示 | 日志、配置、代码片段 |
75
+ | 代码/文本 | `txt`、`json`、`js`、`mjs`、`cjs`、`css`、`java`、`py`、`html`、`htm`、`jsx`、`ts`、`tsx`、`xml`、`log`、`vue`、`yaml`、`yml`、`ini`、`sh`、`bash`、`sql`、`go`、`rs`、`php`、`c`、`cpp`、`cc`、`h`、`hpp`、`cs`、`diff` | 使用 `highlight.js` 轻量高亮,HTML 按源码展示 | 日志、配置、代码片段、接口响应 |
76
+ | 音频 | `mp3`、`mpeg`、`wav`、`ogg`、`oga`、`opus`、`m4a`、`aac`、`flac`、`weba` | 浏览器原生音频播放,带控制条和基础进度信息 | 录音、播客、语音附件、音效素材 |
54
77
  | 视频 | `mp4` | 浏览器原生视频播放 | 演示视频、录屏 |
55
78
 
56
- ## 三条接入路线
79
+ ## 接入路线
57
80
 
58
81
  ### 1. Vue 3 组件集成
59
82
 
60
- 适合已经在 Vue 3 项目里开发,希望最短路径完成接入的团队。当前在线 Demo 和生产上线均以 `v3` 分支作为最终产物来源。
83
+ 适合已经在 Vue 3 项目里开发,希望最短路径完成接入的团队。React、纯 Web 和后续其他框架适配层都以这套 Vue3 构建产物作为 iframe 预览基线。
61
84
 
62
85
  ```bash
63
86
  pnpm add @flyfish-group/file-viewer3
@@ -71,8 +94,6 @@ import FileViewer from '@flyfish-group/file-viewer3'
71
94
  createApp(App).use(FileViewer).mount('#app')
72
95
  ```
73
96
 
74
- Vue3 入口会自动带上样式,不需要再额外 import CSS。
75
-
76
97
  ```vue
77
98
  <script setup lang="ts">
78
99
  import { ref } from 'vue'
@@ -89,7 +110,7 @@ const url = ref('https://example.com/demo.pdf')
89
110
 
90
111
  ### 2. Vue 2 组件集成
91
112
 
92
- 适合仍在 Vue2.7 技术栈上,希望直接以内嵌组件方式完成接入的团队。Vue2 入口也会自动带上样式,不需要再额外 import CSS。
113
+ 适合仍在 Vue2.7 技术栈上,希望直接以内嵌组件方式完成接入的团队。
93
114
 
94
115
  ```bash
95
116
  pnpm add @flyfish-group/file-viewer
@@ -132,12 +153,54 @@ export default {
132
153
  ```html
133
154
  <iframe
134
155
  id="viewer"
135
- src="https://viewer.flyfish.dev?url=https%3A%2F%2Fexample.com%2Fdemo.docx"
156
+ src="/file-viewer/index.html?url=https%3A%2F%2Fexample.com%2Fdemo.docx"
136
157
  style="width: 100%; height: 100%; border: 0"
137
158
  ></iframe>
138
159
  ```
139
160
 
140
- 更完整的二进制推送方案、`from` 安全校验和宿主页面示例,请查看文档站中的 [Iframe 嵌入说明](https://doc.flyfish.dev/guide/iframe)。
161
+ 更完整的二进制推送方案、`from` 安全校验和宿主页面示例,请查看仓库内的 [Iframe 嵌入说明](docs/guide/iframe.md)。
162
+
163
+ ### 4. React / 纯 Web 子工程
164
+
165
+ React 与纯 Web 适配层不再复制渲染器,只通过 iframe 加载 Vue3 基线预览器产物。包里会携带主工程构建产物,安装后复制到宿主项目 `public/file-viewer`,组件默认加载 `/file-viewer/index.html`,只提供私有化静态部署路线:
166
+
167
+ 官网 Demo 可用于快速验证预览效果,但 React / 纯 JS 组件不会把官网 Demo 地址作为内置 viewer 地址。
168
+
169
+ ```bash
170
+ npm install @flyfish-group/file-viewer-react@1.0.12
171
+ npm install @flyfish-group/file-viewer-web@1.0.12
172
+ ```
173
+
174
+ ```tsx
175
+ import FileViewer from '@flyfish-group/file-viewer-react'
176
+
177
+ export function Preview() {
178
+ return (
179
+ <div style={{ height: '100vh' }}>
180
+ <FileViewer
181
+ url="https://example.com/demo.docx"
182
+ />
183
+ </div>
184
+ )
185
+ }
186
+ ```
187
+
188
+ `@flyfish-group/file-viewer-react` 支持 React 17 / 18 / 19,内部复用 `@flyfish-group/file-viewer-web` 的 iframe 协议工具。鉴权文件仍建议由宿主系统先下载成 `Blob`,再用 `file` + `name` 推送给预览器。静态目录不是 `public/file-viewer` 时,可以运行 `npx file-viewer-copy-assets ./public/vendor/file-viewer` 并覆盖 `viewerUrl="/vendor/file-viewer/index.html"`。
189
+
190
+ 本仓库内置了一个私有化适配层演示应用,覆盖 React 组件和纯 Web helper 两种入口。调试时直接运行:
191
+
192
+ ```bash
193
+ pnpm dev:adapters
194
+ ```
195
+
196
+ 它会先构建并同步 Vue3 基线预览器到演示应用的 `public/file-viewer`,打开本地地址即可看到预览效果。验证静态部署产物时运行:
197
+
198
+ ```bash
199
+ pnpm build:adapter-demo
200
+ pnpm --filter @flyfish-group/file-viewer-demo preview
201
+ ```
202
+
203
+ 确认无误后,`packages/demo/dist` 可以作为普通静态目录部署;其中已经包含 `file-viewer/index.html` 和演示文件。
141
204
 
142
205
  ## 使用说明
143
206
 
@@ -147,7 +210,9 @@ export default {
147
210
  - 预览器会填满父容器,请为父容器提供稳定高度
148
211
  - 使用 `url` 预览时,目标资源需要允许浏览器访问;跨域场景下需要正确配置 CORS
149
212
  - 如果下载地址本身没有明确扩展名,建议先在业务侧取回文件,再包装成 `File`
150
- - OFD、CAD、PDF、Office、Markdown 和代码高亮渲染器都按需异步加载,只有命中格式时才拉取对应代码块
213
+ - PPTX 渲染器会尽量还原常见组合图形、旋转/翻转、主题背景、图片裁剪和 EMF 矢量图片;复杂 Office 特效仍建议用真实业务文件做回归
214
+ - OFD、压缩包、邮件、OLB/DRA、CAD、3D 模型、绘图、EPUB、UMD、PDF、Office、Markdown、音频和代码高亮渲染器都按需异步加载,只有命中格式时才拉取对应代码块
215
+ - `options.watermark` 支持文字或图片水印;`options.toolbar` 可控制下载原文件、打印完整渲染结果和导出 HTML;PDF 打印会逐页生成完整页面,避免只打印当前视口;`options.archive` 可配置 libarchive worker、缓存和体积上限
151
216
 
152
217
  ```ts
153
218
  const blob = await response.blob()
@@ -170,6 +235,9 @@ pnpm dev
170
235
  - `pnpm docs:dev`: 启动 VitePress 文档站
171
236
  - `pnpm docs:build`: 构建文档站
172
237
  - `pnpm type-check`: 执行 TypeScript 类型检查
238
+ - `pnpm dev:adapters`: 启动 React + 纯 JS 适配层 Demo
239
+ - `pnpm build:adapter-demo`: 构建适配层 Demo
240
+ - `pnpm release:adapters:pack`: 打包 React / 纯 JS npm tarball
173
241
 
174
242
  ## 打包发布
175
243
 
@@ -179,6 +247,8 @@ Vue3 和 Vue2 发包时分别在对应分支执行同一套发布链路:
179
247
  | --- | --- | --- |
180
248
  | Vue3 | `v3` | `@flyfish-group/file-viewer3` |
181
249
  | Vue2.7 | `main` | `@flyfish-group/file-viewer` |
250
+ | React | 当前仓库子工程 | `@flyfish-group/file-viewer-react` |
251
+ | 纯 JS | 当前仓库子工程 | `@flyfish-group/file-viewer-web` |
182
252
 
183
253
  建议在发布前执行下面这组命令:
184
254
 
@@ -204,6 +274,15 @@ npm pack
204
274
  pnpm release:pack
205
275
  ```
206
276
 
277
+ React 和纯 JS 适配包发布前执行:
278
+
279
+ ```bash
280
+ pnpm type-check:adapters
281
+ pnpm build:adapter-demo
282
+ pnpm release:adapters:pack
283
+ pnpm release:adapters:publish
284
+ ```
285
+
207
286
  发布到 npm:
208
287
 
209
288
  ```bash
@@ -217,12 +296,12 @@ npm publish --access public
217
296
 
218
297
  ## 文档导航
219
298
 
220
- - [文档导览](https://doc.flyfish.dev/guide/)
221
- - [快速开始](https://doc.flyfish.dev/guide/quickstart)
222
- - [Demo 说明](https://doc.flyfish.dev/guide/demo)
223
- - [组件用法](https://doc.flyfish.dev/guide/usage)
224
- - [支持格式](https://doc.flyfish.dev/guide/formats)
225
- - [本地开发与打包](https://doc.flyfish.dev/guide/development)
299
+ - [文档导览](docs/guide/index.md)
300
+ - [快速开始](docs/guide/quickstart.md)
301
+ - [Demo 说明](docs/guide/demo.md)
302
+ - [组件用法](docs/guide/usage.md)
303
+ - [支持格式](docs/guide/formats.md)
304
+ - [本地开发与打包](docs/guide/development.md)
226
305
 
227
306
  ## 开源说明
228
307
 
@@ -0,0 +1 @@
1
+ const b5=b;function a(){const bF=['resources','thumbnail','build','uvs','triangleProperties','Title','displaycolor','pid','clamp','vertices','3820615Wlyufe','push','setAttribute','toLowerCase','partnumber','specified','inputs','1615656PmFIMh','2917206jhObSX','addExtension','model','8026146ymGeTJ','magFilter','mesh','Type','buffer','minFilter','color','xml','applyMatrix4','object','data','1ggtIMO','getAttribute','texture2d','setPath','manager','nodeName','target','substring','2322gbQOoa','load','name','basematerials','availableExtensions','10267792XGRbwk','texid','keys','displaypropertiesid','8561TvHQqW','querySelectorAll','itemError','810226QLPFqb','length','wrapT','displayname','querySelector','contenttype','components','texture2dgroup'];a=function(){return bF;};return a();}(function(w,x){const b4=b,y=w();while(!![]){try{const z=-parseInt(b4(0x122))/0x1*(-parseInt(b4(0x136))/0x2)+-parseInt(b4(0x114))/0x3+-parseInt(b4(0x113))/0x4+parseInt(b4(0x10c))/0x5+parseInt(b4(0x12a))/0x6*(parseInt(b4(0x133))/0x7)+parseInt(b4(0x12f))/0x8+-parseInt(b4(0x117))/0x9;if(z===x)break;else y['push'](y['shift']());}catch(A){y['push'](y['shift']());}}}(a,0xa09ed));import{L as c,F as d,T as e,G,C as f,i as g,S as h,B as i,a as j,f as k,c as l,g as m,j as n,R as o,k as p,l as r,m as s,n as t,N as u}from'./ModelViewer.js';import{u as v}from'./fflate.module.js';import'vue';import'./index7.js';function b(c,d){c=c-0xfc;const e=a();let f=e[c];return f;}const U=h;class Be extends c{constructor(x){super(x),this['availableExtensions']=[];}[b5(0x12b)](x,y,z,A){const b6=b5,B=this,F=new d(B['manager']);F[b6(0x125)](B['path']),F['setResponseType']('arraybuffer'),F['setRequestHeader'](B['requestHeader']),F['setWithCredentials'](B['withCredentials']),F['load'](x,function(H){const b7=b6;try{y(B['parse'](H));}catch(N){A?A(N):console['error'](N),B[b7(0x126)][b7(0x135)](x);}},z,A);}['parse'](x){const b8=b5,y=this,A=new e(this[b8(0x126)]);function B(az){const b9=b8;let aA=null,aB=null,aC,aD;const aE=[],aF=[];let aG;const aH={},aI={},aJ={},aK=new TextDecoder();try{aA=v(new Uint8Array(az));}catch(aP){if(aP instanceof ReferenceError)return console['error']('THREE.3MFLoader:\x20fflate\x20missing\x20and\x20file\x20is\x20compressed.'),null;}let aL=null;for(aB in aA)aB['match'](/\_rels\/.rels$/)?aC=aB:aB['match'](/3D\/_rels\/.*\.model\.rels$/)?aD=aB:aB['match'](/^3D\/[^\/]*\.model$/)?aL=aB:aB['match'](/^3D\/.*\/.*\.model$/)?aE['push'](aB):aB['match'](/^3D\/Textures?\/.*/)&&aF['push'](aB);if(aE['push'](aL),aC===void 0x0)throw new Error('THREE.ThreeMFLoader:\x20Cannot\x20find\x20relationship\x20file\x20`rels`\x20in\x203MF\x20archive.');const aM=aA[aC],aN=aK['decode'](aM),aO=F(aN);if(aD){const aQ=aA[aD],aR=aK['decode'](aQ);aG=F(aR);}for(let aS=0x0;aS<aE['length'];aS++){const aT=aE[aS],aU=aA[aT],aV=aK['decode'](aU),aW=new DOMParser()['parseFromString'](aV,'application/xml');aW['documentElement'][b9(0x127)][b9(0x10f)]()!=='model'&&console['error']('THREE.3MFLoader:\x20Error\x20loading\x203MF\x20-\x20no\x203MF\x20document\x20found:\x20',aT);const aX=aW[b9(0xfe)]('model'),aY={};for(let b0=0x0;b0<aX['attributes']['length'];b0++){const b1=aX['attributes'][b0];b1[b9(0x12c)]['match'](/^xmlns:(.+)$/)&&(aY[b1['value']]=RegExp['$1']);}const aZ=af(aX);aZ[b9(0x11e)]=aX,0x0<Object['keys'](aY)['length']&&(aZ['extensions']=aY),aH[aT]=aZ;}for(let b2=0x0;b2<aF['length'];b2++){const b3=aF[b2];aJ[b3]=aA[b3][b9(0x11b)];}return{'rels':aO,'modelRels':aG,'model':aH,'printTicket':aI,'texture':aJ};}function F(az){const ba=b8,aA=[],aB=new DOMParser()['parseFromString'](az,'application/xml')['querySelectorAll']('Relationship');for(let aC=0x0;aC<aB['length'];aC++){const aD=aB[aC],aE={'target':aD['getAttribute']('Target'),'id':aD[ba(0x123)]('Id'),'type':aD['getAttribute'](ba(0x11a))};aA[ba(0x10d)](aE);}return aA;}function N(az){const bb=b8,aA={};for(let aB=0x0;aB<az['length'];aB++){const aC=az[aB],aD=aC[bb(0x123)]('name');0x0<=[bb(0x107),'Designer','Description','Copyright','LicenseTerms','Rating','CreationDate','ModificationDate']['indexOf'](aD)&&(aA[aD]=aC['textContent']);}return aA;}function W(az){const aA={'id':az['getAttribute']('id'),'basematerials':[]},aB=az['querySelectorAll']('base');for(let aC=0x0;aC<aB['length'];aC++){const aD=aB[aC],aE=a6(aD);aE['index']=aC,aA['basematerials']['push'](aE);}return aA;}function a0(az){const bc=b8;return{'id':az['getAttribute']('id'),'path':az[bc(0x123)]('path'),'contenttype':az['getAttribute'](bc(0xff)),'tilestyleu':az[bc(0x123)]('tilestyleu'),'tilestylev':az['getAttribute']('tilestylev'),'filter':az[bc(0x123)]('filter')};}function a1(az){const bd=b8,aA={'id':az['getAttribute']('id'),'texid':az[bd(0x123)]('texid'),'displaypropertiesid':az[bd(0x123)]('displaypropertiesid')},aB=az['querySelectorAll']('tex2coord'),aC=[];for(let aD=0x0;aD<aB['length'];aD++){const aE=aB[aD],aF=aE['getAttribute']('u'),aG=aE['getAttribute']('v');aC['push'](parseFloat(aF),parseFloat(aG));}return aA[bd(0x105)]=new Float32Array(aC),aA;}function a2(az){const be=b8,aA={'id':az['getAttribute']('id'),'displaypropertiesid':az[be(0x123)](be(0x132))},aB=az[be(0x134)]('color'),aC=[],aD=new f();for(let aE=0x0;aE<aB['length'];aE++){const aF=aB[aE]['getAttribute']('color');aD['setStyle'](aF['substring'](0x0,0x7),U),aC['push'](aD['r'],aD['g'],aD['b']);}return aA['colors']=new Float32Array(aC),aA;}function a3(az){const bf=b8,aA=az['children'],aB={};for(let aC=0x0;aC<aA['length'];aC++){const aD={'type':aA[aC]['nodeName']['substring'](0x2)};for(let aE=0x0;aE<aA[aC]['attributes']['length'];aE++){const aF=aA[aC]['attributes'][aE];aF[bf(0x111)]&&(aD[aF['name']]=aF['value']);}aB[aA[aC]['getAttribute']('identifier')]=aD;}return aB;}function a4(az){const bg=b8,aA={'id':az['getAttribute']('id'),'displayname':az['getAttribute'](bg(0xfd))},aB=az['children'],aC={};for(let aD=0x0;aD<aB['length'];aD++){const aE=aB[aD];if(aE['nodeName']==='i:in'||aE['nodeName']==='i:out')aC[aE['nodeName']==='i:in'?bg(0x112):'outputs']=a3(aE);else{const aF=aE['children'],aG={'op':aE['nodeName']['substring'](0x2),'identifier':aE[bg(0x123)]('identifier')};for(let aH=0x0;aH<aF['length'];aH++)aG[aF[aH]['nodeName'][bg(0x129)](0x2)]=a3(aF[aH]);aC[aG['identifier']]=aG;}}return aA['operations']=aC,aA;}function a5(az){const bh=b8,aA={'id':az['getAttribute']('id')},aB=az[bh(0x134)]('pbmetallic'),aC=[];for(let aD=0x0;aD<aB['length'];aD++){const aE=aB[aD];aC['push']({'name':aE[bh(0x123)]('name'),'metallicness':parseFloat(aE['getAttribute']('metallicness')),'roughness':parseFloat(aE['getAttribute']('roughness'))});}return aA['data']=aC,aA;}function a6(az){const bi=b8,aA={};return aA['name']=az['getAttribute']('name'),aA[bi(0x108)]=az['getAttribute']('displaycolor'),aA[bi(0x132)]=az['getAttribute'](bi(0x132)),aA;}function a7(az){const bj=b8,aA={},aB=[],aC=az['querySelectorAll']('vertices\x20vertex');for(let aG=0x0;aG<aC['length'];aG++){const aH=aC[aG],aI=aH[bj(0x123)]('x'),aJ=aH[bj(0x123)]('y'),aK=aH['getAttribute']('z');aB['push'](parseFloat(aI),parseFloat(aJ),parseFloat(aK));}aA['vertices']=new Float32Array(aB);const aD=[],aE=[],aF=az['querySelectorAll']('triangles\x20triangle');for(let aL=0x0;aL<aF[bj(0x137)];aL++){const aM=aF[aL],aN=aM['getAttribute']('v1'),aO=aM[bj(0x123)]('v2'),aP=aM['getAttribute']('v3'),aQ=aM['getAttribute']('p1'),aR=aM['getAttribute']('p2'),aS=aM['getAttribute']('p3'),aT=aM['getAttribute']('pid'),aU={};aU['v1']=parseInt(aN,0xa),aU['v2']=parseInt(aO,0xa),aU['v3']=parseInt(aP,0xa),aE[bj(0x10d)](aU['v1'],aU['v2'],aU['v3']),aQ&&(aU['p1']=parseInt(aQ,0xa)),aR&&(aU['p2']=parseInt(aR,0xa)),aS&&(aU['p3']=parseInt(aS,0xa)),aT&&(aU['pid']=aT),0x0<Object['keys'](aU)['length']&&aD['push'](aU);}return aA['triangleProperties']=aD,aA['triangles']=new Uint32Array(aE),aA;}function a8(az){const bk=b8,aA=[],aB=az[bk(0x134)]('component');for(let aC=0x0;aC<aB[bk(0x137)];aC++){const aD=aB[aC],aE=a9(aD);aA[bk(0x10d)](aE);}return aA;}function a9(az){const bl=b8,aA={};aA['objectId']=az['getAttribute']('objectid');const aB=az[bl(0x123)]('transform');return aB&&(aA['transform']=aa(aB)),aA;}function aa(az){const aA=[];az['split']('\x20')['forEach'](function(aC){aA['push'](parseFloat(aC));});const aB=new g();return aB['set'](aA[0x0],aA[0x3],aA[0x6],aA[0x9],aA[0x1],aA[0x4],aA[0x7],aA[0xa],aA[0x2],aA[0x5],aA[0x8],aA[0xb],0x0,0x0,0x0,0x1),aB;}function ab(az){const bm=b8,aA={'type':az['getAttribute']('type')},aB=az[bm(0x123)]('id');aB&&(aA['id']=aB);const aC=az['getAttribute'](bm(0x109));aC&&(aA['pid']=aC);const aD=az[bm(0x123)]('pindex');aD&&(aA['pindex']=aD);const aE=az['getAttribute']('thumbnail');aE&&(aA[bm(0x103)]=aE);const aF=az['getAttribute']('partnumber');aF&&(aA[bm(0x110)]=aF);const aG=az['getAttribute']('name');aG&&(aA[bm(0x12c)]=aG);const aH=az['querySelector']('mesh');aH&&(aA[bm(0x119)]=a7(aH));const aI=az['querySelector']('components');return aI&&(aA[bm(0x100)]=a8(aI)),aA;}function ac(az){const bn=b8,aA={};aA[bn(0x12d)]={};const aB=az['querySelectorAll']('basematerials');for(let aI=0x0;aI<aB['length'];aI++){const aJ=aB[aI],aK=W(aJ);aA[bn(0x12d)][aK['id']]=aK;}aA['texture2d']={};const aC=az['querySelectorAll'](bn(0x124));for(let aL=0x0;aL<aC['length'];aL++){const aM=aC[aL],aN=a0(aM);aA[bn(0x124)][aN['id']]=aN;}aA['colorgroup']={};const aD=az[bn(0x134)]('colorgroup');for(let aO=0x0;aO<aD['length'];aO++){const aP=aD[aO],aQ=a2(aP);aA['colorgroup'][aQ['id']]=aQ;}const aE=az['querySelectorAll']('implicitfunction');aE['length']>0x0&&(aA['implicitfunction']={});for(let aR=0x0;aR<aE['length'];aR++){const aS=aE[aR],aT=a4(aS);aA['implicitfunction'][aT['id']]=aT;}aA['pbmetallicdisplayproperties']={};const aF=az['querySelectorAll']('pbmetallicdisplayproperties');for(let aU=0x0;aU<aF['length'];aU++){const aV=aF[aU],aW=a5(aV);aA['pbmetallicdisplayproperties'][aW['id']]=aW;}aA['texture2dgroup']={};const aG=az['querySelectorAll']('texture2dgroup');for(let aX=0x0;aX<aG['length'];aX++){const aY=aG[aX],aZ=a1(aY);aA[bn(0x101)][aZ['id']]=aZ;}aA[bn(0x120)]={};const aH=az['querySelectorAll']('object');for(let b0=0x0;b0<aH['length'];b0++){const b1=aH[b0],b2=ab(b1);aA['object'][b2['id']]=b2;}return aA;}function ad(az){const bo=b8,aA=[],aB=az['querySelectorAll']('item');for(let aC=0x0;aC<aB[bo(0x137)];aC++){const aD=aB[aC],aE={'objectId':aD['getAttribute']('objectid')},aF=aD[bo(0x123)]('transform');aF&&(aE['transform']=aa(aF)),aA['push'](aE);}return aA;}function af(az){const bp=b8,aA={'unit':az['getAttribute']('unit')||'millimeter'},aB=az['querySelectorAll']('metadata');aB&&(aA['metadata']=N(aB));const aC=az['querySelector'](bp(0x102));aC&&(aA['resources']=ac(aC));const aD=az['querySelector'](bp(0x104));return aD&&(aA['build']=ad(aD)),aA;}function ag(az,aA,aB,aC){const bq=b8,aD=az[bq(0x130)],aE=aB['resources'][bq(0x124)][aD];if(aE){const aF=aC[aE['path']],aG=aE['contenttype'],aH=new Blob([aF],{'type':aG}),aI=URL['createObjectURL'](aH),aJ=A['load'](aI,function(){URL['revokeObjectURL'](aI);});switch(aJ['colorSpace']=U,aE['tilestyleu']){case'wrap':aJ['wrapS']=o;break;case'mirror':aJ['wrapS']=r;break;case'none':case'clamp':aJ['wrapS']=p;break;default:aJ['wrapS']=o;}switch(aE['tilestylev']){case'wrap':aJ[bq(0xfc)]=o;break;case'mirror':aJ['wrapT']=r;break;case'none':case bq(0x10a):aJ['wrapT']=p;break;default:aJ['wrapT']=o;}switch(aE['filter']){case'auto':aJ['magFilter']=s,aJ[bq(0x11c)]=t;break;case'linear':aJ[bq(0x118)]=s,aJ[bq(0x11c)]=s,aJ['generateMipmaps']=!0x1;break;case'nearest':aJ['magFilter']=u,aJ['minFilter']=u,aJ['generateMipmaps']=!0x1;break;default:aJ['magFilter']=s,aJ['minFilter']=t;}return aJ;}else return null;}function ah(az,aA,aB,aC,aD,aE,aF){const br=b8,aG=aF['pindex'],aH={};for(let aK=0x0,aL=aA[br(0x137)];aK<aL;aK++){const aM=aA[aK],aN=aM['p1']!==void 0x0?aM['p1']:aG;aH[aN]===void 0x0&&(aH[aN]=[]),aH[aN]['push'](aM);}const aI=Object['keys'](aH),aJ=[];for(let aO=0x0,aP=aI['length'];aO<aP;aO++){const aQ=aI[aO],aR=aH[aQ],aS=az[br(0x12d)][aQ],aT=aq(aS,aC,aD,aE,aF,ar),aU=new i(),aV=[],aW=aB['vertices'];for(let aY=0x0,aZ=aR[br(0x137)];aY<aZ;aY++){const b0=aR[aY];aV['push'](aW[b0['v1']*0x3+0x0]),aV['push'](aW[b0['v1']*0x3+0x1]),aV[br(0x10d)](aW[b0['v1']*0x3+0x2]),aV['push'](aW[b0['v2']*0x3+0x0]),aV['push'](aW[b0['v2']*0x3+0x1]),aV['push'](aW[b0['v2']*0x3+0x2]),aV['push'](aW[b0['v3']*0x3+0x0]),aV['push'](aW[b0['v3']*0x3+0x1]),aV['push'](aW[b0['v3']*0x3+0x2]);}aU['setAttribute']('position',new j(aV,0x3));const aX=new k(aU,aT);aJ['push'](aX);}return aJ;}function ai(az,aA,aB,aC,aD,aE,aF){const bs=b8,aG=new i(),aH=[],aI=[],aJ=aB['vertices'],aK=az[bs(0x105)];for(let aN=0x0,aO=aA['length'];aN<aO;aN++){const aP=aA[aN];aH['push'](aJ[aP['v1']*0x3+0x0]),aH['push'](aJ[aP['v1']*0x3+0x1]),aH['push'](aJ[aP['v1']*0x3+0x2]),aH['push'](aJ[aP['v2']*0x3+0x0]),aH['push'](aJ[aP['v2']*0x3+0x1]),aH[bs(0x10d)](aJ[aP['v2']*0x3+0x2]),aH[bs(0x10d)](aJ[aP['v3']*0x3+0x0]),aH['push'](aJ[aP['v3']*0x3+0x1]),aH[bs(0x10d)](aJ[aP['v3']*0x3+0x2]),aI['push'](aK[aP['p1']*0x2+0x0]),aI[bs(0x10d)](aK[aP['p1']*0x2+0x1]),aI['push'](aK[aP['p2']*0x2+0x0]),aI['push'](aK[aP['p2']*0x2+0x1]),aI[bs(0x10d)](aK[aP['p3']*0x2+0x0]),aI[bs(0x10d)](aK[aP['p3']*0x2+0x1]);}aG['setAttribute']('position',new j(aH,0x3)),aG['setAttribute']('uv',new j(aI,0x2));const aL=aq(az,aC,aD,aE,aF,ag),aM=new l({'map':aL,'flatShading':!0x0});return new k(aG,aM);}function aj(az,aA,aB,aC){const bt=b8,aD=new i(),aE=[],aF=[],aG=aB[bt(0x10b)],aH=az['colors'];for(let aJ=0x0,aK=aA['length'];aJ<aK;aJ++){const aL=aA[aJ],aM=aL['v1'],aN=aL['v2'],aO=aL['v3'];aE['push'](aG[aM*0x3+0x0]),aE['push'](aG[aM*0x3+0x1]),aE['push'](aG[aM*0x3+0x2]),aE[bt(0x10d)](aG[aN*0x3+0x0]),aE['push'](aG[aN*0x3+0x1]),aE['push'](aG[aN*0x3+0x2]),aE['push'](aG[aO*0x3+0x0]),aE[bt(0x10d)](aG[aO*0x3+0x1]),aE[bt(0x10d)](aG[aO*0x3+0x2]);const aP=aL['p1']!==void 0x0?aL['p1']:aC['pindex'],aQ=aL['p2']!==void 0x0?aL['p2']:aP,aR=aL['p3']!==void 0x0?aL['p3']:aP;aF['push'](aH[aP*0x3+0x0]),aF['push'](aH[aP*0x3+0x1]),aF['push'](aH[aP*0x3+0x2]),aF['push'](aH[aQ*0x3+0x0]),aF['push'](aH[aQ*0x3+0x1]),aF['push'](aH[aQ*0x3+0x2]),aF[bt(0x10d)](aH[aR*0x3+0x0]),aF['push'](aH[aR*0x3+0x1]),aF['push'](aH[aR*0x3+0x2]);}aD[bt(0x10e)]('position',new j(aE,0x3)),aD['setAttribute']('color',new j(aF,0x3));const aI=new l({'vertexColors':!0x0,'flatShading':!0x0});return new k(aD,aI);}function ak(az){const bu=b8,aA=new i();aA['setIndex'](new m(az['triangles'],0x1)),aA[bu(0x10e)]('position',new m(az[bu(0x10b)],0x3));const aB=new l({'name':c['DEFAULT_MATERIAL_NAME'],'color':0xffffff,'flatShading':!0x0});return new k(aA,aB);}function al(az,aA,aB,aC,aD,aE){const bv=b8,aF=Object['keys'](az),aG=[];for(let aH=0x0,aI=aF['length'];aH<aI;aH++){const aJ=aF[aH],aK=az[aJ];switch(am(aJ,aC)){case'material':const aL=aC[bv(0x102)]['basematerials'][aJ],aM=ah(aL,aK,aA,aB,aC,aD,aE);for(let aP=0x0,aQ=aM['length'];aP<aQ;aP++)aG[bv(0x10d)](aM[aP]);break;case'texture':const aN=aC['resources']['texture2dgroup'][aJ];aG['push'](ai(aN,aK,aA,aB,aC,aD,aE));break;case'vertexColors':const aO=aC['resources']['colorgroup'][aJ];aG[bv(0x10d)](aj(aO,aK,aA,aE));break;case'default':aG['push'](ak(aA));break;default:console['error']('THREE.3MFLoader:\x20Unsupported\x20resource\x20type.');}}if(aE['name']){for(let aR=0x0;aR<aG['length'];aR++)aG[aR][bv(0x12c)]=aE['name'];}return aG;}function am(az,aA){const bw=b8;return aA['resources']['texture2dgroup'][az]!==void 0x0?'texture':aA['resources']['basematerials'][az]!==void 0x0?'material':aA[bw(0x102)]['colorgroup'][az]!==void 0x0?'vertexColors':az==='default'?'default':void 0x0;}function an(az,aA){const bx=b8,aB={},aC=az[bx(0x106)],aD=aA[bx(0x109)];for(let aE=0x0,aF=aC['length'];aE<aF;aE++){const aG=aC[aE];let aH=aG['pid']!==void 0x0?aG['pid']:aD;aH===void 0x0&&(aH='default'),aB[aH]===void 0x0&&(aB[aH]=[]),aB[aH]['push'](aG);}return aB;}function ao(az,aA,aB,aC,aD){const aE=new G(),aF=an(az,aD),aG=al(aF,az,aA,aB,aC,aD);for(let aH=0x0,aI=aG['length'];aH<aI;aH++)aE['add'](aG[aH]);return aE;}function ap(az,aA,aB){const by=b8;if(!az)return;const aC=[],aD=Object['keys'](az);for(let aE=0x0;aE<aD['length'];aE++){const aF=aD[aE];for(let aG=0x0;aG<y['availableExtensions'][by(0x137)];aG++){const aH=y[by(0x12e)][aG];aH['ns']===aF&&aC[by(0x10d)](aH);}}for(let aI=0x0;aI<aC['length'];aI++){const aJ=aC[aI];aJ['apply'](aB,az[aJ['ns']],aA);}}function aq(az,aA,aB,aC,aD,aE){const bz=b8;return az[bz(0x104)]!==void 0x0||(az['build']=aE(az,aA,aB,aC,aD)),az[bz(0x104)];}function ar(az,aA,aB){const bA=b8;let aC;const aD=az['displaypropertiesid'],aE=aB['resources']['pbmetallicdisplayproperties'];if(aD!==null&&aE[aD]!==void 0x0){const aH=aE[aD][bA(0x121)][az['index']];aC=new n({'flatShading':!0x0,'roughness':aH['roughness'],'metalness':aH['metallicness']});}else aC=new l({'flatShading':!0x0});aC['name']=az['name'];const aF=az[bA(0x108)],aG=aF['substring'](0x0,0x7);return aC[bA(0x11d)]['setStyle'](aG,U),aF['length']===0x9&&(aC['opacity']=parseInt(aF['charAt'](0x7)+aF['charAt'](0x8),0x10)/0xff),aC;}function as(az,aA,aB,aC){const bB=b8,aD=new G();for(let aE=0x0;aE<az['length'];aE++){const aF=az[aE];let aG=aA[aF['objectId']];aG===void 0x0&&(at(aF['objectId'],aA,aB,aC),aG=aA[aF['objectId']]);const aH=aG['clone'](),aI=aF['transform'];aI&&aH[bB(0x11f)](aI),aD['add'](aH);}return aD;}function at(az,aA,aB,aC){const bC=b8,aD=aB['resources']['object'][az];if(aD['mesh']){const aE=aD['mesh'],aF=aB['extensions'],aG=aB['xml'];ap(aF,aE,aG),aA[aD['id']]=aq(aE,aA,aB,aC,aD,ao);}else{const aH=aD['components'];aA[aD['id']]=aq(aH,aA,aB,aC,aD,as);}aD['name']&&(aA[aD['id']]['name']=aD['name']),aB['resources']['implicitfunction']&&console['warn']('THREE.ThreeMFLoader:\x20Implicit\x20Functions\x20are\x20implemented\x20in\x20data-only.',aB[bC(0x102)]['implicitfunction']);}function au(az){const bD=b8,aA=az[bD(0x116)],aB=az['modelRels'],aC={},aD=Object['keys'](aA),aE={};if(aB)for(let aF=0x0,aG=aB['length'];aF<aG;aF++){const aH=aB[aF],aI=aH['target'][bD(0x129)](0x1);az['texture'][aI]&&(aE[aH['target']]=az['texture'][aI]);}for(let aJ=0x0;aJ<aD['length'];aJ++){const aK=aD[aJ],aL=aA[aK],aM=Object[bD(0x131)](aL[bD(0x102)]['object']);for(let aN=0x0;aN<aM['length'];aN++){const aO=aM[aN];at(aO,aC,aL,aE);}}return aC;}function av(az){for(let aA=0x0;aA<az['length'];aA++){const aB=az[aA];if(aB['target']['split']('.')['pop']()['toLowerCase']()==='model')return aB;}}function aw(az,aA){const bE=b8,aB=new G(),aC=av(aA['rels']),aD=aA['model'][aC[bE(0x128)]['substring'](0x1)]['build'];for(let aE=0x0;aE<aD['length'];aE++){const aF=aD[aE],aG=az[aF['objectId']]['clone'](),aH=aF['transform'];aH&&aG['applyMatrix4'](aH),aB['add'](aG);}return aB;}const ax=B(x),ay=au(ax);return aw(ay,ax);}[b5(0x115)](x){this['availableExtensions']['push'](x);}}export{Be as ThreeMFLoader};
@@ -0,0 +1 @@
1
+ const ap=b;(function(m,n){const ao=b,o=m();while(!![]){try{const p=parseInt(ao(0x1d6))/0x1*(-parseInt(ao(0x1e7))/0x2)+-parseInt(ao(0x1f0))/0x3+-parseInt(ao(0x1ed))/0x4*(-parseInt(ao(0x1e6))/0x5)+parseInt(ao(0x1e8))/0x6+parseInt(ao(0x1da))/0x7*(-parseInt(ao(0x1df))/0x8)+-parseInt(ao(0x1e3))/0x9*(-parseInt(ao(0x1db))/0xa)+parseInt(ao(0x1d3))/0xb;if(p===n)break;else o['push'](o['shift']());}catch(q){o['push'](o['shift']());}}}(a,0xe6598));import{L as c,F as d,G as e,c as f,a as g,C as h,B as i,f as j}from'./ModelViewer.js';function a(){const az=['399mvOSNf','1498990tkpgzL','name','THREE.AMFLoader:\x20Trying\x20to\x20load\x20file\x20asset:\x20','parseFromString','68536JlJwMw','materialid','load','log','9EwBzMl','type','.amf','210UYsgOx','95728JwunEh','8880324FvgblB','triangles','push','textContent','firstElementChild','55164aTdNRj','toLowerCase','AMF','2883180cKrjzC','path','metadata','fromCharCode','add','arraybuffer','value','length','childNodes','AMF\x20Material','materialId','attributes','nodeName','color','5706404KAHGsk','scale','getElementsByTagName','7bqZYAe','meshes','clone','author'];a=function(){return az;};return a();}import{u as l}from'./fflate.module.js';import'vue';import'./index7.js';class k extends c{constructor(m){super(m);}[ap(0x1e1)](m,n,o,q){const aq=ap,r=this,t=new d(r['manager']);t['setPath'](r[aq(0x1c6)]),t['setResponseType'](aq(0x1ca)),t['setRequestHeader'](r['requestHeader']),t['setWithCredentials'](r['withCredentials']),t[aq(0x1e1)](m,function(v){try{n(r['parse'](v));}catch(w){q?q(w):console['error'](w),r['manager']['itemError'](m);}},o,q);}['parse'](q){const ay=ap;function G(a8){const ar=b;let a9=new DataView(a8);if(String[ar(0x1c8)](a9['getUint8'](0x0),a9['getUint8'](0x1))==='PK'){let ac=null,ad=null;console[ar(0x1e2)]('THREE.AMFLoader:\x20Loading\x20Zip');try{ac=l(new Uint8Array(a8));}catch(ae){if(ae instanceof ReferenceError)return console[ar(0x1e2)]('THREE.AMFLoader:\x20fflate\x20missing\x20and\x20file\x20is\x20compressed.'),null;}for(ad in ac)if(ad['toLowerCase']()['slice'](-0x4)===ar(0x1e5))break;console['log'](ar(0x1dd)+ad),a9=new DataView(ac[ad]['buffer']);}const aa=new TextDecoder()['decode'](a9),ab=new DOMParser()[ar(0x1de)](aa,'application/xml');return ab['documentElement'][ar(0x1d1)]['toLowerCase']()!=='amf'?(console['log']('THREE.AMFLoader:\x20Error\x20loading\x20AMF\x20-\x20no\x20AMF\x20document\x20found.'),null):ab;}function J(a8){const as=b;let a9=0x1,aa='millimeter';a8['documentElement']['attributes']['unit']!==void 0x0&&(aa=a8['documentElement']['attributes']['unit']['value'][as(0x1ee)]());const ab={'millimeter':0x1,'inch':25.4,'feet':304.8,'meter':0x3e8,'micron':0.001};return ab[aa]!==void 0x0&&(a9=ab[aa]),console['log']('THREE.AMFLoader:\x20Unit\x20scale:\x20'+a9),a9;}function K(a8){const at=b;let a9=at(0x1ce);const aa=a8[at(0x1d0)]['id']['textContent'];let ab={'r':0x1,'g':0x1,'b':0x1,'a':0x1},ac=null;for(let ad=0x0;ad<a8['childNodes']['length'];ad++){const ae=a8['childNodes'][ad];ae['nodeName']===at(0x1c7)&&ae['attributes']['type']!==void 0x0?ae['attributes'][at(0x1e4)]['value']==='name'&&(a9=ae['textContent']):ae['nodeName']==='color'&&(ab=P(ae));}return ac=new f({'flatShading':!0x0,'color':new h(ab['r'],ab['g'],ab['b']),'name':a9}),ab['a']!==0x1&&(ac['transparent']=!0x0,ac['opacity']=ab['a']),{'id':aa,'material':ac};}function P(a8){const au=b,a9={'r':0x1,'g':0x1,'b':0x1,'a':0x1};for(let aa=0x0;aa<a8[au(0x1cd)]['length'];aa++){const ab=a8['childNodes'][aa];ab['nodeName']==='r'?a9['r']=ab['textContent']:ab['nodeName']==='g'?a9['g']=ab[au(0x1eb)]:ab['nodeName']==='b'?a9['b']=ab['textContent']:ab[au(0x1d1)]==='a'&&(a9['a']=ab['textContent']);}return a9;}function Q(a8){const av=b,a9={'name':'','triangles':[],'materialId':null};let aa=a8['firstElementChild'];for(a8[av(0x1d0)][av(0x1e0)]!==void 0x0&&(a9['materialId']=a8['attributes']['materialid']['nodeValue']);aa;){if(aa['nodeName']==='metadata')aa['attributes']['type']!==void 0x0&&aa['attributes'][av(0x1e4)][av(0x1cb)]===av(0x1dc)&&(a9['name']=aa['textContent']);else{if(aa[av(0x1d1)]==='triangle'){const ab=aa['getElementsByTagName']('v1')[0x0]['textContent'],ac=aa['getElementsByTagName']('v2')[0x0]['textContent'],ad=aa['getElementsByTagName']('v3')[0x0][av(0x1eb)];a9['triangles']['push'](ab,ac,ad);}}aa=aa['nextElementSibling'];}return a9;}function U(a8){const aw=b,a9=[],aa=[];let ab=a8['firstElementChild'];for(;ab;){if(ab['nodeName']==='vertex'){let ac=ab['firstElementChild'];for(;ac;){if(ac[aw(0x1d1)]==='coordinates'){const ad=ac['getElementsByTagName']('x')[0x0]['textContent'],ae=ac['getElementsByTagName']('y')[0x0]['textContent'],af=ac[aw(0x1d5)]('z')[0x0]['textContent'];a9[aw(0x1ea)](ad,ae,af);}else{if(ac['nodeName']==='normal'){const ag=ac[aw(0x1d5)]('nx')[0x0]['textContent'],ah=ac[aw(0x1d5)]('ny')[0x0]['textContent'],ai=ac['getElementsByTagName']('nz')[0x0][aw(0x1eb)];aa['push'](ag,ah,ai);}}ac=ac['nextElementSibling'];}}ab=ab['nextElementSibling'];}return{'vertices':a9,'normals':aa};}function W(a8){const ax=b,a9=a8['attributes']['id'][ax(0x1eb)],aa={'name':'amfobject','meshes':[]};let ab=null,ac=a8[ax(0x1ec)];for(;ac;){if(ac[ax(0x1d1)]==='metadata')ac['attributes']['type']!==void 0x0&&ac['attributes']['type']['value']==='name'&&(aa['name']=ac['textContent']);else{if(ac['nodeName']==='color')ab=P(ac);else{if(ac['nodeName']==='mesh'){let ad=ac['firstElementChild'];const ae={'vertices':[],'normals':[],'volumes':[],'color':ab};for(;ad;){if(ad['nodeName']==='vertices'){const af=U(ad);ae['normals']=ae['normals']['concat'](af['normals']),ae['vertices']=ae['vertices']['concat'](af['vertices']);}else ad['nodeName']==='volume'&&ae['volumes'][ax(0x1ea)](Q(ad));ad=ad['nextElementSibling'];}aa['meshes']['push'](ae);}}}ac=ac['nextElementSibling'];}return{'id':a9,'obj':aa};}const X=G(q);let Y='',Z='';const a0=J(X),a1={},a2={},a3=X['documentElement']['childNodes'];let a4,a5;for(a4=0x0;a4<a3[ay(0x1cc)];a4++){const a8=a3[a4];if(a8['nodeName']==='metadata')a8['attributes']['type']!==void 0x0&&(a8['attributes']['type']['value']===ay(0x1dc)?Y=a8['textContent']:a8['attributes']['type']['value']===ay(0x1d9)&&(Z=a8['textContent']));else{if(a8['nodeName']==='material'){const a9=K(a8);a1[a9['id']]=a9['material'];}else{if(a8['nodeName']==='object'){const aa=W(a8);a2[aa['id']]=aa['obj'];}}}}const a6=new e(),a7=new f({'name':c['DEFAULT_MATERIAL_NAME'],'color':0xaaaaff,'flatShading':!0x0});a6[ay(0x1dc)]=Y,a6['userData'][ay(0x1d9)]=Z,a6['userData']['loader']=ay(0x1ef);for(const ab in a2){const ac=a2[ab],ad=ac[ay(0x1d7)],ae=new e();for(ae['name']=ac['name']||'',a4=0x0;a4<ad['length'];a4++){let af=a7;const ag=ad[a4],ah=new g(ag['vertices'],0x3);let ai=null;if(ag['normals'][ay(0x1cc)]&&(ai=new g(ag['normals'],0x3)),ag['color']){const ak=ag[ay(0x1d2)];af=a7['clone'](),af['color']=new h(ak['r'],ak['g'],ak['b']),ak['a']!==0x1&&(af['transparent']=!0x0,af['opacity']=ak['a']);}const aj=ag['volumes'];for(a5=0x0;a5<aj[ay(0x1cc)];a5++){const al=aj[a5],am=new i();let an=af;am['setIndex'](al[ay(0x1e9)]),am['setAttribute']('position',ah[ay(0x1d8)]()),ai&&am['setAttribute']('normal',ai['clone']()),a1[al['materialId']]!==void 0x0&&(an=a1[al[ay(0x1cf)]]),am[ay(0x1d4)](a0,a0,a0),ae['add'](new j(am,an['clone']()));}}a6[ay(0x1c9)](ae);}return a6;}}function b(c,d){c=c-0x1c6;const e=a();let f=e[c];return f;}export{k as AMFLoader};
@@ -0,0 +1 @@
1
+ (function(r,s){const ax=b,t=r();while(!![]){try{const u=parseInt(ax(0x17c))/0x1+parseInt(ax(0x181))/0x2+-parseInt(ax(0x179))/0x3+-parseInt(ax(0x17a))/0x4*(-parseInt(ax(0x177))/0x5)+parseInt(ax(0x169))/0x6*(-parseInt(ax(0x168))/0x7)+-parseInt(ax(0x17e))/0x8*(parseInt(ax(0x190))/0x9)+parseInt(ax(0x16f))/0xa;if(u===s)break;else t['push'](t['shift']());}catch(v){t['push'](t['shift']());}}}(a,0x3a5f3));import{defineComponent as c,shallowRef as d,ref as e,computed as f,onMounted as g,onBeforeUnmount as i,nextTick as j}from'vue';import{f as k,b as l,c as n,n as o}from'./index7.js';import{r as p}from'./nestedRender.js';function a(){const aO=['previewableCount','push','2758sFdFgt','2544KRQPoS','firstChild','createElement','大文件会在\x20Worker\x20中解析,避免阻塞主线程。','main','filterText','3922890rKLodJ','正在按需解压\x20','error','data','now','key','sort','archiveStats','5wtwNvh','className','593019tLISqR','74356NUGsxZ','span','86158nrQNTl','onsuccess','1099632GaqBkB','filteredEntries','\x20个可直接预览','763384AgJKqH','default','message','filename','正在初始化压缩包解析\x20Worker...','openCursor','...','archive-nested-content','length','body','strong','name','div','v-model','byteLength','18OvrJEM','value','put','archive-viewer','selectedEntry',',请下载后在本地解压。','压缩包内文件\x20','slice','appendChild','model','onerror'];a=function(){return aO;};return a();}function b(c,d){c=c-0x167;const e=a();let f=e[c];return f;}const Q='flyfish-file-viewer-cache',m='archiveEntries',ee=0x1,te=0x18*0x400*0x400,re=0x60*0x400*0x400;let B=null;const ae=()=>typeof indexedDB<'u',P=()=>ae()?B||(B=new Promise((r,s)=>{const ay=b,u=indexedDB['open'](Q,ee);u['onupgradeneeded']=()=>{const v=u['result'];v['objectStoreNames']['contains'](m)||v['createObjectStore'](m,{'keyPath':'key'})['createIndex']('updatedAt','updatedAt');},u[ay(0x17d)]=()=>r(u['result']),u['onerror']=()=>s(u[ay(0x171)]);}),B):Promise['reject'](new Error('IndexedDB\x20不可用')),I=async(r,s)=>{const u=await P();return new Promise((v,x)=>{const az=b,y=u['transaction'](m,r),z=s(y['objectStore'](m));z['onsuccess']=()=>v(z['result']),z['onerror']=()=>x(z[az(0x171)]),y[az(0x19a)]=()=>x(y['error']);});},ne=async r=>{try{return await I('readonly',s=>s['get'](r))||null;}catch{return null;}},se=async()=>{try{const r=await P();await new Promise((s,v)=>{const aA=b,x=r['transaction'](m,'readwrite'),y=x['objectStore'](m),z=y['index']('updatedAt'),A=[];let C=0x0;z[aA(0x186)]()['onsuccess']=D=>{const aB=aA,F=D['target']['result'];if(!F){for(;C>re&&A['length'];){const M=A['shift']();M&&(C-=M['size'],y['delete'](M[aB(0x174)]));}return;}const L=F['value'];C+=L['size']||0x0,A['push']({'key':L[aB(0x174)],'size':L['size']||0x0}),F['continue']();},x['oncomplete']=()=>s(),x['onerror']=()=>v(x['error']);});}catch{}},oe=async r=>{const aC=b;if(!(r['size']>te))try{await I('readwrite',s=>s[aC(0x192)]({...r,'updatedAt':Date['now']()})),await se();}catch{}},ue=c({'__name':'ArchiveViewer','props':{'data':null,'filename':null,'options':null},'setup'(r){const s=r,C=0x140*0x400*0x400,M=0x40*0x400*0x400,V=0x1388,a0=d(null),a1=e([]),a2=e(null),a3=e(!0x1),a4=e('正在读取压缩包目录...'),a5=e(''),a6=e(''),a7=e(null),a8=e(null);let a9;const aa=[],ab=f(()=>s['options']?.['maxArchiveSize']||C),ac=f(()=>s['options']?.['maxEntryPreviewSize']||M),ad=f(()=>s['options']?.['cache']!==!0x1),af=f(()=>({'archive':s['options']})),ag=f(()=>{const aD=b,aq=a1['value']['reduce']((as,at)=>as+at['size'],0x0),ar=a1['value']['filter'](as=>as['previewable'])['length'];return{'count':a1['value'][aD(0x189)],'totalSize':aq,'previewableCount':ar};}),ah=f(()=>{const aE=b,aq=a6[aE(0x191)]['trim']()['toLowerCase']();return(aq?a1['value']['filter'](ar=>ar['path']['toLowerCase']()['includes'](aq)):a1[aE(0x191)])[aE(0x197)](0x0,V);}),ai=async()=>{const aF=b;if(s['options']?.['workerUrl'])return s['options']['workerUrl'];const aq=new URL('/vendor/libarchive/worker-bundle.js',window['location']['href'])['toString']();try{if((await fetch(aq,{'method':'HEAD'}))['ok'])return aq;}catch{}return(await import('./worker-bundle.js'))[aF(0x182)];},aj=()=>{const aG=b;a9?.['$destroy']?.(),a9=void 0x0;const aq=a8[aG(0x191)];if(aq){for(;aq['firstChild'];)aq['removeChild'](aq[aG(0x16a)]);}},ak=async()=>{await a0['value']?.['close']?.(),a0['value']=null;},al=async()=>{const aH=b;if(s['data']['byteLength']>ab[aH(0x191)]){a5[aH(0x191)]='压缩包体积\x20'+k(s['data']['byteLength'])+'\x20超过安全上限\x20'+k(ab['value'])+aH(0x195);return;}a3['value']=!0x0,a4['value']=aH(0x185),a5['value']='';try{const [{Archive:aq},ar]=await Promise['all']([import('./libarchive.js'),ai()]);aq['init']({'workerUrl':ar}),a4['value']='正在读取压缩包目录...';const as=new File([s[aH(0x172)]],s[aH(0x184)]||'archive.bin'),at=await aq['open'](as);a0['value']=at,a7['value']=await at['hasEncryptedData']()['catch'](()=>null);const au=await at['getFilesObject']();a1[aH(0x191)]=l(au)[aH(0x175)]((av,aw)=>av['path']['localeCompare'](aw['path']));}catch(av){console['error'](av),a5['value']=av instanceof Error?av['message']:String(av);}finally{a3['value']=!0x1;}},am=async(aq,ar)=>{const aI=b;await j();const as=a8['value'];if(!as)return;aj();const at=document[aI(0x16b)](aI(0x18d));at[aI(0x178)]=aI(0x188),as['appendChild'](at),a9=await p(ar,aq['extension'],at,{'filename':aq['name'],'options':af['value']});},an=async aq=>{const aJ=b,ar=n(s['filename'],s[aJ(0x172)][aJ(0x18f)],aq);if(ad['value']){const at=await ne(ar);if(at)return at['buffer'];}const as=await(await aq['compressedFile']['extract']())['arrayBuffer']();return ad[aJ(0x191)]&&await oe({'key':ar,'filename':aq['name'],'size':as['byteLength'],'updatedAt':Date[aJ(0x173)](),'buffer':as}),as;},ao=async aq=>{const aK=b;if(a2['value']=aq,aq['size']>ac['value']){a5['value']=aK(0x196)+aq['name']+'\x20体积\x20'+k(aq['size'])+'\x20超过预览上限\x20'+k(ac['value'])+'。';return;}a3['value']=!0x0,a4['value']=aK(0x170)+aq['name']+'...',a5[aK(0x191)]='';try{const ar=await an(aq);a4['value']='正在渲染\x20'+aq[aK(0x18c)]+'...',await am(aq,ar);}catch(as){console['error'](as),a5['value']=as instanceof Error?as[aK(0x183)]:String(as);}finally{a3['value']=!0x1;}},ap=async aq=>{const aL=b;a3['value']=!0x0,a4['value']='正在导出\x20'+aq[aL(0x18c)]+aL(0x187);try{const ar=await an(aq),as=URL['createObjectURL'](new Blob([ar]));aa[aL(0x167)](as);const at=document['createElement']('a');at['href']=as,at['download']=aq['name'],document[aL(0x18a)][aL(0x198)](at),at['click'](),at['remove']();}finally{a3['value']=!0x1;}};return g(()=>{al();}),i(()=>{aj(),ak(),aa['forEach'](aq=>URL['revokeObjectURL'](aq));}),{'__sfc':!0x0,'DEFAULT_MAX_ARCHIVE_SIZE':C,'DEFAULT_MAX_ENTRY_PREVIEW_SIZE':M,'MAX_LISTED_ENTRIES':V,'props':s,'archiveReader':a0,'entries':a1,'selectedEntry':a2,'loading':a3,'loadingText':a4,'error':a5,'filterText':a6,'encrypted':a7,'nestedTarget':a8,'nestedRendered':a9,'objectUrls':aa,'maxArchiveSize':ab,'maxEntryPreviewSize':ac,'cacheEnabled':ad,'nestedViewerOptions':af,'archiveStats':ag,'filteredEntries':ah,'resolveWorkerUrl':ai,'clearNestedPreview':aj,'closeArchive':ak,'openArchive':al,'renderEntryBuffer':am,'extractEntryBuffer':an,'previewEntry':ao,'downloadEntry':ap,'formatBytes':k};}});var ce=function(){const aM=b;var r=this,s=r['_self']['_c'],u=r['_self']['_setupProxy'];return s('section',{'staticClass':aM(0x193)},[s('aside',{'staticClass':'archive-sidebar'},[s('div',{'staticClass':'archive-head'},[s('span',[r['_v']('ARCHIVE')]),s('strong',[r['_v'](r['_s'](r['filename']))]),s('p',[r['_v'](r['_s'](u['archiveStats']['count'])+'\x20个文件\x20·\x20'+r['_s'](u['formatBytes'](u['archiveStats']['totalSize']))+'\x20·\x20'+r['_s'](u[aM(0x176)][aM(0x19b)])+aM(0x180))])]),u['encrypted']?s('div',{'staticClass':'archive-warning'},[r['_v']('检测到加密内容,当前在线预览不接收密码,建议下载后本地解压。')]):r['_e'](),s('input',{'directives':[{'name':aM(0x199),'rawName':aM(0x18e),'value':u[aM(0x16e)],'expression':'filterText'}],'staticClass':'archive-search','attrs':{'type':'search','placeholder':'筛选压缩包内文件'},'domProps':{'value':u['filterText']},'on':{'input':function(v){v['target']['composing']||(u['filterText']=v['target']['value']);}}}),s('div',{'staticClass':'archive-list','attrs':{'role':'list'}},r['_l'](u[aM(0x17f)],function(v){return s('button',{'key':v['id'],'staticClass':'archive-entry','class':{'active':u['selectedEntry']?.['id']===v['id']},'style':{'--entry-depth':v['depth']},'attrs':{'type':'button'},'on':{'click':function(x){return u['previewEntry'](v);}}},[s('span',{'staticClass':'entry-ext'},[r['_v'](r['_s'](v['extension']||'file'))]),s('span',{'staticClass':'entry-copy'},[s('strong',[r['_v'](r['_s'](v['name']))]),s('em',[r['_v'](r['_s'](v['path']))])]),s('small',[r['_v'](r['_s'](u['formatBytes'](v['size'])))])]);}),0x0)]),s(aM(0x16d),{'staticClass':'archive-preview'},[s('div',{'staticClass':'archive-preview-toolbar'},[s('div',[s('span',[r['_v']('压缩包内预览')]),s('strong',[r['_v'](r['_s'](u['selectedEntry']?.[aM(0x18c)]||'请选择一个文件'))])]),u[aM(0x194)]?s('button',{'attrs':{'type':'button'},'on':{'click':function(v){const aN=aM;return u['downloadEntry'](u[aN(0x194)]);}}},[r['_v']('下载文件')]):r['_e']()]),s('div',{'ref':'nestedTarget','staticClass':'archive-nested-target'},[!u['selectedEntry']&&!u['loading']?s('div',{'staticClass':'archive-empty'},[s(aM(0x18b),[r['_v']('选择左侧文件即可预览')]),s('p',[r['_v']('压缩包只读取目录;文件内容会在点击后按需解压,并在体积允许时缓存到\x20IndexedDB。')])]):r['_e']()])]),u['loading']?s(aM(0x18d),{'staticClass':'archive-state'},[s('div',[s(aM(0x17b),{'staticClass':'archive-spinner'}),s('strong',[r['_v'](r['_s'](u['loadingText']))]),s('p',[r['_v'](aM(0x16c))])])]):r['_e'](),u['error']?s('div',{'staticClass':'archive-error'},[s('strong',[r['_v']('压缩包预览提示')]),s('p',[r['_v'](r['_s'](u['error']))])]):r['_e']()]);},ie=[],le=o(ue,ce,ie,!0x1,null,'b0cb5251',null,null);const he=le['exports'];export{he as default};
@@ -0,0 +1 @@
1
+ function c(b,d){b=b-0x16b;const e=a();let f=e[b];return f;}(function(k,l){const Z=c,m=k();while(!![]){try{const o=parseInt(Z(0x179))/0x1+parseInt(Z(0x170))/0x2*(parseInt(Z(0x182))/0x3)+-parseInt(Z(0x176))/0x4*(parseInt(Z(0x180))/0x5)+-parseInt(Z(0x181))/0x6*(parseInt(Z(0x175))/0x7)+parseInt(Z(0x16f))/0x8+parseInt(Z(0x17c))/0x9+-parseInt(Z(0x16d))/0xa*(parseInt(Z(0x183))/0xb);if(o===l)break;else m['push'](m['shift']());}catch(p){m['push'](m['shift']());}}}(a,0x817da));function a(){const a7=['audio/wav','1757151TnqeBh','audio/ogg','handleTimeUpdate','duration','5YgolNd','70842UREYJS','3GwOeAK','13738472UFRbdV','audio/ogg;\x20codecs=opus','playable','progress','audio-meter','_self','10XQNItr','span','4691552nWUtgV','2114984TTODLm','isFinite','value','padStart','createObjectURL','49kcOapk','1691824OUqEJJ','_setupProxy','min','445776byPRKV','audio/flac'];a=function(){return a7;};return a();}import{defineComponent as d,ref as e,computed as f,onMounted as g,watch as h,onBeforeUnmount as i}from'vue';import{n as j}from'./index7.js';const M=d({'__name':'AudioViewer','props':{'data':null,'type':null},'setup'(k){const a0=c,q=k,x=e(null),z=e(''),B=e(0x0),C=e(0x0),E=e(!0x1),G={'aac':'audio/aac','flac':a0(0x17a),'m4a':'audio/mp4','mp3':'audio/mpeg','mpeg':'audio/mpeg','oga':a0(0x17d),'ogg':'audio/ogg','opus':a0(0x184),'wav':a0(0x17b),'weba':'audio/webm'},H=f(()=>q['type']['trim']()['toLowerCase']()),I=f(()=>G[H[a0(0x172)]]||'audio/*'),J=f(()=>H['value']['toUpperCase']()||'AUDIO'),K=f(()=>!Number['isFinite'](C['value'])||C['value']<=0x0?0x0:Math[a0(0x178)](0x64,Math['max'](0x0,B['value']/C['value']*0x64))),N=W=>{const a1=a0;if(!Number[a1(0x171)](W)||W<=0x0)return'00:00';const X=Math['floor'](W/0x3c),Y=Math['floor'](W%0x3c);return String(X)['padStart'](0x2,'0')+':'+String(Y)[a1(0x173)](0x2,'0');},O=()=>{z['value']&&(URL['revokeObjectURL'](z['value']),z['value']='');},P=()=>{const a2=a0;O(),B['value']=0x0,C[a2(0x172)]=0x0,E['value']=!0x1,z['value']=URL[a2(0x174)](new Blob([q['data']],{'type':I['value']}));},Q=()=>{const a3=a0;C['value']=x['value']?.[a3(0x17f)]||0x0,E['value']=!0x0;},V=()=>{const a4=a0;B['value']=x[a4(0x172)]?.['currentTime']||0x0;};return g(P),h(()=>[q['data'],q['type']],P),i(O),{'__sfc':!0x0,'props':q,'audioRef':x,'sourceUrl':z,'currentTime':B,'duration':C,'playable':E,'AUDIO_MIME_MAP':G,'normalizedType':H,'mimeType':I,'displayType':J,'progress':K,'formatTime':N,'revokeSource':O,'createSource':P,'handleLoadedMetadata':Q,'handleTimeUpdate':V};}});var A=function(){const a5=c;var k=this,l=k['_self']['_c'],m=k['_self']['_setupProxy'];return l('div',{'staticClass':'audio-viewer'},[l('section',{'staticClass':'audio-card'},[k['_m'](0x0),l('div',{'staticClass':'audio-copy'},[l(a5(0x16e),{'staticClass':'audio-kicker'},[k['_v'](k['_s'](m['displayType']))]),l('strong',[k['_v']('音频预览')]),l('p',[k['_v']('使用浏览器原生播放器打开,兼容性取决于当前浏览器支持的音频编码。')])]),l('div',{'staticClass':a5(0x16b)},[l(a5(0x16e),[k['_v'](k['_s'](m['formatTime'](m['currentTime'])))]),l('div',{'staticClass':'audio-progress','attrs':{'aria-hidden':'true'}},[l('i',{'style':{'width':m[a5(0x186)]+'%'}})]),l('span',[k['_v'](k['_s'](m[a5(0x185)]?m['formatTime'](m['duration']):'--:--'))])]),l('audio',{'ref':'audioRef','staticClass':'audio-control','attrs':{'src':m['sourceUrl'],'controls':'','preload':'metadata'},'on':{'loadedmetadata':m['handleLoadedMetadata'],'timeupdate':m[a5(0x17e)]}},[k['_v']('\x20当前浏览器不支持音频播放。\x20')])])]);},L=[function(){const a6=c;var k=this,l=k['_self']['_c'];return k[a6(0x16c)][a6(0x177)],l('div',{'staticClass':'audio-art'},[l('span'),l('i')]);}],R=j(M,A,L,!0x1,null,'608bd328',null,null);const S=R['exports'];export{S as default};
@@ -1 +1 @@
1
- function a(){var af=['name','315930VrweAO','379147ZiWTeO','defineProperty','getOwnPropertySymbols','12DZEWrG','283206yQtHyt','cad-body','4aBrFXb','loadArrayBuffer','1026SQrNVx','isOff','string','value','resize','14KFNWbH','cad-viewer','44900LOkTSD','568704IYUbuu','4xkwsfA','map','prototype','setTool','canvas','_self','3411177NrSpkf','status','activeTool','56NsaIfD','4831697VnAxoa','18hIsvrY','select'];a=function(){return af;};return a();}var a7=c;(function(l,m){var a6=c,n=l();while(!![]){try{var o=-parseInt(a6(0x12c))/0x1*(-parseInt(a6(0x132))/0x2)+-parseInt(a6(0x11c))/0x3*(parseInt(a6(0x11d))/0x4)+parseInt(a6(0x12b))/0x5*(parseInt(a6(0x128))/0x6)+-parseInt(a6(0x130))/0x7*(-parseInt(a6(0x126))/0x8)+parseInt(a6(0x134))/0x9*(-parseInt(a6(0x11b))/0xa)+-parseInt(a6(0x123))/0xb*(-parseInt(a6(0x12f))/0xc)+-parseInt(a6(0x127))/0xd*(parseInt(a6(0x119))/0xe);if(o===m)break;else n['push'](n['shift']());}catch(p){n['push'](n['shift']());}}}(a,0x72464));var x=Object[a7(0x12d)],h=Object['defineProperties'],L=Object['getOwnPropertyDescriptors'],C=Object[a7(0x12e)],A=Object[a7(0x11f)]['hasOwnProperty'],B=Object['prototype']['propertyIsEnumerable'],b=(l,m,n)=>m in l?x(l,m,{'enumerable':!0x0,'configurable':!0x0,'writable':!0x0,'value':n}):l[m]=n,T=(l,m)=>{for(var n in m||(m={}))A['call'](m,n)&&b(l,n,m[n]);if(C){for(var n of C(m))B['call'](m,n)&&b(l,n,m[n]);}return l;},D=(l,m)=>h(l,L(m)),v=(l,m,n)=>new Promise((o,p)=>{var u=I=>{try{H(n['next'](I));}catch(J){p(J);}},y=I=>{try{H(n['throw'](I));}catch(J){p(J);}},H=I=>I['done']?o(I['value']):Promise['resolve'](I['value'])['then'](u,y);H((n=n['apply'](l,m))['next']());});import{defineComponent as d,ref as e,onMounted as g,onBeforeUnmount as i,nextTick as j}from'vue';import{n as k}from'./index.js';const $=d({'__name':'CadViewer','props':{'data':null,'type':null},'setup'(H){var a8=a7;const I=H,J=e(null),K=e([]),N=e('pan'),P=e('loading'),Q=e('');let S=null,U=null;const W={'dwg':'DWG\x20是专有\x20CAD\x20格式,当前\x20Apache\x20许可包未内置\x20GPL\x20转换器。请优先上传\x20DXF,或在业务侧转换为\x20DXF\x20后预览。'},X=a3=>a3 instanceof Error?a3['message']:typeof a3==a8(0x116)?a3:JSON['stringify'](a3),Y=a3=>{N['value']=a3,S==null||S['setTool'](a3);},Z=()=>{S==null||S['resize'](),S==null||S['fitToView']();},a0=a3=>{var a9=a8;const a4=a3[a9(0x135)];S==null||S['setLayerVisible'](a3[a9(0x12a)],a4),K['value']=K['value'][a9(0x11e)](a5=>a5['name']===a3['name']?D(T({},a5),{'isOff':!a4}):a5);},a1=()=>v(this,null,function*(){var aa=a8;const a3=J['value'];if(a3){P['value']='loading',Q['value']='';try{const {CadViewer:a4}=yield import('./index2.js');S==null||S['destroy'](),S=new a4(a3,{'theme':'light','initialTool':N['value'],'worker':!0x1}),S[aa(0x133)](I['data']),yield j(),Z(),K['value']=S['getLayers'](),P['value']='ready';}catch(a5){console['error'](a5),P['value']='error',Q['value']=X(a5)||'CAD\x20图纸解析失败';}}}),a2=()=>v(this,null,function*(){var ab=a8;const a3=I['type']['toLowerCase']();if(W[a3]){P[ab(0x117)]='error',Q['value']=W[a3];return;}yield a1();});return g(()=>{a2();const a3=J['value'];a3&&(U=new ResizeObserver(()=>{var ac=c;S==null||S[ac(0x118)](),S==null||S['requestRender']();}),U['observe'](a3));}),i(()=>{U==null||U['disconnect'](),U=null,S==null||S['destroy'](),S=null;}),{'__sfc':!0x0,'props':I,'canvas':J,'layers':K,'activeTool':N,'status':P,'errorMessage':Q,'viewer':S,'resizeObserver':U,'unsupportedMessages':W,'normalizeError':X,'setTool':Y,'fitToView':Z,'toggleLayer':a0,'loadDxf':a1,'load':a2};}});var R=function(){var ad=a7,l=this,m=l['_self']['_c'],o=l[ad(0x122)]['_setupProxy'];return m('div',{'staticClass':ad(0x11a)},[m('div',{'staticClass':'cad-toolbar'},[m('div',{'staticClass':'cad-tools'},[m('button',{'class':{'active':o['activeTool']==='pan'},'attrs':{'type':'button'},'on':{'click':function(p){return o['setTool']('pan');}}},[l['_v']('平移')]),m('button',{'class':{'active':o[ad(0x125)]===ad(0x129)},'attrs':{'type':'button'},'on':{'click':function(p){var ae=ad;return o[ae(0x120)](ae(0x129));}}},[l['_v']('选择')]),m('button',{'class':{'active':o['activeTool']==='measure'},'attrs':{'type':'button'},'on':{'click':function(p){return o['setTool']('measure');}}},[l['_v']('测量')]),m('button',{'attrs':{'type':'button'},'on':{'click':o['fitToView']}},[l['_v']('适配')])]),m('span',[l['_v'](l['_s'](l['type']['toUpperCase']()))])]),m('div',{'staticClass':ad(0x131)},[o['layers']['length']?m('aside',{'staticClass':'cad-layers'},l['_l'](o['layers'],function(p){return m('button',{'key':p['name'],'class':{'muted':p['isOff']},'attrs':{'type':'button'},'on':{'click':function(r){return o['toggleLayer'](p);}}},[l['_v']('\x20'+l['_s'](p['name'])+'\x20')]);}),0x0):l['_e'](),m('div',{'staticClass':'cad-canvas-wrap'},[m('canvas',{'ref':ad(0x121)}),o['status']==='loading'?m('div',{'staticClass':'cad-state'},[l['_v']('正在解析\x20CAD...')]):o[ad(0x124)]==='error'?m('div',{'staticClass':'cad-state\x20error'},[l['_v'](l['_s'](o['errorMessage']))]):l['_e']()])])]);},w=[],G=k($,R,w,!0x1,null,'cf49f0f1',null,null);function c(b,d){b=b-0x116;var e=a();var f=e[b];return f;}const q=G['exports'];export{q as default};
1
+ (function(j,k){const aO=b,l=j();while(!![]){try{const m=-parseInt(aO(0x1e0))/0x1+-parseInt(aO(0x1e3))/0x2+parseInt(aO(0x1c6))/0x3*(-parseInt(aO(0x1ef))/0x4)+parseInt(aO(0x1ca))/0x5*(parseInt(aO(0x1ea))/0x6)+parseInt(aO(0x1e2))/0x7+-parseInt(aO(0x1dd))/0x8*(parseInt(aO(0x1d0))/0x9)+parseInt(aO(0x1d1))/0xa*(parseInt(aO(0x1d6))/0xb);if(m===k)break;else l['push'](l['shift']());}catch(n){l['push'](l['shift']());}}}(a,0x75154));function b(c,d){c=c-0x1c3;const e=a();let f=e[c];return f;}import{defineComponent as c,ref as d,computed as e,onMounted as f,onBeforeUnmount as g,nextTick as h}from'vue';import{n as i}from'./index7.js';const _e=c({'__name':'CadViewer','props':{'data':null,'type':null},'setup'(l){const aP=b,o=l,r=d(null),t=d([]),y=d('pan'),A=d('loading'),C=d(''),D=d(''),E=d(''),I=d(0x1);let K=null,L=null;const M=new TextDecoder('utf-8'),P=0x708,Q=P*P,R={'AC1015':'AutoCAD\x202000/2000i/2002','AC1018':'AutoCAD\x202004/2005/2006','AC1021':'AutoCAD\x202007/2008/2009','AC1024':aP(0x1da),'AC1027':'AutoCAD\x202013/2014/2015/2016/2017','AC1032':'AutoCAD\x202018/2019/2020/2021/2022/2023/2024'},S=aj=>aj instanceof Error?aj[aP(0x1c3)]:typeof aj=='string'?aj:JSON[aP(0x1ed)](aj),a0=()=>{D['value']&&(URL['revokeObjectURL'](D['value']),D['value']='');},a1=aj=>Number(Math['min'](0x4,Math[aP(0x1d4)](0.35,aj))[aP(0x1df)](0x2)),a2=e(()=>({'width':I['value']*0x64+'%'})),a3=aj=>{I['value']=a1(I['value']+aj);},a4=aj=>new Promise((ak,al)=>{const am=URL['createObjectURL'](aj),an=new Image();an['onload']=()=>{URL['revokeObjectURL'](am),ak(an);},an['onerror']=()=>{URL['revokeObjectURL'](am),al(new Error('DWG\x20预览图加载失败'));},an['src']=am;}),a5=(aj,ak,al)=>{const am=[0x0,(ak-0x1)*0x4,(al-0x1)*ak*0x4,((al-0x1)*ak+ak-0x1)*0x4],an=am['reduce']((ao,ap)=>(ao['r']+=aj[ap],ao['g']+=aj[ap+0x1],ao['b']+=aj[ap+0x2],ao['a']+=aj[ap+0x3],ao),{'r':0x0,'g':0x0,'b':0x0,'a':0x0});return{'r':an['r']/am['length'],'g':an['g']/am['length'],'b':an['b']/am['length'],'a':an['a']/am['length']};},a6=(aj,ak,al)=>{const am=aj[ak]-al['r'],an=aj[ak+0x1]-al['g'],ao=aj[ak+0x2]-al['b'],ap=aj[ak+0x3]-al['a'];return Math['sqrt'](am*am+an*an+ao*ao+ap*ap);},a7=(aj,ak,al)=>aj[ak+0x3]<=0xc?!0x1:a6(aj,ak,al)>0x1c,a8=async aj=>{const aQ=aP,ak=await a4(aj),al=ak['naturalWidth']||ak['width'],am=ak['naturalHeight']||ak['height'];if(!al||!am)return{'blob':aj,'cropped':!0x1};const an=Math['min'](0x1,P/Math[aQ(0x1d4)](al,am),Math['sqrt'](Q/(al*am))),ao=Math['max'](0x1,Math[aQ(0x1d3)](al*an)),ap=Math['max'](0x1,Math['round'](am*an)),aq=document[aQ(0x1c5)]('canvas');aq['width']=ao,aq['height']=ap;const ar=aq['getContext']('2d',{'willReadFrequently':!0x0});if(!ar)return{'blob':aj,'cropped':!0x1};ar['drawImage'](ak,0x0,0x0,ao,ap);const as=ar['getImageData'](0x0,0x0,ao,ap),at=a5(as['data'],ao,ap);let au=ao,av=ap,aw=-0x1,ax=-0x1;for(let aK=0x0;aK<ap;aK+=0x1)for(let aL=0x0;aL<ao;aL+=0x1){const aM=(aK*ao+aL)*0x4;a7(as['data'],aM,at)&&(au=Math[aQ(0x1d2)](au,aL),av=Math['min'](av,aK),aw=Math['max'](aw,aL),ax=Math['max'](ax,aK));}if(aw<au||ax<av)return{'blob':aj,'cropped':!0x1};const ay=aw-au+0x1,az=ax-av+0x1;if(ay/ao>0.94&&az/ap>0.94)return{'blob':aj,'cropped':!0x1};const aA=Math['max'](0x8,Math['round'](Math['max'](ay,az)*0.04)),aB=Math['max'](0x0,Math[aQ(0x1ee)]((au-aA)/an)),aC=Math['max'](0x0,Math['floor']((av-aA)/an)),aD=Math['min'](al,Math['ceil']((aw+aA+0x1)/an)),aE=Math['min'](am,Math['ceil']((ax+aA+0x1)/an)),aF=aD-aB,aG=aE-aC;if(aF<=0x0||aG<=0x0)return{'blob':aj,'cropped':!0x1};const aH=document['createElement']('canvas');aH['width']=aF,aH['height']=aG;const aI=aH['getContext']('2d');if(!aI)return{'blob':aj,'cropped':!0x1};aI['drawImage'](ak,aB,aC,aF,aG,0x0,0x0,aF,aG);const aJ=await new Promise(aN=>{aH['toBlob'](aN,'image/png');});return{'blob':aJ||aj,'cropped':!!aJ};},a9=(aj,ak,al=0x0)=>{const aR=aP;for(let am=al;am<=aj[aR(0x1e6)]-ak['length'];am+=0x1){let an=!0x0;for(let ao=0x0;ao<ak['length'];ao+=0x1)if(aj[am+ao]!==ak[ao]){an=!0x1;break;}if(an)return am;}return-0x1;},aa=()=>{const aS=aP,aj=new Uint8Array(o['data']),ak=a9(aj,[0x89,0x50,0x4e,0x47,0xd,0xa,0x1a,0xa]);if(ak>=0x0){const an=a9(aj,[0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82],ak);if(an>ak)return new Blob([aj['slice'](ak,an+0x8)],{'type':'image/png'});}const al=a9(aj,[0xff,0xd8,0xff]);if(al>=0x0){const ao=a9(aj,[0xff,0xd9],al+0x3);if(ao>al)return new Blob([aj['slice'](al,ao+0x2)],{'type':'image/jpeg'});}const am=a9(aj,[0x42,0x4d]);if(am>=0x0&&am+0x6<aj['length']){const ap=new DataView(o['data'],am)['getUint32'](0x2,!0x0);if(ap>0xe&&am+ap<=aj[aS(0x1e6)])return new Blob([aj[aS(0x1cd)](am,am+ap)],{'type':'image/bmp'});}return null;},ab=()=>{const aT=aP,aj=new Uint8Array(o[aT(0x1e7)]['slice'](0x0,0x40));return Array['from'](aj)['map'](ak=>ak>=0x20&&ak<=0x7e?String[aT(0x1c7)](ak):'\x20')[aT(0x1c8)]('')[aT(0x1cf)]();},ac=()=>{const aU=aP,aj=M[aU(0x1c4)](o['data']['slice'](0x0,Math['min'](o['data'][aU(0x1e4)],0x200)));return/\bSECTION\b/['test'](aj)||/\$ACADVER/['test'](aj);},ad=aj=>{y['value']=aj,K?.['setTool'](aj);},ae=()=>{const aV=aP;if(A[aV(0x1ec)]===aV(0x1d9)){I[aV(0x1ec)]=0x1;return;}K?.['resize'](),K?.[aV(0x1d7)]();},af=aj=>{const aW=aP,ak=aj['isOff'];K?.['setLayerVisible'](aj['name'],ak),t[aW(0x1ec)]=t['value']['map'](al=>al['name']===aj['name']?{...al,'isOff':!ak}:al);},ag=async()=>{const aX=aP,aj=r[aX(0x1ec)];if(aj){A[aX(0x1ec)]='loading',C[aX(0x1ec)]='',I['value']=0x1,a0();try{const {CadViewer:ak}=await import('./index22.js');K?.['destroy'](),K=new ak(aj,{'theme':'light','initialTool':y[aX(0x1ec)],'worker':!0x1}),K[aX(0x1de)](o['data']),await h(),ae(),t['value']=K['getLayers'](),A[aX(0x1ec)]='ready';}catch(al){console['error'](al),A['value']='error',C['value']=S(al)||'CAD\x20图纸解析失败';}}},ah=async()=>{const aY=aP;if(ac()){await ag();return;}A['value']='loading',C['value']='',a0();const aj=ab()['slice'](0x0,0x6),ak=R[aj]?aj+'('+R[aj]+')':aj||'未知\x20DWG\x20版本',al=aa();if(al){const am=await a8(al);D['value']=URL['createObjectURL'](am['blob']),E['value']='已从\x20DWG\x20二进制中提取内嵌预览图,版本\x20'+ak+'。'+(am['cropped']?'已自动裁剪空白边距,便于查看有效内容。':'')+'这是文件保存时写入的快照,不等同于完整\x20CAD\x20几何解析。',A['value']='preview';return;}A['value']=aY(0x1e1),C['value']='DWG\x20是专有二进制\x20CAD\x20格式,当前\x20Apache-2.0\x20前端包未内置\x20GPL\x20或闭源\x20DWG\x20解码器;此文件也没有可提取的内嵌预览图。请在业务侧转换为\x20DXF\x20后预览,或接入私有服务端转换链路。检测到的版本为\x20'+ak+'。';},ai=async()=>{if(o['type']['toLowerCase']()==='dwg'){await ah();return;}await ag();};return f(()=>{const b0=aP;ai();const aj=r['value'];aj&&(L=new ResizeObserver(()=>{const aZ=b;K?.['resize'](),K?.[aZ(0x1cc)]();}),L[b0(0x1dc)](aj));}),g(()=>{const b1=aP;L?.[b1(0x1cb)](),L=null,K?.['destroy'](),K=null,a0();}),{'__sfc':!0x0,'props':o,'canvas':r,'layers':t,'activeTool':y,'status':A,'errorMessage':C,'previewUrl':D,'previewMessage':E,'previewZoom':I,'viewer':K,'resizeObserver':L,'decoder':M,'PREVIEW_ANALYSIS_MAX_SIZE':P,'PREVIEW_MAX_ANALYSIS_PIXELS':Q,'dwgVersions':R,'normalizeError':S,'revokePreview':a0,'clampPreviewZoom':a1,'previewImageStyle':a2,'zoomPreview':a3,'loadImage':a4,'getCornerBackground':a5,'colorDistance':a6,'shouldKeepPreviewPixel':a7,'cropDwgPreview':a8,'findSequence':a9,'extractDwgPreview':aa,'getCadHeader':ab,'looksLikeDxf':ac,'setTool':ad,'fitToView':ae,'toggleLayer':af,'loadDxf':ag,'loadDwg':ah,'load':ai};}});var Ce=function(){const b2=b;var j=this,k=j['_self']['_c'],l=j[b2(0x1c9)]['_setupProxy'];return k('div',{'staticClass':'cad-viewer'},[k('div',{'staticClass':'cad-toolbar'},[k('div',{'staticClass':b2(0x1d5)},[k('button',{'class':{'active':l[b2(0x1d8)]===b2(0x1e8)},'attrs':{'type':b2(0x1db)},'on':{'click':function(m){const b3=b2;return l['setTool'](b3(0x1e8));}}},[j['_v']('平移')]),k(b2(0x1db),{'class':{'active':l['activeTool']==='select'},'attrs':{'type':b2(0x1db)},'on':{'click':function(m){return l['setTool']('select');}}},[j['_v']('选择')]),k('button',{'class':{'active':l['activeTool']==='measure'},'attrs':{'type':'button'},'on':{'click':function(m){return l['setTool']('measure');}}},[j['_v']('测量')]),k('button',{'attrs':{'type':'button'},'on':{'click':l['fitToView']}},[j['_v']('适配')]),l['status']==='preview'?[k(b2(0x1db),{'attrs':{'type':'button','title':'缩小\x20DWG\x20预览'},'on':{'click':function(m){return l['zoomPreview'](-0.15);}}},[j['_v']('-')]),k('span',{'staticClass':'cad-zoom'},[j['_v'](j['_s'](Math[b2(0x1d3)](l['previewZoom']*0x64))+'%')]),k(b2(0x1db),{'attrs':{'type':'button','title':'放大\x20DWG\x20预览'},'on':{'click':function(m){return l['zoomPreview'](0.15);}}},[j['_v']('+')])]:j['_e']()],0x2),k('span',[j['_v'](j['_s'](j['type']['toUpperCase']()))])]),k('div',{'staticClass':'cad-body','class':{'without-layers':!l['layers']['length']}},[l['layers']['length']?k('aside',{'staticClass':'cad-layers'},j['_l'](l['layers'],function(m){return k('button',{'key':m['name'],'class':{'muted':m['isOff']},'attrs':{'type':'button'},'on':{'click':function(o){return l['toggleLayer'](m);}}},[j['_v']('\x20'+j['_s'](m['name'])+'\x20')]);}),0x0):j['_e'](),k('div',{'staticClass':'cad-canvas-wrap'},[k('canvas',{'ref':'canvas'}),l['status']==='loading'?k('div',{'staticClass':'cad-state'},[j['_v']('正在解析\x20CAD...')]):l['status']==='preview'?k('div',{'staticClass':'dwg-preview'},[k('div',{'staticClass':'dwg-preview-frame'},[k('img',{'style':l[b2(0x1ce)],'attrs':{'src':l[b2(0x1eb)],'alt':'DWG\x20内嵌预览图'}})]),k('p',[j['_v'](j['_s'](l['previewMessage']))])]):l[b2(0x1e5)]==='error'?k('div',{'staticClass':'cad-state\x20error'},[j['_v'](j['_s'](l[b2(0x1e9)]))]):j['_e']()])])]);},ye=[],Me=i(_e,Ce,ye,!0x1,null,'4d603439',null,null);const xe=Me['exports'];export{xe as default};function a(){const b4=['createElement','3Wacezc','fromCharCode','join','_self','150145gTydtx','disconnect','requestRender','slice','previewImageStyle','trim','252Mwtoyi','26660230EFzvJS','min','round','max','cad-tools','11DJTjEk','fitToView','activeTool','preview','AutoCAD\x202010/2011/2012','button','observe','137176HsmoOn','loadArrayBuffer','toFixed','727324dmAMgY','error','3130484RaaTVg','1569762NhqUwS','byteLength','status','length','data','pan','errorMessage','54WlcJnN','previewUrl','value','stringify','floor','3646412AfjQfZ','message','decode'];a=function(){return b4;};return a();}