@l1yp/file-viewer 0.1.1 → 0.1.3

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 (440) 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 +3 -1
  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 +3 -1
  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/PdfNavigationPane.js +9 -0
  159. package/dist/components/PdfNavigationPane.js.map +1 -0
  160. package/dist/components/PdfNavigationPane.vue.d.ts +24 -0
  161. package/dist/components/PdfNavigationPane.vue_vue_type_script_setup_true_lang.js +149 -0
  162. package/dist/components/PdfNavigationPane.vue_vue_type_script_setup_true_lang.js.map +1 -0
  163. package/dist/components/PdfViewer.js +3 -1
  164. package/dist/components/PdfViewer.js.map +1 -0
  165. package/dist/components/PdfViewer.vue.d.ts +0 -11
  166. package/dist/components/PdfViewer.vue_vue_type_script_setup_true_lang.js +133 -69
  167. package/dist/components/PdfViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  168. package/dist/components/PptxNavigationPane.js +2 -0
  169. package/dist/components/PptxNavigationPane.js.map +1 -0
  170. package/dist/components/PptxNavigationPane.vue_vue_type_script_setup_true_lang.js +2 -0
  171. package/dist/components/PptxNavigationPane.vue_vue_type_script_setup_true_lang.js.map +1 -0
  172. package/dist/components/PptxViewer.js +3 -1
  173. package/dist/components/PptxViewer.js.map +1 -0
  174. package/dist/components/PptxViewer.vue_vue_type_script_setup_true_lang.js +55 -49
  175. package/dist/components/PptxViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  176. package/dist/components/PsdViewer.js +2 -0
  177. package/dist/components/PsdViewer.js.map +1 -0
  178. package/dist/components/PsdViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  179. package/dist/components/PsdViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  180. package/dist/components/QmcAudioViewer.js +2 -0
  181. package/dist/components/QmcAudioViewer.js.map +1 -0
  182. package/dist/components/QmcAudioViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  183. package/dist/components/QmcAudioViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  184. package/dist/components/RasterViewer.js +2 -0
  185. package/dist/components/RasterViewer.js.map +1 -0
  186. package/dist/components/RasterViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  187. package/dist/components/RasterViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  188. package/dist/components/RtfViewer.js +2 -0
  189. package/dist/components/RtfViewer.js.map +1 -0
  190. package/dist/components/RtfViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  191. package/dist/components/RtfViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  192. package/dist/components/SevenZipBrowser.js +2 -0
  193. package/dist/components/SevenZipBrowser.js.map +1 -0
  194. package/dist/components/SevenZipBrowser.vue_vue_type_script_setup_true_lang.js +2 -0
  195. package/dist/components/SevenZipBrowser.vue_vue_type_script_setup_true_lang.js.map +1 -0
  196. package/dist/components/SqliteViewer.js +2 -0
  197. package/dist/components/SqliteViewer.js.map +1 -0
  198. package/dist/components/SqliteViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  199. package/dist/components/SqliteViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  200. package/dist/components/SubtitleViewer.js +2 -0
  201. package/dist/components/SubtitleViewer.js.map +1 -0
  202. package/dist/components/SubtitleViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  203. package/dist/components/SubtitleViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  204. package/dist/components/XlsxChart.js +2 -0
  205. package/dist/components/XlsxChart.js.map +1 -0
  206. package/dist/components/XlsxChart.vue_vue_type_script_setup_true_lang.js +2 -0
  207. package/dist/components/XlsxChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  208. package/dist/components/XlsxViewer.js +2 -0
  209. package/dist/components/XlsxViewer.js.map +1 -0
  210. package/dist/components/XlsxViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  211. package/dist/components/XlsxViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  212. package/dist/components/XmindViewer.js +2 -0
  213. package/dist/components/XmindViewer.js.map +1 -0
  214. package/dist/components/XmindViewer.vue_vue_type_script_setup_true_lang.js +2 -0
  215. package/dist/components/XmindViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
  216. package/dist/components/ZipBrowser.js +2 -0
  217. package/dist/components/ZipBrowser.js.map +1 -0
  218. package/dist/components/ZipBrowser.vue_vue_type_script_setup_true_lang.js +2 -0
  219. package/dist/components/ZipBrowser.vue_vue_type_script_setup_true_lang.js.map +1 -0
  220. package/dist/components/ZoomImage.js +3 -1
  221. package/dist/components/ZoomImage.js.map +1 -0
  222. package/dist/components/ZoomImage.vue_vue_type_script_setup_true_lang.js +82 -80
  223. package/dist/components/ZoomImage.vue_vue_type_script_setup_true_lang.js.map +1 -0
  224. package/dist/components/epl/EplCodeBlock.js +2 -0
  225. package/dist/components/epl/EplCodeBlock.js.map +1 -0
  226. package/dist/components/epl/EplCodeBlock.vue_vue_type_script_setup_true_lang.js +2 -0
  227. package/dist/components/epl/EplCodeBlock.vue_vue_type_script_setup_true_lang.js.map +1 -0
  228. package/dist/components/epl/EplDoc.js +2 -0
  229. package/dist/components/epl/EplDoc.js.map +1 -0
  230. package/dist/components/epl/EplDoc.vue_vue_type_script_setup_true_lang.js +2 -0
  231. package/dist/components/epl/EplDoc.vue_vue_type_script_setup_true_lang.js.map +1 -0
  232. package/dist/components/epl/EplMethod.js +2 -0
  233. package/dist/components/epl/EplMethod.js.map +1 -0
  234. package/dist/components/epl/EplMethod.vue_vue_type_script_setup_true_lang.js +2 -0
  235. package/dist/components/epl/EplMethod.vue_vue_type_script_setup_true_lang.js.map +1 -0
  236. package/dist/components/epl/EplResource.js +2 -0
  237. package/dist/components/epl/EplResource.js.map +1 -0
  238. package/dist/components/epl/EplResource.vue_vue_type_script_setup_true_lang.js +2 -0
  239. package/dist/components/epl/EplResource.vue_vue_type_script_setup_true_lang.js.map +1 -0
  240. package/dist/components/epl/EplTree.js +2 -0
  241. package/dist/components/epl/EplTree.js.map +1 -0
  242. package/dist/components/epl/EplTree.vue_vue_type_script_setup_true_lang.js +2 -0
  243. package/dist/components/epl/EplTree.vue_vue_type_script_setup_true_lang.js.map +1 -0
  244. package/dist/components/epl/EplVarTable.js +2 -0
  245. package/dist/components/epl/EplVarTable.js.map +1 -0
  246. package/dist/components/epl/EplVarTable.vue_vue_type_script_setup_true_lang.js +2 -0
  247. package/dist/components/epl/EplVarTable.vue_vue_type_script_setup_true_lang.js.map +1 -0
  248. package/dist/components/epl/numbering.js +2 -0
  249. package/dist/components/epl/numbering.js.map +1 -0
  250. package/dist/components/icons/Icon.js +2 -0
  251. package/dist/components/icons/Icon.js.map +1 -0
  252. package/dist/components/icons/Icon.vue_vue_type_script_setup_true_lang.js +2 -0
  253. package/dist/components/icons/Icon.vue_vue_type_script_setup_true_lang.js.map +1 -0
  254. package/dist/components/icons/iconPaths.js +2 -0
  255. package/dist/components/icons/iconPaths.js.map +1 -0
  256. package/dist/components/optionalViewer.js +2 -0
  257. package/dist/components/optionalViewer.js.map +1 -0
  258. package/dist/components/ui/ClampBlock.js +2 -0
  259. package/dist/components/ui/ClampBlock.js.map +1 -0
  260. package/dist/composables/useElementNavigation.js +2 -0
  261. package/dist/composables/useElementNavigation.js.map +1 -0
  262. package/dist/composables/useFileViewer.js +2 -0
  263. package/dist/composables/useFileViewer.js.map +1 -0
  264. package/dist/composables/useLightbox.js +2 -0
  265. package/dist/composables/useLightbox.js.map +1 -0
  266. package/dist/composables/useLogRules.js +2 -0
  267. package/dist/composables/useLogRules.js.map +1 -0
  268. package/dist/lib/aes.js +2 -0
  269. package/dist/lib/aes.js.map +1 -0
  270. package/dist/lib/appx.js +2 -0
  271. package/dist/lib/appx.js.map +1 -0
  272. package/dist/lib/archiveHtml.js +2 -0
  273. package/dist/lib/archiveHtml.js.map +1 -0
  274. package/dist/lib/asn1.js +2 -0
  275. package/dist/lib/asn1.js.map +1 -0
  276. package/dist/lib/binobj.js +2 -0
  277. package/dist/lib/binobj.js.map +1 -0
  278. package/dist/lib/brotli.js +2 -0
  279. package/dist/lib/brotli.js.map +1 -0
  280. package/dist/lib/bzip2.js +2 -0
  281. package/dist/lib/bzip2.js.map +1 -0
  282. package/dist/lib/classfile.js +2 -0
  283. package/dist/lib/classfile.js.map +1 -0
  284. package/dist/lib/codePreview.js +2 -0
  285. package/dist/lib/codePreview.js.map +1 -0
  286. package/dist/lib/codefold.js +2 -0
  287. package/dist/lib/codefold.js.map +1 -0
  288. package/dist/lib/codeformat.js +2 -0
  289. package/dist/lib/codeformat.js.map +1 -0
  290. package/dist/lib/csv.js +2 -0
  291. package/dist/lib/csv.js.map +1 -0
  292. package/dist/lib/des.js +2 -0
  293. package/dist/lib/des.js.map +1 -0
  294. package/dist/lib/diagram.js +2 -0
  295. package/dist/lib/diagram.js.map +1 -0
  296. package/dist/lib/dicom.js +2 -0
  297. package/dist/lib/dicom.js.map +1 -0
  298. package/dist/lib/dicomCodecs.js +2 -0
  299. package/dist/lib/dicomCodecs.js.map +1 -0
  300. package/dist/lib/dicomRender.js +2 -0
  301. package/dist/lib/dicomRender.js.map +1 -0
  302. package/dist/lib/docxNavigation.js +2 -0
  303. package/dist/lib/docxNavigation.js.map +1 -0
  304. package/dist/lib/dxf.js +2 -0
  305. package/dist/lib/dxf.js.map +1 -0
  306. package/dist/lib/eml.js +2 -0
  307. package/dist/lib/eml.js.map +1 -0
  308. package/dist/lib/encoding.js +2 -0
  309. package/dist/lib/encoding.js.map +1 -0
  310. package/dist/lib/epl/code/codeDataParser.js +2 -0
  311. package/dist/lib/epl/code/codeDataParser.js.map +1 -0
  312. package/dist/lib/epl/code/codeLines.js +2 -0
  313. package/dist/lib/epl/code/codeLines.js.map +1 -0
  314. package/dist/lib/epl/code/textCode.js +2 -0
  315. package/dist/lib/epl/code/textCode.js.map +1 -0
  316. package/dist/lib/epl/eplDocument.js +2 -0
  317. package/dist/lib/epl/eplDocument.js.map +1 -0
  318. package/dist/lib/epl/imageList.js +2 -0
  319. package/dist/lib/epl/imageList.js.map +1 -0
  320. package/dist/lib/epl/index.js +2 -0
  321. package/dist/lib/epl/index.js.map +1 -0
  322. package/dist/lib/epl/io/binaryReader.js +2 -0
  323. package/dist/lib/epl/io/binaryReader.js.map +1 -0
  324. package/dist/lib/epl/io/encoding.js +2 -0
  325. package/dist/lib/epl/io/encoding.js.map +1 -0
  326. package/dist/lib/epl/model/eplSystemId.js +2 -0
  327. package/dist/lib/epl/model/eplSystemId.js.map +1 -0
  328. package/dist/lib/epl/names/eplLibData.js +2 -0
  329. package/dist/lib/epl/names/eplLibData.js.map +1 -0
  330. package/dist/lib/epl/names/idToNameMap.js +2 -0
  331. package/dist/lib/epl/names/idToNameMap.js.map +1 -0
  332. package/dist/lib/epl/names/libNameProvider.js +2 -0
  333. package/dist/lib/epl/names/libNameProvider.js.map +1 -0
  334. package/dist/lib/epl/program.js +2 -0
  335. package/dist/lib/epl/program.js.map +1 -0
  336. package/dist/lib/epl/projectFileReader.js +2 -0
  337. package/dist/lib/epl/projectFileReader.js.map +1 -0
  338. package/dist/lib/fb2.js +2 -0
  339. package/dist/lib/fb2.js.map +1 -0
  340. package/dist/lib/fileType.js +2 -0
  341. package/dist/lib/fileType.js.map +1 -0
  342. package/dist/lib/fonts.js +2 -0
  343. package/dist/lib/fonts.js.map +1 -0
  344. package/dist/lib/format.js +2 -0
  345. package/dist/lib/format.js.map +1 -0
  346. package/dist/lib/frontmatter.js +2 -0
  347. package/dist/lib/frontmatter.js.map +1 -0
  348. package/dist/lib/geo.js +2 -0
  349. package/dist/lib/geo.js.map +1 -0
  350. package/dist/lib/har.js +2 -0
  351. package/dist/lib/har.js.map +1 -0
  352. package/dist/lib/highlight.js +2 -0
  353. package/dist/lib/highlight.js.map +1 -0
  354. package/dist/lib/highlightLangs.js +2 -0
  355. package/dist/lib/highlightLangs.js.map +1 -0
  356. package/dist/lib/hprof.js +2 -0
  357. package/dist/lib/hprof.js.map +1 -0
  358. package/dist/lib/ipynb.js +2 -0
  359. package/dist/lib/ipynb.js.map +1 -0
  360. package/dist/lib/jks.js +2 -0
  361. package/dist/lib/jks.js.map +1 -0
  362. package/dist/lib/jsonl.js +2 -0
  363. package/dist/lib/jsonl.js.map +1 -0
  364. package/dist/lib/lrc.js +2 -0
  365. package/dist/lib/lrc.js.map +1 -0
  366. package/dist/lib/lzma.js +2 -0
  367. package/dist/lib/lzma.js.map +1 -0
  368. package/dist/lib/markdown/blocks.js +2 -0
  369. package/dist/lib/markdown/blocks.js.map +1 -0
  370. package/dist/lib/markdown/inline.js +2 -0
  371. package/dist/lib/markdown/inline.js.map +1 -0
  372. package/dist/lib/markdown/math.js +2 -0
  373. package/dist/lib/markdown/math.js.map +1 -0
  374. package/dist/lib/markdown/segmentize.js +2 -0
  375. package/dist/lib/markdown/segmentize.js.map +1 -0
  376. package/dist/lib/markdown/styles.js +2 -0
  377. package/dist/lib/markdown/styles.js.map +1 -0
  378. package/dist/lib/mht.js +2 -0
  379. package/dist/lib/mht.js.map +1 -0
  380. package/dist/lib/midi.js +2 -0
  381. package/dist/lib/midi.js.map +1 -0
  382. package/dist/lib/mime.js +2 -0
  383. package/dist/lib/mime.js.map +1 -0
  384. package/dist/lib/mindmap.js +2 -0
  385. package/dist/lib/mindmap.js.map +1 -0
  386. package/dist/lib/mobi.js +2 -0
  387. package/dist/lib/mobi.js.map +1 -0
  388. package/dist/lib/msi.js +2 -0
  389. package/dist/lib/msi.js.map +1 -0
  390. package/dist/lib/optionalDep.js +2 -0
  391. package/dist/lib/optionalDep.js.map +1 -0
  392. package/dist/lib/pdfNavigation.d.ts +11 -0
  393. package/dist/lib/pdfNavigation.js +32 -0
  394. package/dist/lib/pdfNavigation.js.map +1 -0
  395. package/dist/lib/pkcs12.js +2 -0
  396. package/dist/lib/pkcs12.js.map +1 -0
  397. package/dist/lib/pptxNavigation.js +2 -0
  398. package/dist/lib/pptxNavigation.js.map +1 -0
  399. package/dist/lib/qmc.js +2 -0
  400. package/dist/lib/qmc.js.map +1 -0
  401. package/dist/lib/rar.js +2 -0
  402. package/dist/lib/rar.js.map +1 -0
  403. package/dist/lib/rawPreview.js +2 -0
  404. package/dist/lib/rawPreview.js.map +1 -0
  405. package/dist/lib/rc2.js +2 -0
  406. package/dist/lib/rc2.js.map +1 -0
  407. package/dist/lib/resolveInput.js +2 -0
  408. package/dist/lib/resolveInput.js.map +1 -0
  409. package/dist/lib/rtf.js +2 -0
  410. package/dist/lib/rtf.js.map +1 -0
  411. package/dist/lib/sevenZip.js +2 -0
  412. package/dist/lib/sevenZip.js.map +1 -0
  413. package/dist/lib/sha1.js +2 -0
  414. package/dist/lib/sha1.js.map +1 -0
  415. package/dist/lib/sha256.js +2 -0
  416. package/dist/lib/sha256.js.map +1 -0
  417. package/dist/lib/speechAudio.js +2 -0
  418. package/dist/lib/speechAudio.js.map +1 -0
  419. package/dist/lib/sqlite.js +2 -0
  420. package/dist/lib/sqlite.js.map +1 -0
  421. package/dist/lib/subtitle.js +2 -0
  422. package/dist/lib/subtitle.js.map +1 -0
  423. package/dist/lib/tarball.js +2 -0
  424. package/dist/lib/tarball.js.map +1 -0
  425. package/dist/lib/viewerFormats.js +2 -0
  426. package/dist/lib/viewerFormats.js.map +1 -0
  427. package/dist/lib/viewerKind.js +2 -0
  428. package/dist/lib/viewerKind.js.map +1 -0
  429. package/dist/lib/x509.js +2 -0
  430. package/dist/lib/x509.js.map +1 -0
  431. package/dist/lib/xlsx.js +2 -0
  432. package/dist/lib/xlsx.js.map +1 -0
  433. package/dist/lib/xlsxCharts.js +2 -0
  434. package/dist/lib/xlsxCharts.js.map +1 -0
  435. package/dist/lib/xmind.js +2 -0
  436. package/dist/lib/xmind.js.map +1 -0
  437. package/dist/lib/zip.js +2 -0
  438. package/dist/lib/zip.js.map +1 -0
  439. package/dist/style.css +1 -1
  440. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eplLibData.js","names":[],"sources":["../../../../src/lib/epl/names/eplLibData.json"],"sourcesContent":["{\n \"krnln\": {\n \"name\": \"系统核心支持库\",\n \"cmds\": [\n \"如果\",\n \"如果真\",\n \"判断\",\n \"判断循环首\",\n \"判断循环尾\",\n \"循环判断首\",\n \"循环判断尾\",\n \"计次循环首\",\n \"计次循环尾\",\n \"变量循环首\",\n \"变量循环尾\",\n \"到循环尾\",\n \"跳出循环\",\n \"返回\",\n \"结束\",\n \"相乘\",\n \"相除\",\n \"整除\",\n \"求余数\",\n \"相加\",\n \"相减\",\n \"负\",\n \"取符号\",\n \"取绝对值\",\n \"取整\",\n \"绝对取整\",\n \"四舍五入\",\n \"求次方\",\n \"求平方根\",\n \"求正弦\",\n \"求余弦\",\n \"求正切\",\n \"求反正切\",\n \"求自然对数\",\n \"求反对数\",\n \"是否运算正确\",\n \"置随机数种子\",\n \"取随机数\",\n \"等于\",\n \"不等于\",\n \"小于\",\n \"大于\",\n \"小于或等于\",\n \"大于或等于\",\n \"近似等于\",\n \"并且\",\n \"或者\",\n \"取反\",\n \"位取反\",\n \"位与\",\n \"位或\",\n \"位异或\",\n \"赋值\",\n \"连续赋值\",\n \"参考\",\n \"重定义数组\",\n \"取数组成员数\",\n \"取数组下标\",\n \"复制数组\",\n \"加入成员\",\n \"插入成员\",\n \"删除成员\",\n \"清除数组\",\n \"数组排序\",\n \"取命令行\",\n \"取运行目录\",\n \"取执行文件名\",\n \"读环境变量\",\n \"写环境变量\",\n \"取所有发音\",\n \"取发音数目\",\n \"取拼音\",\n \"取声母\",\n \"取韵母\",\n \"发音比较\",\n \"输入字比较\",\n \"取文本长度\",\n \"取文本左边\",\n \"取文本右边\",\n \"取文本中间\",\n \"字符\",\n \"取代码\",\n \"寻找文本\",\n \"倒找文本\",\n \"到大写\",\n \"到小写\",\n \"到全角\",\n \"到半角\",\n \"到时间\",\n \"到数值\",\n \"到文本\",\n \"删首空\",\n \"删尾空\",\n \"删首尾空\",\n \"删全部空\",\n \"文本替换\",\n \"子文本替换\",\n \"取空白文本\",\n \"取重复文本\",\n \"文本比较\",\n \"分割文本\",\n \"取字节集长度\",\n \"到字节集\",\n \"取字节集数据\",\n \"取字节集左边\",\n \"取字节集右边\",\n \"取字节集中间\",\n \"寻找字节集\",\n \"倒找字节集\",\n \"字节集替换\",\n \"子字节集替换\",\n \"取空白字节集\",\n \"取重复字节集\",\n \"分割字节集\",\n \"数值到大写\",\n \"数值到金额\",\n \"数值到格式文本\",\n \"取十六进制文本\",\n \"取八进制文本\",\n \"增减时间\",\n \"取时间间隔\",\n \"取某月天数\",\n \"时间到文本\",\n \"取时间部分\",\n \"取年份\",\n \"取月份\",\n \"取日\",\n \"取星期几\",\n \"取小时\",\n \"取分钟\",\n \"取秒\",\n \"指定时间\",\n \"取现行时间\",\n \"置现行时间\",\n \"取磁盘总空间\",\n \"取磁盘剩余空间\",\n \"取磁盘卷标\",\n \"置磁盘卷标\",\n \"改变驱动器\",\n \"改变目录\",\n \"取当前目录\",\n \"创建目录\",\n \"删除目录\",\n \"复制文件\",\n \"移动文件\",\n \"删除文件\",\n \"文件更名\",\n \"文件是否存在\",\n \"寻找文件\",\n \"取文件时间\",\n \"取文件尺寸\",\n \"取文件属性\",\n \"置文件属性\",\n \"取临时文件名\",\n \"读入文件\",\n \"写到文件\",\n \"打开文件\",\n \"打开内存文件\",\n \"关闭文件\",\n \"关闭所有文件\",\n \"锁住文件\",\n \"解锁文件\",\n \"移动读写位置\",\n \"移到文件首\",\n \"移到文件尾\",\n \"读入字节集\",\n \"写出字节集\",\n \"读入文本\",\n \"写出文本\",\n \"读入一行\",\n \"写文本行\",\n \"读入数据\",\n \"写出数据\",\n \"是否在文件尾\",\n \"取读写位置\",\n \"取文件长度\",\n \"运行\",\n \"取剪辑板文本\",\n \"置剪辑板文本\",\n \"剪辑板中可有文本\",\n \"清除剪辑板\",\n \"取屏幕宽度\",\n \"取屏幕高度\",\n \"取鼠标水平位置\",\n \"取鼠标垂直位置\",\n \"取颜色数\",\n \"取文本注册表项\",\n \"取数值注册表项\",\n \"取字节集注册表项\",\n \"写注册表项\",\n \"删除注册表项\",\n \"输入框\",\n \"信息框\",\n \"鸣叫\",\n \"取启动时间\",\n \"播放音乐\",\n \"停止播放\",\n \"输出调试文本\",\n \"暂停\",\n \"检查\",\n \"载入\",\n \"选择\",\n \"多项选择\",\n \"是否为空\",\n \"是否已创建\",\n \"取数据类型尺寸\",\n \"取颜色值\",\n \"取子程序地址\",\n \"压缩图片\",\n \"取事件组件\",\n \"事件转移\",\n \"复制窗口组件\",\n \"处理事件\",\n \"载入图片\",\n \"卸载图片\",\n \"取窗口句柄\",\n \"销毁\",\n \"获取焦点\",\n \"可有焦点\",\n \"取用户区宽度\",\n \"取用户区高度\",\n \"禁止重画\",\n \"允许重画\",\n \"重画\",\n \"部分重画\",\n \"取消重画\",\n \"刷新显示\",\n \"移动\",\n \"调整层次\",\n \"弹出菜单\",\n \"取子夹数目\",\n \"取子夹名称\",\n \"置子夹名称\",\n \"打开\",\n \"取顶端可见项目\",\n \"置顶端可见项目\",\n \"取项目数\",\n \"取项目数值\",\n \"置项目数值\",\n \"取项目文本\",\n \"置项目文本\",\n \"加入项目\",\n \"插入项目\",\n \"删除项目\",\n \"清空\",\n \"选择\",\n \"取顶端可见项目\",\n \"置顶端可见项目\",\n \"取项目数\",\n \"取项目数值\",\n \"置项目数值\",\n \"取项目文本\",\n \"置项目文本\",\n \"取已选择项目数\",\n \"取所有被选择项目\",\n \"是否被选择\",\n \"选择项目\",\n \"取焦点项目\",\n \"置焦点项目\",\n \"加入项目\",\n \"插入项目\",\n \"删除项目\",\n \"清空\",\n \"选择\",\n \"取顶端可见项目\",\n \"置顶端可见项目\",\n \"取项目数\",\n \"取项目数值\",\n \"置项目数值\",\n \"取项目文本\",\n \"置项目文本\",\n \"加入项目\",\n \"插入项目\",\n \"删除项目\",\n \"清空\",\n \"选择\",\n \"是否被选中\",\n \"选中项目\",\n \"是否被允许\",\n \"允许\",\n \"取设备句柄\",\n \"清除\",\n \"取点\",\n \"画点\",\n \"画直线\",\n \"画椭圆\",\n \"画弧线\",\n \"画弦\",\n \"画饼\",\n \"画矩形\",\n \"画渐变矩形\",\n \"填充矩形\",\n \"画圆角矩形\",\n \"翻转矩形区\",\n \"画多边形\",\n \"置写出位置\",\n \"写文本行\",\n \"滚动写行\",\n \"写出\",\n \"定位写出\",\n \"取宽度\",\n \"取高度\",\n \"画图片\",\n \"取图片宽度\",\n \"取图片高度\",\n \"复制\",\n \"取设备句柄\",\n \"开始打印\",\n \"结束打印\",\n \"取消打印\",\n \"换页\",\n \"开始下一份\",\n \"画点\",\n \"画直线\",\n \"画椭圆\",\n \"画弧线\",\n \"画弦\",\n \"画饼\",\n \"画矩形\",\n \"画渐变矩形\",\n \"填充矩形\",\n \"画圆角矩形\",\n \"画多边形\",\n \"置写出位置\",\n \"写文本行\",\n \"写出\",\n \"定位写出\",\n \"取宽度\",\n \"取高度\",\n \"画图片\",\n \"取图片宽度\",\n \"取图片高度\",\n \"加入文本\",\n \"发送信息\",\n \"投递信息\",\n \"指针是否有效\",\n \"是否支持多用户\",\n \"取错误码\",\n \"取错误信息\",\n \"创建\",\n \"打开\",\n \"替换打开\",\n \"置当前库\",\n \"取当前库\",\n \"关闭\",\n \"全部关闭\",\n \"取库文件名\",\n \"是否已打开\",\n \"取记录数\",\n \"取创建时间\",\n \"取字段数\",\n \"取字段名\",\n \"改字段名\",\n \"取字段类型\",\n \"取字段尺寸\",\n \"新建索引\",\n \"置当前索引\",\n \"取当前索引\",\n \"更新索引\",\n \"取索引数\",\n \"取索引名\",\n \"取索引字段\",\n \"置加锁重试时间\",\n \"锁住数据库\",\n \"解锁数据库\",\n \"锁住增删\",\n \"解增删锁\",\n \"锁住记录\",\n \"解锁记录\",\n \"全部解锁\",\n \"取平均值\",\n \"求和\",\n \"取最大值\",\n \"取最小值\",\n \"取最大时间\",\n \"取最小时间\",\n \"计算数目\",\n \"复制结构\",\n \"复制记录\",\n \"计算排序\",\n \"排序\",\n \"分类计算\",\n \"添加\",\n \"加记录\",\n \"加空记录\",\n \"替换\",\n \"修改\",\n \"删除\",\n \"是否已删除\",\n \"恢复删除\",\n \"彻底删除\",\n \"清空\",\n \"读\",\n \"写\",\n \"读字段\",\n \"写字段\",\n \"附加字节集\",\n \"附加备注\",\n \"索引查找\",\n \"查找\",\n \"到首记录\",\n \"到尾记录\",\n \"跳过\",\n \"取记录号\",\n \"跳到\",\n \"取标签\",\n \"记录是否存在\",\n \"标签跳转\",\n \"首记录前\",\n \"尾记录后\",\n \"写出缓存\",\n \"写出所有缓存\",\n \"编辑\",\n \"置等待鼠标\",\n \"恢复鼠标\",\n \"延时\",\n \"播放MID\",\n \"是否为调试版\",\n \"插入字节集\",\n \"插入文本\",\n \"插入文本行\",\n \"删除数据\",\n \"取文本注册项\",\n \"取数值注册项\",\n \"取字节集注册项\",\n \"写注册项\",\n \"删除注册项\",\n \"注册项是否存在\",\n \"取标记组件\",\n \"跳转\",\n \"置外形图片\",\n \"播放MP3\",\n \"激活\",\n \"取硬盘特征字\",\n \"取主机名\",\n \"通信测试\",\n \"发送数据\",\n \"取回数据\",\n \"连接\",\n \"断开连接\",\n \"发送数据\",\n \"取回数据\",\n \"启动\",\n \"停止\",\n \"发送数据\",\n \"转换为主机名\",\n \"转换为IP地址\",\n \"取回客户\",\n \"发送数据\",\n \"取回数据\",\n \"置托盘图标\",\n \"弹出托盘菜单\",\n \"断开客户\",\n \"取默认底色\",\n \"取图片\",\n \"快照\",\n \"到首记录\",\n \"到尾记录\",\n \"跳过\",\n \"跳到\",\n \"取记录号\",\n \"取表头行数\",\n \"置表头行数\",\n \"取表头列数\",\n \"置表头列数\",\n \"取行高\",\n \"置行高\",\n \"取列宽\",\n \"置列宽\",\n \"取类型\",\n \"置类型\",\n \"取文本色\",\n \"置文本色\",\n \"取背景色\",\n \"置背景色\",\n \"取字体名\",\n \"置字体名\",\n \"取字体尺寸\",\n \"置字体尺寸\",\n \"取字体属性\",\n \"置字体属性\",\n \"取边距\",\n \"置边距\",\n \"取文本输入格式\",\n \"置文本输入格式\",\n \"取对齐方式\",\n \"置对齐方式\",\n \"取密码方式\",\n \"置密码方式\",\n \"取文本\",\n \"置文本\",\n \"取数据\",\n \"置数据\",\n \"合并\",\n \"分解\",\n \"是否被合并\",\n \"加线条\",\n \"删线条\",\n \"是否有线条\",\n \"清除\",\n \"置初始属性\",\n \"初始尺寸\",\n \"取行数\",\n \"取列数\",\n \"插入行\",\n \"添加行\",\n \"删除行\",\n \"插入列\",\n \"删除列\",\n \"添加\",\n \"存到字节集\",\n \"从字节集读\",\n \"存到文件\",\n \"从文件读\",\n \"单元格到字节集\",\n \"字节集到单元格\",\n \"单元格到文件\",\n \"文件到单元格\",\n \"刷新\",\n \"保存更改\",\n \"打印设置\",\n \"取打印设置\",\n \"置打印设置\",\n \"取打印页宽\",\n \"取打印页高\",\n \"置光标\",\n \"选择\",\n \"全部选择\",\n \"取光标行号\",\n \"取光标列号\",\n \"取选择行数\",\n \"取选择列数\",\n \"等宽缩放\",\n \"全部复制\",\n \"复制\",\n \"粘贴到光标处\",\n \"粘贴\",\n \"打印\",\n \"打印预览\",\n \"打开\",\n \"关闭\",\n \"取连接文本\",\n \"启动事务\",\n \"回滚事务\",\n \"提交事务\",\n \"查询\",\n \"重新查询\",\n \"关闭记录集\",\n \"首记录前\",\n \"尾记录后\",\n \"到首记录\",\n \"到尾记录\",\n \"到前一记录\",\n \"到后一记录\",\n \"读\",\n \"执行\",\n \"修改程序\",\n \"清除记录\",\n \"写出程序\",\n \"取日期\",\n \"取时间\",\n \"数组清零\",\n \"读配置项\",\n \"写配置项\",\n \"取配置节名\",\n \"取操作系统类别\",\n \"打开加密文件\",\n \"是否已加密\",\n \"置数据库密码\",\n \"密码输入框\",\n \"复制密码\",\n \"信号操作\",\n \"取系统语言\",\n \"打开MDB数据库\",\n \"打开SQL数据库\",\n \"取只读方式\",\n \"置只读方式\",\n \"标准输出\",\n \"标准输入\",\n \"指针到文本\",\n \"指针到字节集\",\n \"写到内存\",\n \"复制\",\n \"创建\",\n \"获取\",\n \"清除\",\n \"是否为空\",\n \"是否相等\",\n \"读文本属性\",\n \"读数值属性\",\n \"读逻辑属性\",\n \"读日期属性\",\n \"读对象型属性\",\n \"读属性\",\n \"写属性\",\n \"方法\",\n \"通用方法\",\n \"文本方法\",\n \"数值方法\",\n \"逻辑方法\",\n \"日期方法\",\n \"对象型方法\",\n \"创建图片对象\",\n \"创建字体对象\",\n \"取回图片\",\n \"取回字体\",\n \"取错误\",\n \"查看\",\n \"复制\",\n \"清除\",\n \"取类型\",\n \"取数组成员数\",\n \"取文本\",\n \"取数值\",\n \"取逻辑值\",\n \"取日期\",\n \"取对象\",\n \"取变体型\",\n \"赋值\",\n \"创建数组\",\n \"取和历文本\",\n \"取接口\",\n \"???\",\n \"调用反馈事件\",\n \"单位转换\",\n \"DLL命令调用转向\",\n \"置父窗口\",\n \"置类型\",\n \"取字节集\",\n \"到字节\",\n \"到短整数\",\n \"到整数\",\n \"到长整数\",\n \"到小数\",\n \"置自定义纸张类型\",\n \"删除自定义纸张类型\",\n \"取自定义纸张大小\",\n \"取所有纸张类型\",\n \"左移\",\n \"右移\",\n \"合并整数\",\n \"合并短整数\",\n \"置错误提示管理\",\n \"同步播放MP3\",\n \"暂停播放MP3\",\n \"继续播放MP3\",\n \"取MP3播放状态\",\n \"多文件对话框\",\n \"置DLL装载目录\",\n \"单位转换\",\n \"取组件名称\",\n \"取对象类型\",\n \"寻找组件\",\n \"取找到组件数目\",\n \"取所找到组件\",\n \"清除组件寻找句柄\",\n \"置入代码\",\n \"取设备名称\",\n \"载入易包文件\",\n \"载入易包数据\",\n \"卸载易包\",\n \"易包是否被载入\",\n \"复制易包常量\",\n \"指针到整数\",\n \"指针到小数\",\n \"指针到双精度小数\",\n \"十六进制\",\n \"二进制\",\n \"取程序名称\",\n \"交换变量\",\n \"强制交换变量\",\n \"取运行时数据类型\",\n \"宏\",\n \"类自身\",\n \"取操作系统类别2\",\n \"取最后错误\",\n \"取统一文本\",\n \"取统一文本长度\",\n \"运行控制台程序\",\n \"取核心库版本\",\n \"文本到UTF8\",\n \"UTF8到文本\",\n \"取字节集内整数\",\n \"置字节集内整数\",\n \"反转整数字节序\",\n \"条件宏是否存在\",\n \"文本到UTF16\",\n \"UTF16到文本\"\n ],\n \"constants\": [\n \"引号\",\n \"左引号\",\n \"右引号\",\n \"换行符\",\n \"pi\",\n \"e\",\n \"黑色\",\n \"藏青\",\n \"墨绿\",\n \"深青\",\n \"红褐\",\n \"紫红\",\n \"褐绿\",\n \"浅灰\",\n \"灰色\",\n \"蓝色\",\n \"绿色\",\n \"艳青\",\n \"红色\",\n \"品红\",\n \"黄色\",\n \"白色\",\n \"蓝灰\",\n \"藏蓝\",\n \"嫩绿\",\n \"青绿\",\n \"黄褐\",\n \"粉红\",\n \"嫩黄\",\n \"银白\",\n \"紫色\",\n \"天蓝\",\n \"灰绿\",\n \"青蓝\",\n \"橙黄\",\n \"桃红\",\n \"芙红\",\n \"深灰\",\n \"透明\",\n \"隐藏窗口\",\n \"普通激活\",\n \"最小化激活\",\n \"最大化激活\",\n \"普通不激活\",\n \"最小化不激活\",\n \"读入\",\n \"写出\",\n \"读写\",\n \"重写\",\n \"改写\",\n \"改读\",\n \"无限制\",\n \"禁止读\",\n \"禁止写\",\n \"禁止读写\",\n \"文件首\",\n \"文件尾\",\n \"现行位置\",\n \"只读文件\",\n \"隐藏文件\",\n \"系统文件\",\n \"子目录\",\n \"存档文件\",\n \"无属性文件\",\n \"字节型\",\n \"短整数型\",\n \"整数型\",\n \"长整数型\",\n \"小数型\",\n \"双精度小数型\",\n \"逻辑型\",\n \"日期时间型\",\n \"子程序指针型\",\n \"文本型\",\n \"年份\",\n \"季度\",\n \"月份\",\n \"周\",\n \"自年首周数\",\n \"日\",\n \"小时\",\n \"分钟\",\n \"秒\",\n \"星期几\",\n \"自年首天数\",\n \"确认钮\",\n \"确认取消钮\",\n \"放弃重试忽略钮\",\n \"取消是否钮\",\n \"是否钮\",\n \"重试取消钮\",\n \"错误图标\",\n \"询问图标\",\n \"警告图标\",\n \"信息图标\",\n \"默认按钮一\",\n \"默认按钮二\",\n \"默认按钮三\",\n \"默认按钮四\",\n \"程序等待\",\n \"系统等待\",\n \"位于前台\",\n \"文本右对齐\",\n \"取消钮\",\n \"放弃钮\",\n \"重试钮\",\n \"忽略钮\",\n \"是钮\",\n \"否钮\",\n \"首拼及全拼\",\n \"双拼\",\n \"自动判别\",\n \"Ctrl键状态\",\n \"Shift键状态\",\n \"Alt键状态\",\n \"键0\",\n \"键1\",\n \"键2\",\n \"键3\",\n \"键4\",\n \"键5\",\n \"键6\",\n \"键7\",\n \"键8\",\n \"键9\",\n \"A键\",\n \"B键\",\n \"C键\",\n \"D键\",\n \"E键\",\n \"F键\",\n \"G键\",\n \"H键\",\n \"I键\",\n \"J键\",\n \"K键\",\n \"L键\",\n \"M键\",\n \"N键\",\n \"O键\",\n \"P键\",\n \"Q键\",\n \"R键\",\n \"S键\",\n \"T键\",\n \"U键\",\n \"V键\",\n \"W键\",\n \"X键\",\n \"Y键\",\n \"Z键\",\n \"F1键\",\n \"F2键\",\n \"F3键\",\n \"F4键\",\n \"F5键\",\n \"F6键\",\n \"F7键\",\n \"F8键\",\n \"F9键\",\n \"F10键\",\n \"F11键\",\n \"F12键\",\n \"F13键\",\n \"F14键\",\n \"F15键\",\n \"F16键\",\n \"Break键\",\n \"退格键\",\n \"Tab键\",\n \"回车键\",\n \"Shift键\",\n \"Ctrl键\",\n \"Alt键\",\n \"Pause键\",\n \"CapsLock键\",\n \"NumLock键\",\n \"ScrollLock键\",\n \"Esc键\",\n \"空格键\",\n \"PageUp键\",\n \"PageDown键\",\n \"Home键\",\n \"End键\",\n \"左光标键\",\n \"上光标键\",\n \"右光标键\",\n \"下光标键\",\n \"Ins键\",\n \"Del键\",\n \"分号键\",\n \"等号键\",\n \"逗号键\",\n \"减号键\",\n \"圆点键\",\n \"除号键\",\n \"反撇号键\",\n \"左中括号键\",\n \"右中括号键\",\n \"斜杠键\",\n \"单引号键\",\n \"顶层\",\n \"底层\",\n \"最高层\",\n \"次高层\",\n \"全部转换\",\n \"日期部分\",\n \"时间部分\",\n \"输入文本\",\n \"输入整数\",\n \"输入小数\",\n \"拷贝\",\n \"翻转拷贝\",\n \"位异或\",\n \"位或\",\n \"位与\",\n \"从上到下\",\n \"从左到右\",\n \"从左上到右下\",\n \"从右上到左下\",\n \"从下到上\",\n \"从右到左\",\n \"从右下到左上\",\n \"从左下到右上\",\n \"字节集型\",\n \"备注型\",\n \"通常索引\",\n \"读音索引\",\n \"南方读音索引\",\n \"不区分大小写\",\n \"忽略所有空格\",\n \"取平均值\",\n \"求和\",\n \"取最大值\",\n \"取最小值\",\n \"禁止修改\",\n \"禁止添加\",\n \"禁止删除\",\n \"禁止自动判断\",\n \"根类\",\n \"现行设置\",\n \"现行用户\",\n \"本地机器\",\n \"所有用户\",\n \"单击左键\",\n \"双击\",\n \"单击右键\",\n \"默认色\",\n \"文本\",\n \"图片文件名\",\n \"图片数据\",\n \"字节集数据\",\n \"上左\",\n \"上中\",\n \"上右\",\n \"中左\",\n \"中中\",\n \"中右\",\n \"下左\",\n \"下中\",\n \"下右\",\n \"缩放图片\",\n \"居中图片\",\n \"缩放居中图片\",\n \"平铺图片\",\n \"缩放平铺图片\",\n \"粗体\",\n \"斜体\",\n \"下划线\",\n \"删除线\",\n \"通常型\",\n \"左边框\",\n \"上边框\",\n \"右边框\",\n \"下边框\",\n \"水平线\",\n \"垂直线\",\n \"单斜线\",\n \"双斜线\",\n \"交叉线\",\n \"左单元格\",\n \"上单元格\",\n \"右单元格\",\n \"下单元格\",\n \"无页号\",\n \"上左页号\",\n \"上中页号\",\n \"上右页号\",\n \"下左页号\",\n \"下中页号\",\n \"下右页号\",\n \"全部页\",\n \"仅打印奇数页\",\n \"仅打印偶数页\",\n \"页范围\",\n \"行范围\",\n \"纵向\",\n \"横向\",\n \"默认纸\",\n \"A3纸\",\n \"A4纸\",\n \"A5纸\",\n \"B4纸\",\n \"B5纸\",\n \"四开\",\n \"十六开\",\n \"三十二开\",\n \"信纸\",\n \"法律用纸\",\n \"行政用纸\",\n \"声明\",\n \"小报\",\n \"笔记\",\n \"帐本\",\n \"对开纸\",\n \"输入密码\",\n \"缩放到纸宽\",\n \"限定到纸宽\",\n \"常量\",\n \"资源\",\n \"清除信号\",\n \"发送或置位\",\n \"DTR信号\",\n \"RTS信号\",\n \"Break信号\",\n \"GBK中文\",\n \"英文\",\n \"BIG5中文\",\n \"标准输出设备\",\n \"标准错误设备\",\n \"无法载入的常量\",\n \"横向绘画单位\",\n \"纵向绘画单位\",\n \"横向像素单位\",\n \"纵向像素单位\"\n ],\n \"dataTypes\": [\n {\n \"name\": \"窗口\",\n \"members\": [\n \"左边\",\n \"顶边\",\n \"宽度\",\n \"高度\",\n \"标记\",\n \"可视\",\n \"禁止\",\n \"鼠标指针\",\n \"标题\",\n \"边框\",\n \"底色\",\n \"底图\",\n \"底图方式\",\n \"背景音乐\",\n \"播放次数\",\n \"控制按钮\",\n \"最大化按钮\",\n \"最小化按钮\",\n \"位置\",\n \"可否移动\",\n \"图标\",\n \"回车下移焦点\",\n \"Esc键关闭\",\n \"F1键打开帮助\",\n \"帮助文件名\",\n \"帮助标志值\",\n \"在任务条中显示\",\n \"随意移动\",\n \"外形\",\n \"总在最前\",\n \"保持标题条激活\",\n \"窗口类名\"\n ],\n \"events\": [\n \"创建完毕\",\n \"可否被关闭\",\n \"将被销毁\",\n \"位置被改变\",\n \"尺寸被改变\",\n \"被激活\",\n \"被取消激活\",\n \"空闲\",\n \"首次激活\",\n \"托盘事件\",\n \"被显示\",\n \"被隐藏\",\n \"窗口可否被关闭\"\n ]\n },\n {\n \"name\": \"报表\",\n \"members\": [],\n \"events\": []\n },\n {\n \"name\": \"菜单\",\n \"members\": [\"标题\", \"选中\", \"禁止\", \"可视\"],\n \"events\": [\"被选择\"]\n },\n {\n \"name\": \"字体\",\n \"members\": [\"角度\", \"加粗\", \"倾斜\", \"删除线\", \"下划线\", \"字体大小\", \"字体名称\"],\n \"events\": []\n },\n {\n \"name\": \"编辑框\",\n \"members\": [\n \"左边\",\n \"顶边\",\n \"宽度\",\n \"高度\",\n \"标记\",\n \"可视\",\n \"禁止\",\n \"鼠标指针\",\n \"内容\",\n \"边框\",\n \"文本颜色\",\n \"背景颜色\",\n \"字体\",\n \"隐藏选择\",\n \"最大允许长度\",\n \"是否允许多行\",\n \"滚动条\",\n \"对齐方式\",\n \"输入方式\",\n \"密码遮盖字符\",\n \"转换方式\",\n \"调节器方式\",\n \"调节器底限值\",\n \"调节器上限值\",\n \"起始选择位置\",\n \"被选择字符数\",\n \"被选择文本\",\n \"数据源\",\n \"数据列\"\n ],\n \"events\": [\"内容被改变\", \"调节钮被按下\"]\n },\n {\n \"name\": \"图片框\",\n \"members\": [\n \"左边\",\n \"顶边\",\n \"宽度\",\n \"高度\",\n \"标记\",\n \"可视\",\n \"禁止\",\n \"鼠标指针\",\n \"边框\",\n \"背景颜色\",\n \"图片\",\n \"显示方式\",\n \"播放动画\",\n \"数据源\",\n \"数据列\"\n ],\n \"events\": []\n },\n {\n \"name\": \"外形框\",\n \"members\": [\n \"左边\",\n \"顶边\",\n \"宽度\",\n \"高度\",\n \"标记\",\n \"可视\",\n \"禁止\",\n \"鼠标指针\",\n \"背景颜色\",\n \"外形\",\n \"线条效果\",\n \"线型\",\n \"线宽\",\n \"线条颜色\",\n \"填充颜色\"\n ],\n \"events\": []\n },\n {\n \"name\": \"画板\",\n \"members\": [\n \"左边\",\n \"顶边\",\n \"宽度\",\n \"高度\",\n \"标记\",\n \"可视\",\n \"禁止\",\n \"鼠标指针\",\n \"边框\",\n \"画板背景色\",\n \"底图\",\n \"底图方式\",\n \"自动重画\",\n \"绘画单位\",\n \"画笔类型\",\n \"画出方式\",\n \"画笔粗细\",\n \"画笔颜色\",\n \"刷子类型\",\n \"刷子颜色\",\n \"文本颜色\",\n \"文本背景颜色\",\n \"字体\",\n \"画板宽度\",\n \"画板高度\"\n ],\n \"events\": [\"绘画\"]\n },\n {\n \"name\": \"分组框\",\n \"members\": [\n \"左边\",\n \"顶边\",\n \"宽度\",\n \"高度\",\n \"标记\",\n \"可视\",\n \"禁止\",\n \"鼠标指针\",\n \"标题\",\n \"对齐方式\",\n \"文本颜色\",\n \"背景颜色\",\n \"字体\"\n ],\n \"events\": []\n },\n {\n \"name\": \"标签\",\n \"members\": [\n \"左边\",\n \"顶边\",\n \"宽度\",\n \"高度\",\n \"标记\",\n \"可视\",\n \"禁止\",\n \"鼠标指针\",\n \"标题\",\n \"效果\",\n \"边框\",\n \"渐变边框宽度\",\n \"渐变边框颜色1\",\n \"渐变边框颜色2\",\n \"渐变边框颜色3\",\n \"字体\",\n \"文本颜色\",\n \"背景颜色\",\n \"底图\",\n \"底图方式\",\n \"渐变背景方式\",\n \"渐变背景颜色1\",\n \"渐变背景颜色2\",\n \"渐变背景颜色3\",\n \"横向对齐方式\",\n \"是否自动折行\",\n \"纵向对齐方式\",\n \"数据源\",\n \"数据列\"\n ],\n \"events\": [\"反馈事件\"]\n },\n {\n \"name\": \"按钮\",\n \"members\": [\n \"左边\",\n \"顶边\",\n \"宽度\",\n \"高度\",\n \"标记\",\n \"可视\",\n \"禁止\",\n \"鼠标指针\",\n \"图片\",\n \"类型\",\n \"标题\",\n \"横向对齐方式\",\n \"纵向对齐方式\",\n \"字体\"\n ],\n \"events\": [\"被单击\"]\n },\n {\n \"name\": \"选择框\",\n \"members\": [\n \"左边\",\n \"顶边\",\n \"宽度\",\n \"高度\",\n \"标记\",\n \"可视\",\n \"禁止\",\n \"鼠标指针\",\n \"图片\",\n \"按钮形式\",\n \"平面\",\n \"标题\",\n \"标题居左\",\n \"横向对齐方式\",\n \"纵向对齐方式\",\n \"文本颜色\",\n \"背景颜色\",\n \"字体\",\n \"选中\",\n \"数据源\",\n \"数据列\"\n ],\n \"events\": [\"被单击\"]\n },\n {\n \"name\": \"单选框\",\n \"members\": [\n \"左边\",\n \"顶边\",\n \"宽度\",\n \"高度\",\n \"标记\",\n \"可视\",\n \"禁止\",\n \"鼠标指针\",\n \"图片\",\n \"按钮形式\",\n \"平面\",\n \"标题\",\n \"标题居左\",\n \"横向对齐方式\",\n \"纵向对齐方式\",\n \"文本颜色\",\n \"背景颜色\",\n \"字体\",\n \"选中\"\n ],\n \"events\": [\"被单击\"]\n },\n {\n \"name\": \"组合框\",\n \"members\": [\n \"左边\",\n \"顶边\",\n \"宽度\",\n \"高度\",\n \"标记\",\n \"可视\",\n \"禁止\",\n \"鼠标指针\",\n \"类型\",\n \"内容\",\n \"最大文本长度\",\n \"起始选择位置\",\n \"被选择字符数\",\n \"被选择文本\",\n \"自动排序\",\n \"行间距\",\n \"文本颜色\",\n \"背景颜色\",\n \"字体\",\n \"现行选中项\",\n \"列表项目\",\n \"项目数值\",\n \"数据源\",\n \"数据列\",\n \"除去重复\"\n ],\n \"events\": [\"列表项被选择\", \"编辑内容被改变\", \"将弹出列表\", \"列表被关闭\", \"双击选择\"]\n },\n {\n \"name\": \"列表框\",\n \"members\": [\n \"左边\",\n \"顶边\",\n \"宽度\",\n \"高度\",\n \"标记\",\n \"可视\",\n \"禁止\",\n \"鼠标指针\",\n \"边框\",\n \"自动排序\",\n \"多列\",\n \"行间距\",\n \"文本颜色\",\n \"背景颜色\",\n \"字体\",\n \"允许选择多项\",\n \"现行选中项\",\n \"列表项目\",\n \"项目数值\",\n \"数据源\",\n \"数据列\",\n \"除去重复\"\n ],\n \"events\": [\"列表项被选择\", \"双击选择\"]\n },\n {\n \"name\": \"选择列表框\",\n \"members\": [\n \"左边\",\n \"顶边\",\n \"宽度\",\n \"高度\",\n \"标记\",\n \"可视\",\n \"禁止\",\n \"鼠标指针\",\n \"边框\",\n \"自动排序\",\n \"多列\",\n \"行间距\",\n \"单选\",\n \"字体\",\n \"现行选中项\",\n \"列表项目\",\n \"项目数值\"\n ],\n \"events\": [\"列表项被选择\", \"选中状态被改变\", \"双击选择\"]\n },\n {\n \"name\": \"横向滚动条\",\n \"members\": [\n \"左边\",\n \"顶边\",\n \"宽度\",\n \"高度\",\n \"标记\",\n \"可视\",\n \"禁止\",\n \"鼠标指针\",\n \"最小位置\",\n \"最大位置\",\n \"页改变值\",\n \"行改变值\",\n \"位置\",\n \"允许拖动跟踪\"\n ],\n \"events\": [\"位置被改变\"]\n },\n {\n \"name\": \"纵向滚动条\",\n \"members\": [\n \"左边\",\n \"顶边\",\n \"宽度\",\n \"高度\",\n \"标记\",\n \"可视\",\n \"禁止\",\n \"鼠标指针\",\n \"最小位置\",\n \"最大位置\",\n \"页改变值\",\n \"行改变值\",\n \"位置\",\n \"允许拖动跟踪\"\n ],\n \"events\": [\"位置被改变\"]\n },\n {\n \"name\": \"进度条\",\n \"members\": [\n \"左边\",\n \"顶边\",\n \"宽度\",\n \"高度\",\n \"标记\",\n \"可视\",\n \"禁止\",\n \"鼠标指针\",\n \"边框\",\n \"方向\",\n \"显示方式\",\n \"最小位置\",\n \"最大位置\",\n \"位置\"\n ],\n \"events\": []\n },\n {\n \"name\": \"滑块条\",\n \"members\": [\n \"左边\",\n \"顶边\",\n \"宽度\",\n \"高度\",\n \"标记\",\n \"可视\",\n \"禁止\",\n \"鼠标指针\",\n \"边框\",\n \"方向\",\n \"刻度类型\",\n \"单位刻度值\",\n \"允许选择\",\n \"首选择位置\",\n \"选择长度\",\n \"页改变值\",\n \"行改变值\",\n \"最小位置\",\n \"最大位置\",\n \"位置\"\n ],\n \"events\": [\"位置被改变\"]\n },\n {\n \"name\": \"选择夹\",\n \"members\": [\n \"左边\",\n \"顶边\",\n \"宽度\",\n \"高度\",\n \"标记\",\n \"可视\",\n \"禁止\",\n \"鼠标指针\",\n \"表头方向\",\n \"允许多行表头\",\n \"字体\",\n \"子夹管理\",\n \"现行子夹\",\n \"隐藏自身\",\n \"是否填充背景\",\n \"背景颜色\"\n ],\n \"events\": [\"被单击\", \"将改变子夹\", \"子夹被改变\"]\n },\n {\n \"name\": \"影像框\",\n \"members\": [\n \"左边\",\n \"顶边\",\n \"宽度\",\n \"高度\",\n \"标记\",\n \"可视\",\n \"禁止\",\n \"鼠标指针\",\n \"文件名\",\n \"居中播放\",\n \"透明背景\",\n \"播放\",\n \"播放次数\"\n ],\n \"events\": []\n },\n {\n \"name\": \"日期框\",\n \"members\": [\n \"左边\",\n \"顶边\",\n \"宽度\",\n \"高度\",\n \"标记\",\n \"可视\",\n \"禁止\",\n \"鼠标指针\",\n \"允许编辑\",\n \"附件类型\",\n \"今天\",\n \"最小日期\",\n \"最大日期\",\n \"字体\",\n \"边框\",\n \"数据源\",\n \"数据列\"\n ],\n \"events\": [\"选择日期被改变\"]\n },\n {\n \"name\": \"月历\",\n \"members\": [\n \"左边\",\n \"顶边\",\n \"宽度\",\n \"高度\",\n \"标记\",\n \"可视\",\n \"禁止\",\n \"鼠标指针\",\n \"不显示今天\",\n \"不圈注今天\",\n \"开始星期首日\",\n \"显示星期序号\",\n \"滚动月数\",\n \"今天\",\n \"最小日期\",\n \"最大日期\",\n \"允许选择多天\",\n \"最多选择天数\",\n \"首选择日\",\n \"尾选择日\",\n \"字体\",\n \"文本颜色\",\n \"背景颜色\",\n \"内背景颜色\",\n \"标题颜色\",\n \"标题背景颜色\",\n \"非本月颜色\",\n \"边框\"\n ],\n \"events\": [\"选择日期被改变\"]\n },\n {\n \"name\": \"驱动器框\",\n \"members\": [\n \"左边\",\n \"顶边\",\n \"宽度\",\n \"高度\",\n \"标记\",\n \"可视\",\n \"禁止\",\n \"鼠标指针\",\n \"驱动器\",\n \"类型\",\n \"文本颜色\",\n \"背景颜色\",\n \"字体\"\n ],\n \"events\": [\"驱动器被改变\"]\n },\n {\n \"name\": \"目录框\",\n \"members\": [\n \"左边\",\n \"顶边\",\n \"宽度\",\n \"高度\",\n \"标记\",\n \"可视\",\n \"禁止\",\n \"鼠标指针\",\n \"目录\",\n \"边框\",\n \"背景颜色\",\n \"字体\"\n ],\n \"events\": [\"目录被改变\"]\n },\n {\n \"name\": \"文件框\",\n \"members\": [\n \"左边\",\n \"顶边\",\n \"宽度\",\n \"高度\",\n \"标记\",\n \"可视\",\n \"禁止\",\n \"鼠标指针\",\n \"目录\",\n \"被选择文件\",\n \"允许选择多项\",\n \"通配符\",\n \"通常\",\n \"存档\",\n \"只读\",\n \"系统\",\n \"隐藏\",\n \"最小日期\",\n \"最大日期\",\n \"边框\",\n \"文本颜色\",\n \"背景颜色\",\n \"字体\"\n ],\n \"events\": [\"选择文件被改变\", \"双击选择\"]\n },\n {\n \"name\": \"颜色选择器\",\n \"members\": [\n \"左边\",\n \"顶边\",\n \"宽度\",\n \"高度\",\n \"标记\",\n \"可视\",\n \"禁止\",\n \"鼠标指针\",\n \"颜色\",\n \"允许透明\"\n ],\n \"events\": [\"颜色被改变\"]\n },\n {\n \"name\": \"超级链接框\",\n \"members\": [\n \"左边\",\n \"顶边\",\n \"宽度\",\n \"高度\",\n \"标记\",\n \"可视\",\n \"禁止\",\n \"鼠标指针\",\n \"标题\",\n \"类型\",\n \"电子信箱地址\",\n \"Internet地址\",\n \"文本颜色\",\n \"访问后的颜色\",\n \"热点颜色\",\n \"背景颜色\",\n \"边框\",\n \"字体\"\n ],\n \"events\": []\n },\n {\n \"name\": \"调节器\",\n \"members\": [\n \"左边\",\n \"顶边\",\n \"宽度\",\n \"高度\",\n \"标记\",\n \"可视\",\n \"禁止\",\n \"鼠标指针\",\n \"方向\",\n \"热点跟踪\"\n ],\n \"events\": [\"调节钮被按下\"]\n },\n {\n \"name\": \"通用对话框\",\n \"members\": [\n \"左边\",\n \"顶边\",\n \"宽度\",\n \"高度\",\n \"标记\",\n \"可视\",\n \"禁止\",\n \"鼠标指针\",\n \"类型\",\n \"标题\",\n \"文件名\",\n \"过滤器\",\n \"初始过滤器\",\n \"初始目录\",\n \"默认文件后缀\",\n \"创建时提示\",\n \"文件必须存在\",\n \"文件覆盖提示\",\n \"目录必须存在\",\n \"不改变目录\",\n \"字体颜色\",\n \"加粗\",\n \"倾斜\",\n \"删除线\",\n \"下划线\",\n \"字体名称\",\n \"字体大小\",\n \"帮助文件名\",\n \"帮助命令\",\n \"帮助标志值\"\n ],\n \"events\": []\n },\n {\n \"name\": \"时钟\",\n \"members\": [\"左边\", \"顶边\", \"宽度\", \"高度\", \"标记\", \"可视\", \"禁止\", \"鼠标指针\", \"时钟周期\"],\n \"events\": [\"周期事件\"]\n },\n {\n \"name\": \"打印机\",\n \"members\": [\n \"左边\",\n \"顶边\",\n \"宽度\",\n \"高度\",\n \"标记\",\n \"可视\",\n \"禁止\",\n \"鼠标指针\",\n \"绘画单位\",\n \"画笔类型\",\n \"画出方式\",\n \"画笔粗细\",\n \"画笔颜色\",\n \"刷子类型\",\n \"刷子颜色\",\n \"文本颜色\",\n \"文本背景颜色\",\n \"字体\",\n \"打印作业名\",\n \"打印份数\",\n \"多份打印方式\",\n \"最小页号\",\n \"最大页号\",\n \"首页页号\",\n \"末页页号\",\n \"打印选择区\",\n \"左边空\",\n \"顶边空\",\n \"右边空\",\n \"底边空\",\n \"当前页号\",\n \"已打印份数\",\n \"打印区宽度\",\n \"打印区高度\",\n \"打印被中止\"\n ],\n \"events\": []\n },\n {\n \"name\": \"字段信息\",\n \"members\": [\"名称\", \"类型\", \"最大文本长度\"],\n \"events\": []\n },\n {\n \"name\": \"数据报\",\n \"members\": [\"左边\", \"顶边\", \"宽度\", \"高度\", \"标记\", \"可视\", \"禁止\", \"鼠标指针\", \"端口\"],\n \"events\": [\"数据到达\"]\n },\n {\n \"name\": \"数据报\",\n \"members\": [\"左边\", \"顶边\", \"宽度\", \"高度\", \"标记\", \"可视\", \"禁止\", \"鼠标指针\", \"端口\"],\n \"events\": [\"数据到达\"]\n },\n {\n \"name\": \"客户\",\n \"members\": [\"左边\", \"顶边\", \"宽度\", \"高度\", \"标记\", \"可视\", \"禁止\", \"鼠标指针\"],\n \"events\": [\"数据到达\", \"连接断开\"]\n },\n {\n \"name\": \"服务器\",\n \"members\": [\"左边\", \"顶边\", \"宽度\", \"高度\", \"标记\", \"可视\", \"禁止\", \"鼠标指针\", \"端口\"],\n \"events\": [\"数据到达\", \"客户进入\", \"客户离开\"]\n },\n {\n \"name\": \"端口\",\n \"members\": [\n \"左边\",\n \"顶边\",\n \"宽度\",\n \"高度\",\n \"标记\",\n \"可视\",\n \"禁止\",\n \"鼠标指针\",\n \"端口号\",\n \"波特率\",\n \"数据位数\",\n \"停止位数\",\n \"奇偶校验\",\n \"事件字符\",\n \"等待时间\",\n \"自动启动\",\n \"奇偶校验方案\",\n \"流控制方案\",\n \"Rts流控制\",\n \"Dtr流控制\"\n ],\n \"events\": [\"收到信号\", \"数据到达\"]\n },\n {\n \"name\": \"打印设置信息\",\n \"members\": [\n \"纸张类型\",\n \"纸张方向\",\n \"左边距\",\n \"上边距\",\n \"右边距\",\n \"下边距\",\n \"页号位置\",\n \"打印份数\",\n \"首页打印页号\",\n \"是否打印到文件\",\n \"打印文件名\",\n \"自动填充\",\n \"自动添加表格线\",\n \"奇偶页方式\",\n \"打印范围方式\",\n \"起始打印位置\",\n \"结束打印位置\",\n \"每页打印行数\",\n \"打印缩放比\"\n ],\n \"events\": []\n },\n {\n \"name\": \"表格\",\n \"members\": [\n \"左边\",\n \"顶边\",\n \"宽度\",\n \"高度\",\n \"标记\",\n \"可视\",\n \"禁止\",\n \"鼠标指针\",\n \"数据源\",\n \"表格线颜色\",\n \"背景颜色\",\n \"缩放比\",\n \"允许选择块\",\n \"显示标尺\",\n \"显示空表格线\",\n \"禁止调整行高\",\n \"禁止调整列宽\",\n \"允许粘贴扩展\"\n ],\n \"events\": [\n \"光标位置改变\",\n \"选择行列数改变\",\n \"内容被改变\",\n \"行高被改变\",\n \"列宽被改变\",\n \"尺寸被扩展\"\n ]\n },\n {\n \"name\": \"数据源\",\n \"members\": [\n \"左边\",\n \"顶边\",\n \"宽度\",\n \"高度\",\n \"标记\",\n \"可视\",\n \"禁止\",\n \"鼠标指针\",\n \"数据提供者\",\n \"只读\",\n \"允许添加\",\n \"允许删除\"\n ],\n \"events\": [\"当前记录改变\", \"添加记录\", \"删除记录\"]\n },\n {\n \"name\": \"通用提供者\",\n \"members\": [\n \"左边\",\n \"顶边\",\n \"宽度\",\n \"高度\",\n \"标记\",\n \"可视\",\n \"禁止\",\n \"鼠标指针\",\n \"初始行数\",\n \"初始列数\"\n ],\n \"events\": []\n },\n {\n \"name\": \"数据库提供者\",\n \"members\": [\n \"左边\",\n \"顶边\",\n \"宽度\",\n \"高度\",\n \"标记\",\n \"可视\",\n \"禁止\",\n \"鼠标指针\",\n \"数据库文件名\",\n \"字节集字段处理\",\n \"数据库密码\"\n ],\n \"events\": []\n },\n {\n \"name\": \"图形按钮\",\n \"members\": [\n \"左边\",\n \"顶边\",\n \"宽度\",\n \"高度\",\n \"标记\",\n \"可视\",\n \"禁止\",\n \"鼠标指针\",\n \"类型\",\n \"选中\",\n \"正常图片\",\n \"点燃图片\",\n \"按下图片\",\n \"禁止图片\",\n \"透明颜色\"\n ],\n \"events\": [\"被单击\"]\n },\n {\n \"name\": \"外部数据库\",\n \"members\": [],\n \"events\": []\n },\n {\n \"name\": \"外部数据提供者\",\n \"members\": [\n \"左边\",\n \"顶边\",\n \"宽度\",\n \"高度\",\n \"标记\",\n \"可视\",\n \"禁止\",\n \"鼠标指针\",\n \"连接文本\",\n \"查询SQL\"\n ],\n \"events\": []\n },\n {\n \"name\": \"对象\",\n \"members\": [\"指针\", \"辅助数据\"],\n \"events\": []\n },\n {\n \"name\": \"变体型\",\n \"members\": [\"数据1\", \"数据2\", \"数据3\", \"数据4\"],\n \"events\": []\n },\n {\n \"name\": \"变体类型\",\n \"members\": [\n \"未知\",\n \"空\",\n \"数值型\",\n \"文本型\",\n \"逻辑型\",\n \"日期型\",\n \"对象型\",\n \"错误值型\",\n \"数值型数组\",\n \"文本型数组\",\n \"逻辑型数组\",\n \"日期型数组\",\n \"对象型数组\",\n \"错误值型数组\",\n \"变体型数组\"\n ],\n \"events\": []\n },\n {\n \"name\": \"无法载入的窗口组件\",\n \"members\": [],\n \"events\": []\n }\n ]\n },\n \"iconv\": {\n \"name\": \"编码转换支持库\",\n \"cmds\": [\"编码转换\", \"编码转换_打开\", \"编码转换_转换\", \"编码转换_关闭\"],\n \"constants\": [\n \"编码_GB2312\",\n \"编码_EUC_CN\",\n \"编码_HZ\",\n \"编码_GBK\",\n \"编码_GB18030\",\n \"编码_EUC_TW\",\n \"编码_BIG5\",\n \"编码_CP950\",\n \"编码_BIG5_HKSCS\",\n \"编码_ISO_2022_CN\",\n \"编码_ISO_2022_CN_EXT\",\n \"编码_EUC_JP\",\n \"编码_SHIFT_JIS\",\n \"编码_CP932\",\n \"编码_ISO_2022_JP\",\n \"编码_ISO_2022_JP_2\",\n \"编码_ISO_2022_JP_1\",\n \"编码_EUC_JISX0213\",\n \"编码_Shift_JISX0213\",\n \"编码_ISO_2022_JP_3\",\n \"编码_EUC_KR\",\n \"编码_CP949\",\n \"编码_ISO_2022_KR\",\n \"编码_JOHAB\",\n \"编码_UTF_8\",\n \"编码_UCS_2\",\n \"编码_UCS_2BE\",\n \"编码_UCS_2LE\",\n \"编码_UCS_4\",\n \"编码_UCS_4BE\",\n \"编码_UCS_4LE\",\n \"编码_UTF_16\",\n \"编码_UTF_16BE\",\n \"编码_UTF_16LE\",\n \"编码_UTF_32\",\n \"编码_UTF_32BE\",\n \"编码_UTF_32LE\",\n \"编码_UTF_7\",\n \"编码_C99\",\n \"编码_JAVA\",\n \"编码_UCS_2_INTERNAL\",\n \"编码_UCS_4_INTERNAL\",\n \"编码_ASCII\",\n \"编码_ISO_8859_1\",\n \"编码_ISO_8859_2\",\n \"编码_ISO_8859_3\",\n \"编码_ISO_8859_4\",\n \"编码_ISO_8859_5\",\n \"编码_ISO_8859_7\",\n \"编码_ISO_8859_9\",\n \"编码_ISO_8859_10\",\n \"编码_ISO_8859_13\",\n \"编码_ISO_8859_14\",\n \"编码_ISO_8859_15\",\n \"编码_ISO_8859_16\",\n \"编码_KOI8_R\",\n \"编码_KOI8_U\",\n \"编码_KOI8_RU\",\n \"编码_CP1250\",\n \"编码_CP1251\",\n \"编码_CP1252\",\n \"编码_CP1253\",\n \"编码_CP1254\",\n \"编码_CP1257\",\n \"编码_CP850\",\n \"编码_CP866\",\n \"编码_MacRoman\",\n \"编码_MacCentralEurope\",\n \"编码_MacIceland\",\n \"编码_MacCroatian\",\n \"编码_MacRomania\",\n \"编码_MacCyrillic\",\n \"编码_MacUkraine\",\n \"编码_MacGreek\",\n \"编码_MacTurkish\",\n \"编码_Macintosh\",\n \"编码_CP437\",\n \"编码_CP737\",\n \"编码_CP775\",\n \"编码_CP852\",\n \"编码_CP853\",\n \"编码_CP855\",\n \"编码_CP857\",\n \"编码_CP858\",\n \"编码_CP860\",\n \"编码_CP861\",\n \"编码_CP863\",\n \"编码_CP865\",\n \"编码_CP869\",\n \"编码_CP1125\",\n \"编码_ISO_8859_6\",\n \"编码_ISO_8859_8\",\n \"编码_CP1255\",\n \"编码_CP1256\",\n \"编码_CP862\",\n \"编码_MacHebrew\",\n \"编码_MacArabic\",\n \"编码_CP864\",\n \"编码_ARMSCII_8\",\n \"编码_Georgian_Academy\",\n \"编码_Georgian_PS\",\n \"编码_KOI8_T\",\n \"编码_TIS_620\",\n \"编码_CP874\",\n \"编码_MacThai\",\n \"编码_MuleLao_1\",\n \"编码_CP1133\",\n \"编码_VISCII\",\n \"编码_TCVN\",\n \"编码_CP1258\",\n \"编码_TDS565\",\n \"编码_HP_ROMAN8\",\n \"编码_NEXTSTEP\",\n \"编码_RISCOS_LATIN1\",\n \"编码_char\",\n \"编码_wchar_t\"\n ],\n \"dataTypes\": []\n },\n \"spec\": {\n \"name\": \"特殊功能支持库\",\n \"cmds\": [\n \"置入代码\",\n \"取变量地址\",\n \"取子程序地址\",\n \"取变量数据地址\",\n \"调试输出\",\n \"验证\",\n \"调用子程序\",\n \"延迟\",\n \"推迟调用子程序\",\n \"申请内存\",\n \"释放内存\",\n \"调用易系统功能\",\n \"取文本\",\n \"取文本_属性设置\",\n \"取文本_属性读取\",\n \"推迟调用子程序_高精度计时\"\n ],\n \"constants\": [],\n \"dataTypes\": []\n }\n}\n"],"mappings":""}
@@ -128,3 +128,5 @@ var z = class {
128
128
  };
129
129
  //#endregion
130
130
  export { z as IdToNameMap, L as parseDebugComment };
131
+
132
+ //# sourceMappingURL=idToNameMap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idToNameMap.js","names":[],"sources":["../../../../src/lib/epl/names/idToNameMap.ts"],"sourcesContent":["/**\n * Id → name resolution — port of `IDToNameMap.cs`.\n *\n * Resolves every Id (variable / method / constant / class / control / data type …) to a display name from four\n * sources, innermost first: (1) built-in system data-type names, (2) user-defined names collected from the\n * parsed sections, (3) support-library names (pluggable {@link LibNameProvider}; populated by the predumped\n * JSON in a later milestone — placeholder Ids until then), (4) debug-comment names (`_-@[MS]<name>` regex) that\n * rescue anonymized members. Unknown Ids fall back to a typed placeholder like `_Sub_0x000001` / `_User_0x…`.\n */\nimport type { EplDocument } from '../eplDocument'\nimport {\n DATATYPE_ANY,\n DATATYPE_BIN,\n DATATYPE_BOOL,\n DATATYPE_BYTE,\n DATATYPE_DATETIME,\n DATATYPE_DOUBLE,\n DATATYPE_FLOAT,\n DATATYPE_INT,\n DATATYPE_LAMBDA,\n DATATYPE_LONG,\n DATATYPE_METHODPTR,\n DATATYPE_SHORT,\n DATATYPE_STRING,\n DATATYPE_VOID,\n decomposeLibDataTypeId,\n getType,\n isLibDataType,\n MASK_NUM,\n TYPE_CLASS,\n TYPE_CLASS_MEMBER,\n TYPE_CONSTANT,\n TYPE_DLL,\n TYPE_DLL_PARAMETER,\n TYPE_FORM,\n TYPE_FORM_CLASS,\n TYPE_FORM_CONTROL,\n TYPE_FORM_MENU,\n TYPE_FORM_SELF,\n TYPE_GLOBAL,\n TYPE_IMAGE_RESOURCE,\n TYPE_LOCAL,\n TYPE_METHOD,\n TYPE_SOUND_RESOURCE,\n TYPE_STATIC_CLASS,\n TYPE_STRUCT,\n TYPE_STRUCT_MEMBER,\n} from '../model/eplSystemId'\n\n/** Pluggable support-library name lookup (filled from the predumped lib JSON; null ⇒ use the placeholder). */\nexport interface LibNameProvider {\n cmdName(lib: number, id: number): string | null\n typeName(lib: number, id: number): string | null\n constantName(lib: number, id: number): string | null\n typeEventName(lib: number, type: number, id: number): string | null\n typeMemberName(lib: number, type: number, id: number): string | null\n}\n\nconst SYSTEM_DATA_TYPE_NAME = new Map<number, string>([\n [DATATYPE_BIN, '字节集'],\n [DATATYPE_BOOL, '逻辑型'],\n [DATATYPE_BYTE, '字节型'],\n [DATATYPE_DATETIME, '日期时间型'],\n [DATATYPE_DOUBLE, '双精度小数型'],\n [DATATYPE_FLOAT, '小数型'],\n [DATATYPE_INT, '整数型'],\n [DATATYPE_LONG, '长整数型'],\n [DATATYPE_METHODPTR, '子程序指针'],\n [DATATYPE_SHORT, '短整数型'],\n [DATATYPE_STRING, '文本型'],\n [DATATYPE_ANY, '通用型'],\n [DATATYPE_LAMBDA, '条件语句型'],\n [DATATYPE_VOID, ''],\n])\n\nconst ID_TYPE_NAME = new Map<number, string>([\n [TYPE_METHOD, 'Sub'],\n [TYPE_GLOBAL, 'Global'],\n [TYPE_STATIC_CLASS, 'Mod'],\n [TYPE_DLL, 'Dll'],\n [TYPE_CLASS_MEMBER, 'Mem'],\n [TYPE_FORM_CONTROL, 'Control'],\n [TYPE_FORM_MENU, 'Menu'],\n [TYPE_CONSTANT, 'Const'],\n [TYPE_FORM_CLASS, 'FormCls'],\n [TYPE_LOCAL, 'Local'],\n [TYPE_IMAGE_RESOURCE, 'Img'],\n [TYPE_SOUND_RESOURCE, 'Sound'],\n [TYPE_STRUCT_MEMBER, 'StructMem'],\n [TYPE_STRUCT, 'Struct'],\n [TYPE_DLL_PARAMETER, 'DllParam'],\n [TYPE_CLASS, 'Cls'],\n [TYPE_FORM, 'Form'],\n])\n\nconst DEBUG_COMMENT_RE = /^_-@[MS]<([_A-Za-z€-￿][_0-9A-Za-z€-￿]*)>$/\n\n/** Extract a rescued name from a debug comment (`_-@M<名称>` / `_-@S<名称>`), or null. */\nexport function parseDebugComment(comment: string | null | undefined): string | null {\n if (!comment) return null\n const m = DEBUG_COMMENT_RE.exec(comment)\n return m ? m[1] : null\n}\n\nfunction hex(n: number, width: number): string {\n return (n >>> 0).toString(16).toUpperCase().padStart(width, '0')\n}\n\nexport class IdToNameMap {\n readonly userDefinedName = new Map<number, string>()\n readonly methodIdToClassId = new Map<number, number>()\n private readonly libProvider: LibNameProvider | null\n\n constructor(doc: EplDocument, libProvider: LibNameProvider | null = null) {\n this.libProvider = libProvider\n const cs = doc.code\n if (cs) {\n for (const method of cs.methods) {\n if (!method.name) {\n const symbol = parseDebugComment(method.comment)\n if (symbol != null) this.userDefinedName.set(method.id, symbol)\n } else {\n this.userDefinedName.set(method.id, method.name)\n }\n for (const x of method.parameters) this.userDefinedName.set(x.id, x.name)\n for (const x of method.variables) this.userDefinedName.set(x.id, x.name)\n }\n for (const dll of cs.dllDeclares) {\n this.userDefinedName.set(dll.id, dll.name)\n for (const x of dll.parameters) this.userDefinedName.set(x.id, x.name)\n }\n for (const classInfo of cs.classes) {\n for (const item of classInfo.methods) this.methodIdToClassId.set(item, classInfo.id)\n if (!classInfo.name) {\n const symbol = parseDebugComment(classInfo.comment)\n if (symbol != null) this.userDefinedName.set(classInfo.id, symbol)\n } else {\n this.userDefinedName.set(classInfo.id, classInfo.name)\n }\n for (const x of classInfo.variables) this.userDefinedName.set(x.id, x.name)\n }\n for (const structInfo of cs.structs) {\n this.userDefinedName.set(structInfo.id, structInfo.name)\n for (const x of structInfo.members) this.userDefinedName.set(x.id, x.name)\n }\n for (const x of cs.globalVariables) this.userDefinedName.set(x.id, x.name)\n }\n const rs = doc.resource\n if (rs) {\n for (const x of rs.constants) this.userDefinedName.set(x.id, x.name)\n for (const form of rs.forms) {\n this.userDefinedName.set(form.id, form.name)\n for (const x of form.elements) this.userDefinedName.set(x.id, x.name)\n }\n }\n // Losable section: fallback names for ids removed via delete/undo — only when not already named.\n const ls = doc.losable\n if (ls) {\n for (const x of ls.removedItems) {\n if (!this.userDefinedName.has(x.id)) this.userDefinedName.set(x.id, x.name)\n }\n }\n if (cs && cs.mainMethod !== 0) {\n this.userDefinedName.set(cs.mainMethod, '_启动子程序')\n // Anonymous (empty-name) entries are dropped — only meaningful for modules.\n const toRemove: number[] = []\n for (const [k, v] of this.userDefinedName) if (!v) toRemove.push(k)\n for (const k of toRemove) this.userDefinedName.delete(k)\n }\n }\n\n getUserDefinedName(id: number): string {\n const u = this.userDefinedName.get(id)\n if (u !== undefined) return u\n const type = getType(id)\n const tn = ID_TYPE_NAME.get(type)\n if (tn !== undefined) return `_${tn}_0x${hex(id & MASK_NUM, 6)}`\n if (type === TYPE_FORM_SELF) return ''\n return `_User_0x${hex(id, 8)}`\n }\n\n getDataTypeName(id: number): string {\n const s = SYSTEM_DATA_TYPE_NAME.get(id)\n if (s !== undefined) return s\n if (isLibDataType(id)) {\n const { lib, type } = decomposeLibDataTypeId(id)\n return this.getLibTypeName(lib, type)\n }\n return this.getUserDefinedName(id)\n }\n\n getLibCmdName(lib: number, id: number): string {\n return this.libProvider?.cmdName(lib, id) ?? `_Lib${lib}Cmd${id}`\n }\n getLibTypeName(lib: number, id: number): string {\n return this.libProvider?.typeName(lib, id) ?? `_Lib${lib}Type${id}`\n }\n getLibConstantName(lib: number, id: number): string {\n return this.libProvider?.constantName(lib, id) ?? `_Lib${lib}Const${id}`\n }\n getLibTypeEventName(lib: number, type: number, id: number): string {\n return this.libProvider?.typeEventName(lib, type, id) ?? `_Lib${lib}Type${type}Event${id}`\n }\n getLibTypeMemberName(lib: number, type: number, id: number): string {\n return this.libProvider?.typeMemberName(lib, type, id) ?? `_Lib${lib}Type${type}Mem${id}`\n }\n}\n"],"mappings":"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"}
@@ -16,3 +16,5 @@ function r(e) {
16
16
  }
17
17
  //#endregion
18
18
  export { r as buildLibNameProvider };
19
+
20
+ //# sourceMappingURL=libNameProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"libNameProvider.js","names":[],"sources":["../../../../src/lib/epl/names/libNameProvider.ts"],"sourcesContent":["/**\n * Support-library name provider — turns `_Lib0Cmd13` placeholders into real names (返回 / 到文本 / 信息框 …).\n *\n * Backed by {@link eplLibData.json}, predumped from the actual e-language `.fne` support libraries via the C#\n * `OpenEpl.ELibInfo` loader (keyed by library fileName, e.g. `krnln` / `iconv` / `spec`). A project's library\n * list gives the per-index identity, so {@link buildLibNameProvider} resolves the decompiler's (libIndex, id)\n * pairs to names. A library not in the DB (or an out-of-range id) falls back to the placeholder in IdToNameMap.\n *\n * To extend coverage, regenerate the JSON with the oracle's `libdump` mode over more projects (their `.fne`\n * libraries are read from the local e-language install).\n */\nimport type { LibraryRefInfo } from '../code/structures'\nimport type { LibNameProvider } from './idToNameMap'\nimport libData from './eplLibData.json'\n\ninterface LibEntry {\n name: string\n cmds: string[]\n constants: string[]\n dataTypes: { name: string; members: string[]; events: string[] }[]\n}\n\nconst DB = libData as unknown as Record<string, LibEntry>\n\nfunction at<T>(arr: T[] | undefined, i: number): T | undefined {\n return arr && i >= 0 && i < arr.length ? arr[i] : undefined\n}\n\n/** Build a {@link LibNameProvider} for a project, mapping each library index to its predumped name table. */\nexport function buildLibNameProvider(libraries: LibraryRefInfo[]): LibNameProvider {\n const byIndex = libraries.map((l) => DB[l.fileName.toLowerCase()])\n return {\n cmdName: (lib, id) => at(byIndex[lib]?.cmds, id) ?? null,\n typeName: (lib, id) => at(byIndex[lib]?.dataTypes, id)?.name ?? null,\n constantName: (lib, id) => at(byIndex[lib]?.constants, id) ?? null,\n typeMemberName: (lib, type, id) => at(at(byIndex[lib]?.dataTypes, type)?.members, id) ?? null,\n typeEventName: (lib, type, id) => at(at(byIndex[lib]?.dataTypes, type)?.events, id) ?? null,\n }\n}\n"],"mappings":";;AAsBA,IAAM,IAAK;AAEX,SAAS,EAAM,GAAsB,GAA0B;CAC7D,OAAO,KAAO,KAAK,KAAK,IAAI,EAAI,SAAS,EAAI,KAAK,KAAA;AACpD;AAGA,SAAgB,EAAqB,GAA8C;CACjF,IAAM,IAAU,EAAU,KAAK,MAAM,EAAG,EAAE,SAAS,YAAY,EAAE;CACjE,OAAO;EACL,UAAU,GAAK,MAAO,EAAG,EAAQ,EAAI,EAAE,MAAM,CAAE,KAAK;EACpD,WAAW,GAAK,MAAO,EAAG,EAAQ,EAAI,EAAE,WAAW,CAAE,CAAC,EAAE,QAAQ;EAChE,eAAe,GAAK,MAAO,EAAG,EAAQ,EAAI,EAAE,WAAW,CAAE,KAAK;EAC9D,iBAAiB,GAAK,GAAM,MAAO,EAAG,EAAG,EAAQ,EAAI,EAAE,WAAW,CAAI,CAAC,EAAE,SAAS,CAAE,KAAK;EACzF,gBAAgB,GAAK,GAAM,MAAO,EAAG,EAAG,EAAQ,EAAI,EAAE,WAAW,CAAI,CAAC,EAAE,QAAQ,CAAE,KAAK;CACzF;AACF"}
@@ -132,3 +132,5 @@ function g(n) {
132
132
  }
133
133
  //#endregion
134
134
  export { g as buildProgram };
135
+
136
+ //# sourceMappingURL=program.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"program.js","names":[],"sources":["../../../src/lib/epl/program.ts"],"sourcesContent":["/**\n * Structured program model for the IDE-style viewer — turns the parsed {@link EplDocument} + {@link IdToNameMap}\n * into the shape the Vue components render directly: classes (each as 程序集 / 窗口程序集 / 类) with their\n * member-variable rows + methods (header fields, parameter rows, local rows, decompiled code lines), plus the\n * project-level tables (全局变量 / 自定义数据类型 / Dll命令 / 常量表 / 资源表 / 模块引用表).\n *\n * Names/types resolve through {@link IdToNameMap}; code bodies through {@link methodCodeLines}. This sits on top\n * of the already-validated parse + decompile layers — it only reshapes, it does not re-parse.\n */\nimport { methodCodeLines, type CodeLine } from './code/codeLines'\nimport { formatNumber, formatOADate } from './code/textCode'\nimport type { DllDeclareInfo, MethodInfo, StructInfo } from './code/structures'\nimport type { EplVariable, EplVarKind } from './code/variable'\nimport type { EplDocument } from './eplDocument'\nimport { decoderForLanguage } from './io/encoding'\nimport { IdToNameMap, parseDebugComment } from './names/idToNameMap'\nimport { buildLibNameProvider } from './names/libNameProvider'\nimport type { EplConstantValue } from './sections/resource'\nimport {\n getType,\n TYPE_CONSTANT,\n TYPE_FORM_CLASS,\n TYPE_CLASS,\n TYPE_IMAGE_RESOURCE,\n TYPE_SOUND_RESOURCE,\n} from './model/eplSystemId'\n\n/** 程序集 (static) / 窗口程序集 (form) / 类 (class) — decided by the high byte of the class id. */\nexport type EplClassKind = 'static' | 'form' | 'class'\n\n/** A single variable row (parameter / local / member / global / struct member / DLL parameter). */\nexport interface EplVarRow {\n kind: EplVarKind\n name: string\n type: string\n /** 公开 (global flag 0x100). */\n isPublic: boolean\n /** 静态 (local flag 0x1). */\n isStatic: boolean\n /** 传址 (struct member / DLL parameter flag 0x2). */\n byAddress: boolean\n /** 参考 (method parameter flag 0x2). */\n byReference: boolean\n /** 可空 (method parameter flag 0x4). */\n nullable: boolean\n /** Array bounds spec for variables/members (`\"\"` scalar, `\"0\"` dynamic, `\"3,4\"` fixed). */\n arrayBound: string\n /** 数组 checkbox for parameters/DLL parameters (flag 0x8). */\n isArray: boolean\n comment: string\n}\n\nexport interface EplMethodView {\n id: number\n name: string\n returnType: string\n isPublic: boolean\n comment: string\n parameters: EplVarRow[]\n locals: EplVarRow[]\n lines: CodeLine[]\n}\n\nexport interface EplClassView {\n id: number\n kind: EplClassKind\n name: string\n /** Base-class name (类 only); `\"\"` when none. */\n baseName: string\n comment: string\n members: EplVarRow[]\n methods: EplMethodView[]\n}\n\nexport interface EplStructView {\n id: number\n name: string\n isPublic: boolean\n comment: string\n members: EplVarRow[]\n}\n\nexport interface EplDllView {\n id: number\n name: string\n returnType: string\n isPublic: boolean\n comment: string\n libraryName: string\n entryPoint: string\n parameters: EplVarRow[]\n}\n\nexport interface EplConstantRow {\n id: number\n name: string\n /** Scalar value pre-formatted to the code view's literal style (number / 真·假 / [日期时间] / “文本”). */\n value: string\n comment: string\n}\n\n/**\n * An 图片 / 声音 resource (a constant whose id high-nibble is 2 / 3). Shown on its own 图片/声音 page, not in the\n * constant table. `bytes` is the raw resource payload; the component sniffs / decodes it (a 图片组 is a Windows\n * ImageList — see {@link parseEplImageList}; a plain image is rendered inline; a sound gets an audio player).\n */\nexport interface EplResourceRow {\n id: number\n name: string\n comment: string\n kind: 'image' | 'sound'\n bytes: Uint8Array\n}\n\nexport interface EplFormElementView {\n id: number\n name: string\n type: string\n}\n\nexport interface EplFormView {\n id: number\n name: string\n className: string\n comment: string\n elements: EplFormElementView[]\n}\n\nexport interface EplLibraryView {\n name: string\n fileName: string\n version: string\n}\n\nexport interface EplProgram {\n classes: EplClassView[]\n globals: EplVarRow[]\n structs: EplStructView[]\n dllDeclares: EplDllView[]\n constants: EplConstantRow[]\n resources: EplResourceRow[]\n forms: EplFormView[]\n libraries: EplLibraryView[]\n}\n\nfunction uboundDisplay(uBound: number[]): string {\n if (uBound.length === 0) return ''\n if (uBound.length === 1 && uBound[0] === 0) return '0'\n return uBound.map((x) => (x === 0 ? '' : String(x))).join(',')\n}\n\n/**\n * A stripped `.ec` module stores the rescued name as a debug-marker comment (`_-@M<名称>` / `_-@S<名称>`); the\n * name is already lifted into the id map, so the marker is internal noise — blank it for display. Real comments\n * (which never match the marker shape) pass through untouched.\n */\nfunction cleanComment(comment: string): string {\n return parseDebugComment(comment) != null ? '' : comment\n}\n\n/** Format a scalar constant value to display text in the code view's literal style (resources never reach here). */\nfunction scalarText(v: EplConstantValue): string {\n switch (v.kind) {\n case 'double':\n return formatNumber(v.value)\n case 'bool':\n return v.value ? '真' : '假'\n case 'datetime':\n return '[' + formatOADate(v.oa) + ']'\n case 'string':\n return '“' + v.value + '”'\n default: // null / (defensively) image-sound\n return ''\n }\n}\n\nfunction varRow(v: EplVariable, nm: IdToNameMap): EplVarRow {\n return {\n kind: v.kind,\n name: nm.getUserDefinedName(v.id),\n type: nm.getDataTypeName(v.dataType),\n isPublic: (v.flags & 0x100) !== 0,\n isStatic: (v.flags & 0x1) !== 0,\n byAddress: (v.flags & 0x2) !== 0,\n byReference: (v.flags & 0x2) !== 0,\n nullable: (v.flags & 0x4) !== 0,\n arrayBound: uboundDisplay(v.uBound),\n isArray: (v.flags & 0x8) !== 0,\n comment: cleanComment(v.comment),\n }\n}\n\nfunction classKind(id: number): EplClassKind {\n const t = getType(id)\n if (t === TYPE_CLASS) return 'class'\n if (t === TYPE_FORM_CLASS) return 'form'\n return 'static'\n}\n\nfunction methodView(m: MethodInfo, nm: IdToNameMap, dec: TextDecoder): EplMethodView {\n return {\n id: m.id,\n name: nm.getUserDefinedName(m.id),\n returnType: nm.getDataTypeName(m.returnDataType),\n isPublic: (m.flags & 0x8) !== 0,\n comment: cleanComment(m.comment),\n parameters: m.parameters.map((p) => varRow(p, nm)),\n locals: m.variables.map((v) => varRow(v, nm)),\n lines: methodCodeLines(m.codeData.expressionData, nm, dec),\n }\n}\n\nfunction structView(st: StructInfo, nm: IdToNameMap): EplStructView {\n return {\n id: st.id,\n name: nm.getUserDefinedName(st.id),\n isPublic: (st.flags & 0x1) !== 0,\n comment: cleanComment(st.comment),\n members: st.members.map((mem) => varRow(mem, nm)),\n }\n}\n\nfunction dllView(d: DllDeclareInfo, nm: IdToNameMap): EplDllView {\n return {\n id: d.id,\n name: nm.getUserDefinedName(d.id),\n returnType: nm.getDataTypeName(d.returnDataType),\n isPublic: (d.flags & 0x2) !== 0,\n comment: cleanComment(d.comment),\n libraryName: d.libraryName,\n entryPoint: d.entryPoint,\n parameters: d.parameters.map((p) => varRow(p, nm)),\n }\n}\n\n/** Build the structured model for the viewer. Returns empty tables when a `.e`/`.ec` has no code section. */\nexport function buildProgram(doc: EplDocument): EplProgram {\n const dec = decoderForLanguage(doc.systemInfo?.language ?? 1)\n const libProvider = doc.code ? buildLibNameProvider(doc.code.libraries) : null\n const nm = new IdToNameMap(doc, libProvider)\n const cs = doc.code\n\n const methodById = new Map<number, MethodInfo>()\n if (cs) for (const m of cs.methods) methodById.set(m.id, m)\n\n const classes: EplClassView[] = (cs?.classes ?? []).map((c) => {\n const baseName =\n c.baseClass === 0 || c.baseClass === -1 ? '' : nm.getUserDefinedName(c.baseClass)\n const methods: EplMethodView[] = []\n for (const id of c.methods) {\n const m = methodById.get(id)\n if (m) methods.push(methodView(m, nm, dec))\n }\n return {\n id: c.id,\n kind: classKind(c.id),\n name: nm.getUserDefinedName(c.id),\n baseName,\n comment: c.comment,\n members: c.variables.map((v) => varRow(v, nm)),\n methods,\n }\n })\n\n // Resource-section \"constants\" split by id high-byte: 普通常量 (scalars) → the 常量表; 图片 / 声音 → the\n // separate 图片/声音 page. Both drop empty-RAW-name entries (常量分组 separators) before name resolution (a\n // resolved name would be a `_Const_0x…` placeholder once the main method triggers anonymous-member cleanup).\n const rs = doc.resource\n const allRes = rs?.constants ?? []\n const constants: EplConstantRow[] = allRes\n .filter((c) => getType(c.id) === TYPE_CONSTANT && c.name)\n .map((c) => ({\n id: c.id,\n name: nm.getUserDefinedName(c.id),\n value: scalarText(c.value),\n comment: cleanComment(c.comment),\n }))\n const resources: EplResourceRow[] = allRes\n .filter((c) => {\n const t = getType(c.id)\n return (t === TYPE_IMAGE_RESOURCE || t === TYPE_SOUND_RESOURCE) && c.name\n })\n .map((c) => ({\n id: c.id,\n name: nm.getUserDefinedName(c.id),\n comment: cleanComment(c.comment),\n kind: getType(c.id) === TYPE_IMAGE_RESOURCE ? ('image' as const) : ('sound' as const),\n bytes:\n c.value.kind === 'image' || c.value.kind === 'sound' ? c.value.bytes : new Uint8Array(0),\n }))\n const forms: EplFormView[] = (rs?.forms ?? []).map((f) => ({\n id: f.id,\n name: nm.getUserDefinedName(f.id),\n className: f.classId ? nm.getUserDefinedName(f.classId) : '',\n comment: cleanComment(f.comment),\n elements: f.elements.map((e) => ({\n id: e.id,\n name: nm.getUserDefinedName(e.id),\n type: nm.getDataTypeName(e.dataType),\n })),\n }))\n\n return {\n classes,\n globals: (cs?.globalVariables ?? []).map((v) => varRow(v, nm)),\n structs: (cs?.structs ?? []).map((st) => structView(st, nm)),\n dllDeclares: (cs?.dllDeclares ?? []).map((d) => dllView(d, nm)),\n constants,\n resources,\n forms,\n libraries: (cs?.libraries ?? []).map((l) => ({\n name: l.name,\n fileName: l.fileName,\n version: l.version.join('.'),\n })),\n }\n}\n"],"mappings":"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"}
@@ -63,3 +63,5 @@ function u(t, n) {
63
63
  }
64
64
  //#endregion
65
65
  export { s as EplEncryptedError, c as NotEplFileError, l as ProjectFileReader };
66
+
67
+ //# sourceMappingURL=projectFileReader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectFileReader.js","names":[],"sources":["../../../src/lib/epl/projectFileReader.ts"],"sourcesContent":["/**\n * File-header validation + section splitting — port of `ProjectFileReader.cs` (read path only).\n *\n * Reads the two header int32s, detects the optional encryption header (`WTLE`; decryption is a later\n * milestone — we surface a typed {@link EplEncryptedError} for now), validates the main `CNWTEPRG` magic,\n * then yields one {@link RawSection} per call until the end-of-file section (key 0x07007319). The 30-byte\n * section name is XOR-decoded by the key's little-endian bytes (note the `(i+1)%4` index, and that the\n * end section is NOT XOR'd). Checksums / index / reserved fields are skipped, exactly as the C# does.\n */\nimport { BinaryReader } from './io/binaryReader'\nimport { gbk } from './io/encoding'\nimport type { RawSection } from './model/section'\n\nconst MAGIC_SECTION = 0x15117319\nconst KEY_END = 0x07007319\nconst MAGIC_WTLE = 0x454c5457 // \"WTLE\" — encryption header\nconst MAGIC_MAIN1 = 0x54574e43 // \"CNWT\"\nconst MAGIC_MAIN2 = 0x47525045 // \"EPRG\" → together \"CNWTEPRG\"\n\nexport type EplCryptoType = 'estd' | 'ec' | 'unknown'\n\n/**\n * The file carries an encryption header. Decryption (RC4 / EStd / EC) is a later milestone; the loader\n * surfaces this so the UI can explain it. The EC branch still reads the password-hint string into {@link tip}.\n */\nexport class EplEncryptedError extends Error {\n constructor(\n readonly cryptoType: EplCryptoType,\n readonly tip?: string,\n ) {\n super('加密的易语言工程文件(暂未支持解密)')\n this.name = 'EplEncryptedError'\n }\n}\n\n/** The bytes aren't an e-language project file (main magic mismatch). */\nexport class NotEplFileError extends Error {\n constructor(message = '不是易语言工程文件') {\n super(message)\n this.name = 'NotEplFileError'\n }\n}\n\nexport class ProjectFileReader {\n private readonly r: BinaryReader\n isFinish = false\n /** Set once EC decryption is wired up (later milestone); flips a few section layouts + dataLength. */\n cryptEC = false\n\n constructor(bytes: Uint8Array) {\n this.r = new BinaryReader(bytes, gbk())\n const magic1 = this.r.readInt32()\n const magic2 = this.r.readInt32()\n if (magic1 === MAGIC_WTLE) {\n if (magic2 === 0x00000001) throw new EplEncryptedError('estd')\n if (magic2 === 0x00020001) {\n const tipBytes = this.r.readInt32()\n const tip = this.r.readStringWithFixedLength(tipBytes, gbk())\n throw new EplEncryptedError('ec', tip)\n }\n throw new EplEncryptedError('unknown')\n }\n if (magic1 !== MAGIC_MAIN1 || magic2 !== MAGIC_MAIN2) {\n throw new NotEplFileError()\n }\n }\n\n readSection(): RawSection {\n if (this.isFinish) throw new Error('已到文件末尾')\n if (this.r.readInt32() !== MAGIC_SECTION) throw new Error('段 Magic 错误')\n this.r.readInt32() // skip InfoCheckSum\n const key = this.r.readInt32()\n const name = decodeName(key, this.r.readBytes(30))\n this.r.readInt16() // alignment padding (confirmed on V5.71)\n this.r.readInt32() // skip Index\n const isOptional = this.r.readInt32() !== 0\n this.r.readInt32() // skip DataCheckSum\n let dataLength = this.r.readInt32()\n if (this.cryptEC) dataLength ^= 1\n this.r.skip(40) // reserved, unused (confirmed on V5.71)\n const data = this.r.readBytes(dataLength)\n if (key === KEY_END) this.isFinish = true\n return { key, name, isOptional, data }\n }\n}\n\n/** XOR-decode the 30-byte name by the key's little-endian bytes at (i+1)%4, truncate at the first NUL, GBK. */\nfunction decodeName(key: number, encoded: Uint8Array): string {\n const r = encoded.slice()\n if (key !== KEY_END) {\n const kb = [key & 0xff, (key >> 8) & 0xff, (key >> 16) & 0xff, (key >> 24) & 0xff]\n for (let i = 0; i < r.length; i++) r[i] ^= kb[(i + 1) % 4]\n }\n let end = r.indexOf(0)\n if (end === -1) end = r.length\n return gbk().decode(r.subarray(0, end))\n}\n"],"mappings":";;;AAaA,IAAM,IAAgB,WAChB,IAAU,WACV,IAAa,YACb,IAAc,YACd,IAAc,YAQP,IAAb,cAAuC,MAAM;CAEhC;CACA;CAFX,YACE,GACA,GACA;EAEA,AADA,MAAM,oBAAoB,GAHjB,KAAA,aAAA,GACA,KAAA,MAAA,GAGT,KAAK,OAAO;CACd;AACF,GAGa,IAAb,cAAqC,MAAM;CACzC,YAAY,IAAU,aAAa;EAEjC,AADA,MAAM,CAAO,GACb,KAAK,OAAO;CACd;AACF,GAEa,IAAb,MAA+B;CAC7B;CACA,WAAW;CAEX,UAAU;CAEV,YAAY,GAAmB;EAC7B,KAAK,IAAI,IAAI,EAAa,GAAO,EAAI,CAAC;EACtC,IAAM,IAAS,KAAK,EAAE,UAAU,GAC1B,IAAS,KAAK,EAAE,UAAU;EAChC,IAAI,MAAW,GAAY;GACzB,IAAI,MAAW,GAAY,MAAM,IAAI,EAAkB,MAAM;GAC7D,IAAI,MAAW,QAAY;IACzB,IAAM,IAAW,KAAK,EAAE,UAAU;IAElC,MAAM,IAAI,EAAkB,MADhB,KAAK,EAAE,0BAA0B,GAAU,EAAI,CACzB,CAAG;GACvC;GACA,MAAM,IAAI,EAAkB,SAAS;EACvC;EACA,IAAI,MAAW,KAAe,MAAW,GACvC,MAAM,IAAI,EAAgB;CAE9B;CAEA,cAA0B;EACxB,IAAI,KAAK,UAAU,MAAU,MAAM,QAAQ;EAC3C,IAAI,KAAK,EAAE,UAAU,MAAM,GAAe,MAAU,MAAM,YAAY;EACtE,KAAK,EAAE,UAAU;EACjB,IAAM,IAAM,KAAK,EAAE,UAAU,GACvB,IAAO,EAAW,GAAK,KAAK,EAAE,UAAU,EAAE,CAAC;EAEjD,AADA,KAAK,EAAE,UAAU,GACjB,KAAK,EAAE,UAAU;EACjB,IAAM,IAAa,KAAK,EAAE,UAAU,MAAM;EAC1C,KAAK,EAAE,UAAU;EACjB,IAAI,IAAa,KAAK,EAAE,UAAU;EAElC,AADI,KAAK,YAAS,KAAc,IAChC,KAAK,EAAE,KAAK,EAAE;EACd,IAAM,IAAO,KAAK,EAAE,UAAU,CAAU;EAExC,OADI,MAAQ,MAAS,KAAK,WAAW,KAC9B;GAAE;GAAK;GAAM;GAAY;EAAK;CACvC;AACF;AAGA,SAAS,EAAW,GAAa,GAA6B;CAC5D,IAAM,IAAI,EAAQ,MAAM;CACxB,IAAI,MAAQ,GAAS;EACnB,IAAM,IAAK;GAAC,IAAM;GAAO,KAAO,IAAK;GAAO,KAAO,KAAM;GAAO,KAAO,KAAM;EAAI;EACjF,KAAK,IAAI,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK,EAAE,MAAM,GAAI,IAAI,KAAK;CAC1D;CACA,IAAI,IAAM,EAAE,QAAQ,CAAC;CAErB,OADI,MAAQ,OAAI,IAAM,EAAE,SACjB,EAAI,CAAC,CAAC,OAAO,EAAE,SAAS,GAAG,CAAG,CAAC;AACxC"}
package/dist/lib/fb2.js CHANGED
@@ -60,3 +60,5 @@ function o(e) {
60
60
  }
61
61
  //#endregion
62
62
  export { o as parseFb2 };
63
+
64
+ //# sourceMappingURL=fb2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fb2.js","names":[],"sources":["../../src/lib/fb2.ts"],"sourcesContent":["/**\n * Hand-rolled, zero-dependency FictionBook 2 (.fb2) parser for the side viewer.\n *\n * FB2 is an XML e-book format. This walks the `<body>` tree, mapping the FB2 elements to a small whitelist of\n * HTML tags (everything else falls through to its inner content), resolves `<image>` references to the inline\n * `<binary>` base64 blobs as data URLs, and returns a COMPLETE, self-contained HTML document string ready to\n * drop into a sandboxed iframe — it carries a `script-src 'none'` CSP and only ever emits known tags with\n * escaped text, so the book's markup can't inject anything executable.\n */\n\nconst XLINK = 'http://www.w3.org/1999/xlink'\n\nfunction escapeHtml(s: string): string {\n return s\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n}\n\n// Collect <binary id content-type>…base64…</binary> → data URL by id.\nfunction collectBinaries(doc: Document): Map<string, string> {\n const map = new Map<string, string>()\n for (const bin of Array.from(doc.getElementsByTagName('binary'))) {\n const id = bin.getAttribute('id')\n if (!id) continue\n const ct = bin.getAttribute('content-type') || 'image/jpeg'\n const b64 = (bin.textContent || '').replace(/\\s+/g, '')\n if (b64) map.set(id, `data:${ct};base64,${b64}`)\n }\n return map\n}\n\nfunction imageHref(el: Element): string {\n return (\n el.getAttributeNS(XLINK, 'href') ||\n el.getAttribute('xlink:href') ||\n el.getAttribute('l:href') ||\n el.getAttribute('href') ||\n ''\n )\n}\n\n// Map an FB2 element to HTML. Unknown tags pass through their children, so structure is never lost.\nfunction serialize(node: Node, bins: Map<string, string>): string {\n if (node.nodeType === 3) return escapeHtml(node.textContent || '') // text\n if (node.nodeType !== 1) return ''\n const el = node as Element\n const inner = (): string =>\n Array.from(el.childNodes)\n .map((c) => serialize(c, bins))\n .join('')\n switch (el.tagName.toLowerCase()) {\n case 'p':\n return `<p>${inner()}</p>`\n case 'empty-line':\n return '<br>'\n case 'emphasis':\n return `<em>${inner()}</em>`\n case 'strong':\n return `<strong>${inner()}</strong>`\n case 'strikethrough':\n return `<s>${inner()}</s>`\n case 'sub':\n return `<sub>${inner()}</sub>`\n case 'sup':\n return `<sup>${inner()}</sup>`\n case 'code':\n return `<code>${inner()}</code>`\n case 'title':\n return `<header class=\"fb2-title\">${inner()}</header>`\n case 'subtitle':\n return `<p class=\"fb2-subtitle\">${inner()}</p>`\n case 'section':\n return `<section>${inner()}</section>`\n case 'epigraph':\n return `<blockquote class=\"fb2-epigraph\">${inner()}</blockquote>`\n case 'cite':\n return `<blockquote>${inner()}</blockquote>`\n case 'poem':\n return `<div class=\"fb2-poem\">${inner()}</div>`\n case 'stanza':\n return `<div class=\"fb2-stanza\">${inner()}</div>`\n case 'v':\n return `<p class=\"fb2-v\">${inner()}</p>`\n case 'text-author':\n return `<p class=\"fb2-author\">${inner()}</p>`\n case 'a':\n return `<span class=\"fb2-link\">${inner()}</span>` // links de-fanged to plain spans (no nav target)\n case 'image': {\n const src = bins.get(imageHref(el).replace(/^#/, ''))\n return src ? `<p class=\"fb2-img\"><img src=\"${src}\" alt=\"\"></p>` : ''\n }\n default:\n return inner()\n }\n}\n\nconst STYLE =\n `body{margin:0;padding:24px 28px 80px;max-width:46rem;margin-inline:auto;` +\n `font:16px/1.7 Georgia,'Source Serif 4',serif;color:#1a1a1a;background:#fff;` +\n `-webkit-text-size-adjust:100%}` +\n `img{max-width:100%;height:auto}` +\n `.fb2-title{margin:1.6em 0 1em;font-weight:700;font-size:1.3em;line-height:1.3}` +\n `.fb2-subtitle{font-weight:600;margin:1.2em 0 .6em}` +\n `.fb2-epigraph,blockquote{margin:1em 2em;color:#555;font-style:italic}` +\n `.fb2-poem{margin:1em 1.5em}.fb2-v{margin:0}.fb2-author{text-align:right;font-style:italic}` +\n `.fb2-img{text-align:center}p{margin:0 0 .9em;text-indent:1.4em}` +\n `.fb2-title p,.fb2-img,.fb2-v{text-indent:0}`\n\nexport interface ParsedFb2 {\n title: string\n html: string // a complete, sandbox-ready HTML document\n}\n\nexport function parseFb2(text: string): ParsedFb2 {\n const clean = text.charCodeAt(0) === 0xfeff ? text.slice(1) : text\n const doc = new DOMParser().parseFromString(clean, 'application/xml')\n if (doc.getElementsByTagName('parsererror').length) throw new Error('FB2 XML 解析失败')\n\n const bins = collectBinaries(doc)\n const bodies = Array.from(doc.getElementsByTagName('body'))\n if (!bodies.length) throw new Error('FB2 缺少 <body>')\n const bodyHtml = bodies.map((b) => serialize(b, bins)).join('\\n')\n\n const titleEl = doc.getElementsByTagName('book-title')[0]\n const title = (titleEl?.textContent || '').trim()\n\n const csp =\n `<meta http-equiv=\"Content-Security-Policy\" ` +\n `content=\"script-src 'none'; object-src 'none'; base-uri 'none'; form-action 'none'\">`\n const html =\n `<!doctype html><html><head><meta charset=\"utf-8\">${csp}` +\n `<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">` +\n `<style>${STYLE}</style></head><body>${bodyHtml}</body></html>`\n return { title, html }\n}\n"],"mappings":"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"}
@@ -798,3 +798,5 @@ function Je(n, r) {
798
798
  }
799
799
  //#endregion
800
800
  export { o as LARGE_TEXT_BYTES, j as ebookKind, e as fileExt, Je as hljsLang, J as isAppxFile, Re as isAudioFile, L as isBinaryObjFile, Te as isCertFile, te as isCsvFile, S as isDicomFile, X as isDocxFile, me as isDxfFile, ge as isEmlFile, R as isEplFile, Ue as isFontFile, je as isGeoFile, ye as isHarFile, H as isHprofFile, P as isHtmlFile, T as isImageFile, B as isJavaClassFile, Oe as isJksFile, u as isJsonlFile, s as isLogFile, qe as isLrcFile, _e as isMhtFile, de as isMindMapFile, Ie as isModelFile, G as isMsiFile, Be as isNotebookFile, le as isPdfFile, ae as isPptxFile, Ge as isQmcAudioFile, b as isRarFile, se as isRtfFile, h as isSevenZipFile, Se as isSqliteFile, Pe as isSubtitleFile, M as isSvgFile, v as isTarballFile, a as isTextFile, N as isVideoFile, re as isXlsxFile, pe as isXmindFile, p as isZipFile, A as rasterImageKind };
801
+
802
+ //# sourceMappingURL=fileType.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileType.js","names":[],"sources":["../../src/lib/fileType.ts"],"sourcesContent":["/**\n * File-type detection for the conversation file UIs.\n *\n * The proxy's stored `content_type` is unreliable (often `application/octet-stream`), so we never\n * trust it. Instead we prefer the share JSON's own `mime_type` (present on delivered `present_files`),\n * and fall back to the filename extension — which is all we have for user uploads / intermediate files.\n *\n * Two questions this answers:\n * - {@link isTextFile}: can we open it in the side viewer? (non-text files are download-only)\n * - {@link hljsLang}: which highlight.js language to colorize with ('' = plain, no highlighting)\n */\n\n/** Lowercased file extension without the dot, or '' if the name has none. */\nexport function fileExt(name: string): string {\n const base = (name || '').split(/[\\\\/]/).pop() ?? ''\n const dot = base.lastIndexOf('.')\n return dot > 0 ? base.slice(dot + 1).toLowerCase() : ''\n}\n\n// Extension → highlight.js language id. Covers the common code/markup types; anything textual but\n// unlisted renders as plain escaped text (see hljsLang returning '').\nconst EXT_LANG: Record<string, string> = {\n js: 'javascript',\n mjs: 'javascript',\n cjs: 'javascript',\n jsx: 'javascript',\n ts: 'typescript',\n tsx: 'typescript',\n mts: 'typescript',\n cts: 'typescript',\n py: 'python',\n pyw: 'python',\n rb: 'ruby',\n rs: 'rust',\n kt: 'kotlin',\n kts: 'kotlin',\n java: 'java',\n c: 'c',\n h: 'c',\n cc: 'cpp',\n cpp: 'cpp',\n cxx: 'cpp',\n hpp: 'cpp',\n hh: 'cpp',\n cs: 'csharp',\n go: 'go',\n php: 'php',\n swift: 'swift',\n scala: 'scala',\n sh: 'bash',\n bash: 'bash',\n zsh: 'bash',\n fish: 'bash',\n ps1: 'powershell',\n psm1: 'powershell',\n bat: 'dos',\n cmd: 'dos',\n yml: 'yaml',\n yaml: 'yaml',\n toml: 'ini',\n ini: 'ini',\n cfg: 'ini',\n conf: 'ini',\n properties: 'properties',\n json: 'json',\n json5: 'json',\n xml: 'xml',\n html: 'xml',\n htm: 'xml',\n svg: 'xml',\n vue: 'xml',\n svelte: 'xml',\n // Outline / mind-map XML — viewable + XML-highlighted in source view (`.mm` is also Objective-C++, but the\n // mind-map render is content-sniffed, so a non-XML `.mm` just reads as XML-tinted source — see isMindMapFile).\n opml: 'xml',\n mm: 'xml',\n css: 'css',\n scss: 'scss',\n sass: 'scss',\n less: 'less',\n sql: 'sql',\n md: 'markdown',\n markdown: 'markdown',\n gradle: 'gradle',\n groovy: 'groovy',\n lua: 'lua',\n r: 'r',\n dart: 'dart',\n pl: 'perl',\n diff: 'diff',\n patch: 'diff',\n}\n\n// Textual extensions we let the viewer open but don't syntax-highlight (rendered as plain escaped text).\n// NOTE: `.rtf` is deliberately NOT here — it renders as rich text in the side viewer (see isRtfFile), not source.\nconst PLAIN_EXT = new Set([\n 'txt',\n 'text',\n 'log',\n 'csv',\n 'tsv',\n 'env',\n 'lock',\n 'gitignore',\n 'srt',\n 'vtt',\n])\n\n// Extension-less filenames that are nonetheless text.\nconst PLAIN_NAMES = new Set([\n 'dockerfile',\n 'makefile',\n 'license',\n 'readme',\n 'changelog',\n 'authors',\n '.gitignore',\n '.env',\n])\n\n// application/* MIME types that are actually text (text/* is handled generically).\nconst TEXTUAL_APP_MIME = new Set([\n 'application/json',\n 'application/ld+json',\n 'application/xml',\n 'application/xhtml+xml',\n 'application/javascript',\n 'application/ecmascript',\n 'application/x-sh',\n 'application/x-shellscript',\n 'application/x-python',\n 'application/x-python-code',\n 'application/x-yaml',\n 'application/yaml',\n 'application/toml',\n 'application/x-toml',\n 'application/sql',\n 'application/graphql',\n 'application/x-httpd-php',\n 'application/csv',\n 'application/markdown',\n 'image/svg+xml',\n])\n\n/** Can this file be opened in the side viewer? Prefer `mime`, fall back to the extension. */\nexport function isTextFile(name: string, mime?: string | null): boolean {\n const m = (mime || '').toLowerCase().trim()\n if (m && m !== 'application/octet-stream') {\n if (m.startsWith('text/')) return true\n if (TEXTUAL_APP_MIME.has(m)) return true\n // Clearly-binary families are never viewable, regardless of extension.\n if (m.startsWith('image/') || m.startsWith('audio/') || m.startsWith('video/')) return false\n // Other application/* (pdf, zip, msword, …): fall through to the extension as a tiebreak.\n }\n const ext = fileExt(name)\n if (ext) return ext in EXT_LANG || PLAIN_EXT.has(ext)\n return PLAIN_NAMES.has((name || '').toLowerCase())\n}\n\n// Any text file at or above this size is routed to the streaming log viewer (virtual-scrolled) instead of\n// the normal source view, so a huge .txt/.csv/.json doesn't lock the page tokenizing one giant block.\nexport const LARGE_TEXT_BYTES = 1024 * 1024\n\n/**\n * Should this open in the side viewer's streaming log viewer (virtual-scrolled, see LogViewer.vue) rather\n * than the normal highlighted source view? True for any `.log` (logs benefit from the line gutter + search),\n * and for any LARGE text file (>= {@link LARGE_TEXT_BYTES}) so big files don't freeze. Consulted in FileChip\n * BEFORE the generic text route. `size` is the manifest byte size when known (0/undefined ⇒ treat as small).\n */\nexport function isLogFile(name: string, mime?: string | null, size?: number | null): boolean {\n if (fileExt(name) === 'log') return true\n return (size ?? 0) >= LARGE_TEXT_BYTES && isTextFile(name, mime)\n}\n\n// CSV / TSV routed to the side viewer's table preview (parsed in-browser, see lib/csv.ts + CsvViewer.vue).\n// `.csv`/`.tsv` are ALSO plain text, so this is consulted in FileChip BEFORE the generic text route — but\n// AFTER the large-text/log route, so a huge CSV still streams through the virtual log viewer instead of\n// building a giant table. Extension-driven; text/csv + the tab-separated mimes also confirm it.\nconst CSV_EXT = new Set(['csv', 'tsv'])\nconst CSV_MIME = new Set(['text/csv', 'application/csv', 'text/tab-separated-values', 'text/tsv'])\n\n/**\n * Is this a CSV / TSV table (`.csv`/`.tsv`)? Such files open in the side viewer's table preview, which parses\n * the rows in-browser (see lib/csv.ts + CsvViewer.vue) with full RFC 4180 quote handling and a render/source\n * toggle. Prefer `mime`, fall back to the extension; a concrete non-text media mime rules it out (`.csv` is\n * often served as text/plain or octet-stream, so the extension is the reliable signal).\n */\nexport function isCsvFile(name: string, mime?: string | null): boolean {\n const m = (mime || '').toLowerCase().trim()\n if (m && m !== 'application/octet-stream') {\n if (CSV_MIME.has(m)) return true\n if (m.startsWith('image/') || m.startsWith('audio/') || m.startsWith('video/')) return false\n }\n return CSV_EXT.has(fileExt(name))\n}\n\n// JSON Lines / NDJSON (`.jsonl` / `.ndjson`) — one JSON value per line, routed to the side viewer's record-list\n// preview (parsed in-browser, see lib/jsonl.ts + JsonlViewer.vue). A `.jsonl` is often served as\n// application/json or octet-stream, so the extension is the reliable signal; the explicit jsonl mimes also\n// confirm it. We deliberately DON'T claim bare `.json` (that stays ordinary JSON source). Must be consulted\n// BEFORE the generic text route (a `.jsonl` served as application/json would otherwise read as JSON source).\nconst JSONL_EXT = new Set(['jsonl', 'ndjson'])\nconst JSONL_MIME = new Set([\n 'application/jsonl',\n 'application/x-jsonl',\n 'application/jsonlines',\n 'application/x-jsonlines',\n 'application/x-ndjson',\n 'application/ndjson',\n])\n\n/**\n * Is this a JSON Lines / NDJSON file (`.jsonl` / `.ndjson`)? Such files open in the side viewer's record list,\n * which parses each line independently (see lib/jsonl.ts + JsonlViewer.vue) — a truncated one-line preview per\n * record, click to expand the pretty-printed value, with a render/source toggle. Prefer `mime`, fall back to\n * the extension; a concrete non-jsonl media mime rules it out.\n */\nexport function isJsonlFile(name: string, mime?: string | null): boolean {\n const m = (mime || '').toLowerCase().trim()\n if (m && m !== 'application/octet-stream') {\n if (JSONL_MIME.has(m)) return true\n if (m.startsWith('image/') || m.startsWith('audio/') || m.startsWith('video/')) return false\n }\n return JSONL_EXT.has(fileExt(name))\n}\n\n// ZIP archive MIME types, including the JVM/Android packages that ARE zip under the hood (.jar/.war/.ear/\n// .apk/.aar). Office docs / epub are ALSO zips but have dedicated viewers, so they're matched by their own\n// detectors earlier and never reach here.\nconst ZIP_MIME = new Set([\n 'application/zip',\n 'application/x-zip',\n 'application/x-zip-compressed',\n 'multipart/x-zip',\n 'application/java-archive', // .jar / .war / .ear all commonly carry this\n 'application/x-java-archive',\n 'application/vnd.android.package-archive', // .apk\n])\n// Extensions we browse as a zip: the plain .zip plus the JVM/Android archive family (all real zip containers,\n// so the same in-browser decompressor + tree browser handles them). NOT docx/xlsx/pptx/epub — those are zips\n// too but route to their own viewers (matched before isZipFile in FileChip).\nconst ZIP_EXT = new Set(['zip', 'jar', 'war', 'ear', 'apk', 'aar'])\n\n/**\n * Is this a ZIP archive (incl. .jar/.war/.ear/.apk/.aar)? Such files open in the side viewer's archive\n * browser, which decompresses them in-browser and lists their contents. Prefer `mime`, fall back to the\n * extension (same precedence as {@link isTextFile}); a concrete non-zip mime settles it, blank/octet-stream\n * defers to the extension.\n */\nexport function isZipFile(name: string, mime?: string | null): boolean {\n const m = (mime || '').toLowerCase().trim()\n if (m && m !== 'application/octet-stream') {\n if (ZIP_MIME.has(m)) return true\n if (\n m.startsWith('text/') ||\n m.startsWith('image/') ||\n m.startsWith('audio/') ||\n m.startsWith('video/')\n ) {\n return false\n }\n }\n return ZIP_EXT.has(fileExt(name))\n}\n\n// 7z archive MIME types. As with ZIP we key off *.7z (the extension is the reliable signal); a 7z is\n// never a zip-under-the-hood container, so there's no docx/jar-style overlap to worry about.\nconst SEVEN_ZIP_MIME = new Set(['application/x-7z-compressed', 'application/x-7z'])\n\n/**\n * Is this a 7z archive? Such files open in the side viewer's 7z browser, which decompresses them\n * in-browser (bundled LZMA decoder — browsers have no native one) and lists their contents. Prefer\n * `mime`, fall back to the extension (same precedence as {@link isZipFile}).\n */\nexport function isSevenZipFile(name: string, mime?: string | null): boolean {\n const m = (mime || '').toLowerCase().trim()\n if (m && m !== 'application/octet-stream') {\n if (SEVEN_ZIP_MIME.has(m)) return true\n if (\n m.startsWith('text/') ||\n m.startsWith('image/') ||\n m.startsWith('audio/') ||\n m.startsWith('video/')\n ) {\n return false\n }\n }\n return fileExt(name) === '7z'\n}\n\n// tar-family MIME types (the compressed wrappers + bare tar). The reliable signal is usually the extension;\n// the stored mime is often octet-stream. We DON'T claim `application/gzip` etc. blindly — they're matched\n// here, but a lone `.svgz`/unknown `.gz` still keys off the extension set below.\nconst TARBALL_MIME = new Set([\n 'application/x-tar',\n 'application/gzip',\n 'application/x-gzip',\n 'application/x-gtar',\n 'application/x-bzip2',\n 'application/x-bzip',\n 'application/x-xz',\n 'application/x-brotli',\n])\n// Extensions we route to the tar-family browser: bare tar, the gzip/xz/bzip2/brotli wrappers, and a lone\n// compressed file (`foo.json.gz`). `fileExt` returns only the last segment, so `.tar.gz` arrives as `gz`.\nconst TARBALL_EXT = new Set([\n 'tar',\n 'gz',\n 'tgz',\n 'taz',\n 'xz',\n 'txz',\n 'bz2',\n 'tbz2',\n 'tbz',\n 'tb2',\n 'br',\n 'tbr',\n])\n\n/**\n * Is this a tar-family archive — `.tar`, a gzip/xz/bzip2/brotli wrapper (`.tar.gz`/`.tgz`/`.tar.xz`/`.txz`/\n * `.tar.bz2`/`.tbz2`/`.tar.br`), or a lone compressed file (`.gz`/`.xz`/`.bz2`/`.br`)? Such files open in the\n * side viewer's archive browser, which decompresses them in-browser (native gzip + the project's LZMA2/bzip2\n * decoders + a WASM Brotli decoder, see lib/tarball.ts) and lists their contents. Prefer `mime`, fall back to\n * the extension (same precedence as {@link isZipFile}); a concrete non-archive media/text mime rules it out.\n */\nexport function isTarballFile(name: string, mime?: string | null): boolean {\n const m = (mime || '').toLowerCase().trim()\n if (m && m !== 'application/octet-stream') {\n if (TARBALL_MIME.has(m)) return true\n if (\n m.startsWith('text/') ||\n m.startsWith('image/') ||\n m.startsWith('audio/') ||\n m.startsWith('video/')\n ) {\n return false\n }\n }\n return TARBALL_EXT.has(fileExt(name))\n}\n\n// RAR archive MIME types. As with the other archives the extension (.rar) is the reliable signal.\nconst RAR_MIME = new Set([\n 'application/vnd.rar',\n 'application/x-rar-compressed',\n 'application/x-rar',\n])\n\n/**\n * Is this a RAR archive? Such files open in the side viewer's archive browser, which decompresses them\n * in-browser via the WASM unrar port (see lib/rar.ts) and lists their contents. Prefer `mime`, fall back to\n * the extension (same precedence as {@link isZipFile}).\n */\nexport function isRarFile(name: string, mime?: string | null): boolean {\n const m = (mime || '').toLowerCase().trim()\n if (m && m !== 'application/octet-stream') {\n if (RAR_MIME.has(m)) return true\n if (\n m.startsWith('text/') ||\n m.startsWith('image/') ||\n m.startsWith('audio/') ||\n m.startsWith('video/')\n ) {\n return false\n }\n }\n return fileExt(name) === 'rar'\n}\n\n// DICOM medical-image MIME types. The reliable signal is usually the extension (.dcm/.dicom); the stored\n// mime is often octet-stream. `application/dicom` is the registered type when present.\nconst DICOM_MIME = new Set(['application/dicom', 'application/dicom+json', 'image/dicom'])\n\n/**\n * Is this a DICOM (.dcm) medical image? Such files open in the side viewer's DICOM viewer, which parses +\n * decodes them in-browser (dicom-parser + bundled WASM codecs for JPEG2000/JPEG-LS, see lib/dicom*) and\n * renders to a canvas with window/level. Prefer `mime`, fall back to the extension; a concrete non-DICOM\n * media/text mime rules it out, blank/octet-stream defers to the extension.\n */\nexport function isDicomFile(name: string, mime?: string | null): boolean {\n const m = (mime || '').toLowerCase().trim()\n if (m && m !== 'application/octet-stream') {\n if (DICOM_MIME.has(m)) return true\n if (\n m.startsWith('text/') ||\n (m.startsWith('image/') && m !== 'image/dicom') ||\n m.startsWith('audio/') ||\n m.startsWith('video/')\n ) {\n return false\n }\n }\n const ext = fileExt(name)\n return ext === 'dcm' || ext === 'dicom'\n}\n\n// Raster-image / video extensions for inline preview: images get a hover preview card + click-to-zoom\n// lightbox, videos a click-to-play modal. SVG is deliberately NOT here — it opens in the side viewer with a\n// render/source toggle (see {@link isSvgFile}), since reading its markup is often as useful as the picture.\nconst IMAGE_EXT = new Set([\n 'png',\n 'jpg',\n 'jpeg',\n 'gif',\n 'webp',\n 'bmp',\n 'ico',\n 'avif',\n 'apng',\n 'jfif',\n])\nconst VIDEO_EXT = new Set(['mp4', 'm4v', 'webm', 'ogv', 'mov', 'mkv', 'avi'])\n\n/**\n * Is this a raster image we can preview inline (a hover card on its file chip, or full-size in the lightbox)?\n * `<img src=download-url>` works despite the endpoint's octet-stream/attachment/nosniff (those don't bind\n * `<img>` subresources). SVG is excluded (it goes to the side viewer). Prefer `mime`, fall back to extension.\n */\nexport function isImageFile(name: string, mime?: string | null): boolean {\n const m = (mime || '').toLowerCase().trim()\n if (m && m !== 'application/octet-stream') {\n if (m === 'image/svg+xml') return false // SVG → side viewer, not the lightbox\n if (m.startsWith('image/')) return true\n if (m.startsWith('text/') || m.startsWith('video/') || m.startsWith('audio/')) return false\n }\n return IMAGE_EXT.has(fileExt(name))\n}\n\n// Raster image formats a plain <img> can't decode — routed to the side viewer's decoding image viewer\n// (RasterViewer.vue): TIFF (utif2), PSD (ag-psd), HEIC/HEIF (heic2any), and camera RAW (best-effort embedded\n// JPEG, see lib/rawPreview.ts). NOTE bmp/ico/avif are NOT here — modern browsers decode those natively, so\n// they stay on the normal image/lightbox path (see {@link isImageFile}).\nexport type RasterKind = 'tiff' | 'psd' | 'heic' | 'raw'\nconst TIFF_EXT = new Set(['tif', 'tiff'])\nconst PSD_EXT = new Set(['psd', 'psb'])\nconst HEIC_EXT = new Set(['heic', 'heif', 'hif'])\n// Common camera RAW extensions (Canon / Nikon / Sony / Adobe / Fuji / Panasonic / Olympus / Samsung / Pentax / Sigma).\nconst RAW_EXT = new Set([\n 'cr2',\n 'cr3',\n 'crw',\n 'nef',\n 'nrw',\n 'arw',\n 'sr2',\n 'srf',\n 'dng',\n 'raf',\n 'rw2',\n 'orf',\n 'srw',\n 'pef',\n 'x3f',\n])\n\n/**\n * Which decoding image viewer (if any) should open this file? Returns the format kind for TIFF / PSD /\n * HEIC / camera-RAW (so RasterViewer can pick its decoder), or null. Prefer `mime`, fall back to the\n * extension. Must be consulted in FileChip BEFORE {@link isImageFile} — a `.tiff` carries `image/tiff`,\n * which would otherwise send it to the lightbox where a plain <img> can't decode it.\n */\nexport function rasterImageKind(name: string, mime?: string | null): RasterKind | null {\n const m = (mime || '').toLowerCase().trim()\n if (m && m !== 'application/octet-stream') {\n if (m === 'image/tiff' || m === 'image/x-tiff') return 'tiff'\n if (\n m === 'image/vnd.adobe.photoshop' ||\n m === 'image/x-photoshop' ||\n m === 'application/x-photoshop' ||\n m === 'image/psd'\n ) {\n return 'psd'\n }\n if (m.startsWith('image/heic') || m.startsWith('image/heif')) return 'heic'\n }\n const ext = fileExt(name)\n if (TIFF_EXT.has(ext)) return 'tiff'\n if (PSD_EXT.has(ext)) return 'psd'\n if (HEIC_EXT.has(ext)) return 'heic'\n if (RAW_EXT.has(ext)) return 'raw'\n return null\n}\n\n// E-book formats routed to the side viewer's e-book reader (EbookViewer.vue): EPUB (epub.js), FictionBook\n// (.fb2, hand-rolled), MOBI/AZW3 (best-effort text extraction), and DjVu (.djvu — not previewable, shows a\n// hint). EPUB is a zip and FB2 is XML, but neither collides with the zip/text routes (we only claim these\n// extensions). DjVu carries an `image/*` mime, so like the raster formats this must beat {@link isImageFile}.\nexport type EbookKind = 'epub' | 'fb2' | 'mobi' | 'djvu'\n\n/**\n * Which e-book reader (if any) should open this file — 'epub' / 'fb2' / 'mobi' (also .azw3/.azw/.prc) /\n * 'djvu', or null. Prefer `mime`, fall back to the extension. Consulted in FileChip BEFORE the generic\n * text route (FB2 is XML) and BEFORE {@link isImageFile} (DjVu's mime is image/vnd.djvu).\n */\nexport function ebookKind(name: string, mime?: string | null): EbookKind | null {\n const m = (mime || '').toLowerCase().trim()\n if (m && m !== 'application/octet-stream') {\n if (m === 'application/epub+zip') return 'epub'\n if (m === 'application/x-fictionbook+xml' || m === 'application/fb2+xml') return 'fb2'\n if (m === 'application/x-mobipocket-ebook' || m === 'application/vnd.amazon.ebook')\n return 'mobi'\n if (m === 'image/vnd.djvu' || m === 'image/x-djvu') return 'djvu'\n }\n const ext = fileExt(name)\n if (ext === 'epub') return 'epub'\n if (ext === 'fb2') return 'fb2'\n if (ext === 'mobi' || ext === 'azw' || ext === 'azw3' || ext === 'prc') return 'mobi'\n if (ext === 'djvu' || ext === 'djv') return 'djvu'\n return null\n}\n\n/**\n * Is this an SVG? It opens in the side viewer with a render/source toggle (like HTML) — the render view shows\n * the picture, the source view its XML. Prefer `mime`, fall back to the extension.\n */\nexport function isSvgFile(name: string, mime?: string | null): boolean {\n const m = (mime || '').toLowerCase().trim()\n if (m && m !== 'application/octet-stream') return m === 'image/svg+xml'\n return fileExt(name) === 'svg'\n}\n\n/**\n * Is this a video we can play in the modal preview? Unlike images, a direct `<video src=download-url>` can't\n * decode (octet-stream + nosniff), so the lightbox fetches the bytes and plays them from a typed blob. Prefer\n * `mime`, fall back to the extension.\n */\nexport function isVideoFile(name: string, mime?: string | null): boolean {\n const m = (mime || '').toLowerCase().trim()\n if (m && m !== 'application/octet-stream') {\n if (m.startsWith('video/')) return true\n if (m.startsWith('text/') || m.startsWith('image/') || m.startsWith('audio/')) return false\n }\n return VIDEO_EXT.has(fileExt(name))\n}\n\n/**\n * Is this an HTML document? Such files get a render/source toggle in the side viewer — the rendered\n * view runs the markup in a SANDBOXED iframe (see FileViewerPanel). Prefer `mime`, fall back to the\n * extension (same precedence as {@link isTextFile}); never trust an octet-stream/blank mime.\n */\nexport function isHtmlFile(name: string, mime?: string | null): boolean {\n const m = (mime || '').toLowerCase().trim()\n if (m && m !== 'application/octet-stream') {\n return m === 'text/html' || m === 'application/xhtml+xml'\n }\n const ext = fileExt(name)\n return ext === 'html' || ext === 'htm'\n}\n\n// Native binary objects the symbol browser parses in-browser: PE (Windows) and ELF (Unix). PE covers the\n// executable family (.exe/.dll/.sys/…); ELF covers shared objects, kernel modules and relocatables.\nconst PE_EXTS = ['exe', 'dll', 'sys', 'ocx', 'cpl', 'scr', 'efi', 'drv', 'mui', 'node']\nconst ELF_EXTS = ['elf', 'ko', 'o']\n\n/**\n * Is this a native binary object — a PE (`.exe`/`.dll`/…) or an ELF (`.so`, incl. versioned `libfoo.so.1.2.3`,\n * plus `.elf`/`.ko`/`.o`)? Such files open in the side viewer's symbol browser, which parses them in-browser\n * (see lib/binobj.ts) — listing function symbols and, for PE, executable metadata (version info + icon).\n * Detection is extension-driven: the stored mime is unreliable (usually `application/octet-stream`), so we only\n * rule it out for clearly-textual / media mimes.\n */\nexport function isBinaryObjFile(name: string, mime?: string | null): boolean {\n const m = (mime || '').toLowerCase().trim()\n if (m && m !== 'application/octet-stream') {\n if (\n m.startsWith('text/') ||\n m.startsWith('image/') ||\n m.startsWith('audio/') ||\n m.startsWith('video/')\n ) {\n return false\n }\n }\n const ext = fileExt(name)\n if (PE_EXTS.includes(ext) || ELF_EXTS.includes(ext)) return true\n // Shared objects, including versioned names like libfoo.so.1.2.3.\n return /\\.so(\\.\\d+)*$/.test((name || '').toLowerCase())\n}\n\n// E-language (易语言) project files: `.e` source and `.ec` module — binary containers parsed + decompiled\n// entirely in-browser (see lib/epl + EplViewer.vue). The stored mime is unreliable (usually octet-stream),\n// so detection is extension-driven; a clearly textual / media mime rules it out (a `.e` is never text/*).\n/**\n * Is this an e-language `.e` / `.ec` project file? Such files open in the side viewer's e-language viewer,\n * which parses the binary section format and decompiles each method back to readable 易语言 source text\n * (hand-rolled port of OpenEpl/EProjectFile, see lib/epl). Extension-driven; a concrete text/media mime rules\n * it out. The viewer validates the file magic and shows a friendly message for encrypted / non-EPL bytes.\n */\nexport function isEplFile(name: string, mime?: string | null): boolean {\n const m = (mime || '').toLowerCase().trim()\n if (m && m !== 'application/octet-stream') {\n if (\n m.startsWith('text/') ||\n m.startsWith('image/') ||\n m.startsWith('audio/') ||\n m.startsWith('video/')\n ) {\n return false\n }\n }\n const ext = fileExt(name)\n return ext === 'e' || ext === 'ec'\n}\n\n// Java bytecode (`.class`) — a big-endian structural container parsed in-browser (see lib/classfile.ts +\n// ClassViewer.vue), listing fields + methods (NOT decompiled). The stored mime is unreliable (usually\n// octet-stream); detection is extension-driven, with the registered JVM mimes also confirming it. A clearly\n// textual / media mime rules it out (a `.class` is never text/*).\nconst JAVA_CLASS_MIME = new Set([\n 'application/java-vm',\n 'application/x-java-vm',\n 'application/java',\n 'application/x-java-class',\n 'application/java-byte-code',\n])\n\n/**\n * Is this a Java `.class` bytecode file? Such files open in the side viewer's class viewer, which parses the\n * structure in-browser (see lib/classfile.ts) — the class signature plus its fields and methods (a lightweight\n * `javap`; no decompilation of method bodies). The viewer validates the 0xCAFEBABE magic and shows a friendly\n * message otherwise. Extension-driven (the stored mime is unreliable); a concrete text/media mime rules it out.\n */\nexport function isJavaClassFile(name: string, mime?: string | null): boolean {\n const m = (mime || '').toLowerCase().trim()\n if (m && m !== 'application/octet-stream') {\n if (JAVA_CLASS_MIME.has(m)) return true\n if (\n m.startsWith('text/') ||\n m.startsWith('image/') ||\n m.startsWith('audio/') ||\n m.startsWith('video/')\n ) {\n return false\n }\n }\n return fileExt(name) === 'class'\n}\n\n// JVM heap dump (`.hprof`) — a big-endian record stream stream-parsed in-browser (see lib/hprof.ts +\n// HprofViewer.vue) into a class histogram + per-class object drill-in. The stored mime is unreliable (usually\n// octet-stream); detection is extension-driven, with the registered java hprof mime also confirming it. A\n// clearly textual / media mime rules it out (an .hprof is never text/*).\nconst HPROF_MIME = new Set(['application/vnd.java.hprof', 'application/x-hprof'])\n\n/**\n * Is this a JVM heap dump (`.hprof`)? Such files open in the side viewer's HPROF viewer, which STREAM-parses the\n * dump in-browser (see lib/hprof.ts) — a class histogram (instances + shallow size) plus drill-in to one class's\n * objects with decoded fields, paginated + filterable so a multi-GB dump stays memory-bounded. Extension-driven\n * (the stored mime is unreliable); a concrete text/media mime rules it out.\n */\nexport function isHprofFile(name: string, mime?: string | null): boolean {\n const m = (mime || '').toLowerCase().trim()\n if (m && m !== 'application/octet-stream') {\n if (HPROF_MIME.has(m)) return true\n if (\n m.startsWith('text/') ||\n m.startsWith('image/') ||\n m.startsWith('audio/') ||\n m.startsWith('video/')\n ) {\n return false\n }\n }\n return fileExt(name) === 'hprof'\n}\n\n// Windows Installer database (`.msi`, plus the `.msp` patch / `.msm` merge module) — an OLE2 compound file\n// (NOT a PE; see isBinaryObjFile), parsed in-browser (see lib/msi.ts + MsiViewer.vue) to surface the product\n// identity + summary info. The stored mime is unreliable (usually octet-stream); detection is extension-driven,\n// with the registered MSI mime also confirming it. A clearly textual / media mime rules it out.\nconst MSI_MIME = new Set(['application/x-msi', 'application/vnd.ms-msi'])\nconst MSI_EXT = new Set(['msi', 'msp', 'msm'])\n\n/**\n * Is this a Windows Installer `.msi` (or `.msp`/`.msm`)? Such files open in the side viewer's MSI viewer,\n * which parses the OLE compound-file structure in-browser (see lib/msi.ts) — the product name/version/codes\n * from the Property table plus the SummaryInformation. Prefer `mime`, fall back to the extension; a concrete\n * text/media mime rules it out.\n */\nexport function isMsiFile(name: string, mime?: string | null): boolean {\n const m = (mime || '').toLowerCase().trim()\n if (m && m !== 'application/octet-stream') {\n if (MSI_MIME.has(m)) return true\n if (\n m.startsWith('text/') ||\n m.startsWith('image/') ||\n m.startsWith('audio/') ||\n m.startsWith('video/')\n ) {\n return false\n }\n }\n return MSI_EXT.has(fileExt(name))\n}\n\n// Windows app package (`.appx`/`.msix`, and the `.appxbundle`/`.msixbundle` bundles) — an OPC ZIP archive\n// (NOT a PE, NOT an MSI), parsed in-browser (see lib/appx.ts + AppxViewer.vue) to surface the manifest\n// identity / dependencies / capabilities. An APPX is a zip under the hood, so this MUST be consulted BEFORE\n// the generic zip route (an APPX served as application/zip would otherwise open as a plain archive).\nconst APPX_MIME = new Set([\n 'application/appx',\n 'application/msix',\n 'application/appxbundle',\n 'application/msixbundle',\n 'application/vnd.ms-appx',\n 'application/windows.appx',\n])\nconst APPX_EXT = new Set(['appx', 'msix', 'appxbundle', 'msixbundle'])\n\n/**\n * Is this a Windows app package (`.appx`/`.msix`/`.appxbundle`/`.msixbundle`)? Such files open in the side\n * viewer's APPX viewer, which unzips the manifest in-browser (see lib/appx.ts) and shows the package identity,\n * dependencies, capabilities and applications. Prefer `mime`, fall back to the extension; a concrete text/media\n * mime rules it out. Must beat {@link isZipFile} (an APPX is a zip container).\n */\nexport function isAppxFile(name: string, mime?: string | null): boolean {\n const m = (mime || '').toLowerCase().trim()\n if (m && m !== 'application/octet-stream') {\n if (APPX_MIME.has(m)) return true\n if (m.startsWith('text/') || m.startsWith('image/') || m.startsWith('audio/')) return false\n }\n return APPX_EXT.has(fileExt(name))\n}\n\n// Word document (OOXML) MIME. Only the modern `.docx` (a zip-under-the-hood OOXML package) is renderable —\n// the legacy binary `.doc` is NOT supported by the in-browser renderer (docx-preview), so it's excluded.\nconst DOCX_MIME = new Set([\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml',\n])\n\n/**\n * Is this a Word `.docx` document? Such files open in the side viewer's Word viewer, which unpacks +\n * renders the OOXML to HTML in-browser (docx-preview, see DocxViewer.vue) — a paginated, paper-like\n * preview. Prefer `mime`, fall back to the extension; a concrete non-docx media/text mime rules it out,\n * blank/octet-stream defers to the extension. Legacy `.doc` is deliberately NOT matched (unsupported).\n */\nexport function isDocxFile(name: string, mime?: string | null): boolean {\n const m = (mime || '').toLowerCase().trim()\n if (m && m !== 'application/octet-stream') {\n if (DOCX_MIME.has(m)) return true\n if (\n m.startsWith('text/') ||\n m.startsWith('image/') ||\n m.startsWith('audio/') ||\n m.startsWith('video/')\n ) {\n return false\n }\n }\n return fileExt(name) === 'docx'\n}\n\n// Excel spreadsheet (OOXML) MIME. Only the modern zip-under-the-hood `.xlsx`/`.xlsm` is renderable (exceljs\n// parses SpreadsheetML); the legacy binary `.xls` is NOT supported, so it's excluded.\nconst XLSX_MIME = new Set([\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml',\n 'application/vnd.ms-excel.sheet.macroenabled.12',\n])\n\n/**\n * Is this an Excel `.xlsx` / `.xlsm` spreadsheet? Such files open in the side viewer's spreadsheet viewer,\n * which unpacks + renders the workbook to HTML tables in-browser (exceljs, see XlsxViewer.vue) — one table\n * per sheet with a tab bar. Prefer `mime`, fall back to the extension; a concrete non-xlsx media/text mime\n * rules it out, blank/octet-stream defers to the extension. Legacy `.xls` is deliberately NOT matched.\n */\nexport function isXlsxFile(name: string, mime?: string | null): boolean {\n const m = (mime || '').toLowerCase().trim()\n if (m && m !== 'application/octet-stream') {\n if (XLSX_MIME.has(m)) return true\n if (\n m.startsWith('text/') ||\n m.startsWith('image/') ||\n m.startsWith('audio/') ||\n m.startsWith('video/')\n ) {\n return false\n }\n }\n const ext = fileExt(name)\n return ext === 'xlsx' || ext === 'xlsm'\n}\n\n// PowerPoint presentation (OOXML) MIME. Only the modern zip-under-the-hood `.pptx`/`.pptm`/`.ppsx` is\n// renderable (@aiden0z/pptx-renderer parses PresentationML); the legacy binary `.ppt` is NOT supported, so\n// it's excluded. `.macroenabled.12` is the lowercased form of the registered `.macroEnabled.12` types.\nconst PPTX_MIME = new Set([\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml',\n 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',\n 'application/vnd.ms-powerpoint.presentation.macroenabled.12',\n 'application/vnd.ms-powerpoint.slideshow.macroenabled.12',\n])\n\n/**\n * Is this a PowerPoint `.pptx` / `.pptm` / `.ppsx` presentation? Such files open in the side viewer's slide\n * viewer, which unpacks + renders the deck to HTML/SVG in-browser (@aiden0z/pptx-renderer, see PptxViewer.vue)\n * — a scrollable list of slides. Prefer `mime`, fall back to the extension; a concrete non-pptx media/text\n * mime rules it out, blank/octet-stream defers to the extension. Legacy `.ppt` is deliberately NOT matched.\n */\nexport function isPptxFile(name: string, mime?: string | null): boolean {\n const m = (mime || '').toLowerCase().trim()\n if (m && m !== 'application/octet-stream') {\n if (PPTX_MIME.has(m)) return true\n if (\n m.startsWith('text/') ||\n m.startsWith('image/') ||\n m.startsWith('audio/') ||\n m.startsWith('video/')\n ) {\n return false\n }\n }\n const ext = fileExt(name)\n return ext === 'pptx' || ext === 'pptm' || ext === 'ppsx'\n}\n\n// Rich Text Format MIME types. The reliable signal is the extension (.rtf); the stored mime is often octet-\n// stream or text/plain. `application/rtf` is the registered type, `text/rtf` a common variant.\nconst RTF_MIME = new Set(['application/rtf', 'text/rtf', 'application/x-rtf', 'text/richtext'])\n\n/**\n * Is this a Rich Text Format `.rtf` document? Such files open in the side viewer's rich-text viewer, which\n * interprets the RTF in-browser (hand-rolled, see lib/rtf.ts + RtfViewer.vue) — bold/italic/underline, colors,\n * fonts, alignment and unicode rendered onto a paper-like sheet. Prefer `mime`, fall back to the extension; a\n * concrete non-rtf media mime rules it out, blank/octet-stream/text defers to the extension (an .rtf is often\n * mislabeled text/plain). Must be consulted BEFORE the generic text route so it renders, not shows raw markup.\n */\nexport function isRtfFile(name: string, mime?: string | null): boolean {\n const m = (mime || '').toLowerCase().trim()\n if (m && m !== 'application/octet-stream') {\n if (RTF_MIME.has(m)) return true\n if (m.startsWith('image/') || m.startsWith('audio/') || m.startsWith('video/')) return false\n }\n return fileExt(name) === 'rtf'\n}\n\n// PDF MIME types. The reliable signal is usually the extension (.pdf); `application/pdf` is the registered\n// type, `application/x-pdf` an older variant.\nconst PDF_MIME = new Set(['application/pdf', 'application/x-pdf', 'application/acrobat'])\n\n/**\n * Is this a PDF document? Such files open in the side viewer's PDF viewer, which renders each page to a\n * canvas in-browser (pdfjs-dist, see PdfViewer.vue) — a vertically scrollable list of pages. Prefer `mime`,\n * fall back to the extension; a concrete non-pdf media/text mime rules it out, blank/octet-stream defers to\n * the extension.\n */\nexport function isPdfFile(name: string, mime?: string | null): boolean {\n const m = (mime || '').toLowerCase().trim()\n if (m && m !== 'application/octet-stream') {\n if (PDF_MIME.has(m)) return true\n if (\n m.startsWith('text/') ||\n m.startsWith('image/') ||\n m.startsWith('audio/') ||\n m.startsWith('video/')\n ) {\n return false\n }\n }\n return fileExt(name) === 'pdf'\n}\n\n// Outline / mind-map MIME types. The reliable signal is the extension (.opml/.mm); these MIME types appear\n// occasionally. `.mm` shares its extension with Objective-C++ source, so a match here is only a *candidate* —\n// the side panel content-sniffs the loaded text (looksLikeMindMap) before drawing the diagram.\nconst MINDMAP_MIME = new Set([\n 'text/x-opml',\n 'text/x-opml+xml',\n 'application/xml+opml',\n 'application/x-freemind',\n 'application/x-freeplane',\n])\n\n/**\n * Is this an outline / mind-map file — OPML (.opml) or FreeMind / Freeplane (.mm)? Such files open in the side\n * viewer with a render/source toggle: render draws an interactive mind map (see MindMapView.vue), source shows\n * the XML. Detection is extension-driven (the stored mime is unreliable); a concrete media mime rules it out.\n * NOTE: `.mm` is also the Objective-C++ source extension — the panel additionally sniffs the loaded text\n * (looksLikeMindMap) before rendering the diagram, so a non-mind-map `.mm` just reads as highlighted source.\n */\nexport function isMindMapFile(name: string, mime?: string | null): boolean {\n const m = (mime || '').toLowerCase().trim()\n if (m && m !== 'application/octet-stream') {\n if (MINDMAP_MIME.has(m)) return true\n if (\n m.startsWith('image/') ||\n m.startsWith('audio/') ||\n m.startsWith('video/') ||\n m === 'text/html'\n ) {\n return false\n }\n }\n const ext = fileExt(name)\n return ext === 'opml' || ext === 'mm'\n}\n\n// XMind workbook (.xmind) — a ZIP container (content.json modern / content.xml legacy) rendered as a mind map\n// (see lib/xmind.ts + XmindViewer.vue, reusing MindMapView). It's a zip under the hood, so this MUST be consulted\n// BEFORE the generic zip route. Extension-driven (the stored mime is unreliable); the workbook mimes confirm it.\nconst XMIND_MIME = new Set([\n 'application/vnd.xmind.workbook',\n 'application/x-xmind',\n 'application/xmind',\n])\n\n/**\n * Is this an XMind workbook (`.xmind`)? Such files open in the side viewer's XMind viewer, which unzips the\n * `content.json` / `content.xml` in-browser (see lib/xmind.ts) and renders it as an interactive mind map (shared\n * MindMapView). Prefer `mime`, fall back to the extension; a concrete media/text mime rules it out. Must beat\n * {@link isZipFile} (an XMind is a zip container).\n */\nexport function isXmindFile(name: string, mime?: string | null): boolean {\n const m = (mime || '').toLowerCase().trim()\n if (m && m !== 'application/octet-stream') {\n if (XMIND_MIME.has(m)) return true\n if (\n m.startsWith('text/') ||\n m.startsWith('image/') ||\n m.startsWith('audio/') ||\n m.startsWith('video/')\n ) {\n return false\n }\n }\n return fileExt(name) === 'xmind'\n}\n\n// DXF (AutoCAD Drawing Exchange Format) — an ASCII CAD drawing, rendered as an SVG (see lib/dxf.ts +\n// DxfViewer.vue). `.dxf` is textual, so this MUST be consulted BEFORE the generic text route so it opens as a\n// drawing, not raw source. NOTE: `.dwg` (the binary AutoCAD format) is deliberately NOT claimed — it's a\n// different, unsupported format. Extension-driven; the registered dxf mimes also confirm it.\nconst DXF_MIME = new Set(['image/vnd.dxf', 'application/dxf', 'application/x-dxf', 'drawing/x-dxf'])\n\n/**\n * Is this a DXF (`.dxf`) CAD drawing? Such files open in the side viewer's DXF viewer, which parses the ASCII\n * DXF in-browser (see lib/dxf.ts) and draws its entities as an SVG (pan/zoom + layer toggles). Prefer `mime`,\n * fall back to the extension; a concrete non-dxf media mime rules it out (a `.dxf` is often served text/plain\n * or octet-stream, so the extension is the reliable signal).\n */\nexport function isDxfFile(name: string, mime?: string | null): boolean {\n const m = (mime || '').toLowerCase().trim()\n if (m && m !== 'application/octet-stream') {\n if (DXF_MIME.has(m)) return true\n if (m.startsWith('audio/') || m.startsWith('video/') || m.startsWith('image/')) {\n if (!DXF_MIME.has(m)) return false\n }\n }\n return fileExt(name) === 'dxf'\n}\n\n// Email (.eml) MIME types. `message/rfc822` is the registered type for a raw RFC 822 message; the stored\n// mime is often octet-stream or even text/plain, so the extension (.eml) is the reliable signal. We do NOT\n// rule out text/* here (some servers label .eml as text/plain) — only clearly-binary media families.\nconst EML_MIME = new Set(['message/rfc822', 'application/eml', 'text/eml', 'message/global'])\n\n/**\n * Is this an email `.eml` (RFC 822 / MIME) message? Such files open in the side viewer's email viewer, which\n * parses the MIME tree in-browser (see lib/eml.ts + EmlViewer.vue) — a header card, the best body (HTML in a\n * sandboxed iframe, plain-text fallback), and the attachments. Prefer `mime`, fall back to the extension; a\n * concrete non-eml media mime rules it out, blank/octet-stream/text defers to the extension.\n */\nexport function isEmlFile(name: string, mime?: string | null): boolean {\n // A .mht/.mhtml web archive can also be served as message/rfc822, but it's MHT, not an email (see isMhtFile).\n const ext = fileExt(name)\n if (ext === 'mht' || ext === 'mhtml') return false\n const m = (mime || '').toLowerCase().trim()\n if (m && m !== 'application/octet-stream') {\n if (EML_MIME.has(m)) return true\n if (m.startsWith('image/') || m.startsWith('audio/') || m.startsWith('video/')) return false\n }\n return ext === 'eml'\n}\n\n/**\n * Is this a web archive `.mht`/`.mhtml` (RFC 2557 MIME container)? Such files open in the side viewer's web-\n * archive viewer, which parses the `multipart/related` container in-browser (see lib/mht.ts + MhtViewer.vue)\n * and renders the saved page — resources rewritten to blob URLs — in a sandboxed iframe. Extension-driven (the\n * stored mime is unreliable); the telltale container mimes (multipart/related, application/x-mimearchive)\n * also confirm it.\n */\nexport function isMhtFile(name: string, mime?: string | null): boolean {\n const ext = fileExt(name)\n if (ext === 'mht' || ext === 'mhtml') return true\n const m = (mime || '').toLowerCase().trim()\n return m === 'multipart/related' || m === 'application/x-mimearchive'\n}\n\n// HAR (HTTP Archive) MIME types. A .har is JSON under the hood, so it's often served as application/json or\n// octet-stream — the extension (.har) is the reliable signal. The registered type is application/json; some\n// tools use application/x-har.\nconst HAR_MIME = new Set(['application/har+json', 'application/x-har'])\n\n/**\n * Is this a HAR (`.har`, HTTP Archive 1.2) capture? Such files open in the side viewer's HAR viewer, which\n * parses the JSON archive in-browser (hand-rolled, see lib/har.ts + HarViewer.vue) — a filterable request\n * list with per-request headers / query / cookies / bodies. Extension-driven (a .har is JSON, so the stored\n * mime is usually application/json or octet-stream); a concrete non-har media mime rules it out. Must be\n * checked BEFORE the generic text route (a .har served as application/json would otherwise read as JSON source).\n */\nexport function isHarFile(name: string, mime?: string | null): boolean {\n const m = (mime || '').toLowerCase().trim()\n if (m && m !== 'application/octet-stream') {\n if (HAR_MIME.has(m)) return true\n if (m.startsWith('image/') || m.startsWith('audio/') || m.startsWith('video/')) return false\n }\n return fileExt(name) === 'har'\n}\n\n// SQLite database MIME types. The reliable signal is the extension; the stored mime is usually octet-stream.\nconst SQLITE_MIME = new Set([\n 'application/x-sqlite3',\n 'application/vnd.sqlite3',\n 'application/x-sqlite',\n])\n// Extensions we route to the SQLite viewer: the conventional database suffixes.\nconst SQLITE_EXT = new Set(['sqlite', 'sqlite3', 'db', 'db3', 'sqlitedb'])\n\n/**\n * Is this a SQLite database (`.sqlite`/`.db`/`.sqlite3`/…)? Such files open in the side viewer's SQLite viewer,\n * which loads them with sql.js (WASM) in-browser (see lib/sqlite.ts + SqliteViewer.vue) — a table picker, a\n * paginated data grid, and a SQL console. Prefer `mime`, fall back to the extension; a concrete textual/media\n * mime rules it out (`.db` is a generic suffix, so a clearly-text mime means it isn't a database).\n */\nexport function isSqliteFile(name: string, mime?: string | null): boolean {\n const m = (mime || '').toLowerCase().trim()\n if (m && m !== 'application/octet-stream') {\n if (SQLITE_MIME.has(m)) return true\n if (\n m.startsWith('text/') ||\n m.startsWith('image/') ||\n m.startsWith('audio/') ||\n m.startsWith('video/')\n ) {\n return false\n }\n }\n return SQLITE_EXT.has(fileExt(name))\n}\n\n// Certificate / key formats routed to the side viewer's certificate visualizer (parsed in-browser, hand-rolled\n// ASN.1/X.509, see lib/asn1.ts + lib/x509.ts + CertViewer.vue): PEM (.pem/.crt/.cer/.csr/.key, also PKCS#7\n// bundles) and raw DER (.der/.cer). The viewer fetches the BYTES (binary-safe), so `.der` isn't mangled.\n// Detection is extension-driven (the stored mime is unreliable); a few registered cert mimes also confirm it.\n// NOTE: PKCS#12 (`.p12`/`.pfx`) is a KEYSTORE, not a bare cert — routed to the keystore viewer ({@link isJksFile}).\nconst CERT_EXT = new Set(['pem', 'crt', 'cer', 'der', 'csr', 'req', 'key', 'p7b', 'p7c'])\nconst CERT_MIME = new Set([\n 'application/x-x509-ca-cert',\n 'application/x-x509-user-cert',\n 'application/x-x509-cert',\n 'application/pkix-cert',\n 'application/pkix-crl',\n 'application/x-pem-file',\n 'application/pkcs8',\n 'application/pkcs10',\n 'application/x-pkcs7-certificates',\n])\n\n/**\n * Is this a certificate / key file (`.pem`/`.crt`/`.cer`/`.der`/`.csr`/`.key`/`.p7b`/…)? Such files open\n * in the side viewer's certificate visualizer, which parses the ASN.1 / X.509 in-browser (see lib/x509.ts +\n * CertViewer.vue) — subject/issuer, validity, key + signature algorithms, SANs, fingerprint, and a raw ASN.1\n * structure tree. Prefer `mime`, fall back to the extension; a concrete non-cert media/text mime rules it out.\n * PKCS#12 (`.p12`/`.pfx`) is handled by the keystore viewer ({@link isJksFile}), not here.\n */\nexport function isCertFile(name: string, mime?: string | null): boolean {\n const m = (mime || '').toLowerCase().trim()\n if (m && m !== 'application/octet-stream') {\n if (CERT_MIME.has(m)) return true\n // Don't rule out text/* — a PEM (.pem/.crt/.key) is often served as text/plain; the extension settles it.\n if (m.startsWith('image/') || m.startsWith('audio/') || m.startsWith('video/')) return false\n }\n return CERT_EXT.has(fileExt(name))\n}\n\n// Keystore formats routed to the side viewer's keystore viewer (parsed in-browser, hand-rolled — see lib/jks.ts,\n// lib/pkcs12.ts + JksViewer.vue): the Sun JKS/JCEKS binary format (`.jks`/`.keystore`/`.ks`/`.truststore`/`.jceks`,\n// magic 0xFEEDFEED / 0xCECECECE) AND PKCS#12 / PFX (`.p12`/`.pfx`). The `.jks` extension is claimed even though\n// modern keytool writes PKCS#12 into it — the viewer sniffs the actual bytes and picks the right parser, so a\n// mislabeled file still opens. Detection is extension-driven (the stored mime is unreliable, usually\n// octet-stream); a concrete text/media mime rules it out (a keystore is never text/*).\nconst JKS_MIME = new Set([\n 'application/x-java-keystore',\n 'application/x-java-jce-keystore',\n 'application/x-pkcs12',\n 'application/pkcs12',\n])\nconst JKS_EXT = new Set(['jks', 'keystore', 'ks', 'jceks', 'truststore', 'p12', 'pfx'])\n\n/**\n * Is this a keystore — Java JKS/JCEKS (`.jks`/`.keystore`/`.ks`/`.jceks`/`.truststore`) or PKCS#12 (`.p12`/\n * `.pfx`)? Such files open in the side viewer's keystore viewer, which sniffs the format and parses it in-browser\n * (see lib/jks.ts / lib/pkcs12.ts) — the entry inventory (aliases / kinds / dates), each entry's X.509 chain,\n * and, with a password, store-integrity verification + private-key decryption. Prefer `mime`, fall back to the\n * extension; a concrete text/media mime rules it out.\n */\nexport function isJksFile(name: string, mime?: string | null): boolean {\n const m = (mime || '').toLowerCase().trim()\n if (m && m !== 'application/octet-stream') {\n if (JKS_MIME.has(m)) return true\n if (\n m.startsWith('text/') ||\n m.startsWith('image/') ||\n m.startsWith('audio/') ||\n m.startsWith('video/')\n ) {\n return false\n }\n }\n return JKS_EXT.has(fileExt(name))\n}\n\n// Geodata formats routed to the side viewer's offline SVG map (parsed in-browser, see lib/geo.ts +\n// GeoViewer.vue): GeoJSON (.geojson), KML (.kml), GPX (.gpx). `.geojson`/`.kml`/`.gpx` are also textual, so\n// this must be consulted BEFORE the generic text route (in FileChip) so they open as a map, not raw source.\n// Extension-driven; we deliberately DON'T claim bare `.json` (most JSON isn't geodata) — only `.geojson`.\nconst GEO_EXT = new Set(['geojson', 'kml', 'gpx'])\nconst GEO_MIME = new Set([\n 'application/geo+json',\n 'application/vnd.geo+json',\n 'application/vnd.google-earth.kml+xml',\n 'application/gpx+xml',\n 'application/x-gpx+xml',\n])\n\n/**\n * Is this a geodata file (`.geojson`/`.kml`/`.gpx`)? Such files open in the side viewer's map viewer, which\n * parses the geometry in-browser (see lib/geo.ts + GeoViewer.vue) and draws it as an OFFLINE SVG map (no tile\n * server) with pan/zoom and a render/source toggle. Prefer `mime`, fall back to the extension; a concrete\n * non-geo media mime rules it out.\n */\nexport function isGeoFile(name: string, mime?: string | null): boolean {\n const m = (mime || '').toLowerCase().trim()\n if (m && m !== 'application/octet-stream') {\n if (GEO_MIME.has(m)) return true\n if (m.startsWith('image/') || m.startsWith('audio/') || m.startsWith('video/')) return false\n }\n return GEO_EXT.has(fileExt(name))\n}\n\n// Subtitle / caption formats routed to the side viewer's subtitle transcript (parsed in-browser, see\n// lib/subtitle.ts + SubtitleViewer.vue): SubRip (.srt), WebVTT (.vtt), SubStation Alpha (.ass/.ssa).\n// `.srt`/`.vtt` are ALSO plain text, so this must be consulted BEFORE the generic text route (in FileChip)\n// so they open as a cue list, not raw source. Extension-driven (the stored mime is unreliable).\nconst SUBTITLE_EXT = new Set(['srt', 'vtt', 'ass', 'ssa'])\nconst SUBTITLE_MIME = new Set([\n 'application/x-subrip',\n 'application/x-subrip+srt',\n 'text/vtt',\n 'text/x-ssa',\n 'text/x-ass',\n])\n\n/**\n * Is this a subtitle / caption file (`.srt`/`.vtt`/`.ass`/`.ssa`)? Such files open in the side viewer's\n * subtitle viewer, which parses the cues in-browser (see lib/subtitle.ts + SubtitleViewer.vue) and shows\n * them as a timecoded transcript (with a render/source toggle). Prefer `mime`, fall back to the extension;\n * a concrete non-subtitle media mime rules it out, blank/octet-stream/text defers to the extension.\n */\nexport function isSubtitleFile(name: string, mime?: string | null): boolean {\n const m = (mime || '').toLowerCase().trim()\n if (m && m !== 'application/octet-stream') {\n if (SUBTITLE_MIME.has(m)) return true\n if (m.startsWith('image/') || m.startsWith('audio/') || m.startsWith('video/')) return false\n }\n return SUBTITLE_EXT.has(fileExt(name))\n}\n\n// 3D model formats routed to the side viewer's model viewer (rendered with three.js, see ModelViewer.vue):\n// STL (.stl), Wavefront OBJ (.obj), PLY (.ply), glTF (.gltf) and binary glTF (.glb). Extension-driven (the\n// stored mime is unreliable; `model/*` mimes also confirm it).\nconst MODEL_EXT = new Set(['stl', 'obj', 'ply', 'glb', 'gltf'])\nconst MODEL_MIME = new Set([\n 'model/gltf-binary',\n 'model/gltf+json',\n 'model/stl',\n 'application/sla',\n 'application/vnd.ms-pki.stl',\n 'model/obj',\n 'model/ply',\n])\n\n/**\n * Is this a 3D model (`.stl`/`.obj`/`.ply`/`.glb`/`.gltf`)? Such files open in the side viewer's model viewer,\n * which renders them with three.js in-browser (see ModelViewer.vue) — auto-framed, lit, with orbit controls.\n * Prefer `mime` (`model/*`), fall back to the extension; a concrete text/image/audio/video mime rules it out.\n */\nexport function isModelFile(name: string, mime?: string | null): boolean {\n const m = (mime || '').toLowerCase().trim()\n if (m && m !== 'application/octet-stream') {\n if (MODEL_MIME.has(m) || m.startsWith('model/')) return true\n if (\n m.startsWith('text/') ||\n m.startsWith('image/') ||\n m.startsWith('audio/') ||\n m.startsWith('video/')\n ) {\n return false\n }\n }\n return MODEL_EXT.has(fileExt(name))\n}\n\n// Audio formats routed to the side viewer's audio player (played via a typed Blob URL through a native\n// <audio> element, since the download endpoint's octet-stream/attachment defeats a direct src — see\n// AudioViewer.vue): mp3/wav/flac/ogg/m4a/aac/opus. `.mid`/`.midi` are included too but can't be PLAYED\n// in-browser (no synth) — the viewer shows them as a piano-roll visualization (best effort).\n// `.amr`/`.awb`/`.silk`/`.slk` (3GPP AMR + Tencent SILK 微信/QQ voice) are also routed here: browsers can't\n// decode them natively, so AudioViewer DECODES the bytes to WAV in-browser (lib/speechAudio.ts, WASM) and\n// plays that. Detection at decode time is by file-header magic (a WeChat `.amr` is often actually SILK).\nconst AUDIO_EXT = new Set([\n 'mp3',\n 'wav',\n 'flac',\n 'ogg',\n 'oga',\n 'm4a',\n 'aac',\n 'opus',\n 'weba',\n 'mid',\n 'midi',\n 'amr',\n 'awb',\n 'silk',\n 'slk',\n])\n\n/**\n * Is this an audio file (mp3/wav/flac/ogg/m4a/aac/opus, a .mid/.midi, or an AMR/SILK voice clip)? Such files\n * open in the side viewer's audio player, which fetches the bytes and plays them via a typed Blob URL (MIDI is\n * visualized as a piano roll, not played; AMR/SILK are decoded to WAV in-browser first). Prefer `mime`\n * (`audio/*`), fall back to the extension; a concrete text/image/video mime rules it out.\n */\nexport function isAudioFile(name: string, mime?: string | null): boolean {\n const m = (mime || '').toLowerCase().trim()\n if (m && m !== 'application/octet-stream') {\n if (m.startsWith('audio/')) return true\n if (m.startsWith('text/') || m.startsWith('image/') || m.startsWith('video/')) return false\n }\n return AUDIO_EXT.has(fileExt(name))\n}\n\n// Jupyter Notebook (.ipynb) — JSON under the hood, so often served as application/json or octet-stream; the\n// extension is the reliable signal. The registered type is application/x-ipynb+json. Must be checked BEFORE\n// the generic text route (a .ipynb served as application/json would otherwise read as JSON source).\nconst NOTEBOOK_MIME = new Set(['application/x-ipynb+json', 'application/ipynb+json'])\n\n/**\n * Is this a Jupyter Notebook (`.ipynb`)? Such files open in the side viewer's notebook viewer, which parses\n * the JSON in-browser (hand-rolled, see lib/ipynb.ts + NotebookViewer.vue) — markdown cells via the app's\n * markdown engine, code cells highlighted, outputs (stream / image / rich HTML / error) inline. Extension-\n * driven (a .ipynb is JSON, so the stored mime is usually application/json or octet-stream); a concrete\n * non-notebook media mime rules it out.\n */\nexport function isNotebookFile(name: string, mime?: string | null): boolean {\n const m = (mime || '').toLowerCase().trim()\n if (m && m !== 'application/octet-stream') {\n if (NOTEBOOK_MIME.has(m)) return true\n if (m.startsWith('image/') || m.startsWith('audio/') || m.startsWith('video/')) return false\n }\n return fileExt(name) === 'ipynb'\n}\n\n// Font formats routed to the side viewer's specimen viewer (loaded with the native FontFace API, which\n// decodes ttf/otf/woff AND woff2 in-browser — no library; see FontViewer.vue): TrueType (.ttf), OpenType\n// (.otf), and the web wrappers (.woff/.woff2). Extension-driven (stored mime is unreliable).\nconst FONT_EXT = new Set(['ttf', 'otf', 'woff', 'woff2'])\nconst FONT_MIME = new Set([\n 'font/ttf',\n 'font/otf',\n 'font/woff',\n 'font/woff2',\n 'font/sfnt',\n 'application/font-woff',\n 'application/font-woff2',\n 'application/x-font-ttf',\n 'application/x-font-otf',\n 'application/x-font-truetype',\n 'application/x-font-opentype',\n 'application/font-sfnt',\n 'application/vnd.ms-opentype',\n])\n\n/**\n * Is this a font file (`.ttf`/`.otf`/`.woff`/`.woff2`)? Such files open in the side viewer's font specimen,\n * which loads them with the native FontFace API in-browser (see FontViewer.vue) — an editable preview line,\n * a size waterfall, and the glyph sets. Prefer `mime`, fall back to the extension; a concrete non-font\n * media/text mime rules it out, blank/octet-stream defers to the extension.\n */\nexport function isFontFile(name: string, mime?: string | null): boolean {\n const m = (mime || '').toLowerCase().trim()\n if (m && m !== 'application/octet-stream') {\n if (FONT_MIME.has(m)) return true\n if (\n m.startsWith('text/') ||\n m.startsWith('image/') ||\n m.startsWith('audio/') ||\n m.startsWith('video/')\n ) {\n return false\n }\n }\n return FONT_EXT.has(fileExt(name))\n}\n\n// QQ 音乐加密音频(QMCv2,文件尾内嵌密钥)—— 浏览器内解密后用 <audio> 播放(见 lib/qmc.ts + QmcAudioViewer.vue)。\n// 涵盖 .mflac(FLAC)/.mgg(OGG)及其音质分级变体;这些都带内嵌 EKey,可独立解出。早期 QMCv1 静态密钥格式\n// (.qmcflac/.qmc0…)不在此列(无内嵌密钥)。存储 mime 一律不可信(多为 octet-stream),故按扩展名判定。\nconst QMC_EXT = new Set(['mflac', 'mflac0', 'mflac1', 'mflaca', 'mgg', 'mgg0', 'mgg1', 'mggl'])\n\n/**\n * Is this a QQ Music encrypted audio file (`.mflac`/`.mgg`/…)? Such files open in the side viewer's QMC\n * player, which decrypts the bytes in-browser (see lib/qmc.ts) — recovering the embedded key, undoing the\n * QMCv2 stream cipher, and playing the resulting FLAC/OGG/MP3 via a typed Blob (with a \"download decrypted\"\n * action). Extension-driven (the stored mime is unreliable, usually octet-stream); a clearly textual/media\n * mime rules it out.\n */\nexport function isQmcAudioFile(name: string, mime?: string | null): boolean {\n const m = (mime || '').toLowerCase().trim()\n if (m && m !== 'application/octet-stream') {\n if (m.startsWith('text/') || m.startsWith('image/') || m.startsWith('video/')) return false\n }\n return QMC_EXT.has(fileExt(name))\n}\n\n// LRC 歌词(`.lrc`)—— 行式带时间戳歌词,在侧栏渲染成同步歌词列表(见 lib/lrc.ts + LrcViewer.vue)。\n// 这类文件常见 GBK 编码且夹带 HTML 实体,故查看器自取字节、嗅探编码(见 lib/encoding.ts),不能当 UTF-8 文本直读。\nconst LRC_MIME = new Set(['application/lrc', 'text/lrc', 'application/x-lrc'])\n\n/**\n * Is this an LRC lyrics file (`.lrc`)? Such files open in the side viewer's lyrics viewer, which parses the\n * timestamped lines in-browser (see lib/lrc.ts + LrcViewer.vue) and shows a synced lyric list. Extension-\n * driven; a concrete non-text media mime rules it out. NOTE: deliberately routed BEFORE the generic text\n * route (the viewer self-fetches so it can sniff GBK — a `.lrc` read as UTF-8 text would be mojibake).\n */\nexport function isLrcFile(name: string, mime?: string | null): boolean {\n const m = (mime || '').toLowerCase().trim()\n if (m && m !== 'application/octet-stream') {\n if (LRC_MIME.has(m)) return true\n if (m.startsWith('image/') || m.startsWith('audio/') || m.startsWith('video/')) return false\n }\n return fileExt(name) === 'lrc'\n}\n\n/** highlight.js language id for this file, or '' for plain text (no highlighting). */\nexport function hljsLang(name: string, mime?: string | null): string {\n const ext = fileExt(name)\n if (ext && ext in EXT_LANG) return EXT_LANG[ext]\n\n const m = (mime || '').toLowerCase().trim()\n if (m === 'text/markdown' || m === 'application/markdown') return 'markdown'\n if (m === 'application/json' || m === 'application/ld+json') return 'json'\n if (\n m === 'application/xml' ||\n m === 'application/xhtml+xml' ||\n m === 'image/svg+xml' ||\n m === 'text/html'\n ) {\n return 'xml'\n }\n if (m.includes('yaml')) return 'yaml'\n if (m === 'text/css') return 'css'\n if (m === 'application/javascript' || m === 'application/ecmascript') return 'javascript'\n\n const lower = (name || '').toLowerCase()\n if (lower === 'dockerfile') return 'dockerfile'\n if (lower === 'makefile') return 'makefile'\n return ''\n}\n"],"mappings":"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"}
package/dist/lib/fonts.js CHANGED
@@ -2,3 +2,5 @@
2
2
  var e = "var(--font-serif)", t = "var(--font-sans)", n = "var(--font-mono)";
3
3
  //#endregion
4
4
  export { n as MONO, t as SANS, e as SERIF };
5
+
6
+ //# sourceMappingURL=fonts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fonts.js","names":[],"sources":["../../src/lib/fonts.ts"],"sourcesContent":["/**\n * Font-stack references for inline style objects (render functions).\n * They point at the CSS custom properties declared in tokens.css, so there is a\n * single source of truth and they stay theme-agnostic.\n */\nexport const SERIF = 'var(--font-serif)'\nexport const SANS = 'var(--font-sans)'\nexport const MONO = 'var(--font-mono)'\n"],"mappings":";AAKA,IAAa,IAAQ,qBACR,IAAO,oBACP,IAAO"}
@@ -36,3 +36,5 @@ function r(e) {
36
36
  }
37
37
  //#endregion
38
38
  export { n as formatBytes, t as formatDateTime, e as formatDuration, r as formatSizeCoarse };
39
+
40
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","names":[],"sources":["../../src/lib/format.ts"],"sourcesContent":["/** Minimal span shape (start/stop as parseable date strings) — kept local so the package carries no app types. */\nexport interface TimelineSpan {\n start?: string | null\n stop?: string | null\n}\n\n/**\n * Format the wall-clock span of a reasoning run (earliest start → latest stop)\n * as \"12s\" / \"1m 5s\". Mirrors the old component's fmtDur.\n */\nexport function formatDuration(items: TimelineSpan[]): string {\n try {\n let start: number | null = null\n let end: number | null = null\n for (const it of items ?? []) {\n if (it.start) {\n const t = Date.parse(it.start)\n if (!Number.isNaN(t) && (start === null || t < start)) start = t\n }\n if (it.stop) {\n const t = Date.parse(it.stop)\n if (!Number.isNaN(t) && (end === null || t > end)) end = t\n }\n }\n if (start === null || end === null || end < start) return ''\n const sec = Math.max(1, Math.round((end - start) / 1000))\n if (sec < 60) return `${sec}s`\n const m = Math.floor(sec / 60)\n const r = sec % 60\n return r ? `${m}m ${r}s` : `${m}m`\n } catch {\n return ''\n }\n}\n\n/** Compact local date-time for listings: \"2026-06-20 14:03\". Empty when the timestamp is missing/zero. */\nexport function formatDateTime(ms: number | null | undefined): string {\n if (!ms) return ''\n const d = new Date(ms)\n if (Number.isNaN(d.getTime())) return ''\n const p = (n: number) => String(n).padStart(2, '0')\n return `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())} ${p(d.getHours())}:${p(d.getMinutes())}`\n}\n\n/** Human-readable byte size: \"512 B\" / \"1.4 KB\" / \"2.3 MB\" (one decimal). */\nexport function formatBytes(n: number | null | undefined): string {\n if (n == null) return ''\n if (n < 1024) return `${n} B`\n if (n < 1048576) return `${(n / 1024).toFixed(1)} KB`\n return `${(n / 1048576).toFixed(1)} MB`\n}\n\n/** Coarser size used for attachment chips: KB rounded to whole numbers. */\nexport function formatSizeCoarse(n: number | null | undefined): string | null {\n if (n == null) return null\n if (n < 1024) return `${n} B`\n if (n < 1048576) return `${(n / 1024).toFixed(0)} KB`\n return `${(n / 1048576).toFixed(1)} MB`\n}\n"],"mappings":";AAUA,SAAgB,EAAe,GAA+B;CAC5D,IAAI;EACF,IAAI,IAAuB,MACvB,IAAqB;EACzB,KAAK,IAAM,KAAM,KAAS,CAAC,GAAG;GAC5B,IAAI,EAAG,OAAO;IACZ,IAAM,IAAI,KAAK,MAAM,EAAG,KAAK;IAC7B,AAAI,CAAC,OAAO,MAAM,CAAC,MAAM,MAAU,QAAQ,IAAI,OAAQ,IAAQ;GACjE;GACA,IAAI,EAAG,MAAM;IACX,IAAM,IAAI,KAAK,MAAM,EAAG,IAAI;IAC5B,AAAI,CAAC,OAAO,MAAM,CAAC,MAAM,MAAQ,QAAQ,IAAI,OAAM,IAAM;GAC3D;EACF;EACA,IAAI,MAAU,QAAQ,MAAQ,QAAQ,IAAM,GAAO,OAAO;EAC1D,IAAM,IAAM,KAAK,IAAI,GAAG,KAAK,OAAO,IAAM,KAAS,GAAI,CAAC;EACxD,IAAI,IAAM,IAAI,OAAO,GAAG,EAAI;EAC5B,IAAM,IAAI,KAAK,MAAM,IAAM,EAAE,GACvB,IAAI,IAAM;EAChB,OAAO,IAAI,GAAG,EAAE,IAAI,EAAE,KAAK,GAAG,EAAE;CAClC,QAAQ;EACN,OAAO;CACT;AACF;AAGA,SAAgB,EAAe,GAAuC;CACpE,IAAI,CAAC,GAAI,OAAO;CAChB,IAAM,IAAI,IAAI,KAAK,CAAE;CACrB,IAAI,OAAO,MAAM,EAAE,QAAQ,CAAC,GAAG,OAAO;CACtC,IAAM,KAAK,MAAc,OAAO,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG;CAClD,OAAO,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,EAAE,SAAS,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,QAAQ,CAAC,EAAE,GAAG,EAAE,EAAE,SAAS,CAAC,EAAE,GAAG,EAAE,EAAE,WAAW,CAAC;AAC3G;AAGA,SAAgB,EAAY,GAAsC;CAIhE,OAHI,KAAK,OAAa,KAClB,IAAI,OAAa,GAAG,EAAE,MACtB,IAAI,UAAgB,IAAI,IAAI,KAAA,CAAM,QAAQ,CAAC,EAAE,OAC1C,IAAI,IAAI,QAAA,CAAS,QAAQ,CAAC,EAAE;AACrC;AAGA,SAAgB,EAAiB,GAA6C;CAI5E,OAHI,KAAK,OAAa,OAClB,IAAI,OAAa,GAAG,EAAE,MACtB,IAAI,UAAgB,IAAI,IAAI,KAAA,CAAM,QAAQ,CAAC,EAAE,OAC1C,IAAI,IAAI,QAAA,CAAS,QAAQ,CAAC,EAAE;AACrC"}
@@ -21,3 +21,5 @@ function n(n) {
21
21
  }
22
22
  //#endregion
23
23
  export { n as parseFrontmatter };
24
+
25
+ //# sourceMappingURL=frontmatter.js.map