odf.js 6.3.0 → 6.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 +172 -18
- package/dist/{codec-BnzBd5_I.d.cts → codec-CFdlbFLJ.d.cts} +16 -10
- package/dist/{codec-Dg_HWuH1.d.ts → codec-DTAgph2r.d.ts} +16 -10
- package/dist/codec.d.cts +1 -1
- package/dist/codec.d.ts +1 -1
- package/dist/{embedded-BONPxvS3.js → embedded-BnavfkP-.js} +3 -3
- package/dist/{embedded-wrtHCJ68.cjs → embedded-Bxyss_ck.cjs} +14 -2
- package/dist/index.cjs +34 -1
- package/dist/index.d.cts +19 -13
- package/dist/index.d.ts +19 -13
- package/dist/index.js +12 -6
- package/dist/{list-vhXd0Jf6.d.ts → list-7FO0SDqZ.d.ts} +14 -1
- package/dist/{list-Bttwr1mk.d.cts → list-BorrTJBY.d.cts} +14 -1
- package/dist/{ns-C14w-Zhf.d.cts → ns-DrleaIZQ.d.cts} +3 -1
- package/dist/{ns-CTyKJZeF.d.ts → ns-E0TfX9tZ.d.ts} +3 -1
- package/dist/ooo1/ns.cjs +9 -0
- package/dist/ooo1/ns.d.cts +2 -2
- package/dist/ooo1/ns.d.ts +2 -2
- package/dist/ooo1/ns.js +8 -1
- package/dist/ooo1/properties.cjs +30 -0
- package/dist/ooo1/properties.d.cts +6 -2
- package/dist/ooo1/properties.d.ts +6 -2
- package/dist/ooo1/properties.js +30 -1
- package/dist/ooo1/read.cjs +1 -1
- package/dist/ooo1/read.d.cts +1 -1
- package/dist/ooo1/read.d.ts +1 -1
- package/dist/ooo1/read.js +1 -1
- package/dist/ooo1/transform.cjs +290 -0
- package/dist/ooo1/transform.d.cts +2 -2
- package/dist/ooo1/transform.d.ts +2 -2
- package/dist/ooo1/transform.js +293 -4
- package/dist/ooo1/write.cjs +40 -0
- package/dist/ooo1/write.d.cts +2 -0
- package/dist/ooo1/write.d.ts +2 -0
- package/dist/ooo1/write.js +32 -0
- package/dist/package-io/scaffold.cjs +2 -1
- package/dist/package-io/scaffold.js +2 -1
- package/dist/{paragraph-BdwsQisB.d.cts → paragraph-Bf6Iq5wC.d.cts} +1 -1
- package/dist/{paragraph-BoVy1LrN.d.ts → paragraph-DtC86tft.d.ts} +1 -1
- package/dist/{path-CK0dIPgx.d.cts → path-8HQS-J7y.d.cts} +3 -1
- package/dist/{path-CK0dIPgx.d.ts → path-8HQS-J7y.d.ts} +3 -1
- package/dist/{read-Bo1GBjSE.d.ts → read-A3CJkqVM.d.ts} +3 -1
- package/dist/{read-RFqq4ckj.d.cts → read-BgnLFuSi.d.cts} +1 -1
- package/dist/{read-3yy5EFV_.d.ts → read-CqaZ01kU.d.ts} +1 -1
- package/dist/{read-tpfiT_n4.d.cts → read-fphkvCpR.d.cts} +3 -1
- package/dist/{shapes-DUzrrf7b.d.ts → shapes-B6Ms7ibr.d.ts} +1 -1
- package/dist/{shapes-BQhXAk0D.d.cts → shapes-CbBc9t0y.d.cts} +1 -1
- package/dist/{table-ByhqRnSG.d.cts → table-CECMtPxZ.d.cts} +6 -2
- package/dist/{table-DElqGcT0.d.ts → table-XuniPr2I.d.ts} +6 -2
- package/dist/{transform-SDysw9wx.d.cts → transform-DFCPKX7e.d.cts} +2 -1
- package/dist/{transform-DRr76JEu.d.ts → transform-DPliWQuD.d.ts} +2 -1
- package/dist/typed/draw/embedded.cjs +1 -1
- package/dist/typed/draw/embedded.js +1 -1
- package/dist/typed/draw/shapes.cjs +7 -2
- package/dist/typed/draw/shapes.d.cts +1 -1
- package/dist/typed/draw/shapes.d.ts +1 -1
- package/dist/typed/draw/shapes.js +7 -2
- package/dist/typed/draw/write-shapes.cjs +210 -0
- package/dist/typed/draw/write-shapes.d.cts +2 -0
- package/dist/typed/draw/write-shapes.d.ts +2 -0
- package/dist/typed/draw/write-shapes.js +203 -0
- package/dist/typed/draw/write-vectors.cjs +132 -0
- package/dist/typed/draw/write-vectors.d.cts +2 -0
- package/dist/typed/draw/write-vectors.d.ts +2 -0
- package/dist/typed/draw/write-vectors.js +129 -0
- package/dist/typed/odb/form.cjs +1 -1
- package/dist/typed/odb/form.js +1 -1
- package/dist/typed/odg/write.cjs +80 -0
- package/dist/typed/odg/write.d.cts +2 -0
- package/dist/typed/odg/write.d.ts +2 -0
- package/dist/typed/odg/write.js +77 -0
- package/dist/typed/odp/write.cjs +108 -0
- package/dist/typed/odp/write.d.cts +2 -0
- package/dist/typed/odp/write.d.ts +2 -0
- package/dist/typed/odp/write.js +105 -0
- package/dist/typed/ods/read.cjs +3 -1
- package/dist/typed/ods/read.d.cts +2 -2
- package/dist/typed/ods/read.d.ts +2 -2
- package/dist/typed/ods/read.js +2 -2
- package/dist/typed/ods/write.cjs +578 -0
- package/dist/typed/ods/write.d.cts +2 -0
- package/dist/typed/ods/write.d.ts +2 -0
- package/dist/typed/ods/write.js +575 -0
- package/dist/typed/odt/read.cjs +1 -1
- package/dist/typed/odt/read.js +1 -1
- package/dist/typed/odt/write.cjs +9 -140
- package/dist/typed/odt/write.d.cts +1 -1
- package/dist/typed/odt/write.d.ts +1 -1
- package/dist/typed/odt/write.js +8 -139
- package/dist/typed/shared/canonicalise.cjs +126 -0
- package/dist/typed/shared/canonicalise.d.cts +10 -0
- package/dist/typed/shared/canonicalise.d.ts +10 -0
- package/dist/typed/shared/canonicalise.js +120 -0
- package/dist/typed/shared/list.cjs +32 -0
- package/dist/typed/shared/list.d.cts +2 -2
- package/dist/typed/shared/list.d.ts +2 -2
- package/dist/typed/shared/list.js +28 -1
- package/dist/typed/shared/paragraph.d.cts +1 -1
- package/dist/typed/shared/paragraph.d.ts +1 -1
- package/dist/typed/shared/path.cjs +19 -0
- package/dist/typed/shared/path.d.cts +2 -2
- package/dist/typed/shared/path.d.ts +2 -2
- package/dist/typed/shared/path.js +18 -1
- package/dist/typed/shared/table.cjs +3 -0
- package/dist/typed/shared/table.d.cts +2 -2
- package/dist/typed/shared/table.d.ts +2 -2
- package/dist/typed/shared/table.js +1 -1
- package/dist/typed/shared/units.cjs +16 -1
- package/dist/typed/shared/units.d.cts +2 -2
- package/dist/typed/shared/units.d.ts +2 -2
- package/dist/typed/shared/units.js +16 -2
- package/dist/{units-BQSNkTQZ.d.ts → units-DdyaQolR.d.cts} +2 -1
- package/dist/{units-BQSNkTQZ.d.cts → units-DdyaQolR.d.ts} +2 -1
- package/dist/write-4kMi-asu.d.ts +14 -0
- package/dist/write-BZXpT8F6.d.cts +17 -0
- package/dist/write-BhG3t3fJ.d.cts +14 -0
- package/dist/write-BuLQmwLD.d.cts +14 -0
- package/dist/write-C2c4xBXs.d.cts +14 -0
- package/dist/{write-7Uu_wlkL.d.cts → write-CPATqG4v.d.cts} +1 -0
- package/dist/write-CfTE2jY8.d.ts +14 -0
- package/dist/write-DttX1rTC.d.ts +14 -0
- package/dist/{write-DGcI9W7Z.d.ts → write-JERychL3.d.ts} +1 -0
- package/dist/write-SKnCTU4C.d.ts +17 -0
- package/dist/write-shapes-Co7BrmMZ.d.ts +36 -0
- package/dist/write-shapes-D4piGKf4.d.cts +36 -0
- package/dist/write-vectors-B-RVHAKI.d.cts +11 -0
- package/dist/write-vectors-CYjZoVBW.d.ts +11 -0
- package/package.json +2 -2
package/dist/typed/odt/write.cjs
CHANGED
|
@@ -10,21 +10,12 @@ const require_typed_shared_list = require("../shared/list.cjs");
|
|
|
10
10
|
const require_typed_shared_paragraph = require("../shared/paragraph.cjs");
|
|
11
11
|
const require_typed_shared_table = require("../shared/table.cjs");
|
|
12
12
|
const require_package_io_scaffold = require("../../package-io/scaffold.cjs");
|
|
13
|
+
const require_typed_shared_canonicalise = require("../shared/canonicalise.cjs");
|
|
13
14
|
let document_schema_js = require("document-schema.js");
|
|
14
15
|
//#region src/typed/odt/write.ts
|
|
15
16
|
const CONTENT_PART = "content.xml";
|
|
16
17
|
const STYLES_PART = "styles.xml";
|
|
17
18
|
const PICTURES_DIRECTORY = "Pictures";
|
|
18
|
-
function listKindOf(numId) {
|
|
19
|
-
if (numId === void 0) return;
|
|
20
|
-
if (numId.startsWith("ordered:")) return "ordered";
|
|
21
|
-
return numId.startsWith("bullet:") ? "bullet" : void 0;
|
|
22
|
-
}
|
|
23
|
-
const NO_NUM_ID_KEY = " ";
|
|
24
|
-
function canonicalNumId(incoming, ordinal) {
|
|
25
|
-
const kind = listKindOf(incoming);
|
|
26
|
-
return kind === void 0 ? `list${ordinal}` : `${kind}:list${ordinal}`;
|
|
27
|
-
}
|
|
28
19
|
function unsupported(what, where) {
|
|
29
20
|
return /* @__PURE__ */ new Error(`writeOdt: ${where} carries ${what}, which this writer does not write yet -- refusing rather than producing an .odt that silently lost it. See ExaDev/documents.js for the tracked follow-up covering the fidelity constructs and embedded objects.`);
|
|
30
21
|
}
|
|
@@ -36,44 +27,6 @@ function assertWritableBlock(block) {
|
|
|
36
27
|
if (block.kind === "embeddedObject") throw unsupported("an embedded object", "a section's block flow");
|
|
37
28
|
if (block.kind === "paragraph") assertWritableParagraph(block);
|
|
38
29
|
}
|
|
39
|
-
function canonicalColor(color) {
|
|
40
|
-
return (0, document_schema_js.rgbHexToColor)((0, document_schema_js.colorToRgbHex)(color));
|
|
41
|
-
}
|
|
42
|
-
function canonicalRun(run) {
|
|
43
|
-
const canonical = { text: run.text };
|
|
44
|
-
if (run.bold !== void 0) canonical.bold = run.bold;
|
|
45
|
-
if (run.italic !== void 0) canonical.italic = run.italic;
|
|
46
|
-
if (run.underline !== void 0) canonical.underline = run.underline;
|
|
47
|
-
if (run.strike !== void 0) canonical.strike = run.strike;
|
|
48
|
-
if (run.fontFamily !== void 0) canonical.fontFamily = run.fontFamily;
|
|
49
|
-
if (run.sizePt !== void 0) canonical.sizePt = run.sizePt;
|
|
50
|
-
if (run.color !== void 0) canonical.color = canonicalColor(run.color);
|
|
51
|
-
if (run.hyperlink !== void 0) canonical.hyperlink = run.hyperlink;
|
|
52
|
-
return canonical;
|
|
53
|
-
}
|
|
54
|
-
function canonicalParagraph(paragraph, listNumId) {
|
|
55
|
-
const canonical = {
|
|
56
|
-
kind: "paragraph",
|
|
57
|
-
runs: require_typed_shared_paragraph.segmentOdfParagraphRuns(paragraph.runs).map(canonicalRun)
|
|
58
|
-
};
|
|
59
|
-
if (paragraph.headingLevel !== void 0) {
|
|
60
|
-
canonical.headingLevel = paragraph.headingLevel;
|
|
61
|
-
canonical.styleId = `Heading${paragraph.headingLevel}`;
|
|
62
|
-
}
|
|
63
|
-
if (paragraph.alignment !== void 0) canonical.alignment = paragraph.alignment;
|
|
64
|
-
if (listNumId !== void 0 && paragraph.list !== void 0) canonical.list = {
|
|
65
|
-
numId: listNumId,
|
|
66
|
-
level: paragraph.list.level
|
|
67
|
-
};
|
|
68
|
-
if (paragraph.spacingBeforePt !== void 0) canonical.spacingBeforePt = paragraph.spacingBeforePt;
|
|
69
|
-
if (paragraph.spacingAfterPt !== void 0) canonical.spacingAfterPt = paragraph.spacingAfterPt;
|
|
70
|
-
if (paragraph.lineSpacing !== void 0) canonical.lineSpacing = paragraph.lineSpacing;
|
|
71
|
-
if (paragraph.indentLeftPt !== void 0) canonical.indentLeftPt = paragraph.indentLeftPt;
|
|
72
|
-
if (paragraph.indentFirstLinePt !== void 0) canonical.indentFirstLinePt = paragraph.indentFirstLinePt;
|
|
73
|
-
if (paragraph.pageBreakBefore !== void 0) canonical.pageBreakBefore = paragraph.pageBreakBefore;
|
|
74
|
-
if (paragraph.pageBreakAfter !== void 0) canonical.pageBreakAfter = paragraph.pageBreakAfter;
|
|
75
|
-
return canonical;
|
|
76
|
-
}
|
|
77
30
|
function emptyAnchorParagraph(pageBreakBefore) {
|
|
78
31
|
return pageBreakBefore ? {
|
|
79
32
|
kind: "paragraph",
|
|
@@ -98,8 +51,7 @@ function planSection(section, needsLeadingParagraph, listState) {
|
|
|
98
51
|
return false;
|
|
99
52
|
};
|
|
100
53
|
const closeListRun = () => {
|
|
101
|
-
listState
|
|
102
|
-
listState.openCanonicalNumId = void 0;
|
|
54
|
+
require_typed_shared_list.closeListPlan(listState);
|
|
103
55
|
};
|
|
104
56
|
const flushPendingPageBreak = () => {
|
|
105
57
|
if (pendingPageBreak) {
|
|
@@ -119,17 +71,8 @@ function planSection(section, needsLeadingParagraph, listState) {
|
|
|
119
71
|
continue;
|
|
120
72
|
}
|
|
121
73
|
if (block.kind === "paragraph") {
|
|
122
|
-
const
|
|
123
|
-
|
|
124
|
-
else {
|
|
125
|
-
const incomingKey = membership.numId ?? NO_NUM_ID_KEY;
|
|
126
|
-
if (listState.openNumId !== incomingKey) {
|
|
127
|
-
listState.openNumId = incomingKey;
|
|
128
|
-
listState.openCanonicalNumId = canonicalNumId(membership.numId, listState.next);
|
|
129
|
-
listState.next += 1;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
const paragraph = canonicalParagraph(block, membership === void 0 ? void 0 : listState.openCanonicalNumId);
|
|
74
|
+
const canonicalId = require_typed_shared_list.planListMembership(block.list, listState);
|
|
75
|
+
const paragraph = require_typed_shared_canonicalise.canonicalParagraph(block, canonicalId);
|
|
133
76
|
pushParagraph(pendingPageBreak ? {
|
|
134
77
|
...paragraph,
|
|
135
78
|
pageBreakBefore: true
|
|
@@ -165,92 +108,18 @@ function planDocument(sections) {
|
|
|
165
108
|
const listState = { next: 1 };
|
|
166
109
|
return sections.map((section, index) => planSection(section, index > 0, listState));
|
|
167
110
|
}
|
|
168
|
-
function canonicalCell(cell, covered) {
|
|
169
|
-
if (covered) return { blocks: [] };
|
|
170
|
-
const canonical = { blocks: cell.blocks.map((block) => {
|
|
171
|
-
if (block.kind !== "paragraph") throw unsupported(`a "${block.kind}" block`, "a table cell");
|
|
172
|
-
assertWritableParagraph(block);
|
|
173
|
-
return canonicalParagraph(block, void 0);
|
|
174
|
-
}) };
|
|
175
|
-
if (cell.colSpan !== void 0) canonical.colSpan = cell.colSpan;
|
|
176
|
-
if (cell.rowSpan !== void 0) canonical.rowSpan = cell.rowSpan;
|
|
177
|
-
if (cell.background !== void 0) canonical.background = canonicalColor(cell.background);
|
|
178
|
-
if (cell.borders !== void 0) {
|
|
179
|
-
const borders = {};
|
|
180
|
-
for (const edge of [
|
|
181
|
-
"left",
|
|
182
|
-
"right",
|
|
183
|
-
"top",
|
|
184
|
-
"bottom"
|
|
185
|
-
]) {
|
|
186
|
-
const border = cell.borders[edge];
|
|
187
|
-
if (border !== void 0) borders[edge] = {
|
|
188
|
-
color: canonicalColor(border.color),
|
|
189
|
-
widthPt: border.widthPt,
|
|
190
|
-
style: border.style ?? "solid"
|
|
191
|
-
};
|
|
192
|
-
}
|
|
193
|
-
canonical.borders = borders;
|
|
194
|
-
}
|
|
195
|
-
return canonical;
|
|
196
|
-
}
|
|
197
|
-
function canonicalTable(table) {
|
|
198
|
-
const covered = /* @__PURE__ */ new Set();
|
|
199
|
-
return {
|
|
200
|
-
kind: "table",
|
|
201
|
-
columnWidthsPt: [...table.columnWidthsPt],
|
|
202
|
-
rows: table.rows.map((row, rowIndex) => {
|
|
203
|
-
const cells = row.cells.map((cell, columnIndex) => {
|
|
204
|
-
const key = `${rowIndex},${columnIndex}`;
|
|
205
|
-
const isCovered = covered.has(key);
|
|
206
|
-
if (!isCovered) {
|
|
207
|
-
const colSpan = cell.colSpan ?? 1;
|
|
208
|
-
const rowSpan = cell.rowSpan ?? 1;
|
|
209
|
-
for (let r = rowIndex; r < rowIndex + rowSpan; r += 1) for (let c = columnIndex; c < columnIndex + colSpan; c += 1) if (r !== rowIndex || c !== columnIndex) covered.add(`${r},${c}`);
|
|
210
|
-
}
|
|
211
|
-
return canonicalCell(cell, isCovered);
|
|
212
|
-
});
|
|
213
|
-
return row.heightPt === void 0 ? { cells } : {
|
|
214
|
-
cells,
|
|
215
|
-
heightPt: row.heightPt
|
|
216
|
-
};
|
|
217
|
-
})
|
|
218
|
-
};
|
|
219
|
-
}
|
|
220
|
-
function canonicalImage(image) {
|
|
221
|
-
const canonical = {
|
|
222
|
-
kind: "image",
|
|
223
|
-
format: image.format,
|
|
224
|
-
base64: image.base64,
|
|
225
|
-
widthPt: image.widthPt,
|
|
226
|
-
heightPt: image.heightPt
|
|
227
|
-
};
|
|
228
|
-
if (image.altText !== void 0) canonical.altText = image.altText;
|
|
229
|
-
return canonical;
|
|
230
|
-
}
|
|
231
|
-
function canonicalMetadata(metadata) {
|
|
232
|
-
const canonical = {};
|
|
233
|
-
if (metadata.title !== void 0) canonical.title = metadata.title;
|
|
234
|
-
if (metadata.author !== void 0) canonical.author = metadata.author;
|
|
235
|
-
if (metadata.subject !== void 0) canonical.subject = metadata.subject;
|
|
236
|
-
if (metadata.keywords !== void 0 && metadata.keywords.length > 0) canonical.keywords = [...metadata.keywords];
|
|
237
|
-
if (metadata.creator !== void 0) canonical.creator = metadata.creator;
|
|
238
|
-
if (metadata.createdIso !== void 0) canonical.createdIso = metadata.createdIso;
|
|
239
|
-
if (metadata.modifiedIso !== void 0) canonical.modifiedIso = metadata.modifiedIso;
|
|
240
|
-
return canonical;
|
|
241
|
-
}
|
|
242
111
|
function normaliseOdtContent(document) {
|
|
243
112
|
if (document.kind !== "wordprocessing") throw new Error(`normaliseOdtContent: expected a 'wordprocessing' document, got '${document.kind}'`);
|
|
244
113
|
const planned = planDocument(document.sections);
|
|
245
114
|
return {
|
|
246
115
|
kind: "wordprocessing",
|
|
247
|
-
metadata: canonicalMetadata(document.metadata),
|
|
116
|
+
metadata: require_typed_shared_canonicalise.canonicalMetadata(document.metadata),
|
|
248
117
|
sections: planned.map((section, index) => {
|
|
249
118
|
const blocks = section.blocks.map((block) => {
|
|
250
119
|
switch (block.kind) {
|
|
251
120
|
case "paragraph": return block.paragraph;
|
|
252
|
-
case "table": return canonicalTable(block.table);
|
|
253
|
-
case "image": return canonicalImage(block.image);
|
|
121
|
+
case "table": return require_typed_shared_canonicalise.canonicalTable(block.table);
|
|
122
|
+
case "image": return require_typed_shared_canonicalise.canonicalImage(block.image);
|
|
254
123
|
}
|
|
255
124
|
});
|
|
256
125
|
return index === 0 ? {
|
|
@@ -319,7 +188,7 @@ function writeSectionBlocks(section, parentStyleName, state, out) {
|
|
|
319
188
|
let openList;
|
|
320
189
|
const closeList = () => {
|
|
321
190
|
if (openList === void 0) return;
|
|
322
|
-
const kind = listKindOf(openList.numId);
|
|
191
|
+
const kind = require_typed_shared_list.listKindOf(openList.numId);
|
|
323
192
|
const built = require_typed_shared_list.writeOdfList(openList.entries, kind === void 0 ? void 0 : listStyleNameFor(kind, state));
|
|
324
193
|
openList.element.attributes = built.attributes;
|
|
325
194
|
openList.element.children = built.children;
|
|
@@ -368,7 +237,7 @@ function writeOdtContent(document, options = {}) {
|
|
|
368
237
|
if (document.kind !== "wordprocessing") throw new Error(`writeOdtContent: expected a 'wordprocessing' document, got '${document.kind}' -- odf.js writes .odt from the wordprocessing arm only`);
|
|
369
238
|
const version = options.version ?? "1.3";
|
|
370
239
|
const textElement = require_xml_fragment.el("office:text");
|
|
371
|
-
const pkg = require_package_io_scaffold.createOdfPackage(require_media_type.ODF_MEDIA_TYPES.odt, textElement, version);
|
|
240
|
+
const pkg = require_package_io_scaffold.createOdfPackage(options.template ? require_media_type.ODF_MEDIA_TYPES.ott : require_media_type.ODF_MEDIA_TYPES.odt, textElement, version);
|
|
372
241
|
const state = {
|
|
373
242
|
pkg,
|
|
374
243
|
registry: require_styles_registry.StyleRegistry.forPart(pkg, CONTENT_PART, { otherPart: {
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { i as writeOdtContent, n as normaliseOdtContent, r as writeOdt, t as OdtWriteOptions } from "../../write-
|
|
1
|
+
import { i as writeOdtContent, n as normaliseOdtContent, r as writeOdt, t as OdtWriteOptions } from "../../write-CPATqG4v.cjs";
|
|
2
2
|
export { OdtWriteOptions, normaliseOdtContent, writeOdt, writeOdtContent };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { i as writeOdtContent, n as normaliseOdtContent, r as writeOdt, t as OdtWriteOptions } from "../../write-
|
|
1
|
+
import { i as writeOdtContent, n as normaliseOdtContent, r as writeOdt, t as OdtWriteOptions } from "../../write-JERychL3.js";
|
|
2
2
|
export { OdtWriteOptions, normaliseOdtContent, writeOdt, writeOdtContent };
|
package/dist/typed/odt/write.js
CHANGED
|
@@ -5,25 +5,16 @@ import { syncManifest } from "../../manifest.js";
|
|
|
5
5
|
import { formatOdfLength } from "../shared/units.js";
|
|
6
6
|
import { StyleRegistry } from "../../styles/registry.js";
|
|
7
7
|
import { writeOdfMetadata } from "../shared/metadata.js";
|
|
8
|
-
import { buildOdfListStyle, writeOdfList } from "../shared/list.js";
|
|
9
|
-
import {
|
|
8
|
+
import { buildOdfListStyle, closeListPlan, listKindOf, planListMembership, writeOdfList } from "../shared/list.js";
|
|
9
|
+
import { writeOdfParagraph } from "../shared/paragraph.js";
|
|
10
10
|
import { writeOdfTable } from "../shared/table.js";
|
|
11
11
|
import { createOdfPackage, odfPartContainer } from "../../package-io/scaffold.js";
|
|
12
|
-
import {
|
|
12
|
+
import { canonicalImage, canonicalMetadata, canonicalParagraph, canonicalTable } from "../shared/canonicalise.js";
|
|
13
|
+
import { flattenTree } from "document-schema.js";
|
|
13
14
|
//#region src/typed/odt/write.ts
|
|
14
15
|
const CONTENT_PART = "content.xml";
|
|
15
16
|
const STYLES_PART = "styles.xml";
|
|
16
17
|
const PICTURES_DIRECTORY = "Pictures";
|
|
17
|
-
function listKindOf(numId) {
|
|
18
|
-
if (numId === void 0) return;
|
|
19
|
-
if (numId.startsWith("ordered:")) return "ordered";
|
|
20
|
-
return numId.startsWith("bullet:") ? "bullet" : void 0;
|
|
21
|
-
}
|
|
22
|
-
const NO_NUM_ID_KEY = " ";
|
|
23
|
-
function canonicalNumId(incoming, ordinal) {
|
|
24
|
-
const kind = listKindOf(incoming);
|
|
25
|
-
return kind === void 0 ? `list${ordinal}` : `${kind}:list${ordinal}`;
|
|
26
|
-
}
|
|
27
18
|
function unsupported(what, where) {
|
|
28
19
|
return /* @__PURE__ */ new Error(`writeOdt: ${where} carries ${what}, which this writer does not write yet -- refusing rather than producing an .odt that silently lost it. See ExaDev/documents.js for the tracked follow-up covering the fidelity constructs and embedded objects.`);
|
|
29
20
|
}
|
|
@@ -35,44 +26,6 @@ function assertWritableBlock(block) {
|
|
|
35
26
|
if (block.kind === "embeddedObject") throw unsupported("an embedded object", "a section's block flow");
|
|
36
27
|
if (block.kind === "paragraph") assertWritableParagraph(block);
|
|
37
28
|
}
|
|
38
|
-
function canonicalColor(color) {
|
|
39
|
-
return rgbHexToColor(colorToRgbHex(color));
|
|
40
|
-
}
|
|
41
|
-
function canonicalRun(run) {
|
|
42
|
-
const canonical = { text: run.text };
|
|
43
|
-
if (run.bold !== void 0) canonical.bold = run.bold;
|
|
44
|
-
if (run.italic !== void 0) canonical.italic = run.italic;
|
|
45
|
-
if (run.underline !== void 0) canonical.underline = run.underline;
|
|
46
|
-
if (run.strike !== void 0) canonical.strike = run.strike;
|
|
47
|
-
if (run.fontFamily !== void 0) canonical.fontFamily = run.fontFamily;
|
|
48
|
-
if (run.sizePt !== void 0) canonical.sizePt = run.sizePt;
|
|
49
|
-
if (run.color !== void 0) canonical.color = canonicalColor(run.color);
|
|
50
|
-
if (run.hyperlink !== void 0) canonical.hyperlink = run.hyperlink;
|
|
51
|
-
return canonical;
|
|
52
|
-
}
|
|
53
|
-
function canonicalParagraph(paragraph, listNumId) {
|
|
54
|
-
const canonical = {
|
|
55
|
-
kind: "paragraph",
|
|
56
|
-
runs: segmentOdfParagraphRuns(paragraph.runs).map(canonicalRun)
|
|
57
|
-
};
|
|
58
|
-
if (paragraph.headingLevel !== void 0) {
|
|
59
|
-
canonical.headingLevel = paragraph.headingLevel;
|
|
60
|
-
canonical.styleId = `Heading${paragraph.headingLevel}`;
|
|
61
|
-
}
|
|
62
|
-
if (paragraph.alignment !== void 0) canonical.alignment = paragraph.alignment;
|
|
63
|
-
if (listNumId !== void 0 && paragraph.list !== void 0) canonical.list = {
|
|
64
|
-
numId: listNumId,
|
|
65
|
-
level: paragraph.list.level
|
|
66
|
-
};
|
|
67
|
-
if (paragraph.spacingBeforePt !== void 0) canonical.spacingBeforePt = paragraph.spacingBeforePt;
|
|
68
|
-
if (paragraph.spacingAfterPt !== void 0) canonical.spacingAfterPt = paragraph.spacingAfterPt;
|
|
69
|
-
if (paragraph.lineSpacing !== void 0) canonical.lineSpacing = paragraph.lineSpacing;
|
|
70
|
-
if (paragraph.indentLeftPt !== void 0) canonical.indentLeftPt = paragraph.indentLeftPt;
|
|
71
|
-
if (paragraph.indentFirstLinePt !== void 0) canonical.indentFirstLinePt = paragraph.indentFirstLinePt;
|
|
72
|
-
if (paragraph.pageBreakBefore !== void 0) canonical.pageBreakBefore = paragraph.pageBreakBefore;
|
|
73
|
-
if (paragraph.pageBreakAfter !== void 0) canonical.pageBreakAfter = paragraph.pageBreakAfter;
|
|
74
|
-
return canonical;
|
|
75
|
-
}
|
|
76
29
|
function emptyAnchorParagraph(pageBreakBefore) {
|
|
77
30
|
return pageBreakBefore ? {
|
|
78
31
|
kind: "paragraph",
|
|
@@ -97,8 +50,7 @@ function planSection(section, needsLeadingParagraph, listState) {
|
|
|
97
50
|
return false;
|
|
98
51
|
};
|
|
99
52
|
const closeListRun = () => {
|
|
100
|
-
listState
|
|
101
|
-
listState.openCanonicalNumId = void 0;
|
|
53
|
+
closeListPlan(listState);
|
|
102
54
|
};
|
|
103
55
|
const flushPendingPageBreak = () => {
|
|
104
56
|
if (pendingPageBreak) {
|
|
@@ -118,17 +70,8 @@ function planSection(section, needsLeadingParagraph, listState) {
|
|
|
118
70
|
continue;
|
|
119
71
|
}
|
|
120
72
|
if (block.kind === "paragraph") {
|
|
121
|
-
const
|
|
122
|
-
|
|
123
|
-
else {
|
|
124
|
-
const incomingKey = membership.numId ?? NO_NUM_ID_KEY;
|
|
125
|
-
if (listState.openNumId !== incomingKey) {
|
|
126
|
-
listState.openNumId = incomingKey;
|
|
127
|
-
listState.openCanonicalNumId = canonicalNumId(membership.numId, listState.next);
|
|
128
|
-
listState.next += 1;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
const paragraph = canonicalParagraph(block, membership === void 0 ? void 0 : listState.openCanonicalNumId);
|
|
73
|
+
const canonicalId = planListMembership(block.list, listState);
|
|
74
|
+
const paragraph = canonicalParagraph(block, canonicalId);
|
|
132
75
|
pushParagraph(pendingPageBreak ? {
|
|
133
76
|
...paragraph,
|
|
134
77
|
pageBreakBefore: true
|
|
@@ -164,80 +107,6 @@ function planDocument(sections) {
|
|
|
164
107
|
const listState = { next: 1 };
|
|
165
108
|
return sections.map((section, index) => planSection(section, index > 0, listState));
|
|
166
109
|
}
|
|
167
|
-
function canonicalCell(cell, covered) {
|
|
168
|
-
if (covered) return { blocks: [] };
|
|
169
|
-
const canonical = { blocks: cell.blocks.map((block) => {
|
|
170
|
-
if (block.kind !== "paragraph") throw unsupported(`a "${block.kind}" block`, "a table cell");
|
|
171
|
-
assertWritableParagraph(block);
|
|
172
|
-
return canonicalParagraph(block, void 0);
|
|
173
|
-
}) };
|
|
174
|
-
if (cell.colSpan !== void 0) canonical.colSpan = cell.colSpan;
|
|
175
|
-
if (cell.rowSpan !== void 0) canonical.rowSpan = cell.rowSpan;
|
|
176
|
-
if (cell.background !== void 0) canonical.background = canonicalColor(cell.background);
|
|
177
|
-
if (cell.borders !== void 0) {
|
|
178
|
-
const borders = {};
|
|
179
|
-
for (const edge of [
|
|
180
|
-
"left",
|
|
181
|
-
"right",
|
|
182
|
-
"top",
|
|
183
|
-
"bottom"
|
|
184
|
-
]) {
|
|
185
|
-
const border = cell.borders[edge];
|
|
186
|
-
if (border !== void 0) borders[edge] = {
|
|
187
|
-
color: canonicalColor(border.color),
|
|
188
|
-
widthPt: border.widthPt,
|
|
189
|
-
style: border.style ?? "solid"
|
|
190
|
-
};
|
|
191
|
-
}
|
|
192
|
-
canonical.borders = borders;
|
|
193
|
-
}
|
|
194
|
-
return canonical;
|
|
195
|
-
}
|
|
196
|
-
function canonicalTable(table) {
|
|
197
|
-
const covered = /* @__PURE__ */ new Set();
|
|
198
|
-
return {
|
|
199
|
-
kind: "table",
|
|
200
|
-
columnWidthsPt: [...table.columnWidthsPt],
|
|
201
|
-
rows: table.rows.map((row, rowIndex) => {
|
|
202
|
-
const cells = row.cells.map((cell, columnIndex) => {
|
|
203
|
-
const key = `${rowIndex},${columnIndex}`;
|
|
204
|
-
const isCovered = covered.has(key);
|
|
205
|
-
if (!isCovered) {
|
|
206
|
-
const colSpan = cell.colSpan ?? 1;
|
|
207
|
-
const rowSpan = cell.rowSpan ?? 1;
|
|
208
|
-
for (let r = rowIndex; r < rowIndex + rowSpan; r += 1) for (let c = columnIndex; c < columnIndex + colSpan; c += 1) if (r !== rowIndex || c !== columnIndex) covered.add(`${r},${c}`);
|
|
209
|
-
}
|
|
210
|
-
return canonicalCell(cell, isCovered);
|
|
211
|
-
});
|
|
212
|
-
return row.heightPt === void 0 ? { cells } : {
|
|
213
|
-
cells,
|
|
214
|
-
heightPt: row.heightPt
|
|
215
|
-
};
|
|
216
|
-
})
|
|
217
|
-
};
|
|
218
|
-
}
|
|
219
|
-
function canonicalImage(image) {
|
|
220
|
-
const canonical = {
|
|
221
|
-
kind: "image",
|
|
222
|
-
format: image.format,
|
|
223
|
-
base64: image.base64,
|
|
224
|
-
widthPt: image.widthPt,
|
|
225
|
-
heightPt: image.heightPt
|
|
226
|
-
};
|
|
227
|
-
if (image.altText !== void 0) canonical.altText = image.altText;
|
|
228
|
-
return canonical;
|
|
229
|
-
}
|
|
230
|
-
function canonicalMetadata(metadata) {
|
|
231
|
-
const canonical = {};
|
|
232
|
-
if (metadata.title !== void 0) canonical.title = metadata.title;
|
|
233
|
-
if (metadata.author !== void 0) canonical.author = metadata.author;
|
|
234
|
-
if (metadata.subject !== void 0) canonical.subject = metadata.subject;
|
|
235
|
-
if (metadata.keywords !== void 0 && metadata.keywords.length > 0) canonical.keywords = [...metadata.keywords];
|
|
236
|
-
if (metadata.creator !== void 0) canonical.creator = metadata.creator;
|
|
237
|
-
if (metadata.createdIso !== void 0) canonical.createdIso = metadata.createdIso;
|
|
238
|
-
if (metadata.modifiedIso !== void 0) canonical.modifiedIso = metadata.modifiedIso;
|
|
239
|
-
return canonical;
|
|
240
|
-
}
|
|
241
110
|
function normaliseOdtContent(document) {
|
|
242
111
|
if (document.kind !== "wordprocessing") throw new Error(`normaliseOdtContent: expected a 'wordprocessing' document, got '${document.kind}'`);
|
|
243
112
|
const planned = planDocument(document.sections);
|
|
@@ -367,7 +236,7 @@ function writeOdtContent(document, options = {}) {
|
|
|
367
236
|
if (document.kind !== "wordprocessing") throw new Error(`writeOdtContent: expected a 'wordprocessing' document, got '${document.kind}' -- odf.js writes .odt from the wordprocessing arm only`);
|
|
368
237
|
const version = options.version ?? "1.3";
|
|
369
238
|
const textElement = el("office:text");
|
|
370
|
-
const pkg = createOdfPackage(ODF_MEDIA_TYPES.odt, textElement, version);
|
|
239
|
+
const pkg = createOdfPackage(options.template ? ODF_MEDIA_TYPES.ott : ODF_MEDIA_TYPES.odt, textElement, version);
|
|
371
240
|
const state = {
|
|
372
241
|
pkg,
|
|
373
242
|
registry: StyleRegistry.forPart(pkg, CONTENT_PART, { otherPart: {
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_typed_shared_paragraph = require("./paragraph.cjs");
|
|
3
|
+
let document_schema_js = require("document-schema.js");
|
|
4
|
+
//#region src/typed/shared/canonicalise.ts
|
|
5
|
+
function unsupportedContent(what, where) {
|
|
6
|
+
return /* @__PURE__ */ new Error(`${where} carries ${what}, which no ODF writer in this package can produce yet -- refusing to state a canonical form for content that would be silently lost on write. See ExaDev/documents.js for the tracked follow-up covering the fidelity constructs and embedded objects.`);
|
|
7
|
+
}
|
|
8
|
+
function canonicalColor(color) {
|
|
9
|
+
return (0, document_schema_js.rgbHexToColor)((0, document_schema_js.colorToRgbHex)(color));
|
|
10
|
+
}
|
|
11
|
+
function canonicalRun(run) {
|
|
12
|
+
const canonical = { text: run.text };
|
|
13
|
+
if (run.bold !== void 0) canonical.bold = run.bold;
|
|
14
|
+
if (run.italic !== void 0) canonical.italic = run.italic;
|
|
15
|
+
if (run.underline !== void 0) canonical.underline = run.underline;
|
|
16
|
+
if (run.strike !== void 0) canonical.strike = run.strike;
|
|
17
|
+
if (run.fontFamily !== void 0) canonical.fontFamily = run.fontFamily;
|
|
18
|
+
if (run.sizePt !== void 0) canonical.sizePt = run.sizePt;
|
|
19
|
+
if (run.color !== void 0) canonical.color = canonicalColor(run.color);
|
|
20
|
+
if (run.hyperlink !== void 0) canonical.hyperlink = run.hyperlink;
|
|
21
|
+
return canonical;
|
|
22
|
+
}
|
|
23
|
+
function canonicalParagraph(paragraph, listNumId) {
|
|
24
|
+
if (paragraph.constructs !== void 0 && paragraph.constructs.length > 0) throw unsupportedContent("run-level construct extents (a field, bookmark, note, annotation, or tracked change)", "a paragraph");
|
|
25
|
+
const canonical = {
|
|
26
|
+
kind: "paragraph",
|
|
27
|
+
runs: require_typed_shared_paragraph.segmentOdfParagraphRuns(paragraph.runs).map(canonicalRun)
|
|
28
|
+
};
|
|
29
|
+
if (paragraph.headingLevel !== void 0) {
|
|
30
|
+
canonical.headingLevel = paragraph.headingLevel;
|
|
31
|
+
canonical.styleId = `Heading${paragraph.headingLevel}`;
|
|
32
|
+
}
|
|
33
|
+
if (paragraph.alignment !== void 0) canonical.alignment = paragraph.alignment;
|
|
34
|
+
if (listNumId !== void 0 && paragraph.list !== void 0) canonical.list = {
|
|
35
|
+
numId: listNumId,
|
|
36
|
+
level: paragraph.list.level
|
|
37
|
+
};
|
|
38
|
+
if (paragraph.spacingBeforePt !== void 0) canonical.spacingBeforePt = paragraph.spacingBeforePt;
|
|
39
|
+
if (paragraph.spacingAfterPt !== void 0) canonical.spacingAfterPt = paragraph.spacingAfterPt;
|
|
40
|
+
if (paragraph.lineSpacing !== void 0) canonical.lineSpacing = paragraph.lineSpacing;
|
|
41
|
+
if (paragraph.indentLeftPt !== void 0) canonical.indentLeftPt = paragraph.indentLeftPt;
|
|
42
|
+
if (paragraph.indentFirstLinePt !== void 0) canonical.indentFirstLinePt = paragraph.indentFirstLinePt;
|
|
43
|
+
if (paragraph.pageBreakBefore !== void 0) canonical.pageBreakBefore = paragraph.pageBreakBefore;
|
|
44
|
+
if (paragraph.pageBreakAfter !== void 0) canonical.pageBreakAfter = paragraph.pageBreakAfter;
|
|
45
|
+
return canonical;
|
|
46
|
+
}
|
|
47
|
+
function canonicalCell(cell, covered) {
|
|
48
|
+
if (covered) return { blocks: [] };
|
|
49
|
+
const canonical = { blocks: cell.blocks.map((block) => {
|
|
50
|
+
if (block.kind !== "paragraph") throw unsupportedContent(`a "${block.kind}" block`, "a table cell");
|
|
51
|
+
return canonicalParagraph(block, void 0);
|
|
52
|
+
}) };
|
|
53
|
+
if (cell.colSpan !== void 0) canonical.colSpan = cell.colSpan;
|
|
54
|
+
if (cell.rowSpan !== void 0) canonical.rowSpan = cell.rowSpan;
|
|
55
|
+
if (cell.background !== void 0) canonical.background = canonicalColor(cell.background);
|
|
56
|
+
if (cell.borders !== void 0) {
|
|
57
|
+
const borders = {};
|
|
58
|
+
for (const edge of [
|
|
59
|
+
"left",
|
|
60
|
+
"right",
|
|
61
|
+
"top",
|
|
62
|
+
"bottom"
|
|
63
|
+
]) {
|
|
64
|
+
const border = cell.borders[edge];
|
|
65
|
+
if (border !== void 0) borders[edge] = {
|
|
66
|
+
color: canonicalColor(border.color),
|
|
67
|
+
widthPt: border.widthPt,
|
|
68
|
+
style: border.style ?? "solid"
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
canonical.borders = borders;
|
|
72
|
+
}
|
|
73
|
+
return canonical;
|
|
74
|
+
}
|
|
75
|
+
function canonicalTable(table) {
|
|
76
|
+
const covered = /* @__PURE__ */ new Set();
|
|
77
|
+
return {
|
|
78
|
+
kind: "table",
|
|
79
|
+
columnWidthsPt: [...table.columnWidthsPt],
|
|
80
|
+
rows: table.rows.map((row, rowIndex) => {
|
|
81
|
+
const cells = row.cells.map((cell, columnIndex) => {
|
|
82
|
+
const key = `${rowIndex},${columnIndex}`;
|
|
83
|
+
const isCovered = covered.has(key);
|
|
84
|
+
if (!isCovered) {
|
|
85
|
+
const colSpan = cell.colSpan ?? 1;
|
|
86
|
+
const rowSpan = cell.rowSpan ?? 1;
|
|
87
|
+
for (let r = rowIndex; r < rowIndex + rowSpan; r += 1) for (let c = columnIndex; c < columnIndex + colSpan; c += 1) if (r !== rowIndex || c !== columnIndex) covered.add(`${r},${c}`);
|
|
88
|
+
}
|
|
89
|
+
return canonicalCell(cell, isCovered);
|
|
90
|
+
});
|
|
91
|
+
return row.heightPt === void 0 ? { cells } : {
|
|
92
|
+
cells,
|
|
93
|
+
heightPt: row.heightPt
|
|
94
|
+
};
|
|
95
|
+
})
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
function canonicalMetadata(metadata) {
|
|
99
|
+
const canonical = {};
|
|
100
|
+
if (metadata.title !== void 0) canonical.title = metadata.title;
|
|
101
|
+
if (metadata.author !== void 0) canonical.author = metadata.author;
|
|
102
|
+
if (metadata.subject !== void 0) canonical.subject = metadata.subject;
|
|
103
|
+
if (metadata.keywords !== void 0 && metadata.keywords.length > 0) canonical.keywords = [...metadata.keywords];
|
|
104
|
+
if (metadata.creator !== void 0) canonical.creator = metadata.creator;
|
|
105
|
+
if (metadata.createdIso !== void 0) canonical.createdIso = metadata.createdIso;
|
|
106
|
+
if (metadata.modifiedIso !== void 0) canonical.modifiedIso = metadata.modifiedIso;
|
|
107
|
+
return canonical;
|
|
108
|
+
}
|
|
109
|
+
function canonicalImage(image) {
|
|
110
|
+
const canonical = {
|
|
111
|
+
kind: "image",
|
|
112
|
+
format: image.format,
|
|
113
|
+
base64: image.base64,
|
|
114
|
+
widthPt: image.widthPt,
|
|
115
|
+
heightPt: image.heightPt
|
|
116
|
+
};
|
|
117
|
+
if (image.altText !== void 0) canonical.altText = image.altText;
|
|
118
|
+
return canonical;
|
|
119
|
+
}
|
|
120
|
+
//#endregion
|
|
121
|
+
exports.canonicalColor = canonicalColor;
|
|
122
|
+
exports.canonicalImage = canonicalImage;
|
|
123
|
+
exports.canonicalMetadata = canonicalMetadata;
|
|
124
|
+
exports.canonicalParagraph = canonicalParagraph;
|
|
125
|
+
exports.canonicalRun = canonicalRun;
|
|
126
|
+
exports.canonicalTable = canonicalTable;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Color, ContentImageBlock, ContentParagraph, ContentRun, ContentTable, LayoutMetadata } from "document-schema.js";
|
|
2
|
+
//#region src/typed/shared/canonicalise.d.ts
|
|
3
|
+
declare function canonicalColor(color: Color): Color;
|
|
4
|
+
declare function canonicalRun(run: ContentRun): ContentRun;
|
|
5
|
+
declare function canonicalParagraph(paragraph: ContentParagraph, listNumId: string | undefined): ContentParagraph;
|
|
6
|
+
declare function canonicalTable(table: ContentTable): ContentTable;
|
|
7
|
+
declare function canonicalMetadata(metadata: LayoutMetadata): LayoutMetadata;
|
|
8
|
+
declare function canonicalImage(image: ContentImageBlock): ContentImageBlock;
|
|
9
|
+
//#endregion
|
|
10
|
+
export { canonicalColor, canonicalImage, canonicalMetadata, canonicalParagraph, canonicalRun, canonicalTable };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Color, ContentImageBlock, ContentParagraph, ContentRun, ContentTable, LayoutMetadata } from "document-schema.js";
|
|
2
|
+
//#region src/typed/shared/canonicalise.d.ts
|
|
3
|
+
declare function canonicalColor(color: Color): Color;
|
|
4
|
+
declare function canonicalRun(run: ContentRun): ContentRun;
|
|
5
|
+
declare function canonicalParagraph(paragraph: ContentParagraph, listNumId: string | undefined): ContentParagraph;
|
|
6
|
+
declare function canonicalTable(table: ContentTable): ContentTable;
|
|
7
|
+
declare function canonicalMetadata(metadata: LayoutMetadata): LayoutMetadata;
|
|
8
|
+
declare function canonicalImage(image: ContentImageBlock): ContentImageBlock;
|
|
9
|
+
//#endregion
|
|
10
|
+
export { canonicalColor, canonicalImage, canonicalMetadata, canonicalParagraph, canonicalRun, canonicalTable };
|