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.
Files changed (128) hide show
  1. package/README.md +172 -18
  2. package/dist/{codec-BnzBd5_I.d.cts → codec-CFdlbFLJ.d.cts} +16 -10
  3. package/dist/{codec-Dg_HWuH1.d.ts → codec-DTAgph2r.d.ts} +16 -10
  4. package/dist/codec.d.cts +1 -1
  5. package/dist/codec.d.ts +1 -1
  6. package/dist/{embedded-BONPxvS3.js → embedded-BnavfkP-.js} +3 -3
  7. package/dist/{embedded-wrtHCJ68.cjs → embedded-Bxyss_ck.cjs} +14 -2
  8. package/dist/index.cjs +34 -1
  9. package/dist/index.d.cts +19 -13
  10. package/dist/index.d.ts +19 -13
  11. package/dist/index.js +12 -6
  12. package/dist/{list-vhXd0Jf6.d.ts → list-7FO0SDqZ.d.ts} +14 -1
  13. package/dist/{list-Bttwr1mk.d.cts → list-BorrTJBY.d.cts} +14 -1
  14. package/dist/{ns-C14w-Zhf.d.cts → ns-DrleaIZQ.d.cts} +3 -1
  15. package/dist/{ns-CTyKJZeF.d.ts → ns-E0TfX9tZ.d.ts} +3 -1
  16. package/dist/ooo1/ns.cjs +9 -0
  17. package/dist/ooo1/ns.d.cts +2 -2
  18. package/dist/ooo1/ns.d.ts +2 -2
  19. package/dist/ooo1/ns.js +8 -1
  20. package/dist/ooo1/properties.cjs +30 -0
  21. package/dist/ooo1/properties.d.cts +6 -2
  22. package/dist/ooo1/properties.d.ts +6 -2
  23. package/dist/ooo1/properties.js +30 -1
  24. package/dist/ooo1/read.cjs +1 -1
  25. package/dist/ooo1/read.d.cts +1 -1
  26. package/dist/ooo1/read.d.ts +1 -1
  27. package/dist/ooo1/read.js +1 -1
  28. package/dist/ooo1/transform.cjs +290 -0
  29. package/dist/ooo1/transform.d.cts +2 -2
  30. package/dist/ooo1/transform.d.ts +2 -2
  31. package/dist/ooo1/transform.js +293 -4
  32. package/dist/ooo1/write.cjs +40 -0
  33. package/dist/ooo1/write.d.cts +2 -0
  34. package/dist/ooo1/write.d.ts +2 -0
  35. package/dist/ooo1/write.js +32 -0
  36. package/dist/package-io/scaffold.cjs +2 -1
  37. package/dist/package-io/scaffold.js +2 -1
  38. package/dist/{paragraph-BdwsQisB.d.cts → paragraph-Bf6Iq5wC.d.cts} +1 -1
  39. package/dist/{paragraph-BoVy1LrN.d.ts → paragraph-DtC86tft.d.ts} +1 -1
  40. package/dist/{path-CK0dIPgx.d.cts → path-8HQS-J7y.d.cts} +3 -1
  41. package/dist/{path-CK0dIPgx.d.ts → path-8HQS-J7y.d.ts} +3 -1
  42. package/dist/{read-Bo1GBjSE.d.ts → read-A3CJkqVM.d.ts} +3 -1
  43. package/dist/{read-RFqq4ckj.d.cts → read-BgnLFuSi.d.cts} +1 -1
  44. package/dist/{read-3yy5EFV_.d.ts → read-CqaZ01kU.d.ts} +1 -1
  45. package/dist/{read-tpfiT_n4.d.cts → read-fphkvCpR.d.cts} +3 -1
  46. package/dist/{shapes-DUzrrf7b.d.ts → shapes-B6Ms7ibr.d.ts} +1 -1
  47. package/dist/{shapes-BQhXAk0D.d.cts → shapes-CbBc9t0y.d.cts} +1 -1
  48. package/dist/{table-ByhqRnSG.d.cts → table-CECMtPxZ.d.cts} +6 -2
  49. package/dist/{table-DElqGcT0.d.ts → table-XuniPr2I.d.ts} +6 -2
  50. package/dist/{transform-SDysw9wx.d.cts → transform-DFCPKX7e.d.cts} +2 -1
  51. package/dist/{transform-DRr76JEu.d.ts → transform-DPliWQuD.d.ts} +2 -1
  52. package/dist/typed/draw/embedded.cjs +1 -1
  53. package/dist/typed/draw/embedded.js +1 -1
  54. package/dist/typed/draw/shapes.cjs +7 -2
  55. package/dist/typed/draw/shapes.d.cts +1 -1
  56. package/dist/typed/draw/shapes.d.ts +1 -1
  57. package/dist/typed/draw/shapes.js +7 -2
  58. package/dist/typed/draw/write-shapes.cjs +210 -0
  59. package/dist/typed/draw/write-shapes.d.cts +2 -0
  60. package/dist/typed/draw/write-shapes.d.ts +2 -0
  61. package/dist/typed/draw/write-shapes.js +203 -0
  62. package/dist/typed/draw/write-vectors.cjs +132 -0
  63. package/dist/typed/draw/write-vectors.d.cts +2 -0
  64. package/dist/typed/draw/write-vectors.d.ts +2 -0
  65. package/dist/typed/draw/write-vectors.js +129 -0
  66. package/dist/typed/odb/form.cjs +1 -1
  67. package/dist/typed/odb/form.js +1 -1
  68. package/dist/typed/odg/write.cjs +80 -0
  69. package/dist/typed/odg/write.d.cts +2 -0
  70. package/dist/typed/odg/write.d.ts +2 -0
  71. package/dist/typed/odg/write.js +77 -0
  72. package/dist/typed/odp/write.cjs +108 -0
  73. package/dist/typed/odp/write.d.cts +2 -0
  74. package/dist/typed/odp/write.d.ts +2 -0
  75. package/dist/typed/odp/write.js +105 -0
  76. package/dist/typed/ods/read.cjs +3 -1
  77. package/dist/typed/ods/read.d.cts +2 -2
  78. package/dist/typed/ods/read.d.ts +2 -2
  79. package/dist/typed/ods/read.js +2 -2
  80. package/dist/typed/ods/write.cjs +578 -0
  81. package/dist/typed/ods/write.d.cts +2 -0
  82. package/dist/typed/ods/write.d.ts +2 -0
  83. package/dist/typed/ods/write.js +575 -0
  84. package/dist/typed/odt/read.cjs +1 -1
  85. package/dist/typed/odt/read.js +1 -1
  86. package/dist/typed/odt/write.cjs +9 -140
  87. package/dist/typed/odt/write.d.cts +1 -1
  88. package/dist/typed/odt/write.d.ts +1 -1
  89. package/dist/typed/odt/write.js +8 -139
  90. package/dist/typed/shared/canonicalise.cjs +126 -0
  91. package/dist/typed/shared/canonicalise.d.cts +10 -0
  92. package/dist/typed/shared/canonicalise.d.ts +10 -0
  93. package/dist/typed/shared/canonicalise.js +120 -0
  94. package/dist/typed/shared/list.cjs +32 -0
  95. package/dist/typed/shared/list.d.cts +2 -2
  96. package/dist/typed/shared/list.d.ts +2 -2
  97. package/dist/typed/shared/list.js +28 -1
  98. package/dist/typed/shared/paragraph.d.cts +1 -1
  99. package/dist/typed/shared/paragraph.d.ts +1 -1
  100. package/dist/typed/shared/path.cjs +19 -0
  101. package/dist/typed/shared/path.d.cts +2 -2
  102. package/dist/typed/shared/path.d.ts +2 -2
  103. package/dist/typed/shared/path.js +18 -1
  104. package/dist/typed/shared/table.cjs +3 -0
  105. package/dist/typed/shared/table.d.cts +2 -2
  106. package/dist/typed/shared/table.d.ts +2 -2
  107. package/dist/typed/shared/table.js +1 -1
  108. package/dist/typed/shared/units.cjs +16 -1
  109. package/dist/typed/shared/units.d.cts +2 -2
  110. package/dist/typed/shared/units.d.ts +2 -2
  111. package/dist/typed/shared/units.js +16 -2
  112. package/dist/{units-BQSNkTQZ.d.ts → units-DdyaQolR.d.cts} +2 -1
  113. package/dist/{units-BQSNkTQZ.d.cts → units-DdyaQolR.d.ts} +2 -1
  114. package/dist/write-4kMi-asu.d.ts +14 -0
  115. package/dist/write-BZXpT8F6.d.cts +17 -0
  116. package/dist/write-BhG3t3fJ.d.cts +14 -0
  117. package/dist/write-BuLQmwLD.d.cts +14 -0
  118. package/dist/write-C2c4xBXs.d.cts +14 -0
  119. package/dist/{write-7Uu_wlkL.d.cts → write-CPATqG4v.d.cts} +1 -0
  120. package/dist/write-CfTE2jY8.d.ts +14 -0
  121. package/dist/write-DttX1rTC.d.ts +14 -0
  122. package/dist/{write-DGcI9W7Z.d.ts → write-JERychL3.d.ts} +1 -0
  123. package/dist/write-SKnCTU4C.d.ts +17 -0
  124. package/dist/write-shapes-Co7BrmMZ.d.ts +36 -0
  125. package/dist/write-shapes-D4piGKf4.d.cts +36 -0
  126. package/dist/write-vectors-B-RVHAKI.d.cts +11 -0
  127. package/dist/write-vectors-CYjZoVBW.d.ts +11 -0
  128. package/package.json +2 -2
@@ -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.openNumId = void 0;
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 membership = block.list;
123
- if (membership === void 0) closeListRun();
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-7Uu_wlkL.cjs";
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-DGcI9W7Z.js";
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 };
@@ -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 { segmentOdfParagraphRuns, writeOdfParagraph } from "../shared/paragraph.js";
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 { colorToRgbHex, flattenTree, rgbHexToColor } from "document-schema.js";
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.openNumId = void 0;
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 membership = block.list;
122
- if (membership === void 0) closeListRun();
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 };