@wapri/preview 0.0.0-stage → 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.
Files changed (53) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +78 -2
  3. package/dist/constant/index.d.ts +51 -0
  4. package/dist/constant/index.js +58 -0
  5. package/dist/core/context.d.ts +21 -0
  6. package/dist/core/context.js +78 -0
  7. package/dist/core/lazy.d.ts +43 -0
  8. package/dist/core/lazy.js +175 -0
  9. package/dist/core/source.d.ts +20 -0
  10. package/dist/core/source.js +118 -0
  11. package/dist/core/style.d.ts +8 -0
  12. package/dist/core/style.js +20 -0
  13. package/dist/index.d.ts +18 -0
  14. package/dist/index.js +17 -0
  15. package/dist/pdf/index.d.ts +8 -0
  16. package/dist/pdf/index.js +364 -0
  17. package/dist/pdf/load.d.ts +15 -0
  18. package/dist/pdf/load.js +78 -0
  19. package/dist/previewFile.d.ts +18 -0
  20. package/dist/previewFile.js +54 -0
  21. package/dist/text/index.d.ts +8 -0
  22. package/dist/text/index.js +118 -0
  23. package/dist/types/common.d.ts +68 -0
  24. package/dist/types/common.js +1 -0
  25. package/dist/types/pdf.d.ts +23 -0
  26. package/dist/types/pdf.js +1 -0
  27. package/dist/types/text.d.ts +14 -0
  28. package/dist/types/text.js +1 -0
  29. package/dist/types/word.d.ts +57 -0
  30. package/dist/types/word.js +1 -0
  31. package/dist/types/xlsx.d.ts +45 -0
  32. package/dist/types/xlsx.js +1 -0
  33. package/dist/vendor/pdf.worker.min.mjs +21 -0
  34. package/dist/vendor/xlsx.full.min.js +22 -0
  35. package/dist/word/font.d.ts +20 -0
  36. package/dist/word/font.js +132 -0
  37. package/dist/word/index.d.ts +8 -0
  38. package/dist/word/index.js +237 -0
  39. package/dist/word/layout.d.ts +56 -0
  40. package/dist/word/layout.js +365 -0
  41. package/dist/word/parse.d.ts +6 -0
  42. package/dist/word/parse.js +315 -0
  43. package/dist/word/render.d.ts +17 -0
  44. package/dist/word/render.js +210 -0
  45. package/dist/xlsx/index.d.ts +8 -0
  46. package/dist/xlsx/index.js +195 -0
  47. package/dist/xlsx/parse.d.ts +14 -0
  48. package/dist/xlsx/parse.js +177 -0
  49. package/dist/xlsx/render.d.ts +17 -0
  50. package/dist/xlsx/render.js +144 -0
  51. package/dist/xlsx/workerSource.d.ts +7 -0
  52. package/dist/xlsx/workerSource.js +8 -0
  53. package/package.json +28 -3
@@ -0,0 +1,195 @@
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }
3
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
4
+ function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
5
+ /**
6
+ * XLSX 预览:解析后渲染虚拟表格,多 sheet 用底部/顶部标签切换。
7
+ */
8
+
9
+ import { PREVIEW_CLASS, XLSX_DEFAULT_COL_WIDTH, XLSX_DEFAULT_ROW_HEIGHT, XLSX_MAX_CELLS } from "../constant";
10
+ import { createPreviewContext } from "../core/context";
11
+ import { resolvePreviewSource } from "../core/source";
12
+ import { parseXlsx } from "./parse";
13
+ import { createGridView } from "./render";
14
+ var resolveSheetIndex = function resolveSheetIndex(sheets, sheet) {
15
+ if (typeof sheet === 'number') {
16
+ return Math.max(0, Math.min(sheets.length - 1, Math.floor(sheet)));
17
+ }
18
+ if (typeof sheet === 'string') {
19
+ var index = sheets.findIndex(function (item) {
20
+ return item.name === sheet;
21
+ });
22
+ if (index >= 0) return index;
23
+ }
24
+ return 0;
25
+ };
26
+ export var renderXlsx = /*#__PURE__*/function () {
27
+ var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(source, options) {
28
+ var _options$maxCells;
29
+ var context, maxCells, workbook, error, tabs, activeIndex, grid, frame, updateTabs, mount, onScroll, _workbook$sheets$acti, _workbook$sheets$acti2, _grid$renderedRows, _grid5;
30
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
31
+ while (1) switch (_context.prev = _context.next) {
32
+ case 0:
33
+ context = createPreviewContext(options);
34
+ maxCells = (_options$maxCells = options.maxCells) !== null && _options$maxCells !== void 0 ? _options$maxCells : XLSX_MAX_CELLS;
35
+ context.emitProgress({
36
+ stage: 'parsing',
37
+ loaded: 0,
38
+ total: 0
39
+ });
40
+ _context.prev = 3;
41
+ _context.next = 6;
42
+ return parseXlsx(source.buffer, {
43
+ maxCells: maxCells,
44
+ worker: options.worker,
45
+ scriptUrl: options.workerScript
46
+ });
47
+ case 6:
48
+ workbook = _context.sent;
49
+ _context.next = 13;
50
+ break;
51
+ case 9:
52
+ _context.prev = 9;
53
+ _context.t0 = _context["catch"](3);
54
+ context.fail(_context.t0);
55
+ throw _context.t0;
56
+ case 13:
57
+ if (!(workbook.sheets.length === 0)) {
58
+ _context.next = 17;
59
+ break;
60
+ }
61
+ error = new Error('[preview] 工作簿里没有可预览的工作表');
62
+ context.fail(error);
63
+ throw error;
64
+ case 17:
65
+ tabs = document.createElement('div');
66
+ tabs.className = PREVIEW_CLASS.sheetTabs;
67
+ context.root.insertBefore(tabs, context.viewport);
68
+ activeIndex = resolveSheetIndex(workbook.sheets, options.sheet);
69
+ frame = 0;
70
+ updateTabs = function updateTabs() {
71
+ Array.from(tabs.children).forEach(function (child, index) {
72
+ child.classList.toggle(PREVIEW_CLASS.sheetTabActive, index === activeIndex);
73
+ });
74
+ };
75
+ mount = function mount(index) {
76
+ var _grid, _options$colWidth, _options$rowHeight;
77
+ activeIndex = index;
78
+ (_grid = grid) === null || _grid === void 0 || _grid.destroy();
79
+ context.viewport.textContent = '';
80
+ context.viewport.scrollTop = 0;
81
+ context.viewport.scrollLeft = 0;
82
+ var sheet = workbook.sheets[index];
83
+ if (!sheet) return;
84
+ grid = createGridView(sheet, {
85
+ colWidth: (_options$colWidth = options.colWidth) !== null && _options$colWidth !== void 0 ? _options$colWidth : XLSX_DEFAULT_COL_WIDTH,
86
+ rowHeight: (_options$rowHeight = options.rowHeight) !== null && _options$rowHeight !== void 0 ? _options$rowHeight : XLSX_DEFAULT_ROW_HEIGHT,
87
+ scroller: context.viewport
88
+ });
89
+ context.viewport.appendChild(grid.element);
90
+ grid.render();
91
+ updateTabs();
92
+ context.emitProgress({
93
+ stage: 'ready',
94
+ loaded: sheet.rowCount,
95
+ total: sheet.rowCount
96
+ });
97
+ };
98
+ workbook.sheets.forEach(function (sheet, index) {
99
+ var tab = document.createElement('button');
100
+ tab.type = 'button';
101
+ tab.className = PREVIEW_CLASS.sheetTab;
102
+ tab.textContent = sheet.name;
103
+ tab.addEventListener('click', function () {
104
+ return mount(index);
105
+ });
106
+ tabs.appendChild(tab);
107
+ });
108
+ onScroll = function onScroll() {
109
+ if (frame) return;
110
+ frame = requestAnimationFrame(function () {
111
+ var _grid2;
112
+ frame = 0;
113
+ (_grid2 = grid) === null || _grid2 === void 0 || _grid2.render();
114
+ });
115
+ };
116
+ context.viewport.addEventListener('scroll', onScroll, {
117
+ passive: true
118
+ });
119
+ context.onDestroy(function () {
120
+ var _grid3;
121
+ context.viewport.removeEventListener('scroll', onScroll);
122
+ if (frame) cancelAnimationFrame(frame);
123
+ (_grid3 = grid) === null || _grid3 === void 0 || _grid3.destroy();
124
+ });
125
+ mount(activeIndex);
126
+ // 首次挂载时容器可能还没完成布局,下一帧再算一次可视区域
127
+ requestAnimationFrame(function () {
128
+ var _grid4;
129
+ return (_grid4 = grid) === null || _grid4 === void 0 ? void 0 : _grid4.render();
130
+ });
131
+ _context.t1 = context.container;
132
+ _context.t2 = function renderAll() {
133
+ var _grid6;
134
+ (_grid6 = grid) === null || _grid6 === void 0 || _grid6.refresh();
135
+ };
136
+ _context.t3 = function scrollTo(row) {
137
+ var _options$rowHeight2, _grid7;
138
+ var sheet = workbook.sheets[activeIndex];
139
+ var rowHeight = (_options$rowHeight2 = options.rowHeight) !== null && _options$rowHeight2 !== void 0 ? _options$rowHeight2 : XLSX_DEFAULT_ROW_HEIGHT;
140
+ if (!sheet) return;
141
+ context.viewport.scrollTop = Math.max(0, Math.min(sheet.rowCount, row) * rowHeight);
142
+ (_grid7 = grid) === null || _grid7 === void 0 || _grid7.render();
143
+ };
144
+ _context.t4 = function refresh() {
145
+ var _grid8;
146
+ (_grid8 = grid) === null || _grid8 === void 0 || _grid8.refresh();
147
+ };
148
+ _context.t5 = function destroy() {
149
+ context.destroy();
150
+ };
151
+ return _context.abrupt("return", {
152
+ kind: 'xlsx',
153
+ container: _context.t1,
154
+ get unitCount() {
155
+ return (_workbook$sheets$acti = (_workbook$sheets$acti2 = workbook.sheets[activeIndex]) === null || _workbook$sheets$acti2 === void 0 ? void 0 : _workbook$sheets$acti2.rowCount) !== null && _workbook$sheets$acti !== void 0 ? _workbook$sheets$acti : 0;
156
+ },
157
+ get renderedCount() {
158
+ return (_grid$renderedRows = (_grid5 = grid) === null || _grid5 === void 0 ? void 0 : _grid5.renderedRows) !== null && _grid$renderedRows !== void 0 ? _grid$renderedRows : 0;
159
+ },
160
+ renderAll: _context.t2,
161
+ scrollTo: _context.t3,
162
+ refresh: _context.t4,
163
+ destroy: _context.t5
164
+ });
165
+ case 36:
166
+ case "end":
167
+ return _context.stop();
168
+ }
169
+ }, _callee, null, [[3, 9]]);
170
+ }));
171
+ return function renderXlsx(_x, _x2) {
172
+ return _ref.apply(this, arguments);
173
+ };
174
+ }();
175
+ export var previewXlsx = /*#__PURE__*/function () {
176
+ var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(input, options) {
177
+ var source;
178
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
179
+ while (1) switch (_context2.prev = _context2.next) {
180
+ case 0:
181
+ _context2.next = 2;
182
+ return resolvePreviewSource(input);
183
+ case 2:
184
+ source = _context2.sent;
185
+ return _context2.abrupt("return", renderXlsx(source, options));
186
+ case 4:
187
+ case "end":
188
+ return _context2.stop();
189
+ }
190
+ }, _callee2);
191
+ }));
192
+ return function previewXlsx(_x3, _x4) {
193
+ return _ref2.apply(this, arguments);
194
+ };
195
+ }();
@@ -0,0 +1,14 @@
1
+ /**
2
+ * XLSX 解析:优先在 worker 里用 SheetJS 解析,失败时回退主线程。
3
+ */
4
+ import type { XlsxWorkbook } from '../types/xlsx';
5
+ export interface ParseXlsxOptions {
6
+ maxCells: number;
7
+ worker?: boolean;
8
+ /** SheetJS UMD 地址,默认取包内 vendor 副本 */
9
+ scriptUrl?: string;
10
+ }
11
+ /** 用字符串拼接避免构建器把 vendor 路径当成静态资源解析 */
12
+ export declare const resolveXlsxScript: () => string | undefined;
13
+ /** 解析工作簿;worker 不可用或缺少 UMD 时自动回退主线程 */
14
+ export declare const parseXlsx: (buffer: ArrayBuffer, options: ParseXlsxOptions) => Promise<XlsxWorkbook>;
@@ -0,0 +1,177 @@
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }
3
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
4
+ function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
5
+ /**
6
+ * XLSX 解析:优先在 worker 里用 SheetJS 解析,失败时回退主线程。
7
+ */
8
+
9
+ import { createInlineWorker, WorkerChannel } from '@wapri/gbase';
10
+ import { XLSX_WORKER_SOURCE } from "./workerSource";
11
+ /** 用字符串拼接避免构建器把 vendor 路径当成静态资源解析 */
12
+ export var resolveXlsxScript = function resolveXlsxScript() {
13
+ try {
14
+ if (typeof import.meta === 'undefined' || !import.meta.url) return undefined;
15
+ var base = import.meta.url;
16
+
17
+ // 与 pdf worker 同理:file:// 是构建机路径,浏览器与 worker 都拉不到
18
+ if (!/^https?:\/\//i.test(base)) return undefined;
19
+ var dir = base.slice(0, base.lastIndexOf('/'));
20
+ return "".concat(dir, "/../vendor/xlsx.full.min.js");
21
+ } catch (_unused) {
22
+ return undefined;
23
+ }
24
+ };
25
+ var toText = function toText(cell) {
26
+ if (!cell) return '';
27
+ if (cell.w !== undefined && cell.w !== null) return String(cell.w);
28
+ if (cell.v === undefined || cell.v === null) return '';
29
+ return String(cell.v);
30
+ };
31
+ var parseInMainThread = /*#__PURE__*/function () {
32
+ var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(buffer, maxCells) {
33
+ var XLSX, workbook, sheets;
34
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
35
+ while (1) switch (_context.prev = _context.next) {
36
+ case 0:
37
+ _context.next = 2;
38
+ return import('xlsx');
39
+ case 2:
40
+ XLSX = _context.sent;
41
+ workbook = XLSX.read(new Uint8Array(buffer), {
42
+ type: 'array',
43
+ cellDates: false
44
+ });
45
+ sheets = workbook.SheetNames.map(function (name) {
46
+ var _sheet$Merges, _sheet$Cols, _sheet$Rows;
47
+ var sheet = workbook.Sheets[name];
48
+ var ref = sheet['!ref'];
49
+ if (!ref) {
50
+ return {
51
+ name: name,
52
+ rows: [],
53
+ rowCount: 0,
54
+ colCount: 0,
55
+ merges: [],
56
+ colWidths: [],
57
+ rowHeights: [],
58
+ truncated: false
59
+ };
60
+ }
61
+ var range = XLSX.utils.decode_range(ref);
62
+ var totalRows = range.e.r - range.s.r + 1;
63
+ var colCount = range.e.c - range.s.c + 1;
64
+ var truncated = totalRows * colCount > maxCells;
65
+ var rowCount = truncated ? Math.max(1, Math.floor(maxCells / Math.max(1, colCount))) : totalRows;
66
+ var rows = [];
67
+ for (var row = 0; row < rowCount; row += 1) {
68
+ var line = [];
69
+ for (var col = 0; col < colCount; col += 1) {
70
+ var address = XLSX.utils.encode_cell({
71
+ r: range.s.r + row,
72
+ c: range.s.c + col
73
+ });
74
+ line.push(toText(sheet[address]));
75
+ }
76
+ rows.push(line);
77
+ }
78
+ var merges = ((_sheet$Merges = sheet['!merges']) !== null && _sheet$Merges !== void 0 ? _sheet$Merges : []).map(function (merge) {
79
+ return {
80
+ s: {
81
+ r: merge.s.r - range.s.r,
82
+ c: merge.s.c - range.s.c
83
+ },
84
+ e: {
85
+ r: merge.e.r - range.s.r,
86
+ c: merge.e.c - range.s.c
87
+ }
88
+ };
89
+ });
90
+ var cols = (_sheet$Cols = sheet['!cols']) !== null && _sheet$Cols !== void 0 ? _sheet$Cols : [];
91
+ var colWidths = Array.from({
92
+ length: colCount
93
+ }, function (_, index) {
94
+ var info = cols[index];
95
+ return info !== null && info !== void 0 && info.wch ? Math.max(40, Math.min(400, info.wch * 8 + 8)) : 0;
96
+ });
97
+ var rowsMeta = (_sheet$Rows = sheet['!rows']) !== null && _sheet$Rows !== void 0 ? _sheet$Rows : [];
98
+ var rowHeights = Array.from({
99
+ length: rowCount
100
+ }, function (_, index) {
101
+ var info = rowsMeta[index];
102
+ return info !== null && info !== void 0 && info.hpt ? Math.max(18, Math.min(200, info.hpt * 1.333)) : 0;
103
+ });
104
+ return {
105
+ name: name,
106
+ rows: rows,
107
+ rowCount: rowCount,
108
+ colCount: colCount,
109
+ merges: merges,
110
+ colWidths: colWidths,
111
+ rowHeights: rowHeights,
112
+ truncated: truncated
113
+ };
114
+ });
115
+ return _context.abrupt("return", {
116
+ sheets: sheets
117
+ });
118
+ case 6:
119
+ case "end":
120
+ return _context.stop();
121
+ }
122
+ }, _callee);
123
+ }));
124
+ return function parseInMainThread(_x, _x2) {
125
+ return _ref.apply(this, arguments);
126
+ };
127
+ }();
128
+
129
+ /** 解析工作簿;worker 不可用或缺少 UMD 时自动回退主线程 */
130
+ export var parseXlsx = /*#__PURE__*/function () {
131
+ var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(buffer, options) {
132
+ var _options$scriptUrl;
133
+ var scriptUrl, channel, result, _channel;
134
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
135
+ while (1) switch (_context2.prev = _context2.next) {
136
+ case 0:
137
+ scriptUrl = (_options$scriptUrl = options.scriptUrl) !== null && _options$scriptUrl !== void 0 ? _options$scriptUrl : resolveXlsxScript();
138
+ if (!(options.worker !== false && scriptUrl && typeof Worker !== 'undefined')) {
139
+ _context2.next = 16;
140
+ break;
141
+ }
142
+ _context2.prev = 2;
143
+ channel = new WorkerChannel(createInlineWorker(XLSX_WORKER_SOURCE));
144
+ _context2.next = 6;
145
+ return channel.request({
146
+ type: 'parse',
147
+ payload: {
148
+ buffer: buffer,
149
+ maxCells: options.maxCells,
150
+ scriptUrl: scriptUrl
151
+ }
152
+ }, {
153
+ timeout: 120000
154
+ });
155
+ case 6:
156
+ result = _context2.sent;
157
+ return _context2.abrupt("return", result);
158
+ case 10:
159
+ _context2.prev = 10;
160
+ _context2.t0 = _context2["catch"](2);
161
+ console.warn('[preview] worker 解析 XLSX 失败,回退主线程', _context2.t0);
162
+ case 13:
163
+ _context2.prev = 13;
164
+ (_channel = channel) === null || _channel === void 0 || _channel.terminate();
165
+ return _context2.finish(13);
166
+ case 16:
167
+ return _context2.abrupt("return", parseInMainThread(buffer, options.maxCells));
168
+ case 17:
169
+ case "end":
170
+ return _context2.stop();
171
+ }
172
+ }, _callee2, null, [[2, 10, 13, 16]]);
173
+ }));
174
+ return function parseXlsx(_x3, _x4) {
175
+ return _ref2.apply(this, arguments);
176
+ };
177
+ }();
@@ -0,0 +1,17 @@
1
+ /**
2
+ * XLSX 网格渲染:按可视区域创建单元格,支持合并、列宽、行高。
3
+ */
4
+ import type { XlsxSheet } from '../types/xlsx';
5
+ export interface GridViewOptions {
6
+ colWidth: number;
7
+ rowHeight: number;
8
+ scroller: HTMLElement;
9
+ }
10
+ export interface GridView {
11
+ readonly element: HTMLElement;
12
+ readonly renderedRows: number;
13
+ render(): void;
14
+ refresh(): void;
15
+ destroy(): void;
16
+ }
17
+ export declare const createGridView: (sheet: XlsxSheet, options: GridViewOptions) => GridView;
@@ -0,0 +1,144 @@
1
+ /**
2
+ * XLSX 网格渲染:按可视区域创建单元格,支持合并、列宽、行高。
3
+ */
4
+
5
+ import { PREVIEW_CLASS } from "../constant";
6
+ var keyOf = function keyOf(row, col) {
7
+ return "".concat(row, ":").concat(col);
8
+ };
9
+ var buildOffsets = function buildOffsets(sizes) {
10
+ var offsets = Array.from({
11
+ length: sizes.length + 1
12
+ }, function () {
13
+ return 0;
14
+ });
15
+ offsets[0] = 0;
16
+ for (var index = 0; index < sizes.length; index += 1) {
17
+ offsets[index + 1] = offsets[index] + sizes[index];
18
+ }
19
+ return offsets;
20
+ };
21
+
22
+ /** 找到满足 offsets[i] <= value 的最大下标 */
23
+ var findIndex = function findIndex(offsets, value) {
24
+ var last = Math.max(0, offsets.length - 2);
25
+ var low = 0;
26
+ var high = last;
27
+ while (low < high) {
28
+ var mid = Math.ceil((low + high) / 2);
29
+ if (offsets[mid] <= value) {
30
+ low = mid;
31
+ } else {
32
+ high = mid - 1;
33
+ }
34
+ }
35
+ return Math.max(0, Math.min(last, low));
36
+ };
37
+ var MAX_MERGE_CELLS = 10000;
38
+ var MAX_MERGE_SIZE = 2000;
39
+ export var createGridView = function createGridView(sheet, options) {
40
+ var _colOffsets, _rowOffsets;
41
+ var colSizes = Array.from({
42
+ length: sheet.colCount
43
+ }, function (_, index) {
44
+ return sheet.colWidths[index] || options.colWidth;
45
+ });
46
+ var rowSizes = Array.from({
47
+ length: sheet.rowCount
48
+ }, function (_, index) {
49
+ return sheet.rowHeights[index] || options.rowHeight;
50
+ });
51
+ var colOffsets = buildOffsets(colSizes);
52
+ var rowOffsets = buildOffsets(rowSizes);
53
+ var totalWidth = (_colOffsets = colOffsets[colOffsets.length - 1]) !== null && _colOffsets !== void 0 ? _colOffsets : 0;
54
+ var totalHeight = (_rowOffsets = rowOffsets[rowOffsets.length - 1]) !== null && _rowOffsets !== void 0 ? _rowOffsets : 0;
55
+ var mergeStarts = new Map();
56
+ var mergeOwners = new Map();
57
+ sheet.merges.forEach(function (merge) {
58
+ mergeStarts.set(keyOf(merge.s.r, merge.s.c), merge);
59
+ var count = 0;
60
+ for (var row = merge.s.r; row <= merge.e.r; row += 1) {
61
+ for (var col = merge.s.c; col <= merge.e.c; col += 1) {
62
+ if (row === merge.s.r && col === merge.s.c) continue;
63
+ if (count >= MAX_MERGE_CELLS) return;
64
+ mergeOwners.set(keyOf(row, col), merge);
65
+ count += 1;
66
+ }
67
+ }
68
+ });
69
+ var element = document.createElement('div');
70
+ element.className = PREVIEW_CLASS.grid;
71
+ element.style.width = "".concat(totalWidth, "px");
72
+ element.style.height = "".concat(totalHeight, "px");
73
+ var destroyed = false;
74
+ var renderedRows = 0;
75
+ var render = function render() {
76
+ if (destroyed) return;
77
+ var scrollTop = options.scroller.scrollTop;
78
+ var scrollLeft = options.scroller.scrollLeft;
79
+ var viewHeight = options.scroller.clientHeight;
80
+ var viewWidth = options.scroller.clientWidth;
81
+ if (sheet.rowCount === 0 || sheet.colCount === 0) {
82
+ element.textContent = '';
83
+ return;
84
+ }
85
+ var rowStart = findIndex(rowOffsets, scrollTop);
86
+ var rowEnd = Math.min(sheet.rowCount - 1, findIndex(rowOffsets, scrollTop + viewHeight) + 1);
87
+ var colStart = findIndex(colOffsets, scrollLeft);
88
+ var colEnd = Math.min(sheet.colCount - 1, findIndex(colOffsets, scrollLeft + viewWidth) + 1);
89
+ var fragment = document.createDocumentFragment();
90
+ var drawn = new Set();
91
+ for (var row = rowStart; row <= rowEnd; row += 1) {
92
+ for (var col = colStart; col <= colEnd; col += 1) {
93
+ var _mergeStarts$get, _colOffsets$col, _rowOffsets$row, _colOffsets3, _rowOffsets3, _sheet$rows$row$col, _sheet$rows$row;
94
+ var merge = (_mergeStarts$get = mergeStarts.get(keyOf(row, col))) !== null && _mergeStarts$get !== void 0 ? _mergeStarts$get : mergeOwners.get(keyOf(row, col));
95
+ if (merge) {
96
+ var _colOffsets$merge$s$c, _rowOffsets$merge$s$r, _colOffsets2, _rowOffsets2, _sheet$rows$merge$s$r, _sheet$rows$merge$s$r2;
97
+ var mergeKey = keyOf(merge.s.r, merge.s.c);
98
+ if (drawn.has(mergeKey)) continue;
99
+ drawn.add(mergeKey);
100
+ var _left = (_colOffsets$merge$s$c = colOffsets[merge.s.c]) !== null && _colOffsets$merge$s$c !== void 0 ? _colOffsets$merge$s$c : 0;
101
+ var _top = (_rowOffsets$merge$s$r = rowOffsets[merge.s.r]) !== null && _rowOffsets$merge$s$r !== void 0 ? _rowOffsets$merge$s$r : 0;
102
+ var width = Math.min(MAX_MERGE_SIZE, ((_colOffsets2 = colOffsets[merge.e.c + 1]) !== null && _colOffsets2 !== void 0 ? _colOffsets2 : _left) - _left);
103
+ var height = Math.min(MAX_MERGE_SIZE, ((_rowOffsets2 = rowOffsets[merge.e.r + 1]) !== null && _rowOffsets2 !== void 0 ? _rowOffsets2 : _top) - _top);
104
+ var _cell = document.createElement('div');
105
+ _cell.className = PREVIEW_CLASS.gridCell;
106
+ _cell.style.left = "".concat(_left, "px");
107
+ _cell.style.top = "".concat(_top, "px");
108
+ _cell.style.width = "".concat(Math.max(1, width), "px");
109
+ _cell.style.height = "".concat(Math.max(1, height), "px");
110
+ _cell.textContent = (_sheet$rows$merge$s$r = (_sheet$rows$merge$s$r2 = sheet.rows[merge.s.r]) === null || _sheet$rows$merge$s$r2 === void 0 ? void 0 : _sheet$rows$merge$s$r2[merge.s.c]) !== null && _sheet$rows$merge$s$r !== void 0 ? _sheet$rows$merge$s$r : '';
111
+ fragment.appendChild(_cell);
112
+ continue;
113
+ }
114
+ var left = (_colOffsets$col = colOffsets[col]) !== null && _colOffsets$col !== void 0 ? _colOffsets$col : 0;
115
+ var top = (_rowOffsets$row = rowOffsets[row]) !== null && _rowOffsets$row !== void 0 ? _rowOffsets$row : 0;
116
+ var cell = document.createElement('div');
117
+ cell.className = PREVIEW_CLASS.gridCell;
118
+ cell.style.left = "".concat(left, "px");
119
+ cell.style.top = "".concat(top, "px");
120
+ cell.style.width = "".concat(Math.max(1, ((_colOffsets3 = colOffsets[col + 1]) !== null && _colOffsets3 !== void 0 ? _colOffsets3 : left) - left), "px");
121
+ cell.style.height = "".concat(Math.max(1, ((_rowOffsets3 = rowOffsets[row + 1]) !== null && _rowOffsets3 !== void 0 ? _rowOffsets3 : top) - top), "px");
122
+ cell.textContent = (_sheet$rows$row$col = (_sheet$rows$row = sheet.rows[row]) === null || _sheet$rows$row === void 0 ? void 0 : _sheet$rows$row[col]) !== null && _sheet$rows$row$col !== void 0 ? _sheet$rows$row$col : '';
123
+ fragment.appendChild(cell);
124
+ }
125
+ }
126
+ element.textContent = '';
127
+ element.appendChild(fragment);
128
+ renderedRows = rowEnd - rowStart + 1;
129
+ };
130
+ return {
131
+ element: element,
132
+ get renderedRows() {
133
+ return renderedRows;
134
+ },
135
+ render: render,
136
+ refresh: function refresh() {
137
+ render();
138
+ },
139
+ destroy: function destroy() {
140
+ destroyed = true;
141
+ element.remove();
142
+ }
143
+ };
144
+ };
@@ -0,0 +1,7 @@
1
+ /**
2
+ * SheetJS 解析 worker 源码(classic worker)。
3
+ *
4
+ * 以字符串形式内联,避免要求消费方额外暴露 worker 入口;SheetJS 用 importScripts 加载 UMD,
5
+ * 地址由主线程传入,包内不写死 CDN。
6
+ */
7
+ export declare const XLSX_WORKER_SOURCE = "\nfunction toText(cell) {\n if (!cell) return ''\n if (cell.w !== undefined && cell.w !== null) return String(cell.w)\n if (cell.v === undefined || cell.v === null) return ''\n return String(cell.v)\n}\n\nfunction parseSheet(name, ws, maxCells) {\n var ref = ws && ws['!ref']\n var empty = {\n name: name,\n rows: [],\n rowCount: 0,\n colCount: 0,\n merges: [],\n colWidths: [],\n rowHeights: [],\n truncated: false\n }\n\n if (!ref) return empty\n\n var range = self.XLSX.utils.decode_range(ref)\n var totalRows = range.e.r - range.s.r + 1\n var colCount = range.e.c - range.s.c + 1\n var rowCount = totalRows\n var truncated = false\n\n if (rowCount * colCount > maxCells) {\n truncated = true\n rowCount = Math.max(1, Math.floor(maxCells / Math.max(1, colCount)))\n }\n\n var rows = []\n for (var r = 0; r < rowCount; r += 1) {\n var row = []\n for (var c = 0; c < colCount; c += 1) {\n var cell = ws[self.XLSX.utils.encode_cell({ r: range.s.r + r, c: range.s.c + c })]\n row.push(toText(cell))\n }\n rows.push(row)\n }\n\n var merges = (ws['!merges'] || []).map(function (merge) {\n return {\n s: { r: merge.s.r - range.s.r, c: merge.s.c - range.s.c },\n e: { r: merge.e.r - range.s.r, c: merge.e.c - range.s.c }\n }\n })\n\n var cols = ws['!cols'] || []\n var colWidths = []\n for (var i = 0; i < colCount; i += 1) {\n var col = cols[i]\n colWidths.push(col && col.wch ? Math.max(40, Math.min(400, col.wch * 8 + 8)) : 0)\n }\n\n var rowsMeta = ws['!rows'] || []\n var rowHeights = []\n for (var j = 0; j < rowCount; j += 1) {\n var meta = rowsMeta[j]\n rowHeights.push(meta && meta.hpt ? Math.max(18, Math.min(200, meta.hpt * 1.333)) : 0)\n }\n\n return {\n name: name,\n rows: rows,\n rowCount: rowCount,\n colCount: colCount,\n merges: merges,\n colWidths: colWidths,\n rowHeights: rowHeights,\n truncated: truncated\n }\n}\n\nself.onmessage = function (event) {\n var data = event.data || {}\n\n if (data.type !== 'parse') return\n\n try {\n var payload = data.payload || {}\n\n if (!self.XLSX) {\n if (!payload.scriptUrl) throw new Error('\u7F3A\u5C11 SheetJS \u811A\u672C\u5730\u5740')\n importScripts(payload.scriptUrl)\n }\n\n var workbook = self.XLSX.read(new Uint8Array(payload.buffer), {\n type: 'array',\n cellDates: false,\n cellHTML: false,\n cellNF: false,\n cellStyles: false\n })\n var sheets = workbook.SheetNames.map(function (name) {\n return parseSheet(name, workbook.Sheets[name], payload.maxCells || 200000)\n })\n\n self.postMessage({ id: data.id, type: 'result', payload: { sheets: sheets } })\n } catch (error) {\n self.postMessage({\n id: data.id,\n type: 'error',\n error: (error && error.message) || String(error)\n })\n }\n}\n";
@@ -0,0 +1,8 @@
1
+ /**
2
+ * SheetJS 解析 worker 源码(classic worker)。
3
+ *
4
+ * 以字符串形式内联,避免要求消费方额外暴露 worker 入口;SheetJS 用 importScripts 加载 UMD,
5
+ * 地址由主线程传入,包内不写死 CDN。
6
+ */
7
+
8
+ export var XLSX_WORKER_SOURCE = "\nfunction toText(cell) {\n if (!cell) return ''\n if (cell.w !== undefined && cell.w !== null) return String(cell.w)\n if (cell.v === undefined || cell.v === null) return ''\n return String(cell.v)\n}\n\nfunction parseSheet(name, ws, maxCells) {\n var ref = ws && ws['!ref']\n var empty = {\n name: name,\n rows: [],\n rowCount: 0,\n colCount: 0,\n merges: [],\n colWidths: [],\n rowHeights: [],\n truncated: false\n }\n\n if (!ref) return empty\n\n var range = self.XLSX.utils.decode_range(ref)\n var totalRows = range.e.r - range.s.r + 1\n var colCount = range.e.c - range.s.c + 1\n var rowCount = totalRows\n var truncated = false\n\n if (rowCount * colCount > maxCells) {\n truncated = true\n rowCount = Math.max(1, Math.floor(maxCells / Math.max(1, colCount)))\n }\n\n var rows = []\n for (var r = 0; r < rowCount; r += 1) {\n var row = []\n for (var c = 0; c < colCount; c += 1) {\n var cell = ws[self.XLSX.utils.encode_cell({ r: range.s.r + r, c: range.s.c + c })]\n row.push(toText(cell))\n }\n rows.push(row)\n }\n\n var merges = (ws['!merges'] || []).map(function (merge) {\n return {\n s: { r: merge.s.r - range.s.r, c: merge.s.c - range.s.c },\n e: { r: merge.e.r - range.s.r, c: merge.e.c - range.s.c }\n }\n })\n\n var cols = ws['!cols'] || []\n var colWidths = []\n for (var i = 0; i < colCount; i += 1) {\n var col = cols[i]\n colWidths.push(col && col.wch ? Math.max(40, Math.min(400, col.wch * 8 + 8)) : 0)\n }\n\n var rowsMeta = ws['!rows'] || []\n var rowHeights = []\n for (var j = 0; j < rowCount; j += 1) {\n var meta = rowsMeta[j]\n rowHeights.push(meta && meta.hpt ? Math.max(18, Math.min(200, meta.hpt * 1.333)) : 0)\n }\n\n return {\n name: name,\n rows: rows,\n rowCount: rowCount,\n colCount: colCount,\n merges: merges,\n colWidths: colWidths,\n rowHeights: rowHeights,\n truncated: truncated\n }\n}\n\nself.onmessage = function (event) {\n var data = event.data || {}\n\n if (data.type !== 'parse') return\n\n try {\n var payload = data.payload || {}\n\n if (!self.XLSX) {\n if (!payload.scriptUrl) throw new Error('\u7F3A\u5C11 SheetJS \u811A\u672C\u5730\u5740')\n importScripts(payload.scriptUrl)\n }\n\n var workbook = self.XLSX.read(new Uint8Array(payload.buffer), {\n type: 'array',\n cellDates: false,\n cellHTML: false,\n cellNF: false,\n cellStyles: false\n })\n var sheets = workbook.SheetNames.map(function (name) {\n return parseSheet(name, workbook.Sheets[name], payload.maxCells || 200000)\n })\n\n self.postMessage({ id: data.id, type: 'result', payload: { sheets: sheets } })\n } catch (error) {\n self.postMessage({\n id: data.id,\n type: 'error',\n error: (error && error.message) || String(error)\n })\n }\n}\n";
package/package.json CHANGED
@@ -1,6 +1,31 @@
1
1
  {
2
2
  "name": "@wapri/preview",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.1.0",
4
+ "description": "H5 文件预览:文本、PDF、Word、XLSX,按可视区域懒渲染",
5
+ "license": "MIT",
6
+ "author": "wapri contributors",
7
+ "files": [
8
+ "dist"
9
+ ],
10
+ "sideEffects": false,
11
+ "module": "dist/index.js",
12
+ "types": "dist/index.d.ts",
13
+ "publishConfig": {
14
+ "access": "public",
15
+ "registry": "https://registry.npmjs.org/"
16
+ },
17
+ "dependencies": {
18
+ "mammoth": "^1.13.0",
19
+ "opentype.js": "^1.3.5",
20
+ "pdfjs-dist": "^4.10.38",
21
+ "xlsx": "^0.18.5",
22
+ "@wapri/gbase": "^2.1.0"
23
+ },
24
+ "devDependencies": {
25
+ "@types/opentype.js": "^1.3.10"
26
+ },
27
+ "scripts": {
28
+ "build": "node ../../scripts/clean-dist.mjs && father build && node ../../scripts/copy-preview-vendor.mjs",
29
+ "dev": "father dev"
30
+ }
6
31
  }