@file-viewer/core 2.0.11 → 2.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.
Files changed (114) hide show
  1. package/README.en.md +2 -2
  2. package/README.md +2 -2
  3. package/dist/config/options.d.ts +1 -1
  4. package/dist/config/options.js +1 -1
  5. package/dist/contracts/types.d.ts +71 -1
  6. package/dist/headless.d.ts +2 -2
  7. package/dist/headless.js +1 -1
  8. package/dist/index.d.ts +9 -6
  9. package/dist/index.js +105 -48
  10. package/dist/platform/assets.d.ts +3 -1
  11. package/dist/platform/assets.js +18 -2
  12. package/dist/registry/capabilities.d.ts +2 -2
  13. package/dist/registry/capabilities.js +2 -1
  14. package/dist/registry/formats.d.ts +20 -7
  15. package/dist/registry/formats.js +14 -5
  16. package/dist/registry/registry.d.ts +8 -1
  17. package/dist/registry/registry.js +29 -0
  18. package/dist/renderers/image.js +1 -10
  19. package/dist/renderers/index.d.ts +320 -2
  20. package/dist/renderers/index.js +27 -157
  21. package/dist/viewer/createViewer.js +86 -3
  22. package/package.json +17 -44
  23. package/dist/renderers/archive.d.ts +0 -2
  24. package/dist/renderers/archive.js +0 -547
  25. package/dist/renderers/archiveCache.d.ts +0 -10
  26. package/dist/renderers/archiveCache.js +0 -96
  27. package/dist/renderers/archiveFallback.d.ts +0 -7
  28. package/dist/renderers/archiveFallback.js +0 -166
  29. package/dist/renderers/archiveShared.d.ts +0 -23
  30. package/dist/renderers/archiveShared.js +0 -71
  31. package/dist/renderers/audio.d.ts +0 -8
  32. package/dist/renderers/audio.js +0 -219
  33. package/dist/renderers/cad.d.ts +0 -2
  34. package/dist/renderers/cad.js +0 -446
  35. package/dist/renderers/code.d.ts +0 -11
  36. package/dist/renderers/code.js +0 -233
  37. package/dist/renderers/data.d.ts +0 -7
  38. package/dist/renderers/data.js +0 -370
  39. package/dist/renderers/drawing.d.ts +0 -10
  40. package/dist/renderers/drawing.js +0 -882
  41. package/dist/renderers/eda.d.ts +0 -2
  42. package/dist/renderers/eda.js +0 -434
  43. package/dist/renderers/edaParser.d.ts +0 -77
  44. package/dist/renderers/edaParser.js +0 -569
  45. package/dist/renderers/email.d.ts +0 -2
  46. package/dist/renderers/email.js +0 -463
  47. package/dist/renderers/epub.d.ts +0 -2
  48. package/dist/renderers/epub.js +0 -331
  49. package/dist/renderers/geo.d.ts +0 -2
  50. package/dist/renderers/geo.js +0 -284
  51. package/dist/renderers/markdown.d.ts +0 -2
  52. package/dist/renderers/markdown.js +0 -83
  53. package/dist/renderers/model.d.ts +0 -2
  54. package/dist/renderers/model.js +0 -567
  55. package/dist/renderers/ofd.d.ts +0 -2
  56. package/dist/renderers/ofd.js +0 -256
  57. package/dist/renderers/openDocument.d.ts +0 -2
  58. package/dist/renderers/openDocument.js +0 -122
  59. package/dist/renderers/pdf.d.ts +0 -3
  60. package/dist/renderers/pdf.js +0 -1001
  61. package/dist/renderers/pdfStyles.d.ts +0 -1
  62. package/dist/renderers/pdfStyles.js +0 -1
  63. package/dist/renderers/pptx.d.ts +0 -2
  64. package/dist/renderers/pptx.js +0 -217
  65. package/dist/renderers/spreadsheet/state.d.ts +0 -80
  66. package/dist/renderers/spreadsheet/state.js +0 -96
  67. package/dist/renderers/spreadsheet/view.d.ts +0 -25
  68. package/dist/renderers/spreadsheet/view.js +0 -833
  69. package/dist/renderers/spreadsheet/worker/index.d.ts +0 -2
  70. package/dist/renderers/spreadsheet/worker/index.js +0 -1
  71. package/dist/renderers/spreadsheet/worker/sheetjs/SheetJsModel.d.ts +0 -73
  72. package/dist/renderers/spreadsheet/worker/sheetjs/SheetJsModel.js +0 -623
  73. package/dist/renderers/spreadsheet/worker/sheetjs/color.d.ts +0 -2
  74. package/dist/renderers/spreadsheet/worker/sheetjs/color.js +0 -73
  75. package/dist/renderers/spreadsheet/worker/sheetjs/index.d.ts +0 -1
  76. package/dist/renderers/spreadsheet/worker/sheetjs/index.js +0 -1
  77. package/dist/renderers/spreadsheet/worker/sheetjs/parser.d.ts +0 -18
  78. package/dist/renderers/spreadsheet/worker/sheetjs/parser.js +0 -106
  79. package/dist/renderers/spreadsheet/worker/sheetjs/sheet.worker.d.ts +0 -1
  80. package/dist/renderers/spreadsheet/worker/sheetjs/sheet.worker.js +0 -11
  81. package/dist/renderers/spreadsheet/worker/type.d.ts +0 -57
  82. package/dist/renderers/spreadsheet/worker/type.js +0 -1
  83. package/dist/renderers/spreadsheet.d.ts +0 -3
  84. package/dist/renderers/spreadsheet.js +0 -929
  85. package/dist/renderers/typst.d.ts +0 -8
  86. package/dist/renderers/typst.js +0 -547
  87. package/dist/renderers/umd/parser.d.ts +0 -30
  88. package/dist/renderers/umd/parser.js +0 -408
  89. package/dist/renderers/umd.d.ts +0 -2
  90. package/dist/renderers/umd.js +0 -297
  91. package/dist/renderers/video.d.ts +0 -8
  92. package/dist/renderers/video.js +0 -108
  93. package/dist/renderers/wordDoc.d.ts +0 -5
  94. package/dist/renderers/wordDoc.js +0 -284
  95. package/dist/renderers/wordDocx.d.ts +0 -5
  96. package/dist/renderers/wordDocx.js +0 -985
  97. package/dist/renderers/wordDocx.worker.d.ts +0 -1
  98. package/dist/renderers/wordDocx.worker.js +0 -96
  99. package/vendor/ofd/dltech/jbig2/arithmetic_decoder.js +0 -183
  100. package/vendor/ofd/dltech/jbig2/ccitt.js +0 -1070
  101. package/vendor/ofd/dltech/jbig2/compatibility.js +0 -12
  102. package/vendor/ofd/dltech/jbig2/core_utils.js +0 -180
  103. package/vendor/ofd/dltech/jbig2/is_node.js +0 -27
  104. package/vendor/ofd/dltech/jbig2/jbig2.js +0 -2589
  105. package/vendor/ofd/dltech/jbig2/jbig2_stream.js +0 -81
  106. package/vendor/ofd/dltech/jbig2/primitives.js +0 -387
  107. package/vendor/ofd/dltech/jbig2/stream.js +0 -1348
  108. package/vendor/ofd/dltech/jbig2/util.js +0 -972
  109. package/vendor/ofd/dltech/ofd/ofd.d.ts +0 -11
  110. package/vendor/ofd/dltech/ofd/ofd.js +0 -100
  111. package/vendor/ofd/dltech/ofd/ofd_parser.js +0 -395
  112. package/vendor/ofd/dltech/ofd/ofd_render.js +0 -473
  113. package/vendor/ofd/dltech/ofd/ofd_util.js +0 -350
  114. package/vendor/ofd/dltech/ofd/pipeline.js +0 -26
@@ -1,446 +0,0 @@
1
- import { CadViewer, } from '@flyfish-dev/cad-viewer';
2
- import { resolveFileViewerCadAssetUrls } from '../platform/assets.js';
3
- import { registerFileViewerZoomProvider, unregisterFileViewerZoomProvider, } from '../features/document/dom/index.js';
4
- import { createFileViewerZoomChangeEmitter } from '../features/document/zoom.js';
5
- const CAD_WORKER_TIMEOUT = 120000;
6
- const cadStyle = `
7
- .cad-shell{display:flex;height:100%;min-height:100%;flex-direction:column;background:#f5f7fb;color:#142335}
8
- .cad-shell *{box-sizing:border-box}
9
- .cad-toolbar{display:flex;min-height:48px;align-items:center;justify-content:space-between;gap:16px;padding:0 14px;border-bottom:1px solid rgba(15,23,42,.08);background:#fff}
10
- .cad-tools,.cad-meta{display:flex;align-items:center;gap:8px}
11
- .cad-tools button{min-width:34px;min-height:30px;border:0;border-radius:8px;background:rgba(15,23,42,.06);color:#25344c;cursor:pointer;font-weight:800;letter-spacing:0;transition:background-color .18s ease,color .18s ease}
12
- .cad-tools button:hover{background:rgba(31,150,110,.14);color:#0f8f62}
13
- .cad-zoom,.cad-meta span{color:#64748b;font-size:12px;font-weight:800;letter-spacing:0}
14
- .cad-meta span{border-radius:999px;padding:5px 9px;background:rgba(15,23,42,.06)}
15
- .cad-body{display:grid;min-height:0;flex:1;grid-template-columns:minmax(168px,220px) minmax(0,1fr) minmax(150px,190px);background:#eef2f7}
16
- .cad-body.without-layers{grid-template-columns:minmax(0,1fr) minmax(150px,190px)}
17
- .cad-layers,.cad-inspector{min-height:0;overflow:auto;border-right:1px solid rgba(15,23,42,.08);background:#fff}
18
- .cad-layers[hidden]{display:none}
19
- .cad-inspector{border-right:0;border-left:1px solid rgba(15,23,42,.08);padding:14px}
20
- .cad-layers-head{position:sticky;top:0;display:flex;align-items:center;justify-content:space-between;padding:12px 12px 8px;background:#fff;color:#1f2a3d;font-size:13px;z-index:1}
21
- .cad-layers-head span{color:#7b8ca5;font-size:12px;font-weight:700}
22
- .cad-layers-list{display:flex;flex-direction:column;padding:0 0 8px}
23
- .cad-layers button{display:flex;width:calc(100% - 16px);min-height:34px;align-items:center;gap:8px;margin:0 8px 6px;border:1px solid rgba(148,163,184,.22);border-radius:8px;background:#f8fafc;color:#25344c;cursor:pointer;font-size:12px;font-weight:700;text-align:left}
24
- .cad-layers button.muted{opacity:.48}
25
- .cad-layer-color{width:10px;height:10px;flex:0 0 auto;border-radius:50%;background:#1f966e;box-shadow:inset 0 0 0 1px rgba(15,23,42,.14)}
26
- .cad-canvas-wrap{position:relative;min-width:0;min-height:0;overflow:hidden;background:linear-gradient(90deg,rgba(15,23,42,.04) 1px,transparent 1px),linear-gradient(180deg,rgba(15,23,42,.04) 1px,transparent 1px),#f8fafc;background-size:28px 28px}
27
- .cad-stage{position:relative;width:100%;height:100%;min-height:420px;overflow:hidden}
28
- .cad-stage canvas{position:absolute;inset:0;display:block;width:100%!important;height:100%!important}
29
- .cad-native-stage{position:absolute;inset:0;z-index:2;display:none;overflow:hidden}
30
- .cad-native-stage:not(:empty),.cad-native-stage.is-active{display:block}
31
- .cad-native-stage *{box-sizing:border-box}
32
- .dwfv-root{height:100%;min-height:0;display:grid;grid-template-rows:auto 1fr;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;color:#111827}
33
- .dwfv-toolbar{display:flex;gap:8px;align-items:center;padding:8px 12px;background:#fff;border-bottom:1px solid #e5e7eb}
34
- .dwfv-toolbar button,.dwfv-toolbar select{font:inherit}
35
- .dwfv-workspace{min-height:0;display:grid;grid-template-columns:minmax(220px,300px) 1fr}
36
- .dwfv-tree{overflow:auto;border-right:1px solid #d6d8dd;background:#fff;font-size:12px;padding:8px}
37
- .dwfv-tree[style*="display: none"]+.dwfv-stage{grid-column:1/-1}
38
- .dwfv-tree-header{font-weight:700;margin-bottom:4px}
39
- .dwfv-tree-stats{color:#6b7280;margin-bottom:8px}
40
- .dwfv-tree details{margin-left:8px}
41
- .dwfv-tree summary{cursor:pointer;padding:2px 0}
42
- .dwfv-tree-meta{color:#6b7280;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:10px;padding-left:14px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
43
- .dwfv-stage{position:relative;overflow:hidden;background:#e5e7eb}
44
- .dwfv-canvas{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%}
45
- .dwfv-webgl-canvas{pointer-events:none}
46
- .dwfv-overlay-canvas{pointer-events:auto;touch-action:none;cursor:grab}
47
- .dwfv-overlay-canvas:active{cursor:grabbing}
48
- .dwfv-status{margin-left:auto;font-size:12px;color:#4b5563}
49
- .dwfv-warn{color:#92400e}
50
- .cad-viewer-container{position:relative;overflow:hidden;min-width:0;min-height:0}
51
- .cad-viewer-canvas{display:block;width:100%;height:100%;cursor:grab;touch-action:none;-webkit-user-select:none;user-select:none}
52
- .cad-viewer-canvas.is-dragging{cursor:grabbing}
53
- .cad-viewer-webgl-canvas{position:relative;z-index:0}
54
- .cad-viewer-text-overlay{display:block;contain:strict;-webkit-user-select:none;user-select:none}
55
- .cad-viewer-native-host{position:absolute;top:0;right:0;bottom:0;left:0;display:none;z-index:2;min-width:0;min-height:0;background:#05070d}
56
- .cad-viewer-native-host.is-active{display:block}
57
- .cad-viewer-native-host .dwfv-root{height:100%;min-height:0;color:#dbeafe;background:#05070d}
58
- .cad-viewer-native-host .dwfv-toolbar{min-height:34px;padding:5px 8px;gap:6px;border-bottom:1px solid rgba(71,85,105,.65);background:#0f172af5;color:#e5e7eb}
59
- .cad-viewer-native-host .dwfv-toolbar button,.cad-viewer-native-host .dwfv-toolbar select{height:24px;border:1px solid rgba(100,116,139,.75);border-radius:6px;background:#111827;color:#e5e7eb;font-size:12px}
60
- .cad-viewer-native-host .dwfv-toolbar button{padding:0 8px;cursor:pointer}
61
- .cad-viewer-native-host .dwfv-toolbar button:hover,.cad-viewer-native-host .dwfv-toolbar select:hover{border-color:#60a5fa;color:#bfdbfe}
62
- .cad-viewer-native-host .dwfv-status{color:#93c5fd;font-size:12px}
63
- .cad-viewer-native-host .dwfv-workspace{min-height:0;background:#05070d}
64
- .cad-viewer-native-host .dwfv-stage{background:#05070d}
65
- .cad-viewer-native-host .dwfv-tree{border-right:1px solid rgba(71,85,105,.7);background:#0f172a;color:#dbeafe}
66
- .cad-viewer-native-host .dwfv-tree-stats,.cad-viewer-native-host .dwfv-tree-meta{color:#94a3b8}
67
- .cad-viewer-native-host .dwfv-warn{color:#fbbf24}
68
- .cad-native-stage .dwfv-root,.cad-native-stage .dwfv-workspace,.cad-native-stage .dwfv-stage{width:100%;min-width:0;min-height:0}
69
- .cad-native-stage .dwfv-root{height:100%}
70
- .cad-state{position:absolute;inset:50% auto auto 50%;max-width:min(520px,calc(100% - 48px));transform:translate(-50%,-50%);border-radius:12px;padding:14px 18px;background:rgba(255,255,255,.92);box-shadow:0 14px 38px rgba(15,23,42,.12);color:#53637a;font-size:13px;font-weight:800;text-align:center}
71
- .cad-state[hidden]{display:none!important}
72
- .cad-state.error{color:#b42318}
73
- .cad-inspector strong{display:block;margin-bottom:12px;color:#1f2a3d;font-size:13px}
74
- .cad-inspector dl{display:grid;gap:8px;margin:0}
75
- .cad-inspector dl div{display:flex;align-items:center;justify-content:space-between;gap:12px;border-radius:8px;padding:8px 10px;background:#f8fafc}
76
- .cad-inspector dt,.cad-inspector dd{margin:0;font-size:12px}
77
- .cad-inspector dt{color:#7b8ca5;font-weight:700}
78
- .cad-inspector dd{color:#20304a;font-weight:900}
79
- .cad-warning{margin:12px 0 0;border-radius:8px;padding:10px;background:rgba(245,158,11,.13);color:#92400e;font-size:12px;line-height:1.55}
80
- .file-viewer[data-viewer-theme='dark'] .cad-shell{background:#111827;color:#e5edf6}
81
- .file-viewer[data-viewer-theme='dark'] .cad-toolbar,.file-viewer[data-viewer-theme='dark'] .cad-layers,.file-viewer[data-viewer-theme='dark'] .cad-inspector{background:#fff;color:#142335}
82
- @media (prefers-color-scheme:dark){.file-viewer[data-viewer-theme='system'] .cad-shell{background:#111827;color:#e5edf6}.file-viewer[data-viewer-theme='system'] .cad-toolbar,.file-viewer[data-viewer-theme='system'] .cad-layers,.file-viewer[data-viewer-theme='system'] .cad-inspector{background:#fff;color:#142335}}
83
- @media (max-width:860px){.cad-body,.cad-body.without-layers{grid-template-columns:minmax(0,1fr)}.cad-layers,.cad-inspector{display:none}}
84
- `;
85
- const createStyle = () => {
86
- const style = document.createElement('style');
87
- style.textContent = cadStyle;
88
- return style;
89
- };
90
- const createElement = (tagName, className, text) => {
91
- const element = document.createElement(tagName);
92
- if (className) {
93
- element.className = className;
94
- }
95
- if (text !== undefined) {
96
- element.textContent = text;
97
- }
98
- return element;
99
- };
100
- const normalizeType = (type) => {
101
- return (type || 'dxf').toLowerCase();
102
- };
103
- const collectLayers = (result) => {
104
- if (!result) {
105
- return [];
106
- }
107
- return Object.entries(result.document.layers)
108
- .map(([name, layer]) => ({ ...layer, name }))
109
- .sort((left, right) => left.name.localeCompare(right.name));
110
- };
111
- const formatNumber = (value) => {
112
- if (!Number.isFinite(value)) {
113
- return '0';
114
- }
115
- return new Intl.NumberFormat('zh-CN').format(Math.round(value || 0));
116
- };
117
- const getCadDocumentBaseUrl = (target) => {
118
- var _a;
119
- return ((_a = target.ownerDocument) === null || _a === void 0 ? void 0 : _a.baseURI) || 'http://localhost/';
120
- };
121
- export default async function renderCad(buffer, target, type = 'dxf', context) {
122
- var _a;
123
- const normalizedType = normalizeType(type);
124
- const options = ((_a = context === null || context === void 0 ? void 0 : context.options) === null || _a === void 0 ? void 0 : _a.cad) || {};
125
- let status = 'loading';
126
- let progressMessage = '正在加载 CAD 预览器...';
127
- let errorMessage = '';
128
- let loadResult = null;
129
- let renderStats = null;
130
- let viewState = null;
131
- let layers = [];
132
- let viewer = null;
133
- let resizeObserver = null;
134
- let abortController = null;
135
- let disposed = false;
136
- const style = createStyle();
137
- const shell = createElement('div', 'cad-shell');
138
- shell.dataset.viewerZoomProvider = 'cad';
139
- const toolbar = createElement('div', 'cad-toolbar');
140
- const tools = createElement('div', 'cad-tools');
141
- const fitButton = createElement('button', undefined, '适配');
142
- const zoomOutButton = createElement('button', undefined, '-');
143
- const zoomText = createElement('span', 'cad-zoom', '100%');
144
- const zoomInButton = createElement('button', undefined, '+');
145
- const meta = createElement('div', 'cad-meta');
146
- const typeMeta = createElement('span', undefined, normalizedType.toUpperCase());
147
- const backendMeta = createElement('span', undefined, 'AUTO');
148
- [fitButton, zoomOutButton, zoomInButton].forEach(button => {
149
- button.type = 'button';
150
- });
151
- zoomOutButton.title = '缩小';
152
- zoomInButton.title = '放大';
153
- tools.append(fitButton, zoomOutButton, zoomText, zoomInButton);
154
- meta.append(typeMeta, backendMeta);
155
- toolbar.append(tools, meta);
156
- const body = createElement('div', 'cad-body without-layers');
157
- const layersPanel = createElement('aside', 'cad-layers');
158
- layersPanel.hidden = true;
159
- const layersHead = createElement('div', 'cad-layers-head');
160
- const layersCount = createElement('span', undefined, '0 项');
161
- layersHead.append(createElement('strong', undefined, '图层'), layersCount);
162
- const layersList = createElement('div', 'cad-layers-list');
163
- layersPanel.append(layersHead, layersList);
164
- const canvasWrap = createElement('div', 'cad-canvas-wrap');
165
- const stage = createElement('div', 'cad-stage');
166
- const nativeHost = createElement('div', 'cad-native-stage');
167
- stage.append(nativeHost);
168
- const state = createElement('div', 'cad-state', progressMessage);
169
- canvasWrap.append(stage, state);
170
- const inspector = createElement('aside', 'cad-inspector');
171
- const inspectorTitle = createElement('strong', undefined, '结构');
172
- const inspectorList = createElement('dl');
173
- const warningText = createElement('p', 'cad-warning');
174
- warningText.hidden = true;
175
- inspector.append(inspectorTitle, inspectorList, warningText);
176
- body.append(layersPanel, canvasWrap, inspector);
177
- shell.append(toolbar, body);
178
- target.replaceChildren(style, shell);
179
- const buildFileName = () => {
180
- return (context === null || context === void 0 ? void 0 : context.filename) || `drawing.${normalizedType}`;
181
- };
182
- const getWarnings = () => (loadResult === null || loadResult === void 0 ? void 0 : loadResult.warnings) || (loadResult === null || loadResult === void 0 ? void 0 : loadResult.document.warnings) || [];
183
- const getZoomPercent = () => {
184
- var _a, _b, _c;
185
- const zoom = (_c = (_a = viewState === null || viewState === void 0 ? void 0 : viewState.zoomPercent) !== null && _a !== void 0 ? _a : (_b = viewer === null || viewer === void 0 ? void 0 : viewer.getZoomPercent) === null || _b === void 0 ? void 0 : _b.call(viewer)) !== null && _c !== void 0 ? _c : 100;
186
- return Number.isFinite(zoom) ? Math.round(zoom) : 100;
187
- };
188
- const getCadZoomState = () => {
189
- const ready = status === 'ready' && !!viewer;
190
- const zoomPercent = getZoomPercent();
191
- return {
192
- scale: zoomPercent / 100,
193
- label: `${zoomPercent}%`,
194
- canZoomIn: ready,
195
- canZoomOut: ready,
196
- canReset: ready,
197
- minScale: 0.05,
198
- maxScale: 16,
199
- };
200
- };
201
- const cadZoomEmitter = createFileViewerZoomChangeEmitter();
202
- const syncInspector = () => {
203
- const summary = loadResult === null || loadResult === void 0 ? void 0 : loadResult.summary;
204
- const rows = [
205
- ['实体', formatNumber(summary === null || summary === void 0 ? void 0 : summary.entityCount)],
206
- ['块', formatNumber(summary === null || summary === void 0 ? void 0 : summary.blockCount)],
207
- ['页面', formatNumber(summary === null || summary === void 0 ? void 0 : summary.pageCount)],
208
- ['绘制', formatNumber(renderStats === null || renderStats === void 0 ? void 0 : renderStats.drawn)],
209
- ];
210
- inspectorList.replaceChildren(...rows.map(([label, value]) => {
211
- const row = createElement('div');
212
- row.append(createElement('dt', undefined, label), createElement('dd', undefined, value));
213
- return row;
214
- }));
215
- const warning = getWarnings()[0];
216
- warningText.textContent = warning || '';
217
- warningText.hidden = !warning;
218
- };
219
- const syncLayers = () => {
220
- layersCount.textContent = `${layers.length} 项`;
221
- layersPanel.hidden = layers.length === 0;
222
- body.classList.toggle('without-layers', layers.length === 0);
223
- layersList.replaceChildren(...layers.map(layer => {
224
- const button = createElement('button');
225
- button.type = 'button';
226
- button.classList.toggle('muted', layer.isVisible === false || !!layer.isFrozen);
227
- const color = createElement('span', 'cad-layer-color');
228
- if (typeof layer.color === 'string') {
229
- color.style.background = layer.color;
230
- }
231
- button.append(color, createElement('span', undefined, layer.name));
232
- button.addEventListener('click', () => {
233
- const document = viewer === null || viewer === void 0 ? void 0 : viewer.getDocument();
234
- if (!(document === null || document === void 0 ? void 0 : document.layers[layer.name])) {
235
- return;
236
- }
237
- const current = document.layers[layer.name];
238
- current.isVisible = current.isVisible === false;
239
- loadResult = (viewer === null || viewer === void 0 ? void 0 : viewer.setDocument(document, buildFileName())) || null;
240
- layers = collectLayers(loadResult);
241
- syncUi();
242
- queueMicrotask(() => {
243
- viewer === null || viewer === void 0 ? void 0 : viewer.fit();
244
- cadZoomEmitter.emit();
245
- });
246
- });
247
- return button;
248
- }));
249
- };
250
- const syncState = () => {
251
- zoomText.textContent = `${getZoomPercent()}%`;
252
- backendMeta.textContent = ((renderStats === null || renderStats === void 0 ? void 0 : renderStats.backend) || 'auto').toUpperCase();
253
- state.hidden = status === 'ready';
254
- state.classList.toggle('error', status === 'error');
255
- if (status === 'loading') {
256
- state.textContent = progressMessage;
257
- }
258
- else if (status === 'error') {
259
- state.textContent = errorMessage;
260
- }
261
- };
262
- const syncUi = () => {
263
- syncState();
264
- syncLayers();
265
- syncInspector();
266
- };
267
- const updateProgress = (progress) => {
268
- const prefix = progress.format ? `${progress.format.toUpperCase()} ` : '';
269
- const percent = Number.isFinite(progress.percent) ? ` ${Math.round(progress.percent || 0)}%` : '';
270
- progressMessage = `${prefix}${progress.message}${percent}`;
271
- syncState();
272
- };
273
- const fitToView = () => {
274
- viewer === null || viewer === void 0 ? void 0 : viewer.fit();
275
- cadZoomEmitter.emit();
276
- syncState();
277
- };
278
- const zoomIn = () => {
279
- viewer === null || viewer === void 0 ? void 0 : viewer.zoomIn();
280
- cadZoomEmitter.emit();
281
- syncState();
282
- };
283
- const zoomOut = () => {
284
- viewer === null || viewer === void 0 ? void 0 : viewer.zoomOut();
285
- cadZoomEmitter.emit();
286
- syncState();
287
- };
288
- registerFileViewerZoomProvider(shell, {
289
- zoomIn: () => {
290
- zoomIn();
291
- return getCadZoomState();
292
- },
293
- zoomOut: () => {
294
- zoomOut();
295
- return getCadZoomState();
296
- },
297
- resetZoom: () => {
298
- fitToView();
299
- return getCadZoomState();
300
- },
301
- getState: getCadZoomState,
302
- subscribe: cadZoomEmitter.subscribe,
303
- });
304
- fitButton.addEventListener('click', fitToView);
305
- zoomInButton.addEventListener('click', zoomIn);
306
- zoomOutButton.addEventListener('click', zoomOut);
307
- const createViewer = () => {
308
- var _a, _b, _c, _d, _e, _f, _g;
309
- const { wasmPath, workerUrl, dwfWasmUrl } = resolveFileViewerCadAssetUrls(options, getCadDocumentBaseUrl(target));
310
- const canvasOptions = {
311
- background: '#f8fafc',
312
- foreground: '#0f172a',
313
- contrastMode: 'adaptive',
314
- minColorContrast: 2.4,
315
- showPageBounds: true,
316
- showUnsupportedMarkers: true,
317
- enableSpatialIndex: true,
318
- maxVisibleTextLabels: 2400,
319
- ...(options.canvasOptions || {}),
320
- };
321
- const nextViewer = new CadViewer({
322
- container: stage,
323
- nativeHost,
324
- renderer: options.renderer || 'auto',
325
- wasmPath,
326
- workerUrl,
327
- dwfWasmUrl,
328
- dxfEncoding: options.dxfEncoding,
329
- useWorker: (_a = options.useWorker) !== null && _a !== void 0 ? _a : true,
330
- workerTimeoutMs: (_b = options.workerTimeoutMs) !== null && _b !== void 0 ? _b : CAD_WORKER_TIMEOUT,
331
- preferDwgWasm: (_c = options.preferDwgWasm) !== null && _c !== void 0 ? _c : true,
332
- includePaperSpace: (_d = options.includePaperSpace) !== null && _d !== void 0 ? _d : true,
333
- maxInsertDepth: options.maxInsertDepth,
334
- keepRaw: (_e = options.keepRaw) !== null && _e !== void 0 ? _e : false,
335
- dwfPreferWebgl: (_f = options.dwfPreferWebgl) !== null && _f !== void 0 ? _f : true,
336
- dwfPreferWasm: (_g = options.dwfPreferWasm) !== null && _g !== void 0 ? _g : true,
337
- dwfBackground: options.dwfBackground || '#f8fafc',
338
- dwfMaxDevicePixelRatio: options.dwfMaxDevicePixelRatio,
339
- dwfMaxCanvasPixels: options.dwfMaxCanvasPixels,
340
- dwfMaxGpuCacheBytes: options.dwfMaxGpuCacheBytes,
341
- dwfMaxCachedScenes: options.dwfMaxCachedScenes,
342
- dwfLineWeightMode: options.dwfLineWeightMode,
343
- dwfMinStrokeCssPx: options.dwfMinStrokeCssPx,
344
- dwfMaxOverviewStrokeCssPx: options.dwfMaxOverviewStrokeCssPx,
345
- dwfMinTextCssPx: options.dwfMinTextCssPx,
346
- dwfMinFilledAreaCssPx: options.dwfMinFilledAreaCssPx,
347
- autoFit: true,
348
- canvasOptions,
349
- onLoadProgress: updateProgress,
350
- onRenderStats: stats => {
351
- renderStats = stats;
352
- syncState();
353
- syncInspector();
354
- },
355
- onViewChange: event => {
356
- viewState = event;
357
- cadZoomEmitter.emit();
358
- syncState();
359
- },
360
- onLoad: result => {
361
- loadResult = result;
362
- layers = collectLayers(result);
363
- syncUi();
364
- },
365
- onError: error => {
366
- errorMessage = error.message || 'CAD 文件解析失败';
367
- syncState();
368
- },
369
- });
370
- if (options.preloadDwg !== false && normalizedType === 'dwg') {
371
- void nextViewer.preloadDwg({ wasmPath, workerUrl }).catch(() => {
372
- // 预热失败不阻断真实加载,loadBuffer 会返回完整错误上下文。
373
- });
374
- }
375
- return nextViewer;
376
- };
377
- const loadCad = async () => {
378
- status = 'loading';
379
- progressMessage = '正在解析 CAD...';
380
- errorMessage = '';
381
- loadResult = null;
382
- renderStats = null;
383
- viewState = null;
384
- layers = [];
385
- syncUi();
386
- abortController === null || abortController === void 0 ? void 0 : abortController.abort();
387
- const controller = new AbortController();
388
- abortController = controller;
389
- try {
390
- viewer === null || viewer === void 0 ? void 0 : viewer.destroy();
391
- viewer = createViewer();
392
- const cadAssets = resolveFileViewerCadAssetUrls(options, getCadDocumentBaseUrl(target));
393
- const result = await viewer.loadBuffer(buffer.slice(0), buildFileName(), {
394
- signal: controller.signal,
395
- transferInputBuffer: false,
396
- dxfEncoding: options.dxfEncoding,
397
- wasmPath: cadAssets.wasmPath,
398
- workerUrl: cadAssets.workerUrl,
399
- dwfWasmUrl: cadAssets.dwfWasmUrl,
400
- });
401
- if (disposed || controller.signal.aborted) {
402
- return;
403
- }
404
- loadResult = result;
405
- layers = collectLayers(result);
406
- status = 'ready';
407
- syncUi();
408
- queueMicrotask(() => {
409
- viewer === null || viewer === void 0 ? void 0 : viewer.fit();
410
- cadZoomEmitter.emit();
411
- syncState();
412
- });
413
- }
414
- catch (reason) {
415
- if (disposed || controller.signal.aborted) {
416
- return;
417
- }
418
- console.error(reason);
419
- status = 'error';
420
- errorMessage = reason instanceof Error ? reason.message : 'CAD 文件解析失败';
421
- syncUi();
422
- }
423
- };
424
- if (typeof ResizeObserver !== 'undefined') {
425
- resizeObserver = new ResizeObserver(() => {
426
- viewer === null || viewer === void 0 ? void 0 : viewer.resize();
427
- });
428
- resizeObserver.observe(stage);
429
- }
430
- syncUi();
431
- void loadCad();
432
- return {
433
- $el: shell,
434
- unmount() {
435
- disposed = true;
436
- unregisterFileViewerZoomProvider(shell);
437
- abortController === null || abortController === void 0 ? void 0 : abortController.abort();
438
- abortController = null;
439
- resizeObserver === null || resizeObserver === void 0 ? void 0 : resizeObserver.disconnect();
440
- resizeObserver = null;
441
- viewer === null || viewer === void 0 ? void 0 : viewer.destroy();
442
- viewer = null;
443
- target.replaceChildren();
444
- },
445
- };
446
- }
@@ -1,11 +0,0 @@
1
- import type { FileViewerRenderedInstance } from '../contracts/types';
2
- /**
3
- * Framework-neutral text/code renderer.
4
- *
5
- * highlight.js core and language definitions are loaded lazily by format. HTML
6
- * and XML are highlighted as escaped source text, never executed as real DOM.
7
- * @param buffer 文本二进制内容
8
- * @param target 目标
9
- * @param type 文件扩展名,用于选择 highlight.js 语言
10
- */
11
- export default function renderText(buffer: ArrayBuffer, target: HTMLDivElement, type?: string): Promise<FileViewerRenderedInstance>;