@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
@@ -1,6 +1,6 @@
1
- import { createElementBlock as e, createElementVNode as t, defineComponent as n, normalizeClass as r, normalizeStyle as i, onBeforeUnmount as a, onMounted as o, openBlock as s, ref as c, toDisplayString as l, watch as u, withModifiers as d } from "vue";
1
+ import { createElementBlock as e, createElementVNode as t, defineComponent as n, normalizeClass as r, normalizeStyle as i, onBeforeUnmount as a, onMounted as o, openBlock as s, shallowRef as c, toDisplayString as l, useTemplateRef as u, watch as d, withModifiers as f } from "vue";
2
2
  //#region src/components/ZoomImage.vue?vue&type=script&setup=true&lang.ts
3
- var f = ["src", "alt"], p = /*@__PURE__*/ n({
3
+ var p = ["src", "alt"], m = 24, h = /*@__PURE__*/ n({
4
4
  __name: "ZoomImage",
5
5
  props: {
6
6
  src: {},
@@ -11,13 +11,13 @@ var f = ["src", "alt"], p = /*@__PURE__*/ n({
11
11
  }
12
12
  },
13
13
  emits: ["emptyClick"],
14
- setup(n, { expose: p, emit: m }) {
15
- let h = n, g = m, _ = c(null), v = c(null), y = c(0), b = c(0), x = c(1), S = c(0), C = c(0), w = c(1), T = c(!1), E = c(100);
16
- function D() {
17
- E.value = Math.round(x.value * 100);
14
+ setup(n, { expose: h, emit: g }) {
15
+ let _ = n, v = g, y = u("stageEl"), b = u("imgEl"), x = c(0), S = c(0), C = c(1), w = c(0), T = c(0), E = c(1), D = c(!1), O = c(100);
16
+ function k() {
17
+ O.value = Math.round(C.value * 100);
18
18
  }
19
- function O() {
20
- let e = _.value;
19
+ function A() {
20
+ let e = y.value;
21
21
  return e && e.clientWidth ? {
22
22
  w: e.clientWidth,
23
23
  h: e.clientHeight
@@ -26,122 +26,124 @@ var f = ["src", "alt"], p = /*@__PURE__*/ n({
26
26
  h: 768
27
27
  };
28
28
  }
29
- function k() {
30
- return Math.max(.05, Math.min(w.value, 1) * .5);
31
- }
32
- function A() {
33
- return Math.max(w.value, 1) * 8;
34
- }
35
- function j(e = !1) {
36
- let { w: t, h: n } = O(), r = y.value * x.value, i = b.value * x.value;
37
- S.value = r <= t ? (t - r) / 2 : Math.min(0, Math.max(t - r, S.value)), i <= n ? C.value = (n - i) / 2 : e ? C.value = 0 : C.value = Math.min(0, Math.max(n - i, C.value)), D();
29
+ function j() {
30
+ return Math.max(.05, Math.min(E.value, 1) * .5);
38
31
  }
39
32
  function M() {
40
- if (!y.value || !b.value) return;
41
- let { w: e, h: t } = O();
42
- w.value = Math.min(e / y.value, t / b.value), x.value = h.long ? e * .98 / y.value : Math.min(w.value, 1), j(h.long);
33
+ return Math.max(E.value, 1) * 8;
43
34
  }
44
- function N(e) {
45
- return Math.min(A(), Math.max(k(), e));
35
+ function N(e = !1) {
36
+ let { w: t, h: n } = A(), r = x.value * C.value, i = S.value * C.value;
37
+ w.value = r <= t ? (t - r) / 2 : Math.min(0, Math.max(t - r, w.value)), i <= n ? T.value = (n - i) / 2 : e ? T.value = 0 : T.value = Math.min(0, Math.max(n - i, T.value)), k();
46
38
  }
47
- function P(e, t, n) {
48
- let r = N(x.value * n);
49
- if (r === x.value) return;
50
- let i = (e - S.value) / x.value, a = (t - C.value) / x.value;
51
- x.value = r, S.value = e - i * r, C.value = t - a * r, j(!1);
39
+ function P() {
40
+ if (!x.value || !S.value) return;
41
+ let { w: e, h: t } = A(), n = _.long ? 0 : m * 2, r = Math.max(1, e - n), i = Math.max(1, t - n);
42
+ E.value = Math.min(r / x.value, i / S.value), C.value = _.long ? e * .98 / x.value : Math.min(E.value, 1), N(_.long);
52
43
  }
53
44
  function F(e) {
54
- let { w: t, h: n } = O();
55
- P(t / 2, n / 2, e);
45
+ return Math.min(M(), Math.max(j(), e));
56
46
  }
57
- function I(e) {
58
- let t = _.value?.getBoundingClientRect();
59
- P(t ? e.clientX - t.left : e.clientX, t ? e.clientY - t.top : e.clientY, e.deltaY < 0 ? 1.15 : 1 / 1.15);
47
+ function I(e, t, n) {
48
+ let r = F(C.value * n);
49
+ if (r === C.value) return;
50
+ let i = (e - w.value) / C.value, a = (t - T.value) / C.value;
51
+ C.value = r, w.value = e - i * r, T.value = t - a * r, N(!1);
60
52
  }
61
53
  function L(e) {
62
- let t = _.value?.getBoundingClientRect(), n = t ? e.clientX - t.left : e.clientX, r = t ? e.clientY - t.top : e.clientY;
63
- x.value <= w.value * 1.05 ? P(n, r, Math.max(2, 1 / Math.max(w.value, .001))) : M();
54
+ let { w: t, h: n } = A();
55
+ I(t / 2, n / 2, e);
64
56
  }
65
- let R = !1, z = !1, B = 0, V = 0, H = null;
66
- function U(e) {
67
- e.button === 0 && (R = !0, z = !1, B = e.clientX, V = e.clientY, H = e.target, _.value?.setPointerCapture(e.pointerId));
57
+ function R(e) {
58
+ let t = y.value?.getBoundingClientRect();
59
+ I(t ? e.clientX - t.left : e.clientX, t ? e.clientY - t.top : e.clientY, e.deltaY < 0 ? 1.15 : 1 / 1.15);
68
60
  }
69
- function W(e) {
70
- if (!R) return;
71
- let t = e.clientX - B, n = e.clientY - V;
72
- !z && Math.abs(t) + Math.abs(n) > 3 && (z = !0), B = e.clientX, V = e.clientY, S.value += t, C.value += n, j(!1);
61
+ function z(e) {
62
+ let t = y.value?.getBoundingClientRect(), n = t ? e.clientX - t.left : e.clientX, r = t ? e.clientY - t.top : e.clientY;
63
+ C.value <= E.value * 1.05 ? I(n, r, Math.max(2, 1 / Math.max(E.value, .001))) : P();
73
64
  }
65
+ let B = !1, V = !1, H = 0, U = 0, W = null;
74
66
  function G(e) {
75
- if (R) {
76
- R = !1;
67
+ e.button === 0 && (B = !0, V = !1, H = e.clientX, U = e.clientY, W = e.target, y.value?.setPointerCapture(e.pointerId));
68
+ }
69
+ function K(e) {
70
+ if (!B) return;
71
+ let t = e.clientX - H, n = e.clientY - U;
72
+ !V && Math.abs(t) + Math.abs(n) > 3 && (V = !0), H = e.clientX, U = e.clientY, w.value += t, T.value += n, N(!1);
73
+ }
74
+ function q(e) {
75
+ if (B) {
76
+ B = !1;
77
77
  try {
78
- _.value?.releasePointerCapture(e.pointerId);
78
+ y.value?.releasePointerCapture(e.pointerId);
79
79
  } catch {}
80
- !z && H !== v.value && g("emptyClick");
80
+ !V && W !== b.value && v("emptyClick");
81
81
  }
82
82
  }
83
- function K() {
84
- let e = v.value;
85
- e && (y.value = e.naturalWidth || 1, b.value = e.naturalHeight || 1, M(), T.value = !0);
86
- }
87
- let q = null;
88
83
  function J() {
89
- T.value && M();
84
+ let e = b.value;
85
+ e && (x.value = e.naturalWidth || 1, S.value = e.naturalHeight || 1, P(), D.value = !0);
86
+ }
87
+ let Y = null;
88
+ function X() {
89
+ D.value && P();
90
90
  }
91
- return u(() => h.src, () => {
92
- T.value = !1, y.value = 0, b.value = 0, x.value = 1, S.value = 0, C.value = 0, w.value = 1, D();
91
+ return d(() => _.src, () => {
92
+ D.value = !1, x.value = 0, S.value = 0, C.value = 1, w.value = 0, T.value = 0, E.value = 1, k();
93
93
  }), o(() => {
94
- typeof ResizeObserver < "u" && _.value && (q = new ResizeObserver(J), q.observe(_.value));
95
- }), a(() => q?.disconnect()), p({
96
- zoomIn: () => F(1.2),
97
- zoomOut: () => F(1 / 1.2),
98
- fit: () => M()
94
+ typeof ResizeObserver < "u" && y.value && (Y = new ResizeObserver(X), Y.observe(y.value));
95
+ }), a(() => Y?.disconnect()), h({
96
+ zoomIn: () => L(1.2),
97
+ zoomOut: () => L(1 / 1.2),
98
+ fit: () => P()
99
99
  }), (a, o) => (s(), e("div", {
100
100
  ref_key: "stageEl",
101
- ref: _,
102
- class: r(["zi", { "zi--grab": x.value > w.value }]),
103
- onWheel: d(I, ["prevent"]),
104
- onPointerdown: U,
105
- onPointermove: W,
106
- onPointerup: G,
107
- onPointercancel: G,
108
- onDblclick: L
101
+ ref: y,
102
+ class: r(["zi", { "zi--grab": C.value > E.value }]),
103
+ onWheel: f(R, ["prevent"]),
104
+ onPointerdown: G,
105
+ onPointermove: K,
106
+ onPointerup: q,
107
+ onPointercancel: q,
108
+ onDblclick: z
109
109
  }, [t("img", {
110
110
  ref_key: "imgEl",
111
- ref: v,
112
- class: r(["zi__img", { "zi__img--ready": T.value }]),
111
+ ref: b,
112
+ class: r(["zi__img", { "zi__img--ready": D.value }]),
113
113
  src: n.src,
114
114
  alt: n.alt,
115
115
  draggable: "false",
116
- style: i({ transform: `translate(${S.value}px, ${C.value}px) scale(${x.value})` }),
117
- onLoad: K,
118
- onDragstart: o[0] ||= d(() => {}, ["prevent"])
119
- }, null, 46, f), t("div", {
116
+ style: i({ transform: `translate(${w.value}px, ${T.value}px) scale(${C.value})` }),
117
+ onLoad: J,
118
+ onDragstart: o[0] ||= f(() => {}, ["prevent"])
119
+ }, null, 46, p), t("div", {
120
120
  class: "zi__toolbar",
121
- onPointerdown: o[4] ||= d(() => {}, ["stop"]),
122
- onDblclick: o[5] ||= d(() => {}, ["stop"]),
123
- onWheel: o[6] ||= d(() => {}, ["stop"])
121
+ onPointerdown: o[4] ||= f(() => {}, ["stop"]),
122
+ onDblclick: o[5] ||= f(() => {}, ["stop"]),
123
+ onWheel: o[6] ||= f(() => {}, ["stop"])
124
124
  }, [
125
125
  t("button", {
126
126
  type: "button",
127
127
  class: "zi__tool",
128
128
  title: "缩小 (-)",
129
- onClick: o[1] ||= (e) => F(1 / 1.2)
129
+ onClick: o[1] ||= (e) => L(1 / 1.2)
130
130
  }, " − "),
131
131
  t("button", {
132
132
  type: "button",
133
133
  class: "zi__pct",
134
134
  title: "适应窗口 (0)",
135
- onClick: o[2] ||= (e) => M()
136
- }, l(E.value) + "% ", 1),
135
+ onClick: o[2] ||= (e) => P()
136
+ }, l(O.value) + "% ", 1),
137
137
  t("button", {
138
138
  type: "button",
139
139
  class: "zi__tool",
140
140
  title: "放大 (+)",
141
- onClick: o[3] ||= (e) => F(1.2)
141
+ onClick: o[3] ||= (e) => L(1.2)
142
142
  }, "+")
143
143
  ], 32)], 34));
144
144
  }
145
145
  });
146
146
  //#endregion
147
- export { p as default };
147
+ export { h as default };
148
+
149
+ //# sourceMappingURL=ZoomImage.vue_vue_type_script_setup_true_lang.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ZoomImage.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../src/components/ZoomImage.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { onBeforeUnmount, onMounted, shallowRef, useTemplateRef, watch } from 'vue'\n\n/**\n * A pan + zoom image stage, shared by the full-screen {@link ImageLightbox} and the in-archive image preview\n * ({@link ZipBrowser}/{@link SevenZipBrowser}/{@link ArchiveBrowser}). Fills its parent (which must give it a\n * size). Wheel zooms toward the cursor, drag pans, double-click toggles fit↔2×, and a bottom toolbar offers\n * −/百分比/+. Initial fit is \"contain\" for a normal image, or fill-width-top-aligned for a `long` one (a tall\n * screenshot) so it reads top-down and pans vertically. A no-drag click on empty area emits `emptyClick` (the\n * lightbox closes on it; the archive preview ignores it).\n *\n * Exposes `zoomIn`/`zoomOut`/`fit` so a host can wire keyboard shortcuts to them.\n */\nconst props = withDefaults(defineProps<{ src: string; alt?: string; long?: boolean }>(), {\n alt: '',\n long: false,\n})\nconst emit = defineEmits<{ emptyClick: [] }>()\n\nconst stageEl = useTemplateRef<HTMLElement>('stageEl')\nconst imgEl = useTemplateRef<HTMLImageElement>('imgEl')\nconst natW = shallowRef(0)\nconst natH = shallowRef(0)\nconst scale = shallowRef(1) // CSS px per image px (1 = 100%)\nconst tx = shallowRef(0) // translate of the image's top-left within the stage\nconst ty = shallowRef(0)\nconst fitScale = shallowRef(1) // scale that \"contains\" the image in the stage\nconst ready = shallowRef(false) // image measured → show it (avoids a pre-fit flash)\n\nconst percent = shallowRef(100)\nconst FIT_PADDING = 24\nfunction syncPercent(): void {\n percent.value = Math.round(scale.value * 100)\n}\n\nfunction stageSize(): { w: number; h: number } {\n const el = stageEl.value\n if (el && el.clientWidth) return { w: el.clientWidth, h: el.clientHeight }\n return { w: 1024, h: 768 }\n}\nfunction minScale(): number {\n return Math.max(0.05, Math.min(fitScale.value, 1) * 0.5)\n}\nfunction maxScale(): number {\n return Math.max(fitScale.value, 1) * 8\n}\n\n// Keep the image within the stage: center an axis whose content is smaller than the stage, otherwise clamp so\n// its edges can't be dragged inside the viewport. `topAlign` pins a too-tall image to its top (initial long view).\nfunction clampView(topAlign = false): void {\n const { w, h } = stageSize()\n const cw = natW.value * scale.value\n const ch = natH.value * scale.value\n tx.value = cw <= w ? (w - cw) / 2 : Math.min(0, Math.max(w - cw, tx.value))\n if (ch <= h) ty.value = (h - ch) / 2\n else if (topAlign) ty.value = 0\n else ty.value = Math.min(0, Math.max(h - ch, ty.value))\n syncPercent()\n}\n\n// (Re)fit the measured image: contain it, or — for a long image — fill the width and pin to the top.\nfunction fitView(): void {\n if (!natW.value || !natH.value) return\n const { w, h } = stageSize()\n const padding = props.long ? 0 : FIT_PADDING * 2\n const availableWidth = Math.max(1, w - padding)\n const availableHeight = Math.max(1, h - padding)\n fitScale.value = Math.min(availableWidth / natW.value, availableHeight / natH.value)\n scale.value = props.long ? (w * 0.98) / natW.value : Math.min(fitScale.value, 1)\n clampView(props.long)\n}\n\nfunction clampScale(s: number): number {\n return Math.min(maxScale(), Math.max(minScale(), s))\n}\n\n// Zoom keeping the image point under (cx, cy) — stage-relative coords — fixed in place.\nfunction zoomAt(cx: number, cy: number, factor: number): void {\n const next = clampScale(scale.value * factor)\n if (next === scale.value) return\n const ix = (cx - tx.value) / scale.value\n const iy = (cy - ty.value) / scale.value\n scale.value = next\n tx.value = cx - ix * next\n ty.value = cy - iy * next\n clampView(false)\n}\nfunction zoomCenter(factor: number): void {\n const { w, h } = stageSize()\n zoomAt(w / 2, h / 2, factor)\n}\n\nfunction onWheel(e: WheelEvent): void {\n const rect = stageEl.value?.getBoundingClientRect()\n const cx = rect ? e.clientX - rect.left : e.clientX\n const cy = rect ? e.clientY - rect.top : e.clientY\n zoomAt(cx, cy, e.deltaY < 0 ? 1.15 : 1 / 1.15)\n}\nfunction onDblClick(e: MouseEvent): void {\n const rect = stageEl.value?.getBoundingClientRect()\n const cx = rect ? e.clientX - rect.left : e.clientX\n const cy = rect ? e.clientY - rect.top : e.clientY\n // Near the fit scale → zoom in toward the cursor; otherwise snap back to fit.\n if (scale.value <= fitScale.value * 1.05)\n zoomAt(cx, cy, Math.max(2, 1 / Math.max(fitScale.value, 0.001)))\n else fitView()\n}\n\n// Pointer drag → pan (covers mouse + touch). A no-move pointerup on empty area emits `emptyClick`.\nlet dragging = false\nlet moved = false\nlet lastX = 0\nlet lastY = 0\nlet downTarget: EventTarget | null = null\n\nfunction onPointerDown(e: PointerEvent): void {\n if (e.button !== 0) return\n dragging = true\n moved = false\n lastX = e.clientX\n lastY = e.clientY\n downTarget = e.target\n stageEl.value?.setPointerCapture(e.pointerId)\n}\nfunction onPointerMove(e: PointerEvent): void {\n if (!dragging) return\n const dx = e.clientX - lastX\n const dy = e.clientY - lastY\n if (!moved && Math.abs(dx) + Math.abs(dy) > 3) moved = true\n lastX = e.clientX\n lastY = e.clientY\n tx.value += dx\n ty.value += dy\n clampView(false)\n}\nfunction onPointerUp(e: PointerEvent): void {\n if (!dragging) return\n dragging = false\n try {\n stageEl.value?.releasePointerCapture(e.pointerId)\n } catch {\n /* capture already released — ignore */\n }\n if (!moved && downTarget !== imgEl.value) emit('emptyClick')\n}\n\nfunction onImgLoad(): void {\n const img = imgEl.value\n if (!img) return\n natW.value = img.naturalWidth || 1\n natH.value = img.naturalHeight || 1\n fitView()\n ready.value = true\n}\n\n// Re-fit when the container is resized (the side panel's drag splitter, or the window).\nlet ro: ResizeObserver | null = null\nfunction onResize(): void {\n if (ready.value) fitView()\n}\n\n// Reset for a new source; the transform is recomputed on the <img>'s load.\nwatch(\n () => props.src,\n () => {\n ready.value = false\n natW.value = 0\n natH.value = 0\n scale.value = 1\n tx.value = 0\n ty.value = 0\n fitScale.value = 1\n syncPercent()\n },\n)\n\nonMounted(() => {\n if (typeof ResizeObserver !== 'undefined' && stageEl.value) {\n ro = new ResizeObserver(onResize)\n ro.observe(stageEl.value)\n }\n})\nonBeforeUnmount(() => ro?.disconnect())\n\ndefineExpose({\n zoomIn: () => zoomCenter(1.2),\n zoomOut: () => zoomCenter(1 / 1.2),\n fit: () => fitView(),\n})\n</script>\n\n<template>\n <div\n ref=\"stageEl\"\n class=\"zi\"\n :class=\"{ 'zi--grab': scale > fitScale }\"\n @wheel.prevent=\"onWheel\"\n @pointerdown=\"onPointerDown\"\n @pointermove=\"onPointerMove\"\n @pointerup=\"onPointerUp\"\n @pointercancel=\"onPointerUp\"\n @dblclick=\"onDblClick\"\n >\n <img\n ref=\"imgEl\"\n class=\"zi__img\"\n :class=\"{ 'zi__img--ready': ready }\"\n :src=\"src\"\n :alt=\"alt\"\n draggable=\"false\"\n :style=\"{ transform: `translate(${tx}px, ${ty}px) scale(${scale})` }\"\n @load=\"onImgLoad\"\n @dragstart.prevent\n />\n <div class=\"zi__toolbar\" @pointerdown.stop @dblclick.stop @wheel.stop>\n <button type=\"button\" class=\"zi__tool\" title=\"缩小 (-)\" @click=\"zoomCenter(1 / 1.2)\">\n −\n </button>\n <button type=\"button\" class=\"zi__pct\" title=\"适应窗口 (0)\" @click=\"fitView()\">\n {{ percent }}%\n </button>\n <button type=\"button\" class=\"zi__tool\" title=\"放大 (+)\" @click=\"zoomCenter(1.2)\">+</button>\n </div>\n </div>\n</template>\n\n<style scoped>\n.zi {\n position: relative;\n width: 100%;\n height: 100%;\n min-width: 0;\n min-height: 0;\n overflow: hidden;\n cursor: zoom-out;\n touch-action: none;\n}\n.zi--grab {\n cursor: grab;\n}\n.zi--grab:active {\n cursor: grabbing;\n}\n.zi__img {\n position: absolute;\n top: 0;\n left: 0;\n transform-origin: 0 0;\n will-change: transform;\n user-select: none;\n -webkit-user-drag: none;\n opacity: 0;\n}\n.zi__img--ready {\n opacity: 1;\n}\n.zi__toolbar {\n position: absolute;\n bottom: 14px;\n left: 50%;\n transform: translateX(-50%);\n display: inline-flex;\n align-items: center;\n gap: 2px;\n padding: 4px;\n border-radius: 12px;\n background: rgba(28, 28, 30, 0.82);\n backdrop-filter: blur(8px);\n box-shadow: 0 8px 28px rgba(0, 0, 0, 0.4);\n}\n.zi__tool {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 32px;\n border: none;\n border-radius: 9px;\n background: transparent;\n color: #fff;\n font-size: 19px;\n line-height: 1;\n cursor: pointer;\n transition: background 0.15s ease;\n}\n.zi__tool:hover {\n background: rgba(255, 255, 255, 0.16);\n}\n.zi__pct {\n min-width: 56px;\n height: 32px;\n padding: 0 8px;\n border: none;\n border-radius: 9px;\n background: transparent;\n color: #fff;\n font-family: inherit;\n font-size: 12.5px;\n font-variant-numeric: tabular-nums;\n cursor: pointer;\n transition: background 0.15s ease;\n}\n.zi__pct:hover {\n background: rgba(255, 255, 255, 0.16);\n}\n</style>\n"],"mappings":"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"}
@@ -5,3 +5,5 @@ import t from "./EplCodeBlock.vue_vue_type_script_setup_true_lang.js";
5
5
  var n = /*#__PURE__*/ e(t, [["__scopeId", "data-v-4eade126"]]);
6
6
  //#endregion
7
7
  export { n as default };
8
+
9
+ //# sourceMappingURL=EplCodeBlock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EplCodeBlock.js","names":[],"sources":["../../../src/components/epl/EplCodeBlock.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { CodeLine, GuideSeg } from '@/lib/epl'\n\n/**\n * Renders a method body as the 易语言 IDE does: a line-number gutter (numbers come from the document-wide\n * counter via `nos`, so they stay continuous with the definition tables above), dashed block-guide brackets\n * in the indent columns (corner at a block's header/footer, tee to each inner line — precomputed in\n * {@link methodCodeLines}), and lightly syntax-coloured text (comments green, strings red, keyword blue with\n * its leading `.` hidden).\n */\nconst props = defineProps<{ lines: CodeLine[]; nos: (number | null)[] }>()\n\ntype Tok = { t: 'text' | 'string' | 'comment' | 'keyword'; s: string }\n\nfunction tokenize(text: string): Tok[] {\n const out: Tok[] = []\n let i = 0\n let buf = ''\n const flush = (): void => {\n if (buf) {\n out.push({ t: 'text', s: buf })\n buf = ''\n }\n }\n while (i < text.length) {\n const ch = text[i]\n if (ch === '“') {\n flush()\n let j = text.indexOf('”', i + 1)\n if (j === -1) j = text.length - 1\n out.push({ t: 'string', s: text.slice(i, j + 1) })\n i = j + 1\n } else if (ch === \"'\") {\n flush()\n out.push({ t: 'comment', s: text.slice(i) })\n i = text.length\n } else {\n buf += ch\n i++\n }\n }\n flush()\n // A leading dot-keyword (`.如果真` / `.判断循环首` …): colour it blue and DROP the dot (the IDE hides it).\n if (out.length && out[0].t === 'text') {\n const m = /^(\\s*)\\.([^\\s((]+)([\\s\\S]*)$/.exec(out[0].s)\n if (m) {\n const repl: Tok[] = []\n if (m[1]) repl.push({ t: 'text', s: m[1] })\n repl.push({ t: 'keyword', s: m[2] })\n if (m[3]) repl.push({ t: 'text', s: m[3] })\n out.splice(0, 1, ...repl)\n }\n }\n return out\n}\n\nconst rows = computed(() =>\n props.lines.map((ln, i) => ({\n // null → a hidden terminator row: render the guide but leave the number gutter blank.\n no: props.nos[i] ?? null,\n segs: ln.segs as GuideSeg[],\n tokens: tokenize(ln.text),\n })),\n)\n</script>\n\n<template>\n <div class=\"cb\">\n <div v-for=\"(row, i) in rows\" :key=\"i\" class=\"cb__row\">\n <span class=\"cb__no\">{{ row.no ?? '' }}</span>\n <span v-for=\"(seg, k) in row.segs\" :key=\"k\" class=\"cb__g\" :class=\"'cb__g--' + seg\" />\n <code class=\"cb__text\"\n ><span v-for=\"(tk, j) in row.tokens\" :key=\"j\" :class=\"'tk-' + tk.t\">{{ tk.s }}</span\n ><span v-if=\"row.tokens.length === 0\">&nbsp;</span></code\n >\n </div>\n </div>\n</template>\n\n<style scoped>\n.cb {\n font-family: var(--font-mono);\n font-size: 12.5px;\n line-height: 1.55;\n width: max-content;\n min-width: 100%;\n}\n.cb__row {\n display: flex;\n align-items: stretch;\n}\n.cb__row:hover {\n background: var(--epl-row-hover);\n}\n.cb__no {\n flex: 0 0 auto;\n width: 3.4em;\n padding-right: 10px;\n text-align: right;\n color: var(--epl-gutter);\n background: var(--epl-gutter-bg);\n user-select: none;\n position: sticky;\n left: 0;\n z-index: 1;\n}\n.cb__g {\n position: relative;\n flex: 0 0 auto;\n width: 1.45em;\n}\n.cb__g::before {\n /* vertical dashed bracket line (full height by default → 'mid' / 'tee') */\n content: '';\n position: absolute;\n left: 50%;\n top: 0;\n bottom: 0;\n border-left: 1px dashed var(--epl-guide);\n}\n.cb__g--top::before {\n /* header ┌: the vertical drops in at mid-row (lower half), then runs down through the body below */\n top: 50%;\n}\n.cb__g--bottom::before {\n /* end └: the vertical arrives from above and stops at mid-row */\n bottom: 50%;\n}\n.cb__g--blank::before {\n /* commented-out control flow: the column still indents the body, but draws no guide line */\n display: none;\n}\n.cb__g--top::after,\n.cb__g--bottom::after,\n.cb__g--tee::after {\n /* horizontal tick reaching toward the body text (┌ header · ├ branch divider · └ end) */\n content: '';\n position: absolute;\n left: 50%;\n right: 0;\n top: 50%;\n border-top: 1px dashed var(--epl-guide);\n}\n.cb__text {\n flex: 1 1 auto;\n white-space: pre;\n padding-right: 24px;\n color: var(--epl-fg);\n}\n.tk-comment {\n color: var(--epl-comment);\n}\n.tk-string {\n color: var(--epl-string);\n}\n.tk-keyword {\n color: var(--epl-keyword);\n font-weight: 600;\n}\n</style>\n"],"mappings":""}
@@ -70,3 +70,5 @@ var u = { class: "cb" }, d = { class: "cb__no" }, f = { class: "cb__text" }, p =
70
70
  });
71
71
  //#endregion
72
72
  export { m as default };
73
+
74
+ //# sourceMappingURL=EplCodeBlock.vue_vue_type_script_setup_true_lang.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EplCodeBlock.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/epl/EplCodeBlock.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { CodeLine, GuideSeg } from '@/lib/epl'\n\n/**\n * Renders a method body as the 易语言 IDE does: a line-number gutter (numbers come from the document-wide\n * counter via `nos`, so they stay continuous with the definition tables above), dashed block-guide brackets\n * in the indent columns (corner at a block's header/footer, tee to each inner line — precomputed in\n * {@link methodCodeLines}), and lightly syntax-coloured text (comments green, strings red, keyword blue with\n * its leading `.` hidden).\n */\nconst props = defineProps<{ lines: CodeLine[]; nos: (number | null)[] }>()\n\ntype Tok = { t: 'text' | 'string' | 'comment' | 'keyword'; s: string }\n\nfunction tokenize(text: string): Tok[] {\n const out: Tok[] = []\n let i = 0\n let buf = ''\n const flush = (): void => {\n if (buf) {\n out.push({ t: 'text', s: buf })\n buf = ''\n }\n }\n while (i < text.length) {\n const ch = text[i]\n if (ch === '“') {\n flush()\n let j = text.indexOf('”', i + 1)\n if (j === -1) j = text.length - 1\n out.push({ t: 'string', s: text.slice(i, j + 1) })\n i = j + 1\n } else if (ch === \"'\") {\n flush()\n out.push({ t: 'comment', s: text.slice(i) })\n i = text.length\n } else {\n buf += ch\n i++\n }\n }\n flush()\n // A leading dot-keyword (`.如果真` / `.判断循环首` …): colour it blue and DROP the dot (the IDE hides it).\n if (out.length && out[0].t === 'text') {\n const m = /^(\\s*)\\.([^\\s((]+)([\\s\\S]*)$/.exec(out[0].s)\n if (m) {\n const repl: Tok[] = []\n if (m[1]) repl.push({ t: 'text', s: m[1] })\n repl.push({ t: 'keyword', s: m[2] })\n if (m[3]) repl.push({ t: 'text', s: m[3] })\n out.splice(0, 1, ...repl)\n }\n }\n return out\n}\n\nconst rows = computed(() =>\n props.lines.map((ln, i) => ({\n // null → a hidden terminator row: render the guide but leave the number gutter blank.\n no: props.nos[i] ?? null,\n segs: ln.segs as GuideSeg[],\n tokens: tokenize(ln.text),\n })),\n)\n</script>\n\n<template>\n <div class=\"cb\">\n <div v-for=\"(row, i) in rows\" :key=\"i\" class=\"cb__row\">\n <span class=\"cb__no\">{{ row.no ?? '' }}</span>\n <span v-for=\"(seg, k) in row.segs\" :key=\"k\" class=\"cb__g\" :class=\"'cb__g--' + seg\" />\n <code class=\"cb__text\"\n ><span v-for=\"(tk, j) in row.tokens\" :key=\"j\" :class=\"'tk-' + tk.t\">{{ tk.s }}</span\n ><span v-if=\"row.tokens.length === 0\">&nbsp;</span></code\n >\n </div>\n </div>\n</template>\n\n<style scoped>\n.cb {\n font-family: var(--font-mono);\n font-size: 12.5px;\n line-height: 1.55;\n width: max-content;\n min-width: 100%;\n}\n.cb__row {\n display: flex;\n align-items: stretch;\n}\n.cb__row:hover {\n background: var(--epl-row-hover);\n}\n.cb__no {\n flex: 0 0 auto;\n width: 3.4em;\n padding-right: 10px;\n text-align: right;\n color: var(--epl-gutter);\n background: var(--epl-gutter-bg);\n user-select: none;\n position: sticky;\n left: 0;\n z-index: 1;\n}\n.cb__g {\n position: relative;\n flex: 0 0 auto;\n width: 1.45em;\n}\n.cb__g::before {\n /* vertical dashed bracket line (full height by default → 'mid' / 'tee') */\n content: '';\n position: absolute;\n left: 50%;\n top: 0;\n bottom: 0;\n border-left: 1px dashed var(--epl-guide);\n}\n.cb__g--top::before {\n /* header ┌: the vertical drops in at mid-row (lower half), then runs down through the body below */\n top: 50%;\n}\n.cb__g--bottom::before {\n /* end └: the vertical arrives from above and stops at mid-row */\n bottom: 50%;\n}\n.cb__g--blank::before {\n /* commented-out control flow: the column still indents the body, but draws no guide line */\n display: none;\n}\n.cb__g--top::after,\n.cb__g--bottom::after,\n.cb__g--tee::after {\n /* horizontal tick reaching toward the body text (┌ header · ├ branch divider · └ end) */\n content: '';\n position: absolute;\n left: 50%;\n right: 0;\n top: 50%;\n border-top: 1px dashed var(--epl-guide);\n}\n.cb__text {\n flex: 1 1 auto;\n white-space: pre;\n padding-right: 24px;\n color: var(--epl-fg);\n}\n.tk-comment {\n color: var(--epl-comment);\n}\n.tk-string {\n color: var(--epl-string);\n}\n.tk-keyword {\n color: var(--epl-keyword);\n font-weight: 600;\n}\n</style>\n"],"mappings":";;;;;;;;;EAWA,IAAM,IAAQ;EAId,SAAS,EAAS,GAAqB;GACrC,IAAM,IAAa,CAAC,GAChB,IAAI,GACJ,IAAM,IACJ,UAAoB;IACxB,AAEE,OADA,EAAI,KAAK;KAAE,GAAG;KAAQ,GAAG;IAAI,CAAC,GACxB;GAEV;GACA,OAAO,IAAI,EAAK,SAAQ;IACtB,IAAM,IAAK,EAAK;IAChB,IAAI,MAAO,KAAK;KACd,EAAM;KACN,IAAI,IAAI,EAAK,QAAQ,KAAK,IAAI,CAAC;KAG/B,AAFI,MAAM,OAAI,IAAI,EAAK,SAAS,IAChC,EAAI,KAAK;MAAE,GAAG;MAAU,GAAG,EAAK,MAAM,GAAG,IAAI,CAAC;KAAE,CAAC,GACjD,IAAI,IAAI;IACV,OAAO,AAAI,MAAO,OAChB,EAAM,GACN,EAAI,KAAK;KAAE,GAAG;KAAW,GAAG,EAAK,MAAM,CAAC;IAAE,CAAC,GAC3C,IAAI,EAAK,WAET,KAAO,GACP;GAEJ;GAGA,IAFA,EAAM,GAEF,EAAI,UAAU,EAAI,EAAE,CAAC,MAAM,QAAQ;IACrC,IAAM,IAAI,+BAA+B,KAAK,EAAI,EAAE,CAAC,CAAC;IACtD,IAAI,GAAG;KACL,IAAM,IAAc,CAAC;KAIrB,AAHI,EAAE,MAAI,EAAK,KAAK;MAAE,GAAG;MAAQ,GAAG,EAAE;KAAG,CAAC,GAC1C,EAAK,KAAK;MAAE,GAAG;MAAW,GAAG,EAAE;KAAG,CAAC,GAC/B,EAAE,MAAI,EAAK,KAAK;MAAE,GAAG;MAAQ,GAAG,EAAE;KAAG,CAAC,GAC1C,EAAI,OAAO,GAAG,GAAG,GAAG,CAAI;IAC1B;GACF;GACA,OAAO;EACT;EAEA,IAAM,IAAO,QACX,EAAM,MAAM,KAAK,GAAI,OAAO;GAE1B,IAAI,EAAM,IAAI,MAAM;GACpB,MAAM,EAAG;GACT,QAAQ,EAAS,EAAG,IAAI;EAC1B,EAAE,CACJ;yBAIE,EASM,OATN,GASM,EAAA,EAAA,EAAA,GARJ,EAOM,GAAA,MAAA,EAPkB,EAAA,QAAX,GAAK,YAAlB,EAOM,OAAA;GAPyB,KAAK;GAAG,OAAM;;GAC3C,EAA8C,QAA9C,GAA8C,EAAtB,EAAI,MAAE,EAAA,GAAA,CAAA;WAC9B,EAAqF,GAAA,MAAA,EAA5D,EAAI,OAAf,GAAK,YAAnB,EAAqF,QAAA;IAAjD,KAAK;IAAG,OAAK,EAAA,CAAC,SAAO,YAAqB,CAAG,CAAA;;GACjF,EAGC,QAHD,GAGC,EAAA,EAAA,EAAA,GAFE,EACA,GAAA,MAAA,EADwB,EAAI,SAAd,GAAI,YAAlB,EACA,QAAA;IADqC,KAAK;IAAI,OAAK,EAAA,QAAU,EAAG,CAAC;QAAK,EAAG,CAAC,GAAA,CAAA,YAC9D,EAAI,OAAO,WAAM,KAAA,EAAA,GAA7B,EAAkD,QAAA,GAAb,MAAM,KAAA,EAAA,IAAA,EAAA,CAAA,CAAA"}
@@ -5,3 +5,5 @@ import t from "./EplDoc.vue_vue_type_script_setup_true_lang.js";
5
5
  var n = /*#__PURE__*/ e(t, [["__scopeId", "data-v-ddbdec4d"]]);
6
6
  //#endregion
7
7
  export { n as default };
8
+
9
+ //# sourceMappingURL=EplDoc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EplDoc.js","names":[],"sources":["../../../src/components/epl/EplDoc.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { EplProgram, EplClassView } from '@/lib/epl'\nimport EplVarTable, { type EplCol } from './EplVarTable.vue'\nimport EplMethod from './EplMethod.vue'\nimport EplResource from './EplResource.vue'\nimport type { EplDocRef } from './docTypes'\nimport { LineCounter, type MethodNos } from './numbering'\n\n/**\n * The right-pane content for the active document. Switches on {@link EplDocRef.kind}: a class renders its\n * header table + member table + every method ({@link EplMethod}); the project-level tables (全局变量 /\n * 自定义数据类型 / Dll命令 / 常量表 / 图片·声音资源 / 资源表 / 模块引用表) render as bordered tables matching\n * the IDE (图片/声音 as media cards via {@link EplResource}).\n *\n * Every document carries a single continuous line-number gutter (see {@link LineCounter}): each *body* row and\n * code line takes the next number, header rows none. The numbering is threaded here (only the active kind\n * computes) and handed to the tables / methods so the gutter stays continuous across the whole document.\n */\nconst props = defineProps<{ program: EplProgram; doc: EplDocRef }>()\n\nconst cls = computed<EplClassView | null>(() =>\n props.doc.kind === 'class'\n ? (props.program.classes.find((c) => c.id === props.doc.classId) ?? null)\n : null,\n)\n\n// ── numbering: only the active document kind threads a counter ────────────────────────────────────\nconst classModel = computed(() => {\n if (props.doc.kind !== 'class' || !cls.value) return null\n const c = new LineCounter()\n const k = cls.value\n return {\n cls: k,\n header: c.next(),\n members: c.take(k.members.length),\n methods: k.methods.map((m) => ({\n method: m,\n nos: {\n head: c.next(),\n params: c.take(m.parameters.length),\n locals: c.take(m.locals.length),\n // A hidden terminator row (noNo) renders but takes no number — the gutter stays continuous around it.\n code: m.lines.map((ln) => (ln.noNo ? null : c.next())),\n } satisfies MethodNos,\n })),\n }\n})\n\nconst globalsNos = computed(() =>\n props.doc.kind === 'globals' ? new LineCounter().take(props.program.globals.length) : [],\n)\nconst structModels = computed(() => {\n if (props.doc.kind !== 'structs') return []\n const c = new LineCounter()\n return props.program.structs.map((st) => ({\n st,\n header: c.next(),\n members: c.take(st.members.length),\n }))\n})\nconst dllModels = computed(() => {\n if (props.doc.kind !== 'dll') return []\n const c = new LineCounter()\n return props.program.dllDeclares.map((d) => ({\n d,\n header: c.next(),\n lib: c.next(),\n entry: c.next(),\n params: c.take(d.parameters.length),\n }))\n})\nconst constantsNos = computed(() =>\n props.doc.kind === 'constants' ? new LineCounter().take(props.program.constants.length) : [],\n)\nconst formModels = computed(() => {\n if (props.doc.kind !== 'forms') return []\n const c = new LineCounter()\n return props.program.forms.map((f) => ({\n f,\n header: c.next(),\n elements: c.take(f.elements.length),\n }))\n})\nconst librariesNos = computed(() =>\n props.doc.kind === 'libraries' ? new LineCounter().take(props.program.libraries.length) : [],\n)\n\nconst MEMBER_COLS: EplCol[] = [\n { key: 'name', label: '变量名' },\n { key: 'type', label: '类型' },\n { key: 'arrayBound', label: '数组' },\n { key: 'comment', label: '备注' },\n]\nconst GLOBAL_COLS: EplCol[] = [\n { key: 'name', label: '变量名' },\n { key: 'type', label: '类型' },\n { key: 'public', label: '公开' },\n { key: 'arrayBound', label: '数组' },\n { key: 'comment', label: '备注' },\n]\nconst STRUCT_MEMBER_COLS: EplCol[] = [\n { key: 'name', label: '成员名' },\n { key: 'type', label: '类型' },\n { key: 'byAddress', label: '传址' },\n { key: 'arrayBound', label: '数组' },\n { key: 'comment', label: '备注' },\n]\n</script>\n\n<template>\n <div class=\"doc\">\n <!-- ── class / 程序集 / 窗口程序集 ───────────────────────────────────────── -->\n <template v-if=\"doc.kind === 'class' && classModel\">\n <table class=\"hd\">\n <thead>\n <tr v-if=\"classModel.cls.kind === 'class'\">\n <th class=\"hd__gut\" />\n <th>类名</th>\n <th>基类</th>\n <th class=\"hd__bool\">公开</th>\n <th class=\"hd__cmt\">备注</th>\n </tr>\n <tr v-else>\n <th class=\"hd__gut\" />\n <th>程序集名</th>\n <th>保留</th>\n <th>保留</th>\n <th class=\"hd__cmt\">备注</th>\n </tr>\n </thead>\n <tbody>\n <tr v-if=\"classModel.cls.kind === 'class'\">\n <td class=\"hd__gut\">{{ classModel.header }}</td>\n <td class=\"hd__ident\">{{ classModel.cls.name }}</td>\n <td class=\"hd__ident\">{{ classModel.cls.baseName }}</td>\n <td class=\"hd__bool\" />\n <td class=\"hd__cmt hd__cmttext\">{{ classModel.cls.comment }}</td>\n </tr>\n <tr v-else>\n <td class=\"hd__gut\">{{ classModel.header }}</td>\n <td class=\"hd__ident\">{{ classModel.cls.name }}</td>\n <td />\n <td />\n <td class=\"hd__cmt hd__cmttext\">{{ classModel.cls.comment }}</td>\n </tr>\n </tbody>\n </table>\n\n <EplVarTable\n v-if=\"classModel.cls.members.length\"\n :columns=\"MEMBER_COLS\"\n :rows=\"classModel.cls.members\"\n :nos=\"classModel.members\"\n />\n\n <div class=\"doc__methods\">\n <EplMethod\n v-for=\"mm in classModel.methods\"\n :key=\"mm.method.id\"\n :method=\"mm.method\"\n :nos=\"mm.nos\"\n />\n <p v-if=\"!classModel.cls.methods.length\" class=\"doc__empty\">(无子程序)</p>\n </div>\n </template>\n\n <!-- ── 全局变量表 ──────────────────────────────────────────────────────── -->\n <template v-else-if=\"doc.kind === 'globals'\">\n <h3 class=\"doc__h\">全局变量表</h3>\n <EplVarTable\n v-if=\"program.globals.length\"\n :columns=\"GLOBAL_COLS\"\n :rows=\"program.globals\"\n :nos=\"globalsNos\"\n />\n <p v-else class=\"doc__empty\">(无全局变量)</p>\n </template>\n\n <!-- ── 自定义数据类型表 ─────────────────────────────────────────────────── -->\n <template v-else-if=\"doc.kind === 'structs'\">\n <h3 class=\"doc__h\">自定义数据类型表</h3>\n <section v-for=\"sm in structModels\" :key=\"sm.st.id\" class=\"blk\">\n <table class=\"hd\">\n <thead>\n <tr>\n <th class=\"hd__gut\" />\n <th>数据类型名</th>\n <th class=\"hd__bool\">公开</th>\n <th class=\"hd__cmt\">备注</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td class=\"hd__gut\">{{ sm.header }}</td>\n <td class=\"hd__ident\">{{ sm.st.name }}</td>\n <td class=\"hd__bool hd__check\">{{ sm.st.isPublic ? '✓' : '' }}</td>\n <td class=\"hd__cmt hd__cmttext\">{{ sm.st.comment }}</td>\n </tr>\n </tbody>\n </table>\n <EplVarTable\n v-if=\"sm.st.members.length\"\n :columns=\"STRUCT_MEMBER_COLS\"\n :rows=\"sm.st.members\"\n :nos=\"sm.members\"\n />\n </section>\n <p v-if=\"!program.structs.length\" class=\"doc__empty\">(无自定义数据类型)</p>\n </template>\n\n <!-- ── Dll命令定义表 ───────────────────────────────────────────────────── -->\n <!-- Each DLL command is ONE table (no inner gaps): the command header row, then 库文件名 / 在库中对应命令名,\n each as a full-width label row followed by its full-width value row, then the parameter sub-table\n inlined — matching the e-language IDE (label and value on separate lines). -->\n <template v-else-if=\"doc.kind === 'dll'\">\n <h3 class=\"doc__h\">Dll命令定义表</h3>\n <section v-for=\"dm in dllModels\" :key=\"dm.d.id\" class=\"blk\">\n <table class=\"hd dll\">\n <thead>\n <tr>\n <th class=\"hd__gut\" />\n <th>Dll命令名</th>\n <th>返回值类型</th>\n <th class=\"hd__bool\">公开</th>\n <th class=\"hd__bool\">易包</th>\n <th class=\"hd__cmt\">备注</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td class=\"hd__gut\">{{ dm.header }}</td>\n <td class=\"hd__ident\">{{ dm.d.name }}</td>\n <td class=\"hd__ident\">{{ dm.d.returnType }}</td>\n <td class=\"hd__bool hd__check\">{{ dm.d.isPublic ? '✓' : '' }}</td>\n <td class=\"hd__bool\" />\n <td class=\"hd__cmt hd__cmttext\">{{ dm.d.comment }}</td>\n </tr>\n <tr>\n <td class=\"hd__gut\" />\n <td class=\"dll__lbl\" colspan=\"5\">库文件名</td>\n </tr>\n <tr>\n <td class=\"hd__gut\">{{ dm.lib }}</td>\n <td class=\"dll__val\" colspan=\"5\">{{ dm.d.libraryName }}</td>\n </tr>\n <tr>\n <td class=\"hd__gut\" />\n <td class=\"dll__lbl\" colspan=\"5\">在库中对应命令名</td>\n </tr>\n <tr>\n <td class=\"hd__gut\">{{ dm.entry }}</td>\n <td class=\"dll__val\" colspan=\"5\">{{ dm.d.entryPoint || dm.d.name }}</td>\n </tr>\n <template v-if=\"dm.d.parameters.length\">\n <tr>\n <th class=\"hd__gut\" />\n <th>参数名</th>\n <th>类型</th>\n <th class=\"hd__bool\">传址</th>\n <th class=\"hd__bool\">数组</th>\n <th class=\"hd__cmt\">备注</th>\n </tr>\n <tr v-for=\"(p, i) in dm.d.parameters\" :key=\"i\">\n <td class=\"hd__gut\">{{ dm.params[i] }}</td>\n <td class=\"hd__ident\">{{ p.name }}</td>\n <td class=\"hd__ident\">{{ p.type }}</td>\n <td class=\"hd__bool hd__check\">{{ p.byAddress ? '✓' : '' }}</td>\n <td class=\"hd__bool hd__check\">{{ p.isArray ? '✓' : '' }}</td>\n <td class=\"hd__cmt hd__cmttext\">{{ p.comment }}</td>\n </tr>\n </template>\n </tbody>\n </table>\n </section>\n <p v-if=\"!program.dllDeclares.length\" class=\"doc__empty\">(无 DLL 命令)</p>\n </template>\n\n <!-- ── 常量表 ──────────────────────────────────────────────────────────── -->\n <template v-else-if=\"doc.kind === 'constants'\">\n <h3 class=\"doc__h\">常量表</h3>\n <table v-if=\"program.constants.length\" class=\"hd\">\n <thead>\n <tr>\n <th class=\"hd__gut\" />\n <th>常量名</th>\n <th>常量值</th>\n <th class=\"hd__cmt\">备注</th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(c, i) in program.constants\" :key=\"c.id\">\n <td class=\"hd__gut\">{{ constantsNos[i] }}</td>\n <td class=\"hd__ident\">{{ c.name }}</td>\n <td class=\"hd__val\">{{ c.value }}</td>\n <td class=\"hd__cmt hd__cmttext\">{{ c.comment }}</td>\n </tr>\n </tbody>\n </table>\n <p v-else class=\"doc__empty\">(无常量)</p>\n </template>\n\n <!-- ── 图片/声音资源(图片组拆帧 / 单图 / 声音) ──────────────────────── -->\n <template v-else-if=\"doc.kind === 'resources'\">\n <h3 class=\"doc__h\">图片/声音资源</h3>\n <section v-for=\"r in program.resources\" :key=\"r.id\" class=\"res\">\n <div class=\"res__hd\">\n <span class=\"res__name\">{{ r.name }}</span>\n <span v-if=\"r.comment\" class=\"res__cmt\">{{ r.comment }}</span>\n </div>\n <EplResource :resource=\"r\" />\n </section>\n <p v-if=\"!program.resources.length\" class=\"doc__empty\">(无图片/声音资源)</p>\n </template>\n\n <!-- ── 资源表(窗口) ──────────────────────────────────────────────────── -->\n <template v-else-if=\"doc.kind === 'forms'\">\n <h3 class=\"doc__h\">资源表</h3>\n <section v-for=\"fm in formModels\" :key=\"fm.f.id\" class=\"blk\">\n <table class=\"hd\">\n <thead>\n <tr>\n <th class=\"hd__gut\" />\n <th>窗口名</th>\n <th>类</th>\n <th class=\"hd__cmt\">备注</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td class=\"hd__gut\">{{ fm.header }}</td>\n <td class=\"hd__ident\">{{ fm.f.name }}</td>\n <td class=\"hd__ident\">{{ fm.f.className }}</td>\n <td class=\"hd__cmt hd__cmttext\">{{ fm.f.comment }}</td>\n </tr>\n </tbody>\n </table>\n <table v-if=\"fm.f.elements.length\" class=\"hd\">\n <thead>\n <tr>\n <th class=\"hd__gut\" />\n <th>组件名</th>\n <th>类型</th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(e, i) in fm.f.elements\" :key=\"e.id\">\n <td class=\"hd__gut\">{{ fm.elements[i] }}</td>\n <td class=\"hd__ident\">{{ e.name }}</td>\n <td class=\"hd__ident\">{{ e.type }}</td>\n </tr>\n </tbody>\n </table>\n </section>\n <p v-if=\"!program.forms.length\" class=\"doc__empty\">(无窗口资源)</p>\n </template>\n\n <!-- ── 模块引用表(支持库) ────────────────────────────────────────────── -->\n <template v-else-if=\"doc.kind === 'libraries'\">\n <h3 class=\"doc__h\">模块引用表</h3>\n <table v-if=\"program.libraries.length\" class=\"hd\">\n <thead>\n <tr>\n <th class=\"hd__gut\" />\n <th>名称</th>\n <th>文件名</th>\n <th>版本</th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(l, i) in program.libraries\" :key=\"i\">\n <td class=\"hd__gut\">{{ librariesNos[i] }}</td>\n <td class=\"hd__ident\">{{ l.name }}</td>\n <td>{{ l.fileName }}</td>\n <td>{{ l.version }}</td>\n </tr>\n </tbody>\n </table>\n <p v-else class=\"doc__empty\">(无引用模块)</p>\n </template>\n </div>\n</template>\n\n<style scoped>\n.doc {\n padding: 12px 14px 40px;\n width: max-content;\n min-width: 100%;\n box-sizing: border-box;\n}\n.doc__h {\n margin: 0 0 8px;\n font-size: 13px;\n font-weight: 600;\n color: var(--epl-th-fg);\n}\n.doc__methods {\n margin-top: 10px;\n}\n.doc__empty {\n color: var(--epl-gutter);\n font-size: 12.5px;\n margin: 8px 0;\n}\n.blk {\n margin: 0 0 16px;\n}\n.res {\n margin: 0 0 18px;\n padding: 10px 12px;\n border: 1px solid var(--epl-border);\n border-radius: 4px;\n background: var(--epl-bg);\n}\n.res__hd {\n display: flex;\n align-items: baseline;\n gap: 10px;\n margin-bottom: 8px;\n}\n.res__name {\n color: var(--epl-ident);\n font-weight: 600;\n font-size: 13px;\n}\n.res__cmt {\n color: var(--epl-comment);\n font-size: 12px;\n}\n\n.hd {\n border-collapse: collapse;\n font-size: 12.5px;\n background: var(--epl-bg);\n margin: 2px 0;\n}\n.hd th,\n.hd td {\n border: 1px solid var(--epl-border);\n padding: 2px 8px;\n text-align: left;\n white-space: nowrap;\n color: var(--epl-fg);\n}\n.hd th {\n background: var(--epl-th-bg);\n color: var(--epl-th-fg);\n font-weight: 600;\n}\n.hd__bool {\n text-align: center;\n min-width: 2.6em;\n}\n.hd__check {\n color: var(--epl-check);\n font-weight: 700;\n}\n.hd__ident {\n color: var(--epl-ident);\n}\n.hd__val {\n white-space: normal;\n max-width: 460px;\n word-break: break-all;\n}\n.hd__cmt {\n white-space: normal;\n}\n.hd__cmttext {\n color: var(--epl-comment);\n}\n/* DLL 库文件名 / 在库中对应命令名: a full-width (colspan) label row, then its value row underneath. */\n.dll__lbl {\n color: var(--epl-th-fg);\n background: var(--epl-th-bg);\n}\n.dll__val {\n color: var(--epl-string);\n}\nth.hd__gut,\ntd.hd__gut {\n width: 3.4em;\n min-width: 3.4em;\n box-sizing: border-box;\n padding: 2px 10px 2px 0;\n text-align: right;\n border: none;\n background: var(--epl-gutter-bg);\n color: var(--epl-gutter);\n font-weight: normal;\n user-select: none;\n position: sticky;\n left: 0;\n z-index: 1;\n}\n</style>\n"],"mappings":""}
@@ -325,3 +325,5 @@ var te = { class: "doc" }, ne = { class: "hd" }, re = { key: 0 }, ie = { key: 1
325
325
  });
326
326
  //#endregion
327
327
  export { X as default };
328
+
329
+ //# sourceMappingURL=EplDoc.vue_vue_type_script_setup_true_lang.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EplDoc.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/epl/EplDoc.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport type { EplProgram, EplClassView } from '@/lib/epl'\nimport EplVarTable, { type EplCol } from './EplVarTable.vue'\nimport EplMethod from './EplMethod.vue'\nimport EplResource from './EplResource.vue'\nimport type { EplDocRef } from './docTypes'\nimport { LineCounter, type MethodNos } from './numbering'\n\n/**\n * The right-pane content for the active document. Switches on {@link EplDocRef.kind}: a class renders its\n * header table + member table + every method ({@link EplMethod}); the project-level tables (全局变量 /\n * 自定义数据类型 / Dll命令 / 常量表 / 图片·声音资源 / 资源表 / 模块引用表) render as bordered tables matching\n * the IDE (图片/声音 as media cards via {@link EplResource}).\n *\n * Every document carries a single continuous line-number gutter (see {@link LineCounter}): each *body* row and\n * code line takes the next number, header rows none. The numbering is threaded here (only the active kind\n * computes) and handed to the tables / methods so the gutter stays continuous across the whole document.\n */\nconst props = defineProps<{ program: EplProgram; doc: EplDocRef }>()\n\nconst cls = computed<EplClassView | null>(() =>\n props.doc.kind === 'class'\n ? (props.program.classes.find((c) => c.id === props.doc.classId) ?? null)\n : null,\n)\n\n// ── numbering: only the active document kind threads a counter ────────────────────────────────────\nconst classModel = computed(() => {\n if (props.doc.kind !== 'class' || !cls.value) return null\n const c = new LineCounter()\n const k = cls.value\n return {\n cls: k,\n header: c.next(),\n members: c.take(k.members.length),\n methods: k.methods.map((m) => ({\n method: m,\n nos: {\n head: c.next(),\n params: c.take(m.parameters.length),\n locals: c.take(m.locals.length),\n // A hidden terminator row (noNo) renders but takes no number — the gutter stays continuous around it.\n code: m.lines.map((ln) => (ln.noNo ? null : c.next())),\n } satisfies MethodNos,\n })),\n }\n})\n\nconst globalsNos = computed(() =>\n props.doc.kind === 'globals' ? new LineCounter().take(props.program.globals.length) : [],\n)\nconst structModels = computed(() => {\n if (props.doc.kind !== 'structs') return []\n const c = new LineCounter()\n return props.program.structs.map((st) => ({\n st,\n header: c.next(),\n members: c.take(st.members.length),\n }))\n})\nconst dllModels = computed(() => {\n if (props.doc.kind !== 'dll') return []\n const c = new LineCounter()\n return props.program.dllDeclares.map((d) => ({\n d,\n header: c.next(),\n lib: c.next(),\n entry: c.next(),\n params: c.take(d.parameters.length),\n }))\n})\nconst constantsNos = computed(() =>\n props.doc.kind === 'constants' ? new LineCounter().take(props.program.constants.length) : [],\n)\nconst formModels = computed(() => {\n if (props.doc.kind !== 'forms') return []\n const c = new LineCounter()\n return props.program.forms.map((f) => ({\n f,\n header: c.next(),\n elements: c.take(f.elements.length),\n }))\n})\nconst librariesNos = computed(() =>\n props.doc.kind === 'libraries' ? new LineCounter().take(props.program.libraries.length) : [],\n)\n\nconst MEMBER_COLS: EplCol[] = [\n { key: 'name', label: '变量名' },\n { key: 'type', label: '类型' },\n { key: 'arrayBound', label: '数组' },\n { key: 'comment', label: '备注' },\n]\nconst GLOBAL_COLS: EplCol[] = [\n { key: 'name', label: '变量名' },\n { key: 'type', label: '类型' },\n { key: 'public', label: '公开' },\n { key: 'arrayBound', label: '数组' },\n { key: 'comment', label: '备注' },\n]\nconst STRUCT_MEMBER_COLS: EplCol[] = [\n { key: 'name', label: '成员名' },\n { key: 'type', label: '类型' },\n { key: 'byAddress', label: '传址' },\n { key: 'arrayBound', label: '数组' },\n { key: 'comment', label: '备注' },\n]\n</script>\n\n<template>\n <div class=\"doc\">\n <!-- ── class / 程序集 / 窗口程序集 ───────────────────────────────────────── -->\n <template v-if=\"doc.kind === 'class' && classModel\">\n <table class=\"hd\">\n <thead>\n <tr v-if=\"classModel.cls.kind === 'class'\">\n <th class=\"hd__gut\" />\n <th>类名</th>\n <th>基类</th>\n <th class=\"hd__bool\">公开</th>\n <th class=\"hd__cmt\">备注</th>\n </tr>\n <tr v-else>\n <th class=\"hd__gut\" />\n <th>程序集名</th>\n <th>保留</th>\n <th>保留</th>\n <th class=\"hd__cmt\">备注</th>\n </tr>\n </thead>\n <tbody>\n <tr v-if=\"classModel.cls.kind === 'class'\">\n <td class=\"hd__gut\">{{ classModel.header }}</td>\n <td class=\"hd__ident\">{{ classModel.cls.name }}</td>\n <td class=\"hd__ident\">{{ classModel.cls.baseName }}</td>\n <td class=\"hd__bool\" />\n <td class=\"hd__cmt hd__cmttext\">{{ classModel.cls.comment }}</td>\n </tr>\n <tr v-else>\n <td class=\"hd__gut\">{{ classModel.header }}</td>\n <td class=\"hd__ident\">{{ classModel.cls.name }}</td>\n <td />\n <td />\n <td class=\"hd__cmt hd__cmttext\">{{ classModel.cls.comment }}</td>\n </tr>\n </tbody>\n </table>\n\n <EplVarTable\n v-if=\"classModel.cls.members.length\"\n :columns=\"MEMBER_COLS\"\n :rows=\"classModel.cls.members\"\n :nos=\"classModel.members\"\n />\n\n <div class=\"doc__methods\">\n <EplMethod\n v-for=\"mm in classModel.methods\"\n :key=\"mm.method.id\"\n :method=\"mm.method\"\n :nos=\"mm.nos\"\n />\n <p v-if=\"!classModel.cls.methods.length\" class=\"doc__empty\">(无子程序)</p>\n </div>\n </template>\n\n <!-- ── 全局变量表 ──────────────────────────────────────────────────────── -->\n <template v-else-if=\"doc.kind === 'globals'\">\n <h3 class=\"doc__h\">全局变量表</h3>\n <EplVarTable\n v-if=\"program.globals.length\"\n :columns=\"GLOBAL_COLS\"\n :rows=\"program.globals\"\n :nos=\"globalsNos\"\n />\n <p v-else class=\"doc__empty\">(无全局变量)</p>\n </template>\n\n <!-- ── 自定义数据类型表 ─────────────────────────────────────────────────── -->\n <template v-else-if=\"doc.kind === 'structs'\">\n <h3 class=\"doc__h\">自定义数据类型表</h3>\n <section v-for=\"sm in structModels\" :key=\"sm.st.id\" class=\"blk\">\n <table class=\"hd\">\n <thead>\n <tr>\n <th class=\"hd__gut\" />\n <th>数据类型名</th>\n <th class=\"hd__bool\">公开</th>\n <th class=\"hd__cmt\">备注</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td class=\"hd__gut\">{{ sm.header }}</td>\n <td class=\"hd__ident\">{{ sm.st.name }}</td>\n <td class=\"hd__bool hd__check\">{{ sm.st.isPublic ? '✓' : '' }}</td>\n <td class=\"hd__cmt hd__cmttext\">{{ sm.st.comment }}</td>\n </tr>\n </tbody>\n </table>\n <EplVarTable\n v-if=\"sm.st.members.length\"\n :columns=\"STRUCT_MEMBER_COLS\"\n :rows=\"sm.st.members\"\n :nos=\"sm.members\"\n />\n </section>\n <p v-if=\"!program.structs.length\" class=\"doc__empty\">(无自定义数据类型)</p>\n </template>\n\n <!-- ── Dll命令定义表 ───────────────────────────────────────────────────── -->\n <!-- Each DLL command is ONE table (no inner gaps): the command header row, then 库文件名 / 在库中对应命令名,\n each as a full-width label row followed by its full-width value row, then the parameter sub-table\n inlined — matching the e-language IDE (label and value on separate lines). -->\n <template v-else-if=\"doc.kind === 'dll'\">\n <h3 class=\"doc__h\">Dll命令定义表</h3>\n <section v-for=\"dm in dllModels\" :key=\"dm.d.id\" class=\"blk\">\n <table class=\"hd dll\">\n <thead>\n <tr>\n <th class=\"hd__gut\" />\n <th>Dll命令名</th>\n <th>返回值类型</th>\n <th class=\"hd__bool\">公开</th>\n <th class=\"hd__bool\">易包</th>\n <th class=\"hd__cmt\">备注</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td class=\"hd__gut\">{{ dm.header }}</td>\n <td class=\"hd__ident\">{{ dm.d.name }}</td>\n <td class=\"hd__ident\">{{ dm.d.returnType }}</td>\n <td class=\"hd__bool hd__check\">{{ dm.d.isPublic ? '✓' : '' }}</td>\n <td class=\"hd__bool\" />\n <td class=\"hd__cmt hd__cmttext\">{{ dm.d.comment }}</td>\n </tr>\n <tr>\n <td class=\"hd__gut\" />\n <td class=\"dll__lbl\" colspan=\"5\">库文件名</td>\n </tr>\n <tr>\n <td class=\"hd__gut\">{{ dm.lib }}</td>\n <td class=\"dll__val\" colspan=\"5\">{{ dm.d.libraryName }}</td>\n </tr>\n <tr>\n <td class=\"hd__gut\" />\n <td class=\"dll__lbl\" colspan=\"5\">在库中对应命令名</td>\n </tr>\n <tr>\n <td class=\"hd__gut\">{{ dm.entry }}</td>\n <td class=\"dll__val\" colspan=\"5\">{{ dm.d.entryPoint || dm.d.name }}</td>\n </tr>\n <template v-if=\"dm.d.parameters.length\">\n <tr>\n <th class=\"hd__gut\" />\n <th>参数名</th>\n <th>类型</th>\n <th class=\"hd__bool\">传址</th>\n <th class=\"hd__bool\">数组</th>\n <th class=\"hd__cmt\">备注</th>\n </tr>\n <tr v-for=\"(p, i) in dm.d.parameters\" :key=\"i\">\n <td class=\"hd__gut\">{{ dm.params[i] }}</td>\n <td class=\"hd__ident\">{{ p.name }}</td>\n <td class=\"hd__ident\">{{ p.type }}</td>\n <td class=\"hd__bool hd__check\">{{ p.byAddress ? '✓' : '' }}</td>\n <td class=\"hd__bool hd__check\">{{ p.isArray ? '✓' : '' }}</td>\n <td class=\"hd__cmt hd__cmttext\">{{ p.comment }}</td>\n </tr>\n </template>\n </tbody>\n </table>\n </section>\n <p v-if=\"!program.dllDeclares.length\" class=\"doc__empty\">(无 DLL 命令)</p>\n </template>\n\n <!-- ── 常量表 ──────────────────────────────────────────────────────────── -->\n <template v-else-if=\"doc.kind === 'constants'\">\n <h3 class=\"doc__h\">常量表</h3>\n <table v-if=\"program.constants.length\" class=\"hd\">\n <thead>\n <tr>\n <th class=\"hd__gut\" />\n <th>常量名</th>\n <th>常量值</th>\n <th class=\"hd__cmt\">备注</th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(c, i) in program.constants\" :key=\"c.id\">\n <td class=\"hd__gut\">{{ constantsNos[i] }}</td>\n <td class=\"hd__ident\">{{ c.name }}</td>\n <td class=\"hd__val\">{{ c.value }}</td>\n <td class=\"hd__cmt hd__cmttext\">{{ c.comment }}</td>\n </tr>\n </tbody>\n </table>\n <p v-else class=\"doc__empty\">(无常量)</p>\n </template>\n\n <!-- ── 图片/声音资源(图片组拆帧 / 单图 / 声音) ──────────────────────── -->\n <template v-else-if=\"doc.kind === 'resources'\">\n <h3 class=\"doc__h\">图片/声音资源</h3>\n <section v-for=\"r in program.resources\" :key=\"r.id\" class=\"res\">\n <div class=\"res__hd\">\n <span class=\"res__name\">{{ r.name }}</span>\n <span v-if=\"r.comment\" class=\"res__cmt\">{{ r.comment }}</span>\n </div>\n <EplResource :resource=\"r\" />\n </section>\n <p v-if=\"!program.resources.length\" class=\"doc__empty\">(无图片/声音资源)</p>\n </template>\n\n <!-- ── 资源表(窗口) ──────────────────────────────────────────────────── -->\n <template v-else-if=\"doc.kind === 'forms'\">\n <h3 class=\"doc__h\">资源表</h3>\n <section v-for=\"fm in formModels\" :key=\"fm.f.id\" class=\"blk\">\n <table class=\"hd\">\n <thead>\n <tr>\n <th class=\"hd__gut\" />\n <th>窗口名</th>\n <th>类</th>\n <th class=\"hd__cmt\">备注</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td class=\"hd__gut\">{{ fm.header }}</td>\n <td class=\"hd__ident\">{{ fm.f.name }}</td>\n <td class=\"hd__ident\">{{ fm.f.className }}</td>\n <td class=\"hd__cmt hd__cmttext\">{{ fm.f.comment }}</td>\n </tr>\n </tbody>\n </table>\n <table v-if=\"fm.f.elements.length\" class=\"hd\">\n <thead>\n <tr>\n <th class=\"hd__gut\" />\n <th>组件名</th>\n <th>类型</th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(e, i) in fm.f.elements\" :key=\"e.id\">\n <td class=\"hd__gut\">{{ fm.elements[i] }}</td>\n <td class=\"hd__ident\">{{ e.name }}</td>\n <td class=\"hd__ident\">{{ e.type }}</td>\n </tr>\n </tbody>\n </table>\n </section>\n <p v-if=\"!program.forms.length\" class=\"doc__empty\">(无窗口资源)</p>\n </template>\n\n <!-- ── 模块引用表(支持库) ────────────────────────────────────────────── -->\n <template v-else-if=\"doc.kind === 'libraries'\">\n <h3 class=\"doc__h\">模块引用表</h3>\n <table v-if=\"program.libraries.length\" class=\"hd\">\n <thead>\n <tr>\n <th class=\"hd__gut\" />\n <th>名称</th>\n <th>文件名</th>\n <th>版本</th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(l, i) in program.libraries\" :key=\"i\">\n <td class=\"hd__gut\">{{ librariesNos[i] }}</td>\n <td class=\"hd__ident\">{{ l.name }}</td>\n <td>{{ l.fileName }}</td>\n <td>{{ l.version }}</td>\n </tr>\n </tbody>\n </table>\n <p v-else class=\"doc__empty\">(无引用模块)</p>\n </template>\n </div>\n</template>\n\n<style scoped>\n.doc {\n padding: 12px 14px 40px;\n width: max-content;\n min-width: 100%;\n box-sizing: border-box;\n}\n.doc__h {\n margin: 0 0 8px;\n font-size: 13px;\n font-weight: 600;\n color: var(--epl-th-fg);\n}\n.doc__methods {\n margin-top: 10px;\n}\n.doc__empty {\n color: var(--epl-gutter);\n font-size: 12.5px;\n margin: 8px 0;\n}\n.blk {\n margin: 0 0 16px;\n}\n.res {\n margin: 0 0 18px;\n padding: 10px 12px;\n border: 1px solid var(--epl-border);\n border-radius: 4px;\n background: var(--epl-bg);\n}\n.res__hd {\n display: flex;\n align-items: baseline;\n gap: 10px;\n margin-bottom: 8px;\n}\n.res__name {\n color: var(--epl-ident);\n font-weight: 600;\n font-size: 13px;\n}\n.res__cmt {\n color: var(--epl-comment);\n font-size: 12px;\n}\n\n.hd {\n border-collapse: collapse;\n font-size: 12.5px;\n background: var(--epl-bg);\n margin: 2px 0;\n}\n.hd th,\n.hd td {\n border: 1px solid var(--epl-border);\n padding: 2px 8px;\n text-align: left;\n white-space: nowrap;\n color: var(--epl-fg);\n}\n.hd th {\n background: var(--epl-th-bg);\n color: var(--epl-th-fg);\n font-weight: 600;\n}\n.hd__bool {\n text-align: center;\n min-width: 2.6em;\n}\n.hd__check {\n color: var(--epl-check);\n font-weight: 700;\n}\n.hd__ident {\n color: var(--epl-ident);\n}\n.hd__val {\n white-space: normal;\n max-width: 460px;\n word-break: break-all;\n}\n.hd__cmt {\n white-space: normal;\n}\n.hd__cmttext {\n color: var(--epl-comment);\n}\n/* DLL 库文件名 / 在库中对应命令名: a full-width (colspan) label row, then its value row underneath. */\n.dll__lbl {\n color: var(--epl-th-fg);\n background: var(--epl-th-bg);\n}\n.dll__val {\n color: var(--epl-string);\n}\nth.hd__gut,\ntd.hd__gut {\n width: 3.4em;\n min-width: 3.4em;\n box-sizing: border-box;\n padding: 2px 10px 2px 0;\n text-align: right;\n border: none;\n background: var(--epl-gutter-bg);\n color: var(--epl-gutter);\n font-weight: normal;\n user-select: none;\n position: sticky;\n left: 0;\n z-index: 1;\n}\n</style>\n"],"mappings":"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"}
@@ -5,3 +5,5 @@ import t from "./EplMethod.vue_vue_type_script_setup_true_lang.js";
5
5
  var n = /*#__PURE__*/ e(t, [["__scopeId", "data-v-e540f854"]]);
6
6
  //#endregion
7
7
  export { n as default };
8
+
9
+ //# sourceMappingURL=EplMethod.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EplMethod.js","names":[],"sources":["../../../src/components/epl/EplMethod.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { EplMethodView } from '@/lib/epl'\nimport EplVarTable, { type EplCol } from './EplVarTable.vue'\nimport EplCodeBlock from './EplCodeBlock.vue'\nimport type { MethodNos } from './numbering'\n\n/**\n * One 子程序 (method): the IDE shows a header table (子程序名 / 返回值类型 / 公开 / 易包 / 备注), then a\n * parameter table and a local-variable table (each only when non-empty), then the decompiled body. Carries a\n * DOM id so the tree's method nodes can scroll to it. `nos` are the document-wide line numbers for its rows.\n */\nconst props = defineProps<{ method: EplMethodView; nos: MethodNos }>()\n\nconst PARAM_COLS: EplCol[] = [\n { key: 'name', label: '参数名' },\n { key: 'type', label: '类型' },\n { key: 'byReference', label: '参考' },\n { key: 'nullable', label: '可空' },\n { key: 'arrayFlag', label: '数组' },\n { key: 'comment', label: '备注' },\n]\nconst LOCAL_COLS: EplCol[] = [\n { key: 'name', label: '变量名' },\n { key: 'type', label: '类型' },\n { key: 'static', label: '静态' },\n { key: 'arrayBound', label: '数组' },\n { key: 'comment', label: '备注' },\n]\n\nconst anchorId = `epl-m-${props.method.id >>> 0}`\n</script>\n\n<template>\n <section :id=\"anchorId\" class=\"m\">\n <table class=\"m__head\">\n <thead>\n <tr>\n <th class=\"m__gut\" />\n <th>子程序名</th>\n <th>返回值类型</th>\n <th class=\"m__bool\">公开</th>\n <th class=\"m__bool\">易包</th>\n <th class=\"m__cmt\">备注</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td class=\"m__gut\">{{ nos.head }}</td>\n <td class=\"m__ident\">{{ method.name }}</td>\n <td class=\"m__ident\">{{ method.returnType }}</td>\n <td class=\"m__bool m__check\">{{ method.isPublic ? '✓' : '' }}</td>\n <td class=\"m__bool\" />\n <td class=\"m__cmt m__cmttext\">{{ method.comment }}</td>\n </tr>\n </tbody>\n </table>\n\n <EplVarTable\n v-if=\"method.parameters.length\"\n :columns=\"PARAM_COLS\"\n :rows=\"method.parameters\"\n :nos=\"nos.params\"\n />\n <EplVarTable\n v-if=\"method.locals.length\"\n :columns=\"LOCAL_COLS\"\n :rows=\"method.locals\"\n :nos=\"nos.locals\"\n />\n\n <EplCodeBlock\n v-if=\"method.lines.length\"\n class=\"m__code\"\n :lines=\"method.lines\"\n :nos=\"nos.code\"\n />\n </section>\n</template>\n\n<style scoped>\n.m {\n margin: 0 0 18px;\n}\n.m__head {\n border-collapse: collapse;\n font-size: 12.5px;\n background: var(--epl-bg);\n}\n.m__head th,\n.m__head td {\n border: 1px solid var(--epl-border);\n padding: 2px 8px;\n text-align: left;\n white-space: nowrap;\n color: var(--epl-fg);\n}\n.m__head th {\n background: var(--epl-th-bg);\n color: var(--epl-th-fg);\n font-weight: 600;\n}\n.m__bool {\n text-align: center;\n min-width: 2.6em;\n}\n.m__check {\n color: var(--epl-check);\n font-weight: 700;\n}\n.m__ident {\n color: var(--epl-ident);\n}\n.m__cmt {\n white-space: normal;\n}\n.m__cmttext {\n color: var(--epl-comment);\n}\nth.m__gut,\ntd.m__gut {\n width: 3.4em;\n min-width: 3.4em;\n box-sizing: border-box;\n padding: 2px 10px 2px 0;\n text-align: right;\n border: none;\n background: var(--epl-gutter-bg);\n color: var(--epl-gutter);\n font-weight: normal;\n user-select: none;\n position: sticky;\n left: 0;\n z-index: 1;\n}\n.m__code {\n margin-top: 4px;\n}\n</style>\n"],"mappings":""}
@@ -98,3 +98,5 @@ var l = { class: "m__head" }, u = { class: "m__gut" }, d = { class: "m__ident" }
98
98
  });
99
99
  //#endregion
100
100
  export { h as default };
101
+
102
+ //# sourceMappingURL=EplMethod.vue_vue_type_script_setup_true_lang.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EplMethod.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/epl/EplMethod.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { EplMethodView } from '@/lib/epl'\nimport EplVarTable, { type EplCol } from './EplVarTable.vue'\nimport EplCodeBlock from './EplCodeBlock.vue'\nimport type { MethodNos } from './numbering'\n\n/**\n * One 子程序 (method): the IDE shows a header table (子程序名 / 返回值类型 / 公开 / 易包 / 备注), then a\n * parameter table and a local-variable table (each only when non-empty), then the decompiled body. Carries a\n * DOM id so the tree's method nodes can scroll to it. `nos` are the document-wide line numbers for its rows.\n */\nconst props = defineProps<{ method: EplMethodView; nos: MethodNos }>()\n\nconst PARAM_COLS: EplCol[] = [\n { key: 'name', label: '参数名' },\n { key: 'type', label: '类型' },\n { key: 'byReference', label: '参考' },\n { key: 'nullable', label: '可空' },\n { key: 'arrayFlag', label: '数组' },\n { key: 'comment', label: '备注' },\n]\nconst LOCAL_COLS: EplCol[] = [\n { key: 'name', label: '变量名' },\n { key: 'type', label: '类型' },\n { key: 'static', label: '静态' },\n { key: 'arrayBound', label: '数组' },\n { key: 'comment', label: '备注' },\n]\n\nconst anchorId = `epl-m-${props.method.id >>> 0}`\n</script>\n\n<template>\n <section :id=\"anchorId\" class=\"m\">\n <table class=\"m__head\">\n <thead>\n <tr>\n <th class=\"m__gut\" />\n <th>子程序名</th>\n <th>返回值类型</th>\n <th class=\"m__bool\">公开</th>\n <th class=\"m__bool\">易包</th>\n <th class=\"m__cmt\">备注</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td class=\"m__gut\">{{ nos.head }}</td>\n <td class=\"m__ident\">{{ method.name }}</td>\n <td class=\"m__ident\">{{ method.returnType }}</td>\n <td class=\"m__bool m__check\">{{ method.isPublic ? '✓' : '' }}</td>\n <td class=\"m__bool\" />\n <td class=\"m__cmt m__cmttext\">{{ method.comment }}</td>\n </tr>\n </tbody>\n </table>\n\n <EplVarTable\n v-if=\"method.parameters.length\"\n :columns=\"PARAM_COLS\"\n :rows=\"method.parameters\"\n :nos=\"nos.params\"\n />\n <EplVarTable\n v-if=\"method.locals.length\"\n :columns=\"LOCAL_COLS\"\n :rows=\"method.locals\"\n :nos=\"nos.locals\"\n />\n\n <EplCodeBlock\n v-if=\"method.lines.length\"\n class=\"m__code\"\n :lines=\"method.lines\"\n :nos=\"nos.code\"\n />\n </section>\n</template>\n\n<style scoped>\n.m {\n margin: 0 0 18px;\n}\n.m__head {\n border-collapse: collapse;\n font-size: 12.5px;\n background: var(--epl-bg);\n}\n.m__head th,\n.m__head td {\n border: 1px solid var(--epl-border);\n padding: 2px 8px;\n text-align: left;\n white-space: nowrap;\n color: var(--epl-fg);\n}\n.m__head th {\n background: var(--epl-th-bg);\n color: var(--epl-th-fg);\n font-weight: 600;\n}\n.m__bool {\n text-align: center;\n min-width: 2.6em;\n}\n.m__check {\n color: var(--epl-check);\n font-weight: 700;\n}\n.m__ident {\n color: var(--epl-ident);\n}\n.m__cmt {\n white-space: normal;\n}\n.m__cmttext {\n color: var(--epl-comment);\n}\nth.m__gut,\ntd.m__gut {\n width: 3.4em;\n min-width: 3.4em;\n box-sizing: border-box;\n padding: 2px 10px 2px 0;\n text-align: right;\n border: none;\n background: var(--epl-gutter-bg);\n color: var(--epl-gutter);\n font-weight: normal;\n user-select: none;\n position: sticky;\n left: 0;\n z-index: 1;\n}\n.m__code {\n margin-top: 4px;\n}\n</style>\n"],"mappings":";;;;;;;;;;;EAWA,IAAM,IAAQ,GAER,IAAuB;GAC3B;IAAE,KAAK;IAAQ,OAAO;GAAM;GAC5B;IAAE,KAAK;IAAQ,OAAO;GAAK;GAC3B;IAAE,KAAK;IAAe,OAAO;GAAK;GAClC;IAAE,KAAK;IAAY,OAAO;GAAK;GAC/B;IAAE,KAAK;IAAa,OAAO;GAAK;GAChC;IAAE,KAAK;IAAW,OAAO;GAAK;EAChC,GACM,IAAuB;GAC3B;IAAE,KAAK;IAAQ,OAAO;GAAM;GAC5B;IAAE,KAAK;IAAQ,OAAO;GAAK;GAC3B;IAAE,KAAK;IAAU,OAAO;GAAK;GAC7B;IAAE,KAAK;IAAc,OAAO;GAAK;GACjC;IAAE,KAAK;IAAW,OAAO;GAAK;EAChC,GAEM,IAAW,SAAS,EAAM,OAAO,OAAO;yBAI5C,EA2CU,WAAA;GA3CA,IAAI;GAAU,OAAM;;GAC5B,EAqBQ,SArBR,GAqBQ,CAAA,AAAA,EAAA,OApBN,EASQ,SAAA,MAAA,CARN,EAOK,MAAA,MAAA;IANH,EAAqB,MAAA,EAAjB,OAAM,SAAQ,CAAA;IAClB,EAAa,MAAA,MAAT,MAAI;IACR,EAAc,MAAA,MAAV,OAAK;IACT,EAA2B,MAAA,EAAvB,OAAM,UAAS,GAAC,IAAE;IACtB,EAA2B,MAAA,EAAvB,OAAM,UAAS,GAAC,IAAE;IACtB,EAA0B,MAAA,EAAtB,OAAM,SAAQ,GAAC,IAAE;aAGzB,EASQ,SAAA,MAAA,CARN,EAOK,MAAA,MAAA;IANH,EAAsC,MAAtC,GAAsC,EAAhB,EAAA,IAAI,IAAI,GAAA,CAAA;IAC9B,EAA2C,MAA3C,GAA2C,EAAnB,EAAA,OAAO,IAAI,GAAA,CAAA;IACnC,EAAiD,MAAjD,GAAiD,EAAzB,EAAA,OAAO,UAAU,GAAA,CAAA;IACzC,EAAkE,MAAlE,GAAkE,EAAlC,EAAA,OAAO,WAAQ,MAAA,EAAA,GAAA,CAAA;aAC/C,EAAsB,MAAA,EAAlB,OAAM,UAAS,GAAA,MAAA,EAAA;IACnB,EAAuD,MAAvD,GAAuD,EAAtB,EAAA,OAAO,OAAO,GAAA,CAAA;;GAM7C,EAAA,OAAO,WAAW,UAAA,EAAA,GAD1B,EAKE,GAAA;;IAHC,SAAS;IACT,MAAM,EAAA,OAAO;IACb,KAAK,EAAA,IAAI;;GAGJ,EAAA,OAAO,OAAO,UAAA,EAAA,GADtB,EAKE,GAAA;;IAHC,SAAS;IACT,MAAM,EAAA,OAAO;IACb,KAAK,EAAA,IAAI;;GAIJ,EAAA,OAAO,MAAM,UAAA,EAAA,GADrB,EAKE,GAAA;;IAHA,OAAM;IACL,OAAO,EAAA,OAAO;IACd,KAAK,EAAA,IAAI"}
@@ -5,3 +5,5 @@ import t from "./EplResource.vue_vue_type_script_setup_true_lang.js";
5
5
  var n = /*#__PURE__*/ e(t, [["__scopeId", "data-v-c9bf3476"]]);
6
6
  //#endregion
7
7
  export { n as default };
8
+
9
+ //# sourceMappingURL=EplResource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EplResource.js","names":[],"sources":["../../../src/components/epl/EplResource.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { onBeforeUnmount, onMounted, ref, shallowRef } from 'vue'\nimport { parseEplImageList, type EplImageFrame, type EplResourceRow } from '@/lib/epl'\n\n/**\n * Renders one 图片 / 声音 resource's media (the surrounding name/备注 card is drawn by {@link EplDoc}). An image\n * is first tried as a 图片组 (Windows ImageList — {@link parseEplImageList}); if so its frames are decoded to\n * RGBA and painted to per-frame canvases → data URLs. Otherwise the bytes are sniffed by magic: a browser-native\n * image shows inline, a playable sound gets an <audio>, and anything else degrades to a labelled download card.\n * All Blob URLs are built in onMounted (browser-only) and revoked on unmount. Upstream bytes are only ever\n * decoded as a raster image / audio track — never executed.\n */\nconst props = defineProps<{ resource: EplResourceRow }>()\n\ntype Sniff = { mime: string; ext: string; ok: boolean }\nfunction starts(b: Uint8Array, sig: number[], off = 0): boolean {\n for (let i = 0; i < sig.length; i++) if (b[off + i] !== sig[i]) return false\n return true\n}\nfunction sniffImage(b: Uint8Array): Sniff {\n if (starts(b, [0x89, 0x50, 0x4e, 0x47])) return { mime: 'image/png', ext: 'png', ok: true }\n if (starts(b, [0xff, 0xd8, 0xff])) return { mime: 'image/jpeg', ext: 'jpg', ok: true }\n if (starts(b, [0x47, 0x49, 0x46, 0x38])) return { mime: 'image/gif', ext: 'gif', ok: true }\n if (starts(b, [0x42, 0x4d])) return { mime: 'image/bmp', ext: 'bmp', ok: true }\n if (starts(b, [0x52, 0x49, 0x46, 0x46]) && starts(b, [0x57, 0x45, 0x42, 0x50], 8))\n return { mime: 'image/webp', ext: 'webp', ok: true }\n if (starts(b, [0x00, 0x00, 0x01, 0x00])) return { mime: 'image/x-icon', ext: 'ico', ok: true }\n return { mime: 'application/octet-stream', ext: 'bin', ok: false }\n}\nfunction sniffSound(b: Uint8Array): Sniff {\n if (starts(b, [0x52, 0x49, 0x46, 0x46]) && starts(b, [0x57, 0x41, 0x56, 0x45], 8))\n return { mime: 'audio/wav', ext: 'wav', ok: true }\n if (\n starts(b, [0x49, 0x44, 0x33]) ||\n starts(b, [0xff, 0xfb]) ||\n starts(b, [0xff, 0xf3]) ||\n starts(b, [0xff, 0xf2])\n )\n return { mime: 'audio/mpeg', ext: 'mp3', ok: true }\n if (starts(b, [0x4f, 0x67, 0x67, 0x53])) return { mime: 'audio/ogg', ext: 'ogg', ok: true }\n if (starts(b, [0x4d, 0x54, 0x68, 0x64])) return { mime: 'audio/midi', ext: 'mid', ok: false } // <audio> can't play MIDI\n return { mime: 'application/octet-stream', ext: 'bin', ok: false }\n}\n\nfunction fmtSize(n: number): string {\n if (n < 1024) return n + ' B'\n if (n < 1024 * 1024) return (n / 1024).toFixed(1) + ' KB'\n return (n / 1024 / 1024).toFixed(1) + ' MB'\n}\n\nfunction frameToDataUrl(f: EplImageFrame): string {\n const cv = document.createElement('canvas')\n cv.width = f.width\n cv.height = f.height\n const ctx = cv.getContext('2d')\n if (!ctx) return ''\n ctx.putImageData(new ImageData(f.rgba, f.width, f.height), 0, 0)\n return cv.toDataURL('image/png')\n}\n\nconst mode = ref<'group' | 'image' | 'sound' | 'file'>('file')\nconst url = ref('') // Blob URL for a single image / sound\nconst sniff = ref<Sniff | null>(null)\nconst broken = ref(false)\nconst downloadName = ref('')\nconst size = ref(0)\nconst frames = shallowRef<string[]>([]) // 图片组 frame data URLs\nconst group = ref<{ count: number; cx: number; cy: number } | null>(null)\n\nonMounted(() => {\n const r = props.resource\n size.value = r.bytes.length\n downloadName.value = r.name\n if (r.kind === 'image') {\n const list = parseEplImageList(r.bytes)\n if (list) {\n group.value = { count: list.frames.length, cx: list.cx, cy: list.cy }\n frames.value = list.frames.map(frameToDataUrl)\n mode.value = 'group'\n return\n }\n const s = sniffImage(r.bytes)\n sniff.value = s\n downloadName.value = `${r.name}.${s.ext}`\n url.value = URL.createObjectURL(new Blob([r.bytes], { type: s.mime }))\n mode.value = s.ok ? 'image' : 'file'\n return\n }\n const s = sniffSound(r.bytes)\n sniff.value = s\n downloadName.value = `${r.name}.${s.ext}`\n url.value = URL.createObjectURL(new Blob([r.bytes], { type: s.mime }))\n mode.value = s.ok ? 'sound' : 'file'\n})\nonBeforeUnmount(() => {\n if (url.value) URL.revokeObjectURL(url.value)\n})\n</script>\n\n<template>\n <!-- 图片组 (Windows ImageList): a grid of the individual frames -->\n <div v-if=\"mode === 'group' && group\" class=\"r-group\">\n <div class=\"r-group__hd\">图片组 · {{ group.count }} 张 · {{ group.cx }}×{{ group.cy }}</div>\n <div class=\"r-group__grid\">\n <a\n v-for=\"(f, i) in frames\"\n :key=\"i\"\n :href=\"f\"\n target=\"_blank\"\n rel=\"noopener\"\n class=\"r-frame\"\n :title=\"`#${i}`\"\n >\n <img :src=\"f\" :alt=\"`#${i}`\" class=\"r-frame__img\" />\n </a>\n </div>\n </div>\n\n <!-- single browser-native image -->\n <div v-else-if=\"mode === 'image' && !broken\" class=\"r-single\">\n <a :href=\"url\" target=\"_blank\" rel=\"noopener\" class=\"r-single__link\">\n <img :src=\"url\" :alt=\"resource.name\" class=\"r-single__img\" @error=\"broken = true\" />\n </a>\n <span class=\"r-meta\">{{ fmtSize(size) }}</span>\n </div>\n\n <!-- playable sound -->\n <div v-else-if=\"mode === 'sound'\" class=\"r-sound\">\n <audio :src=\"url\" controls class=\"r-audio\" />\n <a :href=\"url\" :download=\"downloadName\" class=\"r-dl\">下载</a>\n </div>\n\n <!-- fallback: unknown image format / non-playable sound -->\n <div v-else class=\"r-file\">\n <span class=\"r-file__ico\">{{ resource.kind === 'image' ? '🖼' : '🔊' }}</span>\n <span class=\"r-meta\"\n >{{ resource.kind === 'image' ? '图片' : '声音' }} · {{ fmtSize(size) }} ·\n {{ resource.kind === 'image' ? '格式无法预览' : '格式无法播放' }}</span\n >\n <a v-if=\"url\" :href=\"url\" :download=\"downloadName\" class=\"r-dl\">下载</a>\n </div>\n</template>\n\n<style scoped>\n.r-group__hd {\n color: var(--epl-gutter);\n font-size: 12px;\n margin-bottom: 6px;\n}\n.r-group__grid {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n.r-frame {\n display: inline-flex;\n padding: 3px;\n border: 1px solid var(--epl-border);\n border-radius: 3px;\n background:\n linear-gradient(45deg, #e8e8e8 25%, transparent 25%, transparent 75%, #e8e8e8 75%) 0 0/12px 12px,\n linear-gradient(45deg, #e8e8e8 25%, #fff 25%, #fff 75%, #e8e8e8 75%) 6px 6px/12px 12px;\n line-height: 0;\n}\n.r-frame__img {\n height: 30px;\n width: auto;\n image-rendering: pixelated;\n}\n.r-single__link {\n display: inline-flex;\n line-height: 0;\n}\n.r-single__img {\n max-height: 220px;\n max-width: 100%;\n border: 1px solid var(--epl-border);\n border-radius: 3px;\n background: #fff;\n object-fit: contain;\n}\n.r-single {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n.r-meta {\n color: var(--epl-gutter);\n font-size: 12px;\n}\n.r-sound,\n.r-file {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n.r-audio {\n height: 32px;\n vertical-align: middle;\n}\n.r-file__ico {\n font-size: 16px;\n}\n.r-dl {\n color: var(--epl-keyword);\n text-decoration: none;\n font-size: 12px;\n}\n.r-dl:hover {\n text-decoration: underline;\n}\n</style>\n"],"mappings":""}
@@ -202,3 +202,5 @@ var p = {
202
202
  });
203
203
  //#endregion
204
204
  export { k as default };
205
+
206
+ //# sourceMappingURL=EplResource.vue_vue_type_script_setup_true_lang.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EplResource.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/epl/EplResource.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { onBeforeUnmount, onMounted, ref, shallowRef } from 'vue'\nimport { parseEplImageList, type EplImageFrame, type EplResourceRow } from '@/lib/epl'\n\n/**\n * Renders one 图片 / 声音 resource's media (the surrounding name/备注 card is drawn by {@link EplDoc}). An image\n * is first tried as a 图片组 (Windows ImageList — {@link parseEplImageList}); if so its frames are decoded to\n * RGBA and painted to per-frame canvases → data URLs. Otherwise the bytes are sniffed by magic: a browser-native\n * image shows inline, a playable sound gets an <audio>, and anything else degrades to a labelled download card.\n * All Blob URLs are built in onMounted (browser-only) and revoked on unmount. Upstream bytes are only ever\n * decoded as a raster image / audio track — never executed.\n */\nconst props = defineProps<{ resource: EplResourceRow }>()\n\ntype Sniff = { mime: string; ext: string; ok: boolean }\nfunction starts(b: Uint8Array, sig: number[], off = 0): boolean {\n for (let i = 0; i < sig.length; i++) if (b[off + i] !== sig[i]) return false\n return true\n}\nfunction sniffImage(b: Uint8Array): Sniff {\n if (starts(b, [0x89, 0x50, 0x4e, 0x47])) return { mime: 'image/png', ext: 'png', ok: true }\n if (starts(b, [0xff, 0xd8, 0xff])) return { mime: 'image/jpeg', ext: 'jpg', ok: true }\n if (starts(b, [0x47, 0x49, 0x46, 0x38])) return { mime: 'image/gif', ext: 'gif', ok: true }\n if (starts(b, [0x42, 0x4d])) return { mime: 'image/bmp', ext: 'bmp', ok: true }\n if (starts(b, [0x52, 0x49, 0x46, 0x46]) && starts(b, [0x57, 0x45, 0x42, 0x50], 8))\n return { mime: 'image/webp', ext: 'webp', ok: true }\n if (starts(b, [0x00, 0x00, 0x01, 0x00])) return { mime: 'image/x-icon', ext: 'ico', ok: true }\n return { mime: 'application/octet-stream', ext: 'bin', ok: false }\n}\nfunction sniffSound(b: Uint8Array): Sniff {\n if (starts(b, [0x52, 0x49, 0x46, 0x46]) && starts(b, [0x57, 0x41, 0x56, 0x45], 8))\n return { mime: 'audio/wav', ext: 'wav', ok: true }\n if (\n starts(b, [0x49, 0x44, 0x33]) ||\n starts(b, [0xff, 0xfb]) ||\n starts(b, [0xff, 0xf3]) ||\n starts(b, [0xff, 0xf2])\n )\n return { mime: 'audio/mpeg', ext: 'mp3', ok: true }\n if (starts(b, [0x4f, 0x67, 0x67, 0x53])) return { mime: 'audio/ogg', ext: 'ogg', ok: true }\n if (starts(b, [0x4d, 0x54, 0x68, 0x64])) return { mime: 'audio/midi', ext: 'mid', ok: false } // <audio> can't play MIDI\n return { mime: 'application/octet-stream', ext: 'bin', ok: false }\n}\n\nfunction fmtSize(n: number): string {\n if (n < 1024) return n + ' B'\n if (n < 1024 * 1024) return (n / 1024).toFixed(1) + ' KB'\n return (n / 1024 / 1024).toFixed(1) + ' MB'\n}\n\nfunction frameToDataUrl(f: EplImageFrame): string {\n const cv = document.createElement('canvas')\n cv.width = f.width\n cv.height = f.height\n const ctx = cv.getContext('2d')\n if (!ctx) return ''\n ctx.putImageData(new ImageData(f.rgba, f.width, f.height), 0, 0)\n return cv.toDataURL('image/png')\n}\n\nconst mode = ref<'group' | 'image' | 'sound' | 'file'>('file')\nconst url = ref('') // Blob URL for a single image / sound\nconst sniff = ref<Sniff | null>(null)\nconst broken = ref(false)\nconst downloadName = ref('')\nconst size = ref(0)\nconst frames = shallowRef<string[]>([]) // 图片组 frame data URLs\nconst group = ref<{ count: number; cx: number; cy: number } | null>(null)\n\nonMounted(() => {\n const r = props.resource\n size.value = r.bytes.length\n downloadName.value = r.name\n if (r.kind === 'image') {\n const list = parseEplImageList(r.bytes)\n if (list) {\n group.value = { count: list.frames.length, cx: list.cx, cy: list.cy }\n frames.value = list.frames.map(frameToDataUrl)\n mode.value = 'group'\n return\n }\n const s = sniffImage(r.bytes)\n sniff.value = s\n downloadName.value = `${r.name}.${s.ext}`\n url.value = URL.createObjectURL(new Blob([r.bytes], { type: s.mime }))\n mode.value = s.ok ? 'image' : 'file'\n return\n }\n const s = sniffSound(r.bytes)\n sniff.value = s\n downloadName.value = `${r.name}.${s.ext}`\n url.value = URL.createObjectURL(new Blob([r.bytes], { type: s.mime }))\n mode.value = s.ok ? 'sound' : 'file'\n})\nonBeforeUnmount(() => {\n if (url.value) URL.revokeObjectURL(url.value)\n})\n</script>\n\n<template>\n <!-- 图片组 (Windows ImageList): a grid of the individual frames -->\n <div v-if=\"mode === 'group' && group\" class=\"r-group\">\n <div class=\"r-group__hd\">图片组 · {{ group.count }} 张 · {{ group.cx }}×{{ group.cy }}</div>\n <div class=\"r-group__grid\">\n <a\n v-for=\"(f, i) in frames\"\n :key=\"i\"\n :href=\"f\"\n target=\"_blank\"\n rel=\"noopener\"\n class=\"r-frame\"\n :title=\"`#${i}`\"\n >\n <img :src=\"f\" :alt=\"`#${i}`\" class=\"r-frame__img\" />\n </a>\n </div>\n </div>\n\n <!-- single browser-native image -->\n <div v-else-if=\"mode === 'image' && !broken\" class=\"r-single\">\n <a :href=\"url\" target=\"_blank\" rel=\"noopener\" class=\"r-single__link\">\n <img :src=\"url\" :alt=\"resource.name\" class=\"r-single__img\" @error=\"broken = true\" />\n </a>\n <span class=\"r-meta\">{{ fmtSize(size) }}</span>\n </div>\n\n <!-- playable sound -->\n <div v-else-if=\"mode === 'sound'\" class=\"r-sound\">\n <audio :src=\"url\" controls class=\"r-audio\" />\n <a :href=\"url\" :download=\"downloadName\" class=\"r-dl\">下载</a>\n </div>\n\n <!-- fallback: unknown image format / non-playable sound -->\n <div v-else class=\"r-file\">\n <span class=\"r-file__ico\">{{ resource.kind === 'image' ? '🖼' : '🔊' }}</span>\n <span class=\"r-meta\"\n >{{ resource.kind === 'image' ? '图片' : '声音' }} · {{ fmtSize(size) }} ·\n {{ resource.kind === 'image' ? '格式无法预览' : '格式无法播放' }}</span\n >\n <a v-if=\"url\" :href=\"url\" :download=\"downloadName\" class=\"r-dl\">下载</a>\n </div>\n</template>\n\n<style scoped>\n.r-group__hd {\n color: var(--epl-gutter);\n font-size: 12px;\n margin-bottom: 6px;\n}\n.r-group__grid {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n}\n.r-frame {\n display: inline-flex;\n padding: 3px;\n border: 1px solid var(--epl-border);\n border-radius: 3px;\n background:\n linear-gradient(45deg, #e8e8e8 25%, transparent 25%, transparent 75%, #e8e8e8 75%) 0 0/12px 12px,\n linear-gradient(45deg, #e8e8e8 25%, #fff 25%, #fff 75%, #e8e8e8 75%) 6px 6px/12px 12px;\n line-height: 0;\n}\n.r-frame__img {\n height: 30px;\n width: auto;\n image-rendering: pixelated;\n}\n.r-single__link {\n display: inline-flex;\n line-height: 0;\n}\n.r-single__img {\n max-height: 220px;\n max-width: 100%;\n border: 1px solid var(--epl-border);\n border-radius: 3px;\n background: #fff;\n object-fit: contain;\n}\n.r-single {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n.r-meta {\n color: var(--epl-gutter);\n font-size: 12px;\n}\n.r-sound,\n.r-file {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n.r-audio {\n height: 32px;\n vertical-align: middle;\n}\n.r-file__ico {\n font-size: 16px;\n}\n.r-dl {\n color: var(--epl-keyword);\n text-decoration: none;\n font-size: 12px;\n}\n.r-dl:hover {\n text-decoration: underline;\n}\n</style>\n"],"mappings":"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"}
@@ -5,3 +5,5 @@ import t from "./EplTree.vue_vue_type_script_setup_true_lang.js";
5
5
  var n = /*#__PURE__*/ e(t, [["__scopeId", "data-v-855ef1ee"]]);
6
6
  //#endregion
7
7
  export { n as default };
8
+
9
+ //# sourceMappingURL=EplTree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EplTree.js","names":[],"sources":["../../../src/components/epl/EplTree.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport type { EplProgram, EplClassKind } from '@/lib/epl'\nimport type { EplDocRef, EplDocKind } from './docTypes'\n\n/**\n * The 易语言 IDE「程序」tree: every 程序集 / 窗口程序集 / 类 at the top level (expandable to its 子程序), then\n * the project-level tables (全局变量 / 自定义数据类型 / Dll命令 / 常量表 / 资源表 / 模块引用表) — each shown\n * only when it has content. Clicking a node opens its document; clicking a method jumps to it inside the class\n * document.\n */\nconst props = defineProps<{ program: EplProgram; activeId: string }>()\nconst emit = defineEmits<{\n (e: 'select', ref: EplDocRef): void\n (e: 'selectMethod', payload: { classId: number; methodId: number }): void\n}>()\n\nconst expanded = ref<Set<number>>(new Set())\nfunction toggle(classId: number): void {\n const s = new Set(expanded.value)\n if (s.has(classId)) s.delete(classId)\n else s.add(classId)\n expanded.value = s\n}\n\nconst KIND_ICON: Record<EplClassKind, { ch: string; cls: string }> = {\n static: { ch: '集', cls: 'ico--static' },\n form: { ch: '窗', cls: 'ico--form' },\n class: { ch: '类', cls: 'ico--class' },\n}\n\ninterface TableNode {\n kind: EplDocKind\n title: string\n count: number\n}\nconst tableNodes = computed<TableNode[]>(() => {\n const p = props.program\n const all: TableNode[] = [\n { kind: 'globals', title: '全局变量', count: p.globals.length },\n { kind: 'structs', title: '自定义数据类型', count: p.structs.length },\n { kind: 'dll', title: 'Dll命令', count: p.dllDeclares.length },\n { kind: 'constants', title: '常量表', count: p.constants.length },\n { kind: 'resources', title: '图片/声音', count: p.resources.length },\n { kind: 'forms', title: '资源表', count: p.forms.length },\n { kind: 'libraries', title: '模块引用表', count: p.libraries.length },\n ]\n return all.filter((n) => n.count > 0)\n})\n\nfunction selectClass(classId: number, title: string): void {\n emit('select', { id: `class:${classId >>> 0}`, kind: 'class', classId, title })\n}\nfunction selectTable(n: TableNode): void {\n emit('select', { id: n.kind, kind: n.kind, title: n.title })\n}\n</script>\n\n<template>\n <div class=\"tree\">\n <div class=\"tree__root\">程序数据</div>\n\n <div v-for=\"c in program.classes\" :key=\"c.id\" class=\"tree__group\">\n <div class=\"tree__node\" :class=\"{ 'is-active': activeId === `class:${c.id >>> 0}` }\">\n <button\n v-if=\"c.methods.length\"\n type=\"button\"\n class=\"tree__caret\"\n :class=\"{ 'is-open': expanded.has(c.id) }\"\n @click=\"toggle(c.id)\"\n >\n ▶\n </button>\n <span v-else class=\"tree__caret tree__caret--empty\" />\n <button type=\"button\" class=\"tree__label\" @click=\"selectClass(c.id, c.name)\">\n <span class=\"ico\" :class=\"KIND_ICON[c.kind].cls\">{{ KIND_ICON[c.kind].ch }}</span>\n <span class=\"tree__name\">{{ c.name }}</span>\n </button>\n </div>\n <div v-if=\"expanded.has(c.id)\" class=\"tree__children\">\n <button\n v-for=\"m in c.methods\"\n :key=\"m.id\"\n type=\"button\"\n class=\"tree__method\"\n @click=\"emit('selectMethod', { classId: c.id, methodId: m.id })\"\n >\n <span class=\"ico ico--method\">子</span>\n <span class=\"tree__name\">{{ m.name }}</span>\n </button>\n </div>\n </div>\n\n <button\n v-for=\"n in tableNodes\"\n :key=\"n.kind\"\n type=\"button\"\n class=\"tree__node tree__label tree__table\"\n :class=\"{ 'is-active': activeId === n.kind }\"\n @click=\"selectTable(n)\"\n >\n <span class=\"ico ico--table\">表</span>\n <span class=\"tree__name\">{{ n.title }}</span>\n </button>\n </div>\n</template>\n\n<style scoped>\n.tree {\n font-size: 12.5px;\n padding: 6px 0;\n user-select: none;\n color: var(--epl-fg);\n}\n.tree__root {\n padding: 2px 10px 4px;\n font-weight: 600;\n color: var(--epl-th-fg);\n}\n.tree__node {\n display: flex;\n align-items: center;\n gap: 2px;\n width: 100%;\n}\n.tree__node.is-active,\n.tree__table.is-active {\n background: var(--epl-sel);\n}\n.tree__caret {\n flex: 0 0 auto;\n width: 16px;\n height: 18px;\n padding: 0;\n border: none;\n background: none;\n cursor: pointer;\n color: var(--epl-gutter);\n font-size: 8px;\n transition: transform 0.1s;\n}\n.tree__caret.is-open {\n transform: rotate(90deg);\n}\n.tree__caret--empty {\n cursor: default;\n}\n.tree__label {\n display: flex;\n align-items: center;\n gap: 6px;\n flex: 1 1 auto;\n min-width: 0;\n padding: 2px 10px 2px 0;\n border: none;\n background: none;\n cursor: pointer;\n text-align: left;\n color: inherit;\n font: inherit;\n}\n.tree__label:hover {\n color: var(--epl-ident);\n}\n.tree__table {\n padding-left: 18px;\n}\n.tree__children {\n display: flex;\n flex-direction: column;\n}\n.tree__method {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 1px 10px 1px 34px;\n border: none;\n background: none;\n cursor: pointer;\n text-align: left;\n color: inherit;\n font: inherit;\n}\n.tree__method:hover {\n color: var(--epl-ident);\n}\n.tree__name {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.ico {\n flex: 0 0 auto;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 15px;\n height: 15px;\n border-radius: 3px;\n font-size: 10px;\n color: #fff;\n line-height: 1;\n}\n.ico--static {\n background: #5b8def;\n}\n.ico--form {\n background: #8a6fd0;\n}\n.ico--class {\n background: #2fa37a;\n}\n.ico--method {\n background: #c0894a;\n}\n.ico--table {\n background: #888;\n}\n</style>\n"],"mappings":""}