ooxml-core 1.8.3 → 1.9.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 (308) hide show
  1. package/dist/PptxHandler-AT7FVG5Q.mjs +2 -0
  2. package/dist/{PptxHandler-BL4B7CZO.mjs → PptxHandler-EX4WBIQQ.mjs} +2 -2
  3. package/dist/PptxHandler-VFSCECPL.cjs +11 -0
  4. package/dist/automation/index.cjs +7380 -4682
  5. package/dist/automation/index.mjs +7380 -4682
  6. package/dist/chunk-AT66SA5M.cjs +44423 -0
  7. package/dist/{chunk-TTPZITQN.mjs → chunk-FIELY5PI.mjs} +1 -1
  8. package/dist/{chunk-ZAP5WLEN.mjs → chunk-IGOA57LE.mjs} +1 -1
  9. package/dist/chunk-LCS3J3QI.mjs +87604 -0
  10. package/dist/{chunk-NIHPA63A.mjs → chunk-M76PHYRR.mjs} +54 -37
  11. package/dist/chunk-OB277ZGE.mjs +44107 -0
  12. package/dist/{chunk-GAGSCAR3.mjs → chunk-OXHMZS7B.mjs} +552 -178
  13. package/dist/chunk-SWF7KVL5.cjs +87610 -0
  14. package/dist/{chunk-Z7IQR4S4.mjs → chunk-WSO4T2LJ.mjs} +246 -21
  15. package/dist/docx/block-parser.d.ts.map +1 -1
  16. package/dist/docx/cell-blocks.d.ts +4 -0
  17. package/dist/docx/cell-blocks.d.ts.map +1 -0
  18. package/dist/docx/document-paragraphs.d.ts.map +1 -1
  19. package/dist/docx/document-parts.d.ts +2 -0
  20. package/dist/docx/document-parts.d.ts.map +1 -1
  21. package/dist/docx/embedded.cjs +189 -20
  22. package/dist/docx/embedded.mjs +189 -20
  23. package/dist/docx/index.cjs +219 -24
  24. package/dist/docx/index.mjs +219 -24
  25. package/dist/docx/layout/adapt-table.d.ts.map +1 -1
  26. package/dist/docx/layout/adapter.d.ts.map +1 -1
  27. package/dist/docx/layout/flow-paragraph.d.ts +5 -0
  28. package/dist/docx/layout/flow-paragraph.d.ts.map +1 -1
  29. package/dist/docx/layout/flow-table.d.ts +2 -1
  30. package/dist/docx/layout/flow-table.d.ts.map +1 -1
  31. package/dist/docx/layout/footnote-columns.d.ts +22 -0
  32. package/dist/docx/layout/footnote-columns.d.ts.map +1 -0
  33. package/dist/docx/layout/footnote-flow.d.ts +27 -0
  34. package/dist/docx/layout/footnote-flow.d.ts.map +1 -0
  35. package/dist/docx/layout/footnote-split.d.ts +7 -0
  36. package/dist/docx/layout/footnote-split.d.ts.map +1 -0
  37. package/dist/docx/layout/index.cjs +1099 -92
  38. package/dist/docx/layout/index.mjs +1099 -92
  39. package/dist/docx/layout/input.d.ts +17 -1
  40. package/dist/docx/layout/input.d.ts.map +1 -1
  41. package/dist/docx/layout/legacy-footnote-flow.d.ts +18 -0
  42. package/dist/docx/layout/legacy-footnote-flow.d.ts.map +1 -0
  43. package/dist/docx/layout/line-metrics.d.ts.map +1 -1
  44. package/dist/docx/layout/page-cursor.d.ts +13 -8
  45. package/dist/docx/layout/page-cursor.d.ts.map +1 -1
  46. package/dist/docx/layout/page-flow.d.ts.map +1 -1
  47. package/dist/docx/layout/paragraph-layout.d.ts.map +1 -1
  48. package/dist/docx/layout/paragraph-tokens.d.ts +2 -0
  49. package/dist/docx/layout/paragraph-tokens.d.ts.map +1 -1
  50. package/dist/docx/layout/reference-footnotes.d.ts +7 -0
  51. package/dist/docx/layout/reference-footnotes.d.ts.map +1 -0
  52. package/dist/docx/layout/result.d.ts +31 -0
  53. package/dist/docx/layout/result.d.ts.map +1 -1
  54. package/dist/docx/layout/section-flow.d.ts +2 -0
  55. package/dist/docx/layout/section-flow.d.ts.map +1 -1
  56. package/dist/docx/layout/table-cell-layout.d.ts +11 -0
  57. package/dist/docx/layout/table-cell-layout.d.ts.map +1 -0
  58. package/dist/docx/layout/table-footnotes.d.ts +27 -0
  59. package/dist/docx/layout/table-footnotes.d.ts.map +1 -0
  60. package/dist/docx/layout/table-layout.d.ts +10 -4
  61. package/dist/docx/layout/table-layout.d.ts.map +1 -1
  62. package/dist/docx/load/index.cjs +194 -25
  63. package/dist/docx/load/index.mjs +194 -25
  64. package/dist/docx/model-run.d.ts +2 -0
  65. package/dist/docx/model-run.d.ts.map +1 -1
  66. package/dist/docx/model.d.ts +7 -0
  67. package/dist/docx/model.d.ts.map +1 -1
  68. package/dist/docx/notes.d.ts +5 -0
  69. package/dist/docx/notes.d.ts.map +1 -1
  70. package/dist/docx/parse-table.d.ts.map +1 -1
  71. package/dist/docx/parse.d.ts.map +1 -1
  72. package/dist/docx/save.d.ts.map +1 -1
  73. package/dist/docx/section-model.d.ts +2 -0
  74. package/dist/docx/section-model.d.ts.map +1 -1
  75. package/dist/docx/sections.d.ts.map +1 -1
  76. package/dist/docx/settings.d.ts +2 -0
  77. package/dist/docx/settings.d.ts.map +1 -1
  78. package/dist/docx/table-model.d.ts +3 -1
  79. package/dist/docx/table-model.d.ts.map +1 -1
  80. package/dist/docx/ui/index.cjs +55 -0
  81. package/dist/docx/ui/index.d.ts +1 -0
  82. package/dist/docx/ui/index.d.ts.map +1 -1
  83. package/dist/docx/ui/index.mjs +55 -1
  84. package/dist/docx/ui/table-structure-guard.d.ts +4 -0
  85. package/dist/docx/ui/table-structure-guard.d.ts.map +1 -0
  86. package/dist/docx/write-footnote-columns.d.ts +3 -0
  87. package/dist/docx/write-footnote-columns.d.ts.map +1 -0
  88. package/dist/docx/write-notes.d.ts.map +1 -1
  89. package/dist/docx/write-run.d.ts.map +1 -1
  90. package/dist/docx/write-sections.d.ts.map +1 -1
  91. package/dist/index.cjs +8 -5
  92. package/dist/index.mjs +8 -5
  93. package/dist/opc/clone-part-graph.d.ts +4 -0
  94. package/dist/opc/clone-part-graph.d.ts.map +1 -1
  95. package/dist/opc/index.cjs +8 -5
  96. package/dist/opc/index.mjs +8 -5
  97. package/dist/pptx/automation/index.cjs +621 -207
  98. package/dist/pptx/automation/index.d.ts +3 -3
  99. package/dist/pptx/automation/index.mjs +5 -5
  100. package/dist/pptx/chunks/{index-Cn-GzYGp.d.ts → index-B4cnSPNz.d.ts} +33 -4
  101. package/dist/pptx/chunks/index-B4cnSPNz.d.ts.map +1 -0
  102. package/dist/pptx/chunks/{index-CKIUurnd.d.ts → index-BZh-IMkN.d.ts} +14 -9
  103. package/dist/pptx/chunks/{index-CKIUurnd.d.ts.map → index-BZh-IMkN.d.ts.map} +1 -1
  104. package/dist/pptx/chunks/{text-operations-BHfAm5K9.d.ts → text-operations-BLodkuXE.d.ts} +29 -12
  105. package/dist/pptx/chunks/text-operations-BLodkuXE.d.ts.map +1 -0
  106. package/dist/pptx/cli/index.cjs +622 -213
  107. package/dist/pptx/cli/index.d.ts +1 -1
  108. package/dist/pptx/cli/index.mjs +4 -4
  109. package/dist/pptx/converter/index.cjs +53 -36
  110. package/dist/pptx/converter/index.d.ts +1 -1
  111. package/dist/pptx/converter/index.mjs +2 -2
  112. package/dist/pptx/editor/render/find-replace.cjs +416 -45
  113. package/dist/pptx/editor/render/find-replace.d.ts +35 -4
  114. package/dist/pptx/editor/render/find-replace.d.ts.map +1 -1
  115. package/dist/pptx/editor/render/find-replace.mjs +416 -46
  116. package/dist/pptx/editor/render/slide-operations.cjs +87 -0
  117. package/dist/pptx/editor/render/slide-operations.d.ts +17 -1
  118. package/dist/pptx/editor/render/slide-operations.d.ts.map +1 -1
  119. package/dist/pptx/editor/render/slide-operations.mjs +83 -1
  120. package/dist/pptx/editor/render/slide-search.cjs +6 -10
  121. package/dist/pptx/editor/render/slide-search.d.ts +1 -1
  122. package/dist/pptx/editor/render/slide-search.mjs +6 -10
  123. package/dist/pptx/editor/render/template-editing.d.ts +1 -1
  124. package/dist/pptx/editor/render/template-editing.d.ts.map +1 -1
  125. package/dist/pptx/index.cjs +889 -237
  126. package/dist/pptx/index.d.ts +4 -4
  127. package/dist/pptx/index.mjs +5 -5
  128. package/dist/teams/index.cjs +672 -37
  129. package/dist/teams/index.mjs +672 -37
  130. package/dist/visio/accessibility.d.ts +10 -0
  131. package/dist/visio/accessibility.d.ts.map +1 -0
  132. package/dist/visio/cell-formula.d.ts +2 -0
  133. package/dist/visio/cell-formula.d.ts.map +1 -1
  134. package/dist/visio/connector-curve-aligned.d.ts +5 -0
  135. package/dist/visio/connector-curve-aligned.d.ts.map +1 -0
  136. package/dist/visio/connector-curve-spans.d.ts +14 -0
  137. package/dist/visio/connector-curve-spans.d.ts.map +1 -0
  138. package/dist/visio/connector-jumps.d.ts +5 -0
  139. package/dist/visio/connector-jumps.d.ts.map +1 -0
  140. package/dist/visio/connector-route-walk.d.ts +2 -1
  141. package/dist/visio/connector-route-walk.d.ts.map +1 -1
  142. package/dist/visio/edit-alt-text-scope.d.ts +5 -0
  143. package/dist/visio/edit-alt-text-scope.d.ts.map +1 -0
  144. package/dist/visio/edit-alt-text.d.ts +3 -0
  145. package/dist/visio/edit-alt-text.d.ts.map +1 -0
  146. package/dist/visio/edit-commands.d.ts +7 -2
  147. package/dist/visio/edit-commands.d.ts.map +1 -1
  148. package/dist/visio/edit-formatting-commands.d.ts +5 -0
  149. package/dist/visio/edit-formatting-commands.d.ts.map +1 -1
  150. package/dist/visio/edit-formatting-paint.d.ts.map +1 -1
  151. package/dist/visio/edit-formatting-scope.d.ts.map +1 -1
  152. package/dist/visio/edit-line-jump-cache.d.ts +4 -0
  153. package/dist/visio/edit-line-jump-cache.d.ts.map +1 -0
  154. package/dist/visio/edit-master-index.d.ts.map +1 -1
  155. package/dist/visio/edit-metadata-commands.d.ts +10 -2
  156. package/dist/visio/edit-metadata-commands.d.ts.map +1 -1
  157. package/dist/visio/edit-metadata.d.ts +3 -1
  158. package/dist/visio/edit-metadata.d.ts.map +1 -1
  159. package/dist/visio/edit-page-alt-text.d.ts +4 -0
  160. package/dist/visio/edit-page-alt-text.d.ts.map +1 -0
  161. package/dist/visio/edit-page-layout.d.ts.map +1 -1
  162. package/dist/visio/edit-page-rename.d.ts.map +1 -1
  163. package/dist/visio/edit-page-setup-commands.d.ts +7 -1
  164. package/dist/visio/edit-page-setup-commands.d.ts.map +1 -1
  165. package/dist/visio/edit-page-size.d.ts.map +1 -1
  166. package/dist/visio/edit-pages.d.ts.map +1 -1
  167. package/dist/visio/edit-recalculate-index.d.ts.map +1 -1
  168. package/dist/visio/edit-scope.d.ts.map +1 -1
  169. package/dist/visio/edit-shape-create.d.ts.map +1 -1
  170. package/dist/visio/edit-stencil-connector-write.d.ts.map +1 -1
  171. package/dist/visio/edit-style-admission.d.ts.map +1 -1
  172. package/dist/visio/edit-text.d.ts.map +1 -1
  173. package/dist/visio/edit.d.ts +1 -1
  174. package/dist/visio/edit.d.ts.map +1 -1
  175. package/dist/visio/index.cjs +1091 -233
  176. package/dist/visio/index.d.ts +2 -1
  177. package/dist/visio/index.d.ts.map +1 -1
  178. package/dist/visio/index.mjs +1091 -234
  179. package/dist/visio/line-jumps.d.ts +1 -5
  180. package/dist/visio/line-jumps.d.ts.map +1 -1
  181. package/dist/visio/model.d.ts +13 -0
  182. package/dist/visio/model.d.ts.map +1 -1
  183. package/dist/visio/page-layout.d.ts +11 -2
  184. package/dist/visio/page-layout.d.ts.map +1 -1
  185. package/dist/visio/parser.d.ts.map +1 -1
  186. package/dist/visio/shape-metadata.d.ts +6 -0
  187. package/dist/visio/shape-metadata.d.ts.map +1 -1
  188. package/dist/visio/shapes.d.ts.map +1 -1
  189. package/dist/visio/text-field-case.d.ts +2 -0
  190. package/dist/visio/text-field-case.d.ts.map +1 -0
  191. package/dist/visio/text-field-display.d.ts.map +1 -1
  192. package/dist/visio/text-field-numeric.d.ts +4 -0
  193. package/dist/visio/text-field-numeric.d.ts.map +1 -0
  194. package/dist/visio/ui/connector-preview.d.ts +1 -1
  195. package/dist/visio/ui/connector-preview.d.ts.map +1 -1
  196. package/dist/visio/ui/data-graphic-rules.d.ts +2 -0
  197. package/dist/visio/ui/data-graphic-rules.d.ts.map +1 -1
  198. package/dist/visio/ui/data-graphics.d.ts +3 -2
  199. package/dist/visio/ui/data-graphics.d.ts.map +1 -1
  200. package/dist/visio/ui/edit-commands.d.ts.map +1 -1
  201. package/dist/visio/ui/index.cjs +16898 -15855
  202. package/dist/visio/ui/index.mjs +16898 -15856
  203. package/dist/visio/ui/scene-details.d.ts.map +1 -1
  204. package/dist/visio/ui/scene-validation.d.ts.map +1 -1
  205. package/dist/visio/ui/snapshot-scene.d.ts +2 -1
  206. package/dist/visio/ui/snapshot-scene.d.ts.map +1 -1
  207. package/dist/visio/xml-attribute-whitespace.d.ts +5 -0
  208. package/dist/visio/xml-attribute-whitespace.d.ts.map +1 -0
  209. package/dist/xlsx/edit/index.d.ts +1 -0
  210. package/dist/xlsx/edit/index.d.ts.map +1 -1
  211. package/dist/xlsx/edit/insert-guard.d.ts.map +1 -1
  212. package/dist/xlsx/edit/merge.d.ts.map +1 -1
  213. package/dist/xlsx/edit/page-breaks.d.ts +5 -0
  214. package/dist/xlsx/edit/page-breaks.d.ts.map +1 -0
  215. package/dist/xlsx/edit/pivots.d.ts +8 -0
  216. package/dist/xlsx/edit/pivots.d.ts.map +1 -0
  217. package/dist/xlsx/edit/print-titles.d.ts +7 -0
  218. package/dist/xlsx/edit/print-titles.d.ts.map +1 -0
  219. package/dist/xlsx/edit/session.d.ts.map +1 -1
  220. package/dist/xlsx/edit/sheets.d.ts.map +1 -1
  221. package/dist/xlsx/edit/shift-formulas.d.ts.map +1 -1
  222. package/dist/xlsx/edit/shift-sheet.d.ts.map +1 -1
  223. package/dist/xlsx/edit/sparkline-ranges.d.ts +11 -0
  224. package/dist/xlsx/edit/sparkline-ranges.d.ts.map +1 -0
  225. package/dist/xlsx/edit/sparkline-xml.d.ts +13 -0
  226. package/dist/xlsx/edit/sparkline-xml.d.ts.map +1 -0
  227. package/dist/xlsx/edit/sparklines.d.ts +16 -0
  228. package/dist/xlsx/edit/sparklines.d.ts.map +1 -0
  229. package/dist/xlsx/edit/table-edits.d.ts.map +1 -1
  230. package/dist/xlsx/edit/tables.d.ts.map +1 -1
  231. package/dist/xlsx/edit/types.d.ts +22 -1
  232. package/dist/xlsx/edit/types.d.ts.map +1 -1
  233. package/dist/xlsx/formula/functions/text-regex.d.ts.map +1 -1
  234. package/dist/xlsx/index.cjs +3415 -1374
  235. package/dist/xlsx/index.d.ts +1 -0
  236. package/dist/xlsx/index.d.ts.map +1 -1
  237. package/dist/xlsx/index.mjs +3396 -1375
  238. package/dist/xlsx/layout/cell-view.d.ts +2 -0
  239. package/dist/xlsx/layout/cell-view.d.ts.map +1 -1
  240. package/dist/xlsx/layout/header-footer.d.ts +58 -0
  241. package/dist/xlsx/layout/header-footer.d.ts.map +1 -0
  242. package/dist/xlsx/layout/index.d.ts +5 -0
  243. package/dist/xlsx/layout/index.d.ts.map +1 -1
  244. package/dist/xlsx/layout/print-breaks.d.ts +11 -0
  245. package/dist/xlsx/layout/print-breaks.d.ts.map +1 -0
  246. package/dist/xlsx/layout/print-layout.d.ts +34 -0
  247. package/dist/xlsx/layout/print-layout.d.ts.map +1 -0
  248. package/dist/xlsx/layout/print-merges.d.ts +18 -0
  249. package/dist/xlsx/layout/print-merges.d.ts.map +1 -0
  250. package/dist/xlsx/layout/print-repeat.d.ts +12 -0
  251. package/dist/xlsx/layout/print-repeat.d.ts.map +1 -0
  252. package/dist/xlsx/layout/print-titles.d.ts +20 -0
  253. package/dist/xlsx/layout/print-titles.d.ts.map +1 -0
  254. package/dist/xlsx/layout/sparkline-data.d.ts.map +1 -1
  255. package/dist/xlsx/layout/sparkline-view.d.ts.map +1 -1
  256. package/dist/xlsx/load/index.cjs +7831 -6961
  257. package/dist/xlsx/load/index.mjs +7831 -6961
  258. package/dist/xlsx/model-pivots.d.ts +46 -0
  259. package/dist/xlsx/model-pivots.d.ts.map +1 -0
  260. package/dist/xlsx/model.d.ts +5 -0
  261. package/dist/xlsx/model.d.ts.map +1 -1
  262. package/dist/xlsx/pivot/admission.d.ts +5 -0
  263. package/dist/xlsx/pivot/admission.d.ts.map +1 -0
  264. package/dist/xlsx/pivot/aggregate.d.ts +19 -0
  265. package/dist/xlsx/pivot/aggregate.d.ts.map +1 -0
  266. package/dist/xlsx/pivot/cache-xml.d.ts +9 -0
  267. package/dist/xlsx/pivot/cache-xml.d.ts.map +1 -0
  268. package/dist/xlsx/pivot/data.d.ts +12 -0
  269. package/dist/xlsx/pivot/data.d.ts.map +1 -0
  270. package/dist/xlsx/pivot/hierarchy.d.ts +7 -0
  271. package/dist/xlsx/pivot/hierarchy.d.ts.map +1 -0
  272. package/dist/xlsx/pivot/index.d.ts +3 -0
  273. package/dist/xlsx/pivot/index.d.ts.map +1 -0
  274. package/dist/xlsx/pivot/read.d.ts +5 -0
  275. package/dist/xlsx/pivot/read.d.ts.map +1 -0
  276. package/dist/xlsx/pivot/table-xml.d.ts +5 -0
  277. package/dist/xlsx/pivot/table-xml.d.ts.map +1 -0
  278. package/dist/xlsx/pivot/write.d.ts +11 -0
  279. package/dist/xlsx/pivot/write.d.ts.map +1 -0
  280. package/dist/xlsx/read/load.d.ts.map +1 -1
  281. package/dist/xlsx/read/sheet-props.d.ts.map +1 -1
  282. package/dist/xlsx/ui/commands/i18n/index.d.ts.map +1 -1
  283. package/dist/xlsx/ui/commands/i18n/navigation.d.ts.map +1 -1
  284. package/dist/xlsx/ui/commands/i18n/pivots.d.ts +3 -0
  285. package/dist/xlsx/ui/commands/i18n/pivots.d.ts.map +1 -0
  286. package/dist/xlsx/ui/commands/i18n/print-layout.d.ts +3 -0
  287. package/dist/xlsx/ui/commands/i18n/print-layout.d.ts.map +1 -0
  288. package/dist/xlsx/ui/commands/i18n/sparklines.d.ts +3 -0
  289. package/dist/xlsx/ui/commands/i18n/sparklines.d.ts.map +1 -0
  290. package/dist/xlsx/ui/commands/i18n/tools.d.ts.map +1 -1
  291. package/dist/xlsx/ui/commands/page-breaks.d.ts +3 -0
  292. package/dist/xlsx/ui/commands/page-breaks.d.ts.map +1 -0
  293. package/dist/xlsx/ui/index.cjs +2451 -737
  294. package/dist/xlsx/ui/index.d.ts +1 -0
  295. package/dist/xlsx/ui/index.d.ts.map +1 -1
  296. package/dist/xlsx/ui/index.mjs +2451 -738
  297. package/dist/xlsx/write/chart-cache.d.ts +8 -0
  298. package/dist/xlsx/write/chart-cache.d.ts.map +1 -0
  299. package/dist/xlsx/write/page-setup.d.ts.map +1 -1
  300. package/dist/xlsx/write/save.d.ts.map +1 -1
  301. package/dist/xlsx/write/sheet-parts.d.ts +1 -0
  302. package/dist/xlsx/write/sheet-parts.d.ts.map +1 -1
  303. package/dist/xlsx/write/workbook-part.d.ts +1 -1
  304. package/dist/xlsx/write/workbook-part.d.ts.map +1 -1
  305. package/dist/xlsx/write/worksheet.d.ts.map +1 -1
  306. package/package.json +1 -1
  307. package/dist/pptx/chunks/index-Cn-GzYGp.d.ts.map +0 -1
  308. package/dist/pptx/chunks/text-operations-BHfAm5K9.d.ts.map +0 -1
@@ -39165,6 +39165,13 @@ function parseContentTypes(xml) {
39165
39165
  }
39166
39166
  return { defaults, overrides };
39167
39167
  }
39168
+ function contentTypeForPart(types, partName) {
39169
+ const overridePath = partName.startsWith("/") ? partName : `/${partName}`;
39170
+ const override = types.overrides.get(overridePath);
39171
+ if (override) return override;
39172
+ const extension = partName.split(".").pop()?.toLowerCase();
39173
+ return extension ? types.defaults.get(extension) : void 0;
39174
+ }
39168
39175
  var init_content_types = __esm({
39169
39176
  "opc/content-types.ts"() {
39170
39177
  init_xml2();
@@ -39204,10 +39211,13 @@ function relativePartTarget(basePart, targetPart) {
39204
39211
  }
39205
39212
  async function clonePartGraph(options) {
39206
39213
  const { zip, sourcePart, targetPart, shouldClone } = options;
39207
- const copies = /* @__PURE__ */ new Map([[sourcePart, targetPart]]);
39208
- const types = parseContentTypes(await zip.file("[Content_Types].xml")?.async("string"));
39214
+ const sourceZip = options.sourceZip ?? zip;
39215
+ const copies = options.copies ?? /* @__PURE__ */ new Map();
39216
+ copies.set(sourcePart, targetPart);
39217
+ const types = parseContentTypes(await sourceZip.file("[Content_Types].xml")?.async("string"));
39209
39218
  const reserved = new Set(Object.keys(zip.files));
39210
39219
  reserved.add(targetPart);
39220
+ for (const target of copies.values()) reserved.add(target);
39211
39221
  const allocate = (source) => {
39212
39222
  const match = /^(?<stem>.*?)(?:\d+)?(?<extension>\.[^/.]+)$/u.exec(source);
39213
39223
  const stem = match?.groups?.stem ?? source;
@@ -39219,9 +39229,9 @@ async function clonePartGraph(options) {
39219
39229
  return path2;
39220
39230
  };
39221
39231
  const copyRelationships = async (source, destination) => {
39222
- const contentType = types.overrides.get(`/${source}`);
39232
+ const contentType = contentTypeForPart(types, source);
39223
39233
  if (contentType) await ensureContentTypeOverride(zip, destination, contentType);
39224
- const xml = await zip.file(relationshipsPartFor(source))?.async("string");
39234
+ const xml = await sourceZip.file(relationshipsPartFor(source))?.async("string");
39225
39235
  if (!xml) return;
39226
39236
  const relationships2 = parseRelationships(xml);
39227
39237
  for (const relationship of relationships2.values()) {
@@ -39229,7 +39239,7 @@ async function clonePartGraph(options) {
39229
39239
  const originalTarget = resolvePartPath(source, relationship.target);
39230
39240
  let newTarget = copies.get(originalTarget);
39231
39241
  if (!newTarget && shouldClone(relationship, originalTarget)) {
39232
- const file = zip.file(originalTarget);
39242
+ const file = sourceZip.file(originalTarget);
39233
39243
  if (!file) throw new Error(`Cannot clone missing package part: ${originalTarget}`);
39234
39244
  newTarget = allocate(originalTarget);
39235
39245
  copies.set(originalTarget, newTarget);
@@ -61136,7 +61146,13 @@ var init_PptxSlideNotesPartUpdater = __esm({
61136
61146
  init.slideNotesRelationshipType,
61137
61147
  `../notesSlides/${fileName}`
61138
61148
  );
61139
- init.zip.file(notesPath, init.xmlBuilder.build(this.buildNotesSlide(init.slide, strict)));
61149
+ const notesXmlObject = this.buildNotesSlide(init.slide, strict);
61150
+ init.updateNotesXmlText(
61151
+ notesXmlObject,
61152
+ init.slide.notes ?? init.slide.notesSegments?.map((segment) => segment.text).join("") ?? "",
61153
+ init.slide.notesSegments
61154
+ );
61155
+ init.zip.file(notesPath, init.xmlBuilder.build(notesXmlObject));
61140
61156
  init.zip.file(
61141
61157
  `ppt/notesSlides/_rels/${fileName}.rels`,
61142
61158
  init.xmlBuilder.build({
@@ -93669,6 +93685,341 @@ var init_header_footer_parts = __esm({
93669
93685
  }
93670
93686
  });
93671
93687
 
93688
+ // pptx/core/utils/chart-xlsx-write-validation.ts
93689
+ function unsupported(reason) {
93690
+ throw new Error(`Chart label replacement requires direct literal workbook cells: ${reason}.`);
93691
+ }
93692
+ async function validateAtomicChartWorkbookWrites(zip, parser, paths, writes, requireCurrentValues = false) {
93693
+ const relationships2 = xmlChild(
93694
+ parser.parse(
93695
+ await zip.file("xl/_rels/workbook.xml.rels")?.async("string") ?? ""
93696
+ ),
93697
+ "Relationships"
93698
+ );
93699
+ for (const rel of xmlChildren(relationships2, "Relationship")) {
93700
+ if (xmlAttr(rel, "TargetMode") === "External") {
93701
+ unsupported("external worksheet relationships are not supported");
93702
+ }
93703
+ }
93704
+ const sheets = /* @__PURE__ */ new Map();
93705
+ const cellsByPath = /* @__PURE__ */ new Map();
93706
+ for (const path2 of new Set(paths.values())) {
93707
+ const file = zip.file(path2);
93708
+ if (!file) {
93709
+ unsupported("a referenced worksheet is missing");
93710
+ }
93711
+ let tree;
93712
+ try {
93713
+ tree = parser.parse(await file.async("string"));
93714
+ } catch {
93715
+ unsupported("a worksheet cannot be parsed");
93716
+ }
93717
+ const data = xmlChild(xmlChild(tree, "worksheet"), "sheetData");
93718
+ if (!data) {
93719
+ unsupported("a worksheet has no cell data");
93720
+ }
93721
+ if (Object.keys(data).some((key2) => key2.includes(":"))) {
93722
+ unsupported("prefixed worksheet cell nodes are not supported");
93723
+ }
93724
+ const cells2 = /* @__PURE__ */ new Map();
93725
+ for (const row of xmlChildren(data, "row")) {
93726
+ if (Object.keys(row).some((key2) => key2.includes(":"))) {
93727
+ unsupported("prefixed worksheet cell nodes are not supported");
93728
+ }
93729
+ for (const cell of xmlChildren(row, "c")) {
93730
+ const ref = xmlAttr(cell, "r");
93731
+ if (!ref || cells2.has(ref)) {
93732
+ unsupported("duplicate or unidentified worksheet cells are not supported");
93733
+ }
93734
+ cells2.set(ref, cell);
93735
+ if (Object.keys(cell).some((key2) => key2 === "f" || key2.endsWith(":f"))) {
93736
+ unsupported("formula-dependent workbooks are not supported");
93737
+ }
93738
+ }
93739
+ }
93740
+ sheets.set(path2, data);
93741
+ cellsByPath.set(path2, cells2);
93742
+ }
93743
+ const sharedFile = zip.file("xl/sharedStrings.xml");
93744
+ const shared = sharedFile ? xmlChildren(
93745
+ xmlChild(parser.parse(await sharedFile.async("string")), "sst"),
93746
+ "si"
93747
+ ) : [];
93748
+ const destinations = /* @__PURE__ */ new Map();
93749
+ for (const write of writes) {
93750
+ const range = parseChartFormulaRange(write.formula);
93751
+ if (!range || /[\[\]:!]/u.test(range.sheetName)) {
93752
+ unsupported("a range is not a direct local reference");
93753
+ }
93754
+ if ([range.start, range.end].some(
93755
+ (cell) => cell.row < 0 || cell.row >= 1048576 || cell.col < 0 || cell.col >= 16384
93756
+ )) {
93757
+ unsupported("a source cell lies outside the worksheet limits");
93758
+ }
93759
+ const addresses = expandRangeAddresses(range, write.values.length);
93760
+ const path2 = paths.get(range.sheetName.toLowerCase());
93761
+ const data = path2 ? sheets.get(path2) : void 0;
93762
+ if (!addresses || !path2 || !data) {
93763
+ unsupported("a source range cannot be resolved");
93764
+ }
93765
+ for (const [index, address] of addresses.entries()) {
93766
+ const value = write.values[index];
93767
+ const key2 = `${path2}!${address}`;
93768
+ const prior = destinations.get(key2);
93769
+ if (prior && (prior.value !== value || prior.numeric !== write.isNumeric)) {
93770
+ unsupported("overlapping source ranges request conflicting values");
93771
+ }
93772
+ destinations.set(key2, { value, numeric: write.isNumeric });
93773
+ const cell = cellsByPath.get(path2)?.get(address);
93774
+ if (!cell) {
93775
+ unsupported("a source cell is missing");
93776
+ }
93777
+ const type = xmlAttr(cell, "t") ?? "n";
93778
+ const text2 = type === "s" ? shared[Number(xmlText(cell.v))] : xmlChild(cell, "is");
93779
+ if (text2 && Object.keys(text2).some((node) => !node.startsWith("@_") && node !== "t" && node !== "#text")) {
93780
+ unsupported("rich worksheet strings require source-workbook editing");
93781
+ }
93782
+ if (requireCurrentValues) {
93783
+ const current = text2 ? xmlText(text2.t) : xmlText(cell.v);
93784
+ const equal = write.isNumeric ? current !== void 0 && Number(current) === Number(value) : current === value;
93785
+ if (!equal) {
93786
+ unsupported("the workbook and chart caches disagree");
93787
+ }
93788
+ }
93789
+ if (write.isNumeric && !Number.isFinite(Number(value))) {
93790
+ unsupported("a numeric cache value is not finite");
93791
+ }
93792
+ if (!["n", "s", "inlineStr", "str"].includes(type)) {
93793
+ unsupported("a source cell has an unsupported value type");
93794
+ }
93795
+ }
93796
+ }
93797
+ }
93798
+ var init_chart_xlsx_write_validation = __esm({
93799
+ "pptx/core/utils/chart-xlsx-write-validation.ts"() {
93800
+ init_chart_xlsx_cellref();
93801
+ init_xml_access();
93802
+ }
93803
+ });
93804
+ function collectChartWorkbookWrite(xmlLookupService, container2, isNumeric2, values) {
93805
+ if (!container2) {
93806
+ return void 0;
93807
+ }
93808
+ const refNode = xmlLookupService.getChildByLocalName(container2, isNumeric2 ? "numRef" : "strRef");
93809
+ const formula = refNode ? xmlLookupService.getScalarChildByLocalName(refNode, "f") : void 0;
93810
+ return formula ? { formula, isNumeric: isNumeric2, values } : void 0;
93811
+ }
93812
+ function createSpreadsheetXmlParser2() {
93813
+ return new fastXmlParser.XMLParser({
93814
+ ignoreAttributes: false,
93815
+ attributeNamePrefix: "@_",
93816
+ trimValues: false,
93817
+ parseTagValue: false,
93818
+ tagValueProcessor: (tagName, tagValue) => preservesSpreadsheetXmlWhitespace(tagName) ? tagValue : tagValue.trim()
93819
+ });
93820
+ }
93821
+ function createSpreadsheetXmlBuilder2() {
93822
+ return new fastXmlParser.XMLBuilder({
93823
+ ignoreAttributes: false,
93824
+ attributeNamePrefix: "@_",
93825
+ suppressBooleanAttributes: false,
93826
+ format: false
93827
+ });
93828
+ }
93829
+ async function resolveWorksheetPathsByName(xlsxZip, parser) {
93830
+ const result = /* @__PURE__ */ new Map();
93831
+ const workbookFile = xlsxZip.file("xl/workbook.xml");
93832
+ const relsFile = xlsxZip.file("xl/_rels/workbook.xml.rels");
93833
+ if (!workbookFile || !relsFile) {
93834
+ return result;
93835
+ }
93836
+ try {
93837
+ const workbookTree = parser.parse(await workbookFile.async("string"));
93838
+ const relsTree = parser.parse(await relsFile.async("string"));
93839
+ const targetByRelId = /* @__PURE__ */ new Map();
93840
+ const relationships2 = xmlChild(relsTree, "Relationships");
93841
+ for (const rel of xmlChildren(relationships2, "Relationship")) {
93842
+ const id = xmlAttr(rel, "Id");
93843
+ const target = xmlAttr(rel, "Target");
93844
+ if (id && target) {
93845
+ targetByRelId.set(id, target);
93846
+ }
93847
+ }
93848
+ const workbookRoot = xmlChild(workbookTree, "workbook");
93849
+ const sheets = xmlChild(workbookRoot, "sheets");
93850
+ for (const sheet of xmlChildren(sheets, "sheet")) {
93851
+ const name = xmlAttr(sheet, "name");
93852
+ const relId = xmlAttr(sheet, "r:id") ?? xmlAttr(sheet, "id");
93853
+ const target = relId ? targetByRelId.get(relId) : void 0;
93854
+ if (name && target) {
93855
+ result.set(name.toLowerCase(), resolveWorkbookPartPath(target));
93856
+ }
93857
+ }
93858
+ } catch {
93859
+ }
93860
+ return result;
93861
+ }
93862
+ function resolveWorkbookPartPath(target) {
93863
+ return target.startsWith("/") ? target.slice(1) : `xl/${target}`;
93864
+ }
93865
+ async function writeChartWorkbookUpdates(xlsxBytes, writes, options = {}) {
93866
+ if (writes.length === 0) {
93867
+ return { unresolved: 0 };
93868
+ }
93869
+ let xlsxZip;
93870
+ try {
93871
+ xlsxZip = await JSZip3__default.default.loadAsync(xlsxBytes);
93872
+ } catch {
93873
+ if (options.atomic) {
93874
+ throw new Error("Chart label replacement requires a readable embedded workbook.");
93875
+ }
93876
+ return { unresolved: writes.length };
93877
+ }
93878
+ const parser = createSpreadsheetXmlParser2();
93879
+ const sheetPathByName = await resolveWorksheetPathsByName(xlsxZip, parser);
93880
+ if (options.atomic) {
93881
+ await validateAtomicChartWorkbookWrites(
93882
+ xlsxZip,
93883
+ parser,
93884
+ sheetPathByName,
93885
+ writes,
93886
+ options.requireCurrentValues ?? false
93887
+ );
93888
+ }
93889
+ const writesBySheetPath = /* @__PURE__ */ new Map();
93890
+ let unresolved = 0;
93891
+ for (const write of writes) {
93892
+ const range = parseChartFormulaRange(write.formula);
93893
+ const sheetPath = range ? sheetPathByName.get(range.sheetName.toLowerCase()) : void 0;
93894
+ const refs = range ? expandRangeAddresses(range, write.values.length) : void 0;
93895
+ if (!range || !sheetPath || !refs) {
93896
+ unresolved += 1;
93897
+ continue;
93898
+ }
93899
+ const bucket = writesBySheetPath.get(sheetPath) ?? [];
93900
+ bucket.push({ refs, values: write.values, isNumeric: write.isNumeric });
93901
+ writesBySheetPath.set(sheetPath, bucket);
93902
+ }
93903
+ const builder3 = createSpreadsheetXmlBuilder2();
93904
+ let changedAny = false;
93905
+ for (const [sheetPath, resolvedWrites] of writesBySheetPath) {
93906
+ const sheetFile = xlsxZip.file(sheetPath);
93907
+ if (!sheetFile) {
93908
+ unresolved += resolvedWrites.length;
93909
+ continue;
93910
+ }
93911
+ try {
93912
+ const sheetTree = parser.parse(await sheetFile.async("string"));
93913
+ const cellWrites = resolvedWrites.flatMap(
93914
+ ({ refs, values, isNumeric: isNumeric2 }) => refs.map((ref, i2) => ({ ref, isNumeric: isNumeric2, value: values[i2] }))
93915
+ );
93916
+ if (applyCellWritesToWorksheet(sheetTree, cellWrites)) {
93917
+ xlsxZip.file(sheetPath, builder3.build(sheetTree));
93918
+ changedAny = true;
93919
+ }
93920
+ } catch {
93921
+ unresolved += resolvedWrites.length;
93922
+ }
93923
+ }
93924
+ if (options.atomic && unresolved > 0) {
93925
+ throw new Error("Chart label replacement could not update every source range.");
93926
+ }
93927
+ if (!changedAny) {
93928
+ return { unresolved };
93929
+ }
93930
+ const bytes = await xlsxZip.generateAsync({
93931
+ type: "uint8array",
93932
+ compression: "DEFLATE",
93933
+ compressionOptions: { level: 6 }
93934
+ });
93935
+ return { bytes, unresolved };
93936
+ }
93937
+ var init_chart_xlsx_writer = __esm({
93938
+ "pptx/core/utils/chart-xlsx-writer.ts"() {
93939
+ init_chart_xlsx_cellref();
93940
+ init_chart_xlsx_write_validation();
93941
+ init_chart_xlsx_sheet_cells();
93942
+ init_xml_access();
93943
+ init_xml_whitespace();
93944
+ }
93945
+ });
93946
+ function formulaCount(value) {
93947
+ if (!value || typeof value !== "object") return 0;
93948
+ if (Array.isArray(value)) return value.reduce((total, item) => total + formulaCount(item), 0);
93949
+ return Object.entries(value).reduce(
93950
+ (total, [key2, child30]) => total + (key2 === "f" || key2.endsWith(":f") ? 1 : formulaCount(child30)),
93951
+ 0
93952
+ );
93953
+ }
93954
+ async function chartLabelsHaveEditableSources(xml, zip, chartSpace, seriesNodes, series, categories, external, chartPartPath, resolve) {
93955
+ if (!chartSpace || seriesNodes.length !== series.length || !categories.length || external?.isExternal)
93956
+ return false;
93957
+ if (formulaCount(chartSpace) !== seriesNodes.reduce((sum, node) => sum + formulaCount(node), 0))
93958
+ return false;
93959
+ const writes = [];
93960
+ const labelOwners = /* @__PURE__ */ new Map();
93961
+ for (const [index, node] of seriesNodes.entries()) {
93962
+ const entry2 = series[index];
93963
+ for (const [name, numeric, values] of [
93964
+ ["tx", false, [entry2.name]],
93965
+ ["cat", false, [...categories]],
93966
+ ["val", true, entry2.values.map(String)]
93967
+ ]) {
93968
+ const container2 = xml.getChildByLocalName(node, name);
93969
+ if (!container2) return false;
93970
+ const write = collectChartWorkbookWrite(xml, container2, numeric, [...values]);
93971
+ if (write) {
93972
+ writes.push(write);
93973
+ if (!numeric) {
93974
+ const range = parseChartFormulaRange(write.formula);
93975
+ const addresses = range ? expandRangeAddresses(range, values.length) : void 0;
93976
+ if (!range || !addresses) return false;
93977
+ for (const [point2, address] of addresses.entries()) {
93978
+ const key2 = `${range.sheetName.toLowerCase()}!${address}`;
93979
+ const owner = name === "tx" ? `series:${index}` : `category:${point2}`;
93980
+ if (labelOwners.has(key2) && labelOwners.get(key2) !== owner) return false;
93981
+ labelOwners.set(key2, owner);
93982
+ }
93983
+ }
93984
+ } else if (external || !xml.getChildByLocalName(container2, numeric ? "numLit" : "strLit") && !(name === "tx" && xml.getScalarChildByLocalName(container2, "v") !== void 0))
93985
+ return false;
93986
+ }
93987
+ }
93988
+ if (formulaCount(chartSpace) !== writes.length) return false;
93989
+ if (!external) return writes.length === 0;
93990
+ if (!external.targetPath || !external.embeddedWorkbookData) return false;
93991
+ const target = resolve(chartPartPath, external.targetPath);
93992
+ let references = 0;
93993
+ const parser = new fastXmlParser.XMLParser({ ignoreAttributes: false, attributeNamePrefix: "@_" });
93994
+ try {
93995
+ for (const path2 of Object.keys(zip.files)) {
93996
+ if (!path2.endsWith(".rels") || !path2.includes("/_rels/")) continue;
93997
+ const source = path2.replace("/_rels/", "/").slice(0, -5);
93998
+ const tree = parser.parse(await zip.file(path2).async("string"));
93999
+ for (const rel of xmlChildren(xmlChild(tree, "Relationships"), "Relationship")) {
94000
+ const relationshipTarget2 = xmlAttr(rel, "Target");
94001
+ if (relationshipTarget2 && xmlAttr(rel, "TargetMode") !== "External" && resolve(source, relationshipTarget2) === target)
94002
+ references++;
94003
+ }
94004
+ }
94005
+ if (references !== 1) return false;
94006
+ await writeChartWorkbookUpdates(external.embeddedWorkbookData, writes, {
94007
+ atomic: true,
94008
+ requireCurrentValues: true
94009
+ });
94010
+ return true;
94011
+ } catch {
94012
+ return false;
94013
+ }
94014
+ }
94015
+ var init_chart_label_source = __esm({
94016
+ "pptx/core/utils/chart-label-source.ts"() {
94017
+ init_chart_xlsx_writer();
94018
+ init_xml_access();
94019
+ init_chart_xlsx_cellref();
94020
+ }
94021
+ });
94022
+
93672
94023
  // pptx/core/utils/chart-band-fmts.ts
93673
94024
  function safeUnsignedInt2(val) {
93674
94025
  const n = Number(val);
@@ -107769,6 +108120,18 @@ var init_tag_package = __esm({
107769
108120
  }
107770
108121
  });
107771
108122
 
108123
+ // pptx/core/utils/chart-workbook-data-signature.ts
108124
+ function chartWorkbookDataSignature(data) {
108125
+ return JSON.stringify({
108126
+ categories: data.dateCategories?.values ?? data.categories,
108127
+ series: data.series.map((series) => ({ name: series.name, values: series.values }))
108128
+ });
108129
+ }
108130
+ var init_chart_workbook_data_signature = __esm({
108131
+ "pptx/core/utils/chart-workbook-data-signature.ts"() {
108132
+ }
108133
+ });
108134
+
107772
108135
  // pptx/core/utils/chart-axis-deleted.ts
107773
108136
  function authoredDeleted(node) {
107774
108137
  if (node === void 0) {
@@ -108856,6 +109219,33 @@ var init_chart_title_run_alignment = __esm({
108856
109219
  }
108857
109220
  });
108858
109221
 
109222
+ // pptx/core/utils/chart-title-text-edit.ts
109223
+ function patchChartTitleRunText(title, runs, local) {
109224
+ const tx = title[findKey7(title, "tx", local) ?? ""];
109225
+ const rich = tx?.[findKey7(tx, "rich", local) ?? ""];
109226
+ const raw = rich?.[findKey7(rich, "p", local) ?? ""];
109227
+ const paragraphs = Array.isArray(raw) ? raw : raw ? [raw] : [];
109228
+ if (paragraphs.length !== 1) return false;
109229
+ const paragraph = paragraphs[0];
109230
+ if (findKey7(paragraph, "br", local) || findKey7(paragraph, "fld", local)) return false;
109231
+ const rawRuns = paragraph[findKey7(paragraph, "r", local) ?? ""];
109232
+ const original = Array.isArray(rawRuns) ? rawRuns : rawRuns ? [rawRuns] : [];
109233
+ if (original.length !== runs.length) return false;
109234
+ const keys = original.map((run) => findKey7(run, "t", local));
109235
+ if (keys.some((key2) => !key2)) return false;
109236
+ for (const [index, value] of original.entries()) {
109237
+ const run = value, key2 = keys[index];
109238
+ const text2 = run[key2];
109239
+ run[key2] = text2 && typeof text2 === "object" && !Array.isArray(text2) ? { ...text2, "#text": runs[index].text } : runs[index].text;
109240
+ }
109241
+ return true;
109242
+ }
109243
+ var init_chart_title_text_edit = __esm({
109244
+ "pptx/core/utils/chart-title-text-edit.ts"() {
109245
+ init_chart_title_xml_ops();
109246
+ }
109247
+ });
109248
+
108859
109249
  // pptx/core/utils/chart-title-serializer.ts
108860
109250
  function applyChartTitleToXml(chartRoot, model, getLocalName2, options = { prefix: "c" }) {
108861
109251
  const { prefix } = options;
@@ -108881,11 +109271,18 @@ function applyChartTitleToXml(chartRoot, model, getLocalName2, options = { prefi
108881
109271
  runs = realignOrCollapseTitleRuns(staleRuns, model.title);
108882
109272
  }
108883
109273
  let titleNode = existingKey ? chartRoot[existingKey] : void 0;
109274
+ const textOnlyStylesMatch = Boolean(
109275
+ runs && model.titleTextOnlyStyles?.length === runs.length && runs.every(
109276
+ (run, index) => ["bold", "italic", "fontSize", "color"].every(
109277
+ (key2) => run[key2] === model.titleTextOnlyStyles[index][key2]
109278
+ )
109279
+ )
109280
+ );
108884
109281
  if (runs && titleNode && typeof titleNode === "object") {
108885
109282
  const existingTexts = [];
108886
109283
  collectAllText(titleNode, getLocalName2, existingTexts);
108887
109284
  const newTexts = runs.map((run) => run.text);
108888
- if (existingTexts.length === newTexts.length && existingTexts.every((text2, index) => text2 === newTexts[index])) {
109285
+ if ((!model.titleTextOnly || textOnlyStylesMatch) && existingTexts.length === newTexts.length && existingTexts.every((text2, index) => text2 === newTexts[index])) {
108889
109286
  runs = void 0;
108890
109287
  }
108891
109288
  }
@@ -108897,6 +109294,12 @@ function applyChartTitleToXml(chartRoot, model, getLocalName2, options = { prefi
108897
109294
  insertAt2(chartRoot, 0, `${prefix}:title`, titleNode);
108898
109295
  }
108899
109296
  } else if (runs) {
109297
+ if (model.titleTextOnly && textOnlyStylesMatch) {
109298
+ if (!patchChartTitleRunText(titleNode, runs, getLocalName2))
109299
+ throw new Error("This chart title cannot be replaced without changing its text source");
109300
+ if (prefix === "c") setAutoTitleDeleted(chartRoot, false, getLocalName2);
109301
+ return true;
109302
+ }
108900
109303
  const txKey = findKey7(titleNode, "tx", getLocalName2);
108901
109304
  if (txKey) {
108902
109305
  titleNode[txKey] = buildTitleTextFromRuns(prefix, runs);
@@ -108920,6 +109323,7 @@ var init_chart_title_serializer = __esm({
108920
109323
  "pptx/core/utils/chart-title-serializer.ts"() {
108921
109324
  init_chart_title_node_builder();
108922
109325
  init_chart_title_run_alignment();
109326
+ init_chart_title_text_edit();
108923
109327
  init_chart_title_xml_ops();
108924
109328
  }
108925
109329
  });
@@ -109081,131 +109485,6 @@ var init_chart_title_style_serializer = __esm({
109081
109485
  };
109082
109486
  }
109083
109487
  });
109084
- function collectChartWorkbookWrite(xmlLookupService, container2, isNumeric2, values) {
109085
- if (!container2) {
109086
- return void 0;
109087
- }
109088
- const refNode = xmlLookupService.getChildByLocalName(container2, isNumeric2 ? "numRef" : "strRef");
109089
- const formula = refNode ? xmlLookupService.getScalarChildByLocalName(refNode, "f") : void 0;
109090
- return formula ? { formula, isNumeric: isNumeric2, values } : void 0;
109091
- }
109092
- function createSpreadsheetXmlParser2() {
109093
- return new fastXmlParser.XMLParser({
109094
- ignoreAttributes: false,
109095
- attributeNamePrefix: "@_",
109096
- trimValues: false,
109097
- tagValueProcessor: (tagName, tagValue) => preservesSpreadsheetXmlWhitespace(tagName) ? tagValue : tagValue.trim()
109098
- });
109099
- }
109100
- function createSpreadsheetXmlBuilder2() {
109101
- return new fastXmlParser.XMLBuilder({
109102
- ignoreAttributes: false,
109103
- attributeNamePrefix: "@_",
109104
- suppressBooleanAttributes: false,
109105
- format: false
109106
- });
109107
- }
109108
- async function resolveWorksheetPathsByName(xlsxZip, parser) {
109109
- const result = /* @__PURE__ */ new Map();
109110
- const workbookFile = xlsxZip.file("xl/workbook.xml");
109111
- const relsFile = xlsxZip.file("xl/_rels/workbook.xml.rels");
109112
- if (!workbookFile || !relsFile) {
109113
- return result;
109114
- }
109115
- try {
109116
- const workbookTree = parser.parse(await workbookFile.async("string"));
109117
- const relsTree = parser.parse(await relsFile.async("string"));
109118
- const targetByRelId = /* @__PURE__ */ new Map();
109119
- const relationships2 = xmlChild(relsTree, "Relationships");
109120
- for (const rel of xmlChildren(relationships2, "Relationship")) {
109121
- const id = xmlAttr(rel, "Id");
109122
- const target = xmlAttr(rel, "Target");
109123
- if (id && target) {
109124
- targetByRelId.set(id, target);
109125
- }
109126
- }
109127
- const workbookRoot = xmlChild(workbookTree, "workbook");
109128
- const sheets = xmlChild(workbookRoot, "sheets");
109129
- for (const sheet of xmlChildren(sheets, "sheet")) {
109130
- const name = xmlAttr(sheet, "name");
109131
- const relId = xmlAttr(sheet, "r:id") ?? xmlAttr(sheet, "id");
109132
- const target = relId ? targetByRelId.get(relId) : void 0;
109133
- if (name && target) {
109134
- result.set(name.toLowerCase(), resolveWorkbookPartPath(target));
109135
- }
109136
- }
109137
- } catch {
109138
- }
109139
- return result;
109140
- }
109141
- function resolveWorkbookPartPath(target) {
109142
- return target.startsWith("/") ? target.slice(1) : `xl/${target}`;
109143
- }
109144
- async function writeChartWorkbookUpdates(xlsxBytes, writes) {
109145
- if (writes.length === 0) {
109146
- return { unresolved: 0 };
109147
- }
109148
- let xlsxZip;
109149
- try {
109150
- xlsxZip = await JSZip3__default.default.loadAsync(xlsxBytes);
109151
- } catch {
109152
- return { unresolved: writes.length };
109153
- }
109154
- const parser = createSpreadsheetXmlParser2();
109155
- const sheetPathByName = await resolveWorksheetPathsByName(xlsxZip, parser);
109156
- const writesBySheetPath = /* @__PURE__ */ new Map();
109157
- let unresolved = 0;
109158
- for (const write of writes) {
109159
- const range = parseChartFormulaRange(write.formula);
109160
- const sheetPath = range ? sheetPathByName.get(range.sheetName.toLowerCase()) : void 0;
109161
- const refs = range ? expandRangeAddresses(range, write.values.length) : void 0;
109162
- if (!range || !sheetPath || !refs) {
109163
- unresolved += 1;
109164
- continue;
109165
- }
109166
- const bucket = writesBySheetPath.get(sheetPath) ?? [];
109167
- bucket.push({ refs, values: write.values, isNumeric: write.isNumeric });
109168
- writesBySheetPath.set(sheetPath, bucket);
109169
- }
109170
- const builder3 = createSpreadsheetXmlBuilder2();
109171
- let changedAny = false;
109172
- for (const [sheetPath, resolvedWrites] of writesBySheetPath) {
109173
- const sheetFile = xlsxZip.file(sheetPath);
109174
- if (!sheetFile) {
109175
- unresolved += resolvedWrites.length;
109176
- continue;
109177
- }
109178
- try {
109179
- const sheetTree = parser.parse(await sheetFile.async("string"));
109180
- const cellWrites = resolvedWrites.flatMap(
109181
- ({ refs, values, isNumeric: isNumeric2 }) => refs.map((ref, i2) => ({ ref, isNumeric: isNumeric2, value: values[i2] }))
109182
- );
109183
- if (applyCellWritesToWorksheet(sheetTree, cellWrites)) {
109184
- xlsxZip.file(sheetPath, builder3.build(sheetTree));
109185
- changedAny = true;
109186
- }
109187
- } catch {
109188
- unresolved += resolvedWrites.length;
109189
- }
109190
- }
109191
- if (!changedAny) {
109192
- return { unresolved };
109193
- }
109194
- const bytes = await xlsxZip.generateAsync({
109195
- type: "uint8array",
109196
- compression: "DEFLATE",
109197
- compressionOptions: { level: 6 }
109198
- });
109199
- return { bytes, unresolved };
109200
- }
109201
- var init_chart_xlsx_writer = __esm({
109202
- "pptx/core/utils/chart-xlsx-writer.ts"() {
109203
- init_chart_xlsx_cellref();
109204
- init_chart_xlsx_sheet_cells();
109205
- init_xml_access();
109206
- init_xml_whitespace();
109207
- }
109208
- });
109209
109488
 
109210
109489
  // pptx/core/core/runtime/chart-cx-update-data.ts
109211
109490
  function findKey31(node, localName28, getLocalName2) {
@@ -109541,13 +109820,19 @@ var init_chart_cx_update = __esm({
109541
109820
  });
109542
109821
 
109543
109822
  // pptx/core/core/runtime/chart-external-workbook-save.ts
109544
- async function saveChartExternalWorkbookUpdates(deps, chartPartPath, slidePath, externalData, writes) {
109823
+ async function saveChartExternalWorkbookUpdates(deps, chartPartPath, slidePath, externalData, writes, atomic = false) {
109824
+ if (atomic && externalData && (!externalData.targetPath || externalData.isExternal)) {
109825
+ throw new Error("Chart label replacement cannot update an external or missing workbook.");
109826
+ }
109545
109827
  if (writes.length === 0 || !externalData?.targetPath) {
109546
- return;
109828
+ return writes.length === 0;
109547
109829
  }
109548
109830
  const embeddingPath = deps.resolveImagePath(chartPartPath, externalData.targetPath);
109549
109831
  const looksEmbedded = embeddingPath.includes("embeddings/") && /\.xlsx$/iu.test(embeddingPath);
109550
- if (!looksEmbedded) {
109832
+ if (!looksEmbedded || externalData.isExternal) {
109833
+ if (atomic) {
109834
+ throw new Error("Chart label replacement requires an embedded .xlsx workbook.");
109835
+ }
109551
109836
  deps.reportWarning({
109552
109837
  code: "CHART_EXTERNAL_DATA_WRITEBACK_UNSUPPORTED",
109553
109838
  message: "Chart data changes were saved to the cached values only: the linked data source is external or not an embedded .xlsx workbook, so it was not updated.",
@@ -109556,10 +109841,13 @@ async function saveChartExternalWorkbookUpdates(deps, chartPartPath, slidePath,
109556
109841
  slideId: slidePath,
109557
109842
  xmlPath: chartPartPath
109558
109843
  });
109559
- return;
109844
+ return false;
109560
109845
  }
109561
109846
  const xlsxFile = deps.zip.file(embeddingPath);
109562
109847
  if (!xlsxFile) {
109848
+ if (atomic) {
109849
+ throw new Error("Chart label replacement workbook is missing.");
109850
+ }
109563
109851
  deps.reportWarning({
109564
109852
  code: "CHART_EMBEDDED_WORKBOOK_MISSING",
109565
109853
  message: "Chart data changes were saved to the cached values only: the referenced embedded workbook was not found in the package.",
@@ -109568,12 +109856,15 @@ async function saveChartExternalWorkbookUpdates(deps, chartPartPath, slidePath,
109568
109856
  slideId: slidePath,
109569
109857
  xmlPath: embeddingPath
109570
109858
  });
109571
- return;
109859
+ return false;
109572
109860
  }
109573
109861
  let xlsxBytes;
109574
109862
  try {
109575
109863
  xlsxBytes = await xlsxFile.async("uint8array");
109576
109864
  } catch {
109865
+ if (atomic) {
109866
+ throw new Error("Chart label replacement workbook cannot be read.");
109867
+ }
109577
109868
  deps.reportWarning({
109578
109869
  code: "CHART_EMBEDDED_WORKBOOK_UNREADABLE",
109579
109870
  message: "Chart data changes were saved to the cached values only: the referenced embedded workbook could not be read.",
@@ -109582,9 +109873,9 @@ async function saveChartExternalWorkbookUpdates(deps, chartPartPath, slidePath,
109582
109873
  slideId: slidePath,
109583
109874
  xmlPath: embeddingPath
109584
109875
  });
109585
- return;
109876
+ return false;
109586
109877
  }
109587
- const result = await writeChartWorkbookUpdates(xlsxBytes, writes);
109878
+ const result = await writeChartWorkbookUpdates(xlsxBytes, writes, { atomic });
109588
109879
  if (result.bytes) {
109589
109880
  deps.zip.file(embeddingPath, result.bytes);
109590
109881
  }
@@ -109598,6 +109889,7 @@ async function saveChartExternalWorkbookUpdates(deps, chartPartPath, slidePath,
109598
109889
  xmlPath: embeddingPath
109599
109890
  });
109600
109891
  }
109892
+ return result.unresolved === 0;
109601
109893
  }
109602
109894
  var init_chart_external_workbook_save = __esm({
109603
109895
  "pptx/core/core/runtime/chart-external-workbook-save.ts"() {
@@ -113052,7 +113344,7 @@ var init_PptxHandlerRuntimeState = __esm({
113052
113344
  */
113053
113345
  savedSlideFingerprints = /* @__PURE__ */ new Map();
113054
113346
  /**
113055
- * `chartData` exactly as it stood right after `enrichChartData` parsed it,
113347
+ * `chartData` as parsed or last serialized into the current ZIP,
113056
113348
  * serialized to JSON and keyed by `chartPartPath`. The save pipeline used
113057
113349
  * to re-serialize EVERY chart part on any slide rewrite regardless of
113058
113350
  * whether the chart itself was touched, which materializes the load-time
@@ -113065,6 +113357,10 @@ var init_PptxHandlerRuntimeState = __esm({
113065
113357
  * untouched chart part pass through byte-for-byte instead.
113066
113358
  */
113067
113359
  chartDataBaselines = /* @__PURE__ */ new Map();
113360
+ /** Pending chart requests also retain warned workbook writes for later retry. */
113361
+ pendingChartUpdates;
113362
+ /** Last fully reconciled workbook data plus whether a write-back needs retry. */
113363
+ chartWorkbookDataBaselines = /* @__PURE__ */ new Map();
113068
113364
  /** Per-slide relationship maps: slide path -> (rId -> target path). */
113069
113365
  slideRelsMap = /* @__PURE__ */ new Map();
113070
113366
  /** Tracks relationship IDs with TargetMode="External" per slide/part path. */
@@ -121073,6 +121369,7 @@ var init_table_tblpr_save = __esm({
121073
121369
  var CHART_DATA_DISPLAY_OPTIONS_EXT_URI, PptxHandlerRuntime24;
121074
121370
  var init_PptxHandlerRuntimeSaveDataSerialization = __esm({
121075
121371
  "pptx/core/core/runtime/PptxHandlerRuntimeSaveDataSerialization.ts"() {
121372
+ init_chart_workbook_data_signature();
121076
121373
  init_chart_axis_dispunits_serializer();
121077
121374
  init_chart_axis_gridlines_serializer();
121078
121375
  init_chart_axis_label_formatting();
@@ -121210,8 +121507,6 @@ var init_PptxHandlerRuntimeSaveDataSerialization = __esm({
121210
121507
  console.warn("Failed to serialize table data:", e);
121211
121508
  }
121212
121509
  }
121213
- /** Pending chart data updates to process in the async save method. */
121214
- pendingChartUpdates;
121215
121510
  /**
121216
121511
  * Record `chartData` as parsed, straight off `enrichChartData`, as this
121217
121512
  * chart's load-time baseline. See {@link chartDataBaselines}.
@@ -121221,6 +121516,10 @@ var init_PptxHandlerRuntimeSaveDataSerialization = __esm({
121221
121516
  return;
121222
121517
  }
121223
121518
  this.chartDataBaselines.set(chartData.chartPartPath, JSON.stringify(chartData));
121519
+ this.chartWorkbookDataBaselines.set(chartData.chartPartPath, {
121520
+ signature: chartWorkbookDataSignature(chartData),
121521
+ pending: false
121522
+ });
121224
121523
  }
121225
121524
  /**
121226
121525
  * Collect chart data for deferred async processing during save.
@@ -121237,12 +121536,28 @@ var init_PptxHandlerRuntimeSaveDataSerialization = __esm({
121237
121536
  /**
121238
121537
  * Process all pending chart data updates (called from the async save method).
121239
121538
  */
121240
- async processPendingChartUpdates() {
121539
+ async processPendingChartUpdates(slides) {
121241
121540
  if (!this.pendingChartUpdates || this.pendingChartUpdates.length === 0) {
121242
121541
  return;
121243
121542
  }
121543
+ if (slides) {
121544
+ const current = /* @__PURE__ */ new Map();
121545
+ const visit = (elements3, slidePath) => {
121546
+ for (const element of elements3) {
121547
+ if (element.type === "group") visit(element.children, slidePath);
121548
+ else if (element.type === "chart" && element.chartData?.chartPartPath) {
121549
+ current.set(element.chartData.chartPartPath, {
121550
+ chartData: element.chartData,
121551
+ slidePath
121552
+ });
121553
+ }
121554
+ }
121555
+ };
121556
+ for (const slide of slides) visit(slide.elements, slide.id);
121557
+ this.pendingChartUpdates = [...current.values()];
121558
+ }
121244
121559
  for (const { chartData, slidePath } of this.pendingChartUpdates) {
121245
- if (chartData.chartPartPath && this.chartDataBaselines.get(chartData.chartPartPath) === JSON.stringify(chartData)) {
121560
+ if (chartData.chartPartPath && !this.chartWorkbookDataBaselines.get(chartData.chartPartPath)?.pending && this.chartDataBaselines.get(chartData.chartPartPath) === JSON.stringify(chartData)) {
121246
121561
  continue;
121247
121562
  }
121248
121563
  if (chartData.colorPalette && chartData.colorStylePartPath) {
@@ -121661,7 +121976,9 @@ var init_PptxHandlerRuntimeSaveDataSerialization = __esm({
121661
121976
  {
121662
121977
  title: chartData.title,
121663
121978
  hasTitle: chartData.style?.hasTitle,
121664
- titleRuns: chartData.titleRuns
121979
+ titleRuns: chartData.titleRuns,
121980
+ titleTextOnly: chartData.titleTextOnly,
121981
+ titleTextOnlyStyles: chartData.titleTextOnlyStyles
121665
121982
  },
121666
121983
  (key2) => this.compatibilityService.getXmlLocalName(key2)
121667
121984
  );
@@ -121853,23 +122170,41 @@ var init_PptxHandlerRuntimeSaveDataSerialization = __esm({
121853
122170
  }
121854
122171
  }
121855
122172
  await this.syncChartUserShapesToXml(chartSpace, chartData, chartPartPath);
122173
+ const serializedBaseline = this.chartDataBaselines.get(chartPartPath);
122174
+ const signature = chartWorkbookDataSignature(chartData);
122175
+ const workbookBaseline = this.chartWorkbookDataBaselines.get(chartPartPath);
122176
+ const previousSignature = workbookBaseline?.signature ?? (serializedBaseline ? chartWorkbookDataSignature(JSON.parse(serializedBaseline)) : void 0);
122177
+ const workbookDataChanged = workbookBaseline?.pending || signature !== previousSignature;
122178
+ if (workbookDataChanged) {
122179
+ const complete = await saveChartExternalWorkbookUpdates(
122180
+ {
122181
+ zip: this.zip,
122182
+ resolveImagePath: (basePath, target) => this.resolveImagePath(basePath, target),
122183
+ reportWarning: (warning) => this.compatibilityService.reportWarning(warning)
122184
+ },
122185
+ chartPartPath,
122186
+ slidePath,
122187
+ chartData.externalData,
122188
+ workbookWrites,
122189
+ chartData.dataLabelTextOnly ?? false
122190
+ );
122191
+ this.chartWorkbookDataBaselines.set(chartPartPath, {
122192
+ signature: complete ? signature : previousSignature ?? signature,
122193
+ pending: !complete
122194
+ });
122195
+ }
121856
122196
  this.zip.file(chartPartPath, this.builder.build(chartXmlData));
121857
- await saveChartExternalWorkbookUpdates(
121858
- {
121859
- zip: this.zip,
121860
- resolveImagePath: (basePath, target) => this.resolveImagePath(basePath, target),
121861
- reportWarning: (warning) => this.compatibilityService.reportWarning(warning)
121862
- },
121863
- chartPartPath,
121864
- slidePath,
121865
- chartData.externalData,
121866
- workbookWrites
121867
- );
122197
+ this.chartDataBaselines.set(chartPartPath, JSON.stringify(chartData));
121868
122198
  } catch (e) {
122199
+ if (chartData.dataLabelTextOnly) {
122200
+ throw e;
122201
+ }
121869
122202
  console.warn(`[pptx-save] Failed to serialize chart data for ${chartPartPath}:`, e);
121870
122203
  }
121871
122204
  }
121872
- this.pendingChartUpdates = void 0;
122205
+ this.pendingChartUpdates = this.pendingChartUpdates.filter(
122206
+ ({ chartData }) => chartData.chartPartPath && this.chartWorkbookDataBaselines.get(chartData.chartPartPath)?.pending
122207
+ );
121873
122208
  }
121874
122209
  /**
121875
122210
  * Route a chart save that the 2006 `c:*Chart` update loop cannot handle:
@@ -130073,22 +130408,44 @@ function drawingNamespace(strict) {
130073
130408
  var NOTES_MASTER_CONTENT_TYPE, PptxHandlerRuntime50;
130074
130409
  var init_PptxHandlerRuntimeSaveNotesInfrastructure = __esm({
130075
130410
  "pptx/core/core/runtime/PptxHandlerRuntimeSaveNotesInfrastructure.ts"() {
130411
+ init_relationships();
130076
130412
  init_PptxHandlerRuntimeSaveViewProperties();
130077
130413
  NOTES_MASTER_CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.presentationml.notesMaster+xml";
130078
130414
  PptxHandlerRuntime50 = class extends PptxHandlerRuntime49 {
130079
130415
  /** Ensure authored notes have the global notes-master OPC infrastructure. */
130080
130416
  async ensureNotesMasterForAuthoredNotes(slides, constants) {
130081
130417
  const needsNotes = slides.some(
130082
- (slide) => slide.notes !== void 0 || Boolean(slide.notesSegments?.length)
130418
+ (slide) => Boolean(slide.notes) || Boolean(slide.notesSegments?.some((segment) => segment.text))
130083
130419
  );
130084
130420
  if (!needsNotes || Object.keys(this.zip.files).some(
130085
130421
  (path2) => /^ppt\/notesMasters\/notesMaster\d+\.xml$/u.test(path2)
130086
130422
  )) {
130087
130423
  return;
130088
130424
  }
130425
+ const relsPath2 = "ppt/_rels/presentation.xml.rels";
130426
+ const relsXml = await this.zip.file(relsPath2)?.async("string");
130427
+ if (!relsXml || !this.presentationData) return;
130428
+ if (Array.from(parseRelationships(relsXml).values()).some(
130429
+ (relationship) => relationship.type.endsWith("/notesMaster") && relationship.mode !== "External" && this.zip.file(resolvePartPath("ppt/presentation.xml", relationship.target))
130430
+ ))
130431
+ return;
130089
130432
  const strict = constants.conformance === "strict";
130090
130433
  const masterPath = "ppt/notesMasters/notesMaster1.xml";
130091
- const themePath = Object.keys(this.zip.files).find((path2) => /^ppt\/theme\/theme\d+\.xml$/u.test(path2)) ?? "ppt/theme/theme1.xml";
130434
+ const sourceThemePath = Object.keys(this.zip.files).find((path2) => /^ppt\/theme\/theme\d+\.xml$/u.test(path2)) ?? "ppt/theme/theme1.xml";
130435
+ let themeIndex = 1;
130436
+ while (this.zip.file(`ppt/theme/theme${themeIndex}.xml`)) themeIndex += 1;
130437
+ const themePath = `ppt/theme/theme${themeIndex}.xml`;
130438
+ const themeBytes = await this.zip.file(sourceThemePath)?.async("uint8array");
130439
+ const theme = themeBytes ?? this.buildThemeXml(themePath, void 0);
130440
+ if (!theme) throw new Error("Cannot create a notes theme from the presentation state");
130441
+ this.zip.file(themePath, theme);
130442
+ const themeRelationships = await this.zip.file(`ppt/theme/_rels/${sourceThemePath.slice(sourceThemePath.lastIndexOf("/") + 1)}.rels`)?.async("uint8array");
130443
+ if (themeRelationships)
130444
+ this.zip.file(`ppt/theme/_rels/theme${themeIndex}.xml.rels`, themeRelationships);
130445
+ await this.addContentTypeOverride(
130446
+ `/${themePath}`,
130447
+ "application/vnd.openxmlformats-officedocument.theme+xml"
130448
+ );
130092
130449
  this.zip.file(masterPath, this.builder.build(this.buildDefaultNotesMaster(strict)));
130093
130450
  this.zip.file(
130094
130451
  "ppt/notesMasters/_rels/notesMaster1.xml.rels",
@@ -130103,11 +130460,6 @@ var init_PptxHandlerRuntimeSaveNotesInfrastructure = __esm({
130103
130460
  }
130104
130461
  })
130105
130462
  );
130106
- const relsPath2 = "ppt/_rels/presentation.xml.rels";
130107
- const relsXml = await this.zip.file(relsPath2)?.async("string");
130108
- if (!relsXml || !this.presentationData) {
130109
- return;
130110
- }
130111
130463
  const relsData = this.parser.parse(relsXml);
130112
130464
  const relsRoot = relsData["Relationships"] ?? {};
130113
130465
  const relationships2 = asArray7(relsRoot["Relationship"]);
@@ -130842,7 +131194,7 @@ var init_PptxHandlerRuntimeSavePipeline = __esm({
130842
131194
  saveSession,
130843
131195
  saveConstants
130844
131196
  );
130845
- await this.processPendingChartUpdates();
131197
+ await this.processPendingChartUpdates(slides);
130846
131198
  await this.ensureChartPartContentTypes();
130847
131199
  await this.ensureOleEmbeddingContentTypes();
130848
131200
  await this.processPendingOleContentUpdates();
@@ -140853,6 +141205,7 @@ var init_PptxHandlerRuntimeChartExternalData = __esm({
140853
141205
  );
140854
141206
  const autoUpdateAttr = externalDataNode["@_autoUpdate"];
140855
141207
  const autoUpdate = autoUpdateNode?.["@_val"] === "1" || autoUpdateNode?.["@_val"] === "true" || autoUpdateAttr === "1" || autoUpdateAttr === "true" || false;
141208
+ let isExternal = false;
140856
141209
  let targetPath;
140857
141210
  try {
140858
141211
  const chartDir = chartPartPath.substring(0, chartPartPath.lastIndexOf("/") + 1);
@@ -140867,6 +141220,7 @@ var init_PptxHandlerRuntimeChartExternalData = __esm({
140867
141220
  for (const rel of rels) {
140868
141221
  if (String(rel?.["@_Id"] || "") === relId) {
140869
141222
  targetPath = String(rel?.["@_Target"] || "").trim() || void 0;
141223
+ isExternal = String(rel?.["@_TargetMode"] || "") === "External";
140870
141224
  break;
140871
141225
  }
140872
141226
  }
@@ -140875,7 +141229,7 @@ var init_PptxHandlerRuntimeChartExternalData = __esm({
140875
141229
  } catch {
140876
141230
  }
140877
141231
  let embeddedWorkbookData;
140878
- if (targetPath) {
141232
+ if (targetPath && !isExternal) {
140879
141233
  try {
140880
141234
  const embeddingPath = this.resolveImagePath(chartPartPath, targetPath);
140881
141235
  if (embeddingPath.includes("embeddings/") && embeddingPath.endsWith(".xlsx")) {
@@ -140889,6 +141243,7 @@ var init_PptxHandlerRuntimeChartExternalData = __esm({
140889
141243
  }
140890
141244
  return {
140891
141245
  relId,
141246
+ ...isExternal ? { isExternal: true } : {},
140892
141247
  targetPath,
140893
141248
  autoUpdate,
140894
141249
  ...embeddedWorkbookData ? { embeddedWorkbookData } : {}
@@ -141259,6 +141614,8 @@ var init_PptxHandlerRuntimeChartExParsing = __esm({
141259
141614
  ...result.categoryLevels ? { categoryLevels: result.categoryLevels } : {},
141260
141615
  series: result.series,
141261
141616
  title: cxTitleText,
141617
+ titleTextEditable: false,
141618
+ dataLabelTextEditable: false,
141262
141619
  style: chartStyle2,
141263
141620
  chartPartPath,
141264
141621
  chartRelationshipId,
@@ -141282,6 +141639,7 @@ var init_PptxHandlerRuntimeChartExParsing = __esm({
141282
141639
  var PptxHandlerRuntime95;
141283
141640
  var init_PptxHandlerRuntimeChartParsing = __esm({
141284
141641
  "pptx/core/core/runtime/PptxHandlerRuntimeChartParsing.ts"() {
141642
+ init_chart_label_source();
141285
141643
  init_chart_advanced_parser();
141286
141644
  init_chart_axis_parser();
141287
141645
  init_chart_band_fmts();
@@ -141472,12 +141830,34 @@ var init_PptxHandlerRuntimeChartParsing = __esm({
141472
141830
  colorAdapter
141473
141831
  );
141474
141832
  const style = chartStyleFromNeutral(neutral, this.extractChartStyle(chartSpace, chartRoot));
141833
+ const titleTx = reader2.xml.getChildByLocalName(
141834
+ reader2.xml.getChildByLocalName(chartRoot, "title"),
141835
+ "tx"
141836
+ );
141837
+ const titleRich = reader2.xml.getChildByLocalName(titleTx, "rich");
141838
+ const titleParagraphs = reader2.xml.getChildrenArrayByLocalName(titleRich, "p");
141839
+ const titleTextEditable = Boolean(
141840
+ titleRuns?.length && titleParagraphs.length === 1 && !Object.keys(titleParagraphs[0] ?? {}).some(
141841
+ (key2) => ["br", "fld"].includes(reader2.localName(key2))
141842
+ )
141843
+ );
141475
141844
  const groupOptions = groupOptionsFromNeutral(groups[0]?.group, chartType);
141476
141845
  const linesAndChrome = this.readChartLinesAndChrome(neutral, tree, groups, reader2);
141477
141846
  const facts = await this.readChartPartFacts(chartSpace, chartRoot, chartPartPath);
141478
141847
  const workbook = facts.embeddedWorkbookData;
141479
141848
  const dateCategories = rawDateCategories ? { ...rawDateCategories, date1904: neutral.date1904 ?? workbook?.date1904 ?? false } : void 0;
141480
141849
  const filled = applyEmbeddedWorkbookFallback(chartType, categories, built.series, workbook);
141850
+ const dataLabelTextEditable = !categoryLevels && !dateCategories && await chartLabelsHaveEditableSources(
141851
+ reader2.xml,
141852
+ this.zip,
141853
+ chartSpace,
141854
+ built.seriesNodes,
141855
+ filled.series,
141856
+ filled.categories,
141857
+ facts.externalData,
141858
+ chartPartPath,
141859
+ this.resolveImagePath.bind(this)
141860
+ );
141481
141861
  const hasPicture = filled.series.some(
141482
141862
  (entry2) => entry2.picture || entry2.impliedPicture || entry2.dataPoints?.some((point2) => point2.picture || point2.impliedPicture)
141483
141863
  );
@@ -141510,6 +141890,14 @@ var init_PptxHandlerRuntimeChartParsing = __esm({
141510
141890
  ...built.filtered,
141511
141891
  title: neutralTitleText(neutral.title),
141512
141892
  ...titleRuns ? { titleRuns } : {},
141893
+ titleTextEditable,
141894
+ dataLabelTextEditable,
141895
+ ...dataLabelTextEditable ? {
141896
+ dataLabelSourceShape: {
141897
+ categoryCount: filled.categories.length,
141898
+ seriesValueCounts: filled.series.map((series) => series.values.length)
141899
+ }
141900
+ } : {},
141513
141901
  style,
141514
141902
  grouping: groupOptions.grouping,
141515
141903
  ...groupOptions,
@@ -142007,6 +142395,8 @@ var init_PptxHandlerRuntimeLoadSession = __esm({
142007
142395
  this.slideMap.clear();
142008
142396
  this.savedSlideFingerprints.clear();
142009
142397
  this.chartDataBaselines.clear();
142398
+ this.chartWorkbookDataBaselines.clear();
142399
+ this.pendingChartUpdates = void 0;
142010
142400
  this.layoutCache.clear();
142011
142401
  this.masterCache.clear();
142012
142402
  this.templateElementBaselines.reset();
@@ -142496,6 +142886,8 @@ var init_PptxHandlerRuntimeLoadPipeline = __esm({
142496
142886
  this.slideMap.clear();
142497
142887
  this.savedSlideFingerprints.clear();
142498
142888
  this.chartDataBaselines.clear();
142889
+ this.chartWorkbookDataBaselines.clear();
142890
+ this.pendingChartUpdates = void 0;
142499
142891
  this.slideRelsMap.clear();
142500
142892
  this.externalRelsMap.clear();
142501
142893
  this.layoutCache.clear();
@@ -146841,11 +147233,16 @@ function duplicateSlide(slide, newSlideNumber) {
146841
147233
  cloned.elements = cloned.elements.map(reassignElementId);
146842
147234
  if (cloned.animations && cloned.animations.length > 0) {
146843
147235
  const idMap = /* @__PURE__ */ new Map();
146844
- slide.elements.forEach((originalEl, idx) => {
146845
- if (idx < cloned.elements.length) {
146846
- idMap.set(originalEl.id, cloned.elements[idx].id);
146847
- }
146848
- });
147236
+ const mapElements = (originals, copies) => {
147237
+ originals.forEach((original, index) => {
147238
+ const copy = copies[index];
147239
+ if (!copy) return;
147240
+ idMap.set(original.id, copy.id);
147241
+ if (original.type === "group" && copy.type === "group")
147242
+ mapElements(original.children, copy.children);
147243
+ });
147244
+ };
147245
+ mapElements(slide.elements, cloned.elements);
146849
147246
  cloned.animations = cloned.animations.map((anim) => ({
146850
147247
  ...anim,
146851
147248
  elementId: idMap.get(anim.elementId) ?? anim.elementId
@@ -149680,15 +150077,26 @@ init_font_substitution();
149680
150077
  var DEFAULT_FONT_SIZE = 18;
149681
150078
  var FALLBACK_PAD_FACTOR = 0.06;
149682
150079
  function drawTextSegments(ctx, segments, bodyStyle, w, h2, scaleFactor = 1) {
149683
- const padL = bodyStyle?.bodyInsetLeft ? bodyStyle.bodyInsetLeft * scaleFactor : Math.round(w * FALLBACK_PAD_FACTOR);
149684
- const padR = bodyStyle?.bodyInsetRight ? bodyStyle.bodyInsetRight * scaleFactor : Math.round(w * FALLBACK_PAD_FACTOR);
149685
- const padT = bodyStyle?.bodyInsetTop ? bodyStyle.bodyInsetTop * scaleFactor : Math.round(h2 * FALLBACK_PAD_FACTOR);
149686
- const padB = bodyStyle?.bodyInsetBottom ? bodyStyle.bodyInsetBottom * scaleFactor : Math.round(h2 * FALLBACK_PAD_FACTOR);
150080
+ const padL = bodyStyle?.bodyInsetLeft !== void 0 ? bodyStyle.bodyInsetLeft * scaleFactor : Math.round(w * FALLBACK_PAD_FACTOR);
150081
+ const padR = bodyStyle?.bodyInsetRight !== void 0 ? bodyStyle.bodyInsetRight * scaleFactor : Math.round(w * FALLBACK_PAD_FACTOR);
150082
+ const padT = bodyStyle?.bodyInsetTop !== void 0 ? bodyStyle.bodyInsetTop * scaleFactor : Math.round(h2 * FALLBACK_PAD_FACTOR);
150083
+ const padB = bodyStyle?.bodyInsetBottom !== void 0 ? bodyStyle.bodyInsetBottom * scaleFactor : Math.round(h2 * FALLBACK_PAD_FACTOR);
149687
150084
  const maxWidth = w - padL - padR;
149688
150085
  if (maxWidth <= 0) {
149689
150086
  return;
149690
150087
  }
149691
- const paragraphs = splitIntoParagraphs(segments);
150088
+ const paragraphs = splitIntoParagraphs(
150089
+ segments.map((segment) => ({
150090
+ ...segment,
150091
+ style: {
150092
+ ...bodyStyle,
150093
+ ...Object.fromEntries(
150094
+ Object.entries(segment.style).filter(([, value]) => value !== void 0)
150095
+ )
150096
+ }
150097
+ })),
150098
+ bodyStyle
150099
+ );
149692
150100
  const lines = layoutParagraphs(ctx, paragraphs, maxWidth, scaleFactor);
149693
150101
  if (lines.length === 0) {
149694
150102
  return;
@@ -149724,33 +150132,58 @@ function drawTextSegments(ctx, segments, bodyStyle, w, h2, scaleFactor = 1) {
149724
150132
  y += line2.height * 0.3;
149725
150133
  }
149726
150134
  }
149727
- function splitIntoParagraphs(segments) {
149728
- const paragraphs = [[]];
150135
+ function splitIntoParagraphs(segments, bodyStyle) {
150136
+ const paragraphs = [{ segments: [], style: bodyStyle ?? {} }];
149729
150137
  for (const seg of segments) {
149730
- if (seg.isParagraphBreak) {
149731
- paragraphs.push([]);
149732
- } else if (seg.text) {
149733
- paragraphs[paragraphs.length - 1].push(seg);
150138
+ if (seg.isParagraphBreak || seg.text === "\n" && !seg.isLineBreak) {
150139
+ paragraphs.push({ segments: [], style: seg.style });
150140
+ } else if (seg.text || seg.isLineBreak) {
150141
+ paragraphs[paragraphs.length - 1].segments.push(seg);
149734
150142
  }
149735
150143
  }
149736
- return paragraphs.filter((p) => p.length > 0);
150144
+ return paragraphs;
149737
150145
  }
149738
150146
  function layoutParagraphs(ctx, paragraphs, maxWidth, scaleFactor) {
149739
150147
  const lines = [];
149740
- for (const para of paragraphs) {
149741
- const paraAlign = para[0]?.style?.align;
150148
+ for (const paragraph of paragraphs) {
150149
+ const para = paragraph.segments;
150150
+ const paraAlign = para[0]?.style.align ?? paragraph.style.align;
149742
150151
  let currentLine = [];
149743
150152
  let lineWidth = 0;
149744
150153
  let lineHeight = 0;
150154
+ let fallbackHeight = (para[0]?.style.fontSize ?? paragraph.style.fontSize ?? DEFAULT_FONT_SIZE) * scaleFactor * 1.2;
150155
+ const flushLine = () => {
150156
+ while (currentLine.length > 0 && /^\s+$/.test(currentLine[currentLine.length - 1].text)) {
150157
+ lineWidth -= currentLine.pop().measuredWidth;
150158
+ }
150159
+ lines.push({
150160
+ runs: currentLine,
150161
+ width: lineWidth,
150162
+ height: lineHeight || fallbackHeight,
150163
+ align: paraAlign
150164
+ });
150165
+ currentLine = [];
150166
+ lineWidth = 0;
150167
+ lineHeight = 0;
150168
+ };
149745
150169
  for (const seg of para) {
149746
150170
  ctx.font = buildFont(seg.style, scaleFactor);
149747
150171
  const fontSize = (seg.style.fontSize ?? DEFAULT_FONT_SIZE) * scaleFactor;
149748
150172
  const segHeight = fontSize * 1.2;
149749
- const tokens = seg.text.split(/(?<=\s)(?=\S)|(?<=\S)(?=\s)/);
150173
+ fallbackHeight = segHeight;
150174
+ if (seg.isLineBreak) {
150175
+ flushLine();
150176
+ continue;
150177
+ }
150178
+ const tokens = seg.text.split(/(\r\n|\r|\n)|(?<=\s)(?=\S)|(?<=\S)(?=\s)/);
149750
150179
  for (const raw of tokens) {
149751
150180
  if (!raw) {
149752
150181
  continue;
149753
150182
  }
150183
+ if (/^(\r\n|\r|\n)$/.test(raw)) {
150184
+ flushLine();
150185
+ continue;
150186
+ }
149754
150187
  if (/^\s+$/.test(raw)) {
149755
150188
  if (currentLine.length > 0) {
149756
150189
  const spaceW = ctx.measureText(raw).width;
@@ -149766,19 +150199,7 @@ function layoutParagraphs(ctx, paragraphs, maxWidth, scaleFactor) {
149766
150199
  const word = raw;
149767
150200
  const wordW = ctx.measureText(word).width;
149768
150201
  if (lineWidth + wordW > maxWidth && currentLine.length > 0) {
149769
- while (currentLine.length > 0 && /^\s+$/.test(currentLine[currentLine.length - 1].text)) {
149770
- const removed = currentLine.pop();
149771
- lineWidth -= removed.measuredWidth;
149772
- }
149773
- lines.push({
149774
- runs: currentLine,
149775
- width: lineWidth,
149776
- height: lineHeight,
149777
- align: paraAlign
149778
- });
149779
- currentLine = [];
149780
- lineWidth = 0;
149781
- lineHeight = 0;
150202
+ flushLine();
149782
150203
  }
149783
150204
  currentLine.push({
149784
150205
  text: word,
@@ -149789,14 +150210,7 @@ function layoutParagraphs(ctx, paragraphs, maxWidth, scaleFactor) {
149789
150210
  lineHeight = Math.max(lineHeight, segHeight);
149790
150211
  }
149791
150212
  }
149792
- if (currentLine.length > 0) {
149793
- lines.push({
149794
- runs: currentLine,
149795
- width: lineWidth,
149796
- height: lineHeight,
149797
- align: paraAlign
149798
- });
149799
- }
150213
+ flushLine();
149800
150214
  }
149801
150215
  return lines;
149802
150216
  }