reamkit 0.1.0-alpha.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 (162) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +95 -0
  3. package/dist/esm/bidi/algorithm.d.ts +9 -0
  4. package/dist/esm/bidi/algorithm.js +458 -0
  5. package/dist/esm/bidi/char-types.d.ts +2 -0
  6. package/dist/esm/bidi/char-types.js +439 -0
  7. package/dist/esm/bidi/index.d.ts +14 -0
  8. package/dist/esm/bidi/index.js +25 -0
  9. package/dist/esm/converter/docx-to-pdf.d.ts +15 -0
  10. package/dist/esm/converter/docx-to-pdf.js +227 -0
  11. package/dist/esm/converter/index.d.ts +4 -0
  12. package/dist/esm/converter/index.js +2 -0
  13. package/dist/esm/converter/xlsx-to-pdf.d.ts +13 -0
  14. package/dist/esm/converter/xlsx-to-pdf.js +515 -0
  15. package/dist/esm/crypto/asn1.d.ts +23 -0
  16. package/dist/esm/crypto/asn1.js +123 -0
  17. package/dist/esm/crypto/cms.d.ts +9 -0
  18. package/dist/esm/crypto/cms.js +34 -0
  19. package/dist/esm/crypto/index.d.ts +2 -0
  20. package/dist/esm/crypto/index.js +1 -0
  21. package/dist/esm/document-model/index.d.ts +1 -0
  22. package/dist/esm/document-model/index.js +0 -0
  23. package/dist/esm/document-model/types.d.ts +403 -0
  24. package/dist/esm/font/arabic-joining.d.ts +4 -0
  25. package/dist/esm/font/arabic-joining.js +97 -0
  26. package/dist/esm/font/binary-reader.d.ts +13 -0
  27. package/dist/esm/font/binary-reader.js +44 -0
  28. package/dist/esm/font/font-registry.d.ts +19 -0
  29. package/dist/esm/font/font-registry.js +39 -0
  30. package/dist/esm/font/index.d.ts +7 -0
  31. package/dist/esm/font/opentype-layout.d.ts +21 -0
  32. package/dist/esm/font/opentype-layout.js +329 -0
  33. package/dist/esm/font/ttf-parser.d.ts +29 -0
  34. package/dist/esm/font/ttf-parser.js +290 -0
  35. package/dist/esm/font/ttf-subset.d.ts +3 -0
  36. package/dist/esm/font/ttf-subset.js +201 -0
  37. package/dist/esm/fonts/index.d.ts +2 -0
  38. package/dist/esm/fonts/remote-fonts.d.ts +13 -0
  39. package/dist/esm/fonts/remote-fonts.js +94 -0
  40. package/dist/esm/hyphenation/index.d.ts +10 -0
  41. package/dist/esm/hyphenation/index.js +38 -0
  42. package/dist/esm/hyphenation/liang.d.ts +10 -0
  43. package/dist/esm/hyphenation/liang.js +79 -0
  44. package/dist/esm/hyphenation/patterns-en-us.d.ts +2 -0
  45. package/dist/esm/hyphenation/patterns-en-us.js +5 -0
  46. package/dist/esm/hyphenation/patterns-ru.d.ts +2 -0
  47. package/dist/esm/hyphenation/patterns-ru.js +5 -0
  48. package/dist/esm/index.d.ts +12 -0
  49. package/dist/esm/index.js +13 -0
  50. package/dist/esm/line-breaker/index.d.ts +2 -0
  51. package/dist/esm/line-breaker/knuth-plass.d.ts +30 -0
  52. package/dist/esm/line-breaker/knuth-plass.js +172 -0
  53. package/dist/esm/numbering/index.d.ts +1 -0
  54. package/dist/esm/numbering/state.d.ts +6 -0
  55. package/dist/esm/numbering/state.js +83 -0
  56. package/dist/esm/ooxml/drawingml/chart-parser.d.ts +3 -0
  57. package/dist/esm/ooxml/drawingml/chart-parser.js +218 -0
  58. package/dist/esm/ooxml/drawingml/colors.d.ts +17 -0
  59. package/dist/esm/ooxml/drawingml/colors.js +125 -0
  60. package/dist/esm/ooxml/drawingml/theme-parser.d.ts +1 -0
  61. package/dist/esm/ooxml/drawingml/theme-parser.js +55 -0
  62. package/dist/esm/ooxml/index.d.ts +1 -0
  63. package/dist/esm/ooxml/math/omml-parser.d.ts +4 -0
  64. package/dist/esm/ooxml/math/omml-parser.js +217 -0
  65. package/dist/esm/ooxml/spreadsheet/cell-reference.d.ts +6 -0
  66. package/dist/esm/ooxml/spreadsheet/cell-reference.js +26 -0
  67. package/dist/esm/ooxml/spreadsheet/defined-name-ref.d.ts +11 -0
  68. package/dist/esm/ooxml/spreadsheet/defined-name-ref.js +64 -0
  69. package/dist/esm/ooxml/spreadsheet/index.d.ts +12 -0
  70. package/dist/esm/ooxml/spreadsheet/index.js +7 -0
  71. package/dist/esm/ooxml/spreadsheet/number-format.d.ts +1 -0
  72. package/dist/esm/ooxml/spreadsheet/number-format.js +438 -0
  73. package/dist/esm/ooxml/spreadsheet/shared-strings-parser.d.ts +1 -0
  74. package/dist/esm/ooxml/spreadsheet/shared-strings-parser.js +47 -0
  75. package/dist/esm/ooxml/spreadsheet/styles-parser.d.ts +52 -0
  76. package/dist/esm/ooxml/spreadsheet/styles-parser.js +225 -0
  77. package/dist/esm/ooxml/spreadsheet/workbook-parser.d.ts +16 -0
  78. package/dist/esm/ooxml/spreadsheet/workbook-parser.js +90 -0
  79. package/dist/esm/ooxml/spreadsheet/worksheet-parser.d.ts +60 -0
  80. package/dist/esm/ooxml/spreadsheet/worksheet-parser.js +311 -0
  81. package/dist/esm/ooxml/wordproc/document-parser.d.ts +9 -0
  82. package/dist/esm/ooxml/wordproc/document-parser.js +274 -0
  83. package/dist/esm/ooxml/wordproc/drawing-parser.d.ts +33 -0
  84. package/dist/esm/ooxml/wordproc/drawing-parser.js +374 -0
  85. package/dist/esm/ooxml/wordproc/font-table.d.ts +15 -0
  86. package/dist/esm/ooxml/wordproc/font-table.js +82 -0
  87. package/dist/esm/ooxml/wordproc/index.d.ts +10 -0
  88. package/dist/esm/ooxml/wordproc/index.js +9 -0
  89. package/dist/esm/ooxml/wordproc/numbering-parser.d.ts +3 -0
  90. package/dist/esm/ooxml/wordproc/numbering-parser.js +89 -0
  91. package/dist/esm/ooxml/wordproc/paragraph-properties.d.ts +2 -0
  92. package/dist/esm/ooxml/wordproc/paragraph-properties.js +85 -0
  93. package/dist/esm/ooxml/wordproc/po-helpers.d.ts +14 -0
  94. package/dist/esm/ooxml/wordproc/po-helpers.js +76 -0
  95. package/dist/esm/ooxml/wordproc/po-to-flat.d.ts +2 -0
  96. package/dist/esm/ooxml/wordproc/po-to-flat.js +28 -0
  97. package/dist/esm/ooxml/wordproc/run-properties.d.ts +2 -0
  98. package/dist/esm/ooxml/wordproc/run-properties.js +82 -0
  99. package/dist/esm/ooxml/wordproc/settings-parser.d.ts +5 -0
  100. package/dist/esm/ooxml/wordproc/settings-parser.js +26 -0
  101. package/dist/esm/ooxml/wordproc/styles-parser.d.ts +3 -0
  102. package/dist/esm/ooxml/wordproc/styles-parser.js +67 -0
  103. package/dist/esm/ooxml/wordproc/table-parser.d.ts +3 -0
  104. package/dist/esm/ooxml/wordproc/table-parser.js +162 -0
  105. package/dist/esm/ooxml/wordproc/text-extractor.d.ts +1 -0
  106. package/dist/esm/ooxml/wordproc/text-extractor.js +1 -0
  107. package/dist/esm/ooxml/wordproc/xml-helpers.d.ts +9 -0
  108. package/dist/esm/ooxml/wordproc/xml-helpers.js +36 -0
  109. package/dist/esm/opc/core-properties.d.ts +11 -0
  110. package/dist/esm/opc/core-properties.js +51 -0
  111. package/dist/esm/opc/index.d.ts +5 -0
  112. package/dist/esm/opc/index.js +3 -0
  113. package/dist/esm/opc/package.d.ts +26 -0
  114. package/dist/esm/opc/package.js +113 -0
  115. package/dist/esm/opc/relationship-types.d.ts +3 -0
  116. package/dist/esm/opc/relationship-types.js +4 -0
  117. package/dist/esm/opc/relationships.d.ts +7 -0
  118. package/dist/esm/opc/relationships.js +28 -0
  119. package/dist/esm/pdf/arc-to-bezier.d.ts +5 -0
  120. package/dist/esm/pdf/arc-to-bezier.js +58 -0
  121. package/dist/esm/pdf/builtin-fonts.d.ts +2 -0
  122. package/dist/esm/pdf/chart-geometry.d.ts +64 -0
  123. package/dist/esm/pdf/chart-geometry.js +674 -0
  124. package/dist/esm/pdf/cid-font.d.ts +15 -0
  125. package/dist/esm/pdf/cid-font.js +174 -0
  126. package/dist/esm/pdf/embedded-file.d.ts +11 -0
  127. package/dist/esm/pdf/embedded-file.js +23 -0
  128. package/dist/esm/pdf/icc-profile.d.ts +1 -0
  129. package/dist/esm/pdf/icc-profile.js +166 -0
  130. package/dist/esm/pdf/image-xobject.d.ts +13 -0
  131. package/dist/esm/pdf/image-xobject.js +335 -0
  132. package/dist/esm/pdf/index.d.ts +11 -0
  133. package/dist/esm/pdf/index.js +5 -0
  134. package/dist/esm/pdf/math-layout.d.ts +45 -0
  135. package/dist/esm/pdf/math-layout.js +1138 -0
  136. package/dist/esm/pdf/objects.d.ts +32 -0
  137. package/dist/esm/pdf/objects.js +54 -0
  138. package/dist/esm/pdf/preset-geometry.d.ts +6 -0
  139. package/dist/esm/pdf/preset-geometry.js +199 -0
  140. package/dist/esm/pdf/serialize.d.ts +3 -0
  141. package/dist/esm/pdf/serialize.js +54 -0
  142. package/dist/esm/pdf/signature.d.ts +25 -0
  143. package/dist/esm/pdf/signature.js +126 -0
  144. package/dist/esm/pdf/struct-tree.d.ts +31 -0
  145. package/dist/esm/pdf/struct-tree.js +109 -0
  146. package/dist/esm/pdf/styled-page-renderer.d.ts +43 -0
  147. package/dist/esm/pdf/styled-page-renderer.js +2317 -0
  148. package/dist/esm/pdf/text-encoding.d.ts +2 -0
  149. package/dist/esm/pdf/text-page-renderer.d.ts +16 -0
  150. package/dist/esm/pdf/text-page-renderer.js +4 -0
  151. package/dist/esm/pdf/vector-graphics.d.ts +46 -0
  152. package/dist/esm/pdf/vector-graphics.js +103 -0
  153. package/dist/esm/pdf/writer.d.ts +10 -0
  154. package/dist/esm/pdf/writer.js +81 -0
  155. package/dist/esm/pdf/xmp.d.ts +13 -0
  156. package/dist/esm/pdf/xmp.js +38 -0
  157. package/dist/esm/style-cascade/index.d.ts +3 -0
  158. package/dist/esm/style-cascade/resolver.d.ts +4 -0
  159. package/dist/esm/style-cascade/resolver.js +96 -0
  160. package/dist/esm/style-cascade/types.d.ts +29 -0
  161. package/dist/esm/style-cascade/types.js +26 -0
  162. package/package.json +90 -0
@@ -0,0 +1,225 @@
1
+ import { XMLParser } from "fast-xml-parser";
2
+ //#region src/ooxml/spreadsheet/styles-parser.ts
3
+ var decoder = new TextDecoder("utf-8");
4
+ var parser = new XMLParser({
5
+ ignoreAttributes: false,
6
+ attributeNamePrefix: "@_",
7
+ textNodeName: "#text",
8
+ parseAttributeValue: false,
9
+ parseTagValue: false,
10
+ trimValues: false,
11
+ removeNSPrefix: true
12
+ });
13
+ var EMPTY_XLSX_STYLES = {
14
+ numFmts: /* @__PURE__ */ new Map(),
15
+ fonts: [],
16
+ fills: [],
17
+ borders: [],
18
+ cellXfs: []
19
+ };
20
+ function parseXlsxStyles(data) {
21
+ const xml = decoder.decode(data);
22
+ const root = asObject(parser.parse(xml)["styleSheet"]);
23
+ if (!root) return EMPTY_XLSX_STYLES;
24
+ return {
25
+ numFmts: parseNumFmts(root),
26
+ fonts: parseFonts(root),
27
+ fills: parseFills(root),
28
+ borders: parseBorders(root),
29
+ cellXfs: parseCellXfs(root)
30
+ };
31
+ }
32
+ var VALID_BORDER_STYLES = new Set([
33
+ "none",
34
+ "thin",
35
+ "medium",
36
+ "thick",
37
+ "hair",
38
+ "dashed",
39
+ "dotted",
40
+ "double",
41
+ "mediumDashed",
42
+ "dashDot",
43
+ "mediumDashDot",
44
+ "dashDotDot",
45
+ "mediumDashDotDot",
46
+ "slantDashDot"
47
+ ]);
48
+ function parseBorders(root) {
49
+ const node = asObject(root["borders"]);
50
+ if (!node) return [];
51
+ const out = [];
52
+ for (const item of asArray(node["border"])) {
53
+ const obj = asObject(item);
54
+ if (!obj) {
55
+ out.push({});
56
+ continue;
57
+ }
58
+ const border = {};
59
+ const top = parseBorderEdge(asObject(obj["top"]));
60
+ const right = parseBorderEdge(asObject(obj["right"]));
61
+ const bottom = parseBorderEdge(asObject(obj["bottom"]));
62
+ const left = parseBorderEdge(asObject(obj["left"]));
63
+ if (top) border.top = top;
64
+ if (right) border.right = right;
65
+ if (bottom) border.bottom = bottom;
66
+ if (left) border.left = left;
67
+ out.push(border);
68
+ }
69
+ return out;
70
+ }
71
+ function parseBorderEdge(node) {
72
+ if (!node) return void 0;
73
+ const styleRaw = strAttr(node, "style");
74
+ if (!styleRaw) return void 0;
75
+ if (!VALID_BORDER_STYLES.has(styleRaw)) return void 0;
76
+ const colorHex = colorOf(asObject(node["color"]));
77
+ const edge = { style: styleRaw };
78
+ if (colorHex) edge.colorHex = colorHex;
79
+ return edge;
80
+ }
81
+ function parseNumFmts(root) {
82
+ const result = /* @__PURE__ */ new Map();
83
+ const node = asObject(root["numFmts"]);
84
+ if (!node) return result;
85
+ for (const item of asArray(node["numFmt"])) {
86
+ const obj = asObject(item);
87
+ if (!obj) continue;
88
+ const id = numAttr(obj, "numFmtId");
89
+ const code = strAttr(obj, "formatCode");
90
+ if (id !== void 0 && code !== void 0) result.set(id, code);
91
+ }
92
+ return result;
93
+ }
94
+ function parseFonts(root) {
95
+ const node = asObject(root["fonts"]);
96
+ if (!node) return [];
97
+ const out = [];
98
+ for (const item of asArray(node["font"])) {
99
+ const obj = asObject(item);
100
+ if (!obj) continue;
101
+ const font = {};
102
+ const sz = childValAttr(obj, "sz");
103
+ if (sz !== void 0) {
104
+ const n = Number(sz);
105
+ if (Number.isFinite(n)) font.sizePt = n;
106
+ }
107
+ if (hasChild(obj, "b")) font.bold = childToggle(obj, "b");
108
+ if (hasChild(obj, "i")) font.italic = childToggle(obj, "i");
109
+ if (hasChild(obj, "u")) font.underline = childToggle(obj, "u");
110
+ const colorRgb = colorOf(asObject(obj["color"]));
111
+ if (colorRgb) font.colorHex = colorRgb;
112
+ const nameVal = childValAttr(obj, "name");
113
+ if (nameVal) font.name = nameVal;
114
+ out.push(font);
115
+ }
116
+ return out;
117
+ }
118
+ function parseFills(root) {
119
+ const node = asObject(root["fills"]);
120
+ if (!node) return [];
121
+ const out = [];
122
+ for (const item of asArray(node["fill"])) {
123
+ const obj = asObject(item);
124
+ if (!obj) continue;
125
+ const fill = {};
126
+ const pf = asObject(obj["patternFill"]);
127
+ if (pf) {
128
+ const pt = strAttr(pf, "patternType");
129
+ if (pt) fill.patternType = pt;
130
+ const fg = colorOf(asObject(pf["fgColor"]));
131
+ const bg = colorOf(asObject(pf["bgColor"]));
132
+ if (fg) fill.fgColorHex = fg;
133
+ if (bg) fill.bgColorHex = bg;
134
+ }
135
+ out.push(fill);
136
+ }
137
+ return out;
138
+ }
139
+ function parseCellXfs(root) {
140
+ const node = asObject(root["cellXfs"]);
141
+ if (!node) return [];
142
+ const out = [];
143
+ for (const item of asArray(node["xf"])) {
144
+ const obj = asObject(item);
145
+ if (!obj) continue;
146
+ const xf = {
147
+ numFmtId: numAttr(obj, "numFmtId") ?? 0,
148
+ fontId: numAttr(obj, "fontId") ?? 0,
149
+ fillId: numAttr(obj, "fillId") ?? 0,
150
+ borderId: numAttr(obj, "borderId") ?? 0
151
+ };
152
+ const applyNumberFormat = boolAttr(obj, "applyNumberFormat");
153
+ const applyFont = boolAttr(obj, "applyFont");
154
+ const applyFill = boolAttr(obj, "applyFill");
155
+ const applyBorder = boolAttr(obj, "applyBorder");
156
+ const applyAlignment = boolAttr(obj, "applyAlignment");
157
+ if (applyNumberFormat !== void 0) xf.applyNumberFormat = applyNumberFormat;
158
+ if (applyFont !== void 0) xf.applyFont = applyFont;
159
+ if (applyFill !== void 0) xf.applyFill = applyFill;
160
+ if (applyBorder !== void 0) xf.applyBorder = applyBorder;
161
+ if (applyAlignment !== void 0) xf.applyAlignment = applyAlignment;
162
+ const align = asObject(obj["alignment"]);
163
+ if (align) {
164
+ const a = {};
165
+ const h = strAttr(align, "horizontal");
166
+ const v = strAttr(align, "vertical");
167
+ const wrap = boolAttr(align, "wrapText");
168
+ if (h) a.horizontal = h;
169
+ if (v) a.vertical = v;
170
+ if (wrap !== void 0) a.wrapText = wrap;
171
+ if (Object.keys(a).length > 0) xf.alignment = a;
172
+ }
173
+ out.push(xf);
174
+ }
175
+ return out;
176
+ }
177
+ function asObject(v) {
178
+ if (!v || typeof v !== "object" || Array.isArray(v)) return void 0;
179
+ return v;
180
+ }
181
+ function asArray(v) {
182
+ if (v === null || v === void 0) return [];
183
+ return Array.isArray(v) ? v : [v];
184
+ }
185
+ function strAttr(obj, name) {
186
+ const v = obj[`@_${name}`];
187
+ return typeof v === "string" ? v : void 0;
188
+ }
189
+ function numAttr(obj, name) {
190
+ const v = strAttr(obj, name);
191
+ if (v === void 0) return void 0;
192
+ const n = Number(v);
193
+ return Number.isFinite(n) ? n : void 0;
194
+ }
195
+ function boolAttr(obj, name) {
196
+ const v = strAttr(obj, name);
197
+ if (v === void 0) return void 0;
198
+ return v === "1" || v === "true";
199
+ }
200
+ function childValAttr(obj, childName) {
201
+ const child = asObject(obj[childName]);
202
+ if (!child) return void 0;
203
+ return strAttr(child, "val");
204
+ }
205
+ function hasChild(obj, childName) {
206
+ return childName in obj;
207
+ }
208
+ function childToggle(obj, childName) {
209
+ const child = obj[childName];
210
+ if (child === "" || child === null || child === void 0) return true;
211
+ if (typeof child !== "object") return true;
212
+ const val = strAttr(child, "val");
213
+ if (val === void 0) return true;
214
+ return !(val === "false" || val === "0");
215
+ }
216
+ function colorOf(node) {
217
+ if (!node) return void 0;
218
+ const rgb = strAttr(node, "rgb");
219
+ if (rgb) {
220
+ if (/^[0-9A-Fa-f]{8}$/.test(rgb)) return rgb.substring(2).toUpperCase();
221
+ if (/^[0-9A-Fa-f]{6}$/.test(rgb)) return rgb.toUpperCase();
222
+ }
223
+ }
224
+ //#endregion
225
+ export { EMPTY_XLSX_STYLES, parseXlsxStyles };
@@ -0,0 +1,16 @@
1
+ export interface SheetReference {
2
+ readonly name: string;
3
+ readonly sheetId: string;
4
+ readonly relationshipId: string;
5
+ }
6
+ export interface DefinedName {
7
+ readonly name: string;
8
+ readonly localSheetId?: number;
9
+ readonly value: string;
10
+ }
11
+ export interface ParsedWorkbook {
12
+ readonly sheets: ReadonlyArray<SheetReference>;
13
+ readonly date1904: boolean;
14
+ readonly definedNames: ReadonlyArray<DefinedName>;
15
+ }
16
+ export declare function parseWorkbook(data: Uint8Array): ParsedWorkbook;
@@ -0,0 +1,90 @@
1
+ import { XMLParser } from "fast-xml-parser";
2
+ //#region src/ooxml/spreadsheet/workbook-parser.ts
3
+ var decoder = new TextDecoder("utf-8");
4
+ var parser = new XMLParser({
5
+ ignoreAttributes: false,
6
+ attributeNamePrefix: "@_",
7
+ textNodeName: "#text",
8
+ parseAttributeValue: false,
9
+ parseTagValue: false,
10
+ trimValues: false,
11
+ removeNSPrefix: true
12
+ });
13
+ function parseWorkbook(data) {
14
+ const xml = decoder.decode(data);
15
+ const workbook = parser.parse(xml)["workbook"];
16
+ if (!workbook || typeof workbook !== "object") return {
17
+ sheets: [],
18
+ date1904: false,
19
+ definedNames: []
20
+ };
21
+ const wbObj = workbook;
22
+ const date1904 = parseDate1904(wbObj);
23
+ const definedNames = parseDefinedNames(wbObj);
24
+ const sheets = wbObj["sheets"];
25
+ if (!sheets || typeof sheets !== "object") return {
26
+ sheets: [],
27
+ date1904,
28
+ definedNames
29
+ };
30
+ const sheetRaw = sheets["sheet"];
31
+ const items = Array.isArray(sheetRaw) ? sheetRaw : sheetRaw !== void 0 ? [sheetRaw] : [];
32
+ const out = [];
33
+ for (const item of items) {
34
+ if (!item || typeof item !== "object") continue;
35
+ const obj = item;
36
+ const name = strAttr(obj, "name");
37
+ const sheetId = strAttr(obj, "sheetId");
38
+ const rId = strAttr(obj, "r:id") ?? strAttr(obj, "id");
39
+ if (!name || !rId) continue;
40
+ out.push({
41
+ name,
42
+ sheetId: sheetId ?? "",
43
+ relationshipId: rId
44
+ });
45
+ }
46
+ return {
47
+ sheets: out,
48
+ date1904,
49
+ definedNames
50
+ };
51
+ }
52
+ function parseDefinedNames(wbObj) {
53
+ const node = wbObj["definedNames"];
54
+ if (!node || typeof node !== "object") return [];
55
+ const raw = node["definedName"];
56
+ const items = Array.isArray(raw) ? raw : raw !== void 0 ? [raw] : [];
57
+ const out = [];
58
+ for (const item of items) {
59
+ if (!item || typeof item !== "object") continue;
60
+ const obj = item;
61
+ const name = strAttr(obj, "name");
62
+ if (!name) continue;
63
+ const value = textOf(obj["#text"]);
64
+ const localRaw = strAttr(obj, "localSheetId");
65
+ const localSheetId = localRaw !== void 0 ? Number(localRaw) : void 0;
66
+ out.push({
67
+ name,
68
+ value,
69
+ ...localSheetId !== void 0 && Number.isInteger(localSheetId) ? { localSheetId } : {}
70
+ });
71
+ }
72
+ return out;
73
+ }
74
+ function textOf(node) {
75
+ if (typeof node === "string") return node;
76
+ if (typeof node === "number") return String(node);
77
+ return "";
78
+ }
79
+ function parseDate1904(wbObj) {
80
+ const pr = wbObj["workbookPr"];
81
+ if (!pr || typeof pr !== "object") return false;
82
+ const raw = strAttr(pr, "date1904");
83
+ return raw === "1" || raw === "true";
84
+ }
85
+ function strAttr(obj, key) {
86
+ const v = obj[`@_${key}`];
87
+ return typeof v === "string" ? v : void 0;
88
+ }
89
+ //#endregion
90
+ export { parseWorkbook };
@@ -0,0 +1,60 @@
1
+ export type CellType = 'n' | 's' | 'str' | 'b' | 'd' | 'e' | 'inlineStr';
2
+ export interface WorksheetCell {
3
+ readonly column: number;
4
+ readonly row: number;
5
+ readonly type: CellType;
6
+ readonly rawValue: string;
7
+ readonly inlineText?: string;
8
+ readonly styleIndex?: number;
9
+ }
10
+ export interface ColumnWidth {
11
+ readonly min: number;
12
+ readonly max: number;
13
+ readonly widthChars: number;
14
+ }
15
+ export interface MergedRange {
16
+ readonly startColumn: number;
17
+ readonly startRow: number;
18
+ readonly endColumn: number;
19
+ readonly endRow: number;
20
+ }
21
+ export interface RowHeight {
22
+ readonly row: number;
23
+ readonly heightPt: number;
24
+ readonly customHeight: boolean;
25
+ }
26
+ export interface XlsxPageMargins {
27
+ readonly leftInches: number;
28
+ readonly rightInches: number;
29
+ readonly topInches: number;
30
+ readonly bottomInches: number;
31
+ readonly headerInches?: number;
32
+ readonly footerInches?: number;
33
+ }
34
+ export interface XlsxPageSetup {
35
+ readonly paperSize?: number;
36
+ readonly orientation?: 'portrait' | 'landscape' | 'default';
37
+ readonly scale?: number;
38
+ readonly fitToWidth?: number;
39
+ readonly fitToHeight?: number;
40
+ }
41
+ export interface XlsxPrintOptions {
42
+ readonly gridLines?: boolean;
43
+ readonly horizontalCentered?: boolean;
44
+ readonly verticalCentered?: boolean;
45
+ }
46
+ export interface ParsedWorksheet {
47
+ readonly cells: ReadonlyArray<WorksheetCell>;
48
+ readonly maxRow: number;
49
+ readonly maxColumn: number;
50
+ readonly columns: ReadonlyArray<ColumnWidth>;
51
+ readonly merges: ReadonlyArray<MergedRange>;
52
+ readonly rowHeights: ReadonlyArray<RowHeight>;
53
+ readonly pageMargins?: XlsxPageMargins;
54
+ readonly pageSetup?: XlsxPageSetup;
55
+ readonly fitToPage?: boolean;
56
+ readonly printOptions?: XlsxPrintOptions;
57
+ readonly rowBreaks?: ReadonlyArray<number>;
58
+ readonly colBreaks?: ReadonlyArray<number>;
59
+ }
60
+ export declare function parseWorksheet(data: Uint8Array): ParsedWorksheet;
@@ -0,0 +1,311 @@
1
+ import { parseCellRef } from "./cell-reference.js";
2
+ import { XMLParser } from "fast-xml-parser";
3
+ //#region src/ooxml/spreadsheet/worksheet-parser.ts
4
+ var decoder = new TextDecoder("utf-8");
5
+ var parser = new XMLParser({
6
+ ignoreAttributes: false,
7
+ attributeNamePrefix: "@_",
8
+ textNodeName: "#text",
9
+ parseAttributeValue: false,
10
+ parseTagValue: false,
11
+ trimValues: false,
12
+ removeNSPrefix: true
13
+ });
14
+ function parseWorksheet(data) {
15
+ const xml = decoder.decode(data);
16
+ const worksheet = parser.parse(xml)["worksheet"];
17
+ const emptyExtras = () => ({
18
+ columns: [],
19
+ merges: [],
20
+ rowHeights: []
21
+ });
22
+ if (!worksheet || typeof worksheet !== "object") return {
23
+ cells: [],
24
+ maxRow: -1,
25
+ maxColumn: -1,
26
+ ...emptyExtras()
27
+ };
28
+ const wsObj = worksheet;
29
+ const pageMargins = parsePageMargins(wsObj);
30
+ const pageSetup = parsePageSetup(wsObj);
31
+ const fitToPage = parseFitToPage(wsObj);
32
+ const printOptions = parsePrintOptions(wsObj);
33
+ const rowBreaks = parseBreaks(wsObj, "rowBreaks");
34
+ const colBreaks = parseBreaks(wsObj, "colBreaks");
35
+ const printModel = {
36
+ ...pageMargins ? { pageMargins } : {},
37
+ ...pageSetup ? { pageSetup } : {},
38
+ ...fitToPage ? { fitToPage } : {},
39
+ ...printOptions ? { printOptions } : {},
40
+ ...rowBreaks.length > 0 ? { rowBreaks } : {},
41
+ ...colBreaks.length > 0 ? { colBreaks } : {}
42
+ };
43
+ const sheetData = wsObj["sheetData"];
44
+ if (!sheetData || typeof sheetData !== "object") return {
45
+ cells: [],
46
+ maxRow: -1,
47
+ maxColumn: -1,
48
+ columns: parseColumns(wsObj),
49
+ merges: parseMerges(wsObj),
50
+ rowHeights: [],
51
+ ...printModel
52
+ };
53
+ const rowRaw = sheetData["row"];
54
+ const rows = Array.isArray(rowRaw) ? rowRaw : rowRaw !== void 0 ? [rowRaw] : [];
55
+ const cells = [];
56
+ const rowHeights = [];
57
+ let maxRow = -1;
58
+ let maxColumn = -1;
59
+ let currentRow = -1;
60
+ for (const row of rows) {
61
+ if (!row || typeof row !== "object") continue;
62
+ const obj = row;
63
+ const explicitRow = parseRowIndex(obj);
64
+ currentRow = explicitRow !== void 0 ? explicitRow : currentRow + 1;
65
+ const height = parseRowHeight(obj, currentRow);
66
+ if (height) rowHeights.push(height);
67
+ const cellRaw = obj["c"];
68
+ const rowCells = Array.isArray(cellRaw) ? cellRaw : cellRaw !== void 0 ? [cellRaw] : [];
69
+ let prevCol = -1;
70
+ for (const c of rowCells) {
71
+ const parsed = parseCell(c, currentRow, prevCol + 1);
72
+ if (!parsed) continue;
73
+ prevCol = parsed.column;
74
+ cells.push(parsed);
75
+ if (parsed.row > maxRow) maxRow = parsed.row;
76
+ if (parsed.column > maxColumn) maxColumn = parsed.column;
77
+ }
78
+ }
79
+ return {
80
+ cells,
81
+ maxRow,
82
+ maxColumn,
83
+ columns: parseColumns(wsObj),
84
+ merges: parseMerges(wsObj),
85
+ rowHeights,
86
+ ...printModel
87
+ };
88
+ }
89
+ function parseRowIndex(obj) {
90
+ const raw = strAttr(obj, "r");
91
+ if (!raw) return void 0;
92
+ const n = Number(raw);
93
+ return Number.isInteger(n) && n > 0 ? n - 1 : void 0;
94
+ }
95
+ function parseRowHeight(obj, rowIndex) {
96
+ if (rowIndex === void 0) return void 0;
97
+ const htRaw = strAttr(obj, "ht");
98
+ if (htRaw === void 0) return void 0;
99
+ const heightPt = Number(htRaw);
100
+ if (!Number.isFinite(heightPt)) return void 0;
101
+ const customRaw = strAttr(obj, "customHeight");
102
+ return {
103
+ row: rowIndex,
104
+ heightPt,
105
+ customHeight: customRaw === "1" || customRaw === "true"
106
+ };
107
+ }
108
+ function parsePageMargins(ws) {
109
+ const node = ws["pageMargins"];
110
+ if (!node || typeof node !== "object") return void 0;
111
+ const obj = node;
112
+ const left = parseNumericAttr(obj, "left");
113
+ const right = parseNumericAttr(obj, "right");
114
+ const top = parseNumericAttr(obj, "top");
115
+ const bottom = parseNumericAttr(obj, "bottom");
116
+ if (left === void 0 || right === void 0 || top === void 0 || bottom === void 0) return;
117
+ const header = parseNumericAttr(obj, "header");
118
+ const footer = parseNumericAttr(obj, "footer");
119
+ return {
120
+ leftInches: left,
121
+ rightInches: right,
122
+ topInches: top,
123
+ bottomInches: bottom,
124
+ ...header !== void 0 ? { headerInches: header } : {},
125
+ ...footer !== void 0 ? { footerInches: footer } : {}
126
+ };
127
+ }
128
+ function parsePageSetup(ws) {
129
+ const node = ws["pageSetup"];
130
+ if (!node || typeof node !== "object") return void 0;
131
+ const obj = node;
132
+ const paperSize = parseNumericAttr(obj, "paperSize");
133
+ const orientationRaw = strAttr(obj, "orientation");
134
+ const orientation = orientationRaw === "portrait" || orientationRaw === "landscape" || orientationRaw === "default" ? orientationRaw : void 0;
135
+ const scale = parseNumericAttr(obj, "scale");
136
+ const fitToWidth = parseNumericAttr(obj, "fitToWidth");
137
+ const fitToHeight = parseNumericAttr(obj, "fitToHeight");
138
+ if (paperSize === void 0 && orientation === void 0 && scale === void 0 && fitToWidth === void 0 && fitToHeight === void 0) return;
139
+ return {
140
+ ...paperSize !== void 0 ? { paperSize: Math.round(paperSize) } : {},
141
+ ...orientation !== void 0 ? { orientation } : {},
142
+ ...scale !== void 0 ? { scale } : {},
143
+ ...fitToWidth !== void 0 ? { fitToWidth: Math.round(fitToWidth) } : {},
144
+ ...fitToHeight !== void 0 ? { fitToHeight: Math.round(fitToHeight) } : {}
145
+ };
146
+ }
147
+ function parseFitToPage(ws) {
148
+ const sheetPr = ws["sheetPr"];
149
+ if (!sheetPr || typeof sheetPr !== "object") return false;
150
+ const pr = sheetPr["pageSetUpPr"];
151
+ if (!pr || typeof pr !== "object") return false;
152
+ const raw = strAttr(pr, "fitToPage");
153
+ return raw === "1" || raw === "true";
154
+ }
155
+ function parsePrintOptions(ws) {
156
+ const node = ws["printOptions"];
157
+ if (!node || typeof node !== "object") return void 0;
158
+ const obj = node;
159
+ const flag = (key) => {
160
+ const raw = strAttr(obj, key);
161
+ if (raw === void 0) return void 0;
162
+ return raw === "1" || raw === "true";
163
+ };
164
+ const gridLines = flag("gridLines");
165
+ const horizontalCentered = flag("horizontalCentered");
166
+ const verticalCentered = flag("verticalCentered");
167
+ if (gridLines === void 0 && horizontalCentered === void 0 && verticalCentered === void 0) return;
168
+ return {
169
+ ...gridLines !== void 0 ? { gridLines } : {},
170
+ ...horizontalCentered !== void 0 ? { horizontalCentered } : {},
171
+ ...verticalCentered !== void 0 ? { verticalCentered } : {}
172
+ };
173
+ }
174
+ function parseBreaks(ws, tag) {
175
+ const node = ws[tag];
176
+ if (!node || typeof node !== "object") return [];
177
+ const brkRaw = node["brk"];
178
+ const items = Array.isArray(brkRaw) ? brkRaw : brkRaw !== void 0 ? [brkRaw] : [];
179
+ const out = [];
180
+ for (const b of items) {
181
+ if (!b || typeof b !== "object") continue;
182
+ const id = parseNumericAttr(b, "id");
183
+ if (id !== void 0 && Number.isInteger(id) && id >= 0) out.push(id);
184
+ }
185
+ return out;
186
+ }
187
+ function parseNumericAttr(obj, key) {
188
+ const raw = strAttr(obj, key);
189
+ if (raw === void 0) return void 0;
190
+ const n = Number(raw);
191
+ return Number.isFinite(n) ? n : void 0;
192
+ }
193
+ function parseColumns(ws) {
194
+ const colsNode = ws["cols"];
195
+ if (!colsNode || typeof colsNode !== "object") return [];
196
+ const colRaw = colsNode["col"];
197
+ const items = Array.isArray(colRaw) ? colRaw : colRaw !== void 0 ? [colRaw] : [];
198
+ const out = [];
199
+ for (const c of items) {
200
+ if (!c || typeof c !== "object") continue;
201
+ const obj = c;
202
+ const min = Number(strAttr(obj, "min"));
203
+ const max = Number(strAttr(obj, "max"));
204
+ const width = Number(strAttr(obj, "width"));
205
+ if (Number.isFinite(min) && Number.isFinite(max) && Number.isFinite(width)) out.push({
206
+ min,
207
+ max,
208
+ widthChars: width
209
+ });
210
+ }
211
+ return out;
212
+ }
213
+ function parseMerges(ws) {
214
+ const mergeNode = ws["mergeCells"];
215
+ if (!mergeNode || typeof mergeNode !== "object") return [];
216
+ const mergeRaw = mergeNode["mergeCell"];
217
+ const items = Array.isArray(mergeRaw) ? mergeRaw : mergeRaw !== void 0 ? [mergeRaw] : [];
218
+ const out = [];
219
+ for (const m of items) {
220
+ if (!m || typeof m !== "object") continue;
221
+ const ref = strAttr(m, "ref");
222
+ if (!ref) continue;
223
+ const colonIdx = ref.indexOf(":");
224
+ if (colonIdx < 0) continue;
225
+ try {
226
+ const start = parseCellRef(ref.substring(0, colonIdx));
227
+ const end = parseCellRef(ref.substring(colonIdx + 1));
228
+ const range = {
229
+ startColumn: Math.min(start.column, end.column),
230
+ startRow: Math.min(start.row, end.row),
231
+ endColumn: Math.max(start.column, end.column),
232
+ endRow: Math.max(start.row, end.row)
233
+ };
234
+ out.push(range);
235
+ } catch {}
236
+ }
237
+ return out;
238
+ }
239
+ function parseCell(c, fallbackRow, fallbackCol) {
240
+ if (!c || typeof c !== "object") return null;
241
+ const obj = c;
242
+ const ref = strAttr(obj, "r");
243
+ let address;
244
+ if (ref) try {
245
+ address = parseCellRef(ref);
246
+ } catch {
247
+ return null;
248
+ }
249
+ else address = {
250
+ column: fallbackCol,
251
+ row: fallbackRow
252
+ };
253
+ const type = validateCellType(strAttr(obj, "t") ?? "n");
254
+ const styleStr = strAttr(obj, "s");
255
+ const styleIndex = styleStr !== void 0 ? Number(styleStr) : void 0;
256
+ const v = obj["v"];
257
+ const rawValue = textOf(v);
258
+ const base = {
259
+ column: address.column,
260
+ row: address.row,
261
+ type
262
+ };
263
+ if (type === "inlineStr") {
264
+ const is = obj["is"];
265
+ const inlineText = inlineStringText(is);
266
+ return {
267
+ ...base,
268
+ rawValue: "",
269
+ inlineText,
270
+ ...Number.isFinite(styleIndex) ? { styleIndex } : {}
271
+ };
272
+ }
273
+ return {
274
+ ...base,
275
+ rawValue,
276
+ ...Number.isFinite(styleIndex) ? { styleIndex } : {}
277
+ };
278
+ }
279
+ function validateCellType(t) {
280
+ if (t === "n" || t === "s" || t === "str" || t === "b" || t === "d" || t === "e" || t === "inlineStr") return t;
281
+ return "n";
282
+ }
283
+ function strAttr(obj, key) {
284
+ const v = obj[`@_${key}`];
285
+ return typeof v === "string" ? v : void 0;
286
+ }
287
+ function textOf(node) {
288
+ if (typeof node === "string") return node;
289
+ if (typeof node === "number") return String(node);
290
+ if (!node || typeof node !== "object") return "";
291
+ const inner = node["#text"];
292
+ if (typeof inner === "string") return inner;
293
+ if (typeof inner === "number") return String(inner);
294
+ return "";
295
+ }
296
+ var MAX_CELL_CHARS = 32767;
297
+ function inlineStringText(is) {
298
+ if (!is || typeof is !== "object") return "";
299
+ const obj = is;
300
+ const t = obj["t"];
301
+ const direct = textOf(t);
302
+ if (direct) return direct.length > MAX_CELL_CHARS ? direct.slice(0, MAX_CELL_CHARS) : direct;
303
+ const r = obj["r"];
304
+ if (Array.isArray(r)) {
305
+ const joined = r.map((rr) => textOf(rr?.["t"])).join("");
306
+ return joined.length > MAX_CELL_CHARS ? joined.slice(0, MAX_CELL_CHARS) : joined;
307
+ }
308
+ return "";
309
+ }
310
+ //#endregion
311
+ export { parseWorksheet };