@l1yp/file-viewer 0.1.1 → 0.1.2

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 (431) hide show
  1. package/README.md +1 -0
  2. package/dist/FileViewer.js +2 -0
  3. package/dist/FileViewer.js.map +1 -0
  4. package/dist/FileViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  5. package/dist/FileViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  6. package/dist/components/AppxViewer.js +2 -0
  7. package/dist/components/AppxViewer.js.map +1 -0
  8. package/dist/components/AppxViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  9. package/dist/components/AppxViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  10. package/dist/components/ArchiveBrowser.js +2 -0
  11. package/dist/components/ArchiveBrowser.js.map +1 -0
  12. package/dist/components/ArchiveBrowser.vue_vue_type_script_setup_true_lang.js +2 -0
  13. package/dist/components/ArchiveBrowser.vue_vue_type_script_setup_true_lang.js.map +1 -0
  14. package/dist/components/AudioViewer.js +2 -0
  15. package/dist/components/AudioViewer.js.map +1 -0
  16. package/dist/components/AudioViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  17. package/dist/components/AudioViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  18. package/dist/components/BinObjBrowser.js +2 -0
  19. package/dist/components/BinObjBrowser.js.map +1 -0
  20. package/dist/components/BinObjBrowser.vue_vue_type_script_setup_true_lang.js +2 -0
  21. package/dist/components/BinObjBrowser.vue_vue_type_script_setup_true_lang.js.map +1 -0
  22. package/dist/components/CertViewer.js +2 -0
  23. package/dist/components/CertViewer.js.map +1 -0
  24. package/dist/components/CertViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  25. package/dist/components/CertViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  26. package/dist/components/ClassViewer.js +2 -0
  27. package/dist/components/ClassViewer.js.map +1 -0
  28. package/dist/components/ClassViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  29. package/dist/components/ClassViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  30. package/dist/components/CodeBlock.js +2 -0
  31. package/dist/components/CodeBlock.js.map +1 -0
  32. package/dist/components/CodeBlock.vue_vue_type_script_setup_true_lang.js +2 -0
  33. package/dist/components/CodeBlock.vue_vue_type_script_setup_true_lang.js.map +1 -0
  34. package/dist/components/CodeView.js +2 -0
  35. package/dist/components/CodeView.js.map +1 -0
  36. package/dist/components/CodeView.vue_vue_type_script_setup_true_lang.js +2 -0
  37. package/dist/components/CodeView.vue_vue_type_script_setup_true_lang.js.map +1 -0
  38. package/dist/components/CsvViewer.js +2 -0
  39. package/dist/components/CsvViewer.js.map +1 -0
  40. package/dist/components/CsvViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  41. package/dist/components/CsvViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  42. package/dist/components/DicomViewer.js +2 -0
  43. package/dist/components/DicomViewer.js.map +1 -0
  44. package/dist/components/DicomViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  45. package/dist/components/DicomViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  46. package/dist/components/DocxNavigationPane.js +2 -0
  47. package/dist/components/DocxNavigationPane.js.map +1 -0
  48. package/dist/components/DocxNavigationPane.vue_vue_type_script_setup_true_lang.js +2 -0
  49. package/dist/components/DocxNavigationPane.vue_vue_type_script_setup_true_lang.js.map +1 -0
  50. package/dist/components/DocxViewer.js +2 -0
  51. package/dist/components/DocxViewer.js.map +1 -0
  52. package/dist/components/DocxViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  53. package/dist/components/DocxViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  54. package/dist/components/DrawioViewer.js +2 -0
  55. package/dist/components/DrawioViewer.js.map +1 -0
  56. package/dist/components/DrawioViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  57. package/dist/components/DrawioViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  58. package/dist/components/DxfViewer.js +2 -0
  59. package/dist/components/DxfViewer.js.map +1 -0
  60. package/dist/components/DxfViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  61. package/dist/components/DxfViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  62. package/dist/components/EbookViewer.js +2 -0
  63. package/dist/components/EbookViewer.js.map +1 -0
  64. package/dist/components/EbookViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  65. package/dist/components/EbookViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  66. package/dist/components/EmlViewer.js +2 -0
  67. package/dist/components/EmlViewer.js.map +1 -0
  68. package/dist/components/EmlViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  69. package/dist/components/EmlViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  70. package/dist/components/EplViewer.js +2 -0
  71. package/dist/components/EplViewer.js.map +1 -0
  72. package/dist/components/EplViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  73. package/dist/components/EplViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  74. package/dist/components/FileViewerBody.js +2 -0
  75. package/dist/components/FileViewerBody.js.map +1 -0
  76. package/dist/components/FileViewerBody.vue_vue_type_script_setup_true_lang.js +2 -0
  77. package/dist/components/FileViewerBody.vue_vue_type_script_setup_true_lang.js.map +1 -0
  78. package/dist/components/FileViewerPanel.js +2 -0
  79. package/dist/components/FileViewerPanel.js.map +1 -0
  80. package/dist/components/FileViewerPanel.vue_vue_type_script_setup_true_lang.js +2 -0
  81. package/dist/components/FileViewerPanel.vue_vue_type_script_setup_true_lang.js.map +1 -0
  82. package/dist/components/FontViewer.js +2 -0
  83. package/dist/components/FontViewer.js.map +1 -0
  84. package/dist/components/FontViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  85. package/dist/components/FontViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  86. package/dist/components/FrontmatterCard.js +2 -0
  87. package/dist/components/FrontmatterCard.js.map +1 -0
  88. package/dist/components/FrontmatterCard.vue_vue_type_script_setup_true_lang.js +2 -0
  89. package/dist/components/FrontmatterCard.vue_vue_type_script_setup_true_lang.js.map +1 -0
  90. package/dist/components/GeoViewer.js +2 -0
  91. package/dist/components/GeoViewer.js.map +1 -0
  92. package/dist/components/GeoViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  93. package/dist/components/GeoViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  94. package/dist/components/HarViewer.js +2 -0
  95. package/dist/components/HarViewer.js.map +1 -0
  96. package/dist/components/HarViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  97. package/dist/components/HarViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  98. package/dist/components/HexViewer.js +2 -0
  99. package/dist/components/HexViewer.js.map +1 -0
  100. package/dist/components/HexViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  101. package/dist/components/HexViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  102. package/dist/components/HprofViewer.js +2 -0
  103. package/dist/components/HprofViewer.js.map +1 -0
  104. package/dist/components/HprofViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  105. package/dist/components/HprofViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  106. package/dist/components/ImageLightbox.js +2 -0
  107. package/dist/components/ImageLightbox.js.map +1 -0
  108. package/dist/components/ImageLightbox.vue_vue_type_script_setup_true_lang.js +2 -0
  109. package/dist/components/ImageLightbox.vue_vue_type_script_setup_true_lang.js.map +1 -0
  110. package/dist/components/InlineText.js +2 -0
  111. package/dist/components/InlineText.js.map +1 -0
  112. package/dist/components/JksViewer.js +2 -0
  113. package/dist/components/JksViewer.js.map +1 -0
  114. package/dist/components/JksViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  115. package/dist/components/JksViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  116. package/dist/components/JsonlViewer.js +2 -0
  117. package/dist/components/JsonlViewer.js.map +1 -0
  118. package/dist/components/JsonlViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  119. package/dist/components/JsonlViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  120. package/dist/components/LogViewer.js +2 -0
  121. package/dist/components/LogViewer.js.map +1 -0
  122. package/dist/components/LogViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  123. package/dist/components/LogViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  124. package/dist/components/LrcViewer.js +2 -0
  125. package/dist/components/LrcViewer.js.map +1 -0
  126. package/dist/components/LrcViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  127. package/dist/components/LrcViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  128. package/dist/components/MarkdownTable.js +2 -0
  129. package/dist/components/MarkdownTable.js.map +1 -0
  130. package/dist/components/MarkdownTable.vue_vue_type_script_setup_true_lang.js +2 -0
  131. package/dist/components/MarkdownTable.vue_vue_type_script_setup_true_lang.js.map +1 -0
  132. package/dist/components/MarkdownText.js +2 -0
  133. package/dist/components/MarkdownText.js.map +1 -0
  134. package/dist/components/MhtViewer.js +2 -0
  135. package/dist/components/MhtViewer.js.map +1 -0
  136. package/dist/components/MhtViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  137. package/dist/components/MhtViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  138. package/dist/components/MindMapView.js +2 -0
  139. package/dist/components/MindMapView.js.map +1 -0
  140. package/dist/components/MindMapView.vue_vue_type_script_setup_true_lang.js +2 -0
  141. package/dist/components/MindMapView.vue_vue_type_script_setup_true_lang.js.map +1 -0
  142. package/dist/components/MissingDependency.js +2 -0
  143. package/dist/components/MissingDependency.js.map +1 -0
  144. package/dist/components/MissingDependency.vue_vue_type_script_setup_true_lang.js +2 -0
  145. package/dist/components/MissingDependency.vue_vue_type_script_setup_true_lang.js.map +1 -0
  146. package/dist/components/ModelViewer.js +2 -0
  147. package/dist/components/ModelViewer.js.map +1 -0
  148. package/dist/components/ModelViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  149. package/dist/components/ModelViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  150. package/dist/components/MsiViewer.js +2 -0
  151. package/dist/components/MsiViewer.js.map +1 -0
  152. package/dist/components/MsiViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  153. package/dist/components/MsiViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  154. package/dist/components/NotebookViewer.js +2 -0
  155. package/dist/components/NotebookViewer.js.map +1 -0
  156. package/dist/components/NotebookViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  157. package/dist/components/NotebookViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  158. package/dist/components/PdfViewer.js +2 -0
  159. package/dist/components/PdfViewer.js.map +1 -0
  160. package/dist/components/PdfViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  161. package/dist/components/PdfViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  162. package/dist/components/PptxNavigationPane.js +2 -0
  163. package/dist/components/PptxNavigationPane.js.map +1 -0
  164. package/dist/components/PptxNavigationPane.vue_vue_type_script_setup_true_lang.js +2 -0
  165. package/dist/components/PptxNavigationPane.vue_vue_type_script_setup_true_lang.js.map +1 -0
  166. package/dist/components/PptxViewer.js +3 -1
  167. package/dist/components/PptxViewer.js.map +1 -0
  168. package/dist/components/PptxViewer.vue_vue_type_script_setup_true_lang.js +55 -49
  169. package/dist/components/PptxViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  170. package/dist/components/PsdViewer.js +2 -0
  171. package/dist/components/PsdViewer.js.map +1 -0
  172. package/dist/components/PsdViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  173. package/dist/components/PsdViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  174. package/dist/components/QmcAudioViewer.js +2 -0
  175. package/dist/components/QmcAudioViewer.js.map +1 -0
  176. package/dist/components/QmcAudioViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  177. package/dist/components/QmcAudioViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  178. package/dist/components/RasterViewer.js +2 -0
  179. package/dist/components/RasterViewer.js.map +1 -0
  180. package/dist/components/RasterViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  181. package/dist/components/RasterViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  182. package/dist/components/RtfViewer.js +2 -0
  183. package/dist/components/RtfViewer.js.map +1 -0
  184. package/dist/components/RtfViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  185. package/dist/components/RtfViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  186. package/dist/components/SevenZipBrowser.js +2 -0
  187. package/dist/components/SevenZipBrowser.js.map +1 -0
  188. package/dist/components/SevenZipBrowser.vue_vue_type_script_setup_true_lang.js +2 -0
  189. package/dist/components/SevenZipBrowser.vue_vue_type_script_setup_true_lang.js.map +1 -0
  190. package/dist/components/SqliteViewer.js +2 -0
  191. package/dist/components/SqliteViewer.js.map +1 -0
  192. package/dist/components/SqliteViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  193. package/dist/components/SqliteViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  194. package/dist/components/SubtitleViewer.js +2 -0
  195. package/dist/components/SubtitleViewer.js.map +1 -0
  196. package/dist/components/SubtitleViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  197. package/dist/components/SubtitleViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  198. package/dist/components/XlsxChart.js +2 -0
  199. package/dist/components/XlsxChart.js.map +1 -0
  200. package/dist/components/XlsxChart.vue_vue_type_script_setup_true_lang.js +2 -0
  201. package/dist/components/XlsxChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  202. package/dist/components/XlsxViewer.js +2 -0
  203. package/dist/components/XlsxViewer.js.map +1 -0
  204. package/dist/components/XlsxViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  205. package/dist/components/XlsxViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  206. package/dist/components/XmindViewer.js +2 -0
  207. package/dist/components/XmindViewer.js.map +1 -0
  208. package/dist/components/XmindViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  209. package/dist/components/XmindViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  210. package/dist/components/ZipBrowser.js +2 -0
  211. package/dist/components/ZipBrowser.js.map +1 -0
  212. package/dist/components/ZipBrowser.vue_vue_type_script_setup_true_lang.js +2 -0
  213. package/dist/components/ZipBrowser.vue_vue_type_script_setup_true_lang.js.map +1 -0
  214. package/dist/components/ZoomImage.js +2 -0
  215. package/dist/components/ZoomImage.js.map +1 -0
  216. package/dist/components/ZoomImage.vue_vue_type_script_setup_true_lang.js +2 -0
  217. package/dist/components/ZoomImage.vue_vue_type_script_setup_true_lang.js.map +1 -0
  218. package/dist/components/epl/EplCodeBlock.js +2 -0
  219. package/dist/components/epl/EplCodeBlock.js.map +1 -0
  220. package/dist/components/epl/EplCodeBlock.vue_vue_type_script_setup_true_lang.js +2 -0
  221. package/dist/components/epl/EplCodeBlock.vue_vue_type_script_setup_true_lang.js.map +1 -0
  222. package/dist/components/epl/EplDoc.js +2 -0
  223. package/dist/components/epl/EplDoc.js.map +1 -0
  224. package/dist/components/epl/EplDoc.vue_vue_type_script_setup_true_lang.js +2 -0
  225. package/dist/components/epl/EplDoc.vue_vue_type_script_setup_true_lang.js.map +1 -0
  226. package/dist/components/epl/EplMethod.js +2 -0
  227. package/dist/components/epl/EplMethod.js.map +1 -0
  228. package/dist/components/epl/EplMethod.vue_vue_type_script_setup_true_lang.js +2 -0
  229. package/dist/components/epl/EplMethod.vue_vue_type_script_setup_true_lang.js.map +1 -0
  230. package/dist/components/epl/EplResource.js +2 -0
  231. package/dist/components/epl/EplResource.js.map +1 -0
  232. package/dist/components/epl/EplResource.vue_vue_type_script_setup_true_lang.js +2 -0
  233. package/dist/components/epl/EplResource.vue_vue_type_script_setup_true_lang.js.map +1 -0
  234. package/dist/components/epl/EplTree.js +2 -0
  235. package/dist/components/epl/EplTree.js.map +1 -0
  236. package/dist/components/epl/EplTree.vue_vue_type_script_setup_true_lang.js +2 -0
  237. package/dist/components/epl/EplTree.vue_vue_type_script_setup_true_lang.js.map +1 -0
  238. package/dist/components/epl/EplVarTable.js +2 -0
  239. package/dist/components/epl/EplVarTable.js.map +1 -0
  240. package/dist/components/epl/EplVarTable.vue_vue_type_script_setup_true_lang.js +2 -0
  241. package/dist/components/epl/EplVarTable.vue_vue_type_script_setup_true_lang.js.map +1 -0
  242. package/dist/components/epl/numbering.js +2 -0
  243. package/dist/components/epl/numbering.js.map +1 -0
  244. package/dist/components/icons/Icon.js +2 -0
  245. package/dist/components/icons/Icon.js.map +1 -0
  246. package/dist/components/icons/Icon.vue_vue_type_script_setup_true_lang.js +2 -0
  247. package/dist/components/icons/Icon.vue_vue_type_script_setup_true_lang.js.map +1 -0
  248. package/dist/components/icons/iconPaths.js +2 -0
  249. package/dist/components/icons/iconPaths.js.map +1 -0
  250. package/dist/components/optionalViewer.js +2 -0
  251. package/dist/components/optionalViewer.js.map +1 -0
  252. package/dist/components/ui/ClampBlock.js +2 -0
  253. package/dist/components/ui/ClampBlock.js.map +1 -0
  254. package/dist/composables/useElementNavigation.js +2 -0
  255. package/dist/composables/useElementNavigation.js.map +1 -0
  256. package/dist/composables/useFileViewer.js +2 -0
  257. package/dist/composables/useFileViewer.js.map +1 -0
  258. package/dist/composables/useLightbox.js +2 -0
  259. package/dist/composables/useLightbox.js.map +1 -0
  260. package/dist/composables/useLogRules.js +2 -0
  261. package/dist/composables/useLogRules.js.map +1 -0
  262. package/dist/lib/aes.js +2 -0
  263. package/dist/lib/aes.js.map +1 -0
  264. package/dist/lib/appx.js +2 -0
  265. package/dist/lib/appx.js.map +1 -0
  266. package/dist/lib/archiveHtml.js +2 -0
  267. package/dist/lib/archiveHtml.js.map +1 -0
  268. package/dist/lib/asn1.js +2 -0
  269. package/dist/lib/asn1.js.map +1 -0
  270. package/dist/lib/binobj.js +2 -0
  271. package/dist/lib/binobj.js.map +1 -0
  272. package/dist/lib/brotli.js +2 -0
  273. package/dist/lib/brotli.js.map +1 -0
  274. package/dist/lib/bzip2.js +2 -0
  275. package/dist/lib/bzip2.js.map +1 -0
  276. package/dist/lib/classfile.js +2 -0
  277. package/dist/lib/classfile.js.map +1 -0
  278. package/dist/lib/codePreview.js +2 -0
  279. package/dist/lib/codePreview.js.map +1 -0
  280. package/dist/lib/codefold.js +2 -0
  281. package/dist/lib/codefold.js.map +1 -0
  282. package/dist/lib/codeformat.js +2 -0
  283. package/dist/lib/codeformat.js.map +1 -0
  284. package/dist/lib/csv.js +2 -0
  285. package/dist/lib/csv.js.map +1 -0
  286. package/dist/lib/des.js +2 -0
  287. package/dist/lib/des.js.map +1 -0
  288. package/dist/lib/diagram.js +2 -0
  289. package/dist/lib/diagram.js.map +1 -0
  290. package/dist/lib/dicom.js +2 -0
  291. package/dist/lib/dicom.js.map +1 -0
  292. package/dist/lib/dicomCodecs.js +2 -0
  293. package/dist/lib/dicomCodecs.js.map +1 -0
  294. package/dist/lib/dicomRender.js +2 -0
  295. package/dist/lib/dicomRender.js.map +1 -0
  296. package/dist/lib/docxNavigation.js +2 -0
  297. package/dist/lib/docxNavigation.js.map +1 -0
  298. package/dist/lib/dxf.js +2 -0
  299. package/dist/lib/dxf.js.map +1 -0
  300. package/dist/lib/eml.js +2 -0
  301. package/dist/lib/eml.js.map +1 -0
  302. package/dist/lib/encoding.js +2 -0
  303. package/dist/lib/encoding.js.map +1 -0
  304. package/dist/lib/epl/code/codeDataParser.js +2 -0
  305. package/dist/lib/epl/code/codeDataParser.js.map +1 -0
  306. package/dist/lib/epl/code/codeLines.js +2 -0
  307. package/dist/lib/epl/code/codeLines.js.map +1 -0
  308. package/dist/lib/epl/code/textCode.js +2 -0
  309. package/dist/lib/epl/code/textCode.js.map +1 -0
  310. package/dist/lib/epl/eplDocument.js +2 -0
  311. package/dist/lib/epl/eplDocument.js.map +1 -0
  312. package/dist/lib/epl/imageList.js +2 -0
  313. package/dist/lib/epl/imageList.js.map +1 -0
  314. package/dist/lib/epl/index.js +2 -0
  315. package/dist/lib/epl/index.js.map +1 -0
  316. package/dist/lib/epl/io/binaryReader.js +2 -0
  317. package/dist/lib/epl/io/binaryReader.js.map +1 -0
  318. package/dist/lib/epl/io/encoding.js +2 -0
  319. package/dist/lib/epl/io/encoding.js.map +1 -0
  320. package/dist/lib/epl/model/eplSystemId.js +2 -0
  321. package/dist/lib/epl/model/eplSystemId.js.map +1 -0
  322. package/dist/lib/epl/names/eplLibData.js +2 -0
  323. package/dist/lib/epl/names/eplLibData.js.map +1 -0
  324. package/dist/lib/epl/names/idToNameMap.js +2 -0
  325. package/dist/lib/epl/names/idToNameMap.js.map +1 -0
  326. package/dist/lib/epl/names/libNameProvider.js +2 -0
  327. package/dist/lib/epl/names/libNameProvider.js.map +1 -0
  328. package/dist/lib/epl/program.js +2 -0
  329. package/dist/lib/epl/program.js.map +1 -0
  330. package/dist/lib/epl/projectFileReader.js +2 -0
  331. package/dist/lib/epl/projectFileReader.js.map +1 -0
  332. package/dist/lib/fb2.js +2 -0
  333. package/dist/lib/fb2.js.map +1 -0
  334. package/dist/lib/fileType.js +2 -0
  335. package/dist/lib/fileType.js.map +1 -0
  336. package/dist/lib/fonts.js +2 -0
  337. package/dist/lib/fonts.js.map +1 -0
  338. package/dist/lib/format.js +2 -0
  339. package/dist/lib/format.js.map +1 -0
  340. package/dist/lib/frontmatter.js +2 -0
  341. package/dist/lib/frontmatter.js.map +1 -0
  342. package/dist/lib/geo.js +2 -0
  343. package/dist/lib/geo.js.map +1 -0
  344. package/dist/lib/har.js +2 -0
  345. package/dist/lib/har.js.map +1 -0
  346. package/dist/lib/highlight.js +2 -0
  347. package/dist/lib/highlight.js.map +1 -0
  348. package/dist/lib/highlightLangs.js +2 -0
  349. package/dist/lib/highlightLangs.js.map +1 -0
  350. package/dist/lib/hprof.js +2 -0
  351. package/dist/lib/hprof.js.map +1 -0
  352. package/dist/lib/ipynb.js +2 -0
  353. package/dist/lib/ipynb.js.map +1 -0
  354. package/dist/lib/jks.js +2 -0
  355. package/dist/lib/jks.js.map +1 -0
  356. package/dist/lib/jsonl.js +2 -0
  357. package/dist/lib/jsonl.js.map +1 -0
  358. package/dist/lib/lrc.js +2 -0
  359. package/dist/lib/lrc.js.map +1 -0
  360. package/dist/lib/lzma.js +2 -0
  361. package/dist/lib/lzma.js.map +1 -0
  362. package/dist/lib/markdown/blocks.js +2 -0
  363. package/dist/lib/markdown/blocks.js.map +1 -0
  364. package/dist/lib/markdown/inline.js +2 -0
  365. package/dist/lib/markdown/inline.js.map +1 -0
  366. package/dist/lib/markdown/math.js +2 -0
  367. package/dist/lib/markdown/math.js.map +1 -0
  368. package/dist/lib/markdown/segmentize.js +2 -0
  369. package/dist/lib/markdown/segmentize.js.map +1 -0
  370. package/dist/lib/markdown/styles.js +2 -0
  371. package/dist/lib/markdown/styles.js.map +1 -0
  372. package/dist/lib/mht.js +2 -0
  373. package/dist/lib/mht.js.map +1 -0
  374. package/dist/lib/midi.js +2 -0
  375. package/dist/lib/midi.js.map +1 -0
  376. package/dist/lib/mime.js +2 -0
  377. package/dist/lib/mime.js.map +1 -0
  378. package/dist/lib/mindmap.js +2 -0
  379. package/dist/lib/mindmap.js.map +1 -0
  380. package/dist/lib/mobi.js +2 -0
  381. package/dist/lib/mobi.js.map +1 -0
  382. package/dist/lib/msi.js +2 -0
  383. package/dist/lib/msi.js.map +1 -0
  384. package/dist/lib/optionalDep.js +2 -0
  385. package/dist/lib/optionalDep.js.map +1 -0
  386. package/dist/lib/pkcs12.js +2 -0
  387. package/dist/lib/pkcs12.js.map +1 -0
  388. package/dist/lib/pptxNavigation.js +2 -0
  389. package/dist/lib/pptxNavigation.js.map +1 -0
  390. package/dist/lib/qmc.js +2 -0
  391. package/dist/lib/qmc.js.map +1 -0
  392. package/dist/lib/rar.js +2 -0
  393. package/dist/lib/rar.js.map +1 -0
  394. package/dist/lib/rawPreview.js +2 -0
  395. package/dist/lib/rawPreview.js.map +1 -0
  396. package/dist/lib/rc2.js +2 -0
  397. package/dist/lib/rc2.js.map +1 -0
  398. package/dist/lib/resolveInput.js +2 -0
  399. package/dist/lib/resolveInput.js.map +1 -0
  400. package/dist/lib/rtf.js +2 -0
  401. package/dist/lib/rtf.js.map +1 -0
  402. package/dist/lib/sevenZip.js +2 -0
  403. package/dist/lib/sevenZip.js.map +1 -0
  404. package/dist/lib/sha1.js +2 -0
  405. package/dist/lib/sha1.js.map +1 -0
  406. package/dist/lib/sha256.js +2 -0
  407. package/dist/lib/sha256.js.map +1 -0
  408. package/dist/lib/speechAudio.js +2 -0
  409. package/dist/lib/speechAudio.js.map +1 -0
  410. package/dist/lib/sqlite.js +2 -0
  411. package/dist/lib/sqlite.js.map +1 -0
  412. package/dist/lib/subtitle.js +2 -0
  413. package/dist/lib/subtitle.js.map +1 -0
  414. package/dist/lib/tarball.js +2 -0
  415. package/dist/lib/tarball.js.map +1 -0
  416. package/dist/lib/viewerFormats.js +2 -0
  417. package/dist/lib/viewerFormats.js.map +1 -0
  418. package/dist/lib/viewerKind.js +2 -0
  419. package/dist/lib/viewerKind.js.map +1 -0
  420. package/dist/lib/x509.js +2 -0
  421. package/dist/lib/x509.js.map +1 -0
  422. package/dist/lib/xlsx.js +2 -0
  423. package/dist/lib/xlsx.js.map +1 -0
  424. package/dist/lib/xlsxCharts.js +2 -0
  425. package/dist/lib/xlsxCharts.js.map +1 -0
  426. package/dist/lib/xmind.js +2 -0
  427. package/dist/lib/xmind.js.map +1 -0
  428. package/dist/lib/zip.js +2 -0
  429. package/dist/lib/zip.js.map +1 -0
  430. package/dist/style.css +1 -1
  431. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xlsxCharts.js","names":[],"sources":["../../src/lib/xlsxCharts.ts"],"sourcesContent":["/**\n * Extract embedded **charts** from an `.xlsx` for the spreadsheet preview.\n *\n * exceljs parses cells and styles but NOT charts (and a workbook can hold native line/bar/pie charts with no\n * raster image anywhere — `wb.model.media` is empty). So we read them ourselves: an `.xlsx` is a ZIP, and we\n * already have a dependency-free reader ({@link readZip}/{@link extractZipEntry}). We walk\n * worksheet → drawing → chart, parse the chart's cached series/categories straight out of the OOXML\n * (`<c:numCache>`/`<c:strCache>` — the values Excel last computed, so no recomputation needed), and hand the\n * viewer a small model it renders as SVG ({@link XlsxChart}). Browser-only (DOMParser + DecompressionStream);\n * charts simply don't appear under SSR.\n */\nimport { extractZipEntry, readZip, zipSupported, type ZipEntry } from '@/lib/zip'\n\nexport type ChartType = 'line' | 'bar' | 'barH' | 'pie' | 'area' | 'scatter' | 'unknown'\n\nexport interface ChartSeries {\n name: string\n /** Series line/fill colour as CSS `#RRGGBB`, when the chart specifies one. */\n color?: string\n /** Cached y-values, one per category (null = a gap/blank point). */\n values: (number | null)[]\n}\n\n/** Where a chart sits on the sheet — top-left cell + pixel size, converted from the drawing anchor's EMUs. */\nexport interface ChartAnchor {\n /** 0-based column / row of the anchor's top-left cell. */\n fromCol: number\n fromRow: number\n /** Pixel offset into that cell, and the chart's pixel width/height (from the frame's EMU extent). */\n offX: number\n offY: number\n wPx: number\n hPx: number\n}\n\nexport interface XlsxChart {\n type: ChartType\n title: string\n categories: string[]\n series: ChartSeries[]\n /** Explicit value-axis bounds, when the chart pins them (else the renderer auto-scales). */\n yMin?: number\n yMax?: number\n anchor: ChartAnchor\n}\n\nconst EMU_PER_PX = 9525 // 914400 EMU per inch / 96 px per inch\nconst emuToPx = (emu: number): number => Math.round(emu / EMU_PER_PX)\n\n// Descendants matching a localName, regardless of namespace prefix (xdr:/c:/a: vary by producer).\nfunction tags(el: Element | Document, localName: string): Element[] {\n return Array.from(el.getElementsByTagNameNS('*', localName))\n}\nfunction tag(el: Element | Document, localName: string): Element | undefined {\n return el.getElementsByTagNameNS('*', localName)[0]\n}\nfunction attrVal(el: Element | undefined): string | undefined {\n return el?.getAttribute('val') ?? undefined\n}\n\n// Resolve an OOXML relationship target (often \"../charts/chart3.xml\") against the part that referenced it.\nfunction resolvePath(baseDir: string, rel: string): string {\n const parts = (baseDir ? baseDir.split('/') : []).concat(rel.split('/'))\n const out: string[] = []\n for (const p of parts) {\n if (p === '' || p === '.') continue\n if (p === '..') out.pop()\n else out.push(p)\n }\n return out.join('/')\n}\nconst dirOf = (path: string): string => path.split('/').slice(0, -1).join('/')\n\n/** A loader bound to one workbook's ZIP: lazily inflate + XML-parse parts, cached by path. */\nfunction makeLoader(\n buf: ArrayBuffer,\n entries: ZipEntry[],\n): (path: string) => Promise<Document | null> {\n const byPath = new Map(entries.map((e) => [e.path, e]))\n const cache = new Map<string, Promise<Document | null>>()\n const decoder = new TextDecoder('utf-8')\n return (path: string) => {\n let p = cache.get(path)\n if (!p) {\n p = (async () => {\n const e = byPath.get(path)\n if (!e) return null\n const bytes = await extractZipEntry(buf, e)\n const doc = new DOMParser().parseFromString(decoder.decode(bytes), 'application/xml')\n return doc.querySelector('parsererror') ? null : doc\n })()\n cache.set(path, p)\n }\n return p\n }\n}\n\n// Parse a \"rels\" part into { relId → resolved absolute path }.\nfunction relsMap(doc: Document | null, baseDir: string): Map<string, string> {\n const m = new Map<string, string>()\n if (!doc) return m\n for (const r of tags(doc, 'Relationship')) {\n const id = r.getAttribute('Id')\n const target = r.getAttribute('Target')\n if (id && target && !/^[a-z]+:\\/\\//i.test(target)) m.set(id, resolvePath(baseDir, target))\n }\n return m\n}\n\n// Pull the ordered category labels (or numbers) out of a <c:cat>'s cached points.\nfunction readCacheStrings(parent: Element | undefined): string[] {\n if (!parent) return []\n const cache = tag(parent, 'strCache') || tag(parent, 'numCache')\n if (!cache) return []\n const count = parseInt(attrVal(tag(cache, 'ptCount')) || '0', 10) || 0\n const out: string[] = Array.from({ length: count }, () => '')\n for (const pt of tags(cache, 'pt')) {\n const idx = parseInt(pt.getAttribute('idx') || '-1', 10)\n const v = tag(pt, 'v')?.textContent ?? ''\n if (idx >= 0) {\n if (idx >= out.length) out.length = idx + 1\n out[idx] = v\n }\n }\n return out\n}\n\n// Pull cached numeric values out of a <c:val>'s numCache (blank/non-numeric → null).\nfunction readCacheNumbers(parent: Element | undefined): (number | null)[] {\n if (!parent) return []\n const cache = tag(parent, 'numCache') || tag(parent, 'strCache')\n if (!cache) return []\n const count = parseInt(attrVal(tag(cache, 'ptCount')) || '0', 10) || 0\n const out: (number | null)[] = Array.from({ length: count }, () => null)\n for (const pt of tags(cache, 'pt')) {\n const idx = parseInt(pt.getAttribute('idx') || '-1', 10)\n const raw = tag(pt, 'v')?.textContent\n const n = raw == null || raw === '' ? null : Number(raw)\n if (idx >= 0) {\n if (idx >= out.length) out.length = idx + 1\n out[idx] = n != null && Number.isFinite(n) ? n : null\n }\n }\n return out\n}\n\nfunction chartTypeOf(plot: Element): ChartType {\n if (tag(plot, 'lineChart')) return 'line'\n if (tag(plot, 'barChart')) {\n const dir = attrVal(tag(tag(plot, 'barChart')!, 'barDir'))\n return dir === 'bar' ? 'barH' : 'bar'\n }\n if (tag(plot, 'pieChart') || tag(plot, 'doughnutChart')) return 'pie'\n if (tag(plot, 'areaChart')) return 'area'\n if (tag(plot, 'scatterChart')) return 'scatter'\n return 'unknown'\n}\n\n// First explicit series colour: prefer the line stroke, else any solid fill in the series' shape props.\nfunction seriesColor(ser: Element): string | undefined {\n const spPr = tag(ser, 'spPr')\n if (!spPr) return undefined\n const ln = tag(spPr, 'ln')\n const clr = (ln && tag(ln, 'srgbClr')) || tag(spPr, 'srgbClr')\n const val = clr?.getAttribute('val')\n return val && /^[0-9a-fA-F]{6}$/.test(val) ? `#${val}` : undefined\n}\n\nfunction parseChart(doc: Document): Omit<XlsxChart, 'anchor'> | null {\n const plot = tag(doc, 'plotArea')\n if (!plot) return null\n const type = chartTypeOf(plot)\n // Title: concatenate the rich-text runs under <c:title>.\n const titleEl = tag(doc, 'title')\n const title = titleEl\n ? tags(titleEl, 't')\n .map((t) => t.textContent ?? '')\n .join('')\n .trim()\n : ''\n\n let categories: string[] = []\n const series: ChartSeries[] = []\n for (const ser of tags(plot, 'ser')) {\n const cats = readCacheStrings(tag(ser, 'cat'))\n if (cats.length > categories.length) categories = cats\n const txV = tag(tag(ser, 'tx') || ser, 'v')?.textContent\n series.push({\n name: (txV || `系列 ${series.length + 1}`).trim(),\n color: seriesColor(ser),\n values: readCacheNumbers(tag(ser, 'val')),\n })\n }\n\n // Value-axis explicit bounds, if any.\n let yMin: number | undefined\n let yMax: number | undefined\n for (const ax of tags(plot, 'valAx')) {\n const sc = tag(ax, 'scaling')\n if (!sc) continue\n const mx = attrVal(tag(sc, 'max'))\n const mn = attrVal(tag(sc, 'min'))\n if (mx != null && Number.isFinite(Number(mx))) yMax = Number(mx)\n if (mn != null && Number.isFinite(Number(mn))) yMin = Number(mn)\n }\n return { type, title, categories, series, yMin, yMax }\n}\n\n// Read a drawing's anchors, resolving each graphicFrame's chart part via the drawing's own rels.\nasync function parseDrawing(\n drawingPath: string,\n load: (path: string) => Promise<Document | null>,\n): Promise<XlsxChart[]> {\n const doc = await load(drawingPath)\n if (!doc) return []\n const rels = relsMap(\n await load(`${dirOf(drawingPath)}/_rels/${drawingPath.split('/').pop()}.rels`),\n dirOf(drawingPath),\n )\n const out: XlsxChart[] = []\n for (const anchor of [...tags(doc, 'twoCellAnchor'), ...tags(doc, 'oneCellAnchor')]) {\n const frame = tag(anchor, 'graphicFrame')\n if (!frame) continue\n const chartRef = tag(frame, 'chart') // <c:chart r:id=\"rIdN\"/>\n const rId =\n chartRef?.getAttributeNS(\n 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',\n 'id',\n ) || chartRef?.getAttribute('r:id')\n const chartPath = rId ? rels.get(rId) : undefined\n if (!chartPath) continue\n const chartDoc = await load(chartPath)\n if (!chartDoc) continue\n const parsed = parseChart(chartDoc)\n if (!parsed || !parsed.series.length) continue\n\n const from = tag(anchor, 'from')\n const fromCol = parseInt(tag(from!, 'col')?.textContent || '0', 10)\n const fromRow = parseInt(tag(from!, 'row')?.textContent || '0', 10)\n const offX = emuToPx(parseInt(tag(from!, 'colOff')?.textContent || '0', 10))\n const offY = emuToPx(parseInt(tag(from!, 'rowOff')?.textContent || '0', 10))\n const ext = tag(frame, 'ext') // <a:ext cx cy> in EMU\n const wPx = ext ? emuToPx(parseInt(ext.getAttribute('cx') || '0', 10)) : 384\n const hPx = ext ? emuToPx(parseInt(ext.getAttribute('cy') || '0', 10)) : 230\n out.push({ ...parsed, anchor: { fromCol, fromRow, offX, offY, wPx, hPx } })\n }\n return out\n}\n\n/**\n * Parse every chart in the workbook, grouped by worksheet **name** (matching {@link XlsxSheet.name}). Returns\n * an empty map under SSR or if the bytes can't be unzipped — charts are a best-effort enhancement, never fatal.\n */\nexport async function parseXlsxCharts(buf: ArrayBuffer): Promise<Map<string, XlsxChart[]>> {\n const result = new Map<string, XlsxChart[]>()\n if (!zipSupported() || typeof DOMParser === 'undefined') return result\n let entries: ZipEntry[]\n try {\n entries = readZip(buf)\n } catch {\n return result\n }\n const load = makeLoader(buf, entries)\n\n const wb = await load('xl/workbook.xml')\n if (!wb) return result\n const wbRels = relsMap(await load('xl/_rels/workbook.xml.rels'), 'xl')\n\n for (const sheetEl of tags(wb, 'sheet')) {\n const name = sheetEl.getAttribute('name') || ''\n const rId =\n sheetEl.getAttributeNS(\n 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',\n 'id',\n ) || sheetEl.getAttribute('r:id')\n const sheetPath = rId ? wbRels.get(rId) : undefined\n if (!sheetPath) continue\n const sheetRels = relsMap(\n await load(`${dirOf(sheetPath)}/_rels/${sheetPath.split('/').pop()}.rels`),\n dirOf(sheetPath),\n )\n // Find the worksheet's drawing relationship, then its charts.\n const sheetDoc = await load(sheetPath)\n const drawingEl = sheetDoc ? tag(sheetDoc, 'drawing') : undefined\n const drawRid =\n drawingEl?.getAttributeNS(\n 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',\n 'id',\n ) || drawingEl?.getAttribute('r:id')\n const drawingPath = drawRid ? sheetRels.get(drawRid) : undefined\n if (!drawingPath) continue\n const charts = await parseDrawing(drawingPath, load)\n if (charts.length) result.set(name, charts)\n }\n return result\n}\n"],"mappings":"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"}
package/dist/lib/xmind.js CHANGED
@@ -122,3 +122,5 @@ function p(e, t) {
122
122
  }
123
123
  //#endregion
124
124
  export { r as parseXmind };
125
+
126
+ //# sourceMappingURL=xmind.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xmind.js","names":[],"sources":["../../src/lib/xmind.ts"],"sourcesContent":["/**\n * In-browser XMind workbook reader — no dependency beyond the project's own ZIP reader.\n *\n * An `.xmind` file is a ZIP container (like docx / appx). Its content lives in one of two members:\n * - `content.json` — the modern format (XMind 2020+/Zen): a JSON array of sheets, each with a `rootTopic`\n * whose `children.attached` (and `children.detached`) nest sub-topics. A topic carries `title`, optional\n * `href` (hyperlink), `notes.plain.content` (or `notes.realHTML.content`), and `labels`.\n * - `content.xml` — the legacy format: `<xmap-content><sheet><topic><title/><children><topics\n * type=\"attached\"><topic>…</topic></topics></children></topic></sheet></xmap-content>`.\n *\n * We unzip just the content member with the project's ZIP reader (lib/zip.ts — browser-native DEFLATE) and\n * normalize it into the shared {@link MindMap} tree, so the existing MindMapView renders it exactly like an\n * OPML / FreeMind mind map (a single right-growing tree; multi-sheet workbooks get a synthetic root). The\n * structure was checked against a real XMind file (both content.json and content.xml present).\n *\n * Used by XmindViewer (the side viewer's XMind mode): the bytes come from the same download endpoint as any\n * other file, are unzipped + parsed entirely client-side, and never leave the browser.\n */\nimport { readZip, extractZipEntry, type ZipEntry } from '@/lib/zip'\nimport type { MindMap, MindNode } from '@/lib/mindmap'\n\n/** Thrown when the bytes aren't a readable XMind workbook (not a zip, or no content member inside). */\nexport class NotXmindError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'NotXmindError'\n }\n}\n\nexport async function parseXmind(buf: ArrayBuffer, fallbackTitle = ''): Promise<MindMap> {\n let entries: ZipEntry[]\n try {\n entries = readZip(buf)\n } catch {\n throw new NotXmindError('不是有效的 XMind 文件(无法读取 ZIP 容器)')\n }\n const find = (path: string): ZipEntry | undefined =>\n entries.find((e) => e.path.toLowerCase() === path.toLowerCase())\n\n const jsonEntry = find('content.json')\n if (jsonEntry) {\n const text = new TextDecoder('utf-8').decode(await extractZipEntry(buf, jsonEntry))\n return fromContentJson(text, fallbackTitle)\n }\n const xmlEntry = find('content.xml')\n if (xmlEntry) {\n const text = new TextDecoder('utf-8').decode(await extractZipEntry(buf, xmlEntry))\n return fromContentXml(text, fallbackTitle)\n }\n throw new NotXmindError('未找到 content.json / content.xml(不是 XMind 文件)')\n}\n\n// ── shared helpers ────────────────────────────────────────────────────────────────────────────\nfunction makeIdGen(): () => number {\n let n = 0\n return () => n++\n}\nfunction countNodes(n: MindNode): number {\n let c = 1\n for (const k of n.children) c += countNodes(k)\n return c\n}\nfunction flatten(s: string | null | undefined): string {\n return (s || '').replace(/\\s+/g, ' ').trim()\n}\nfunction stripTags(s: string): string {\n return s.replace(/<[^>]*>/g, ' ')\n}\n\n/** Fold a topic's note + labels into the single note string MindNode exposes (shown as a hover tooltip). */\nfunction noteOf(plain: string, labels: string[]): string | undefined {\n const parts: string[] = []\n if (plain) parts.push(plain)\n if (labels.length) parts.push(`标签: ${labels.join(', ')}`)\n return parts.length ? parts.join('\\n') : undefined\n}\n\n// ── content.json (modern) ───────────────────────────────────────────────────────────────────────\ninterface JsonTopic {\n title?: string\n href?: string\n notes?: { plain?: { content?: string }; realHTML?: { content?: string } }\n labels?: unknown\n children?: { attached?: JsonTopic[]; detached?: JsonTopic[] }\n}\ninterface JsonSheet {\n title?: string\n rootTopic?: JsonTopic\n}\n\nfunction jsonTopicToNode(t: JsonTopic, id: () => number): MindNode {\n const children: MindNode[] = []\n const att = t.children?.attached\n if (Array.isArray(att)) for (const c of att) children.push(jsonTopicToNode(c, id))\n const det = t.children?.detached\n if (Array.isArray(det)) for (const c of det) children.push(jsonTopicToNode(c, id))\n\n const plain =\n flatten(t.notes?.plain?.content) || flatten(stripTags(t.notes?.realHTML?.content || ''))\n const labels = Array.isArray(t.labels)\n ? t.labels.filter((l): l is string => typeof l === 'string')\n : []\n return {\n id: id(),\n text: flatten(t.title),\n note: noteOf(plain, labels),\n link: typeof t.href === 'string' && t.href ? t.href : undefined,\n children,\n }\n}\n\nfunction fromContentJson(text: string, fallbackTitle: string): MindMap {\n let data: unknown\n try {\n data = JSON.parse(text)\n } catch {\n throw new NotXmindError('content.json 解析失败(JSON 无效)')\n }\n // Modern content.json is an array of sheets; be tolerant of a single-sheet object.\n const sheets: JsonSheet[] = Array.isArray(data) ? (data as JsonSheet[]) : [data as JsonSheet]\n const valid = sheets.filter((s) => s && s.rootTopic)\n if (!valid.length) throw new NotXmindError('XMind 内容为空(无 rootTopic)')\n\n const id = makeIdGen()\n let root: MindNode\n if (valid.length === 1) {\n root = jsonTopicToNode(valid[0].rootTopic as JsonTopic, id)\n if (!root.text) root.text = flatten(valid[0].title) || fallbackTitle || 'XMind'\n } else {\n // Multi-sheet workbook → a synthetic root holding each sheet's tree.\n root = {\n id: id(),\n text: fallbackTitle || 'XMind 工作簿',\n children: valid.map((s) => {\n const n = jsonTopicToNode(s.rootTopic as JsonTopic, id)\n if (!n.text) n.text = flatten(s.title) || '画布'\n return n\n }),\n }\n }\n return { format: 'xmind', title: root.text, root, count: countNodes(root) }\n}\n\n// ── content.xml (legacy) ──────────────────────────────────────────────────────────────────────\nfunction childByTag(el: Element, tag: string): Element | null {\n for (const c of Array.from(el.children)) if (c.tagName.toLowerCase() === tag) return c\n return null\n}\n\nfunction xmlTopicToNode(topic: Element, id: () => number): MindNode {\n const title = childByTag(topic, 'title')\n const notesEl = childByTag(topic, 'notes')\n const plainEl = notesEl ? childByTag(notesEl, 'plain') : null\n const children: MindNode[] = []\n // <children><topics type=\"attached\"><topic>…</topic></topics></children>\n const childrenEl = childByTag(topic, 'children')\n if (childrenEl) {\n for (const topics of Array.from(childrenEl.children)) {\n if (topics.tagName.toLowerCase() !== 'topics') continue\n for (const c of Array.from(topics.children)) {\n if (c.tagName.toLowerCase() === 'topic') children.push(xmlTopicToNode(c, id))\n }\n }\n }\n return {\n id: id(),\n text: flatten(title?.textContent),\n note: noteOf(flatten(plainEl?.textContent), []),\n link: topic.getAttribute('xlink:href') || topic.getAttribute('href') || undefined,\n children,\n }\n}\n\nfunction fromContentXml(text: string, fallbackTitle: string): MindMap {\n if (typeof DOMParser === 'undefined') throw new NotXmindError('当前环境不支持解析 XMind XML')\n const doc = new DOMParser().parseFromString(text, 'application/xml')\n if (doc.getElementsByTagName('parsererror').length) {\n throw new NotXmindError('content.xml 解析失败(XML 无效)')\n }\n const sheets = Array.from(doc.getElementsByTagName('sheet'))\n const roots: { title: string; topic: Element }[] = []\n for (const sheet of sheets) {\n const topic = childByTag(sheet, 'topic')\n if (topic) roots.push({ title: flatten(childByTag(sheet, 'title')?.textContent), topic })\n }\n if (!roots.length) throw new NotXmindError('XMind 内容为空(无 topic)')\n\n const id = makeIdGen()\n let root: MindNode\n if (roots.length === 1) {\n root = xmlTopicToNode(roots[0].topic, id)\n if (!root.text) root.text = roots[0].title || fallbackTitle || 'XMind'\n } else {\n root = {\n id: id(),\n text: fallbackTitle || 'XMind 工作簿',\n children: roots.map((r) => {\n const n = xmlTopicToNode(r.topic, id)\n if (!n.text) n.text = r.title || '画布'\n return n\n }),\n }\n }\n return { format: 'xmind', title: root.text, root, count: countNodes(root) }\n}\n"],"mappings":"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"}
package/dist/lib/zip.js CHANGED
@@ -167,3 +167,5 @@ async function x(e, t, n) {
167
167
  }
168
168
  //#endregion
169
169
  export { s as ZipEncryptedError, c as ZipPasswordError, x as extractZipEntry, m as readZip, l as zipSupported };
170
+
171
+ //# sourceMappingURL=zip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zip.js","names":[],"sources":["../../src/lib/zip.ts"],"sourcesContent":["/**\n * Minimal in-browser ZIP reader — no dependency, no WASM.\n *\n * Parses the archive's central directory to list entries, then extracts them lazily using the\n * browser-native {@link DecompressionStream} for DEFLATE. Covers what conversation artifacts actually\n * ship: STORE (uncompressed) and DEFLATE, ASCII/UTF-8 names, and the ZIP64 size/offset extensions.\n * Encrypted entries and unusual compression methods are surfaced as errors rather than mis-read.\n *\n * Used by ZipBrowser (the side viewer's archive mode): the bytes come from the same download endpoint\n * as any other file, are decompressed here entirely client-side, and never leave the browser.\n */\n\nimport { aesCtrXor } from '@/lib/aes'\nimport { decodeFileNameBytes } from '@/lib/encoding'\n\nconst SIG_EOCD = 0x06054b50 // end of central directory record\nconst SIG_EOCD64 = 0x06064b50 // ZIP64 end of central directory record\nconst SIG_EOCD64_LOC = 0x07064b50 // ZIP64 EOCD locator\nconst SIG_CDH = 0x02014b50 // central directory file header\nconst SIG_LFH = 0x04034b50 // local file header\n\n/** How an entry is encrypted: none, legacy PKWARE ZipCrypto, or WinZip AES. */\nexport type ZipEncryption = 'none' | 'zipcrypto' | 'aes'\n\nexport interface ZipEntry {\n /** Full path within the archive, forward-slashed, e.g. \"src/app.ts\". */\n path: string\n /** Basename (last path segment). */\n name: string\n /** Uncompressed size in bytes. */\n size: number\n /** Compressed size in bytes (for encrypted entries this includes the crypto header/salt/trailer). */\n compressedSize: number\n /** EFFECTIVE compression method: 0 = stored, 8 = deflate (for AES this is the real method from the extra field, not 99). */\n method: number\n /** Directory entry (its path ends with \"/\"). */\n isDir: boolean\n /** Entry is encrypted (true when {@link encryption} !== 'none'). Kept for callers that only need the flag. */\n encrypted: boolean\n /** Encryption scheme — decrypt needs the password (see {@link extractZipEntry}). */\n encryption: ZipEncryption\n /** CRC-32 from the directory (the ZipCrypto password-check byte is its high byte). */\n crc32: number\n /** WinZip AES parameters (only when {@link encryption} === 'aes'). */\n aes?: { strength: 1 | 2 | 3 }\n /** Byte offset of the local file header (where the data lives). */\n localOffset: number\n}\n\n/** Thrown when an entry is encrypted and no password was supplied — the UI prompts for one. */\nexport class ZipEncryptedError extends Error {\n constructor(message = '该条目已加密,请输入密码') {\n super(message)\n this.name = 'ZipEncryptedError'\n }\n}\n/** Thrown when the supplied password fails the archive's verification (wrong password). */\nexport class ZipPasswordError extends Error {\n constructor(message = '密码错误') {\n super(message)\n this.name = 'ZipPasswordError'\n }\n}\n\n/** Is in-browser inflate available? (DecompressionStream — all current browsers; absent under SSR.) */\nexport function zipSupported(): boolean {\n return typeof DecompressionStream !== 'undefined'\n}\n\n/** Read a little-endian unsigned 64-bit value as a JS number (exact up to 2^53, plenty for our sizes). */\nfunction readU64(view: DataView, off: number): number {\n return view.getUint32(off + 4, true) * 0x100000000 + view.getUint32(off, true)\n}\n\n/** Scan backward from the tail for the EOCD signature (it sits before a variable-length comment). */\nfunction findEocd(view: DataView): number {\n const len = view.byteLength\n const min = Math.max(0, len - 22 - 0xffff)\n for (let i = len - 22; i >= min; i--) {\n if (view.getUint32(i, true) === SIG_EOCD) return i\n }\n throw new Error('不是有效的 ZIP 文件(找不到结尾记录)')\n}\n\n/** Patch any 0xFFFFFFFF sentinel size/offset from the ZIP64 extra field (tag 0x0001, fields in order). */\nfunction applyZip64Extra(\n view: DataView,\n start: number,\n len: number,\n cur: { size: number; compressedSize: number; localOffset: number },\n): void {\n const end = start + len\n let o = start\n while (o + 4 <= end) {\n const id = view.getUint16(o, true)\n const sz = view.getUint16(o + 2, true)\n if (id === 0x0001) {\n let f = o + 4\n if (cur.size === 0xffffffff) {\n cur.size = readU64(view, f)\n f += 8\n }\n if (cur.compressedSize === 0xffffffff) {\n cur.compressedSize = readU64(view, f)\n f += 8\n }\n if (cur.localOffset === 0xffffffff) {\n cur.localOffset = readU64(view, f)\n }\n return\n }\n o += 4 + sz\n }\n}\n\n/** Read the WinZip AES extra field (id 0x9901) from an entry's extra data: strength + real method. */\nfunction parseAesExtra(\n view: DataView,\n start: number,\n len: number,\n): { strength: 1 | 2 | 3; method: number } | null {\n const end = start + len\n let o = start\n while (o + 4 <= end) {\n const id = view.getUint16(o, true)\n const sz = view.getUint16(o + 2, true)\n if (id === 0x9901 && o + 11 <= end) {\n // data: [0-1] version, [2-3] vendor \"AE\", [4] strength (1/2/3), [5-6] actual compression method\n const strength = view.getUint8(o + 8)\n const method = view.getUint16(o + 9, true)\n if (strength >= 1 && strength <= 3) return { strength: strength as 1 | 2 | 3, method }\n }\n o += 4 + sz\n }\n return null\n}\n\n/** Parse the central directory into a flat entry list. Throws if the bytes aren't a readable ZIP. */\nexport function readZip(buf: ArrayBuffer): ZipEntry[] {\n const view = new DataView(buf)\n if (view.byteLength < 22) throw new Error('文件太小,不是有效的 ZIP')\n const eocd = findEocd(view)\n\n let cdCount = view.getUint16(eocd + 10, true)\n let cdOffset = view.getUint32(eocd + 16, true)\n\n // ZIP64: sentinels in the classic EOCD redirect to a 64-bit record via the locator just before it.\n if (cdCount === 0xffff || cdOffset === 0xffffffff) {\n const loc = eocd - 20\n if (loc >= 0 && view.getUint32(loc, true) === SIG_EOCD64_LOC) {\n const rec = readU64(view, loc + 8)\n if (rec >= 0 && rec + 56 <= view.byteLength && view.getUint32(rec, true) === SIG_EOCD64) {\n cdCount = readU64(view, rec + 32)\n cdOffset = readU64(view, rec + 48)\n }\n }\n }\n\n const bytes = new Uint8Array(buf)\n const entries: ZipEntry[] = []\n let p = cdOffset\n for (let i = 0; i < cdCount; i++) {\n if (p + 46 > view.byteLength || view.getUint32(p, true) !== SIG_CDH) break\n const flags = view.getUint16(p + 8, true)\n const method = view.getUint16(p + 10, true)\n const fnLen = view.getUint16(p + 28, true)\n const extraLen = view.getUint16(p + 30, true)\n const commentLen = view.getUint16(p + 32, true)\n const cur = {\n size: view.getUint32(p + 24, true),\n compressedSize: view.getUint32(p + 20, true),\n localOffset: view.getUint32(p + 42, true),\n }\n // bit 11 flags UTF-8 names, but legacy zips (esp. from Chinese Windows) store GBK without it — so we\n // sniff the encoding (UTF-8 → GBK → \\uXXXX escape) rather than force UTF-8. Backslashes normalize to '/'\n // (the spec mandates '/', but Windows' Compress-Archive emits '\\', which would flatten a nested tree).\n const path = decodeFileNameBytes(bytes.subarray(p + 46, p + 46 + fnLen), true)\n if (\n cur.size === 0xffffffff ||\n cur.compressedSize === 0xffffffff ||\n cur.localOffset === 0xffffffff\n ) {\n applyZip64Extra(view, p + 46 + fnLen, extraLen, cur)\n }\n // Encryption: AES (method 99 + the 0x9901 extra, which carries the REAL method) vs legacy ZipCrypto\n // (general-purpose flag bit 0). For AES the effective method becomes the real one from the extra.\n const crc32 = view.getUint32(p + 16, true)\n let encryption: ZipEncryption = 'none'\n let effMethod = method\n let aes: { strength: 1 | 2 | 3 } | undefined\n if (method === 99) {\n const info = parseAesExtra(view, p + 46 + fnLen, extraLen)\n if (info) {\n encryption = 'aes'\n effMethod = info.method\n aes = { strength: info.strength }\n }\n } else if ((flags & 0x1) !== 0) {\n encryption = 'zipcrypto'\n }\n entries.push({\n path,\n name: path.replace(/\\/+$/, '').split('/').pop() ?? path,\n size: cur.size,\n compressedSize: cur.compressedSize,\n method: effMethod,\n isDir: path.endsWith('/'),\n encrypted: encryption !== 'none',\n encryption,\n crc32,\n aes,\n localOffset: cur.localOffset,\n })\n p += 46 + fnLen + extraLen + commentLen\n }\n return entries\n}\n\n/** Inflate a raw DEFLATE stream via the browser. */\nasync function inflateRaw(data: Uint8Array): Promise<Uint8Array> {\n const stream = new Blob([data]).stream().pipeThrough(new DecompressionStream('deflate-raw'))\n return new Uint8Array(await new Response(stream).arrayBuffer())\n}\n\n// ── encryption ────────────────────────────────────────────────────────────────────────────────\n// Two schemes appear in the wild: legacy PKWARE \"ZipCrypto\" (a weak keystream cipher, still what most\n// \"password-protected zip\" tools default to) and WinZip AES (PBKDF2-HMAC-SHA1 → AES-CTR, used by 7-Zip/WinZip).\n// Both are decrypted here entirely client-side; the password never leaves the browser.\n\nconst CRC_TABLE = /* @__PURE__ */ (() => {\n const t = new Uint32Array(256)\n for (let n = 0; n < 256; n++) {\n let c = n\n for (let k = 0; k < 8; k++) c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1\n t[n] = c >>> 0\n }\n return t\n})()\nconst crc32Byte = (crc: number, b: number): number =>\n ((crc >>> 8) ^ CRC_TABLE[(crc ^ b) & 0xff]) >>> 0\n\n// PKWARE ZipCrypto: three 32-bit keys evolved one byte at a time.\nclass ZipCryptoState {\n private k0 = 0x12345678\n private k1 = 0x23456789\n private k2 = 0x34567890\n constructor(pw: Uint8Array) {\n for (const b of pw) this.update(b)\n }\n private update(b: number): void {\n this.k0 = crc32Byte(this.k0, b)\n this.k1 = (this.k1 + (this.k0 & 0xff)) >>> 0\n this.k1 = (Math.imul(this.k1, 134775813) + 1) >>> 0\n this.k2 = crc32Byte(this.k2, (this.k1 >>> 24) & 0xff)\n }\n decryptByte(cipher: number): number {\n const t = (this.k2 | 2) & 0xffff\n const plain = (cipher ^ ((Math.imul(t, t ^ 1) >>> 8) & 0xff)) & 0xff\n this.update(plain)\n return plain\n }\n}\n\n// Decrypt a ZipCrypto blob: the first 12 bytes are a header whose last byte must equal the CRC's high byte\n// (the password check); returns the remaining plaintext (still deflate-compressed / stored).\nfunction zipCryptoDecrypt(data: Uint8Array, pw: Uint8Array, checkByte: number): Uint8Array {\n if (data.length < 12) throw new ZipPasswordError()\n const st = new ZipCryptoState(pw)\n const out = new Uint8Array(data.length)\n for (let i = 0; i < data.length; i++) out[i] = st.decryptByte(data[i])\n if (out[11] !== (checkByte & 0xff)) throw new ZipPasswordError()\n return out.subarray(12)\n}\n\n// Decrypt a WinZip AES blob: [salt][pwVerify(2)][ciphertext][authCode(10)]. PBKDF2-HMAC-SHA1(1000) derives\n// encKey ‖ authKey ‖ pwVerify(2); we check pwVerify (wrong password) and CTR-decrypt (auth code not verified).\nasync function winzipAesDecrypt(\n data: Uint8Array,\n pw: Uint8Array,\n strength: 1 | 2 | 3,\n): Promise<Uint8Array> {\n const saltLen = [8, 12, 16][strength - 1]\n const keyLen = [16, 24, 32][strength - 1]\n if (data.length < saltLen + 2 + 10) throw new ZipPasswordError()\n if (typeof crypto === 'undefined' || !crypto.subtle) {\n throw new Error('当前环境不支持 AES 解密(缺少 WebCrypto)')\n }\n const salt = data.subarray(0, saltLen)\n const pwVerify = data.subarray(saltLen, saltLen + 2)\n const cipher = data.subarray(saltLen + 2, data.length - 10)\n const baseKey = await crypto.subtle.importKey('raw', pw, 'PBKDF2', false, ['deriveBits'])\n const derived = new Uint8Array(\n await crypto.subtle.deriveBits(\n { name: 'PBKDF2', hash: 'SHA-1', salt, iterations: 1000 },\n baseKey,\n (keyLen * 2 + 2) * 8,\n ),\n )\n if (derived[keyLen * 2] !== pwVerify[0] || derived[keyLen * 2 + 1] !== pwVerify[1]) {\n throw new ZipPasswordError()\n }\n return aesCtrXor(derived.subarray(0, keyLen), cipher)\n}\n\n/** Decompress one entry's bytes. Reads the local header (its name/extra lengths can differ from the central\n * directory's) to find the data, decrypts it first when encrypted (ZipCrypto / WinZip AES — needs `password`),\n * then STORE-copies or DEFLATE-inflates. Throws {@link ZipEncryptedError} if a password is required but missing,\n * and {@link ZipPasswordError} if the supplied password is wrong. */\nexport async function extractZipEntry(\n buf: ArrayBuffer,\n e: ZipEntry,\n password?: string,\n): Promise<Uint8Array> {\n if (e.isDir || e.size === 0) return new Uint8Array(0)\n\n const view = new DataView(buf)\n if (e.localOffset + 30 > view.byteLength || view.getUint32(e.localOffset, true) !== SIG_LFH) {\n throw new Error('本地文件头损坏')\n }\n const fnLen = view.getUint16(e.localOffset + 26, true)\n const extraLen = view.getUint16(e.localOffset + 28, true)\n const start = e.localOffset + 30 + fnLen + extraLen\n if (start + e.compressedSize > buf.byteLength) throw new Error('条目数据超出文件范围')\n\n // The raw local data; for an encrypted entry this is the crypto blob (header/salt + ciphertext + trailer).\n let data: Uint8Array = new Uint8Array(buf, start, e.compressedSize)\n\n if (e.encryption !== 'none') {\n if (!password) throw new ZipEncryptedError()\n const pw = new TextEncoder().encode(password)\n if (e.encryption === 'zipcrypto') {\n // ZipCrypto password-check byte: normally the CRC's high byte, but when a data descriptor is used\n // (flag bit 3, CRC unknown at write time) it's the high byte of the DOS mod-time instead.\n const lflags = view.getUint16(e.localOffset + 6, true)\n const ltime = view.getUint16(e.localOffset + 10, true)\n const checkByte = lflags & 0x8 ? (ltime >> 8) & 0xff : (e.crc32 >>> 24) & 0xff\n data = zipCryptoDecrypt(data, pw, checkByte)\n } else {\n data = await winzipAesDecrypt(data, pw, e.aes?.strength ?? 3)\n }\n }\n\n if (e.method === 0) return data.slice() // stored — copy out so callers own the bytes\n if (e.method === 8) {\n if (!zipSupported()) throw new Error('当前浏览器不支持在前端解压(DecompressionStream 缺失)')\n return inflateRaw(data) // deflate\n }\n throw new Error(`不支持的压缩方式(method ${e.method})`)\n}\n"],"mappings":"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"}