odf.js 6.3.0 → 6.4.1

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 (140) 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/image/sniff.cjs +26 -0
  9. package/dist/image/sniff.d.cts +1 -1
  10. package/dist/image/sniff.d.ts +1 -1
  11. package/dist/image/sniff.js +26 -0
  12. package/dist/index.cjs +34 -1
  13. package/dist/index.d.cts +20 -14
  14. package/dist/index.d.ts +20 -14
  15. package/dist/index.js +12 -6
  16. package/dist/{list-vhXd0Jf6.d.ts → list-7FO0SDqZ.d.ts} +14 -1
  17. package/dist/{list-Bttwr1mk.d.cts → list-BorrTJBY.d.cts} +14 -1
  18. package/dist/manifest.cjs +2 -0
  19. package/dist/manifest.js +2 -0
  20. package/dist/{ns-C14w-Zhf.d.cts → ns-DrleaIZQ.d.cts} +3 -1
  21. package/dist/{ns-CTyKJZeF.d.ts → ns-E0TfX9tZ.d.ts} +3 -1
  22. package/dist/ooo1/ns.cjs +9 -0
  23. package/dist/ooo1/ns.d.cts +2 -2
  24. package/dist/ooo1/ns.d.ts +2 -2
  25. package/dist/ooo1/ns.js +8 -1
  26. package/dist/ooo1/properties.cjs +30 -0
  27. package/dist/ooo1/properties.d.cts +6 -2
  28. package/dist/ooo1/properties.d.ts +6 -2
  29. package/dist/ooo1/properties.js +30 -1
  30. package/dist/ooo1/read.cjs +1 -1
  31. package/dist/ooo1/read.d.cts +1 -1
  32. package/dist/ooo1/read.d.ts +1 -1
  33. package/dist/ooo1/read.js +1 -1
  34. package/dist/ooo1/transform.cjs +290 -0
  35. package/dist/ooo1/transform.d.cts +2 -2
  36. package/dist/ooo1/transform.d.ts +2 -2
  37. package/dist/ooo1/transform.js +293 -4
  38. package/dist/ooo1/write.cjs +40 -0
  39. package/dist/ooo1/write.d.cts +2 -0
  40. package/dist/ooo1/write.d.ts +2 -0
  41. package/dist/ooo1/write.js +32 -0
  42. package/dist/package-io/scaffold.cjs +2 -1
  43. package/dist/package-io/scaffold.js +2 -1
  44. package/dist/{paragraph-BdwsQisB.d.cts → paragraph-Bf6Iq5wC.d.cts} +1 -1
  45. package/dist/{paragraph-BoVy1LrN.d.ts → paragraph-DtC86tft.d.ts} +1 -1
  46. package/dist/{path-CK0dIPgx.d.cts → path-8HQS-J7y.d.cts} +3 -1
  47. package/dist/{path-CK0dIPgx.d.ts → path-8HQS-J7y.d.ts} +3 -1
  48. package/dist/{read-Bo1GBjSE.d.ts → read-A3CJkqVM.d.ts} +3 -1
  49. package/dist/{read-RFqq4ckj.d.cts → read-BgnLFuSi.d.cts} +1 -1
  50. package/dist/{read-3yy5EFV_.d.ts → read-CqaZ01kU.d.ts} +1 -1
  51. package/dist/{read-tpfiT_n4.d.cts → read-fphkvCpR.d.cts} +3 -1
  52. package/dist/{shapes-DUzrrf7b.d.ts → shapes-B6Ms7ibr.d.ts} +1 -1
  53. package/dist/{shapes-BQhXAk0D.d.cts → shapes-CbBc9t0y.d.cts} +1 -1
  54. package/dist/{sniff-DGOBHA0O.d.cts → sniff-eR8lObzF.d.cts} +1 -1
  55. package/dist/{sniff-DGOBHA0O.d.ts → sniff-eR8lObzF.d.ts} +1 -1
  56. package/dist/{table-ByhqRnSG.d.cts → table-CECMtPxZ.d.cts} +6 -2
  57. package/dist/{table-DElqGcT0.d.ts → table-XuniPr2I.d.ts} +6 -2
  58. package/dist/{transform-SDysw9wx.d.cts → transform-DFCPKX7e.d.cts} +2 -1
  59. package/dist/{transform-DRr76JEu.d.ts → transform-DPliWQuD.d.ts} +2 -1
  60. package/dist/typed/draw/embedded.cjs +1 -1
  61. package/dist/typed/draw/embedded.js +1 -1
  62. package/dist/typed/draw/shapes.cjs +7 -2
  63. package/dist/typed/draw/shapes.d.cts +1 -1
  64. package/dist/typed/draw/shapes.d.ts +1 -1
  65. package/dist/typed/draw/shapes.js +7 -2
  66. package/dist/typed/draw/write-shapes.cjs +211 -0
  67. package/dist/typed/draw/write-shapes.d.cts +2 -0
  68. package/dist/typed/draw/write-shapes.d.ts +2 -0
  69. package/dist/typed/draw/write-shapes.js +204 -0
  70. package/dist/typed/draw/write-vectors.cjs +132 -0
  71. package/dist/typed/draw/write-vectors.d.cts +2 -0
  72. package/dist/typed/draw/write-vectors.d.ts +2 -0
  73. package/dist/typed/draw/write-vectors.js +129 -0
  74. package/dist/typed/odb/form.cjs +1 -1
  75. package/dist/typed/odb/form.js +1 -1
  76. package/dist/typed/odg/write.cjs +80 -0
  77. package/dist/typed/odg/write.d.cts +2 -0
  78. package/dist/typed/odg/write.d.ts +2 -0
  79. package/dist/typed/odg/write.js +77 -0
  80. package/dist/typed/odp/write.cjs +108 -0
  81. package/dist/typed/odp/write.d.cts +2 -0
  82. package/dist/typed/odp/write.d.ts +2 -0
  83. package/dist/typed/odp/write.js +105 -0
  84. package/dist/typed/ods/read.cjs +3 -1
  85. package/dist/typed/ods/read.d.cts +2 -2
  86. package/dist/typed/ods/read.d.ts +2 -2
  87. package/dist/typed/ods/read.js +2 -2
  88. package/dist/typed/ods/write.cjs +579 -0
  89. package/dist/typed/ods/write.d.cts +2 -0
  90. package/dist/typed/ods/write.d.ts +2 -0
  91. package/dist/typed/ods/write.js +576 -0
  92. package/dist/typed/odt/read.cjs +1 -1
  93. package/dist/typed/odt/read.js +1 -1
  94. package/dist/typed/odt/write.cjs +11 -141
  95. package/dist/typed/odt/write.d.cts +1 -1
  96. package/dist/typed/odt/write.d.ts +1 -1
  97. package/dist/typed/odt/write.js +10 -140
  98. package/dist/typed/shared/canonicalise.cjs +126 -0
  99. package/dist/typed/shared/canonicalise.d.cts +10 -0
  100. package/dist/typed/shared/canonicalise.d.ts +10 -0
  101. package/dist/typed/shared/canonicalise.js +120 -0
  102. package/dist/typed/shared/image.cjs +12 -0
  103. package/dist/typed/shared/image.d.cts +5 -0
  104. package/dist/typed/shared/image.d.ts +5 -0
  105. package/dist/typed/shared/image.js +11 -0
  106. package/dist/typed/shared/list.cjs +32 -0
  107. package/dist/typed/shared/list.d.cts +2 -2
  108. package/dist/typed/shared/list.d.ts +2 -2
  109. package/dist/typed/shared/list.js +28 -1
  110. package/dist/typed/shared/paragraph.d.cts +1 -1
  111. package/dist/typed/shared/paragraph.d.ts +1 -1
  112. package/dist/typed/shared/path.cjs +19 -0
  113. package/dist/typed/shared/path.d.cts +2 -2
  114. package/dist/typed/shared/path.d.ts +2 -2
  115. package/dist/typed/shared/path.js +18 -1
  116. package/dist/typed/shared/table.cjs +3 -0
  117. package/dist/typed/shared/table.d.cts +2 -2
  118. package/dist/typed/shared/table.d.ts +2 -2
  119. package/dist/typed/shared/table.js +1 -1
  120. package/dist/typed/shared/units.cjs +16 -1
  121. package/dist/typed/shared/units.d.cts +2 -2
  122. package/dist/typed/shared/units.d.ts +2 -2
  123. package/dist/typed/shared/units.js +16 -2
  124. package/dist/{units-BQSNkTQZ.d.cts → units-DdyaQolR.d.cts} +2 -1
  125. package/dist/{units-BQSNkTQZ.d.ts → units-DdyaQolR.d.ts} +2 -1
  126. package/dist/write-4kMi-asu.d.ts +14 -0
  127. package/dist/write-BZXpT8F6.d.cts +17 -0
  128. package/dist/write-BhG3t3fJ.d.cts +14 -0
  129. package/dist/write-BuLQmwLD.d.cts +14 -0
  130. package/dist/write-C2c4xBXs.d.cts +14 -0
  131. package/dist/{write-7Uu_wlkL.d.cts → write-CPATqG4v.d.cts} +1 -0
  132. package/dist/write-CfTE2jY8.d.ts +14 -0
  133. package/dist/write-DttX1rTC.d.ts +14 -0
  134. package/dist/{write-DGcI9W7Z.d.ts → write-JERychL3.d.ts} +1 -0
  135. package/dist/write-SKnCTU4C.d.ts +17 -0
  136. package/dist/write-shapes-Co7BrmMZ.d.ts +36 -0
  137. package/dist/write-shapes-D4piGKf4.d.cts +36 -0
  138. package/dist/write-vectors-B-RVHAKI.d.cts +11 -0
  139. package/dist/write-vectors-CYjZoVBW.d.ts +11 -0
  140. package/package.json +2 -2
@@ -10,21 +10,13 @@ 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_image = require("../shared/image.cjs");
14
+ const require_typed_shared_canonicalise = require("../shared/canonicalise.cjs");
13
15
  let document_schema_js = require("document-schema.js");
14
16
  //#region src/typed/odt/write.ts
15
17
  const CONTENT_PART = "content.xml";
16
18
  const STYLES_PART = "styles.xml";
17
19
  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
20
  function unsupported(what, where) {
29
21
  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
22
  }
@@ -36,44 +28,6 @@ function assertWritableBlock(block) {
36
28
  if (block.kind === "embeddedObject") throw unsupported("an embedded object", "a section's block flow");
37
29
  if (block.kind === "paragraph") assertWritableParagraph(block);
38
30
  }
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
31
  function emptyAnchorParagraph(pageBreakBefore) {
78
32
  return pageBreakBefore ? {
79
33
  kind: "paragraph",
@@ -98,8 +52,7 @@ function planSection(section, needsLeadingParagraph, listState) {
98
52
  return false;
99
53
  };
100
54
  const closeListRun = () => {
101
- listState.openNumId = void 0;
102
- listState.openCanonicalNumId = void 0;
55
+ require_typed_shared_list.closeListPlan(listState);
103
56
  };
104
57
  const flushPendingPageBreak = () => {
105
58
  if (pendingPageBreak) {
@@ -119,17 +72,8 @@ function planSection(section, needsLeadingParagraph, listState) {
119
72
  continue;
120
73
  }
121
74
  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);
75
+ const canonicalId = require_typed_shared_list.planListMembership(block.list, listState);
76
+ const paragraph = require_typed_shared_canonicalise.canonicalParagraph(block, canonicalId);
133
77
  pushParagraph(pendingPageBreak ? {
134
78
  ...paragraph,
135
79
  pageBreakBefore: true
@@ -165,92 +109,18 @@ function planDocument(sections) {
165
109
  const listState = { next: 1 };
166
110
  return sections.map((section, index) => planSection(section, index > 0, listState));
167
111
  }
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
112
  function normaliseOdtContent(document) {
243
113
  if (document.kind !== "wordprocessing") throw new Error(`normaliseOdtContent: expected a 'wordprocessing' document, got '${document.kind}'`);
244
114
  const planned = planDocument(document.sections);
245
115
  return {
246
116
  kind: "wordprocessing",
247
- metadata: canonicalMetadata(document.metadata),
117
+ metadata: require_typed_shared_canonicalise.canonicalMetadata(document.metadata),
248
118
  sections: planned.map((section, index) => {
249
119
  const blocks = section.blocks.map((block) => {
250
120
  switch (block.kind) {
251
121
  case "paragraph": return block.paragraph;
252
- case "table": return canonicalTable(block.table);
253
- case "image": return canonicalImage(block.image);
122
+ case "table": return require_typed_shared_canonicalise.canonicalTable(block.table);
123
+ case "image": return require_typed_shared_canonicalise.canonicalImage(block.image);
254
124
  }
255
125
  });
256
126
  return index === 0 ? {
@@ -294,7 +164,7 @@ function listStyleNameFor(kind, state) {
294
164
  return name;
295
165
  }
296
166
  function writeImageFrame(image, state) {
297
- const extension = image.format === "png" ? "png" : "jpg";
167
+ const extension = require_typed_shared_image.imageExtension(image.format);
298
168
  const path = `${PICTURES_DIRECTORY}/image${state.nextImage}.${extension}`;
299
169
  state.nextImage += 1;
300
170
  state.pkg.parts[path] = {
@@ -319,7 +189,7 @@ function writeSectionBlocks(section, parentStyleName, state, out) {
319
189
  let openList;
320
190
  const closeList = () => {
321
191
  if (openList === void 0) return;
322
- const kind = listKindOf(openList.numId);
192
+ const kind = require_typed_shared_list.listKindOf(openList.numId);
323
193
  const built = require_typed_shared_list.writeOdfList(openList.entries, kind === void 0 ? void 0 : listStyleNameFor(kind, state));
324
194
  openList.element.attributes = built.attributes;
325
195
  openList.element.children = built.children;
@@ -368,7 +238,7 @@ function writeOdtContent(document, options = {}) {
368
238
  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
239
  const version = options.version ?? "1.3";
370
240
  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);
241
+ 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
242
  const state = {
373
243
  pkg,
374
244
  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,17 @@ 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 { imageExtension } from "../shared/image.js";
13
+ import { canonicalImage, canonicalMetadata, canonicalParagraph, canonicalTable } from "../shared/canonicalise.js";
14
+ import { flattenTree } from "document-schema.js";
13
15
  //#region src/typed/odt/write.ts
14
16
  const CONTENT_PART = "content.xml";
15
17
  const STYLES_PART = "styles.xml";
16
18
  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
19
  function unsupported(what, where) {
28
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.`);
29
21
  }
@@ -35,44 +27,6 @@ function assertWritableBlock(block) {
35
27
  if (block.kind === "embeddedObject") throw unsupported("an embedded object", "a section's block flow");
36
28
  if (block.kind === "paragraph") assertWritableParagraph(block);
37
29
  }
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
30
  function emptyAnchorParagraph(pageBreakBefore) {
77
31
  return pageBreakBefore ? {
78
32
  kind: "paragraph",
@@ -97,8 +51,7 @@ function planSection(section, needsLeadingParagraph, listState) {
97
51
  return false;
98
52
  };
99
53
  const closeListRun = () => {
100
- listState.openNumId = void 0;
101
- listState.openCanonicalNumId = void 0;
54
+ closeListPlan(listState);
102
55
  };
103
56
  const flushPendingPageBreak = () => {
104
57
  if (pendingPageBreak) {
@@ -118,17 +71,8 @@ function planSection(section, needsLeadingParagraph, listState) {
118
71
  continue;
119
72
  }
120
73
  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);
74
+ const canonicalId = planListMembership(block.list, listState);
75
+ const paragraph = canonicalParagraph(block, canonicalId);
132
76
  pushParagraph(pendingPageBreak ? {
133
77
  ...paragraph,
134
78
  pageBreakBefore: true
@@ -164,80 +108,6 @@ function planDocument(sections) {
164
108
  const listState = { next: 1 };
165
109
  return sections.map((section, index) => planSection(section, index > 0, listState));
166
110
  }
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
111
  function normaliseOdtContent(document) {
242
112
  if (document.kind !== "wordprocessing") throw new Error(`normaliseOdtContent: expected a 'wordprocessing' document, got '${document.kind}'`);
243
113
  const planned = planDocument(document.sections);
@@ -293,7 +163,7 @@ function listStyleNameFor(kind, state) {
293
163
  return name;
294
164
  }
295
165
  function writeImageFrame(image, state) {
296
- const extension = image.format === "png" ? "png" : "jpg";
166
+ const extension = imageExtension(image.format);
297
167
  const path = `${PICTURES_DIRECTORY}/image${state.nextImage}.${extension}`;
298
168
  state.nextImage += 1;
299
169
  state.pkg.parts[path] = {
@@ -367,7 +237,7 @@ function writeOdtContent(document, options = {}) {
367
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`);
368
238
  const version = options.version ?? "1.3";
369
239
  const textElement = el("office:text");
370
- const pkg = createOdfPackage(ODF_MEDIA_TYPES.odt, textElement, version);
240
+ const pkg = createOdfPackage(options.template ? ODF_MEDIA_TYPES.ott : ODF_MEDIA_TYPES.odt, textElement, version);
371
241
  const state = {
372
242
  pkg,
373
243
  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 };