@l1yp/file-viewer 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/dist/FileViewer.js +2 -0
- package/dist/FileViewer.js.map +1 -0
- package/dist/FileViewer.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/FileViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/AppxViewer.js +2 -0
- package/dist/components/AppxViewer.js.map +1 -0
- package/dist/components/AppxViewer.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/AppxViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/ArchiveBrowser.js +2 -0
- package/dist/components/ArchiveBrowser.js.map +1 -0
- package/dist/components/ArchiveBrowser.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/ArchiveBrowser.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/AudioViewer.js +2 -0
- package/dist/components/AudioViewer.js.map +1 -0
- package/dist/components/AudioViewer.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/AudioViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/BinObjBrowser.js +2 -0
- package/dist/components/BinObjBrowser.js.map +1 -0
- package/dist/components/BinObjBrowser.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/BinObjBrowser.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/CertViewer.js +2 -0
- package/dist/components/CertViewer.js.map +1 -0
- package/dist/components/CertViewer.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/CertViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/ClassViewer.js +2 -0
- package/dist/components/ClassViewer.js.map +1 -0
- package/dist/components/ClassViewer.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/ClassViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/CodeBlock.js +2 -0
- package/dist/components/CodeBlock.js.map +1 -0
- package/dist/components/CodeBlock.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/CodeBlock.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/CodeView.js +2 -0
- package/dist/components/CodeView.js.map +1 -0
- package/dist/components/CodeView.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/CodeView.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/CsvViewer.js +2 -0
- package/dist/components/CsvViewer.js.map +1 -0
- package/dist/components/CsvViewer.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/CsvViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/DicomViewer.js +2 -0
- package/dist/components/DicomViewer.js.map +1 -0
- package/dist/components/DicomViewer.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/DicomViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/DocxNavigationPane.js +9 -0
- package/dist/components/DocxNavigationPane.js.map +1 -0
- package/dist/components/DocxNavigationPane.vue.d.ts +23 -0
- package/dist/components/DocxNavigationPane.vue_vue_type_script_setup_true_lang.js +98 -0
- package/dist/components/DocxNavigationPane.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/DocxViewer.js +3 -1
- package/dist/components/DocxViewer.js.map +1 -0
- package/dist/components/DocxViewer.vue_vue_type_script_setup_true_lang.js +72 -37
- package/dist/components/DocxViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/DrawioViewer.js +2 -0
- package/dist/components/DrawioViewer.js.map +1 -0
- package/dist/components/DrawioViewer.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/DrawioViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/DxfViewer.js +2 -0
- package/dist/components/DxfViewer.js.map +1 -0
- package/dist/components/DxfViewer.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/DxfViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/EbookViewer.js +2 -0
- package/dist/components/EbookViewer.js.map +1 -0
- package/dist/components/EbookViewer.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/EbookViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/EmlViewer.js +2 -0
- package/dist/components/EmlViewer.js.map +1 -0
- package/dist/components/EmlViewer.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/EmlViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/EplViewer.js +2 -0
- package/dist/components/EplViewer.js.map +1 -0
- package/dist/components/EplViewer.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/EplViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/FileViewerBody.js +3 -1
- package/dist/components/FileViewerBody.js.map +1 -0
- package/dist/components/FileViewerBody.vue.d.ts +5 -0
- package/dist/components/FileViewerBody.vue_vue_type_script_setup_true_lang.js +250 -247
- package/dist/components/FileViewerBody.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/FileViewerPanel.js +2 -0
- package/dist/components/FileViewerPanel.js.map +1 -0
- package/dist/components/FileViewerPanel.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/FileViewerPanel.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/FontViewer.js +2 -0
- package/dist/components/FontViewer.js.map +1 -0
- package/dist/components/FontViewer.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/FontViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/FrontmatterCard.js +2 -0
- package/dist/components/FrontmatterCard.js.map +1 -0
- package/dist/components/FrontmatterCard.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/FrontmatterCard.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/GeoViewer.js +2 -0
- package/dist/components/GeoViewer.js.map +1 -0
- package/dist/components/GeoViewer.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/GeoViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/HarViewer.js +2 -0
- package/dist/components/HarViewer.js.map +1 -0
- package/dist/components/HarViewer.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/HarViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/HexViewer.js +2 -0
- package/dist/components/HexViewer.js.map +1 -0
- package/dist/components/HexViewer.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/HexViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/HprofViewer.js +2 -0
- package/dist/components/HprofViewer.js.map +1 -0
- package/dist/components/HprofViewer.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/HprofViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/ImageLightbox.js +2 -0
- package/dist/components/ImageLightbox.js.map +1 -0
- package/dist/components/ImageLightbox.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/ImageLightbox.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/InlineText.js +2 -0
- package/dist/components/InlineText.js.map +1 -0
- package/dist/components/JksViewer.js +2 -0
- package/dist/components/JksViewer.js.map +1 -0
- package/dist/components/JksViewer.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/JksViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/JsonlViewer.js +2 -0
- package/dist/components/JsonlViewer.js.map +1 -0
- package/dist/components/JsonlViewer.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/JsonlViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/LogViewer.js +2 -0
- package/dist/components/LogViewer.js.map +1 -0
- package/dist/components/LogViewer.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/LogViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/LrcViewer.js +2 -0
- package/dist/components/LrcViewer.js.map +1 -0
- package/dist/components/LrcViewer.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/LrcViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/MarkdownTable.js +2 -0
- package/dist/components/MarkdownTable.js.map +1 -0
- package/dist/components/MarkdownTable.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/MarkdownTable.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/MarkdownText.js +2 -0
- package/dist/components/MarkdownText.js.map +1 -0
- package/dist/components/MhtViewer.js +2 -0
- package/dist/components/MhtViewer.js.map +1 -0
- package/dist/components/MhtViewer.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/MhtViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/MindMapView.js +2 -0
- package/dist/components/MindMapView.js.map +1 -0
- package/dist/components/MindMapView.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/MindMapView.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/MissingDependency.js +2 -0
- package/dist/components/MissingDependency.js.map +1 -0
- package/dist/components/MissingDependency.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/MissingDependency.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/ModelViewer.js +2 -0
- package/dist/components/ModelViewer.js.map +1 -0
- package/dist/components/ModelViewer.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/ModelViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/MsiViewer.js +2 -0
- package/dist/components/MsiViewer.js.map +1 -0
- package/dist/components/MsiViewer.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/MsiViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/NotebookViewer.js +2 -0
- package/dist/components/NotebookViewer.js.map +1 -0
- package/dist/components/NotebookViewer.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/NotebookViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/PdfViewer.js +2 -0
- package/dist/components/PdfViewer.js.map +1 -0
- package/dist/components/PdfViewer.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/PdfViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/PptxNavigationPane.js +9 -0
- package/dist/components/PptxNavigationPane.js.map +1 -0
- package/dist/components/PptxNavigationPane.vue.d.ts +20 -0
- package/dist/components/PptxNavigationPane.vue_vue_type_script_setup_true_lang.js +120 -0
- package/dist/components/PptxNavigationPane.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/PptxViewer.js +3 -1
- package/dist/components/PptxViewer.js.map +1 -0
- package/dist/components/PptxViewer.vue_vue_type_script_setup_true_lang.js +71 -39
- package/dist/components/PptxViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/PsdViewer.js +2 -0
- package/dist/components/PsdViewer.js.map +1 -0
- package/dist/components/PsdViewer.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/PsdViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/QmcAudioViewer.js +2 -0
- package/dist/components/QmcAudioViewer.js.map +1 -0
- package/dist/components/QmcAudioViewer.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/QmcAudioViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/RasterViewer.js +2 -0
- package/dist/components/RasterViewer.js.map +1 -0
- package/dist/components/RasterViewer.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/RasterViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/RtfViewer.js +2 -0
- package/dist/components/RtfViewer.js.map +1 -0
- package/dist/components/RtfViewer.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/RtfViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/SevenZipBrowser.js +2 -0
- package/dist/components/SevenZipBrowser.js.map +1 -0
- package/dist/components/SevenZipBrowser.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/SevenZipBrowser.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/SqliteViewer.js +2 -0
- package/dist/components/SqliteViewer.js.map +1 -0
- package/dist/components/SqliteViewer.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/SqliteViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/SubtitleViewer.js +2 -0
- package/dist/components/SubtitleViewer.js.map +1 -0
- package/dist/components/SubtitleViewer.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/SubtitleViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/XlsxChart.js +2 -0
- package/dist/components/XlsxChart.js.map +1 -0
- package/dist/components/XlsxChart.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/XlsxChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/XlsxViewer.js +3 -1
- package/dist/components/XlsxViewer.js.map +1 -0
- package/dist/components/XlsxViewer.vue_vue_type_script_setup_true_lang.js +301 -304
- package/dist/components/XlsxViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/XmindViewer.js +2 -0
- package/dist/components/XmindViewer.js.map +1 -0
- package/dist/components/XmindViewer.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/XmindViewer.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/ZipBrowser.js +3 -1
- package/dist/components/ZipBrowser.js.map +1 -0
- package/dist/components/ZipBrowser.vue.d.ts +3 -1
- package/dist/components/ZipBrowser.vue_vue_type_script_setup_true_lang.js +154 -122
- package/dist/components/ZipBrowser.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/ZoomImage.js +2 -0
- package/dist/components/ZoomImage.js.map +1 -0
- package/dist/components/ZoomImage.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/ZoomImage.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/epl/EplCodeBlock.js +2 -0
- package/dist/components/epl/EplCodeBlock.js.map +1 -0
- package/dist/components/epl/EplCodeBlock.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/epl/EplCodeBlock.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/epl/EplDoc.js +2 -0
- package/dist/components/epl/EplDoc.js.map +1 -0
- package/dist/components/epl/EplDoc.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/epl/EplDoc.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/epl/EplMethod.js +2 -0
- package/dist/components/epl/EplMethod.js.map +1 -0
- package/dist/components/epl/EplMethod.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/epl/EplMethod.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/epl/EplResource.js +2 -0
- package/dist/components/epl/EplResource.js.map +1 -0
- package/dist/components/epl/EplResource.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/epl/EplResource.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/epl/EplTree.js +2 -0
- package/dist/components/epl/EplTree.js.map +1 -0
- package/dist/components/epl/EplTree.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/epl/EplTree.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/epl/EplVarTable.js +2 -0
- package/dist/components/epl/EplVarTable.js.map +1 -0
- package/dist/components/epl/EplVarTable.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/epl/EplVarTable.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/epl/numbering.js +2 -0
- package/dist/components/epl/numbering.js.map +1 -0
- package/dist/components/icons/Icon.js +2 -0
- package/dist/components/icons/Icon.js.map +1 -0
- package/dist/components/icons/Icon.vue_vue_type_script_setup_true_lang.js +2 -0
- package/dist/components/icons/Icon.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/icons/iconPaths.js +2 -0
- package/dist/components/icons/iconPaths.js.map +1 -0
- package/dist/components/optionalViewer.js +2 -0
- package/dist/components/optionalViewer.js.map +1 -0
- package/dist/components/ui/ClampBlock.js +2 -0
- package/dist/components/ui/ClampBlock.js.map +1 -0
- package/dist/composables/useElementNavigation.d.ts +21 -0
- package/dist/composables/useElementNavigation.js +63 -0
- package/dist/composables/useElementNavigation.js.map +1 -0
- package/dist/composables/useFileViewer.js +2 -0
- package/dist/composables/useFileViewer.js.map +1 -0
- package/dist/composables/useLightbox.js +2 -0
- package/dist/composables/useLightbox.js.map +1 -0
- package/dist/composables/useLogRules.js +2 -0
- package/dist/composables/useLogRules.js.map +1 -0
- package/dist/lib/aes.js +2 -0
- package/dist/lib/aes.js.map +1 -0
- package/dist/lib/appx.js +2 -0
- package/dist/lib/appx.js.map +1 -0
- package/dist/lib/archiveHtml.d.ts +49 -0
- package/dist/lib/archiveHtml.js +377 -0
- package/dist/lib/archiveHtml.js.map +1 -0
- package/dist/lib/asn1.js +2 -0
- package/dist/lib/asn1.js.map +1 -0
- package/dist/lib/binobj.js +2 -0
- package/dist/lib/binobj.js.map +1 -0
- package/dist/lib/brotli.js +2 -0
- package/dist/lib/brotli.js.map +1 -0
- package/dist/lib/bzip2.js +2 -0
- package/dist/lib/bzip2.js.map +1 -0
- package/dist/lib/classfile.js +2 -0
- package/dist/lib/classfile.js.map +1 -0
- package/dist/lib/codePreview.js +2 -0
- package/dist/lib/codePreview.js.map +1 -0
- package/dist/lib/codefold.js +2 -0
- package/dist/lib/codefold.js.map +1 -0
- package/dist/lib/codeformat.js +2 -0
- package/dist/lib/codeformat.js.map +1 -0
- package/dist/lib/csv.js +2 -0
- package/dist/lib/csv.js.map +1 -0
- package/dist/lib/des.js +2 -0
- package/dist/lib/des.js.map +1 -0
- package/dist/lib/diagram.js +2 -0
- package/dist/lib/diagram.js.map +1 -0
- package/dist/lib/dicom.js +2 -0
- package/dist/lib/dicom.js.map +1 -0
- package/dist/lib/dicomCodecs.js +2 -0
- package/dist/lib/dicomCodecs.js.map +1 -0
- package/dist/lib/dicomRender.js +2 -0
- package/dist/lib/dicomRender.js.map +1 -0
- package/dist/lib/docxNavigation.d.ts +31 -0
- package/dist/lib/docxNavigation.js +65 -0
- package/dist/lib/docxNavigation.js.map +1 -0
- package/dist/lib/dxf.js +2 -0
- package/dist/lib/dxf.js.map +1 -0
- package/dist/lib/eml.js +2 -0
- package/dist/lib/eml.js.map +1 -0
- package/dist/lib/encoding.js +2 -0
- package/dist/lib/encoding.js.map +1 -0
- package/dist/lib/epl/code/codeDataParser.js +2 -0
- package/dist/lib/epl/code/codeDataParser.js.map +1 -0
- package/dist/lib/epl/code/codeLines.js +2 -0
- package/dist/lib/epl/code/codeLines.js.map +1 -0
- package/dist/lib/epl/code/textCode.js +2 -0
- package/dist/lib/epl/code/textCode.js.map +1 -0
- package/dist/lib/epl/eplDocument.js +2 -0
- package/dist/lib/epl/eplDocument.js.map +1 -0
- package/dist/lib/epl/imageList.js +2 -0
- package/dist/lib/epl/imageList.js.map +1 -0
- package/dist/lib/epl/index.js +2 -0
- package/dist/lib/epl/index.js.map +1 -0
- package/dist/lib/epl/io/binaryReader.js +2 -0
- package/dist/lib/epl/io/binaryReader.js.map +1 -0
- package/dist/lib/epl/io/encoding.js +2 -0
- package/dist/lib/epl/io/encoding.js.map +1 -0
- package/dist/lib/epl/model/eplSystemId.js +2 -0
- package/dist/lib/epl/model/eplSystemId.js.map +1 -0
- package/dist/lib/epl/names/eplLibData.js +2 -0
- package/dist/lib/epl/names/eplLibData.js.map +1 -0
- package/dist/lib/epl/names/idToNameMap.js +2 -0
- package/dist/lib/epl/names/idToNameMap.js.map +1 -0
- package/dist/lib/epl/names/libNameProvider.js +2 -0
- package/dist/lib/epl/names/libNameProvider.js.map +1 -0
- package/dist/lib/epl/program.js +2 -0
- package/dist/lib/epl/program.js.map +1 -0
- package/dist/lib/epl/projectFileReader.js +2 -0
- package/dist/lib/epl/projectFileReader.js.map +1 -0
- package/dist/lib/fb2.js +2 -0
- package/dist/lib/fb2.js.map +1 -0
- package/dist/lib/fileType.js +2 -0
- package/dist/lib/fileType.js.map +1 -0
- package/dist/lib/fonts.js +2 -0
- package/dist/lib/fonts.js.map +1 -0
- package/dist/lib/format.js +2 -0
- package/dist/lib/format.js.map +1 -0
- package/dist/lib/frontmatter.js +2 -0
- package/dist/lib/frontmatter.js.map +1 -0
- package/dist/lib/geo.js +2 -0
- package/dist/lib/geo.js.map +1 -0
- package/dist/lib/har.js +2 -0
- package/dist/lib/har.js.map +1 -0
- package/dist/lib/highlight.js +2 -0
- package/dist/lib/highlight.js.map +1 -0
- package/dist/lib/highlightLangs.js +2 -0
- package/dist/lib/highlightLangs.js.map +1 -0
- package/dist/lib/hprof.js +2 -0
- package/dist/lib/hprof.js.map +1 -0
- package/dist/lib/ipynb.js +2 -0
- package/dist/lib/ipynb.js.map +1 -0
- package/dist/lib/jks.js +2 -0
- package/dist/lib/jks.js.map +1 -0
- package/dist/lib/jsonl.js +2 -0
- package/dist/lib/jsonl.js.map +1 -0
- package/dist/lib/lrc.js +2 -0
- package/dist/lib/lrc.js.map +1 -0
- package/dist/lib/lzma.js +2 -0
- package/dist/lib/lzma.js.map +1 -0
- package/dist/lib/markdown/blocks.js +2 -0
- package/dist/lib/markdown/blocks.js.map +1 -0
- package/dist/lib/markdown/inline.js +2 -0
- package/dist/lib/markdown/inline.js.map +1 -0
- package/dist/lib/markdown/math.js +2 -0
- package/dist/lib/markdown/math.js.map +1 -0
- package/dist/lib/markdown/segmentize.js +2 -0
- package/dist/lib/markdown/segmentize.js.map +1 -0
- package/dist/lib/markdown/styles.js +2 -0
- package/dist/lib/markdown/styles.js.map +1 -0
- package/dist/lib/mht.js +2 -0
- package/dist/lib/mht.js.map +1 -0
- package/dist/lib/midi.js +2 -0
- package/dist/lib/midi.js.map +1 -0
- package/dist/lib/mime.js +2 -0
- package/dist/lib/mime.js.map +1 -0
- package/dist/lib/mindmap.js +2 -0
- package/dist/lib/mindmap.js.map +1 -0
- package/dist/lib/mobi.js +2 -0
- package/dist/lib/mobi.js.map +1 -0
- package/dist/lib/msi.js +2 -0
- package/dist/lib/msi.js.map +1 -0
- package/dist/lib/optionalDep.js +2 -0
- package/dist/lib/optionalDep.js.map +1 -0
- package/dist/lib/pkcs12.js +2 -0
- package/dist/lib/pkcs12.js.map +1 -0
- package/dist/lib/pptxNavigation.d.ts +7 -0
- package/dist/lib/pptxNavigation.js +29 -0
- package/dist/lib/pptxNavigation.js.map +1 -0
- package/dist/lib/qmc.js +2 -0
- package/dist/lib/qmc.js.map +1 -0
- package/dist/lib/rar.js +2 -0
- package/dist/lib/rar.js.map +1 -0
- package/dist/lib/rawPreview.js +2 -0
- package/dist/lib/rawPreview.js.map +1 -0
- package/dist/lib/rc2.js +2 -0
- package/dist/lib/rc2.js.map +1 -0
- package/dist/lib/resolveInput.js +2 -0
- package/dist/lib/resolveInput.js.map +1 -0
- package/dist/lib/rtf.js +2 -0
- package/dist/lib/rtf.js.map +1 -0
- package/dist/lib/sevenZip.js +2 -0
- package/dist/lib/sevenZip.js.map +1 -0
- package/dist/lib/sha1.js +2 -0
- package/dist/lib/sha1.js.map +1 -0
- package/dist/lib/sha256.js +2 -0
- package/dist/lib/sha256.js.map +1 -0
- package/dist/lib/speechAudio.js +2 -0
- package/dist/lib/speechAudio.js.map +1 -0
- package/dist/lib/sqlite.js +2 -0
- package/dist/lib/sqlite.js.map +1 -0
- package/dist/lib/subtitle.js +2 -0
- package/dist/lib/subtitle.js.map +1 -0
- package/dist/lib/tarball.js +2 -0
- package/dist/lib/tarball.js.map +1 -0
- package/dist/lib/viewerFormats.js +2 -0
- package/dist/lib/viewerFormats.js.map +1 -0
- package/dist/lib/viewerKind.js +2 -0
- package/dist/lib/viewerKind.js.map +1 -0
- package/dist/lib/x509.js +2 -0
- package/dist/lib/x509.js.map +1 -0
- package/dist/lib/xlsx.js +2 -0
- package/dist/lib/xlsx.js.map +1 -0
- package/dist/lib/xlsxCharts.js +2 -0
- package/dist/lib/xlsxCharts.js.map +1 -0
- package/dist/lib/xmind.js +2 -0
- package/dist/lib/xmind.js.map +1 -0
- package/dist/lib/zip.js +2 -0
- package/dist/lib/zip.js.map +1 -0
- package/dist/style.css +1 -1
- package/package.json +1 -1
|
@@ -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\"> </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"}
|
|
@@ -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":""}
|
|
@@ -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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"}
|
|
@@ -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":""}
|
|
@@ -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"}
|
|
@@ -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":""}
|
|
@@ -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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"}
|
|
@@ -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":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EplTree.vue_vue_type_script_setup_true_lang.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":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EplVarTable.js","names":[],"sources":["../../../src/components/epl/EplVarTable.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { EplVarRow } from '@/lib/epl'\n\n/**\n * The 易语言 IDE renders every definition (参数 / 局部变量 / 成员 / 全局变量 / DLL 参数) as a bordered table\n * with a pale header row. This is the shared table: the caller picks the columns (label + which {@link EplVarRow}\n * field each maps to), so one component covers all the variation between parameter / variable / member tables.\n * Boolean columns (公开 / 静态 / 传址 / 参考 / 可空 / 数组) render a centered ✓.\n */\nexport type EplColKey =\n | 'name'\n | 'type'\n | 'public'\n | 'static'\n | 'byAddress'\n | 'byReference'\n | 'nullable'\n | 'arrayBound'\n | 'arrayFlag'\n | 'comment'\n\nexport interface EplCol {\n key: EplColKey\n label: string\n}\n\n/** `nos` are the document-wide line numbers for each row (one per `rows` entry); the header row gets none. */\nconst props = defineProps<{ columns: EplCol[]; rows: EplVarRow[]; nos?: number[] }>()\n\nfunction rowNo(i: number): number {\n return props.nos?.[i] ?? i + 1\n}\n\nconst BOOL_KEYS = new Set<EplColKey>([\n 'public',\n 'static',\n 'byAddress',\n 'byReference',\n 'nullable',\n 'arrayFlag',\n])\n\nfunction isBool(key: EplColKey): boolean {\n return BOOL_KEYS.has(key)\n}\n\nfunction cell(row: EplVarRow, key: EplColKey): string {\n switch (key) {\n case 'name':\n return row.name\n case 'type':\n return row.type\n case 'public':\n return row.isPublic ? '✓' : ''\n case 'static':\n return row.isStatic ? '✓' : ''\n case 'byAddress':\n return row.byAddress ? '✓' : ''\n case 'byReference':\n return row.byReference ? '✓' : ''\n case 'nullable':\n return row.nullable ? '✓' : ''\n case 'arrayBound':\n return row.arrayBound\n case 'arrayFlag':\n return row.isArray ? '✓' : ''\n case 'comment':\n return row.comment\n }\n}\n\n/** Is this column an identifier-ish one (rendered in the IDE's blue link color)? */\nfunction isIdent(key: EplColKey): boolean {\n return key === 'name' || key === 'type'\n}\n</script>\n\n<template>\n <table class=\"vt\">\n <thead>\n <tr>\n <th class=\"vt__gut\" />\n <th\n v-for=\"col in columns\"\n :key=\"col.key\"\n :class=\"{ 'vt__th--bool': isBool(col.key), 'vt__th--cmt': col.key === 'comment' }\"\n >\n {{ col.label }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(row, i) in rows\" :key=\"i\">\n <td class=\"vt__gut\">{{ rowNo(i) }}</td>\n <td\n v-for=\"col in columns\"\n :key=\"col.key\"\n :class=\"{\n 'vt__td--bool': isBool(col.key),\n 'vt__td--ident': isIdent(col.key),\n 'vt__td--cmt': col.key === 'comment',\n }\"\n >\n {{ cell(row, col.key) }}\n </td>\n </tr>\n </tbody>\n </table>\n</template>\n\n<style scoped>\n.vt {\n border-collapse: collapse;\n font-size: 12.5px;\n margin: 2px 0 0;\n background: var(--epl-bg);\n table-layout: auto;\n}\n.vt th,\n.vt 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.vt th {\n background: var(--epl-th-bg);\n color: var(--epl-th-fg);\n font-weight: 600;\n}\n.vt__th--bool,\n.vt__td--bool {\n text-align: center;\n min-width: 2.6em;\n}\n.vt__td--bool {\n color: var(--epl-check);\n font-weight: 700;\n}\n.vt__td--ident {\n color: var(--epl-ident);\n}\n.vt__th--cmt,\n.vt__td--cmt {\n white-space: normal;\n}\n.vt__td--cmt {\n color: var(--epl-comment);\n}\nth.vt__gut,\ntd.vt__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":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EplVarTable.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/epl/EplVarTable.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { EplVarRow } from '@/lib/epl'\n\n/**\n * The 易语言 IDE renders every definition (参数 / 局部变量 / 成员 / 全局变量 / DLL 参数) as a bordered table\n * with a pale header row. This is the shared table: the caller picks the columns (label + which {@link EplVarRow}\n * field each maps to), so one component covers all the variation between parameter / variable / member tables.\n * Boolean columns (公开 / 静态 / 传址 / 参考 / 可空 / 数组) render a centered ✓.\n */\nexport type EplColKey =\n | 'name'\n | 'type'\n | 'public'\n | 'static'\n | 'byAddress'\n | 'byReference'\n | 'nullable'\n | 'arrayBound'\n | 'arrayFlag'\n | 'comment'\n\nexport interface EplCol {\n key: EplColKey\n label: string\n}\n\n/** `nos` are the document-wide line numbers for each row (one per `rows` entry); the header row gets none. */\nconst props = defineProps<{ columns: EplCol[]; rows: EplVarRow[]; nos?: number[] }>()\n\nfunction rowNo(i: number): number {\n return props.nos?.[i] ?? i + 1\n}\n\nconst BOOL_KEYS = new Set<EplColKey>([\n 'public',\n 'static',\n 'byAddress',\n 'byReference',\n 'nullable',\n 'arrayFlag',\n])\n\nfunction isBool(key: EplColKey): boolean {\n return BOOL_KEYS.has(key)\n}\n\nfunction cell(row: EplVarRow, key: EplColKey): string {\n switch (key) {\n case 'name':\n return row.name\n case 'type':\n return row.type\n case 'public':\n return row.isPublic ? '✓' : ''\n case 'static':\n return row.isStatic ? '✓' : ''\n case 'byAddress':\n return row.byAddress ? '✓' : ''\n case 'byReference':\n return row.byReference ? '✓' : ''\n case 'nullable':\n return row.nullable ? '✓' : ''\n case 'arrayBound':\n return row.arrayBound\n case 'arrayFlag':\n return row.isArray ? '✓' : ''\n case 'comment':\n return row.comment\n }\n}\n\n/** Is this column an identifier-ish one (rendered in the IDE's blue link color)? */\nfunction isIdent(key: EplColKey): boolean {\n return key === 'name' || key === 'type'\n}\n</script>\n\n<template>\n <table class=\"vt\">\n <thead>\n <tr>\n <th class=\"vt__gut\" />\n <th\n v-for=\"col in columns\"\n :key=\"col.key\"\n :class=\"{ 'vt__th--bool': isBool(col.key), 'vt__th--cmt': col.key === 'comment' }\"\n >\n {{ col.label }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(row, i) in rows\" :key=\"i\">\n <td class=\"vt__gut\">{{ rowNo(i) }}</td>\n <td\n v-for=\"col in columns\"\n :key=\"col.key\"\n :class=\"{\n 'vt__td--bool': isBool(col.key),\n 'vt__td--ident': isIdent(col.key),\n 'vt__td--cmt': col.key === 'comment',\n }\"\n >\n {{ cell(row, col.key) }}\n </td>\n </tr>\n </tbody>\n </table>\n</template>\n\n<style scoped>\n.vt {\n border-collapse: collapse;\n font-size: 12.5px;\n margin: 2px 0 0;\n background: var(--epl-bg);\n table-layout: auto;\n}\n.vt th,\n.vt 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.vt th {\n background: var(--epl-th-bg);\n color: var(--epl-th-fg);\n font-weight: 600;\n}\n.vt__th--bool,\n.vt__td--bool {\n text-align: center;\n min-width: 2.6em;\n}\n.vt__td--bool {\n color: var(--epl-check);\n font-weight: 700;\n}\n.vt__td--ident {\n color: var(--epl-ident);\n}\n.vt__th--cmt,\n.vt__td--cmt {\n white-space: normal;\n}\n.vt__td--cmt {\n color: var(--epl-comment);\n}\nth.vt__gut,\ntd.vt__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":";;;;;;;;;;EA2BA,IAAM,IAAQ;EAEd,SAAS,EAAM,GAAmB;GAChC,OAAO,EAAM,MAAM,MAAM,IAAI;EAC/B;EAEA,IAAM,IAAY,IAAI,IAAe;GACnC;GACA;GACA;GACA;GACA;GACA;EACF,CAAC;EAED,SAAS,EAAO,GAAyB;GACvC,OAAO,EAAU,IAAI,CAAG;EAC1B;EAEA,SAAS,EAAK,GAAgB,GAAwB;GACpD,QAAQ,GAAR;IACE,KAAK,QACH,OAAO,EAAI;IACb,KAAK,QACH,OAAO,EAAI;IACb,KAAK,UACH,OAAO,EAAI,WAAW,MAAM;IAC9B,KAAK,UACH,OAAO,EAAI,WAAW,MAAM;IAC9B,KAAK,aACH,OAAO,EAAI,YAAY,MAAM;IAC/B,KAAK,eACH,OAAO,EAAI,cAAc,MAAM;IACjC,KAAK,YACH,OAAO,EAAI,WAAW,MAAM;IAC9B,KAAK,cACH,OAAO,EAAI;IACb,KAAK,aACH,OAAO,EAAI,UAAU,MAAM;IAC7B,KAAK,WACH,OAAO,EAAI;GACf;EACF;EAGA,SAAS,EAAQ,GAAyB;GACxC,OAAO,MAAQ,UAAU,MAAQ;EACnC;yBAIE,EA6BQ,SA7BR,GA6BQ,CA5BN,EAWQ,SAAA,MAAA,CAVN,EASK,MAAA,MAAA,CAAA,AAAA,EAAA,OARH,EAAsB,MAAA,EAAlB,OAAM,UAAS,GAAA,MAAA,EAAA,IAAA,EAAA,EAAA,GACnB,EAMK,GAAA,MAAA,EALW,EAAA,UAAP,YADT,EAMK,MAAA;GAJF,KAAK,EAAI;GACT,OAAK,EAAA;IAAA,gBAAoB,EAAO,EAAI,GAAG;IAAA,eAAkB,EAAI,QAAG;GAAA,CAAA;OAE9D,EAAI,KAAK,GAAA,CAAA,gBAIlB,EAeQ,SAAA,MAAA,EAAA,EAAA,EAAA,GAdN,EAaK,GAAA,MAAA,EAbkB,EAAA,OAAX,GAAK,YAAjB,EAaK,MAAA,EAbyB,KAAK,EAAC,GAAA,CAClC,EAAuC,MAAvC,GAAuC,EAAhB,EAAM,CAAC,CAAA,GAAA,CAAA,IAAA,EAAA,EAAA,GAC9B,EAUK,GAAA,MAAA,EATW,EAAA,UAAP,YADT,EAUK,MAAA;GARF,KAAK,EAAI;GACT,OAAK,EAAA;oBAAgC,EAAO,EAAI,GAAG;qBAAgC,EAAQ,EAAI,GAAG;mBAA8B,EAAI,QAAG;;OAMrI,EAAK,GAAK,EAAI,GAAG,CAAA,GAAA,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"numbering.js","names":[],"sources":["../../../src/components/epl/numbering.ts"],"sourcesContent":["/**\n * Document-wide line numbering for the IDE-style viewer. The 易语言 source view puts a single continuous\n * line-number gutter down the whole document: every *body* row (the 程序集/类 row, each 子程序 / 参数 / 局部 /\n * 成员 / 全局 row, and every code line — blanks included) takes the next number, while column-header rows do\n * not. So numbering can't live inside one table or one method; it threads through the active document here, and\n * the components just render the numbers they're handed.\n */\n\n/** Per-method numbers: the 子程序名 header row, then parameter / local-variable rows, then code lines.\n * A code entry is `null` for a row that takes no number (a hidden control-flow terminator). */\nexport interface MethodNos {\n head: number\n params: number[]\n locals: number[]\n code: (number | null)[]\n}\n\n/** A running 1-based counter that hands out single numbers or contiguous runs in document order. */\nexport class LineCounter {\n private n = 1\n next(): number {\n return this.n++\n }\n take(count: number): number[] {\n const out: number[] = []\n for (let i = 0; i < count; i++) out.push(this.n++)\n return out\n }\n}\n"],"mappings":";AAkBA,IAAa,IAAb,MAAyB;CACvB,IAAY;CACZ,OAAe;EACb,OAAO,KAAK;CACd;CACA,KAAK,GAAyB;EAC5B,IAAM,IAAgB,CAAC;EACvB,KAAK,IAAI,IAAI,GAAG,IAAI,GAAO,KAAK,EAAI,KAAK,KAAK,GAAG;EACjD,OAAO;CACT;AACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Icon.js","names":[],"sources":["../../../src/components/icons/Icon.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { STROKE_ICONS, type StrokeIconName } from './iconPaths'\n\n/** Outline icon (viewBox 24, stroke currentColor). Pass a known `name` or raw `path`. */\nconst props = withDefaults(\n defineProps<{\n name?: StrokeIconName\n path?: string\n size?: number\n strokeWidth?: number\n }>(),\n { size: 15, strokeWidth: 1.8 },\n)\n\nconst inner = computed(() => props.path ?? (props.name ? STROKE_ICONS[props.name] : ''))\n</script>\n\n<template>\n <span class=\"dc-icon\">\n <svg\n :width=\"size\"\n :height=\"size\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n :stroke-width=\"strokeWidth\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n v-html=\"inner\"\n />\n </span>\n</template>\n\n<style scoped>\n.dc-icon {\n display: inline-flex;\n line-height: 0;\n}\n</style>\n"],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Icon.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/icons/Icon.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed } from 'vue'\nimport { STROKE_ICONS, type StrokeIconName } from './iconPaths'\n\n/** Outline icon (viewBox 24, stroke currentColor). Pass a known `name` or raw `path`. */\nconst props = withDefaults(\n defineProps<{\n name?: StrokeIconName\n path?: string\n size?: number\n strokeWidth?: number\n }>(),\n { size: 15, strokeWidth: 1.8 },\n)\n\nconst inner = computed(() => props.path ?? (props.name ? STROKE_ICONS[props.name] : ''))\n</script>\n\n<template>\n <span class=\"dc-icon\">\n <svg\n :width=\"size\"\n :height=\"size\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n :stroke-width=\"strokeWidth\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n v-html=\"inner\"\n />\n </span>\n</template>\n\n<style scoped>\n.dc-icon {\n display: inline-flex;\n line-height: 0;\n}\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;EAKA,IAAM,IAAQ,GAUR,IAAQ,QAAe,EAAM,SAAS,EAAM,OAAO,EAAa,EAAM,QAAQ,GAAG;yBAIrF,EAYO,QAZP,GAYO,EAAA,EAAA,GAXL,EAUE,OAAA;GATC,OAAO,EAAA;GACP,QAAQ,EAAA;GACT,SAAQ;GACR,MAAK;GACL,QAAO;GACN,gBAAc,EAAA;GACf,kBAAe;GACf,mBAAgB;GAChB,WAAQ,EAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iconPaths.js","names":[],"sources":["../../../src/components/icons/iconPaths.ts"],"sourcesContent":["/**\n * Centralized SVG path data, lifted from the inline SVGs scattered through the\n * original viewer. Two families:\n * - FILL_ICONS: filled glyphs, viewBox 0 0 20 20, fill currentColor (old icoF / ICONS)\n * - STROKE_ICONS: outline glyphs, viewBox 0 0 24 24, stroke currentColor (old ico)\n */\n\nexport const FILL_ICONS = {\n thinking:\n '<path d=\"M10.386 2.51A7.5 7.5 0 1 1 2.5 10a.5.5 0 0 1 1 0 6.5 6.5 0 1 0 6.835-6.491L10 3.5l-.1-.01a.5.5 0 0 1 .1-.99zM10 5.5a.5.5 0 0 1 .5.5v3.69l2.724 1.363a.5.5 0 0 1-.353.93l-.095-.036-3-1.5A.5.5 0 0 1 9.5 10V6a.5.5 0 0 1 .5-.5M3.662 6.941a.661.661 0 1 1 0 1.323.661.661 0 0 1 0-1.323m1.294-2.647a.662.662 0 1 1-.001 1.323.662.662 0 0 1 .001-1.323M7.603 3a.662.662 0 1 1-.001 1.325.662.662 0 0 1 0-1.325\"/>',\n bash: '<path fill-rule=\"evenodd\" d=\"M3.5 4A1.5 1.5 0 0 0 2 5.5v9A1.5 1.5 0 0 0 3.5 16h13a1.5 1.5 0 0 0 1.5-1.5v-9A1.5 1.5 0 0 0 16.5 4zm0 1.2h13a.3.3 0 0 1 .3.3v9a.3.3 0 0 1-.3.3h-13a.3.3 0 0 1-.3-.3v-9a.3.3 0 0 1 .3-.3z\" clip-rule=\"evenodd\"/><path d=\"M5.3 7.2a.6.6 0 0 1 .85 0l2.1 2.1a.6.6 0 0 1 0 .85l-2.1 2.1a.6.6 0 1 1-.85-.85L6.99 9.7 5.3 8.05a.6.6 0 0 1 0-.85M9.6 11.6a.6.6 0 0 0 0 1.2h3.6a.6.6 0 0 0 0-1.2z\"/>',\n skill:\n '<path d=\"M13.04 7.304a.5.5 0 0 1 .92.392C13.665 8.386 13.089 9 12.3 9c-.487 0-.892-.234-1.2-.574-.309.34-.713.574-1.2.574-.486 0-.892-.234-1.2-.574-.31.34-.714.574-1.2.574a.5.5 0 0 1 0-1c.212 0 .52-.18.74-.696a.5.5 0 0 1 .92 0c.221.516.528.696.74.696.213 0 .52-.18.74-.696l.035-.067a.5.5 0 0 1 .885.067c.22.516.527.696.74.696s.519-.18.74-.696\"/><path fill-rule=\"evenodd\" d=\"M14 3a2 2 0 0 1 2 2v8h1.5a.5.5 0 0 1 .5.5V15a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V4H4a1 1 0 0 0-.745 1.667.5.5 0 0 1-.745.666A2 2 0 0 1 4 3zM6 15a1 1 0 1 0 2 0v-1.5a.5.5 0 0 1 .5-.5H15V5a1 1 0 0 0-1-1H6zm3 0c0 .365-.1.706-.27 1H16a1 1 0 0 0 1-1v-1H9z\" clip-rule=\"evenodd\"/>',\n edit: '<path d=\"M14.3 2.7a2.05 2.05 0 0 1 2.9 2.9l-.79.79-2.9-2.9zM12.79 4.21l2.9 2.9-7.86 7.86a1 1 0 0 1-.43.25l-3.2.9a.5.5 0 0 1-.62-.62l.9-3.2a1 1 0 0 1 .25-.43z\"/>',\n file: '<path fill-rule=\"evenodd\" d=\"M5.5 2.5A1.5 1.5 0 0 0 4 4v12a1.5 1.5 0 0 0 1.5 1.5h9A1.5 1.5 0 0 0 16 16V7.62a1.5 1.5 0 0 0-.44-1.06l-3.12-3.12a1.5 1.5 0 0 0-1.06-.44zm6 1.96 2.54 2.54H12a.5.5 0 0 1-.5-.5z\" clip-rule=\"evenodd\"/>',\n check:\n '<path d=\"M16.74 5.8a1 1 0 0 1 .04 1.41l-7.02 7.32a1 1 0 0 1-1.45.01l-3-3.13a1 1 0 1 1 1.44-1.38l2.28 2.37 6.3-6.56a1 1 0 0 1 1.41-.04z\"/>',\n tool: '<circle cx=\"10\" cy=\"10\" r=\"3\"/>',\n // \"Search past conversations\" (conversation_search / \"memory\"): a chat squiggle inside a refresh ring.\n // Used on the conversation_search timeline rail (see ChatSearchStep).\n conversation:\n '<path d=\"M13.29 8.804a.5.5 0 0 1 .92.392c-.36.84-1.046 1.554-1.96 1.554-.613 0-1.122-.321-1.5-.785-.378.464-.887.785-1.5.785s-1.122-.321-1.5-.785c-.378.464-.887.785-1.5.785a.5.5 0 0 1 0-1c.338 0 .755-.28 1.04-.946l.034-.067a.5.5 0 0 1 .886.067l.112.231c.276.5.632.715.928.715.338 0 .755-.28 1.04-.946l.034-.067a.5.5 0 0 1 .886.067l.112.231c.276.5.633.715.928.715.338 0 .755-.28 1.04-.946\"/><path d=\"M17.5 9.5A7.5 7.5 0 0 0 2.516 9c-.018.275.208.5.484.5a.53.53 0 0 0 .519-.5A6.5 6.5 0 1 1 10 16l-5.855.004.828-.834a.497.497 0 0 0-.706-.701l-1.576 1.584a.656.656 0 0 0 0 .926l1.542 1.55a.51.51 0 1 0 .722-.723l-.81-.802L10 17a7.5 7.5 0 0 0 7.5-7.5\"/>',\n // \"Open in new\" — a window with a diagonal arrow out the top-right. Used by web_fetch rich links.\n external:\n '<path d=\"M9.5 3a.5.5 0 0 1 0 1h-5a.5.5 0 0 0-.5.5v11a.5.5 0 0 0 .5.5h11a.5.5 0 0 0 .5-.5v-5a.5.5 0 0 1 1 0v5a1.5 1.5 0 0 1-1.5 1.5h-11A1.5 1.5 0 0 1 3 15.5v-11A1.5 1.5 0 0 1 4.5 3zm7 0a.5.5 0 0 1 .18.034l.021.01q.03.014.059.03l.023.014a.5.5 0 0 1 .07.058l.065.079q.015.025.026.052l.018.034a.5.5 0 0 1 .032.128Q17 3.47 17 3.5v4a.5.5 0 0 1-1 0V4.707l-4.146 4.147a.5.5 0 1 1-.707-.708L15.293 4H12.5a.5.5 0 0 1 0-1z\"/>',\n} as const\n\nexport type IconKey = keyof typeof FILL_ICONS\n\nexport const STROKE_ICONS = {\n copy: '<rect x=\"9\" y=\"9\" width=\"11\" height=\"11\" rx=\"2\"/><path d=\"M5 15V5a2 2 0 0 1 2-2h10\"/>',\n fileOutline:\n '<path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/><path d=\"M14 2v6h6\"/>',\n arrowLeft: '<path d=\"M19 12H5\"/><path d=\"M12 19l-7-7 7-7\"/>',\n logout:\n '<path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\"/><path d=\"M16 17l5-5-5-5\"/><path d=\"M21 12H9\"/>',\n download:\n '<path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"/><path d=\"M7 10l5 5 5-5\"/><path d=\"M12 15V3\"/>',\n close: '<path d=\"M18 6 6 18\"/><path d=\"M6 6l12 12\"/>',\n eye: '<path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\"/><circle cx=\"12\" cy=\"12\" r=\"3.5\"/>',\n code: '<path d=\"M16 18l6-6-6-6\"/><path d=\"M8 6l-6 6 6 6\"/>',\n globe:\n '<circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M3 12h18M12 3c2.5 2.6 2.5 15.4 0 18M12 3c-2.5 2.6-2.5 15.4 0 18\"/>',\n link: '<path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"/>',\n chevronRight: '<path d=\"M9 6l6 6-6 6\"/>',\n chevronLeft: '<path d=\"M15 6l-6 6 6 6\"/>',\n chevronDown: '<path d=\"M6 9l6 6 6-6\"/>',\n // Speech bubble — one past chat in a conversation_search result list (ChatSearchStep rows).\n chat: '<path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"/>',\n folder:\n '<path d=\"M3 7a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.7.9l.8 1.1H19a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\"/>',\n archive:\n '<rect x=\"3\" y=\"4\" width=\"18\" height=\"4\" rx=\"1\"/><path d=\"M5 8v11a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V8\"/><path d=\"M10 12h4\"/>',\n image:\n '<rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/><circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\"/><path d=\"M21 15l-5-5L5 21\"/>',\n play: '<circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M10 8.5l5 3.5-5 3.5z\"/>',\n music: '<path d=\"M9 18V5l12-2v13\"/><circle cx=\"6\" cy=\"18\" r=\"3\"/><circle cx=\"18\" cy=\"16\" r=\"3\"/>',\n arrowDown: '<path d=\"M12 5v14\"/><path d=\"M5 12l7 7 7-7\"/>',\n arrowUp: '<path d=\"M12 19V5\"/><path d=\"M5 12l7-7 7 7\"/>',\n chart:\n '<path d=\"M3 3v18h18\"/><rect x=\"7\" y=\"11\" width=\"3\" height=\"6\"/><rect x=\"13\" y=\"7\" width=\"3\" height=\"10\"/>',\n pot: '<path d=\"M2 12h20\"/><path d=\"M20 12v7a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2v-7\"/><path d=\"m4 8 16-4\"/><path d=\"m8.9 6.8-.5-1.8a2 2 0 0 1 1.5-2.4l1.9-.5a2 2 0 0 1 2.4 1.5l.5 1.8\"/>',\n clock: '<circle cx=\"12\" cy=\"12\" r=\"9\"/><path d=\"M12 7v5l3 2\"/>',\n info: '<circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"M12 16v-4\"/><path d=\"M12 8h.01\"/>',\n retry: '<path d=\"M21 12a9 9 0 1 1-2.64-6.36M21 4v5h-5\"/>',\n thumb:\n '<path d=\"M7 10v11M7 10l4-7a2 2 0 0 1 2.6 2.6L12 10h5.6a2 2 0 0 1 2 2.4l-1.3 6A2 2 0 0 1 16.3 21H7\"/>',\n help: '<circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"M9.1 9a3 3 0 0 1 5.8 1c0 2-3 3-3 3\"/><path d=\"M12 17h.01\"/>',\n key: '<circle cx=\"7.5\" cy=\"15.5\" r=\"5.5\"/><path d=\"m11.4 11.6 9.6-9.6\"/><path d=\"m15.5 7.5 3 3L22 7l-3-3\"/>',\n users:\n '<path d=\"M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2\"/><circle cx=\"9\" cy=\"7\" r=\"4\"/><path d=\"M23 21v-2a4 4 0 0 0-3-3.87\"/><path d=\"M16 3.13a4 4 0 0 1 0 7.75\"/>',\n plus: '<path d=\"M12 5v14\"/><path d=\"M5 12h14\"/>',\n check: '<path d=\"M20 6 9 17l-5-5\"/>',\n trash:\n '<path d=\"M3 6h18\"/><path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\"/><path d=\"M10 11v6\"/><path d=\"M14 11v6\"/>',\n // Four corner brackets — \"expand to full screen\" (used by the HTML preview's in-app fullscreen overlay).\n maximize:\n '<path d=\"M8 3H5a2 2 0 0 0-2 2v3\"/><path d=\"M21 8V5a2 2 0 0 0-2-2h-3\"/><path d=\"M3 16v3a2 2 0 0 0 2 2h3\"/><path d=\"M16 21h3a2 2 0 0 0 2-2v-3\"/>',\n // Paperclip — \"this conversation has attached files\" (the listing's file marker).\n paperclip:\n '<path d=\"M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48\"/>',\n // Stacked documents — \"open this conversation's associated-file list\" (the detail page's top-right button).\n files:\n '<path d=\"M20 7h-3a2 2 0 0 1-2-2V2\"/><path d=\"M9 18a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h7l4 4v10a2 2 0 0 1-2 2Z\"/><path d=\"M3 7.6v12.8A1.6 1.6 0 0 0 4.6 22h9.8\"/>',\n // Target/crosshair — \"locate this file in the conversation\" (the file panel's jump cue).\n locate: '<circle cx=\"12\" cy=\"12\" r=\"3\"/><path d=\"M12 2v4M12 18v4M2 12h4M18 12h4\"/>',\n // Byte grid in a frame — \"view raw bytes / hex dump\" (the unpreviewable-file \"open with\" hex chooser).\n hex: '<rect x=\"3\" y=\"5\" width=\"18\" height=\"14\" rx=\"2\"/><path d=\"M7 9h.01M11 9h.01M15 9h.01M7 13h.01M11 13h.01M15 13h.01\"/>',\n // Four tiles — \"open with / choose a viewer\" (the file panel's universal formatter menu trigger).\n apps: '<rect x=\"3\" y=\"3\" width=\"7\" height=\"7\" rx=\"1.5\"/><rect x=\"14\" y=\"3\" width=\"7\" height=\"7\" rx=\"1.5\"/><rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" rx=\"1.5\"/><rect x=\"14\" y=\"14\" width=\"7\" height=\"7\" rx=\"1.5\"/>',\n} as const\n\nexport type StrokeIconName = keyof typeof STROKE_ICONS\n"],"mappings":";AAOA,IAAa,IAAa;CACxB,UACE;CACF,MAAM;CACN,OACE;CACF,MAAM;CACN,MAAM;CACN,OACE;CACF,MAAM;CAGN,cACE;CAEF,UACE;AACJ,GAIa,IAAe;CAC1B,MAAM;CACN,aACE;CACF,WAAW;CACX,QACE;CACF,UACE;CACF,OAAO;CACP,KAAK;CACL,MAAM;CACN,OACE;CACF,MAAM;CACN,cAAc;CACd,aAAa;CACb,aAAa;CAEb,MAAM;CACN,QACE;CACF,SACE;CACF,OACE;CACF,MAAM;CACN,OAAO;CACP,WAAW;CACX,SAAS;CACT,OACE;CACF,KAAK;CACL,OAAO;CACP,MAAM;CACN,OAAO;CACP,OACE;CACF,MAAM;CACN,KAAK;CACL,OACE;CACF,MAAM;CACN,OAAO;CACP,OACE;CAEF,UACE;CAEF,WACE;CAEF,OACE;CAEF,QAAQ;CAER,KAAK;CAEL,MAAM;AACR"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optionalViewer.js","names":[],"sources":["../../src/components/optionalViewer.ts"],"sourcesContent":["import { defineAsyncComponent, defineComponent, h, type Component } from 'vue'\nimport MissingDependency from '@/components/MissingDependency.vue'\n\n/**\n * Wrap a heavy viewer's async loader so that, when its OPTIONAL peer dependency isn't installed in the\n * consumer's app, the chunk-load failure shows a {@link MissingDependency} card (\"npm i <pkg>\") instead of a\n * blank error (see docs/file-viewer-package-design.md §4). The dep is `external` in the library build, so a\n * viewer that statically imports it fails to evaluate its chunk when the dep is absent — which lands here.\n *\n * The error component receives the SAME props the viewer was given (`url`/`name`/`size`), so the card can keep\n * the file downloadable. Only for viewers whose dep is imported STATICALLY (pdf/docx/xlsx/pptx/sqlite/model/\n * dicom); viewers that import their engine dynamically at runtime (geo/raster/ebook) handle absence themselves.\n */\nexport function optionalViewer(\n loader: () => Promise<Component | { default: Component }>,\n deps: string | string[],\n label: string,\n): Component {\n const pkg = Array.isArray(deps) ? deps : [deps]\n return defineAsyncComponent({\n loader: loader as () => Promise<Component>,\n errorComponent: defineComponent({\n name: 'ViewerDependencyMissing',\n props: {\n url: { type: String, default: '' },\n name: { type: String, default: '' },\n size: { type: Number, default: undefined },\n },\n setup: (props) => () =>\n h(MissingDependency, {\n pkg,\n label,\n downloadUrl: props.url,\n downloadName: props.name,\n }),\n }),\n // Any failure to load this viewer's chunk → show the \"install <pkg>\" card (the dominant cause for a\n // published package is a missing optional dep). Don't retry.\n onError(_error, _retry, fail) {\n fail()\n },\n })\n}\n"],"mappings":";;;AAaA,SAAgB,EACd,GACA,GACA,GACW;CACX,IAAM,IAAM,MAAM,QAAQ,CAAI,IAAI,IAAO,CAAC,CAAI;CAC9C,OAAO,EAAqB;EAClB;EACR,gBAAgB,EAAgB;GAC9B,MAAM;GACN,OAAO;IACL,KAAK;KAAE,MAAM;KAAQ,SAAS;IAAG;IACjC,MAAM;KAAE,MAAM;KAAQ,SAAS;IAAG;IAClC,MAAM;KAAE,MAAM;KAAQ,SAAS,KAAA;IAAU;GAC3C;GACA,QAAQ,YACN,EAAE,GAAmB;IACnB;IACA;IACA,aAAa,EAAM;IACnB,cAAc,EAAM;GACtB,CAAC;EACL,CAAC;EAGD,QAAQ,GAAQ,GAAQ,GAAM;GAC5B,EAAK;EACP;CACF,CAAC;AACH"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClampBlock.js","names":[],"sources":["../../../src/components/ui/ClampBlock.ts"],"sourcesContent":["import { computed, defineComponent, h, onBeforeUnmount, onMounted, ref, type VNode } from 'vue'\n\n/**\n * Clamp tall content to a collapsed height with a Show more / Show less toggle —\n * claude.ai's long-block behavior. When collapsed and overflowing, the bottom\n * fades into `fade` (a soft shadow cue that more lies below). The toggle is a\n * plain-text link hidden until you hover the block (the fade), brightening when\n * you hover the text itself. Content that fits renders untouched: no clip, no\n * fade, no toggle.\n *\n * A render function (not an SFC) on purpose: a compiled `<slot/>` trips the\n * server renderer in the SSR smoke harness (renderSlot → null instance), so we\n * invoke the slot directly. Styling lives in assets/styles/clamp.css.\n */\nexport default defineComponent({\n name: 'ClampBlock',\n props: {\n /** Collapsed height cap, in px. */\n maxHeight: { type: Number, default: 360 },\n /** Color the bottom gradient fades to — match the content's own background. */\n fade: { type: String, default: 'var(--bg)' },\n /** Px of overflow tolerated before the toggle appears (avoids clamping near-fits). */\n slack: { type: Number, default: 28 },\n /** Left inset of the toggle, in px — align it with padded content (e.g. a code block). */\n inset: { type: Number, default: 0 },\n moreLabel: { type: String, default: 'Show more' },\n lessLabel: { type: String, default: 'Show less' },\n },\n setup(props, { slots }) {\n const open = ref(false)\n const overflowing = ref(false)\n const content = ref<HTMLElement | null>(null)\n let ro: ResizeObserver | undefined\n\n const measure = () => {\n const el = content.value\n if (el) overflowing.value = el.scrollHeight > props.maxHeight + props.slack\n }\n\n onMounted(() => {\n measure()\n // Re-measure as fonts/highlighting/images settle or the pane is resized.\n if (typeof ResizeObserver !== 'undefined') {\n ro = new ResizeObserver(measure)\n if (content.value) ro.observe(content.value)\n }\n })\n onBeforeUnmount(() => ro?.disconnect())\n\n const collapsed = computed(() => overflowing.value && !open.value)\n\n return () => {\n const kids: VNode[] = [\n h(\n 'div',\n {\n ref: content,\n class: ['clamp__content', { 'clamp__content--clip': collapsed.value }],\n style: collapsed.value ? { maxHeight: props.maxHeight + 'px' } : undefined,\n },\n slots.default?.(),\n ),\n ]\n\n if (collapsed.value) {\n kids.push(\n h('div', {\n class: 'clamp__fade',\n 'aria-hidden': 'true',\n style: { backgroundImage: `linear-gradient(to bottom, transparent, ${props.fade})` },\n }),\n )\n }\n\n if (overflowing.value) {\n kids.push(\n h(\n 'div',\n {\n class: ['clamp__toggle', { 'clamp__toggle--float': collapsed.value }],\n style: props.inset ? { paddingLeft: props.inset + 'px' } : undefined,\n },\n h(\n 'button',\n {\n type: 'button',\n class: 'clamp__btn',\n 'aria-expanded': open.value,\n onClick: () => (open.value = !open.value),\n },\n open.value ? props.lessLabel : props.moreLabel,\n ),\n ),\n )\n }\n\n return h('div', { class: 'clamp' }, kids)\n }\n },\n})\n"],"mappings":";;AAcA,IAAA,IAAe,EAAgB;CAC7B,MAAM;CACN,OAAO;EAEL,WAAW;GAAE,MAAM;GAAQ,SAAS;EAAI;EAExC,MAAM;GAAE,MAAM;GAAQ,SAAS;EAAY;EAE3C,OAAO;GAAE,MAAM;GAAQ,SAAS;EAAG;EAEnC,OAAO;GAAE,MAAM;GAAQ,SAAS;EAAE;EAClC,WAAW;GAAE,MAAM;GAAQ,SAAS;EAAY;EAChD,WAAW;GAAE,MAAM;GAAQ,SAAS;EAAY;CAClD;CACA,MAAM,GAAO,EAAE,YAAS;EACtB,IAAM,IAAO,EAAI,EAAK,GAChB,IAAc,EAAI,EAAK,GACvB,IAAU,EAAwB,IAAI,GACxC,GAEE,UAAgB;GACpB,IAAM,IAAK,EAAQ;GACnB,AAAI,MAAI,EAAY,QAAQ,EAAG,eAAe,EAAM,YAAY,EAAM;EACxE;EAUA,AARA,QAAgB;GAGd,AAFA,EAAQ,GAEJ,OAAO,iBAAmB,QAC5B,IAAK,IAAI,eAAe,CAAO,GAC3B,EAAQ,SAAO,EAAG,QAAQ,EAAQ,KAAK;EAE/C,CAAC,GACD,QAAsB,GAAI,WAAW,CAAC;EAEtC,IAAM,IAAY,QAAe,EAAY,SAAS,CAAC,EAAK,KAAK;EAEjE,aAAa;GACX,IAAM,IAAgB,CACpB,EACE,OACA;IACE,KAAK;IACL,OAAO,CAAC,kBAAkB,EAAE,wBAAwB,EAAU,MAAM,CAAC;IACrE,OAAO,EAAU,QAAQ,EAAE,WAAW,EAAM,YAAY,KAAK,IAAI,KAAA;GACnE,GACA,EAAM,UAAU,CAClB,CACF;GAkCA,OAhCI,EAAU,SACZ,EAAK,KACH,EAAE,OAAO;IACP,OAAO;IACP,eAAe;IACf,OAAO,EAAE,iBAAiB,2CAA2C,EAAM,KAAK,GAAG;GACrF,CAAC,CACH,GAGE,EAAY,SACd,EAAK,KACH,EACE,OACA;IACE,OAAO,CAAC,iBAAiB,EAAE,wBAAwB,EAAU,MAAM,CAAC;IACpE,OAAO,EAAM,QAAQ,EAAE,aAAa,EAAM,QAAQ,KAAK,IAAI,KAAA;GAC7D,GACA,EACE,UACA;IACE,MAAM;IACN,OAAO;IACP,iBAAiB,EAAK;IACtB,eAAgB,EAAK,QAAQ,CAAC,EAAK;GACrC,GACA,EAAK,QAAQ,EAAM,YAAY,EAAM,SACvC,CACF,CACF,GAGK,EAAE,OAAO,EAAE,OAAO,QAAQ,GAAG,CAAI;EAC1C;CACF;AACF,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type ShallowRef } from 'vue';
|
|
2
|
+
export interface ElementNavigationItem {
|
|
3
|
+
id: string;
|
|
4
|
+
title: string;
|
|
5
|
+
level: number;
|
|
6
|
+
target: HTMLElement;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Scroll-spy + in-container navigation for DOM-backed document viewers.
|
|
10
|
+
*
|
|
11
|
+
* The rendered document remains the only source of scroll state. Navigation entries retain their target
|
|
12
|
+
* elements, while this composable exposes readonly-by-convention refs and explicit mutation actions.
|
|
13
|
+
*/
|
|
14
|
+
export declare function useElementNavigation(scrollRoot: Readonly<ShallowRef<HTMLElement | null>>): {
|
|
15
|
+
outlineItems: ShallowRef<ElementNavigationItem[], ElementNavigationItem[]>;
|
|
16
|
+
pageItems: ShallowRef<ElementNavigationItem[], ElementNavigationItem[]>;
|
|
17
|
+
activeOutlineId: ShallowRef<string, string>;
|
|
18
|
+
activePageId: ShallowRef<string, string>;
|
|
19
|
+
setItems: (outline: readonly ElementNavigationItem[], pages: readonly ElementNavigationItem[]) => void;
|
|
20
|
+
navigate: (item: ElementNavigationItem) => void;
|
|
21
|
+
};
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { onBeforeUnmount as e, shallowRef as t, watch as n } from "vue";
|
|
2
|
+
//#region src/composables/useElementNavigation.ts
|
|
3
|
+
function r(r) {
|
|
4
|
+
let i = t([]), a = t([]), o = t(""), s = t(""), c = 0, l = null;
|
|
5
|
+
function u(e, t) {
|
|
6
|
+
if (!e.length) return;
|
|
7
|
+
let n = e[0];
|
|
8
|
+
for (let r of e) {
|
|
9
|
+
if (r.target.getBoundingClientRect().top > t) break;
|
|
10
|
+
n = r;
|
|
11
|
+
}
|
|
12
|
+
return n;
|
|
13
|
+
}
|
|
14
|
+
function d() {
|
|
15
|
+
c = 0;
|
|
16
|
+
let e = r.value;
|
|
17
|
+
if (!e) return;
|
|
18
|
+
let t = e.getBoundingClientRect().top + 32;
|
|
19
|
+
o.value = u(i.value, t)?.id ?? "", s.value = u(a.value, t)?.id ?? "";
|
|
20
|
+
}
|
|
21
|
+
function f() {
|
|
22
|
+
if (!c) {
|
|
23
|
+
if (typeof requestAnimationFrame > "u") {
|
|
24
|
+
d();
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
c = requestAnimationFrame(d);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function p(e) {
|
|
31
|
+
l?.removeEventListener("scroll", f), l = e, l?.addEventListener("scroll", f, { passive: !0 }), f();
|
|
32
|
+
}
|
|
33
|
+
let m = n(r, p, {
|
|
34
|
+
immediate: !0,
|
|
35
|
+
flush: "post"
|
|
36
|
+
});
|
|
37
|
+
function h(e, t) {
|
|
38
|
+
i.value = [...e], a.value = [...t], o.value = e[0]?.id ?? "", s.value = t[0]?.id ?? "", f();
|
|
39
|
+
}
|
|
40
|
+
function g(e) {
|
|
41
|
+
let t = r.value;
|
|
42
|
+
if (!t) return;
|
|
43
|
+
let n = t.getBoundingClientRect().top, i = e.target.getBoundingClientRect().top;
|
|
44
|
+
t.scrollTo({
|
|
45
|
+
top: t.scrollTop + i - n - 18,
|
|
46
|
+
behavior: "smooth"
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
return e(() => {
|
|
50
|
+
m(), l?.removeEventListener("scroll", f), c && typeof cancelAnimationFrame < "u" && cancelAnimationFrame(c);
|
|
51
|
+
}), {
|
|
52
|
+
outlineItems: i,
|
|
53
|
+
pageItems: a,
|
|
54
|
+
activeOutlineId: o,
|
|
55
|
+
activePageId: s,
|
|
56
|
+
setItems: h,
|
|
57
|
+
navigate: g
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
//#endregion
|
|
61
|
+
export { r as useElementNavigation };
|
|
62
|
+
|
|
63
|
+
//# sourceMappingURL=useElementNavigation.js.map
|