odf.js 5.0.9 → 5.1.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 (146) hide show
  1. package/README.md +16 -2
  2. package/dist/{cascade-qYa3mgnE.d.cts → cascade-BmvsXcAz.d.cts} +2 -2
  3. package/dist/{cascade-8u4q16_U.d.ts → cascade-rhqUQrUa.d.ts} +2 -2
  4. package/dist/{codec-jKlS0rWl.d.cts → codec-BAz7YIru.d.cts} +26 -25
  5. package/dist/{codec-DqldvlN5.d.ts → codec-BxxFEqvT.d.ts} +26 -25
  6. package/dist/codec.d.cts +1 -1
  7. package/dist/codec.d.ts +1 -1
  8. package/dist/constructs-CJpDDQV0.d.ts +63 -0
  9. package/dist/constructs-Dy_DMFs3.d.cts +63 -0
  10. package/dist/embedded-BPhuSEEI.d.ts +18 -0
  11. package/dist/embedded-J3M3kDvY.d.cts +18 -0
  12. package/dist/form-BGCT81ss.d.cts +13 -0
  13. package/dist/form-D3H5H2NL.d.ts +13 -0
  14. package/dist/forms-D1-0spCe.d.ts +27 -0
  15. package/dist/forms-cIjw-Jf-.d.cts +27 -0
  16. package/dist/index.cjs +5 -2
  17. package/dist/index.d.cts +28 -27
  18. package/dist/index.d.ts +28 -27
  19. package/dist/index.js +4 -3
  20. package/dist/{list-C35tiDYU.d.cts → list-KZeXA0mR.d.cts} +1 -1
  21. package/dist/{list-acGU0xLo.d.ts → list-Qeuawtew.d.ts} +1 -1
  22. package/dist/{manifest-xxJ4FpSe.d.ts → manifest-BALwu2JR.d.cts} +1 -1
  23. package/dist/{manifest-CmsCOCEi.d.cts → manifest-CP1sqyGU.d.ts} +1 -1
  24. package/dist/manifest.d.cts +1 -1
  25. package/dist/manifest.d.ts +1 -1
  26. package/dist/{masterpage-7nBnqFj-.d.ts → masterpage-C1McDhMv.d.ts} +1 -1
  27. package/dist/{masterpage-EmefIRgy.d.cts → masterpage-XJ2v2khe.d.cts} +1 -1
  28. package/dist/{metadata-32LoP2TK.d.ts → metadata-1j1zm9Cx.d.cts} +1 -1
  29. package/dist/{metadata-frJqeeSB.d.cts → metadata-BXpjrAS-.d.ts} +1 -1
  30. package/dist/{mimetype-uF-RHNpR.d.ts → mimetype-BfkwTeaW.d.ts} +1 -1
  31. package/dist/{mimetype-BcLX0N-N.d.cts → mimetype-CPNMj04s.d.cts} +1 -1
  32. package/dist/mimetype.d.cts +1 -1
  33. package/dist/mimetype.d.ts +1 -1
  34. package/dist/model/package.d.cts +1 -113
  35. package/dist/model/package.d.ts +1 -113
  36. package/dist/package-BUojjTXf.d.ts +114 -0
  37. package/dist/package-L24lkba-.d.cts +114 -0
  38. package/dist/package-io/read.d.cts +1 -1
  39. package/dist/package-io/read.d.ts +1 -1
  40. package/dist/package-io/write.d.cts +1 -1
  41. package/dist/package-io/write.d.ts +1 -1
  42. package/dist/paragraph-6hzAZpmi.d.ts +16 -0
  43. package/dist/paragraph-BBmSl_sK.d.cts +16 -0
  44. package/dist/read-B4238IGr.d.cts +12 -0
  45. package/dist/{read-DrdmKX0x.d.cts → read-BV2an1ok.d.cts} +1 -1
  46. package/dist/{read-DOuXgPhP.d.ts → read-BnN7u9Y2.d.ts} +1 -1
  47. package/dist/{read-DhLNXgiM.d.ts → read-CMDEXqGw.d.ts} +1 -1
  48. package/dist/{read-YSIwlhrk.d.ts → read-CTfeWaWq.d.cts} +1 -1
  49. package/dist/read-CdvX2qnz.d.ts +12 -0
  50. package/dist/read-Cs1ktkWB.d.cts +15 -0
  51. package/dist/{read-BoIUENWq.d.ts → read-CvjbdgH3.d.ts} +1 -1
  52. package/dist/read-DHuiGh_y.d.ts +15 -0
  53. package/dist/{read-BM8KaFQS.d.cts → read-DOYWO6BM.d.cts} +1 -1
  54. package/dist/{read-xCmo7cec.d.cts → read-DUCm1nUv.d.cts} +1 -1
  55. package/dist/{read-BkFbEves.d.ts → read-DYYxbvfo.d.ts} +1 -1
  56. package/dist/{read-KpU38maT.d.cts → read-Db_GZ0ZH.d.ts} +1 -1
  57. package/dist/{read-CFMsXSl7.d.cts → read-DzmMJPHd.d.cts} +1 -1
  58. package/dist/{read-B9zz_ax1.d.ts → read-lc0t0UHK.d.ts} +1 -1
  59. package/dist/{read-DNNf5_6n.d.cts → read-ydLJ8bid.d.cts} +1 -1
  60. package/dist/{registry-R43n1hcL.d.ts → registry-BVeEpUMI.d.ts} +1 -1
  61. package/dist/{registry-Dy6pjoh3.d.cts → registry-CaJpWDke.d.cts} +1 -1
  62. package/dist/{report-MpwUgXbA.d.ts → report-D6WNYaVn.d.cts} +1 -1
  63. package/dist/{report-BuCJ7_YU.d.cts → report-DbslT2OR.d.ts} +1 -1
  64. package/dist/{shapes-BqcccDK8.d.cts → shapes-8o3NjBLU.d.cts} +3 -3
  65. package/dist/{shapes-BB59aIC8.d.ts → shapes-CCB8ydqD.d.ts} +3 -3
  66. package/dist/styles/registry.d.cts +1 -1
  67. package/dist/styles/registry.d.ts +1 -1
  68. package/dist/{subdocument-CIxH3a5V.d.cts → subdocument-BwW3FZC_.d.ts} +1 -1
  69. package/dist/{subdocument-DQNQF7wV.d.ts → subdocument-yY8ASE4N.d.cts} +1 -1
  70. package/dist/{table-sweV3r9n.d.cts → table-BH_Q2n_N.d.cts} +1 -1
  71. package/dist/{table-D81TZyBn.d.ts → table-ByOoGcq_.d.ts} +1 -1
  72. package/dist/{text-Cal14ZaX.d.cts → text-BAi1tapc.d.cts} +3 -1
  73. package/dist/{text-CkNojpZm.d.ts → text-gJ5R0q3u.d.ts} +3 -1
  74. package/dist/typed/draw/embedded.cjs +38 -0
  75. package/dist/typed/draw/embedded.d.cts +2 -2
  76. package/dist/typed/draw/embedded.d.ts +2 -2
  77. package/dist/typed/draw/embedded.js +39 -2
  78. package/dist/typed/draw/shapes.cjs +20 -3
  79. package/dist/typed/draw/shapes.d.cts +1 -1
  80. package/dist/typed/draw/shapes.d.ts +1 -1
  81. package/dist/typed/draw/shapes.js +20 -3
  82. package/dist/typed/formula/read.d.cts +1 -1
  83. package/dist/typed/formula/read.d.ts +1 -1
  84. package/dist/typed/odb/form.cjs +2 -59
  85. package/dist/typed/odb/form.d.cts +2 -2
  86. package/dist/typed/odb/form.d.ts +2 -2
  87. package/dist/typed/odb/form.js +3 -60
  88. package/dist/typed/odb/read.d.cts +1 -1
  89. package/dist/typed/odb/read.d.ts +1 -1
  90. package/dist/typed/odb/report.d.cts +1 -1
  91. package/dist/typed/odb/report.d.ts +1 -1
  92. package/dist/typed/odb/subdocument.d.cts +1 -1
  93. package/dist/typed/odb/subdocument.d.ts +1 -1
  94. package/dist/typed/odg/read.d.cts +1 -1
  95. package/dist/typed/odg/read.d.ts +1 -1
  96. package/dist/typed/odm/read.d.cts +1 -1
  97. package/dist/typed/odm/read.d.ts +1 -1
  98. package/dist/typed/odp/read.d.cts +1 -1
  99. package/dist/typed/odp/read.d.ts +1 -1
  100. package/dist/typed/ods/read.cjs +28 -7
  101. package/dist/typed/ods/read.d.cts +1 -1
  102. package/dist/typed/ods/read.d.ts +1 -1
  103. package/dist/typed/ods/read.js +29 -8
  104. package/dist/typed/odt/read.cjs +215 -15
  105. package/dist/typed/odt/read.d.cts +2 -2
  106. package/dist/typed/odt/read.d.ts +2 -2
  107. package/dist/typed/odt/read.js +215 -15
  108. package/dist/typed/shared/cascade.d.cts +1 -1
  109. package/dist/typed/shared/cascade.d.ts +1 -1
  110. package/dist/typed/shared/constructs.cjs +392 -0
  111. package/dist/typed/shared/constructs.d.cts +2 -0
  112. package/dist/typed/shared/constructs.d.ts +2 -0
  113. package/dist/typed/shared/constructs.js +374 -0
  114. package/dist/typed/shared/forms.cjs +128 -0
  115. package/dist/typed/shared/forms.d.cts +2 -0
  116. package/dist/typed/shared/forms.d.ts +2 -0
  117. package/dist/typed/shared/forms.js +126 -0
  118. package/dist/typed/shared/list.d.cts +1 -1
  119. package/dist/typed/shared/list.d.ts +1 -1
  120. package/dist/typed/shared/masterpage.d.cts +1 -1
  121. package/dist/typed/shared/masterpage.d.ts +1 -1
  122. package/dist/typed/shared/metadata.d.cts +1 -1
  123. package/dist/typed/shared/metadata.d.ts +1 -1
  124. package/dist/typed/shared/paragraph.cjs +189 -10
  125. package/dist/typed/shared/paragraph.d.cts +2 -2
  126. package/dist/typed/shared/paragraph.d.ts +2 -2
  127. package/dist/typed/shared/paragraph.js +192 -13
  128. package/dist/typed/shared/table.d.cts +1 -1
  129. package/dist/typed/shared/table.d.ts +1 -1
  130. package/dist/typed/shared/text.cjs +57 -2
  131. package/dist/typed/shared/text.d.cts +2 -2
  132. package/dist/typed/shared/text.d.ts +2 -2
  133. package/dist/typed/shared/text.js +56 -3
  134. package/dist/{write-C0nwVuPI.d.ts → write-BxVkPZID.d.ts} +1 -1
  135. package/dist/{write-Dfb2tirK.d.cts → write-D3kyj1Xw.d.cts} +1 -1
  136. package/package.json +2 -2
  137. package/dist/embedded-CNMqOrnt.d.ts +0 -13
  138. package/dist/embedded-D7Kr1Sce.d.cts +0 -13
  139. package/dist/form-BsAAx5-p.d.ts +0 -31
  140. package/dist/form-DSIbHxog.d.cts +0 -31
  141. package/dist/paragraph-9ii2naJC.d.cts +0 -7
  142. package/dist/paragraph-DWNnedIE.d.ts +0 -7
  143. package/dist/read-B4zS8bGb.d.ts +0 -11
  144. package/dist/read-BHpPvhzR.d.cts +0 -11
  145. package/dist/read-C6MhadqG.d.ts +0 -11
  146. package/dist/read-CszvDMMt.d.cts +0 -11
@@ -3,9 +3,16 @@ const require_typed_shared_units = require("../shared/units.cjs");
3
3
  const require_xml_query = require("../../xml/query.cjs");
4
4
  const require_typed_shared_geometry = require("../shared/geometry.cjs");
5
5
  const require_typed_shared_metadata = require("../shared/metadata.cjs");
6
- const require_typed_shared_paragraph = require("../shared/paragraph.cjs");
7
6
  const require_typed_shared_list = require("../shared/list.cjs");
7
+ const require_typed_shared_constructs = require("../shared/constructs.cjs");
8
+ const require_typed_shared_paragraph = require("../shared/paragraph.cjs");
8
9
  const require_typed_shared_table = require("../shared/table.cjs");
10
+ const require_typed_draw_shapes = require("../draw/shapes.cjs");
11
+ const require_typed_formula_read = require("../formula/read.cjs");
12
+ const require_typed_draw_embedded = require("../draw/embedded.cjs");
13
+ const require_typed_odp_read = require("../odp/read.cjs");
14
+ const require_typed_shared_forms = require("../shared/forms.cjs");
15
+ const require_typed_odg_read = require("../odg/read.cjs");
9
16
  let document_schema_js = require("document-schema.js");
10
17
  //#region src/typed/odt/read.ts
11
18
  const CONTENT_PART = "content.xml";
@@ -17,8 +24,7 @@ function readOutlineLevel(headingElement) {
17
24
  const parsed = Number.parseInt(raw, 10);
18
25
  return Number.isInteger(parsed) && parsed > 0 ? parsed : 1;
19
26
  }
20
- function readParagraphOrHeading(element, pkg) {
21
- const paragraph = require_typed_shared_paragraph.readOdfParagraph(element, pkg);
27
+ function readParagraphOrHeading(element, paragraph) {
22
28
  if (element.tag === "text:h") {
23
29
  const outlineLevel = readOutlineLevel(element);
24
30
  paragraph.styleId = `Heading${outlineLevel}`;
@@ -26,19 +32,175 @@ function readParagraphOrHeading(element, pkg) {
26
32
  }
27
33
  return paragraph;
28
34
  }
29
- function readBlocks(nodes, pkg, listIdState) {
35
+ function readOdtEmbeddedDocument(reference, frame) {
36
+ switch (reference.objectKind) {
37
+ case "wordprocessing": {
38
+ const { metadata, sections } = readOdtContent(reference.package);
39
+ return {
40
+ kind: "wordprocessing",
41
+ metadata,
42
+ sections
43
+ };
44
+ }
45
+ case "presentation": {
46
+ const { metadata, slides } = require_typed_odp_read.readOdpContent(reference.package);
47
+ return {
48
+ kind: "presentation",
49
+ metadata,
50
+ slides
51
+ };
52
+ }
53
+ case "drawing": {
54
+ const { metadata, pages } = require_typed_odg_read.readOdgContent(reference.package);
55
+ return {
56
+ kind: "drawing",
57
+ metadata,
58
+ pages
59
+ };
60
+ }
61
+ case "formula": return require_typed_formula_read.readOdfFormulaContent(reference.package);
62
+ case "chart": return require_typed_draw_embedded.readOdfChartContent(reference.package, frame, "odt").document;
63
+ case "spreadsheet": return;
64
+ }
65
+ }
66
+ function readAnchoredFrameSources(paragraphElement, pkg, state) {
67
+ if (!state.liftFrames) return [];
68
+ const sources = [];
69
+ const readFrameInto = (blocks, frameElement) => {
70
+ const shape = require_typed_draw_shapes.readDrawFrame(frameElement, [], pkg, state.listIdState, true);
71
+ if (shape === void 0) return;
72
+ const reference = require_typed_draw_embedded.readDrawObjectReference(frameElement, pkg);
73
+ if (reference?.objectKind === "chart") {
74
+ const { document, residue } = require_typed_draw_embedded.readOdfChartContent(reference.package, shape.frame, "odt");
75
+ const embeddedBlock = {
76
+ kind: "embeddedObject",
77
+ objectKind: "chart",
78
+ document,
79
+ frame: shape.frame
80
+ };
81
+ if (residue !== void 0) embeddedBlock.source = residue;
82
+ blocks.push(embeddedBlock);
83
+ return;
84
+ }
85
+ if (reference !== void 0) {
86
+ const document = readOdtEmbeddedDocument(reference, shape.frame);
87
+ if (document !== void 0) {
88
+ blocks.push({
89
+ kind: "embeddedObject",
90
+ objectKind: reference.objectKind,
91
+ document,
92
+ frame: shape.frame
93
+ });
94
+ return;
95
+ }
96
+ }
97
+ blocks.push(...shape.blocks);
98
+ };
99
+ for (const child of paragraphElement.children) {
100
+ if (child.type !== "element") continue;
101
+ if (child.tag === "draw:frame") {
102
+ const blocks = [];
103
+ readFrameInto(blocks, child);
104
+ if (blocks.length > 0) sources.push({
105
+ child,
106
+ blocks
107
+ });
108
+ } else if (child.tag === "draw:g") {
109
+ const blocks = [];
110
+ for (const grandChild of child.children) if (grandChild.type === "element" && grandChild.tag === "draw:frame") readFrameInto(blocks, grandChild);
111
+ if (blocks.length > 0) sources.push({
112
+ child,
113
+ blocks
114
+ });
115
+ }
116
+ }
117
+ return sources;
118
+ }
119
+ function liftedBlocksBeforeHalf(read, half) {
120
+ const halfIndex = read.element.children.indexOf(half);
121
+ if (halfIndex === -1) return 0;
122
+ let count = 0;
123
+ for (const source of read.liftedSources) if (read.element.children.indexOf(source.child) < halfIndex) count += source.blocks.length;
124
+ return count;
125
+ }
126
+ function readBlocks(nodes, pkg, state, baseIndex = 0) {
30
127
  const blocks = [];
128
+ const emitParagraphs = (reads) => {
129
+ let cursor = baseIndex + blocks.length;
130
+ for (const read of reads) {
131
+ const lifted = read.liftedSources.flatMap((source) => source.blocks);
132
+ for (const half of read.halves) {
133
+ const eventIndex = require_typed_shared_constructs.odfMarkerHalfEventIndex(half, read.element, cursor, liftedBlocksBeforeHalf(read, half.element));
134
+ if (eventIndex !== void 0) state.markerEvents.push({
135
+ kind: half.kind,
136
+ side: half.side,
137
+ key: half.key,
138
+ index: eventIndex,
139
+ qualified: true,
140
+ order: state.order++,
141
+ descriptor: half.descriptor,
142
+ element: half.element
143
+ });
144
+ }
145
+ blocks.push(read.paragraph);
146
+ for (const block of lifted) blocks.push(block);
147
+ cursor += 1 + lifted.length;
148
+ }
149
+ };
150
+ const readOneParagraph = (element) => {
151
+ const halves = [];
152
+ return {
153
+ element,
154
+ paragraph: readParagraphOrHeading(element, require_typed_shared_paragraph.readOdfParagraph(element, pkg, {
155
+ provenanceRegions: state.provenanceRegions,
156
+ markersOut: halves,
157
+ definitions: state.definitions,
158
+ listIdState: state.listIdState,
159
+ format: "odt"
160
+ })),
161
+ halves,
162
+ liftedSources: readAnchoredFrameSources(element, pkg, state)
163
+ };
164
+ };
31
165
  for (const node of nodes) {
32
166
  if (node.type !== "element") continue;
33
- if (node.tag === "text:p" || node.tag === "text:h") blocks.push(readParagraphOrHeading(node, pkg));
167
+ if (node.tag === "text:p" || node.tag === "text:h") emitParagraphs([readOneParagraph(node)]);
34
168
  else if (node.tag === "text:list") {
35
- const numId = require_typed_shared_list.mintOdfListNumId(pkg, node, listIdState);
36
- blocks.push(...require_typed_shared_list.readOdfListParagraphs(node, {
169
+ const numId = require_typed_shared_list.mintOdfListNumId(pkg, node, state.listIdState);
170
+ const reads = [];
171
+ require_typed_shared_list.readOdfListParagraphs(node, {
37
172
  numId,
38
173
  level: 0
39
- }, (element) => readParagraphOrHeading(element, pkg)));
174
+ }, (element) => {
175
+ const read = readOneParagraph(element);
176
+ reads.push(read);
177
+ return read.paragraph;
178
+ });
179
+ emitParagraphs(reads);
40
180
  } else if (node.tag === "table:table") blocks.push(require_typed_shared_table.readOdfTable(node, pkg));
41
- else if (node.tag === "text:section") blocks.push(...readBlocks(node.children, pkg, listIdState));
181
+ else if (node.tag === "text:section") {
182
+ const startIndex = baseIndex + blocks.length;
183
+ const order = state.order++;
184
+ blocks.push(...readBlocks(node.children, pkg, state, startIndex));
185
+ state.wrapperExtents.push({
186
+ startIndex,
187
+ endIndex: baseIndex + blocks.length,
188
+ order,
189
+ descriptor: require_typed_shared_constructs.odfDivisionDescriptor(node, pkg)
190
+ });
191
+ } else if (require_typed_shared_constructs.isOdfIndexWrapper(node)) {
192
+ const startIndex = baseIndex + blocks.length;
193
+ const order = state.order++;
194
+ const body = node.children.find((child) => child.type === "element" && child.tag === "text:index-body");
195
+ blocks.push(...body === void 0 ? [] : readBlocks(body.children, pkg, state, startIndex));
196
+ state.wrapperExtents.push({
197
+ startIndex,
198
+ endIndex: baseIndex + blocks.length,
199
+ order,
200
+ descriptor: require_typed_shared_constructs.odfIndexControlDescriptor(node)
201
+ });
202
+ } else if (node.tag === "text:index-title") blocks.push(...readBlocks(node.children, pkg, state, baseIndex + blocks.length));
203
+ else if (node.tag === "office:forms") blocks.push(...require_typed_shared_forms.readOdfFormControlConstructs(node, "odt"));
42
204
  }
43
205
  return blocks;
44
206
  }
@@ -80,7 +242,7 @@ function readFirstMasterPageGeometry(pkg) {
80
242
  margins: margins ?? DEFAULT_MARGINS
81
243
  };
82
244
  }
83
- function readOdtContent(pkg) {
245
+ function readOdtContent(pkg, options = {}) {
84
246
  const contentPart = pkg.parts[CONTENT_PART];
85
247
  if (contentPart?.kind !== "xml") throw new Error(`readOdtContent: package has no ${CONTENT_PART} part`);
86
248
  const contentRoot = require_xml_query.rootElement(contentPart.nodes);
@@ -89,22 +251,60 @@ function readOdtContent(pkg) {
89
251
  if (textElement === void 0) throw new Error(`readOdtContent: ${CONTENT_PART} has no office:body/office:text element`);
90
252
  const metadata = require_typed_shared_metadata.readOdfMetadata(pkg);
91
253
  const { pageSize, margins } = readFirstMasterPageGeometry(pkg);
254
+ const provenanceRegions = /* @__PURE__ */ new Map();
255
+ require_typed_shared_constructs.collectOdfProvenanceRegions(textElement.children, provenanceRegions);
256
+ const definitions = {
257
+ entries: {},
258
+ nextNoteOrdinal: 1,
259
+ nextAnnotationOrdinal: 1
260
+ };
261
+ require_typed_shared_constructs.collectOdfFieldMasterDefinitions(textElement.children, definitions.entries);
262
+ for (const partPath of AUTOMATIC_STYLE_PARTS) {
263
+ const part = pkg.parts[partPath];
264
+ if (part?.kind !== "xml") continue;
265
+ require_typed_shared_constructs.collectOdfDataStyleDefinitions(part.nodes, definitions.entries);
266
+ require_typed_shared_constructs.collectOdfFontFaceDefinitions(part.nodes, definitions.entries);
267
+ }
268
+ const state = {
269
+ listIdState: { next: 1 },
270
+ provenanceRegions,
271
+ definitions,
272
+ wrapperExtents: [],
273
+ markerEvents: [],
274
+ liftFrames: options.frames !== "none",
275
+ order: 0
276
+ };
277
+ const walked = readBlocks(textElement.children, pkg, state);
278
+ const { extents: markerExtents, paired } = require_typed_shared_constructs.resolveOdfMarkerEvents(state.markerEvents);
279
+ const extents = [...state.wrapperExtents, ...markerExtents];
280
+ for (const event of state.markerEvents) if (event.kind === "annotation" && event.side === "start" && !paired.has(event.element)) {
281
+ const descriptor = event.descriptor();
282
+ if (descriptor !== void 0) extents.push({
283
+ startIndex: event.index,
284
+ endIndex: event.index,
285
+ order: event.order,
286
+ descriptor
287
+ });
288
+ }
92
289
  return {
93
290
  metadata,
94
291
  sections: [{
95
292
  pageSize,
96
293
  margins,
97
- blocks: readBlocks(textElement.children, pkg, { next: 1 })
98
- }]
294
+ blocks: require_typed_shared_constructs.insertOdfConstructMarkers(walked, extents)
295
+ }],
296
+ ...Object.keys(definitions.entries).length > 0 ? { definitions: definitions.entries } : {}
99
297
  };
100
298
  }
101
- function readOdt(pkg) {
102
- const { metadata, sections } = readOdtContent(pkg);
103
- return (0, document_schema_js.assemblePackage)({
299
+ function readOdt(pkg, options = {}) {
300
+ const { metadata, sections, definitions } = readOdtContent(pkg, options);
301
+ const assembled = (0, document_schema_js.assemblePackage)({
104
302
  kind: "wordprocessing",
105
303
  metadata,
106
304
  sections
107
305
  });
306
+ if (definitions !== void 0) assembled.definitions = definitions;
307
+ return assembled;
108
308
  }
109
309
  //#endregion
110
310
  exports.readOdt = readOdt;
@@ -1,2 +1,2 @@
1
- import { n as readOdt, r as readOdtContent, t as OdtDocument } from "../../read-CszvDMMt.cjs";
2
- export { OdtDocument, readOdt, readOdtContent };
1
+ import { i as readOdtContent, n as OdtReadOptions, r as readOdt, t as OdtDocument } from "../../read-Cs1ktkWB.cjs";
2
+ export { OdtDocument, OdtReadOptions, readOdt, readOdtContent };
@@ -1,2 +1,2 @@
1
- import { n as readOdt, r as readOdtContent, t as OdtDocument } from "../../read-C6MhadqG.js";
2
- export { OdtDocument, readOdt, readOdtContent };
1
+ import { i as readOdtContent, n as OdtReadOptions, r as readOdt, t as OdtDocument } from "../../read-DHuiGh_y.js";
2
+ export { OdtDocument, OdtReadOptions, readOdt, readOdtContent };
@@ -2,9 +2,16 @@ import { parseOdfLength } from "../shared/units.js";
2
2
  import { attrValue, childrenWithTag, findChildElement, rootElement } from "../../xml/query.js";
3
3
  import { parseMargins, parsePageSize } from "../shared/geometry.js";
4
4
  import { readOdfMetadata } from "../shared/metadata.js";
5
- import { readOdfParagraph } from "../shared/paragraph.js";
6
5
  import { mintOdfListNumId, readOdfListParagraphs } from "../shared/list.js";
6
+ import { collectOdfDataStyleDefinitions, collectOdfFieldMasterDefinitions, collectOdfFontFaceDefinitions, collectOdfProvenanceRegions, insertOdfConstructMarkers, isOdfIndexWrapper, odfDivisionDescriptor, odfIndexControlDescriptor, odfMarkerHalfEventIndex, resolveOdfMarkerEvents } from "../shared/constructs.js";
7
+ import { readOdfParagraph } from "../shared/paragraph.js";
7
8
  import { readOdfTable } from "../shared/table.js";
9
+ import { readDrawFrame } from "../draw/shapes.js";
10
+ import { readOdfFormulaContent } from "../formula/read.js";
11
+ import { readDrawObjectReference, readOdfChartContent } from "../draw/embedded.js";
12
+ import { readOdpContent } from "../odp/read.js";
13
+ import { readOdfFormControlConstructs } from "../shared/forms.js";
14
+ import { readOdgContent } from "../odg/read.js";
8
15
  import { PAGE_SIZE_A4, assemblePackage } from "document-schema.js";
9
16
  //#region src/typed/odt/read.ts
10
17
  const CONTENT_PART = "content.xml";
@@ -16,8 +23,7 @@ function readOutlineLevel(headingElement) {
16
23
  const parsed = Number.parseInt(raw, 10);
17
24
  return Number.isInteger(parsed) && parsed > 0 ? parsed : 1;
18
25
  }
19
- function readParagraphOrHeading(element, pkg) {
20
- const paragraph = readOdfParagraph(element, pkg);
26
+ function readParagraphOrHeading(element, paragraph) {
21
27
  if (element.tag === "text:h") {
22
28
  const outlineLevel = readOutlineLevel(element);
23
29
  paragraph.styleId = `Heading${outlineLevel}`;
@@ -25,19 +31,175 @@ function readParagraphOrHeading(element, pkg) {
25
31
  }
26
32
  return paragraph;
27
33
  }
28
- function readBlocks(nodes, pkg, listIdState) {
34
+ function readOdtEmbeddedDocument(reference, frame) {
35
+ switch (reference.objectKind) {
36
+ case "wordprocessing": {
37
+ const { metadata, sections } = readOdtContent(reference.package);
38
+ return {
39
+ kind: "wordprocessing",
40
+ metadata,
41
+ sections
42
+ };
43
+ }
44
+ case "presentation": {
45
+ const { metadata, slides } = readOdpContent(reference.package);
46
+ return {
47
+ kind: "presentation",
48
+ metadata,
49
+ slides
50
+ };
51
+ }
52
+ case "drawing": {
53
+ const { metadata, pages } = readOdgContent(reference.package);
54
+ return {
55
+ kind: "drawing",
56
+ metadata,
57
+ pages
58
+ };
59
+ }
60
+ case "formula": return readOdfFormulaContent(reference.package);
61
+ case "chart": return readOdfChartContent(reference.package, frame, "odt").document;
62
+ case "spreadsheet": return;
63
+ }
64
+ }
65
+ function readAnchoredFrameSources(paragraphElement, pkg, state) {
66
+ if (!state.liftFrames) return [];
67
+ const sources = [];
68
+ const readFrameInto = (blocks, frameElement) => {
69
+ const shape = readDrawFrame(frameElement, [], pkg, state.listIdState, true);
70
+ if (shape === void 0) return;
71
+ const reference = readDrawObjectReference(frameElement, pkg);
72
+ if (reference?.objectKind === "chart") {
73
+ const { document, residue } = readOdfChartContent(reference.package, shape.frame, "odt");
74
+ const embeddedBlock = {
75
+ kind: "embeddedObject",
76
+ objectKind: "chart",
77
+ document,
78
+ frame: shape.frame
79
+ };
80
+ if (residue !== void 0) embeddedBlock.source = residue;
81
+ blocks.push(embeddedBlock);
82
+ return;
83
+ }
84
+ if (reference !== void 0) {
85
+ const document = readOdtEmbeddedDocument(reference, shape.frame);
86
+ if (document !== void 0) {
87
+ blocks.push({
88
+ kind: "embeddedObject",
89
+ objectKind: reference.objectKind,
90
+ document,
91
+ frame: shape.frame
92
+ });
93
+ return;
94
+ }
95
+ }
96
+ blocks.push(...shape.blocks);
97
+ };
98
+ for (const child of paragraphElement.children) {
99
+ if (child.type !== "element") continue;
100
+ if (child.tag === "draw:frame") {
101
+ const blocks = [];
102
+ readFrameInto(blocks, child);
103
+ if (blocks.length > 0) sources.push({
104
+ child,
105
+ blocks
106
+ });
107
+ } else if (child.tag === "draw:g") {
108
+ const blocks = [];
109
+ for (const grandChild of child.children) if (grandChild.type === "element" && grandChild.tag === "draw:frame") readFrameInto(blocks, grandChild);
110
+ if (blocks.length > 0) sources.push({
111
+ child,
112
+ blocks
113
+ });
114
+ }
115
+ }
116
+ return sources;
117
+ }
118
+ function liftedBlocksBeforeHalf(read, half) {
119
+ const halfIndex = read.element.children.indexOf(half);
120
+ if (halfIndex === -1) return 0;
121
+ let count = 0;
122
+ for (const source of read.liftedSources) if (read.element.children.indexOf(source.child) < halfIndex) count += source.blocks.length;
123
+ return count;
124
+ }
125
+ function readBlocks(nodes, pkg, state, baseIndex = 0) {
29
126
  const blocks = [];
127
+ const emitParagraphs = (reads) => {
128
+ let cursor = baseIndex + blocks.length;
129
+ for (const read of reads) {
130
+ const lifted = read.liftedSources.flatMap((source) => source.blocks);
131
+ for (const half of read.halves) {
132
+ const eventIndex = odfMarkerHalfEventIndex(half, read.element, cursor, liftedBlocksBeforeHalf(read, half.element));
133
+ if (eventIndex !== void 0) state.markerEvents.push({
134
+ kind: half.kind,
135
+ side: half.side,
136
+ key: half.key,
137
+ index: eventIndex,
138
+ qualified: true,
139
+ order: state.order++,
140
+ descriptor: half.descriptor,
141
+ element: half.element
142
+ });
143
+ }
144
+ blocks.push(read.paragraph);
145
+ for (const block of lifted) blocks.push(block);
146
+ cursor += 1 + lifted.length;
147
+ }
148
+ };
149
+ const readOneParagraph = (element) => {
150
+ const halves = [];
151
+ return {
152
+ element,
153
+ paragraph: readParagraphOrHeading(element, readOdfParagraph(element, pkg, {
154
+ provenanceRegions: state.provenanceRegions,
155
+ markersOut: halves,
156
+ definitions: state.definitions,
157
+ listIdState: state.listIdState,
158
+ format: "odt"
159
+ })),
160
+ halves,
161
+ liftedSources: readAnchoredFrameSources(element, pkg, state)
162
+ };
163
+ };
30
164
  for (const node of nodes) {
31
165
  if (node.type !== "element") continue;
32
- if (node.tag === "text:p" || node.tag === "text:h") blocks.push(readParagraphOrHeading(node, pkg));
166
+ if (node.tag === "text:p" || node.tag === "text:h") emitParagraphs([readOneParagraph(node)]);
33
167
  else if (node.tag === "text:list") {
34
- const numId = mintOdfListNumId(pkg, node, listIdState);
35
- blocks.push(...readOdfListParagraphs(node, {
168
+ const numId = mintOdfListNumId(pkg, node, state.listIdState);
169
+ const reads = [];
170
+ readOdfListParagraphs(node, {
36
171
  numId,
37
172
  level: 0
38
- }, (element) => readParagraphOrHeading(element, pkg)));
173
+ }, (element) => {
174
+ const read = readOneParagraph(element);
175
+ reads.push(read);
176
+ return read.paragraph;
177
+ });
178
+ emitParagraphs(reads);
39
179
  } else if (node.tag === "table:table") blocks.push(readOdfTable(node, pkg));
40
- else if (node.tag === "text:section") blocks.push(...readBlocks(node.children, pkg, listIdState));
180
+ else if (node.tag === "text:section") {
181
+ const startIndex = baseIndex + blocks.length;
182
+ const order = state.order++;
183
+ blocks.push(...readBlocks(node.children, pkg, state, startIndex));
184
+ state.wrapperExtents.push({
185
+ startIndex,
186
+ endIndex: baseIndex + blocks.length,
187
+ order,
188
+ descriptor: odfDivisionDescriptor(node, pkg)
189
+ });
190
+ } else if (isOdfIndexWrapper(node)) {
191
+ const startIndex = baseIndex + blocks.length;
192
+ const order = state.order++;
193
+ const body = node.children.find((child) => child.type === "element" && child.tag === "text:index-body");
194
+ blocks.push(...body === void 0 ? [] : readBlocks(body.children, pkg, state, startIndex));
195
+ state.wrapperExtents.push({
196
+ startIndex,
197
+ endIndex: baseIndex + blocks.length,
198
+ order,
199
+ descriptor: odfIndexControlDescriptor(node)
200
+ });
201
+ } else if (node.tag === "text:index-title") blocks.push(...readBlocks(node.children, pkg, state, baseIndex + blocks.length));
202
+ else if (node.tag === "office:forms") blocks.push(...readOdfFormControlConstructs(node, "odt"));
41
203
  }
42
204
  return blocks;
43
205
  }
@@ -79,7 +241,7 @@ function readFirstMasterPageGeometry(pkg) {
79
241
  margins: margins ?? DEFAULT_MARGINS
80
242
  };
81
243
  }
82
- function readOdtContent(pkg) {
244
+ function readOdtContent(pkg, options = {}) {
83
245
  const contentPart = pkg.parts[CONTENT_PART];
84
246
  if (contentPart?.kind !== "xml") throw new Error(`readOdtContent: package has no ${CONTENT_PART} part`);
85
247
  const contentRoot = rootElement(contentPart.nodes);
@@ -88,22 +250,60 @@ function readOdtContent(pkg) {
88
250
  if (textElement === void 0) throw new Error(`readOdtContent: ${CONTENT_PART} has no office:body/office:text element`);
89
251
  const metadata = readOdfMetadata(pkg);
90
252
  const { pageSize, margins } = readFirstMasterPageGeometry(pkg);
253
+ const provenanceRegions = /* @__PURE__ */ new Map();
254
+ collectOdfProvenanceRegions(textElement.children, provenanceRegions);
255
+ const definitions = {
256
+ entries: {},
257
+ nextNoteOrdinal: 1,
258
+ nextAnnotationOrdinal: 1
259
+ };
260
+ collectOdfFieldMasterDefinitions(textElement.children, definitions.entries);
261
+ for (const partPath of AUTOMATIC_STYLE_PARTS) {
262
+ const part = pkg.parts[partPath];
263
+ if (part?.kind !== "xml") continue;
264
+ collectOdfDataStyleDefinitions(part.nodes, definitions.entries);
265
+ collectOdfFontFaceDefinitions(part.nodes, definitions.entries);
266
+ }
267
+ const state = {
268
+ listIdState: { next: 1 },
269
+ provenanceRegions,
270
+ definitions,
271
+ wrapperExtents: [],
272
+ markerEvents: [],
273
+ liftFrames: options.frames !== "none",
274
+ order: 0
275
+ };
276
+ const walked = readBlocks(textElement.children, pkg, state);
277
+ const { extents: markerExtents, paired } = resolveOdfMarkerEvents(state.markerEvents);
278
+ const extents = [...state.wrapperExtents, ...markerExtents];
279
+ for (const event of state.markerEvents) if (event.kind === "annotation" && event.side === "start" && !paired.has(event.element)) {
280
+ const descriptor = event.descriptor();
281
+ if (descriptor !== void 0) extents.push({
282
+ startIndex: event.index,
283
+ endIndex: event.index,
284
+ order: event.order,
285
+ descriptor
286
+ });
287
+ }
91
288
  return {
92
289
  metadata,
93
290
  sections: [{
94
291
  pageSize,
95
292
  margins,
96
- blocks: readBlocks(textElement.children, pkg, { next: 1 })
97
- }]
293
+ blocks: insertOdfConstructMarkers(walked, extents)
294
+ }],
295
+ ...Object.keys(definitions.entries).length > 0 ? { definitions: definitions.entries } : {}
98
296
  };
99
297
  }
100
- function readOdt(pkg) {
101
- const { metadata, sections } = readOdtContent(pkg);
102
- return assemblePackage({
298
+ function readOdt(pkg, options = {}) {
299
+ const { metadata, sections, definitions } = readOdtContent(pkg, options);
300
+ const assembled = assemblePackage({
103
301
  kind: "wordprocessing",
104
302
  metadata,
105
303
  sections
106
304
  });
305
+ if (definitions !== void 0) assembled.definitions = definitions;
306
+ return assembled;
107
307
  }
108
308
  //#endregion
109
309
  export { readOdt, readOdtContent };
@@ -1,2 +1,2 @@
1
- import { a as resolveStyle, i as findStyleElement, n as StyleCascadeResult, o as resolveStyleElementChain, r as StyleElementChainResult, t as CascadeDiagnostic } from "../../cascade-qYa3mgnE.cjs";
1
+ import { a as resolveStyle, i as findStyleElement, n as StyleCascadeResult, o as resolveStyleElementChain, r as StyleElementChainResult, t as CascadeDiagnostic } from "../../cascade-BmvsXcAz.cjs";
2
2
  export { CascadeDiagnostic, StyleCascadeResult, StyleElementChainResult, findStyleElement, resolveStyle, resolveStyleElementChain };
@@ -1,2 +1,2 @@
1
- import { a as resolveStyle, i as findStyleElement, n as StyleCascadeResult, o as resolveStyleElementChain, r as StyleElementChainResult, t as CascadeDiagnostic } from "../../cascade-8u4q16_U.js";
1
+ import { a as resolveStyle, i as findStyleElement, n as StyleCascadeResult, o as resolveStyleElementChain, r as StyleElementChainResult, t as CascadeDiagnostic } from "../../cascade-rhqUQrUa.js";
2
2
  export { CascadeDiagnostic, StyleCascadeResult, StyleElementChainResult, findStyleElement, resolveStyle, resolveStyleElementChain };