ooxml-core 1.8.4 → 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 (306) 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 +6652 -4002
  5. package/dist/automation/index.mjs +6652 -4002
  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 +593 -34
  129. package/dist/teams/index.mjs +593 -34
  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 +3159 -1164
  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 +3140 -1165
  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 +7784 -6976
  257. package/dist/xlsx/load/index.mjs +7784 -6976
  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 +2001 -288
  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 +2001 -289
  297. package/dist/xlsx/write/page-setup.d.ts.map +1 -1
  298. package/dist/xlsx/write/save.d.ts.map +1 -1
  299. package/dist/xlsx/write/sheet-parts.d.ts +1 -0
  300. package/dist/xlsx/write/sheet-parts.d.ts.map +1 -1
  301. package/dist/xlsx/write/workbook-part.d.ts +1 -1
  302. package/dist/xlsx/write/workbook-part.d.ts.map +1 -1
  303. package/dist/xlsx/write/worksheet.d.ts.map +1 -1
  304. package/package.json +1 -1
  305. package/dist/pptx/chunks/index-Cn-GzYGp.d.ts.map +0 -1
  306. package/dist/pptx/chunks/text-operations-BHfAm5K9.d.ts.map +0 -1
@@ -2,7 +2,7 @@
2
2
  'use strict';
3
3
 
4
4
  var xmldom = require('@xmldom/xmldom');
5
- var JSZip6 = require('jszip');
5
+ var JSZip7 = require('jszip');
6
6
  var fastXmlParser = require('fast-xml-parser');
7
7
  var mtxDecompressor = require('mtx-decompressor');
8
8
  var fs = require('fs');
@@ -28,7 +28,7 @@ function _interopNamespace(e) {
28
28
  return Object.freeze(n);
29
29
  }
30
30
 
31
- var JSZip6__default = /*#__PURE__*/_interopDefault(JSZip6);
31
+ var JSZip7__default = /*#__PURE__*/_interopDefault(JSZip7);
32
32
  var fs__namespace = /*#__PURE__*/_interopNamespace(fs);
33
33
  var path2__namespace = /*#__PURE__*/_interopNamespace(path2);
34
34
 
@@ -33057,6 +33057,13 @@ function parseContentTypes(xml) {
33057
33057
  }
33058
33058
  return { defaults, overrides };
33059
33059
  }
33060
+ function contentTypeForPart(types, partName) {
33061
+ const overridePath = partName.startsWith("/") ? partName : `/${partName}`;
33062
+ const override = types.overrides.get(overridePath);
33063
+ if (override) return override;
33064
+ const extension = partName.split(".").pop()?.toLowerCase();
33065
+ return extension ? types.defaults.get(extension) : void 0;
33066
+ }
33060
33067
  var init_content_types = __esm({
33061
33068
  "opc/content-types.ts"() {
33062
33069
  init_xml2();
@@ -33096,10 +33103,13 @@ function relativePartTarget(basePart, targetPart) {
33096
33103
  }
33097
33104
  async function clonePartGraph(options) {
33098
33105
  const { zip, sourcePart, targetPart, shouldClone } = options;
33099
- const copies = /* @__PURE__ */ new Map([[sourcePart, targetPart]]);
33100
- const types = parseContentTypes(await zip.file("[Content_Types].xml")?.async("string"));
33106
+ const sourceZip = options.sourceZip ?? zip;
33107
+ const copies = options.copies ?? /* @__PURE__ */ new Map();
33108
+ copies.set(sourcePart, targetPart);
33109
+ const types = parseContentTypes(await sourceZip.file("[Content_Types].xml")?.async("string"));
33101
33110
  const reserved = new Set(Object.keys(zip.files));
33102
33111
  reserved.add(targetPart);
33112
+ for (const target of copies.values()) reserved.add(target);
33103
33113
  const allocate = (source) => {
33104
33114
  const match = /^(?<stem>.*?)(?:\d+)?(?<extension>\.[^/.]+)$/u.exec(source);
33105
33115
  const stem = match?.groups?.stem ?? source;
@@ -33111,9 +33121,9 @@ async function clonePartGraph(options) {
33111
33121
  return path3;
33112
33122
  };
33113
33123
  const copyRelationships = async (source, destination) => {
33114
- const contentType = types.overrides.get(`/${source}`);
33124
+ const contentType = contentTypeForPart(types, source);
33115
33125
  if (contentType) await ensureContentTypeOverride(zip, destination, contentType);
33116
- const xml = await zip.file(relationshipsPartFor(source))?.async("string");
33126
+ const xml = await sourceZip.file(relationshipsPartFor(source))?.async("string");
33117
33127
  if (!xml) return;
33118
33128
  const relationships2 = parseRelationships(xml);
33119
33129
  for (const relationship of relationships2.values()) {
@@ -33121,7 +33131,7 @@ async function clonePartGraph(options) {
33121
33131
  const originalTarget = resolvePartPath(source, relationship.target);
33122
33132
  let newTarget = copies.get(originalTarget);
33123
33133
  if (!newTarget && shouldClone(relationship, originalTarget)) {
33124
- const file = zip.file(originalTarget);
33134
+ const file = sourceZip.file(originalTarget);
33125
33135
  if (!file) throw new Error(`Cannot clone missing package part: ${originalTarget}`);
33126
33136
  newTarget = allocate(originalTarget);
33127
33137
  copies.set(originalTarget, newTarget);
@@ -41789,7 +41799,7 @@ function resolveCellValue(cell, sharedStrings) {
41789
41799
  }
41790
41800
  async function parseEmbeddedXlsx(xlsxData) {
41791
41801
  try {
41792
- const xlsxZip = await JSZip6__default.default.loadAsync(xlsxData);
41802
+ const xlsxZip = await JSZip7__default.default.loadAsync(xlsxData);
41793
41803
  const xmlParser = new fastXmlParser.XMLParser({
41794
41804
  ignoreAttributes: false,
41795
41805
  attributeNamePrefix: "@_",
@@ -53121,7 +53131,7 @@ async function buildBlankPresentationArchive(options) {
53121
53131
  const layoutCount = STANDARD_LAYOUTS.length;
53122
53132
  const initialSlideCount = Math.max(0, options?.initialSlideCount ?? 0);
53123
53133
  const blankLayoutIdx = STANDARD_LAYOUTS.findIndex((l) => l.type === "blank") + 1 || 7;
53124
- const zip = new JSZip6__default.default();
53134
+ const zip = new JSZip7__default.default();
53125
53135
  zip.file("[Content_Types].xml", contentTypesXml(layoutCount, initialSlideCount));
53126
53136
  zip.file("_rels/.rels", rootRelsXml());
53127
53137
  zip.file("ppt/presentation.xml", presentationXml(width, height, initialSlideCount));
@@ -55806,7 +55816,13 @@ var init_PptxSlideNotesPartUpdater = __esm({
55806
55816
  init.slideNotesRelationshipType,
55807
55817
  `../notesSlides/${fileName}`
55808
55818
  );
55809
- init.zip.file(notesPath, init.xmlBuilder.build(this.buildNotesSlide(init.slide, strict)));
55819
+ const notesXmlObject = this.buildNotesSlide(init.slide, strict);
55820
+ init.updateNotesXmlText(
55821
+ notesXmlObject,
55822
+ init.slide.notes ?? init.slide.notesSegments?.map((segment) => segment.text).join("") ?? "",
55823
+ init.slide.notesSegments
55824
+ );
55825
+ init.zip.file(notesPath, init.xmlBuilder.build(notesXmlObject));
55810
55826
  init.zip.file(
55811
55827
  `ppt/notesSlides/_rels/${fileName}.rels`,
55812
55828
  init.xmlBuilder.build({
@@ -88339,6 +88355,341 @@ var init_header_footer_parts = __esm({
88339
88355
  }
88340
88356
  });
88341
88357
 
88358
+ // pptx/core/utils/chart-xlsx-write-validation.ts
88359
+ function unsupported(reason) {
88360
+ throw new Error(`Chart label replacement requires direct literal workbook cells: ${reason}.`);
88361
+ }
88362
+ async function validateAtomicChartWorkbookWrites(zip, parser, paths, writes, requireCurrentValues = false) {
88363
+ const relationships2 = xmlChild(
88364
+ parser.parse(
88365
+ await zip.file("xl/_rels/workbook.xml.rels")?.async("string") ?? ""
88366
+ ),
88367
+ "Relationships"
88368
+ );
88369
+ for (const rel of xmlChildren(relationships2, "Relationship")) {
88370
+ if (xmlAttr(rel, "TargetMode") === "External") {
88371
+ unsupported("external worksheet relationships are not supported");
88372
+ }
88373
+ }
88374
+ const sheets = /* @__PURE__ */ new Map();
88375
+ const cellsByPath = /* @__PURE__ */ new Map();
88376
+ for (const path3 of new Set(paths.values())) {
88377
+ const file = zip.file(path3);
88378
+ if (!file) {
88379
+ unsupported("a referenced worksheet is missing");
88380
+ }
88381
+ let tree;
88382
+ try {
88383
+ tree = parser.parse(await file.async("string"));
88384
+ } catch {
88385
+ unsupported("a worksheet cannot be parsed");
88386
+ }
88387
+ const data = xmlChild(xmlChild(tree, "worksheet"), "sheetData");
88388
+ if (!data) {
88389
+ unsupported("a worksheet has no cell data");
88390
+ }
88391
+ if (Object.keys(data).some((key2) => key2.includes(":"))) {
88392
+ unsupported("prefixed worksheet cell nodes are not supported");
88393
+ }
88394
+ const cells = /* @__PURE__ */ new Map();
88395
+ for (const row of xmlChildren(data, "row")) {
88396
+ if (Object.keys(row).some((key2) => key2.includes(":"))) {
88397
+ unsupported("prefixed worksheet cell nodes are not supported");
88398
+ }
88399
+ for (const cell of xmlChildren(row, "c")) {
88400
+ const ref = xmlAttr(cell, "r");
88401
+ if (!ref || cells.has(ref)) {
88402
+ unsupported("duplicate or unidentified worksheet cells are not supported");
88403
+ }
88404
+ cells.set(ref, cell);
88405
+ if (Object.keys(cell).some((key2) => key2 === "f" || key2.endsWith(":f"))) {
88406
+ unsupported("formula-dependent workbooks are not supported");
88407
+ }
88408
+ }
88409
+ }
88410
+ sheets.set(path3, data);
88411
+ cellsByPath.set(path3, cells);
88412
+ }
88413
+ const sharedFile = zip.file("xl/sharedStrings.xml");
88414
+ const shared = sharedFile ? xmlChildren(
88415
+ xmlChild(parser.parse(await sharedFile.async("string")), "sst"),
88416
+ "si"
88417
+ ) : [];
88418
+ const destinations = /* @__PURE__ */ new Map();
88419
+ for (const write of writes) {
88420
+ const range = parseChartFormulaRange(write.formula);
88421
+ if (!range || /[\[\]:!]/u.test(range.sheetName)) {
88422
+ unsupported("a range is not a direct local reference");
88423
+ }
88424
+ if ([range.start, range.end].some(
88425
+ (cell) => cell.row < 0 || cell.row >= 1048576 || cell.col < 0 || cell.col >= 16384
88426
+ )) {
88427
+ unsupported("a source cell lies outside the worksheet limits");
88428
+ }
88429
+ const addresses = expandRangeAddresses(range, write.values.length);
88430
+ const path3 = paths.get(range.sheetName.toLowerCase());
88431
+ const data = path3 ? sheets.get(path3) : void 0;
88432
+ if (!addresses || !path3 || !data) {
88433
+ unsupported("a source range cannot be resolved");
88434
+ }
88435
+ for (const [index, address] of addresses.entries()) {
88436
+ const value = write.values[index];
88437
+ const key2 = `${path3}!${address}`;
88438
+ const prior = destinations.get(key2);
88439
+ if (prior && (prior.value !== value || prior.numeric !== write.isNumeric)) {
88440
+ unsupported("overlapping source ranges request conflicting values");
88441
+ }
88442
+ destinations.set(key2, { value, numeric: write.isNumeric });
88443
+ const cell = cellsByPath.get(path3)?.get(address);
88444
+ if (!cell) {
88445
+ unsupported("a source cell is missing");
88446
+ }
88447
+ const type = xmlAttr(cell, "t") ?? "n";
88448
+ const text2 = type === "s" ? shared[Number(xmlText(cell.v))] : xmlChild(cell, "is");
88449
+ if (text2 && Object.keys(text2).some((node) => !node.startsWith("@_") && node !== "t" && node !== "#text")) {
88450
+ unsupported("rich worksheet strings require source-workbook editing");
88451
+ }
88452
+ if (requireCurrentValues) {
88453
+ const current = text2 ? xmlText(text2.t) : xmlText(cell.v);
88454
+ const equal = write.isNumeric ? current !== void 0 && Number(current) === Number(value) : current === value;
88455
+ if (!equal) {
88456
+ unsupported("the workbook and chart caches disagree");
88457
+ }
88458
+ }
88459
+ if (write.isNumeric && !Number.isFinite(Number(value))) {
88460
+ unsupported("a numeric cache value is not finite");
88461
+ }
88462
+ if (!["n", "s", "inlineStr", "str"].includes(type)) {
88463
+ unsupported("a source cell has an unsupported value type");
88464
+ }
88465
+ }
88466
+ }
88467
+ }
88468
+ var init_chart_xlsx_write_validation = __esm({
88469
+ "pptx/core/utils/chart-xlsx-write-validation.ts"() {
88470
+ init_chart_xlsx_cellref();
88471
+ init_xml_access();
88472
+ }
88473
+ });
88474
+ function collectChartWorkbookWrite(xmlLookupService, container2, isNumeric2, values) {
88475
+ if (!container2) {
88476
+ return void 0;
88477
+ }
88478
+ const refNode = xmlLookupService.getChildByLocalName(container2, isNumeric2 ? "numRef" : "strRef");
88479
+ const formula = refNode ? xmlLookupService.getScalarChildByLocalName(refNode, "f") : void 0;
88480
+ return formula ? { formula, isNumeric: isNumeric2, values } : void 0;
88481
+ }
88482
+ function createSpreadsheetXmlParser() {
88483
+ return new fastXmlParser.XMLParser({
88484
+ ignoreAttributes: false,
88485
+ attributeNamePrefix: "@_",
88486
+ trimValues: false,
88487
+ parseTagValue: false,
88488
+ tagValueProcessor: (tagName, tagValue) => preservesSpreadsheetXmlWhitespace(tagName) ? tagValue : tagValue.trim()
88489
+ });
88490
+ }
88491
+ function createSpreadsheetXmlBuilder() {
88492
+ return new fastXmlParser.XMLBuilder({
88493
+ ignoreAttributes: false,
88494
+ attributeNamePrefix: "@_",
88495
+ suppressBooleanAttributes: false,
88496
+ format: false
88497
+ });
88498
+ }
88499
+ async function resolveWorksheetPathsByName(xlsxZip, parser) {
88500
+ const result = /* @__PURE__ */ new Map();
88501
+ const workbookFile = xlsxZip.file("xl/workbook.xml");
88502
+ const relsFile = xlsxZip.file("xl/_rels/workbook.xml.rels");
88503
+ if (!workbookFile || !relsFile) {
88504
+ return result;
88505
+ }
88506
+ try {
88507
+ const workbookTree = parser.parse(await workbookFile.async("string"));
88508
+ const relsTree = parser.parse(await relsFile.async("string"));
88509
+ const targetByRelId = /* @__PURE__ */ new Map();
88510
+ const relationships2 = xmlChild(relsTree, "Relationships");
88511
+ for (const rel of xmlChildren(relationships2, "Relationship")) {
88512
+ const id = xmlAttr(rel, "Id");
88513
+ const target = xmlAttr(rel, "Target");
88514
+ if (id && target) {
88515
+ targetByRelId.set(id, target);
88516
+ }
88517
+ }
88518
+ const workbookRoot = xmlChild(workbookTree, "workbook");
88519
+ const sheets = xmlChild(workbookRoot, "sheets");
88520
+ for (const sheet of xmlChildren(sheets, "sheet")) {
88521
+ const name = xmlAttr(sheet, "name");
88522
+ const relId = xmlAttr(sheet, "r:id") ?? xmlAttr(sheet, "id");
88523
+ const target = relId ? targetByRelId.get(relId) : void 0;
88524
+ if (name && target) {
88525
+ result.set(name.toLowerCase(), resolveWorkbookPartPath(target));
88526
+ }
88527
+ }
88528
+ } catch {
88529
+ }
88530
+ return result;
88531
+ }
88532
+ function resolveWorkbookPartPath(target) {
88533
+ return target.startsWith("/") ? target.slice(1) : `xl/${target}`;
88534
+ }
88535
+ async function writeChartWorkbookUpdates(xlsxBytes, writes, options = {}) {
88536
+ if (writes.length === 0) {
88537
+ return { unresolved: 0 };
88538
+ }
88539
+ let xlsxZip;
88540
+ try {
88541
+ xlsxZip = await JSZip7__default.default.loadAsync(xlsxBytes);
88542
+ } catch {
88543
+ if (options.atomic) {
88544
+ throw new Error("Chart label replacement requires a readable embedded workbook.");
88545
+ }
88546
+ return { unresolved: writes.length };
88547
+ }
88548
+ const parser = createSpreadsheetXmlParser();
88549
+ const sheetPathByName = await resolveWorksheetPathsByName(xlsxZip, parser);
88550
+ if (options.atomic) {
88551
+ await validateAtomicChartWorkbookWrites(
88552
+ xlsxZip,
88553
+ parser,
88554
+ sheetPathByName,
88555
+ writes,
88556
+ options.requireCurrentValues ?? false
88557
+ );
88558
+ }
88559
+ const writesBySheetPath = /* @__PURE__ */ new Map();
88560
+ let unresolved = 0;
88561
+ for (const write of writes) {
88562
+ const range = parseChartFormulaRange(write.formula);
88563
+ const sheetPath = range ? sheetPathByName.get(range.sheetName.toLowerCase()) : void 0;
88564
+ const refs = range ? expandRangeAddresses(range, write.values.length) : void 0;
88565
+ if (!range || !sheetPath || !refs) {
88566
+ unresolved += 1;
88567
+ continue;
88568
+ }
88569
+ const bucket = writesBySheetPath.get(sheetPath) ?? [];
88570
+ bucket.push({ refs, values: write.values, isNumeric: write.isNumeric });
88571
+ writesBySheetPath.set(sheetPath, bucket);
88572
+ }
88573
+ const builder3 = createSpreadsheetXmlBuilder();
88574
+ let changedAny = false;
88575
+ for (const [sheetPath, resolvedWrites] of writesBySheetPath) {
88576
+ const sheetFile = xlsxZip.file(sheetPath);
88577
+ if (!sheetFile) {
88578
+ unresolved += resolvedWrites.length;
88579
+ continue;
88580
+ }
88581
+ try {
88582
+ const sheetTree = parser.parse(await sheetFile.async("string"));
88583
+ const cellWrites = resolvedWrites.flatMap(
88584
+ ({ refs, values, isNumeric: isNumeric2 }) => refs.map((ref, i2) => ({ ref, isNumeric: isNumeric2, value: values[i2] }))
88585
+ );
88586
+ if (applyCellWritesToWorksheet(sheetTree, cellWrites)) {
88587
+ xlsxZip.file(sheetPath, builder3.build(sheetTree));
88588
+ changedAny = true;
88589
+ }
88590
+ } catch {
88591
+ unresolved += resolvedWrites.length;
88592
+ }
88593
+ }
88594
+ if (options.atomic && unresolved > 0) {
88595
+ throw new Error("Chart label replacement could not update every source range.");
88596
+ }
88597
+ if (!changedAny) {
88598
+ return { unresolved };
88599
+ }
88600
+ const bytes = await xlsxZip.generateAsync({
88601
+ type: "uint8array",
88602
+ compression: "DEFLATE",
88603
+ compressionOptions: { level: 6 }
88604
+ });
88605
+ return { bytes, unresolved };
88606
+ }
88607
+ var init_chart_xlsx_writer = __esm({
88608
+ "pptx/core/utils/chart-xlsx-writer.ts"() {
88609
+ init_chart_xlsx_cellref();
88610
+ init_chart_xlsx_write_validation();
88611
+ init_chart_xlsx_sheet_cells();
88612
+ init_xml_access();
88613
+ init_xml_whitespace();
88614
+ }
88615
+ });
88616
+ function formulaCount(value) {
88617
+ if (!value || typeof value !== "object") return 0;
88618
+ if (Array.isArray(value)) return value.reduce((total, item) => total + formulaCount(item), 0);
88619
+ return Object.entries(value).reduce(
88620
+ (total, [key2, child30]) => total + (key2 === "f" || key2.endsWith(":f") ? 1 : formulaCount(child30)),
88621
+ 0
88622
+ );
88623
+ }
88624
+ async function chartLabelsHaveEditableSources(xml, zip, chartSpace, seriesNodes, series, categories, external, chartPartPath, resolve2) {
88625
+ if (!chartSpace || seriesNodes.length !== series.length || !categories.length || external?.isExternal)
88626
+ return false;
88627
+ if (formulaCount(chartSpace) !== seriesNodes.reduce((sum, node) => sum + formulaCount(node), 0))
88628
+ return false;
88629
+ const writes = [];
88630
+ const labelOwners = /* @__PURE__ */ new Map();
88631
+ for (const [index, node] of seriesNodes.entries()) {
88632
+ const entry2 = series[index];
88633
+ for (const [name, numeric, values] of [
88634
+ ["tx", false, [entry2.name]],
88635
+ ["cat", false, [...categories]],
88636
+ ["val", true, entry2.values.map(String)]
88637
+ ]) {
88638
+ const container2 = xml.getChildByLocalName(node, name);
88639
+ if (!container2) return false;
88640
+ const write = collectChartWorkbookWrite(xml, container2, numeric, [...values]);
88641
+ if (write) {
88642
+ writes.push(write);
88643
+ if (!numeric) {
88644
+ const range = parseChartFormulaRange(write.formula);
88645
+ const addresses = range ? expandRangeAddresses(range, values.length) : void 0;
88646
+ if (!range || !addresses) return false;
88647
+ for (const [point2, address] of addresses.entries()) {
88648
+ const key2 = `${range.sheetName.toLowerCase()}!${address}`;
88649
+ const owner = name === "tx" ? `series:${index}` : `category:${point2}`;
88650
+ if (labelOwners.has(key2) && labelOwners.get(key2) !== owner) return false;
88651
+ labelOwners.set(key2, owner);
88652
+ }
88653
+ }
88654
+ } else if (external || !xml.getChildByLocalName(container2, numeric ? "numLit" : "strLit") && !(name === "tx" && xml.getScalarChildByLocalName(container2, "v") !== void 0))
88655
+ return false;
88656
+ }
88657
+ }
88658
+ if (formulaCount(chartSpace) !== writes.length) return false;
88659
+ if (!external) return writes.length === 0;
88660
+ if (!external.targetPath || !external.embeddedWorkbookData) return false;
88661
+ const target = resolve2(chartPartPath, external.targetPath);
88662
+ let references = 0;
88663
+ const parser = new fastXmlParser.XMLParser({ ignoreAttributes: false, attributeNamePrefix: "@_" });
88664
+ try {
88665
+ for (const path3 of Object.keys(zip.files)) {
88666
+ if (!path3.endsWith(".rels") || !path3.includes("/_rels/")) continue;
88667
+ const source = path3.replace("/_rels/", "/").slice(0, -5);
88668
+ const tree = parser.parse(await zip.file(path3).async("string"));
88669
+ for (const rel of xmlChildren(xmlChild(tree, "Relationships"), "Relationship")) {
88670
+ const relationshipTarget2 = xmlAttr(rel, "Target");
88671
+ if (relationshipTarget2 && xmlAttr(rel, "TargetMode") !== "External" && resolve2(source, relationshipTarget2) === target)
88672
+ references++;
88673
+ }
88674
+ }
88675
+ if (references !== 1) return false;
88676
+ await writeChartWorkbookUpdates(external.embeddedWorkbookData, writes, {
88677
+ atomic: true,
88678
+ requireCurrentValues: true
88679
+ });
88680
+ return true;
88681
+ } catch {
88682
+ return false;
88683
+ }
88684
+ }
88685
+ var init_chart_label_source = __esm({
88686
+ "pptx/core/utils/chart-label-source.ts"() {
88687
+ init_chart_xlsx_writer();
88688
+ init_xml_access();
88689
+ init_chart_xlsx_cellref();
88690
+ }
88691
+ });
88692
+
88342
88693
  // pptx/core/utils/chart-band-fmts.ts
88343
88694
  function safeUnsignedInt2(val) {
88344
88695
  const n = Number(val);
@@ -95768,7 +96119,7 @@ function buildContentTypesXml(overrides) {
95768
96119
  }
95769
96120
  async function buildMetroBlobPackage(input) {
95770
96121
  const root = ROOT[input.kind];
95771
- const zip = new JSZip6__default.default();
96122
+ const zip = new JSZip7__default.default();
95772
96123
  const overrides = new Map([
95773
96124
  [root.path, root.contentType],
95774
96125
  ...input.parts.contentTypes,
@@ -96084,7 +96435,7 @@ async function buildOne(zip, slidePath, slideXml3, element) {
96084
96435
  });
96085
96436
  }
96086
96437
  async function buildMetroBlobs(pptxBytes, slides) {
96087
- const zip = await JSZip6__default.default.loadAsync(pptxBytes);
96438
+ const zip = await JSZip7__default.default.loadAsync(pptxBytes);
96088
96439
  const slidePaths = await orderedSlidePaths(zip);
96089
96440
  const out = /* @__PURE__ */ new Map();
96090
96441
  for (let i2 = 0; i2 < slides.length; i2++) {
@@ -99076,7 +99427,7 @@ function withDeclaration(xml) {
99076
99427
  ${body}`;
99077
99428
  }
99078
99429
  async function zipParts(parts) {
99079
- const zip = new JSZip6__default.default();
99430
+ const zip = new JSZip7__default.default();
99080
99431
  for (const [name, text2] of parts) {
99081
99432
  zip.file(name, text2);
99082
99433
  }
@@ -99123,7 +99474,7 @@ async function buildMasterRoundTrip(source) {
99123
99474
  };
99124
99475
  }
99125
99476
  async function buildDeckMasterRoundTripsFromPptx(pptxBytes) {
99126
- const zip = await JSZip6__default.default.loadAsync(pptxBytes);
99477
+ const zip = await JSZip7__default.default.loadAsync(pptxBytes);
99127
99478
  const slidePaths = await readSlideMasterPaths(zip);
99128
99479
  const masterPaths = [...new Set(slidePaths)];
99129
99480
  if (masterPaths.length === 0) {
@@ -102370,6 +102721,18 @@ var init_tag_package = __esm({
102370
102721
  }
102371
102722
  });
102372
102723
 
102724
+ // pptx/core/utils/chart-workbook-data-signature.ts
102725
+ function chartWorkbookDataSignature(data) {
102726
+ return JSON.stringify({
102727
+ categories: data.dateCategories?.values ?? data.categories,
102728
+ series: data.series.map((series) => ({ name: series.name, values: series.values }))
102729
+ });
102730
+ }
102731
+ var init_chart_workbook_data_signature = __esm({
102732
+ "pptx/core/utils/chart-workbook-data-signature.ts"() {
102733
+ }
102734
+ });
102735
+
102373
102736
  // pptx/core/utils/chart-axis-deleted.ts
102374
102737
  function authoredDeleted(node) {
102375
102738
  if (node === void 0) {
@@ -103457,6 +103820,33 @@ var init_chart_title_run_alignment = __esm({
103457
103820
  }
103458
103821
  });
103459
103822
 
103823
+ // pptx/core/utils/chart-title-text-edit.ts
103824
+ function patchChartTitleRunText(title, runs, local) {
103825
+ const tx = title[findKey6(title, "tx", local) ?? ""];
103826
+ const rich = tx?.[findKey6(tx, "rich", local) ?? ""];
103827
+ const raw = rich?.[findKey6(rich, "p", local) ?? ""];
103828
+ const paragraphs = Array.isArray(raw) ? raw : raw ? [raw] : [];
103829
+ if (paragraphs.length !== 1) return false;
103830
+ const paragraph = paragraphs[0];
103831
+ if (findKey6(paragraph, "br", local) || findKey6(paragraph, "fld", local)) return false;
103832
+ const rawRuns = paragraph[findKey6(paragraph, "r", local) ?? ""];
103833
+ const original = Array.isArray(rawRuns) ? rawRuns : rawRuns ? [rawRuns] : [];
103834
+ if (original.length !== runs.length) return false;
103835
+ const keys = original.map((run) => findKey6(run, "t", local));
103836
+ if (keys.some((key2) => !key2)) return false;
103837
+ for (const [index, value] of original.entries()) {
103838
+ const run = value, key2 = keys[index];
103839
+ const text2 = run[key2];
103840
+ run[key2] = text2 && typeof text2 === "object" && !Array.isArray(text2) ? { ...text2, "#text": runs[index].text } : runs[index].text;
103841
+ }
103842
+ return true;
103843
+ }
103844
+ var init_chart_title_text_edit = __esm({
103845
+ "pptx/core/utils/chart-title-text-edit.ts"() {
103846
+ init_chart_title_xml_ops();
103847
+ }
103848
+ });
103849
+
103460
103850
  // pptx/core/utils/chart-title-serializer.ts
103461
103851
  function applyChartTitleToXml(chartRoot, model, getLocalName2, options = { prefix: "c" }) {
103462
103852
  const { prefix } = options;
@@ -103482,11 +103872,18 @@ function applyChartTitleToXml(chartRoot, model, getLocalName2, options = { prefi
103482
103872
  runs = realignOrCollapseTitleRuns(staleRuns, model.title);
103483
103873
  }
103484
103874
  let titleNode = existingKey ? chartRoot[existingKey] : void 0;
103875
+ const textOnlyStylesMatch = Boolean(
103876
+ runs && model.titleTextOnlyStyles?.length === runs.length && runs.every(
103877
+ (run, index) => ["bold", "italic", "fontSize", "color"].every(
103878
+ (key2) => run[key2] === model.titleTextOnlyStyles[index][key2]
103879
+ )
103880
+ )
103881
+ );
103485
103882
  if (runs && titleNode && typeof titleNode === "object") {
103486
103883
  const existingTexts = [];
103487
103884
  collectAllText(titleNode, getLocalName2, existingTexts);
103488
103885
  const newTexts = runs.map((run) => run.text);
103489
- if (existingTexts.length === newTexts.length && existingTexts.every((text2, index) => text2 === newTexts[index])) {
103886
+ if ((!model.titleTextOnly || textOnlyStylesMatch) && existingTexts.length === newTexts.length && existingTexts.every((text2, index) => text2 === newTexts[index])) {
103490
103887
  runs = void 0;
103491
103888
  }
103492
103889
  }
@@ -103498,6 +103895,12 @@ function applyChartTitleToXml(chartRoot, model, getLocalName2, options = { prefi
103498
103895
  insertAt2(chartRoot, 0, `${prefix}:title`, titleNode);
103499
103896
  }
103500
103897
  } else if (runs) {
103898
+ if (model.titleTextOnly && textOnlyStylesMatch) {
103899
+ if (!patchChartTitleRunText(titleNode, runs, getLocalName2))
103900
+ throw new Error("This chart title cannot be replaced without changing its text source");
103901
+ if (prefix === "c") setAutoTitleDeleted(chartRoot, false, getLocalName2);
103902
+ return true;
103903
+ }
103501
103904
  const txKey = findKey6(titleNode, "tx", getLocalName2);
103502
103905
  if (txKey) {
103503
103906
  titleNode[txKey] = buildTitleTextFromRuns(prefix, runs);
@@ -103521,6 +103924,7 @@ var init_chart_title_serializer = __esm({
103521
103924
  "pptx/core/utils/chart-title-serializer.ts"() {
103522
103925
  init_chart_title_node_builder();
103523
103926
  init_chart_title_run_alignment();
103927
+ init_chart_title_text_edit();
103524
103928
  init_chart_title_xml_ops();
103525
103929
  }
103526
103930
  });
@@ -103682,131 +104086,6 @@ var init_chart_title_style_serializer = __esm({
103682
104086
  };
103683
104087
  }
103684
104088
  });
103685
- function collectChartWorkbookWrite(xmlLookupService, container2, isNumeric2, values) {
103686
- if (!container2) {
103687
- return void 0;
103688
- }
103689
- const refNode = xmlLookupService.getChildByLocalName(container2, isNumeric2 ? "numRef" : "strRef");
103690
- const formula = refNode ? xmlLookupService.getScalarChildByLocalName(refNode, "f") : void 0;
103691
- return formula ? { formula, isNumeric: isNumeric2, values } : void 0;
103692
- }
103693
- function createSpreadsheetXmlParser() {
103694
- return new fastXmlParser.XMLParser({
103695
- ignoreAttributes: false,
103696
- attributeNamePrefix: "@_",
103697
- trimValues: false,
103698
- tagValueProcessor: (tagName, tagValue) => preservesSpreadsheetXmlWhitespace(tagName) ? tagValue : tagValue.trim()
103699
- });
103700
- }
103701
- function createSpreadsheetXmlBuilder() {
103702
- return new fastXmlParser.XMLBuilder({
103703
- ignoreAttributes: false,
103704
- attributeNamePrefix: "@_",
103705
- suppressBooleanAttributes: false,
103706
- format: false
103707
- });
103708
- }
103709
- async function resolveWorksheetPathsByName(xlsxZip, parser) {
103710
- const result = /* @__PURE__ */ new Map();
103711
- const workbookFile = xlsxZip.file("xl/workbook.xml");
103712
- const relsFile = xlsxZip.file("xl/_rels/workbook.xml.rels");
103713
- if (!workbookFile || !relsFile) {
103714
- return result;
103715
- }
103716
- try {
103717
- const workbookTree = parser.parse(await workbookFile.async("string"));
103718
- const relsTree = parser.parse(await relsFile.async("string"));
103719
- const targetByRelId = /* @__PURE__ */ new Map();
103720
- const relationships2 = xmlChild(relsTree, "Relationships");
103721
- for (const rel of xmlChildren(relationships2, "Relationship")) {
103722
- const id = xmlAttr(rel, "Id");
103723
- const target = xmlAttr(rel, "Target");
103724
- if (id && target) {
103725
- targetByRelId.set(id, target);
103726
- }
103727
- }
103728
- const workbookRoot = xmlChild(workbookTree, "workbook");
103729
- const sheets = xmlChild(workbookRoot, "sheets");
103730
- for (const sheet of xmlChildren(sheets, "sheet")) {
103731
- const name = xmlAttr(sheet, "name");
103732
- const relId = xmlAttr(sheet, "r:id") ?? xmlAttr(sheet, "id");
103733
- const target = relId ? targetByRelId.get(relId) : void 0;
103734
- if (name && target) {
103735
- result.set(name.toLowerCase(), resolveWorkbookPartPath(target));
103736
- }
103737
- }
103738
- } catch {
103739
- }
103740
- return result;
103741
- }
103742
- function resolveWorkbookPartPath(target) {
103743
- return target.startsWith("/") ? target.slice(1) : `xl/${target}`;
103744
- }
103745
- async function writeChartWorkbookUpdates(xlsxBytes, writes) {
103746
- if (writes.length === 0) {
103747
- return { unresolved: 0 };
103748
- }
103749
- let xlsxZip;
103750
- try {
103751
- xlsxZip = await JSZip6__default.default.loadAsync(xlsxBytes);
103752
- } catch {
103753
- return { unresolved: writes.length };
103754
- }
103755
- const parser = createSpreadsheetXmlParser();
103756
- const sheetPathByName = await resolveWorksheetPathsByName(xlsxZip, parser);
103757
- const writesBySheetPath = /* @__PURE__ */ new Map();
103758
- let unresolved = 0;
103759
- for (const write of writes) {
103760
- const range = parseChartFormulaRange(write.formula);
103761
- const sheetPath = range ? sheetPathByName.get(range.sheetName.toLowerCase()) : void 0;
103762
- const refs = range ? expandRangeAddresses(range, write.values.length) : void 0;
103763
- if (!range || !sheetPath || !refs) {
103764
- unresolved += 1;
103765
- continue;
103766
- }
103767
- const bucket = writesBySheetPath.get(sheetPath) ?? [];
103768
- bucket.push({ refs, values: write.values, isNumeric: write.isNumeric });
103769
- writesBySheetPath.set(sheetPath, bucket);
103770
- }
103771
- const builder3 = createSpreadsheetXmlBuilder();
103772
- let changedAny = false;
103773
- for (const [sheetPath, resolvedWrites] of writesBySheetPath) {
103774
- const sheetFile = xlsxZip.file(sheetPath);
103775
- if (!sheetFile) {
103776
- unresolved += resolvedWrites.length;
103777
- continue;
103778
- }
103779
- try {
103780
- const sheetTree = parser.parse(await sheetFile.async("string"));
103781
- const cellWrites = resolvedWrites.flatMap(
103782
- ({ refs, values, isNumeric: isNumeric2 }) => refs.map((ref, i2) => ({ ref, isNumeric: isNumeric2, value: values[i2] }))
103783
- );
103784
- if (applyCellWritesToWorksheet(sheetTree, cellWrites)) {
103785
- xlsxZip.file(sheetPath, builder3.build(sheetTree));
103786
- changedAny = true;
103787
- }
103788
- } catch {
103789
- unresolved += resolvedWrites.length;
103790
- }
103791
- }
103792
- if (!changedAny) {
103793
- return { unresolved };
103794
- }
103795
- const bytes = await xlsxZip.generateAsync({
103796
- type: "uint8array",
103797
- compression: "DEFLATE",
103798
- compressionOptions: { level: 6 }
103799
- });
103800
- return { bytes, unresolved };
103801
- }
103802
- var init_chart_xlsx_writer = __esm({
103803
- "pptx/core/utils/chart-xlsx-writer.ts"() {
103804
- init_chart_xlsx_cellref();
103805
- init_chart_xlsx_sheet_cells();
103806
- init_xml_access();
103807
- init_xml_whitespace();
103808
- }
103809
- });
103810
104089
 
103811
104090
  // pptx/core/core/runtime/chart-cx-update-data.ts
103812
104091
  function findKey31(node, localName28, getLocalName2) {
@@ -104142,13 +104421,19 @@ var init_chart_cx_update = __esm({
104142
104421
  });
104143
104422
 
104144
104423
  // pptx/core/core/runtime/chart-external-workbook-save.ts
104145
- async function saveChartExternalWorkbookUpdates(deps, chartPartPath, slidePath, externalData, writes) {
104424
+ async function saveChartExternalWorkbookUpdates(deps, chartPartPath, slidePath, externalData, writes, atomic = false) {
104425
+ if (atomic && externalData && (!externalData.targetPath || externalData.isExternal)) {
104426
+ throw new Error("Chart label replacement cannot update an external or missing workbook.");
104427
+ }
104146
104428
  if (writes.length === 0 || !externalData?.targetPath) {
104147
- return;
104429
+ return writes.length === 0;
104148
104430
  }
104149
104431
  const embeddingPath = deps.resolveImagePath(chartPartPath, externalData.targetPath);
104150
104432
  const looksEmbedded = embeddingPath.includes("embeddings/") && /\.xlsx$/iu.test(embeddingPath);
104151
- if (!looksEmbedded) {
104433
+ if (!looksEmbedded || externalData.isExternal) {
104434
+ if (atomic) {
104435
+ throw new Error("Chart label replacement requires an embedded .xlsx workbook.");
104436
+ }
104152
104437
  deps.reportWarning({
104153
104438
  code: "CHART_EXTERNAL_DATA_WRITEBACK_UNSUPPORTED",
104154
104439
  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.",
@@ -104157,10 +104442,13 @@ async function saveChartExternalWorkbookUpdates(deps, chartPartPath, slidePath,
104157
104442
  slideId: slidePath,
104158
104443
  xmlPath: chartPartPath
104159
104444
  });
104160
- return;
104445
+ return false;
104161
104446
  }
104162
104447
  const xlsxFile = deps.zip.file(embeddingPath);
104163
104448
  if (!xlsxFile) {
104449
+ if (atomic) {
104450
+ throw new Error("Chart label replacement workbook is missing.");
104451
+ }
104164
104452
  deps.reportWarning({
104165
104453
  code: "CHART_EMBEDDED_WORKBOOK_MISSING",
104166
104454
  message: "Chart data changes were saved to the cached values only: the referenced embedded workbook was not found in the package.",
@@ -104169,12 +104457,15 @@ async function saveChartExternalWorkbookUpdates(deps, chartPartPath, slidePath,
104169
104457
  slideId: slidePath,
104170
104458
  xmlPath: embeddingPath
104171
104459
  });
104172
- return;
104460
+ return false;
104173
104461
  }
104174
104462
  let xlsxBytes;
104175
104463
  try {
104176
104464
  xlsxBytes = await xlsxFile.async("uint8array");
104177
104465
  } catch {
104466
+ if (atomic) {
104467
+ throw new Error("Chart label replacement workbook cannot be read.");
104468
+ }
104178
104469
  deps.reportWarning({
104179
104470
  code: "CHART_EMBEDDED_WORKBOOK_UNREADABLE",
104180
104471
  message: "Chart data changes were saved to the cached values only: the referenced embedded workbook could not be read.",
@@ -104183,9 +104474,9 @@ async function saveChartExternalWorkbookUpdates(deps, chartPartPath, slidePath,
104183
104474
  slideId: slidePath,
104184
104475
  xmlPath: embeddingPath
104185
104476
  });
104186
- return;
104477
+ return false;
104187
104478
  }
104188
- const result = await writeChartWorkbookUpdates(xlsxBytes, writes);
104479
+ const result = await writeChartWorkbookUpdates(xlsxBytes, writes, { atomic });
104189
104480
  if (result.bytes) {
104190
104481
  deps.zip.file(embeddingPath, result.bytes);
104191
104482
  }
@@ -104199,6 +104490,7 @@ async function saveChartExternalWorkbookUpdates(deps, chartPartPath, slidePath,
104199
104490
  xmlPath: embeddingPath
104200
104491
  });
104201
104492
  }
104493
+ return result.unresolved === 0;
104202
104494
  }
104203
104495
  var init_chart_external_workbook_save = __esm({
104204
104496
  "pptx/core/core/runtime/chart-external-workbook-save.ts"() {
@@ -106708,7 +107000,7 @@ var init_PptxHandlerRuntimeState = __esm({
106708
107000
  */
106709
107001
  savedSlideFingerprints = /* @__PURE__ */ new Map();
106710
107002
  /**
106711
- * `chartData` exactly as it stood right after `enrichChartData` parsed it,
107003
+ * `chartData` as parsed or last serialized into the current ZIP,
106712
107004
  * serialized to JSON and keyed by `chartPartPath`. The save pipeline used
106713
107005
  * to re-serialize EVERY chart part on any slide rewrite regardless of
106714
107006
  * whether the chart itself was touched, which materializes the load-time
@@ -106721,6 +107013,10 @@ var init_PptxHandlerRuntimeState = __esm({
106721
107013
  * untouched chart part pass through byte-for-byte instead.
106722
107014
  */
106723
107015
  chartDataBaselines = /* @__PURE__ */ new Map();
107016
+ /** Pending chart requests also retain warned workbook writes for later retry. */
107017
+ pendingChartUpdates;
107018
+ /** Last fully reconciled workbook data plus whether a write-back needs retry. */
107019
+ chartWorkbookDataBaselines = /* @__PURE__ */ new Map();
106724
107020
  /** Per-slide relationship maps: slide path -> (rId -> target path). */
106725
107021
  slideRelsMap = /* @__PURE__ */ new Map();
106726
107022
  /** Tracks relationship IDs with TargetMode="External" per slide/part path. */
@@ -114555,6 +114851,7 @@ var init_table_tblpr_save = __esm({
114555
114851
  var CHART_DATA_DISPLAY_OPTIONS_EXT_URI, PptxHandlerRuntime24;
114556
114852
  var init_PptxHandlerRuntimeSaveDataSerialization = __esm({
114557
114853
  "pptx/core/core/runtime/PptxHandlerRuntimeSaveDataSerialization.ts"() {
114854
+ init_chart_workbook_data_signature();
114558
114855
  init_chart_axis_dispunits_serializer();
114559
114856
  init_chart_axis_gridlines_serializer();
114560
114857
  init_chart_axis_label_formatting();
@@ -114692,8 +114989,6 @@ var init_PptxHandlerRuntimeSaveDataSerialization = __esm({
114692
114989
  console.warn("Failed to serialize table data:", e);
114693
114990
  }
114694
114991
  }
114695
- /** Pending chart data updates to process in the async save method. */
114696
- pendingChartUpdates;
114697
114992
  /**
114698
114993
  * Record `chartData` as parsed, straight off `enrichChartData`, as this
114699
114994
  * chart's load-time baseline. See {@link chartDataBaselines}.
@@ -114703,6 +114998,10 @@ var init_PptxHandlerRuntimeSaveDataSerialization = __esm({
114703
114998
  return;
114704
114999
  }
114705
115000
  this.chartDataBaselines.set(chartData.chartPartPath, JSON.stringify(chartData));
115001
+ this.chartWorkbookDataBaselines.set(chartData.chartPartPath, {
115002
+ signature: chartWorkbookDataSignature(chartData),
115003
+ pending: false
115004
+ });
114706
115005
  }
114707
115006
  /**
114708
115007
  * Collect chart data for deferred async processing during save.
@@ -114719,12 +115018,28 @@ var init_PptxHandlerRuntimeSaveDataSerialization = __esm({
114719
115018
  /**
114720
115019
  * Process all pending chart data updates (called from the async save method).
114721
115020
  */
114722
- async processPendingChartUpdates() {
115021
+ async processPendingChartUpdates(slides) {
114723
115022
  if (!this.pendingChartUpdates || this.pendingChartUpdates.length === 0) {
114724
115023
  return;
114725
115024
  }
115025
+ if (slides) {
115026
+ const current = /* @__PURE__ */ new Map();
115027
+ const visit = (elements2, slidePath) => {
115028
+ for (const element of elements2) {
115029
+ if (element.type === "group") visit(element.children, slidePath);
115030
+ else if (element.type === "chart" && element.chartData?.chartPartPath) {
115031
+ current.set(element.chartData.chartPartPath, {
115032
+ chartData: element.chartData,
115033
+ slidePath
115034
+ });
115035
+ }
115036
+ }
115037
+ };
115038
+ for (const slide of slides) visit(slide.elements, slide.id);
115039
+ this.pendingChartUpdates = [...current.values()];
115040
+ }
114726
115041
  for (const { chartData, slidePath } of this.pendingChartUpdates) {
114727
- if (chartData.chartPartPath && this.chartDataBaselines.get(chartData.chartPartPath) === JSON.stringify(chartData)) {
115042
+ if (chartData.chartPartPath && !this.chartWorkbookDataBaselines.get(chartData.chartPartPath)?.pending && this.chartDataBaselines.get(chartData.chartPartPath) === JSON.stringify(chartData)) {
114728
115043
  continue;
114729
115044
  }
114730
115045
  if (chartData.colorPalette && chartData.colorStylePartPath) {
@@ -115143,7 +115458,9 @@ var init_PptxHandlerRuntimeSaveDataSerialization = __esm({
115143
115458
  {
115144
115459
  title: chartData.title,
115145
115460
  hasTitle: chartData.style?.hasTitle,
115146
- titleRuns: chartData.titleRuns
115461
+ titleRuns: chartData.titleRuns,
115462
+ titleTextOnly: chartData.titleTextOnly,
115463
+ titleTextOnlyStyles: chartData.titleTextOnlyStyles
115147
115464
  },
115148
115465
  (key2) => this.compatibilityService.getXmlLocalName(key2)
115149
115466
  );
@@ -115335,23 +115652,41 @@ var init_PptxHandlerRuntimeSaveDataSerialization = __esm({
115335
115652
  }
115336
115653
  }
115337
115654
  await this.syncChartUserShapesToXml(chartSpace, chartData, chartPartPath);
115655
+ const serializedBaseline = this.chartDataBaselines.get(chartPartPath);
115656
+ const signature = chartWorkbookDataSignature(chartData);
115657
+ const workbookBaseline = this.chartWorkbookDataBaselines.get(chartPartPath);
115658
+ const previousSignature = workbookBaseline?.signature ?? (serializedBaseline ? chartWorkbookDataSignature(JSON.parse(serializedBaseline)) : void 0);
115659
+ const workbookDataChanged = workbookBaseline?.pending || signature !== previousSignature;
115660
+ if (workbookDataChanged) {
115661
+ const complete = await saveChartExternalWorkbookUpdates(
115662
+ {
115663
+ zip: this.zip,
115664
+ resolveImagePath: (basePath, target) => this.resolveImagePath(basePath, target),
115665
+ reportWarning: (warning) => this.compatibilityService.reportWarning(warning)
115666
+ },
115667
+ chartPartPath,
115668
+ slidePath,
115669
+ chartData.externalData,
115670
+ workbookWrites,
115671
+ chartData.dataLabelTextOnly ?? false
115672
+ );
115673
+ this.chartWorkbookDataBaselines.set(chartPartPath, {
115674
+ signature: complete ? signature : previousSignature ?? signature,
115675
+ pending: !complete
115676
+ });
115677
+ }
115338
115678
  this.zip.file(chartPartPath, this.builder.build(chartXmlData));
115339
- await saveChartExternalWorkbookUpdates(
115340
- {
115341
- zip: this.zip,
115342
- resolveImagePath: (basePath, target) => this.resolveImagePath(basePath, target),
115343
- reportWarning: (warning) => this.compatibilityService.reportWarning(warning)
115344
- },
115345
- chartPartPath,
115346
- slidePath,
115347
- chartData.externalData,
115348
- workbookWrites
115349
- );
115679
+ this.chartDataBaselines.set(chartPartPath, JSON.stringify(chartData));
115350
115680
  } catch (e) {
115681
+ if (chartData.dataLabelTextOnly) {
115682
+ throw e;
115683
+ }
115351
115684
  console.warn(`[pptx-save] Failed to serialize chart data for ${chartPartPath}:`, e);
115352
115685
  }
115353
115686
  }
115354
- this.pendingChartUpdates = void 0;
115687
+ this.pendingChartUpdates = this.pendingChartUpdates.filter(
115688
+ ({ chartData }) => chartData.chartPartPath && this.chartWorkbookDataBaselines.get(chartData.chartPartPath)?.pending
115689
+ );
115355
115690
  }
115356
115691
  /**
115357
115692
  * Route a chart save that the 2006 `c:*Chart` update loop cannot handle:
@@ -123555,22 +123890,44 @@ function drawingNamespace(strict) {
123555
123890
  var NOTES_MASTER_CONTENT_TYPE, PptxHandlerRuntime50;
123556
123891
  var init_PptxHandlerRuntimeSaveNotesInfrastructure = __esm({
123557
123892
  "pptx/core/core/runtime/PptxHandlerRuntimeSaveNotesInfrastructure.ts"() {
123893
+ init_relationships();
123558
123894
  init_PptxHandlerRuntimeSaveViewProperties();
123559
123895
  NOTES_MASTER_CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.presentationml.notesMaster+xml";
123560
123896
  PptxHandlerRuntime50 = class extends PptxHandlerRuntime49 {
123561
123897
  /** Ensure authored notes have the global notes-master OPC infrastructure. */
123562
123898
  async ensureNotesMasterForAuthoredNotes(slides, constants) {
123563
123899
  const needsNotes = slides.some(
123564
- (slide) => slide.notes !== void 0 || Boolean(slide.notesSegments?.length)
123900
+ (slide) => Boolean(slide.notes) || Boolean(slide.notesSegments?.some((segment) => segment.text))
123565
123901
  );
123566
123902
  if (!needsNotes || Object.keys(this.zip.files).some(
123567
123903
  (path3) => /^ppt\/notesMasters\/notesMaster\d+\.xml$/u.test(path3)
123568
123904
  )) {
123569
123905
  return;
123570
123906
  }
123907
+ const relsPath2 = "ppt/_rels/presentation.xml.rels";
123908
+ const relsXml = await this.zip.file(relsPath2)?.async("string");
123909
+ if (!relsXml || !this.presentationData) return;
123910
+ if (Array.from(parseRelationships(relsXml).values()).some(
123911
+ (relationship) => relationship.type.endsWith("/notesMaster") && relationship.mode !== "External" && this.zip.file(resolvePartPath("ppt/presentation.xml", relationship.target))
123912
+ ))
123913
+ return;
123571
123914
  const strict = constants.conformance === "strict";
123572
123915
  const masterPath = "ppt/notesMasters/notesMaster1.xml";
123573
- const themePath = Object.keys(this.zip.files).find((path3) => /^ppt\/theme\/theme\d+\.xml$/u.test(path3)) ?? "ppt/theme/theme1.xml";
123916
+ const sourceThemePath = Object.keys(this.zip.files).find((path3) => /^ppt\/theme\/theme\d+\.xml$/u.test(path3)) ?? "ppt/theme/theme1.xml";
123917
+ let themeIndex = 1;
123918
+ while (this.zip.file(`ppt/theme/theme${themeIndex}.xml`)) themeIndex += 1;
123919
+ const themePath = `ppt/theme/theme${themeIndex}.xml`;
123920
+ const themeBytes = await this.zip.file(sourceThemePath)?.async("uint8array");
123921
+ const theme = themeBytes ?? this.buildThemeXml(themePath, void 0);
123922
+ if (!theme) throw new Error("Cannot create a notes theme from the presentation state");
123923
+ this.zip.file(themePath, theme);
123924
+ const themeRelationships = await this.zip.file(`ppt/theme/_rels/${sourceThemePath.slice(sourceThemePath.lastIndexOf("/") + 1)}.rels`)?.async("uint8array");
123925
+ if (themeRelationships)
123926
+ this.zip.file(`ppt/theme/_rels/theme${themeIndex}.xml.rels`, themeRelationships);
123927
+ await this.addContentTypeOverride(
123928
+ `/${themePath}`,
123929
+ "application/vnd.openxmlformats-officedocument.theme+xml"
123930
+ );
123574
123931
  this.zip.file(masterPath, this.builder.build(this.buildDefaultNotesMaster(strict)));
123575
123932
  this.zip.file(
123576
123933
  "ppt/notesMasters/_rels/notesMaster1.xml.rels",
@@ -123585,11 +123942,6 @@ var init_PptxHandlerRuntimeSaveNotesInfrastructure = __esm({
123585
123942
  }
123586
123943
  })
123587
123944
  );
123588
- const relsPath2 = "ppt/_rels/presentation.xml.rels";
123589
- const relsXml = await this.zip.file(relsPath2)?.async("string");
123590
- if (!relsXml || !this.presentationData) {
123591
- return;
123592
- }
123593
123945
  const relsData = this.parser.parse(relsXml);
123594
123946
  const relsRoot = relsData["Relationships"] ?? {};
123595
123947
  const relationships2 = asArray7(relsRoot["Relationship"]);
@@ -124324,7 +124676,7 @@ var init_PptxHandlerRuntimeSavePipeline = __esm({
124324
124676
  saveSession,
124325
124677
  saveConstants
124326
124678
  );
124327
- await this.processPendingChartUpdates();
124679
+ await this.processPendingChartUpdates(slides);
124328
124680
  await this.ensureChartPartContentTypes();
124329
124681
  await this.ensureOleEmbeddingContentTypes();
124330
124682
  await this.processPendingOleContentUpdates();
@@ -134335,6 +134687,7 @@ var init_PptxHandlerRuntimeChartExternalData = __esm({
134335
134687
  );
134336
134688
  const autoUpdateAttr = externalDataNode["@_autoUpdate"];
134337
134689
  const autoUpdate = autoUpdateNode?.["@_val"] === "1" || autoUpdateNode?.["@_val"] === "true" || autoUpdateAttr === "1" || autoUpdateAttr === "true" || false;
134690
+ let isExternal = false;
134338
134691
  let targetPath;
134339
134692
  try {
134340
134693
  const chartDir = chartPartPath.substring(0, chartPartPath.lastIndexOf("/") + 1);
@@ -134349,6 +134702,7 @@ var init_PptxHandlerRuntimeChartExternalData = __esm({
134349
134702
  for (const rel of rels) {
134350
134703
  if (String(rel?.["@_Id"] || "") === relId) {
134351
134704
  targetPath = String(rel?.["@_Target"] || "").trim() || void 0;
134705
+ isExternal = String(rel?.["@_TargetMode"] || "") === "External";
134352
134706
  break;
134353
134707
  }
134354
134708
  }
@@ -134357,7 +134711,7 @@ var init_PptxHandlerRuntimeChartExternalData = __esm({
134357
134711
  } catch {
134358
134712
  }
134359
134713
  let embeddedWorkbookData;
134360
- if (targetPath) {
134714
+ if (targetPath && !isExternal) {
134361
134715
  try {
134362
134716
  const embeddingPath = this.resolveImagePath(chartPartPath, targetPath);
134363
134717
  if (embeddingPath.includes("embeddings/") && embeddingPath.endsWith(".xlsx")) {
@@ -134371,6 +134725,7 @@ var init_PptxHandlerRuntimeChartExternalData = __esm({
134371
134725
  }
134372
134726
  return {
134373
134727
  relId,
134728
+ ...isExternal ? { isExternal: true } : {},
134374
134729
  targetPath,
134375
134730
  autoUpdate,
134376
134731
  ...embeddedWorkbookData ? { embeddedWorkbookData } : {}
@@ -134741,6 +135096,8 @@ var init_PptxHandlerRuntimeChartExParsing = __esm({
134741
135096
  ...result.categoryLevels ? { categoryLevels: result.categoryLevels } : {},
134742
135097
  series: result.series,
134743
135098
  title: cxTitleText,
135099
+ titleTextEditable: false,
135100
+ dataLabelTextEditable: false,
134744
135101
  style: chartStyle2,
134745
135102
  chartPartPath,
134746
135103
  chartRelationshipId,
@@ -134764,6 +135121,7 @@ var init_PptxHandlerRuntimeChartExParsing = __esm({
134764
135121
  var PptxHandlerRuntime95;
134765
135122
  var init_PptxHandlerRuntimeChartParsing = __esm({
134766
135123
  "pptx/core/core/runtime/PptxHandlerRuntimeChartParsing.ts"() {
135124
+ init_chart_label_source();
134767
135125
  init_chart_advanced_parser();
134768
135126
  init_chart_axis_parser();
134769
135127
  init_chart_band_fmts();
@@ -134954,12 +135312,34 @@ var init_PptxHandlerRuntimeChartParsing = __esm({
134954
135312
  colorAdapter
134955
135313
  );
134956
135314
  const style = chartStyleFromNeutral(neutral, this.extractChartStyle(chartSpace, chartRoot));
135315
+ const titleTx = reader2.xml.getChildByLocalName(
135316
+ reader2.xml.getChildByLocalName(chartRoot, "title"),
135317
+ "tx"
135318
+ );
135319
+ const titleRich = reader2.xml.getChildByLocalName(titleTx, "rich");
135320
+ const titleParagraphs = reader2.xml.getChildrenArrayByLocalName(titleRich, "p");
135321
+ const titleTextEditable = Boolean(
135322
+ titleRuns?.length && titleParagraphs.length === 1 && !Object.keys(titleParagraphs[0] ?? {}).some(
135323
+ (key2) => ["br", "fld"].includes(reader2.localName(key2))
135324
+ )
135325
+ );
134957
135326
  const groupOptions = groupOptionsFromNeutral(groups[0]?.group, chartType);
134958
135327
  const linesAndChrome = this.readChartLinesAndChrome(neutral, tree, groups, reader2);
134959
135328
  const facts = await this.readChartPartFacts(chartSpace, chartRoot, chartPartPath);
134960
135329
  const workbook = facts.embeddedWorkbookData;
134961
135330
  const dateCategories = rawDateCategories ? { ...rawDateCategories, date1904: neutral.date1904 ?? workbook?.date1904 ?? false } : void 0;
134962
135331
  const filled = applyEmbeddedWorkbookFallback(chartType, categories, built.series, workbook);
135332
+ const dataLabelTextEditable = !categoryLevels && !dateCategories && await chartLabelsHaveEditableSources(
135333
+ reader2.xml,
135334
+ this.zip,
135335
+ chartSpace,
135336
+ built.seriesNodes,
135337
+ filled.series,
135338
+ filled.categories,
135339
+ facts.externalData,
135340
+ chartPartPath,
135341
+ this.resolveImagePath.bind(this)
135342
+ );
134963
135343
  const hasPicture = filled.series.some(
134964
135344
  (entry2) => entry2.picture || entry2.impliedPicture || entry2.dataPoints?.some((point2) => point2.picture || point2.impliedPicture)
134965
135345
  );
@@ -134992,6 +135372,14 @@ var init_PptxHandlerRuntimeChartParsing = __esm({
134992
135372
  ...built.filtered,
134993
135373
  title: neutralTitleText(neutral.title),
134994
135374
  ...titleRuns ? { titleRuns } : {},
135375
+ titleTextEditable,
135376
+ dataLabelTextEditable,
135377
+ ...dataLabelTextEditable ? {
135378
+ dataLabelSourceShape: {
135379
+ categoryCount: filled.categories.length,
135380
+ seriesValueCounts: filled.series.map((series) => series.values.length)
135381
+ }
135382
+ } : {},
134995
135383
  style,
134996
135384
  grouping: groupOptions.grouping,
134997
135385
  ...groupOptions,
@@ -135451,7 +135839,7 @@ var init_PptxHandlerRuntimeLoadSession = __esm({
135451
135839
  );
135452
135840
  }
135453
135841
  try {
135454
- this.zip = await JSZip6__default.default.loadAsync(data);
135842
+ this.zip = await JSZip7__default.default.loadAsync(data);
135455
135843
  this.documentPropertiesUpdater = this.dependencyFactory.createDocumentPropertiesUpdater(
135456
135844
  this.zip,
135457
135845
  this.parser,
@@ -135489,6 +135877,8 @@ var init_PptxHandlerRuntimeLoadSession = __esm({
135489
135877
  this.slideMap.clear();
135490
135878
  this.savedSlideFingerprints.clear();
135491
135879
  this.chartDataBaselines.clear();
135880
+ this.chartWorkbookDataBaselines.clear();
135881
+ this.pendingChartUpdates = void 0;
135492
135882
  this.layoutCache.clear();
135493
135883
  this.masterCache.clear();
135494
135884
  this.templateElementBaselines.reset();
@@ -135978,6 +136368,8 @@ var init_PptxHandlerRuntimeLoadPipeline = __esm({
135978
136368
  this.slideMap.clear();
135979
136369
  this.savedSlideFingerprints.clear();
135980
136370
  this.chartDataBaselines.clear();
136371
+ this.chartWorkbookDataBaselines.clear();
136372
+ this.pendingChartUpdates = void 0;
135981
136373
  this.slideRelsMap.clear();
135982
136374
  this.externalRelsMap.clear();
135983
136375
  this.layoutCache.clear();
@@ -136376,7 +136768,7 @@ var init_PptxHandlerRuntimeImplementation = __esm({
136376
136768
  constructor(dependencyFactory = new PptxRuntimeDependencyFactory()) {
136377
136769
  super();
136378
136770
  this.dependencyFactory = dependencyFactory;
136379
- this.zip = new JSZip6__default.default();
136771
+ this.zip = new JSZip7__default.default();
136380
136772
  this.parser = this.dependencyFactory.createParser();
136381
136773
  this.builder = this.dependencyFactory.createBuilder();
136382
136774
  this.elementXmlBuilder = new PptxElementXmlBuilder({
@@ -139381,7 +139773,7 @@ function collectPictureIndexes(slide) {
139381
139773
  return indexes;
139382
139774
  }
139383
139775
  async function buildPptxPackage(deck) {
139384
- const zip = new JSZip6__default.default();
139776
+ const zip = new JSZip7__default.default();
139385
139777
  const usage = { fileNumbers: /* @__PURE__ */ new Map() };
139386
139778
  let mediaCounter = 0;
139387
139779
  for (const slide of deck.slides) {
@@ -141521,15 +141913,26 @@ init_font_substitution();
141521
141913
  var DEFAULT_FONT_SIZE = 18;
141522
141914
  var FALLBACK_PAD_FACTOR = 0.06;
141523
141915
  function drawTextSegments(ctx, segments, bodyStyle, w, h2, scaleFactor = 1) {
141524
- const padL = bodyStyle?.bodyInsetLeft ? bodyStyle.bodyInsetLeft * scaleFactor : Math.round(w * FALLBACK_PAD_FACTOR);
141525
- const padR = bodyStyle?.bodyInsetRight ? bodyStyle.bodyInsetRight * scaleFactor : Math.round(w * FALLBACK_PAD_FACTOR);
141526
- const padT = bodyStyle?.bodyInsetTop ? bodyStyle.bodyInsetTop * scaleFactor : Math.round(h2 * FALLBACK_PAD_FACTOR);
141527
- const padB = bodyStyle?.bodyInsetBottom ? bodyStyle.bodyInsetBottom * scaleFactor : Math.round(h2 * FALLBACK_PAD_FACTOR);
141916
+ const padL = bodyStyle?.bodyInsetLeft !== void 0 ? bodyStyle.bodyInsetLeft * scaleFactor : Math.round(w * FALLBACK_PAD_FACTOR);
141917
+ const padR = bodyStyle?.bodyInsetRight !== void 0 ? bodyStyle.bodyInsetRight * scaleFactor : Math.round(w * FALLBACK_PAD_FACTOR);
141918
+ const padT = bodyStyle?.bodyInsetTop !== void 0 ? bodyStyle.bodyInsetTop * scaleFactor : Math.round(h2 * FALLBACK_PAD_FACTOR);
141919
+ const padB = bodyStyle?.bodyInsetBottom !== void 0 ? bodyStyle.bodyInsetBottom * scaleFactor : Math.round(h2 * FALLBACK_PAD_FACTOR);
141528
141920
  const maxWidth = w - padL - padR;
141529
141921
  if (maxWidth <= 0) {
141530
141922
  return;
141531
141923
  }
141532
- const paragraphs = splitIntoParagraphs(segments);
141924
+ const paragraphs = splitIntoParagraphs(
141925
+ segments.map((segment) => ({
141926
+ ...segment,
141927
+ style: {
141928
+ ...bodyStyle,
141929
+ ...Object.fromEntries(
141930
+ Object.entries(segment.style).filter(([, value]) => value !== void 0)
141931
+ )
141932
+ }
141933
+ })),
141934
+ bodyStyle
141935
+ );
141533
141936
  const lines = layoutParagraphs(ctx, paragraphs, maxWidth, scaleFactor);
141534
141937
  if (lines.length === 0) {
141535
141938
  return;
@@ -141565,33 +141968,58 @@ function drawTextSegments(ctx, segments, bodyStyle, w, h2, scaleFactor = 1) {
141565
141968
  y += line2.height * 0.3;
141566
141969
  }
141567
141970
  }
141568
- function splitIntoParagraphs(segments) {
141569
- const paragraphs = [[]];
141971
+ function splitIntoParagraphs(segments, bodyStyle) {
141972
+ const paragraphs = [{ segments: [], style: bodyStyle ?? {} }];
141570
141973
  for (const seg of segments) {
141571
- if (seg.isParagraphBreak) {
141572
- paragraphs.push([]);
141573
- } else if (seg.text) {
141574
- paragraphs[paragraphs.length - 1].push(seg);
141974
+ if (seg.isParagraphBreak || seg.text === "\n" && !seg.isLineBreak) {
141975
+ paragraphs.push({ segments: [], style: seg.style });
141976
+ } else if (seg.text || seg.isLineBreak) {
141977
+ paragraphs[paragraphs.length - 1].segments.push(seg);
141575
141978
  }
141576
141979
  }
141577
- return paragraphs.filter((p) => p.length > 0);
141980
+ return paragraphs;
141578
141981
  }
141579
141982
  function layoutParagraphs(ctx, paragraphs, maxWidth, scaleFactor) {
141580
141983
  const lines = [];
141581
- for (const para of paragraphs) {
141582
- const paraAlign = para[0]?.style?.align;
141984
+ for (const paragraph of paragraphs) {
141985
+ const para = paragraph.segments;
141986
+ const paraAlign = para[0]?.style.align ?? paragraph.style.align;
141583
141987
  let currentLine = [];
141584
141988
  let lineWidth = 0;
141585
141989
  let lineHeight = 0;
141990
+ let fallbackHeight = (para[0]?.style.fontSize ?? paragraph.style.fontSize ?? DEFAULT_FONT_SIZE) * scaleFactor * 1.2;
141991
+ const flushLine = () => {
141992
+ while (currentLine.length > 0 && /^\s+$/.test(currentLine[currentLine.length - 1].text)) {
141993
+ lineWidth -= currentLine.pop().measuredWidth;
141994
+ }
141995
+ lines.push({
141996
+ runs: currentLine,
141997
+ width: lineWidth,
141998
+ height: lineHeight || fallbackHeight,
141999
+ align: paraAlign
142000
+ });
142001
+ currentLine = [];
142002
+ lineWidth = 0;
142003
+ lineHeight = 0;
142004
+ };
141586
142005
  for (const seg of para) {
141587
142006
  ctx.font = buildFont(seg.style, scaleFactor);
141588
142007
  const fontSize = (seg.style.fontSize ?? DEFAULT_FONT_SIZE) * scaleFactor;
141589
142008
  const segHeight = fontSize * 1.2;
141590
- const tokens = seg.text.split(/(?<=\s)(?=\S)|(?<=\S)(?=\s)/);
142009
+ fallbackHeight = segHeight;
142010
+ if (seg.isLineBreak) {
142011
+ flushLine();
142012
+ continue;
142013
+ }
142014
+ const tokens = seg.text.split(/(\r\n|\r|\n)|(?<=\s)(?=\S)|(?<=\S)(?=\s)/);
141591
142015
  for (const raw of tokens) {
141592
142016
  if (!raw) {
141593
142017
  continue;
141594
142018
  }
142019
+ if (/^(\r\n|\r|\n)$/.test(raw)) {
142020
+ flushLine();
142021
+ continue;
142022
+ }
141595
142023
  if (/^\s+$/.test(raw)) {
141596
142024
  if (currentLine.length > 0) {
141597
142025
  const spaceW = ctx.measureText(raw).width;
@@ -141607,19 +142035,7 @@ function layoutParagraphs(ctx, paragraphs, maxWidth, scaleFactor) {
141607
142035
  const word = raw;
141608
142036
  const wordW = ctx.measureText(word).width;
141609
142037
  if (lineWidth + wordW > maxWidth && currentLine.length > 0) {
141610
- while (currentLine.length > 0 && /^\s+$/.test(currentLine[currentLine.length - 1].text)) {
141611
- const removed = currentLine.pop();
141612
- lineWidth -= removed.measuredWidth;
141613
- }
141614
- lines.push({
141615
- runs: currentLine,
141616
- width: lineWidth,
141617
- height: lineHeight,
141618
- align: paraAlign
141619
- });
141620
- currentLine = [];
141621
- lineWidth = 0;
141622
- lineHeight = 0;
142038
+ flushLine();
141623
142039
  }
141624
142040
  currentLine.push({
141625
142041
  text: word,
@@ -141630,14 +142046,7 @@ function layoutParagraphs(ctx, paragraphs, maxWidth, scaleFactor) {
141630
142046
  lineHeight = Math.max(lineHeight, segHeight);
141631
142047
  }
141632
142048
  }
141633
- if (currentLine.length > 0) {
141634
- lines.push({
141635
- runs: currentLine,
141636
- width: lineWidth,
141637
- height: lineHeight,
141638
- align: paraAlign
141639
- });
141640
- }
142049
+ flushLine();
141641
142050
  }
141642
142051
  return lines;
141643
142052
  }