omni-viewer-core 0.1.0
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/LICENSE +21 -0
- package/README.md +80 -0
- package/THIRD_PARTY_NOTICES.md +49 -0
- package/dist/assets/audio-engine/audio_engine.mjs +2 -0
- package/dist/assets/audio-engine/audio_engine.wasm +0 -0
- package/dist/assets/pdfjs/pdf.worker.min.mjs +21 -0
- package/dist/host/index.d.ts +133 -0
- package/dist/host/index.js +10 -0
- package/dist/i18n/catalog.en.d.ts +1 -0
- package/dist/i18n/catalog.en.js +411 -0
- package/dist/i18n/catalog.ko.d.ts +1 -0
- package/dist/i18n/catalog.ko.js +68 -0
- package/dist/i18n/index.d.ts +18 -0
- package/dist/i18n/index.js +41 -0
- package/dist/licenses/emscripten.txt +101 -0
- package/dist/licenses/kissfft.txt +28 -0
- package/dist/licenses/pdfjs-dist.txt +177 -0
- package/dist/parsers/a2l/index.d.ts +1 -0
- package/dist/parsers/a2l/index.js +1 -0
- package/dist/parsers/archive/index.d.ts +22 -0
- package/dist/parsers/archive/index.js +46 -0
- package/dist/parsers/archive/model.d.ts +29 -0
- package/dist/parsers/archive/model.js +1 -0
- package/dist/parsers/archive/worker.d.ts +21 -0
- package/dist/parsers/archive/worker.js +1 -0
- package/dist/parsers/arxml/index.d.ts +1 -0
- package/dist/parsers/arxml/index.js +1 -0
- package/dist/parsers/asc/index.d.ts +1 -0
- package/dist/parsers/asc/index.js +1 -0
- package/dist/parsers/audio/index.d.ts +9 -0
- package/dist/parsers/audio/index.js +46 -0
- package/dist/parsers/automotive/index.d.ts +33 -0
- package/dist/parsers/automotive/index.js +973 -0
- package/dist/parsers/blf/index.d.ts +1 -0
- package/dist/parsers/blf/index.js +1 -0
- package/dist/parsers/csv/delimiter.d.ts +31 -0
- package/dist/parsers/csv/delimiter.js +151 -0
- package/dist/parsers/csv/index.d.ts +30 -0
- package/dist/parsers/csv/index.js +108 -0
- package/dist/parsers/csv/parseText.d.ts +20 -0
- package/dist/parsers/csv/parseText.js +108 -0
- package/dist/parsers/csv/sort.d.ts +26 -0
- package/dist/parsers/csv/sort.js +224 -0
- package/dist/parsers/csv/statistics.d.ts +49 -0
- package/dist/parsers/csv/statistics.js +150 -0
- package/dist/parsers/dbc/index.d.ts +56 -0
- package/dist/parsers/dbc/index.js +94 -0
- package/dist/parsers/doc-binary/index.d.ts +35 -0
- package/dist/parsers/doc-binary/index.js +267 -0
- package/dist/parsers/doc-binary/vscode-parser.d.ts +142 -0
- package/dist/parsers/doc-binary/vscode-parser.js +3747 -0
- package/dist/parsers/excel/index.d.ts +17 -0
- package/dist/parsers/excel/index.js +406 -0
- package/dist/parsers/excel/model.d.ts +80 -0
- package/dist/parsers/excel/model.js +48 -0
- package/dist/parsers/excel/serialize.d.ts +3 -0
- package/dist/parsers/excel/serialize.js +78 -0
- package/dist/parsers/hdf5/index.d.ts +75 -0
- package/dist/parsers/hdf5/index.js +658 -0
- package/dist/parsers/hdf5/node.d.ts +21 -0
- package/dist/parsers/hdf5/node.js +95 -0
- package/dist/parsers/json/index.d.ts +15 -0
- package/dist/parsers/json/index.js +102 -0
- package/dist/parsers/json/model.d.ts +42 -0
- package/dist/parsers/json/model.js +140 -0
- package/dist/parsers/json/parse.d.ts +22 -0
- package/dist/parsers/json/parse.js +279 -0
- package/dist/parsers/json/tokenizer.d.ts +17 -0
- package/dist/parsers/json/tokenizer.js +175 -0
- package/dist/parsers/jsonl/index.d.ts +14 -0
- package/dist/parsers/jsonl/index.js +18 -0
- package/dist/parsers/jsonl/model.d.ts +23 -0
- package/dist/parsers/jsonl/model.js +1 -0
- package/dist/parsers/jsonl/parse.d.ts +7 -0
- package/dist/parsers/jsonl/parse.js +34 -0
- package/dist/parsers/markdown/index.d.ts +37 -0
- package/dist/parsers/markdown/index.js +59 -0
- package/dist/parsers/mat/index.d.ts +31 -0
- package/dist/parsers/mat/index.js +426 -0
- package/dist/parsers/mermaid/index.d.ts +5 -0
- package/dist/parsers/mermaid/index.js +3 -0
- package/dist/parsers/mf4/index.d.ts +1 -0
- package/dist/parsers/mf4/index.js +1 -0
- package/dist/parsers/parquet/index.d.ts +21 -0
- package/dist/parsers/parquet/index.js +68 -0
- package/dist/parsers/pcap/index.d.ts +1 -0
- package/dist/parsers/pcap/index.js +1 -0
- package/dist/parsers/pcapng/index.d.ts +1 -0
- package/dist/parsers/pcapng/index.js +1 -0
- package/dist/parsers/plantuml/index.d.ts +5 -0
- package/dist/parsers/plantuml/index.js +4 -0
- package/dist/parsers/ppt-binary/index.d.ts +5 -0
- package/dist/parsers/ppt-binary/index.js +62 -0
- package/dist/parsers/ppt-binary/pptBinaryBuildContext.d.ts +12 -0
- package/dist/parsers/ppt-binary/pptBinaryBuildContext.js +40 -0
- package/dist/parsers/ppt-binary/pptBinaryContainer.d.ts +4 -0
- package/dist/parsers/ppt-binary/pptBinaryContainer.js +174 -0
- package/dist/parsers/ppt-binary/pptBinaryTypes.d.ts +125 -0
- package/dist/parsers/ppt-binary/pptBinaryTypes.js +1 -0
- package/dist/parsers/ppt-binary/pptSlideLayouts.d.ts +9 -0
- package/dist/parsers/ppt-binary/pptSlideLayouts.js +510 -0
- package/dist/parsers/ppt-binary/vscode-parser.d.ts +116 -0
- package/dist/parsers/ppt-binary/vscode-parser.js +2853 -0
- package/dist/parsers/ppt-binary/vscode.d.ts +4 -0
- package/dist/parsers/ppt-binary/vscode.js +12 -0
- package/dist/parsers/pptx/index.d.ts +15 -0
- package/dist/parsers/pptx/index.js +88 -0
- package/dist/parsers/pptx/vscode-parser.d.ts +167 -0
- package/dist/parsers/pptx/vscode-parser.js +1503 -0
- package/dist/parsers/pptx/vscode.d.ts +4 -0
- package/dist/parsers/pptx/vscode.js +18 -0
- package/dist/parsers/pptx/zip-reader.d.ts +3 -0
- package/dist/parsers/pptx/zip-reader.js +20 -0
- package/dist/parsers/proto/index.d.ts +90 -0
- package/dist/parsers/proto/index.js +197 -0
- package/dist/parsers/psd/index.d.ts +16 -0
- package/dist/parsers/psd/index.js +10 -0
- package/dist/parsers/shapefile/dbf.d.ts +23 -0
- package/dist/parsers/shapefile/dbf.js +112 -0
- package/dist/parsers/shapefile/index.d.ts +44 -0
- package/dist/parsers/shapefile/index.js +119 -0
- package/dist/parsers/shapefile/reproject.d.ts +10 -0
- package/dist/parsers/shapefile/reproject.js +41 -0
- package/dist/parsers/slide-model.d.ts +106 -0
- package/dist/parsers/slide-model.js +1 -0
- package/dist/parsers/toml/index.d.ts +15 -0
- package/dist/parsers/toml/index.js +18 -0
- package/dist/parsers/toml/model.d.ts +15 -0
- package/dist/parsers/toml/model.js +1 -0
- package/dist/parsers/toml/parse.d.ts +16 -0
- package/dist/parsers/toml/parse.js +266 -0
- package/dist/parsers/types.d.ts +103 -0
- package/dist/parsers/types.js +106 -0
- package/dist/parsers/video/index.d.ts +6 -0
- package/dist/parsers/video/index.js +2 -0
- package/dist/parsers/yaml/index.d.ts +16 -0
- package/dist/parsers/yaml/index.js +58 -0
- package/dist/parsers/yaml/model.d.ts +22 -0
- package/dist/parsers/yaml/model.js +1 -0
- package/dist/parsers/yaml/self-loading.d.ts +3 -0
- package/dist/parsers/yaml/self-loading.js +19 -0
- package/dist/parsers/zip-scan.d.ts +8 -0
- package/dist/parsers/zip-scan.js +80 -0
- package/dist/registry/container.d.ts +17 -0
- package/dist/registry/container.js +49 -0
- package/dist/registry/index.d.ts +133 -0
- package/dist/registry/index.js +348 -0
- package/dist/registry/probe.d.ts +3 -0
- package/dist/registry/probe.js +177 -0
- package/dist/registry/sniff.d.ts +17 -0
- package/dist/registry/sniff.js +57 -0
- package/dist/styles/archive.css +10 -0
- package/dist/styles/audio.css +66 -0
- package/dist/styles/automotive.css +1 -0
- package/dist/styles/csv.css +262 -0
- package/dist/styles/excel.css +212 -0
- package/dist/styles/fallback.css +48 -0
- package/dist/styles/hdf5.css +3 -0
- package/dist/styles/hwp.css +12 -0
- package/dist/styles/image.css +115 -0
- package/dist/styles/json.css +342 -0
- package/dist/styles/jsonl.css +1 -0
- package/dist/styles/markdown.css +10 -0
- package/dist/styles/mat.css +2 -0
- package/dist/styles/mermaid.css +1 -0
- package/dist/styles/parquet.css +2 -0
- package/dist/styles/pdf.css +551 -0
- package/dist/styles/plantuml.css +1 -0
- package/dist/styles/ppt.css +1 -0
- package/dist/styles/proto.css +2 -0
- package/dist/styles/psd.css +1 -0
- package/dist/styles/shapefile.css +25 -0
- package/dist/styles/toml.css +1 -0
- package/dist/styles/video.css +74 -0
- package/dist/styles/word.css +685 -0
- package/dist/styles/yaml.css +1 -0
- package/dist/viewers/a2l/index.d.ts +15 -0
- package/dist/viewers/a2l/index.js +5 -0
- package/dist/viewers/archive/archive-preview-decoder.d.ts +4 -0
- package/dist/viewers/archive/archive-preview-decoder.js +223 -0
- package/dist/viewers/archive/controller.d.ts +24 -0
- package/dist/viewers/archive/controller.js +18 -0
- package/dist/viewers/archive/index.d.ts +25 -0
- package/dist/viewers/archive/index.js +230 -0
- package/dist/viewers/archive/preview.d.ts +2 -0
- package/dist/viewers/archive/preview.js +2 -0
- package/dist/viewers/archive/styles.d.ts +1 -0
- package/dist/viewers/archive/styles.js +11 -0
- package/dist/viewers/arxml/index.d.ts +15 -0
- package/dist/viewers/arxml/index.js +5 -0
- package/dist/viewers/asc/index.d.ts +15 -0
- package/dist/viewers/asc/index.js +5 -0
- package/dist/viewers/audio/controller.d.ts +33 -0
- package/dist/viewers/audio/controller.js +49 -0
- package/dist/viewers/audio/engine.d.ts +44 -0
- package/dist/viewers/audio/engine.js +108 -0
- package/dist/viewers/audio/index.d.ts +92 -0
- package/dist/viewers/audio/index.js +448 -0
- package/dist/viewers/audio/self-loading.d.ts +7 -0
- package/dist/viewers/audio/self-loading.js +42 -0
- package/dist/viewers/audio/styles.d.ts +1 -0
- package/dist/viewers/audio/styles.js +73 -0
- package/dist/viewers/automotive/index.d.ts +8 -0
- package/dist/viewers/automotive/index.js +152 -0
- package/dist/viewers/automotive/styles.d.ts +1 -0
- package/dist/viewers/automotive/styles.js +1 -0
- package/dist/viewers/avro/index.d.ts +15 -0
- package/dist/viewers/avro/index.js +5 -0
- package/dist/viewers/bag/index.d.ts +15 -0
- package/dist/viewers/bag/index.js +5 -0
- package/dist/viewers/blf/index.d.ts +15 -0
- package/dist/viewers/blf/index.js +5 -0
- package/dist/viewers/csv/controller.d.ts +126 -0
- package/dist/viewers/csv/controller.js +598 -0
- package/dist/viewers/csv/index.d.ts +48 -0
- package/dist/viewers/csv/index.js +846 -0
- package/dist/viewers/csv/styles.d.ts +1 -0
- package/dist/viewers/csv/styles.js +267 -0
- package/dist/viewers/db3/index.d.ts +15 -0
- package/dist/viewers/db3/index.js +5 -0
- package/dist/viewers/dbc/index.d.ts +15 -0
- package/dist/viewers/dbc/index.js +5 -0
- package/dist/viewers/diagram.d.ts +14 -0
- package/dist/viewers/diagram.js +95 -0
- package/dist/viewers/excel/controller.d.ts +108 -0
- package/dist/viewers/excel/controller.js +548 -0
- package/dist/viewers/excel/grid.d.ts +28 -0
- package/dist/viewers/excel/grid.js +99 -0
- package/dist/viewers/excel/index.d.ts +37 -0
- package/dist/viewers/excel/index.js +620 -0
- package/dist/viewers/excel/self-loading.d.ts +6 -0
- package/dist/viewers/excel/self-loading.js +13 -0
- package/dist/viewers/excel/styles.d.ts +1 -0
- package/dist/viewers/excel/styles.js +216 -0
- package/dist/viewers/fallback/index.d.ts +17 -0
- package/dist/viewers/fallback/index.js +130 -0
- package/dist/viewers/fallback/styles.d.ts +1 -0
- package/dist/viewers/fallback/styles.js +49 -0
- package/dist/viewers/hdf5/index.d.ts +19 -0
- package/dist/viewers/hdf5/index.js +170 -0
- package/dist/viewers/hdf5/styles.d.ts +1 -0
- package/dist/viewers/hdf5/styles.js +4 -0
- package/dist/viewers/hwp/controller.d.ts +19 -0
- package/dist/viewers/hwp/controller.js +22 -0
- package/dist/viewers/hwp/index.d.ts +39 -0
- package/dist/viewers/hwp/index.js +271 -0
- package/dist/viewers/hwp/self-loading.d.ts +2 -0
- package/dist/viewers/hwp/self-loading.js +6 -0
- package/dist/viewers/hwp/styles.d.ts +1 -0
- package/dist/viewers/hwp/styles.js +13 -0
- package/dist/viewers/image/controller.d.ts +210 -0
- package/dist/viewers/image/controller.js +336 -0
- package/dist/viewers/image/decode.d.ts +54 -0
- package/dist/viewers/image/decode.js +150 -0
- package/dist/viewers/image/index.d.ts +38 -0
- package/dist/viewers/image/index.js +749 -0
- package/dist/viewers/image/limits.d.ts +18 -0
- package/dist/viewers/image/limits.js +20 -0
- package/dist/viewers/image/styles.d.ts +1 -0
- package/dist/viewers/image/styles.js +119 -0
- package/dist/viewers/json/controller.d.ts +89 -0
- package/dist/viewers/json/controller.js +411 -0
- package/dist/viewers/json/index.d.ts +25 -0
- package/dist/viewers/json/index.js +503 -0
- package/dist/viewers/json/styles.d.ts +1 -0
- package/dist/viewers/json/styles.js +346 -0
- package/dist/viewers/json/transforms.d.ts +27 -0
- package/dist/viewers/json/transforms.js +253 -0
- package/dist/viewers/jsonl/controller.d.ts +48 -0
- package/dist/viewers/jsonl/controller.js +136 -0
- package/dist/viewers/jsonl/index.d.ts +22 -0
- package/dist/viewers/jsonl/index.js +184 -0
- package/dist/viewers/jsonl/styles.d.ts +1 -0
- package/dist/viewers/jsonl/styles.js +1 -0
- package/dist/viewers/markdown/controller.d.ts +50 -0
- package/dist/viewers/markdown/controller.js +62 -0
- package/dist/viewers/markdown/index.d.ts +64 -0
- package/dist/viewers/markdown/index.js +425 -0
- package/dist/viewers/markdown/math.d.ts +21 -0
- package/dist/viewers/markdown/math.js +100 -0
- package/dist/viewers/markdown/self-loading.d.ts +5 -0
- package/dist/viewers/markdown/self-loading.js +48 -0
- package/dist/viewers/markdown/styles.d.ts +1 -0
- package/dist/viewers/markdown/styles.js +11 -0
- package/dist/viewers/mat/index.d.ts +19 -0
- package/dist/viewers/mat/index.js +113 -0
- package/dist/viewers/mat/styles.d.ts +1 -0
- package/dist/viewers/mat/styles.js +3 -0
- package/dist/viewers/media.d.ts +9 -0
- package/dist/viewers/media.js +77 -0
- package/dist/viewers/mermaid/index.d.ts +17 -0
- package/dist/viewers/mermaid/index.js +6 -0
- package/dist/viewers/mermaid/self-loading.d.ts +2 -0
- package/dist/viewers/mermaid/self-loading.js +2 -0
- package/dist/viewers/mf4/index.d.ts +15 -0
- package/dist/viewers/mf4/index.js +5 -0
- package/dist/viewers/parquet/controller.d.ts +37 -0
- package/dist/viewers/parquet/controller.js +26 -0
- package/dist/viewers/parquet/index.d.ts +23 -0
- package/dist/viewers/parquet/index.js +134 -0
- package/dist/viewers/parquet/styles.d.ts +1 -0
- package/dist/viewers/parquet/styles.js +3 -0
- package/dist/viewers/pcap/index.d.ts +15 -0
- package/dist/viewers/pcap/index.js +5 -0
- package/dist/viewers/pcapng/index.d.ts +15 -0
- package/dist/viewers/pcapng/index.js +5 -0
- package/dist/viewers/pdf/controller.d.ts +120 -0
- package/dist/viewers/pdf/controller.js +191 -0
- package/dist/viewers/pdf/editing.d.ts +26 -0
- package/dist/viewers/pdf/editing.js +265 -0
- package/dist/viewers/pdf/index.d.ts +88 -0
- package/dist/viewers/pdf/index.js +1400 -0
- package/dist/viewers/pdf/self-loading.d.ts +6 -0
- package/dist/viewers/pdf/self-loading.js +14 -0
- package/dist/viewers/pdf/styles.d.ts +1 -0
- package/dist/viewers/pdf/styles.js +555 -0
- package/dist/viewers/plantuml/index.d.ts +17 -0
- package/dist/viewers/plantuml/index.js +6 -0
- package/dist/viewers/plantuml/self-loading.d.ts +2 -0
- package/dist/viewers/plantuml/self-loading.js +2 -0
- package/dist/viewers/ppt/chart.d.ts +8 -0
- package/dist/viewers/ppt/chart.js +83 -0
- package/dist/viewers/ppt/controller.d.ts +34 -0
- package/dist/viewers/ppt/controller.js +27 -0
- package/dist/viewers/ppt/index.d.ts +33 -0
- package/dist/viewers/ppt/index.js +101 -0
- package/dist/viewers/ppt/render.d.ts +5 -0
- package/dist/viewers/ppt/render.js +144 -0
- package/dist/viewers/ppt/self-loading.d.ts +9 -0
- package/dist/viewers/ppt/self-loading.js +4 -0
- package/dist/viewers/ppt/styles.d.ts +1 -0
- package/dist/viewers/ppt/styles.js +1 -0
- package/dist/viewers/proto/index.d.ts +17 -0
- package/dist/viewers/proto/index.js +170 -0
- package/dist/viewers/proto/styles.d.ts +1 -0
- package/dist/viewers/proto/styles.js +2 -0
- package/dist/viewers/psd/index.d.ts +27 -0
- package/dist/viewers/psd/index.js +39 -0
- package/dist/viewers/psd/self-loading.d.ts +10 -0
- package/dist/viewers/psd/self-loading.js +20 -0
- package/dist/viewers/psd/styles.d.ts +1 -0
- package/dist/viewers/psd/styles.js +1 -0
- package/dist/viewers/reqif/index.d.ts +15 -0
- package/dist/viewers/reqif/index.js +5 -0
- package/dist/viewers/shapefile/index.d.ts +35 -0
- package/dist/viewers/shapefile/index.js +336 -0
- package/dist/viewers/shapefile/self-loading.d.ts +7 -0
- package/dist/viewers/shapefile/self-loading.js +32 -0
- package/dist/viewers/shapefile/styles.d.ts +1 -0
- package/dist/viewers/shapefile/styles.js +28 -0
- package/dist/viewers/stp/index.d.ts +15 -0
- package/dist/viewers/stp/index.js +5 -0
- package/dist/viewers/structured-styles.d.ts +1 -0
- package/dist/viewers/structured-styles.js +1 -0
- package/dist/viewers/structured.d.ts +36 -0
- package/dist/viewers/structured.js +138 -0
- package/dist/viewers/toml/controller.d.ts +38 -0
- package/dist/viewers/toml/controller.js +61 -0
- package/dist/viewers/toml/index.d.ts +18 -0
- package/dist/viewers/toml/index.js +34 -0
- package/dist/viewers/types.d.ts +36 -0
- package/dist/viewers/types.js +9 -0
- package/dist/viewers/video/controller.d.ts +29 -0
- package/dist/viewers/video/controller.js +54 -0
- package/dist/viewers/video/index.d.ts +18 -0
- package/dist/viewers/video/index.js +305 -0
- package/dist/viewers/video/styles.d.ts +1 -0
- package/dist/viewers/video/styles.js +79 -0
- package/dist/viewers/word/controller.d.ts +19 -0
- package/dist/viewers/word/controller.js +22 -0
- package/dist/viewers/word/docx-preprocess.d.ts +63 -0
- package/dist/viewers/word/docx-preprocess.js +136 -0
- package/dist/viewers/word/index.d.ts +32 -0
- package/dist/viewers/word/index.js +187 -0
- package/dist/viewers/word/normalize-docx.d.ts +2 -0
- package/dist/viewers/word/normalize-docx.js +50 -0
- package/dist/viewers/word/paginate.d.ts +1 -0
- package/dist/viewers/word/paginate.js +1035 -0
- package/dist/viewers/word/self-loading.d.ts +2 -0
- package/dist/viewers/word/self-loading.js +7 -0
- package/dist/viewers/word/styles.d.ts +1 -0
- package/dist/viewers/word/styles.js +686 -0
- package/dist/viewers/yaml/controller.d.ts +42 -0
- package/dist/viewers/yaml/controller.js +41 -0
- package/dist/viewers/yaml/index.d.ts +21 -0
- package/dist/viewers/yaml/index.js +20 -0
- package/package.json +375 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { parseMat } from '../../parsers/mat/index.js';
|
|
2
|
+
import { MountAbortedError, VIEWER_ROOT_CLASS } from '../types.js';
|
|
3
|
+
import { matViewerCss } from './styles.js';
|
|
4
|
+
export { parseMat } from '../../parsers/mat/index.js';
|
|
5
|
+
export { matViewerCss } from './styles.js';
|
|
6
|
+
export const MAT_VIEWER_META = {
|
|
7
|
+
id: 'mat', displayNameKey: 'mat.title', extensions: ['mat'], priority: 20,
|
|
8
|
+
requiredServices: [], optionalServices: ['clipboard'],
|
|
9
|
+
inputOwnership: 'borrows'
|
|
10
|
+
};
|
|
11
|
+
export const MAT_RENDER_ROW_LIMIT = 1000;
|
|
12
|
+
export async function mountMatViewer(input, container, ctx, options = {}) {
|
|
13
|
+
if (options.signal?.aborted)
|
|
14
|
+
throw new MountAbortedError();
|
|
15
|
+
const model = await parseMat(input.data);
|
|
16
|
+
if (options.signal?.aborted)
|
|
17
|
+
throw new MountAbortedError();
|
|
18
|
+
const t = ctx.i18n.t.bind(ctx.i18n);
|
|
19
|
+
let root = container;
|
|
20
|
+
if ((options.styleIsolation ?? 'shadow') === 'shadow' && typeof container.attachShadow === 'function') {
|
|
21
|
+
root = container.shadowRoot ?? container.attachShadow({ mode: 'open' });
|
|
22
|
+
const style = document.createElement('style');
|
|
23
|
+
style.textContent = matViewerCss;
|
|
24
|
+
root.append(style);
|
|
25
|
+
}
|
|
26
|
+
else
|
|
27
|
+
container.classList.add(VIEWER_ROOT_CLASS, 'omni-viewer--mat');
|
|
28
|
+
const el = (tag, className, text) => {
|
|
29
|
+
const node = document.createElement(tag);
|
|
30
|
+
if (className)
|
|
31
|
+
node.className = className;
|
|
32
|
+
if (text !== undefined)
|
|
33
|
+
node.textContent = text;
|
|
34
|
+
return node;
|
|
35
|
+
};
|
|
36
|
+
const disposers = [];
|
|
37
|
+
const on = (target, type, listener) => { target.addEventListener(type, listener); disposers.push(() => target.removeEventListener(type, listener)); };
|
|
38
|
+
const frame = el('div', 'omni-mat');
|
|
39
|
+
const header = el('header', 'omni-mat__header');
|
|
40
|
+
const heading = el('div', 'omni-mat__heading');
|
|
41
|
+
heading.append(el('h1', undefined, input.fileName), el('div', 'omni-mat__subtitle', `${model.title} · ${model.fileSize}`));
|
|
42
|
+
header.append(el('div', 'omni-mat__mark', 'MAT'), heading);
|
|
43
|
+
const summary = el('section', 'omni-mat__summary');
|
|
44
|
+
model.summary.forEach(item => { const card = el('div', 'omni-mat__stat'); card.append(el('span', 'omni-mat__stat-label', item.label), el('span', 'omni-mat__stat-value', String(item.value))); summary.append(card); });
|
|
45
|
+
const toolbar = el('nav', 'omni-mat__toolbar');
|
|
46
|
+
const content = el('main', 'omni-mat__content');
|
|
47
|
+
const search = el('input', 'omni-mat__search');
|
|
48
|
+
search.type = 'search';
|
|
49
|
+
search.placeholder = t('mat.search');
|
|
50
|
+
search.setAttribute('aria-label', t('mat.search'));
|
|
51
|
+
const copy = el('button', undefined, t('mat.copyJson'));
|
|
52
|
+
copy.type = 'button';
|
|
53
|
+
copy.disabled = !ctx.clipboard;
|
|
54
|
+
copy.title = ctx.clipboard ? '' : t('common.noClipboard');
|
|
55
|
+
let active = 0;
|
|
56
|
+
const buttons = new Map();
|
|
57
|
+
const addViewButton = (view, label) => { const button = el('button', undefined, label); button.type = 'button'; button.dataset.view = String(view); on(button, 'click', () => { active = view; render(); }); buttons.set(view, button); toolbar.append(button); };
|
|
58
|
+
model.tables.forEach((table, index) => addViewButton(index, table.title));
|
|
59
|
+
if (model.rawPreview)
|
|
60
|
+
addViewButton('raw', t('mat.rawPreview'));
|
|
61
|
+
toolbar.append(copy, search);
|
|
62
|
+
const warnings = model.warnings.length ? el('div', 'omni-mat__warnings', model.warnings.join(' · ')) : null;
|
|
63
|
+
const activeTable = () => typeof active === 'number' ? model.tables[active] : undefined;
|
|
64
|
+
const filteredRows = (table) => {
|
|
65
|
+
const query = search.value.trim().toLocaleLowerCase();
|
|
66
|
+
return query ? table.rows.filter(row => row.some(value => String(value).toLocaleLowerCase().includes(query))) : table.rows;
|
|
67
|
+
};
|
|
68
|
+
const renderTable = (table) => {
|
|
69
|
+
const wrap = el('div', 'omni-mat__table-wrap');
|
|
70
|
+
const tableNode = el('table');
|
|
71
|
+
const head = el('thead');
|
|
72
|
+
const headRow = el('tr');
|
|
73
|
+
table.headers.forEach(value => headRow.append(el('th', undefined, value)));
|
|
74
|
+
head.append(headRow);
|
|
75
|
+
tableNode.append(head);
|
|
76
|
+
const body = el('tbody');
|
|
77
|
+
const rows = filteredRows(table);
|
|
78
|
+
const shown = rows.slice(0, MAT_RENDER_ROW_LIMIT);
|
|
79
|
+
shown.forEach(row => { const tr = el('tr'); row.forEach(value => { const td = el('td', undefined, String(value)); td.title = String(value); tr.append(td); }); body.append(tr); });
|
|
80
|
+
tableNode.append(body);
|
|
81
|
+
wrap.append(tableNode);
|
|
82
|
+
if (rows.length)
|
|
83
|
+
content.append(el('div', 'omni-mat__caption', t('mat.rowsShown', { shown: shown.length, total: rows.length })), wrap);
|
|
84
|
+
else
|
|
85
|
+
content.append(el('div', 'omni-mat__empty', t('mat.noMatches')));
|
|
86
|
+
};
|
|
87
|
+
const render = () => {
|
|
88
|
+
content.replaceChildren();
|
|
89
|
+
buttons.forEach((button, view) => button.setAttribute('aria-pressed', String(view === active)));
|
|
90
|
+
search.hidden = active === 'raw';
|
|
91
|
+
copy.disabled = !ctx.clipboard;
|
|
92
|
+
const table = activeTable();
|
|
93
|
+
if (table)
|
|
94
|
+
renderTable(table);
|
|
95
|
+
else
|
|
96
|
+
content.append(el('pre', 'omni-mat__raw', model.rawPreview ?? ''));
|
|
97
|
+
};
|
|
98
|
+
on(search, 'input', render);
|
|
99
|
+
on(copy, 'click', () => {
|
|
100
|
+
if (!ctx.clipboard)
|
|
101
|
+
return;
|
|
102
|
+
void ctx.clipboard.writeText(JSON.stringify(model, null, 2)).catch(error => ctx.logger.log('error', `MAT JSON copy failed: ${String(error)}`));
|
|
103
|
+
});
|
|
104
|
+
frame.append(header, summary, toolbar, content);
|
|
105
|
+
if (warnings)
|
|
106
|
+
frame.append(warnings);
|
|
107
|
+
root.append(frame);
|
|
108
|
+
render();
|
|
109
|
+
return { dispose() { disposers.splice(0).forEach(dispose => dispose()); frame.remove(); if (root instanceof ShadowRoot)
|
|
110
|
+
root.replaceChildren();
|
|
111
|
+
else
|
|
112
|
+
container.classList.remove(VIEWER_ROOT_CLASS, 'omni-viewer--mat'); } };
|
|
113
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const matViewerCss = "\n:host{display:block;height:100%;color:var(--omni-fg,#d4d4d4);background:var(--omni-bg,#1e1e1e);font:13px system-ui,sans-serif}.omni-mat{display:flex;flex-direction:column;height:100%;min-height:360px}.omni-mat__header{display:flex;align-items:center;gap:12px;padding:12px 16px;border-bottom:1px solid var(--omni-border,#3c3c3c)}.omni-mat__mark{display:grid;place-items:center;width:42px;height:42px;border-radius:9px;background:linear-gradient(145deg,#e76f00,#9e3d00);color:white;font-weight:800;letter-spacing:.04em}.omni-mat__heading{min-width:0}.omni-mat__heading h1{font-size:16px;line-height:1.3;margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.omni-mat__subtitle{margin-top:3px;color:var(--omni-muted,#999)}.omni-mat__summary{display:flex;gap:8px;padding:10px 16px;overflow-x:auto;border-bottom:1px solid var(--omni-border,#3c3c3c)}.omni-mat__stat{min-width:110px;padding:8px 10px;border:1px solid var(--omni-border,#3c3c3c);border-radius:6px;background:var(--omni-panel,#252526)}.omni-mat__stat-label{display:block;color:var(--omni-muted,#999);font-size:11px;margin-bottom:4px}.omni-mat__stat-value{font-weight:650}.omni-mat__toolbar{display:flex;align-items:center;gap:8px;padding:8px 16px;border-bottom:1px solid var(--omni-border,#3c3c3c);flex-wrap:wrap}.omni-mat button,.omni-mat input{font:inherit;color:inherit;background:var(--omni-control,#2d2d2d);border:1px solid var(--omni-border,#555);border-radius:4px;padding:5px 9px}.omni-mat button{cursor:pointer}.omni-mat button[aria-pressed=true]{background:var(--omni-accent,#0e639c);border-color:var(--omni-accent,#0e639c);color:#fff}.omni-mat button:disabled{opacity:.55;cursor:default}.omni-mat__search{min-width:220px;margin-left:auto}.omni-mat__content{flex:1;min-height:0;overflow:auto;padding:14px 16px}.omni-mat__caption{margin:0 0 7px;color:var(--omni-muted,#999);font-size:12px}.omni-mat__table-wrap{overflow:auto;border:1px solid var(--omni-border,#3c3c3c);border-radius:6px}.omni-mat table{border-collapse:collapse;width:100%;min-width:720px;font-size:12px}.omni-mat th,.omni-mat td{padding:8px 10px;text-align:left;border-bottom:1px solid var(--omni-border,#3c3c3c);white-space:nowrap;max-width:520px;overflow:hidden;text-overflow:ellipsis}.omni-mat th{position:sticky;top:0;background:var(--omni-panel,#252526);z-index:1;color:var(--omni-muted,#bbb);font-weight:650}.omni-mat tr:last-child td{border-bottom:0}.omni-mat tbody tr:hover{background:color-mix(in srgb,var(--omni-accent,#0e639c) 12%,transparent)}.omni-mat__raw{margin:0;padding:14px;border:1px solid var(--omni-border,#3c3c3c);border-radius:6px;background:var(--omni-panel,#252526);font:12px/1.55 ui-monospace,monospace;white-space:pre;overflow:auto}.omni-mat__warnings{padding:8px 16px;color:#f0c674;border-top:1px solid var(--omni-border,#3c3c3c);background:color-mix(in srgb,#f0c674 8%,transparent)}.omni-mat__empty{padding:32px;text-align:center;color:var(--omni-muted,#999)}@media(max-width:700px){.omni-mat__summary{padding:8px}.omni-mat__toolbar,.omni-mat__content{padding-left:8px;padding-right:8px}.omni-mat__search{order:2;width:100%;margin-left:0}}\n";
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export const matViewerCss = `
|
|
2
|
+
:host{display:block;height:100%;color:var(--omni-fg,#d4d4d4);background:var(--omni-bg,#1e1e1e);font:13px system-ui,sans-serif}.omni-mat{display:flex;flex-direction:column;height:100%;min-height:360px}.omni-mat__header{display:flex;align-items:center;gap:12px;padding:12px 16px;border-bottom:1px solid var(--omni-border,#3c3c3c)}.omni-mat__mark{display:grid;place-items:center;width:42px;height:42px;border-radius:9px;background:linear-gradient(145deg,#e76f00,#9e3d00);color:white;font-weight:800;letter-spacing:.04em}.omni-mat__heading{min-width:0}.omni-mat__heading h1{font-size:16px;line-height:1.3;margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.omni-mat__subtitle{margin-top:3px;color:var(--omni-muted,#999)}.omni-mat__summary{display:flex;gap:8px;padding:10px 16px;overflow-x:auto;border-bottom:1px solid var(--omni-border,#3c3c3c)}.omni-mat__stat{min-width:110px;padding:8px 10px;border:1px solid var(--omni-border,#3c3c3c);border-radius:6px;background:var(--omni-panel,#252526)}.omni-mat__stat-label{display:block;color:var(--omni-muted,#999);font-size:11px;margin-bottom:4px}.omni-mat__stat-value{font-weight:650}.omni-mat__toolbar{display:flex;align-items:center;gap:8px;padding:8px 16px;border-bottom:1px solid var(--omni-border,#3c3c3c);flex-wrap:wrap}.omni-mat button,.omni-mat input{font:inherit;color:inherit;background:var(--omni-control,#2d2d2d);border:1px solid var(--omni-border,#555);border-radius:4px;padding:5px 9px}.omni-mat button{cursor:pointer}.omni-mat button[aria-pressed=true]{background:var(--omni-accent,#0e639c);border-color:var(--omni-accent,#0e639c);color:#fff}.omni-mat button:disabled{opacity:.55;cursor:default}.omni-mat__search{min-width:220px;margin-left:auto}.omni-mat__content{flex:1;min-height:0;overflow:auto;padding:14px 16px}.omni-mat__caption{margin:0 0 7px;color:var(--omni-muted,#999);font-size:12px}.omni-mat__table-wrap{overflow:auto;border:1px solid var(--omni-border,#3c3c3c);border-radius:6px}.omni-mat table{border-collapse:collapse;width:100%;min-width:720px;font-size:12px}.omni-mat th,.omni-mat td{padding:8px 10px;text-align:left;border-bottom:1px solid var(--omni-border,#3c3c3c);white-space:nowrap;max-width:520px;overflow:hidden;text-overflow:ellipsis}.omni-mat th{position:sticky;top:0;background:var(--omni-panel,#252526);z-index:1;color:var(--omni-muted,#bbb);font-weight:650}.omni-mat tr:last-child td{border-bottom:0}.omni-mat tbody tr:hover{background:color-mix(in srgb,var(--omni-accent,#0e639c) 12%,transparent)}.omni-mat__raw{margin:0;padding:14px;border:1px solid var(--omni-border,#3c3c3c);border-radius:6px;background:var(--omni-panel,#252526);font:12px/1.55 ui-monospace,monospace;white-space:pre;overflow:auto}.omni-mat__warnings{padding:8px 16px;color:#f0c674;border-top:1px solid var(--omni-border,#3c3c3c);background:color-mix(in srgb,#f0c674 8%,transparent)}.omni-mat__empty{padding:32px;text-align:center;color:var(--omni-muted,#999)}@media(max-width:700px){.omni-mat__summary{padding:8px}.omni-mat__toolbar,.omni-mat__content{padding-left:8px;padding-right:8px}.omni-mat__search{order:2;width:100%;margin-left:0}}
|
|
3
|
+
`;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { HostContext } from '../host/index.js';
|
|
2
|
+
import { type MountOptions, type ViewerHandle, type ViewerInput } from './types.js';
|
|
3
|
+
export declare const mediaViewerCss = ".omni-media{box-sizing:border-box;min-height:100%;padding:20px;background:var(--omni-bg,#181818);color:var(--omni-fg,#eee);font:14px/1.45 system-ui,sans-serif}.omni-media *{box-sizing:border-box}.omni-media__header{display:flex;justify-content:space-between;gap:16px;margin-bottom:18px}.omni-media__title{font-size:18px;font-weight:650;overflow-wrap:anywhere}.omni-media__meta{color:var(--omni-muted,#aaa)}.omni-media__stage{display:grid;place-items:center;min-height:280px;border:1px solid var(--omni-border,#444);border-radius:10px;background:#000;padding:18px}.omni-media audio,.omni-media video{display:block;width:min(100%,1100px);max-height:75vh}.omni-media__warning{margin-top:12px;padding:10px 12px;border:1px solid #b98b2f;border-radius:7px;background:#3b2d10;color:#ffd98a;white-space:pre-wrap}";
|
|
4
|
+
export interface MediaMountOptions extends MountOptions {
|
|
5
|
+
maxBytes?: number;
|
|
6
|
+
createObjectUrl?(blob: Blob): string;
|
|
7
|
+
revokeObjectUrl?(url: string): void;
|
|
8
|
+
}
|
|
9
|
+
export declare function mountMediaViewer(kind: 'audio' | 'video', input: ViewerInput, container: HTMLElement, _ctx: HostContext, mimeType: string, warnings: string[], options?: MediaMountOptions): Promise<ViewerHandle>;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { MountAbortedError, VIEWER_ROOT_CLASS } from './types.js';
|
|
2
|
+
export const mediaViewerCss = `.omni-media{box-sizing:border-box;min-height:100%;padding:20px;background:var(--omni-bg,#181818);color:var(--omni-fg,#eee);font:14px/1.45 system-ui,sans-serif}.omni-media *{box-sizing:border-box}.omni-media__header{display:flex;justify-content:space-between;gap:16px;margin-bottom:18px}.omni-media__title{font-size:18px;font-weight:650;overflow-wrap:anywhere}.omni-media__meta{color:var(--omni-muted,#aaa)}.omni-media__stage{display:grid;place-items:center;min-height:280px;border:1px solid var(--omni-border,#444);border-radius:10px;background:#000;padding:18px}.omni-media audio,.omni-media video{display:block;width:min(100%,1100px);max-height:75vh}.omni-media__warning{margin-top:12px;padding:10px 12px;border:1px solid #b98b2f;border-radius:7px;background:#3b2d10;color:#ffd98a;white-space:pre-wrap}`;
|
|
3
|
+
export async function mountMediaViewer(kind, input, container, _ctx, mimeType, warnings, options = {}) {
|
|
4
|
+
if (options.signal?.aborted)
|
|
5
|
+
throw new MountAbortedError();
|
|
6
|
+
const max = options.maxBytes ?? 128 * 1024 * 1024;
|
|
7
|
+
const root = options.styleIsolation !== 'scoped' && container.attachShadow ? (container.shadowRoot ?? container.attachShadow({ mode: 'open' })) : container;
|
|
8
|
+
if (root === container)
|
|
9
|
+
container.classList.add(VIEWER_ROOT_CLASS, `omni-viewer--${kind}`);
|
|
10
|
+
else {
|
|
11
|
+
const style = document.createElement('style');
|
|
12
|
+
style.textContent = mediaViewerCss;
|
|
13
|
+
root.append(style);
|
|
14
|
+
}
|
|
15
|
+
const shell = document.createElement('section');
|
|
16
|
+
shell.className = `${VIEWER_ROOT_CLASS} omni-media omni-media--${kind}`;
|
|
17
|
+
const header = document.createElement('header');
|
|
18
|
+
header.className = 'omni-media__header';
|
|
19
|
+
const title = document.createElement('div');
|
|
20
|
+
title.className = 'omni-media__title';
|
|
21
|
+
title.textContent = input.fileName;
|
|
22
|
+
const meta = document.createElement('div');
|
|
23
|
+
meta.className = 'omni-media__meta';
|
|
24
|
+
meta.textContent = `${mimeType} · ${formatBytes(input.data.byteLength)}`;
|
|
25
|
+
header.append(title, meta);
|
|
26
|
+
const stage = document.createElement('main');
|
|
27
|
+
stage.className = 'omni-media__stage';
|
|
28
|
+
const media = document.createElement(kind);
|
|
29
|
+
media.controls = true;
|
|
30
|
+
media.preload = input.data.byteLength > 50 * 1024 * 1024 ? 'metadata' : 'auto';
|
|
31
|
+
const messages = document.createElement('div');
|
|
32
|
+
messages.className = 'omni-media__warning';
|
|
33
|
+
messages.hidden = true;
|
|
34
|
+
shell.append(header, stage, messages);
|
|
35
|
+
root.append(shell);
|
|
36
|
+
let url;
|
|
37
|
+
let disposed = false;
|
|
38
|
+
const show = (message) => { messages.hidden = false; messages.textContent = [...warnings, message].filter(Boolean).join('\n'); };
|
|
39
|
+
if (input.data.byteLength > max)
|
|
40
|
+
show(`The file exceeds the ${formatBytes(max)} browser preview limit.`);
|
|
41
|
+
else if (input.data.byteLength === 0)
|
|
42
|
+
show('The media file is empty.');
|
|
43
|
+
else {
|
|
44
|
+
try {
|
|
45
|
+
const create = options.createObjectUrl ?? URL.createObjectURL.bind(URL);
|
|
46
|
+
url = create(new Blob([blobPart(input.data)], { type: mimeType }));
|
|
47
|
+
media.src = url;
|
|
48
|
+
stage.append(media);
|
|
49
|
+
if (warnings.length)
|
|
50
|
+
show('');
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
show('This environment cannot create a browser media source.');
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
const onError = () => show(`The browser could not decode this ${kind} codec. Try a host with the required codec or transcode the file.`);
|
|
57
|
+
media.addEventListener('error', onError);
|
|
58
|
+
if (options.signal?.aborted) {
|
|
59
|
+
media.removeEventListener('error', onError);
|
|
60
|
+
shell.remove();
|
|
61
|
+
if (url)
|
|
62
|
+
(options.revokeObjectUrl ?? URL.revokeObjectURL.bind(URL))(url);
|
|
63
|
+
throw new MountAbortedError();
|
|
64
|
+
}
|
|
65
|
+
return { dispose() { if (disposed)
|
|
66
|
+
return; disposed = true; media.pause(); media.removeAttribute('src'); media.load(); media.removeEventListener('error', onError); if (url)
|
|
67
|
+
(options.revokeObjectUrl ?? URL.revokeObjectURL.bind(URL))(url); shell.remove(); if (root === container)
|
|
68
|
+
container.classList.remove(VIEWER_ROOT_CLASS, `omni-viewer--${kind}`);
|
|
69
|
+
else
|
|
70
|
+
root.replaceChildren(); } };
|
|
71
|
+
}
|
|
72
|
+
function blobPart(data) { return data.buffer instanceof ArrayBuffer ? data : new Uint8Array(data); }
|
|
73
|
+
function formatBytes(bytes) { if (bytes < 1024)
|
|
74
|
+
return `${bytes} B`; const units = ['KiB', 'MiB', 'GiB']; let v = bytes / 1024, i = 0; while (v >= 1024 && i < 2) {
|
|
75
|
+
v /= 1024;
|
|
76
|
+
i++;
|
|
77
|
+
} return `${v.toFixed(v >= 10 ? 1 : 2)} ${units[i]}`; }
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { HostContext } from '../../host/index.js';
|
|
2
|
+
import { diagramViewerCss, type DiagramMountOptions } from '../diagram.js';
|
|
3
|
+
import type { ViewerHandle, ViewerInput } from '../types.js';
|
|
4
|
+
export { parseMermaid } from '../../parsers/mermaid/index.js';
|
|
5
|
+
export { diagramViewerCss as mermaidViewerCss };
|
|
6
|
+
export type MermaidViewerContext = HostContext;
|
|
7
|
+
export type MermaidMountOptions = DiagramMountOptions;
|
|
8
|
+
export declare const MERMAID_VIEWER_META: {
|
|
9
|
+
id: string;
|
|
10
|
+
displayNameKey: string;
|
|
11
|
+
extensions: string[];
|
|
12
|
+
priority: number;
|
|
13
|
+
requiredServices: readonly [];
|
|
14
|
+
optionalServices: readonly [];
|
|
15
|
+
inputOwnership: "borrows";
|
|
16
|
+
};
|
|
17
|
+
export declare function mountMermaidViewer(input: ViewerInput, container: HTMLElement, ctx: MermaidViewerContext, options?: MermaidMountOptions): Promise<ViewerHandle>;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { parseMermaid } from '../../parsers/mermaid/index.js';
|
|
2
|
+
import { diagramViewerCss, mountDiagramViewer } from '../diagram.js';
|
|
3
|
+
export { parseMermaid } from '../../parsers/mermaid/index.js';
|
|
4
|
+
export { diagramViewerCss as mermaidViewerCss };
|
|
5
|
+
export const MERMAID_VIEWER_META = { id: 'mermaid', displayNameKey: 'mermaid.title', extensions: ['mmd', 'mermaid'], priority: 20, requiredServices: [], optionalServices: [], inputOwnership: 'borrows' };
|
|
6
|
+
export function mountMermaidViewer(input, container, ctx, options = {}) { return mountDiagramViewer('mermaid', parseMermaid(input.data), input, container, ctx, options); }
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export async function loadMermaidRenderer() { const mod = await import('mermaid'); const mermaid = mod.default; if (!mermaid)
|
|
2
|
+
throw new Error('Mermaid renderer is unavailable.'); mermaid.initialize({ startOnLoad: false, securityLevel: 'strict', maxTextSize: 200_000, htmlLabels: false }); return { renderMermaid: async (id, source) => (await mermaid.render(id, source)).svg }; }
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { AutomotiveViewerContext } from '../automotive/index.js';
|
|
2
|
+
import type { MountOptions, ViewerHandle, ViewerInput } from '../types.js';
|
|
3
|
+
export { parseMf4 } from '../../parsers/mf4/index.js';
|
|
4
|
+
export { automotiveViewerCss as mf4ViewerCss } from '../automotive/styles.js';
|
|
5
|
+
export type Mf4ViewerContext = AutomotiveViewerContext;
|
|
6
|
+
export declare const MF4_VIEWER_META: {
|
|
7
|
+
id: string;
|
|
8
|
+
displayNameKey: string;
|
|
9
|
+
extensions: string[];
|
|
10
|
+
priority: number;
|
|
11
|
+
requiredServices: readonly [];
|
|
12
|
+
optionalServices: readonly ["clipboard"];
|
|
13
|
+
inputOwnership: "borrows";
|
|
14
|
+
};
|
|
15
|
+
export declare const mountMf4Viewer: (input: ViewerInput, container: HTMLElement, ctx: Mf4ViewerContext, options?: MountOptions) => Promise<ViewerHandle>;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { mountAutomotiveViewer } from '../automotive/index.js';
|
|
2
|
+
export { parseMf4 } from '../../parsers/mf4/index.js';
|
|
3
|
+
export { automotiveViewerCss as mf4ViewerCss } from '../automotive/styles.js';
|
|
4
|
+
export const MF4_VIEWER_META = { id: 'mf4', displayNameKey: 'mf4.title', extensions: ['mf4'], priority: 20, requiredServices: [], optionalServices: ['clipboard'], inputOwnership: 'borrows' };
|
|
5
|
+
export const mountMf4Viewer = (input, container, ctx, options = {}) => mountAutomotiveViewer('mf4', input, container, ctx, options);
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { ParquetCell, ParquetDocument } from '../../parsers/parquet/index.js';
|
|
2
|
+
export interface ParquetViewState {
|
|
3
|
+
search: string;
|
|
4
|
+
sortColumn: number | null;
|
|
5
|
+
sortDirection: 'asc' | 'desc' | null;
|
|
6
|
+
page: number;
|
|
7
|
+
pageSize: number;
|
|
8
|
+
pageCount: number;
|
|
9
|
+
matchedRows: number;
|
|
10
|
+
viewMode: 'table' | 'raw';
|
|
11
|
+
}
|
|
12
|
+
export type ParquetAction = {
|
|
13
|
+
type: 'search';
|
|
14
|
+
value: string;
|
|
15
|
+
} | {
|
|
16
|
+
type: 'sort';
|
|
17
|
+
column: number;
|
|
18
|
+
} | {
|
|
19
|
+
type: 'page';
|
|
20
|
+
page: number;
|
|
21
|
+
} | {
|
|
22
|
+
type: 'page-size';
|
|
23
|
+
size: number;
|
|
24
|
+
} | {
|
|
25
|
+
type: 'view';
|
|
26
|
+
mode: 'table' | 'raw';
|
|
27
|
+
};
|
|
28
|
+
export interface ParquetController {
|
|
29
|
+
readonly state: ParquetViewState;
|
|
30
|
+
dispatch(action: ParquetAction): void;
|
|
31
|
+
appendRows(rows: ParquetCell[][]): void;
|
|
32
|
+
subscribe(fn: (s: ParquetViewState) => void): () => void;
|
|
33
|
+
visibleRows(): ParquetCell[][];
|
|
34
|
+
filteredRows(): readonly ParquetCell[][];
|
|
35
|
+
toJson(): string;
|
|
36
|
+
}
|
|
37
|
+
export declare function createParquetController(document: ParquetDocument): ParquetController;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export function createParquetController(document) {
|
|
2
|
+
const listeners = new Set();
|
|
3
|
+
let state = { search: '', sortColumn: null, sortDirection: null, page: 0, pageSize: 100, pageCount: 1, matchedRows: document.rows.length, viewMode: 'table' };
|
|
4
|
+
let filtered = document.rows.slice();
|
|
5
|
+
const text = (v) => typeof v === 'object' && v !== null ? JSON.stringify(v) : String(v ?? '');
|
|
6
|
+
function rebuild() {
|
|
7
|
+
const q = state.search.toLowerCase();
|
|
8
|
+
filtered = document.rows.filter(r => !q || r.some(v => text(v).toLowerCase().includes(q)));
|
|
9
|
+
if (state.sortColumn !== null && state.sortDirection) {
|
|
10
|
+
const c = state.sortColumn, d = state.sortDirection === 'asc' ? 1 : -1;
|
|
11
|
+
filtered = filtered.map((row, i) => ({ row, i })).sort((a, b) => { const x = text(a.row[c] ?? null), y = text(b.row[c] ?? null); if (x === '' || y === '')
|
|
12
|
+
return x === y ? a.i - b.i : x === '' ? 1 : -1; const xn = Number(x), yn = Number(y); const cmp = Number.isFinite(xn) && Number.isFinite(yn) ? xn - yn : x.localeCompare(y, undefined, { numeric: true }); return cmp ? cmp * d : a.i - b.i; }).map(x => x.row);
|
|
13
|
+
}
|
|
14
|
+
const pageCount = Math.max(1, Math.ceil(filtered.length / state.pageSize));
|
|
15
|
+
state = { ...state, matchedRows: filtered.length, pageCount, page: Math.min(state.page, pageCount - 1) };
|
|
16
|
+
}
|
|
17
|
+
return { get state() { return state; }, dispatch(a) { if (a.type === 'search')
|
|
18
|
+
state = { ...state, search: a.value, page: 0 }; if (a.type === 'sort') {
|
|
19
|
+
const same = state.sortColumn === a.column;
|
|
20
|
+
const next = !same ? 'asc' : state.sortDirection === 'asc' ? 'desc' : state.sortDirection === 'desc' ? null : 'asc';
|
|
21
|
+
state = { ...state, sortColumn: next ? a.column : null, sortDirection: next, page: 0 };
|
|
22
|
+
} if (a.type === 'page')
|
|
23
|
+
state = { ...state, page: Math.max(0, Math.min(a.page, state.pageCount - 1)) }; if (a.type === 'page-size')
|
|
24
|
+
state = { ...state, pageSize: a.size, page: 0 }; if (a.type === 'view')
|
|
25
|
+
state = { ...state, viewMode: a.mode }; rebuild(); listeners.forEach(f => f(state)); }, appendRows(rows) { document.rows.push(...rows); document.loadedRows = document.rows.length; document.isLimited = document.loadedRows < document.totalRows; rebuild(); listeners.forEach(f => f(state)); }, subscribe(fn) { listeners.add(fn); return () => listeners.delete(fn); }, visibleRows() { const start = state.page * state.pageSize; return filtered.slice(start, start + state.pageSize); }, filteredRows() { return filtered; }, toJson() { return JSON.stringify({ schema: document.schema, headers: document.headers, rows: filtered, metadata: { totalRows: document.totalRows, loadedRows: document.loadedRows, columns: document.headers.length, fileSizeBytes: document.fileSizeBytes } }, null, 2); } };
|
|
26
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { ClipboardService, FileSaveService, HostContext } from '../../host/index.js';
|
|
2
|
+
import { type ParquetParseOptions } from '../../parsers/parquet/index.js';
|
|
3
|
+
import { type MountOptions, type ViewerHandle, type ViewerInput } from '../types.js';
|
|
4
|
+
export { createParquetController } from './controller.js';
|
|
5
|
+
export type { ParquetController, ParquetAction, ParquetViewState } from './controller.js';
|
|
6
|
+
export { parquetViewerCss } from './styles.js';
|
|
7
|
+
export declare const PARQUET_VIEWER_META: {
|
|
8
|
+
id: string;
|
|
9
|
+
displayNameKey: string;
|
|
10
|
+
extensions: string[];
|
|
11
|
+
priority: number;
|
|
12
|
+
requiredServices: readonly [];
|
|
13
|
+
optionalServices: readonly ["clipboard", "save"];
|
|
14
|
+
inputOwnership: "borrows";
|
|
15
|
+
};
|
|
16
|
+
export type ParquetViewerContext = HostContext & {
|
|
17
|
+
clipboard?: ClipboardService;
|
|
18
|
+
save?: FileSaveService;
|
|
19
|
+
};
|
|
20
|
+
export interface ParquetMountOptions extends MountOptions {
|
|
21
|
+
parse?: ParquetParseOptions;
|
|
22
|
+
}
|
|
23
|
+
export declare function mountParquetViewer(input: ViewerInput, container: HTMLElement, ctx: ParquetViewerContext, options?: ParquetMountOptions): Promise<ViewerHandle>;
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { PARQUET_PREVIEW_ROWS, parseParquet } from '../../parsers/parquet/index.js';
|
|
2
|
+
import { MountAbortedError, VIEWER_ROOT_CLASS } from '../types.js';
|
|
3
|
+
import { createParquetController } from './controller.js';
|
|
4
|
+
import { parquetViewerCss } from './styles.js';
|
|
5
|
+
export { createParquetController } from './controller.js';
|
|
6
|
+
export { parquetViewerCss } from './styles.js';
|
|
7
|
+
export const PARQUET_VIEWER_META = { id: 'parquet', displayNameKey: 'parquet.title', extensions: ['parquet'], priority: 20, requiredServices: [], optionalServices: ['clipboard', 'save'], inputOwnership: 'borrows' };
|
|
8
|
+
export async function mountParquetViewer(input, container, ctx, options = {}) {
|
|
9
|
+
if (options.signal?.aborted)
|
|
10
|
+
throw new MountAbortedError();
|
|
11
|
+
const parseOptions = { ...options.parse };
|
|
12
|
+
if (options.signal)
|
|
13
|
+
parseOptions.signal = options.signal;
|
|
14
|
+
let doc;
|
|
15
|
+
try {
|
|
16
|
+
doc = await parseParquet(input.data, parseOptions);
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
if (options.signal?.aborted)
|
|
20
|
+
throw new MountAbortedError();
|
|
21
|
+
throw error;
|
|
22
|
+
}
|
|
23
|
+
const ctl = createParquetController(doc), off = [];
|
|
24
|
+
let disposed = false, loadingMore = false;
|
|
25
|
+
let root = container;
|
|
26
|
+
const columnWidths = doc.headers.map((header, index) => estimateColumnWidth(header, index));
|
|
27
|
+
let resize = null;
|
|
28
|
+
if ((options.styleIsolation ?? 'shadow') === 'shadow' && container.attachShadow) {
|
|
29
|
+
root = container.shadowRoot ?? container.attachShadow({ mode: 'open' });
|
|
30
|
+
const style = el('style');
|
|
31
|
+
style.textContent = parquetViewerCss;
|
|
32
|
+
root.append(style);
|
|
33
|
+
}
|
|
34
|
+
else
|
|
35
|
+
container.classList.add(VIEWER_ROOT_CLASS, 'omni-viewer--parquet');
|
|
36
|
+
const frame = el('div', 'omni-parquet'), bar = el('div', 'omni-parquet__toolbar'), search = el('input'), view = el('button'), copy = el('button', undefined, ctx.i18n.t('parquet.copyJson')), save = el('button', undefined, ctx.i18n.t('parquet.exportJson')), info = el('span', 'omni-parquet__info');
|
|
37
|
+
frame.tabIndex = 0;
|
|
38
|
+
search.type = 'search';
|
|
39
|
+
search.placeholder = ctx.i18n.t('parquet.search');
|
|
40
|
+
bar.append(search, view, copy, save, info);
|
|
41
|
+
const warning = el('div', 'omni-parquet__warning'), warningText = el('span'), loadMore = el('button');
|
|
42
|
+
warning.append(warningText, loadMore);
|
|
43
|
+
const loadError = el('div', 'omni-parquet__error'), wrap = el('div', 'omni-parquet__wrap'), foot = el('div', 'omni-parquet__footer'), prev = el('button', undefined, ctx.i18n.t('common.prevPage')), next = el('button', undefined, ctx.i18n.t('common.nextPage')), page = el('span'), menu = el('div', 'omni-parquet__menu');
|
|
44
|
+
foot.append(prev, page, next);
|
|
45
|
+
frame.append(bar, warning, loadError, wrap, foot, menu);
|
|
46
|
+
root.append(frame);
|
|
47
|
+
const on = (target, type, fn) => { target.addEventListener(type, fn); off.push(() => target.removeEventListener(type, fn)); };
|
|
48
|
+
on(search, 'input', () => ctl.dispatch({ type: 'search', value: search.value }));
|
|
49
|
+
on(view, 'click', () => ctl.dispatch({ type: 'view', mode: ctl.state.viewMode === 'table' ? 'raw' : 'table' }));
|
|
50
|
+
on(prev, 'click', () => ctl.dispatch({ type: 'page', page: ctl.state.page - 1 }));
|
|
51
|
+
on(next, 'click', () => ctl.dispatch({ type: 'page', page: ctl.state.page + 1 }));
|
|
52
|
+
on(loadMore, 'click', () => void loadNext());
|
|
53
|
+
on(frame, 'keydown', (event) => { const e = event; if (!(e.ctrlKey || e.metaKey))
|
|
54
|
+
return; if (e.key.toLowerCase() === 'f') {
|
|
55
|
+
e.preventDefault();
|
|
56
|
+
search.focus();
|
|
57
|
+
}
|
|
58
|
+
else if (e.key.toLowerCase() === 'c' && ctx.clipboard) {
|
|
59
|
+
e.preventDefault();
|
|
60
|
+
void copyTable();
|
|
61
|
+
}
|
|
62
|
+
else if (e.key.toLowerCase() === 'j' && ctx.save) {
|
|
63
|
+
e.preventDefault();
|
|
64
|
+
void exportJson();
|
|
65
|
+
} });
|
|
66
|
+
on(document, 'mousemove', (event) => { if (!resize)
|
|
67
|
+
return; applyColumnWidth(resize.column, resize.startWidth + event.clientX - resize.startX); });
|
|
68
|
+
on(document, 'mouseup', () => { resize = null; });
|
|
69
|
+
on(document, 'click', () => hideMenu());
|
|
70
|
+
on(wrap, 'scroll', () => hideMenu());
|
|
71
|
+
if (ctx.clipboard)
|
|
72
|
+
on(copy, 'click', () => void ctx.clipboard.writeText(ctl.toJson()));
|
|
73
|
+
else {
|
|
74
|
+
copy.disabled = true;
|
|
75
|
+
copy.title = ctx.i18n.t('common.noClipboard');
|
|
76
|
+
}
|
|
77
|
+
if (ctx.save)
|
|
78
|
+
on(save, 'click', () => void exportJson());
|
|
79
|
+
else {
|
|
80
|
+
save.disabled = true;
|
|
81
|
+
save.title = ctx.i18n.t('common.noFileSave');
|
|
82
|
+
}
|
|
83
|
+
async function exportJson() { if (ctx.save)
|
|
84
|
+
await ctx.save.saveFile(input.fileName.replace(/\.parquet$/i, '') + '-export.json', new TextEncoder().encode(ctl.toJson()), 'application/json'); }
|
|
85
|
+
async function copyText(text) { if (ctx.clipboard)
|
|
86
|
+
await ctx.clipboard.writeText(text); }
|
|
87
|
+
async function copyTable() { const header = doc.headers.join('\t'), rows = ctl.filteredRows().map(row => row.map(formatCell).join('\t')).join('\n'); await copyText(`${header}\n${rows}`); }
|
|
88
|
+
function copyColumn(index) { return copyText(ctl.filteredRows().map(row => formatCell(row[index] ?? null)).join('\n')); }
|
|
89
|
+
function rowJson(row) { return JSON.stringify(Object.fromEntries(doc.headers.map((header, index) => [header || `col${index}`, row[index] ?? null])), null, 2); }
|
|
90
|
+
function showMenu(event, items) { event.preventDefault(); event.stopPropagation(); menu.replaceChildren(); items.forEach(item => { const button = el('button', undefined, item.label); button.disabled = !ctx.clipboard && item.label !== ctx.i18n.t('parquet.autoFit'); button.onclick = () => { item.action(); hideMenu(); }; menu.append(button); }); menu.style.left = `${event.clientX}px`; menu.style.top = `${event.clientY}px`; menu.style.display = 'flex'; }
|
|
91
|
+
function hideMenu() { menu.style.display = 'none'; }
|
|
92
|
+
function estimateColumnWidth(header, index) { const sample = Math.max(0, ...doc.rows.slice(0, 50).map(row => formatCell(row[index] ?? null).length * 7 + 24)); return Math.min(360, Math.max(120, header.length * 8 + 68, sample)); }
|
|
93
|
+
function applyColumnWidth(index, width) { columnWidths[index] = Math.max(48, Math.min(800, width)); const col = wrap.querySelectorAll('col')[index]; if (col)
|
|
94
|
+
col.style.width = `${columnWidths[index]}px`; const table = wrap.querySelector('table'); if (table)
|
|
95
|
+
table.style.width = `${columnWidths.reduce((sum, value) => sum + value, 0)}px`; }
|
|
96
|
+
function autoFit(index) { applyColumnWidth(index, estimateColumnWidth(doc.headers[index] ?? '', index)); }
|
|
97
|
+
async function loadNext() { if (loadingMore || disposed || !doc.isLimited)
|
|
98
|
+
return; loadingMore = true; loadError.textContent = ''; renderStatus(); try {
|
|
99
|
+
const chunk = await parseParquet(input.data, { ...parseOptions, rowStart: doc.loadedRows });
|
|
100
|
+
if (!disposed)
|
|
101
|
+
ctl.appendRows(chunk.rows);
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
if (!disposed && !options.signal?.aborted)
|
|
105
|
+
loadError.textContent = ctx.i18n.t('parquet.loadFailed', { message: error instanceof Error ? error.message : String(error) });
|
|
106
|
+
}
|
|
107
|
+
finally {
|
|
108
|
+
loadingMore = false;
|
|
109
|
+
if (!disposed)
|
|
110
|
+
renderStatus();
|
|
111
|
+
} }
|
|
112
|
+
function renderStatus() { warning.style.display = doc.isLimited ? 'flex' : 'none'; warningText.textContent = ctx.i18n.t('parquet.limited', { loaded: doc.loadedRows, total: doc.totalRows }); loadMore.disabled = loadingMore; loadMore.textContent = ctx.i18n.t(loadingMore ? 'parquet.loading' : 'parquet.loadMore', { count: PARQUET_PREVIEW_ROWS }); }
|
|
113
|
+
function render() { wrap.replaceChildren(); renderStatus(); info.textContent = `${ctl.state.matchedRows.toLocaleString()} / ${doc.loadedRows.toLocaleString()} ${ctx.i18n.t('parquet.rows')} · ${doc.headers.length} ${ctx.i18n.t('parquet.columns')}`; view.textContent = ctx.i18n.t(ctl.state.viewMode === 'table' ? 'parquet.raw' : 'parquet.table'); page.textContent = ctx.i18n.t('common.page', { page: ctl.state.page + 1, pages: ctl.state.pageCount }); prev.disabled = ctl.state.page === 0; next.disabled = ctl.state.page + 1 >= ctl.state.pageCount; if (ctl.state.viewMode === 'raw') {
|
|
114
|
+
wrap.append(el('pre', undefined, ctl.toJson()));
|
|
115
|
+
return;
|
|
116
|
+
} const table = el('table'), cols = el('colgroup'), head = el('thead'), hr = el('tr'); columnWidths.forEach(width => { const col = el('col'); col.style.width = `${width}px`; cols.append(col); }); table.style.width = `${columnWidths.reduce((sum, value) => sum + value, 0)}px`; doc.headers.forEach((h, i) => { const th = el('th'), label = el('span', undefined, h), handle = el('span', 'omni-parquet__resizer'); th.title = h; handle.title = ctx.i18n.t('parquet.resize'); handle.setAttribute('role', 'separator'); handle.tabIndex = 0; handle.onclick = (event) => event.stopPropagation(); handle.onmousedown = (event) => { event.preventDefault(); event.stopPropagation(); resize = { column: i, startX: event.clientX, startWidth: columnWidths[i] ?? 120 }; }; handle.ondblclick = (event) => { event.preventDefault(); event.stopPropagation(); autoFit(i); }; handle.onkeydown = (event) => { if (event.key === 'Enter') {
|
|
117
|
+
event.preventDefault();
|
|
118
|
+
event.stopPropagation();
|
|
119
|
+
autoFit(i);
|
|
120
|
+
}
|
|
121
|
+
else if (event.key === 'ArrowLeft' || event.key === 'ArrowRight') {
|
|
122
|
+
event.preventDefault();
|
|
123
|
+
event.stopPropagation();
|
|
124
|
+
applyColumnWidth(i, (columnWidths[i] ?? 120) + (event.key === 'ArrowRight' ? 10 : -10));
|
|
125
|
+
} }; th.onclick = () => ctl.dispatch({ type: 'sort', column: i }); th.oncontextmenu = (event) => showMenu(event, [{ label: ctx.i18n.t('parquet.copyColumn'), action: () => void copyColumn(i) }, { label: ctx.i18n.t('parquet.autoFit'), action: () => autoFit(i) }]); th.append(label, handle); hr.append(th); }); head.append(hr); const body = el('tbody'); ctl.visibleRows().forEach(row => { const tr = el('tr'); row.forEach((cell, index) => { const value = formatCell(cell), td = el('td', undefined, value); td.title = value; if (cell == null)
|
|
126
|
+
td.style.fontStyle = 'italic'; td.ondblclick = () => void copyText(value); td.oncontextmenu = (event) => showMenu(event, [{ label: ctx.i18n.t('parquet.copyCell'), action: () => void copyText(value) }, { label: ctx.i18n.t('parquet.copyRow'), action: () => void copyText(rowJson(row)) }, { label: ctx.i18n.t('parquet.copyColumn'), action: () => void copyColumn(index) }]); tr.append(td); }); body.append(tr); }); table.append(cols, head, body); wrap.append(table); }
|
|
127
|
+
const unsubscribe = ctl.subscribe(render);
|
|
128
|
+
render();
|
|
129
|
+
return { dispose() { disposed = true; unsubscribe(); off.splice(0).forEach(fn => fn()); frame.remove(); } };
|
|
130
|
+
}
|
|
131
|
+
function el(tag, className, text) { const node = document.createElement(tag); if (className)
|
|
132
|
+
node.className = className; if (text !== undefined)
|
|
133
|
+
node.textContent = text; return node; }
|
|
134
|
+
function formatCell(cell) { return typeof cell === 'object' && cell !== null ? JSON.stringify(cell) : String(cell ?? ''); }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const parquetViewerCss = "\n.omni-parquet{font:13px system-ui;color:var(--omni-fg,#222);height:100%;display:flex;flex-direction:column;position:relative}.omni-parquet__toolbar,.omni-parquet__footer{display:flex;gap:8px;align-items:center;padding:8px;border-bottom:1px solid var(--omni-border,#ddd)}.omni-parquet__toolbar input{min-width:180px;padding:5px}.omni-parquet__info{margin-left:auto;color:var(--omni-muted,#666)}.omni-parquet__warning{padding:8px;background:var(--omni-warning-bg,#fff4ce);gap:12px;align-items:center}.omni-parquet__error{color:var(--omni-error,#b42318);padding:0 8px}.omni-parquet__error:empty{display:none}.omni-parquet__wrap{overflow:auto;flex:1}.omni-parquet table{border-collapse:collapse;table-layout:fixed}.omni-parquet th,.omni-parquet td{border:1px solid var(--omni-border,#ddd);padding:6px 8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.omni-parquet th{position:sticky;top:0;background:var(--omni-header-bg,#f5f5f5);text-align:left;cursor:pointer}.omni-parquet th{position:sticky}.omni-parquet__resizer{position:absolute;right:-3px;top:0;width:7px;height:100%;cursor:col-resize;z-index:2}.omni-parquet__resizer:focus{outline:2px solid var(--omni-focus,#2684ff)}.omni-parquet__menu{display:none;position:fixed;z-index:1000;flex-direction:column;min-width:160px;padding:4px;background:var(--omni-menu-bg,#fff);border:1px solid var(--omni-border,#ccc);box-shadow:0 4px 16px #0003}.omni-parquet__menu button{text-align:left;border:0;background:transparent;padding:6px 10px}.omni-parquet__menu button:hover{background:var(--omni-hover,#eee)}.omni-parquet pre{margin:0;padding:12px;white-space:pre-wrap}.omni-parquet button:disabled{opacity:.5}\n";
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export const parquetViewerCss = `
|
|
2
|
+
.omni-parquet{font:13px system-ui;color:var(--omni-fg,#222);height:100%;display:flex;flex-direction:column;position:relative}.omni-parquet__toolbar,.omni-parquet__footer{display:flex;gap:8px;align-items:center;padding:8px;border-bottom:1px solid var(--omni-border,#ddd)}.omni-parquet__toolbar input{min-width:180px;padding:5px}.omni-parquet__info{margin-left:auto;color:var(--omni-muted,#666)}.omni-parquet__warning{padding:8px;background:var(--omni-warning-bg,#fff4ce);gap:12px;align-items:center}.omni-parquet__error{color:var(--omni-error,#b42318);padding:0 8px}.omni-parquet__error:empty{display:none}.omni-parquet__wrap{overflow:auto;flex:1}.omni-parquet table{border-collapse:collapse;table-layout:fixed}.omni-parquet th,.omni-parquet td{border:1px solid var(--omni-border,#ddd);padding:6px 8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.omni-parquet th{position:sticky;top:0;background:var(--omni-header-bg,#f5f5f5);text-align:left;cursor:pointer}.omni-parquet th{position:sticky}.omni-parquet__resizer{position:absolute;right:-3px;top:0;width:7px;height:100%;cursor:col-resize;z-index:2}.omni-parquet__resizer:focus{outline:2px solid var(--omni-focus,#2684ff)}.omni-parquet__menu{display:none;position:fixed;z-index:1000;flex-direction:column;min-width:160px;padding:4px;background:var(--omni-menu-bg,#fff);border:1px solid var(--omni-border,#ccc);box-shadow:0 4px 16px #0003}.omni-parquet__menu button{text-align:left;border:0;background:transparent;padding:6px 10px}.omni-parquet__menu button:hover{background:var(--omni-hover,#eee)}.omni-parquet pre{margin:0;padding:12px;white-space:pre-wrap}.omni-parquet button:disabled{opacity:.5}
|
|
3
|
+
`;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { AutomotiveViewerContext } from '../automotive/index.js';
|
|
2
|
+
import type { MountOptions, ViewerHandle, ViewerInput } from '../types.js';
|
|
3
|
+
export { parsePcap } from '../../parsers/pcap/index.js';
|
|
4
|
+
export { automotiveViewerCss as pcapViewerCss } from '../automotive/styles.js';
|
|
5
|
+
export type PcapViewerContext = AutomotiveViewerContext;
|
|
6
|
+
export declare const PCAP_VIEWER_META: {
|
|
7
|
+
id: string;
|
|
8
|
+
displayNameKey: string;
|
|
9
|
+
extensions: string[];
|
|
10
|
+
priority: number;
|
|
11
|
+
requiredServices: readonly [];
|
|
12
|
+
optionalServices: readonly ["clipboard"];
|
|
13
|
+
inputOwnership: "borrows";
|
|
14
|
+
};
|
|
15
|
+
export declare const mountPcapViewer: (input: ViewerInput, container: HTMLElement, ctx: PcapViewerContext, options?: MountOptions) => Promise<ViewerHandle>;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { mountAutomotiveViewer } from '../automotive/index.js';
|
|
2
|
+
export { parsePcap } from '../../parsers/pcap/index.js';
|
|
3
|
+
export { automotiveViewerCss as pcapViewerCss } from '../automotive/styles.js';
|
|
4
|
+
export const PCAP_VIEWER_META = { id: 'pcap', displayNameKey: 'pcap.title', extensions: ['pcap'], priority: 20, requiredServices: [], optionalServices: ['clipboard'], inputOwnership: 'borrows' };
|
|
5
|
+
export const mountPcapViewer = (input, container, ctx, options = {}) => mountAutomotiveViewer('pcap', input, container, ctx, options);
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { AutomotiveViewerContext } from '../automotive/index.js';
|
|
2
|
+
import type { MountOptions, ViewerHandle, ViewerInput } from '../types.js';
|
|
3
|
+
export { parsePcapng } from '../../parsers/pcapng/index.js';
|
|
4
|
+
export { automotiveViewerCss as pcapngViewerCss } from '../automotive/styles.js';
|
|
5
|
+
export type PcapngViewerContext = AutomotiveViewerContext;
|
|
6
|
+
export declare const PCAPNG_VIEWER_META: {
|
|
7
|
+
id: string;
|
|
8
|
+
displayNameKey: string;
|
|
9
|
+
extensions: string[];
|
|
10
|
+
priority: number;
|
|
11
|
+
requiredServices: readonly [];
|
|
12
|
+
optionalServices: readonly ["clipboard"];
|
|
13
|
+
inputOwnership: "borrows";
|
|
14
|
+
};
|
|
15
|
+
export declare const mountPcapngViewer: (input: ViewerInput, container: HTMLElement, ctx: PcapngViewerContext, options?: MountOptions) => Promise<ViewerHandle>;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { mountAutomotiveViewer } from '../automotive/index.js';
|
|
2
|
+
export { parsePcapng } from '../../parsers/pcapng/index.js';
|
|
3
|
+
export { automotiveViewerCss as pcapngViewerCss } from '../automotive/styles.js';
|
|
4
|
+
export const PCAPNG_VIEWER_META = { id: 'pcapng', displayNameKey: 'pcapng.title', extensions: ['pcapng'], priority: 20, requiredServices: [], optionalServices: ['clipboard'], inputOwnership: 'borrows' };
|
|
5
|
+
export const mountPcapngViewer = (input, container, ctx, options = {}) => mountAutomotiveViewer('pcapng', input, container, ctx, options);
|