ooxml.js 4.3.0 → 4.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -6
- package/dist/{codec-DNjHjEDm.d.cts → codec-CoqS3uGe.d.cts} +2 -2
- package/dist/{codec-BrTMlL0a.d.ts → codec-CzqiAWdz.d.ts} +4 -4
- package/dist/codec.d.cts +1 -1
- package/dist/codec.d.ts +1 -1
- package/dist/{content-UlQ-Nhgi.d.cts → content-C79O3esU.d.cts} +6 -1
- package/dist/{content-t6ZfmfQM.d.ts → content-MEmp_Rlx.d.ts} +6 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +1 -1
- package/dist/{read-Di5UfiSh.cjs → read-D-L3dItC.cjs} +316 -59
- package/dist/{read-CxMli3Om.d.ts → read-D30xHgEp.d.ts} +58 -1
- package/dist/{read-BQoFiqsb.js → read-DGknK1YY.js} +307 -62
- package/dist/{read-CDX1WbiF.d.cts → read-LTgVJIPU.d.cts} +58 -1
- package/dist/typed/document-package.cjs +8 -2
- package/dist/typed/document-package.js +8 -2
- package/dist/typed/docx/constructs.cjs +55 -6
- package/dist/typed/docx/constructs.d.cts +6 -3
- package/dist/typed/docx/constructs.d.ts +6 -3
- package/dist/typed/docx/constructs.js +54 -6
- package/dist/typed/docx/read.cjs +3 -1
- package/dist/typed/docx/read.d.cts +2 -2
- package/dist/typed/docx/read.d.ts +2 -2
- package/dist/typed/docx/read.js +2 -2
- package/dist/typed/docx/write.cjs +78 -10
- package/dist/typed/docx/write.js +78 -10
- package/dist/typed/embedded.cjs +1 -1
- package/dist/typed/embedded.js +1 -1
- package/dist/typed/pptx/read.cjs +1 -1
- package/dist/typed/pptx/read.js +1 -1
- package/dist/typed/xlsx/build.cjs +1 -1
- package/dist/typed/xlsx/build.js +1 -1
- package/dist/typed/xlsx/content.cjs +42 -1
- package/dist/typed/xlsx/content.d.cts +2 -2
- package/dist/typed/xlsx/content.d.ts +2 -2
- package/dist/typed/xlsx/content.js +42 -2
- package/dist/typed/xlsx/definitions.cjs +54 -0
- package/dist/typed/xlsx/definitions.d.cts +6 -0
- package/dist/typed/xlsx/definitions.d.ts +6 -0
- package/dist/typed/xlsx/definitions.js +53 -0
- package/dist/typed/xlsx/drawings.cjs +170 -0
- package/dist/typed/xlsx/drawings.d.cts +7 -0
- package/dist/typed/xlsx/drawings.d.ts +7 -0
- package/dist/typed/xlsx/drawings.js +169 -0
- package/dist/typed/xlsx/units.cjs +2 -0
- package/dist/typed/xlsx/units.d.cts +2 -1
- package/dist/typed/xlsx/units.d.ts +2 -1
- package/dist/typed/xlsx/units.js +2 -1
- package/package.json +2 -2
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { attr, childrenWithTag, elementsWithTag, resolveRelationships, rootElement } from "../util.js";
|
|
2
|
+
import { readCoreProperties } from "../shared/metadata.js";
|
|
3
|
+
import { emuToPt } from "../shared/units.js";
|
|
4
|
+
import { readChartTable } from "../pptx/chart.js";
|
|
5
|
+
import { readPrintSettings } from "./print-settings.js";
|
|
6
|
+
import { columnWidthCharsToPt } from "./units.js";
|
|
7
|
+
//#region src/typed/xlsx/drawings.ts
|
|
8
|
+
const CHART_GRAPHIC_URI = "http://schemas.openxmlformats.org/drawingml/2006/chart";
|
|
9
|
+
const DRAWING_REL_SUFFIX = "/drawing";
|
|
10
|
+
var SheetGridGeometry = class {
|
|
11
|
+
columns = [];
|
|
12
|
+
rowHeights = /* @__PURE__ */ new Map();
|
|
13
|
+
defaultRowHeightPt;
|
|
14
|
+
constructor(worksheet) {
|
|
15
|
+
const cols = childrenWithTag(worksheet, "cols")[0];
|
|
16
|
+
if (cols !== void 0) for (const col of childrenWithTag(cols, "col")) {
|
|
17
|
+
const min = Number.parseInt(attr(col, "min") ?? "", 10);
|
|
18
|
+
const max = Number.parseInt(attr(col, "max") ?? "", 10);
|
|
19
|
+
const widthRaw = attr(col, "width");
|
|
20
|
+
const widthPt = widthRaw === void 0 ? void 0 : columnWidthCharsToPt(Number(widthRaw));
|
|
21
|
+
if (Number.isInteger(min) && Number.isInteger(max) && min >= 1 && max >= min) this.columns.push({
|
|
22
|
+
min: min - 1,
|
|
23
|
+
max: max - 1,
|
|
24
|
+
widthPt: Number.isFinite(widthPt) ? widthPt : void 0
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
const sheetFormatPr = childrenWithTag(worksheet, "sheetFormatPr")[0];
|
|
28
|
+
const defaultRaw = sheetFormatPr === void 0 ? void 0 : attr(sheetFormatPr, "defaultRowHeight");
|
|
29
|
+
const parsed = defaultRaw === void 0 ? NaN : Number(defaultRaw);
|
|
30
|
+
this.defaultRowHeightPt = Number.isFinite(parsed) ? parsed : 15;
|
|
31
|
+
const sheetData = childrenWithTag(worksheet, "sheetData")[0];
|
|
32
|
+
if (sheetData !== void 0) for (const row of childrenWithTag(sheetData, "row")) {
|
|
33
|
+
const r = Number.parseInt(attr(row, "r") ?? "", 10);
|
|
34
|
+
const htRaw = attr(row, "ht");
|
|
35
|
+
const ht = htRaw === void 0 ? NaN : Number(htRaw);
|
|
36
|
+
if (Number.isInteger(r) && r >= 1 && Number.isFinite(ht)) this.rowHeights.set(r - 1, ht);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
columnWidthPt(index) {
|
|
40
|
+
return this.columns.find((column) => index >= column.min && index <= column.max && column.widthPt !== void 0)?.widthPt ?? columnWidthCharsToPt(8.43);
|
|
41
|
+
}
|
|
42
|
+
rowHeightPt(index) {
|
|
43
|
+
return this.rowHeights.get(index) ?? this.defaultRowHeightPt;
|
|
44
|
+
}
|
|
45
|
+
xPt(column, colOffEmu) {
|
|
46
|
+
let xPt = emuToPt(colOffEmu);
|
|
47
|
+
for (let index = 0; index < column; index++) xPt += this.columnWidthPt(index);
|
|
48
|
+
return xPt;
|
|
49
|
+
}
|
|
50
|
+
yPt(row, rowOffEmu) {
|
|
51
|
+
let yPt = emuToPt(rowOffEmu);
|
|
52
|
+
for (let index = 0; index < row; index++) yPt += this.rowHeightPt(index);
|
|
53
|
+
return yPt;
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
function readAnchorChild(marker, tag) {
|
|
57
|
+
const child = childrenWithTag(marker, tag)[0];
|
|
58
|
+
const text = child === void 0 ? void 0 : child.children.map((node) => node.type === "text" ? node.value : "").join("");
|
|
59
|
+
const parsed = text === void 0 || text === "" ? NaN : Number(text);
|
|
60
|
+
return Number.isFinite(parsed) ? parsed : 0;
|
|
61
|
+
}
|
|
62
|
+
function readAnchorMarker(parent, tag) {
|
|
63
|
+
const marker = childrenWithTag(parent, tag)[0];
|
|
64
|
+
if (marker === void 0) return;
|
|
65
|
+
return {
|
|
66
|
+
column: readAnchorChild(marker, "xdr:col"),
|
|
67
|
+
colOffEmu: readAnchorChild(marker, "xdr:colOff"),
|
|
68
|
+
row: readAnchorChild(marker, "xdr:row"),
|
|
69
|
+
rowOffEmu: readAnchorChild(marker, "xdr:rowOff")
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
function emptyWorksheet() {
|
|
73
|
+
return {
|
|
74
|
+
type: "element",
|
|
75
|
+
tag: "worksheet",
|
|
76
|
+
attributes: [],
|
|
77
|
+
children: []
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function chartCells(chartRoot, frame) {
|
|
81
|
+
const table = readChartTable(chartRoot, frame);
|
|
82
|
+
if (table === void 0) return [];
|
|
83
|
+
const cells = [];
|
|
84
|
+
table.rows.forEach((row, rowIndex) => {
|
|
85
|
+
row.cells.forEach((cell, columnIndex) => {
|
|
86
|
+
const text = cell.blocks.map((block) => block.kind === "paragraph" ? block.runs.map((run) => run.text).join("") : "").join("");
|
|
87
|
+
if (text !== "") cells.push({
|
|
88
|
+
row: rowIndex,
|
|
89
|
+
column: columnIndex,
|
|
90
|
+
value: {
|
|
91
|
+
kind: "string",
|
|
92
|
+
value: text
|
|
93
|
+
},
|
|
94
|
+
displayText: text
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
return cells;
|
|
99
|
+
}
|
|
100
|
+
function readSheetEmbeddedObjects(pkg, worksheetPath, worksheet) {
|
|
101
|
+
let drawingPath;
|
|
102
|
+
for (const rel of resolveRelationships(pkg, worksheetPath).values()) if (rel.type.endsWith(DRAWING_REL_SUFFIX)) {
|
|
103
|
+
drawingPath = rel.target;
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
const drawingRoot = drawingPath === void 0 ? void 0 : rootElement(pkg.parts[drawingPath]);
|
|
107
|
+
if (drawingRoot === void 0) return;
|
|
108
|
+
const drawingRels = drawingPath === void 0 ? void 0 : resolveRelationships(pkg, drawingPath);
|
|
109
|
+
const geometry = new SheetGridGeometry(worksheet);
|
|
110
|
+
const objects = [];
|
|
111
|
+
for (const anchor of childrenWithTag(drawingRoot, "xdr:twoCellAnchor")) {
|
|
112
|
+
const from = readAnchorMarker(anchor, "xdr:from");
|
|
113
|
+
const to = readAnchorMarker(anchor, "xdr:to");
|
|
114
|
+
if (from === void 0 || to === void 0) continue;
|
|
115
|
+
for (const frame of elementsWithTag([anchor], "xdr:graphicFrame")) {
|
|
116
|
+
const chart = readChartFrame(pkg, frame, drawingRels);
|
|
117
|
+
if (chart === void 0) continue;
|
|
118
|
+
const xPt = geometry.xPt(from.column, from.colOffEmu);
|
|
119
|
+
const yPt = geometry.yPt(from.row, from.rowOffEmu);
|
|
120
|
+
const frameBox = {
|
|
121
|
+
xPt,
|
|
122
|
+
yPt,
|
|
123
|
+
widthPt: geometry.xPt(to.column, to.colOffEmu) - xPt,
|
|
124
|
+
heightPt: geometry.yPt(to.row, to.rowOffEmu) - yPt
|
|
125
|
+
};
|
|
126
|
+
objects.push({
|
|
127
|
+
objectKind: "chart",
|
|
128
|
+
document: chartDocument(pkg, chart.root, frameBox, chart.name),
|
|
129
|
+
frame: frameBox,
|
|
130
|
+
anchorRow: from.row,
|
|
131
|
+
anchorColumn: from.column,
|
|
132
|
+
offsetXPt: emuToPt(from.colOffEmu),
|
|
133
|
+
offsetYPt: emuToPt(from.rowOffEmu)
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return objects.length === 0 ? void 0 : objects;
|
|
138
|
+
}
|
|
139
|
+
function readChartFrame(pkg, frame, drawingRels) {
|
|
140
|
+
const graphic = childrenWithTag(frame, "a:graphic")[0];
|
|
141
|
+
const graphicData = graphic === void 0 ? void 0 : childrenWithTag(graphic, "a:graphicData")[0];
|
|
142
|
+
if (graphicData === void 0 || attr(graphicData, "uri") !== CHART_GRAPHIC_URI) return;
|
|
143
|
+
const chartRef = childrenWithTag(graphicData, "c:chart")[0];
|
|
144
|
+
const rId = chartRef === void 0 ? void 0 : attr(chartRef, "r:id");
|
|
145
|
+
const target = rId === void 0 ? void 0 : drawingRels?.get(rId)?.target;
|
|
146
|
+
const chartRoot = target === void 0 ? void 0 : rootElement(pkg.parts[target]);
|
|
147
|
+
if (chartRoot === void 0) return;
|
|
148
|
+
const cNvPr = elementsWithTag([frame], "xdr:cNvPr")[0];
|
|
149
|
+
return {
|
|
150
|
+
root: chartRoot,
|
|
151
|
+
name: cNvPr === void 0 ? "Chart" : attr(cNvPr, "name") ?? "Chart"
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
function chartDocument(pkg, chartRoot, frame, name) {
|
|
155
|
+
return {
|
|
156
|
+
kind: "spreadsheet",
|
|
157
|
+
metadata: readCoreProperties(pkg),
|
|
158
|
+
sheets: [{
|
|
159
|
+
name,
|
|
160
|
+
cells: chartCells(chartRoot, frame),
|
|
161
|
+
columns: [],
|
|
162
|
+
rows: [],
|
|
163
|
+
images: [],
|
|
164
|
+
printSettings: readPrintSettings(emptyWorksheet(), 0, /* @__PURE__ */ new Map())
|
|
165
|
+
}]
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
//#endregion
|
|
169
|
+
export { readSheetEmbeddedObjects };
|
|
@@ -4,6 +4,7 @@ require("../shared/units.cjs");
|
|
|
4
4
|
const PIXELS_PER_INCH = 96;
|
|
5
5
|
const MAX_DIGIT_WIDTH_PX = 7;
|
|
6
6
|
const DEFAULT_ROW_HEIGHT_PT = 15;
|
|
7
|
+
const DEFAULT_COLUMN_WIDTH_CHARS = 8.43;
|
|
7
8
|
function columnWidthCharsToPt(width) {
|
|
8
9
|
const digitWidthAllowance = Math.trunc(128 / 7);
|
|
9
10
|
return Math.trunc((256 * width + digitWidthAllowance) / 256 * 7) / 96 * 72;
|
|
@@ -14,6 +15,7 @@ function ptToColumnWidthChars(widthPt) {
|
|
|
14
15
|
return pixels / 7 - digitWidthAllowance / 256;
|
|
15
16
|
}
|
|
16
17
|
//#endregion
|
|
18
|
+
exports.DEFAULT_COLUMN_WIDTH_CHARS = DEFAULT_COLUMN_WIDTH_CHARS;
|
|
17
19
|
exports.DEFAULT_ROW_HEIGHT_PT = DEFAULT_ROW_HEIGHT_PT;
|
|
18
20
|
exports.MAX_DIGIT_WIDTH_PX = MAX_DIGIT_WIDTH_PX;
|
|
19
21
|
exports.PIXELS_PER_INCH = PIXELS_PER_INCH;
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
declare const PIXELS_PER_INCH = 96;
|
|
3
3
|
declare const MAX_DIGIT_WIDTH_PX = 7;
|
|
4
4
|
declare const DEFAULT_ROW_HEIGHT_PT = 15;
|
|
5
|
+
declare const DEFAULT_COLUMN_WIDTH_CHARS = 8.43;
|
|
5
6
|
declare function columnWidthCharsToPt(width: number): number;
|
|
6
7
|
declare function ptToColumnWidthChars(widthPt: number): number;
|
|
7
8
|
//#endregion
|
|
8
|
-
export { DEFAULT_ROW_HEIGHT_PT, MAX_DIGIT_WIDTH_PX, PIXELS_PER_INCH, columnWidthCharsToPt, ptToColumnWidthChars };
|
|
9
|
+
export { DEFAULT_COLUMN_WIDTH_CHARS, DEFAULT_ROW_HEIGHT_PT, MAX_DIGIT_WIDTH_PX, PIXELS_PER_INCH, columnWidthCharsToPt, ptToColumnWidthChars };
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
declare const PIXELS_PER_INCH = 96;
|
|
3
3
|
declare const MAX_DIGIT_WIDTH_PX = 7;
|
|
4
4
|
declare const DEFAULT_ROW_HEIGHT_PT = 15;
|
|
5
|
+
declare const DEFAULT_COLUMN_WIDTH_CHARS = 8.43;
|
|
5
6
|
declare function columnWidthCharsToPt(width: number): number;
|
|
6
7
|
declare function ptToColumnWidthChars(widthPt: number): number;
|
|
7
8
|
//#endregion
|
|
8
|
-
export { DEFAULT_ROW_HEIGHT_PT, MAX_DIGIT_WIDTH_PX, PIXELS_PER_INCH, columnWidthCharsToPt, ptToColumnWidthChars };
|
|
9
|
+
export { DEFAULT_COLUMN_WIDTH_CHARS, DEFAULT_ROW_HEIGHT_PT, MAX_DIGIT_WIDTH_PX, PIXELS_PER_INCH, columnWidthCharsToPt, ptToColumnWidthChars };
|
package/dist/typed/xlsx/units.js
CHANGED
|
@@ -3,6 +3,7 @@ import "../shared/units.js";
|
|
|
3
3
|
const PIXELS_PER_INCH = 96;
|
|
4
4
|
const MAX_DIGIT_WIDTH_PX = 7;
|
|
5
5
|
const DEFAULT_ROW_HEIGHT_PT = 15;
|
|
6
|
+
const DEFAULT_COLUMN_WIDTH_CHARS = 8.43;
|
|
6
7
|
function columnWidthCharsToPt(width) {
|
|
7
8
|
const digitWidthAllowance = Math.trunc(128 / 7);
|
|
8
9
|
return Math.trunc((256 * width + digitWidthAllowance) / 256 * 7) / 96 * 72;
|
|
@@ -13,4 +14,4 @@ function ptToColumnWidthChars(widthPt) {
|
|
|
13
14
|
return pixels / 7 - digitWidthAllowance / 256;
|
|
14
15
|
}
|
|
15
16
|
//#endregion
|
|
16
|
-
export { DEFAULT_ROW_HEIGHT_PT, MAX_DIGIT_WIDTH_PX, PIXELS_PER_INCH, columnWidthCharsToPt, ptToColumnWidthChars };
|
|
17
|
+
export { DEFAULT_COLUMN_WIDTH_CHARS, DEFAULT_ROW_HEIGHT_PT, MAX_DIGIT_WIDTH_PX, PIXELS_PER_INCH, columnWidthCharsToPt, ptToColumnWidthChars };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ooxml.js",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.4.0",
|
|
4
4
|
"description": "Type-safe, lossless round-trip conversion between OOXML packages (docx, pptx, xlsx) and JSON, built on Zod 4 codecs.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"repository": {
|
|
@@ -81,7 +81,7 @@
|
|
|
81
81
|
"packageManager": "pnpm@11.6.0",
|
|
82
82
|
"dependencies": {
|
|
83
83
|
"archive-codec": "^1.1.0",
|
|
84
|
-
"document-schema.js": "^4.
|
|
84
|
+
"document-schema.js": "^4.6.0",
|
|
85
85
|
"fast-xml-parser": "^5.10.1",
|
|
86
86
|
"fflate": "^0.8.3",
|
|
87
87
|
"zod": "^4.4.3"
|