ooxml-core 1.0.0 → 1.1.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 (230) hide show
  1. package/dist/{PptxHandler-G63S6YZU.mjs → PptxHandler-75LOVF7I.mjs} +2 -2
  2. package/dist/automation/index.cjs +2559 -1169
  3. package/dist/automation/index.mjs +2559 -1169
  4. package/dist/chart/gradient-definition.d.ts +2 -2
  5. package/dist/chart/gradient-definition.d.ts.map +1 -1
  6. package/dist/chart/index.cjs +7 -7
  7. package/dist/chart/index.mjs +7 -7
  8. package/dist/{chunk-BICQYRPW.mjs → chunk-75LA7H3F.mjs} +1339 -1435
  9. package/dist/{chunk-CKJSWE7N.mjs → chunk-LA7D6ZYQ.mjs} +244 -115
  10. package/dist/{chunk-ROM5MZ7O.mjs → chunk-OMGH6IKY.mjs} +3 -3
  11. package/dist/{chunk-RWXFQJVF.mjs → chunk-Q27H4HFS.mjs} +1 -1
  12. package/dist/{chunk-DDG5HTGX.mjs → chunk-RFX7AJDZ.mjs} +1 -1
  13. package/dist/crypto/index.cjs +1406 -184
  14. package/dist/crypto/index.mjs +1406 -184
  15. package/dist/diagram/dom.d.ts +1 -14
  16. package/dist/diagram/dom.d.ts.map +1 -1
  17. package/dist/diagram/index.cjs +15 -15
  18. package/dist/diagram/index.d.ts +12 -12
  19. package/dist/diagram/index.d.ts.map +1 -1
  20. package/dist/diagram/index.mjs +15 -15
  21. package/dist/diagram/types.d.ts +12 -148
  22. package/dist/diagram/types.d.ts.map +1 -1
  23. package/dist/digest/algorithm-names.d.ts +2 -2
  24. package/dist/digest/algorithm-names.d.ts.map +1 -1
  25. package/dist/digest/bit-ops.d.ts +30 -0
  26. package/dist/digest/bit-ops.d.ts.map +1 -0
  27. package/dist/digest/digest.d.ts +2 -2
  28. package/dist/digest/digest.d.ts.map +1 -1
  29. package/dist/digest/index.cjs +1319 -90
  30. package/dist/digest/index.d.ts +7 -1
  31. package/dist/digest/index.d.ts.map +1 -1
  32. package/dist/digest/index.mjs +1313 -91
  33. package/dist/digest/md2.d.ts +22 -0
  34. package/dist/digest/md2.d.ts.map +1 -0
  35. package/dist/digest/md4.d.ts +3 -0
  36. package/dist/digest/md4.d.ts.map +1 -0
  37. package/dist/digest/md5.d.ts +3 -0
  38. package/dist/digest/md5.d.ts.map +1 -0
  39. package/dist/digest/password-hash.d.ts +7 -0
  40. package/dist/digest/password-hash.d.ts.map +1 -1
  41. package/dist/digest/ripemd-functions.d.ts +18 -0
  42. package/dist/digest/ripemd-functions.d.ts.map +1 -0
  43. package/dist/digest/ripemd128.d.ts +3 -0
  44. package/dist/digest/ripemd128.d.ts.map +1 -0
  45. package/dist/digest/ripemd160.d.ts +3 -0
  46. package/dist/digest/ripemd160.d.ts.map +1 -0
  47. package/dist/digest/whirlpool-sbox.d.ts +15 -0
  48. package/dist/digest/whirlpool-sbox.d.ts.map +1 -0
  49. package/dist/digest/whirlpool-table.d.ts +12 -0
  50. package/dist/digest/whirlpool-table.d.ts.map +1 -0
  51. package/dist/digest/whirlpool.d.ts +3 -0
  52. package/dist/digest/whirlpool.d.ts.map +1 -0
  53. package/dist/docx/block-parser.d.ts.map +1 -1
  54. package/dist/docx/diagram-theme.d.ts +3 -3
  55. package/dist/docx/diagram-theme.d.ts.map +1 -1
  56. package/dist/docx/embedded.cjs +470 -276
  57. package/dist/docx/embedded.mjs +470 -276
  58. package/dist/docx/field-flags.d.ts +8 -0
  59. package/dist/docx/field-flags.d.ts.map +1 -0
  60. package/dist/docx/field-lock.d.ts +6 -0
  61. package/dist/docx/field-lock.d.ts.map +1 -0
  62. package/dist/docx/field-runs.d.ts +4 -1
  63. package/dist/docx/field-runs.d.ts.map +1 -1
  64. package/dist/docx/index.cjs +1029 -850
  65. package/dist/docx/index.d.ts +2 -0
  66. package/dist/docx/index.d.ts.map +1 -1
  67. package/dist/docx/index.mjs +1027 -850
  68. package/dist/docx/layout/adapter.d.ts.map +1 -1
  69. package/dist/docx/layout/index.cjs +61 -47
  70. package/dist/docx/layout/index.mjs +61 -47
  71. package/dist/docx/layout/page-fields.d.ts.map +1 -1
  72. package/dist/docx/load/index.cjs +1883 -467
  73. package/dist/docx/load/index.mjs +1883 -467
  74. package/dist/docx/model-run.d.ts +5 -0
  75. package/dist/docx/model-run.d.ts.map +1 -1
  76. package/dist/docx/numbering-model.d.ts +1 -1
  77. package/dist/docx/numbering-model.d.ts.map +1 -1
  78. package/dist/docx/numbering-package.d.ts +4 -4
  79. package/dist/docx/numbering-package.d.ts.map +1 -1
  80. package/dist/docx/numbering-start-edit.d.ts +8 -0
  81. package/dist/docx/numbering-start-edit.d.ts.map +1 -0
  82. package/dist/docx/numbering-start-patch.d.ts +13 -0
  83. package/dist/docx/numbering-start-patch.d.ts.map +1 -0
  84. package/dist/docx/theme-color.d.ts.map +1 -1
  85. package/dist/docx/theme-model.d.ts +3 -2
  86. package/dist/docx/theme-model.d.ts.map +1 -1
  87. package/dist/docx/theme.d.ts +5 -1
  88. package/dist/docx/theme.d.ts.map +1 -1
  89. package/dist/docx/ui/field-guard.d.ts +2 -0
  90. package/dist/docx/ui/field-guard.d.ts.map +1 -1
  91. package/dist/docx/ui/field-results.d.ts.map +1 -1
  92. package/dist/docx/ui/index.cjs +547 -375
  93. package/dist/docx/ui/index.mjs +547 -376
  94. package/dist/docx/ui/review-commands.d.ts.map +1 -1
  95. package/dist/docx/ui/run-extra-mark.d.ts +1 -1
  96. package/dist/docx/ui/run-extra-mark.d.ts.map +1 -1
  97. package/dist/docx/ui/simple-field-input.d.ts +3 -0
  98. package/dist/docx/ui/simple-field-input.d.ts.map +1 -1
  99. package/dist/docx/ui/track-changes-mode.d.ts.map +1 -1
  100. package/dist/docx/ui/track-paragraph-boundaries.d.ts +5 -0
  101. package/dist/docx/ui/track-paragraph-boundaries.d.ts.map +1 -0
  102. package/dist/docx/write-inline.d.ts.map +1 -1
  103. package/dist/docx/write-run.d.ts.map +1 -1
  104. package/dist/drawingml/dom.d.ts +15 -0
  105. package/dist/drawingml/dom.d.ts.map +1 -0
  106. package/dist/drawingml/drawing-color-brightness.d.ts +6 -0
  107. package/dist/drawingml/drawing-color-brightness.d.ts.map +1 -0
  108. package/dist/drawingml/drawing-color-css.d.ts.map +1 -0
  109. package/dist/{diagram → drawingml}/drawing-color.d.ts +5 -5
  110. package/dist/drawingml/drawing-color.d.ts.map +1 -0
  111. package/dist/{diagram → drawingml}/drawing-fill.d.ts +3 -3
  112. package/dist/drawingml/drawing-fill.d.ts.map +1 -0
  113. package/dist/{diagram → drawingml}/drawing-geometry.d.ts +4 -4
  114. package/dist/drawingml/drawing-geometry.d.ts.map +1 -0
  115. package/dist/drawingml/drawing-shadow.d.ts.map +1 -0
  116. package/dist/{diagram → drawingml}/drawing-text.d.ts +2 -2
  117. package/dist/drawingml/drawing-text.d.ts.map +1 -0
  118. package/dist/{diagram → drawingml}/gradient-geometry.d.ts +2 -2
  119. package/dist/drawingml/gradient-geometry.d.ts.map +1 -0
  120. package/dist/drawingml/gradient-preset-data.d.ts.map +1 -0
  121. package/dist/{diagram → drawingml}/gradient-presets.d.ts +3 -3
  122. package/dist/drawingml/gradient-presets.d.ts.map +1 -0
  123. package/dist/drawingml/index.cjs +1545 -0
  124. package/dist/drawingml/index.d.ts +19 -0
  125. package/dist/drawingml/index.d.ts.map +1 -0
  126. package/dist/drawingml/index.mjs +1497 -0
  127. package/dist/{diagram → drawingml}/ordered-color-transforms.d.ts +2 -2
  128. package/dist/drawingml/ordered-color-transforms.d.ts.map +1 -0
  129. package/dist/drawingml/rect-path-gradient.d.ts.map +1 -0
  130. package/dist/drawingml/theme-color.d.ts +19 -0
  131. package/dist/drawingml/theme-color.d.ts.map +1 -0
  132. package/dist/drawingml/theme-model.d.ts +40 -0
  133. package/dist/drawingml/theme-model.d.ts.map +1 -0
  134. package/dist/drawingml/theme.d.ts +21 -0
  135. package/dist/drawingml/theme.d.ts.map +1 -0
  136. package/dist/drawingml/types.d.ts +152 -0
  137. package/dist/drawingml/types.d.ts.map +1 -0
  138. package/dist/drawingml/write-color.d.ts +4 -0
  139. package/dist/drawingml/write-color.d.ts.map +1 -0
  140. package/dist/{diagram → drawingml}/write-fill.d.ts +2 -2
  141. package/dist/drawingml/write-fill.d.ts.map +1 -0
  142. package/dist/geometry/connector-elbow-geometry.d.ts +14 -0
  143. package/dist/geometry/connector-elbow-geometry.d.ts.map +1 -1
  144. package/dist/geometry/index.cjs +43 -0
  145. package/dist/geometry/index.mjs +42 -1
  146. package/dist/i18n/dictionary.d.ts +13 -0
  147. package/dist/i18n/dictionary.d.ts.map +1 -0
  148. package/dist/i18n/index.cjs +68 -0
  149. package/dist/i18n/index.d.ts +4 -0
  150. package/dist/i18n/index.d.ts.map +1 -0
  151. package/dist/i18n/index.mjs +60 -0
  152. package/dist/i18n/locale.d.ts +17 -0
  153. package/dist/i18n/locale.d.ts.map +1 -0
  154. package/dist/i18n/translator.d.ts +18 -0
  155. package/dist/i18n/translator.d.ts.map +1 -0
  156. package/dist/index.cjs +3712 -2178
  157. package/dist/index.d.ts +2 -0
  158. package/dist/index.d.ts.map +1 -1
  159. package/dist/index.mjs +3711 -2179
  160. package/dist/pptx/automation/index.cjs +2852 -1568
  161. package/dist/pptx/automation/index.d.ts +3 -3
  162. package/dist/pptx/automation/index.mjs +5 -5
  163. package/dist/pptx/chunks/{index-C4mfzVoY.d.ts → index-BHqL5KXH.d.ts} +2 -2
  164. package/dist/pptx/chunks/{index-C4mfzVoY.d.ts.map → index-BHqL5KXH.d.ts.map} +1 -1
  165. package/dist/pptx/chunks/{index-lk7dyOPS.d.ts → index-BYkdcS8J.d.ts} +12 -16
  166. package/dist/pptx/chunks/index-BYkdcS8J.d.ts.map +1 -0
  167. package/dist/pptx/chunks/smart-art-CO2jmJFf.d.ts.map +1 -1
  168. package/dist/pptx/chunks/{text-operations-CDLx4hD5.d.ts → text-operations-DEJ7alZR.d.ts} +2 -2
  169. package/dist/pptx/chunks/text-operations-DEJ7alZR.d.ts.map +1 -0
  170. package/dist/pptx/cli/index.cjs +2680 -1396
  171. package/dist/pptx/cli/index.d.ts +1 -1
  172. package/dist/pptx/cli/index.mjs +4 -4
  173. package/dist/pptx/converter/index.d.ts +1 -1
  174. package/dist/pptx/converter/index.mjs +2 -2
  175. package/dist/pptx/index.cjs +1771 -1756
  176. package/dist/pptx/index.d.ts +3 -3
  177. package/dist/pptx/index.mjs +5 -5
  178. package/dist/teams/index.cjs +144 -74
  179. package/dist/teams/index.mjs +144 -74
  180. package/dist/visio/ui/index.cjs +14 -3
  181. package/dist/visio/ui/index.mjs +14 -3
  182. package/dist/visio/ui/shape-rotation.d.ts +1 -1
  183. package/dist/visio/ui/shape-rotation.d.ts.map +1 -1
  184. package/dist/xlsx/edit/chart-series-gradient.d.ts +1 -1
  185. package/dist/xlsx/edit/chart-series-gradient.d.ts.map +1 -1
  186. package/dist/xlsx/edit/protection.d.ts +1 -1
  187. package/dist/xlsx/index.cjs +3222 -1886
  188. package/dist/xlsx/index.mjs +3222 -1886
  189. package/dist/xlsx/layout/chart-appearance.d.ts +1 -1
  190. package/dist/xlsx/layout/chart-appearance.d.ts.map +1 -1
  191. package/dist/xlsx/layout/chart-scale.d.ts +5 -1
  192. package/dist/xlsx/layout/chart-scale.d.ts.map +1 -1
  193. package/dist/xlsx/layout/chart-svg-legend.d.ts +13 -0
  194. package/dist/xlsx/layout/chart-svg-legend.d.ts.map +1 -0
  195. package/dist/xlsx/layout/chart-svg.d.ts.map +1 -1
  196. package/dist/xlsx/layout/chart-view.d.ts +3 -1
  197. package/dist/xlsx/layout/chart-view.d.ts.map +1 -1
  198. package/dist/xlsx/load/index.cjs +2110 -838
  199. package/dist/xlsx/load/index.mjs +2110 -838
  200. package/dist/xlsx/read/theme.d.ts +2 -4
  201. package/dist/xlsx/read/theme.d.ts.map +1 -1
  202. package/dist/xlsx/ui/index.cjs +2017 -771
  203. package/dist/xlsx/ui/index.mjs +2017 -771
  204. package/dist/xlsx/ui/locales/merge.d.ts +2 -1
  205. package/dist/xlsx/ui/locales/merge.d.ts.map +1 -1
  206. package/dist/xlsx/ui/localization.d.ts.map +1 -1
  207. package/dist/xlsx/write/theme.d.ts.map +1 -1
  208. package/package.json +11 -1
  209. package/dist/diagram/drawing-color-brightness.d.ts +0 -6
  210. package/dist/diagram/drawing-color-brightness.d.ts.map +0 -1
  211. package/dist/diagram/drawing-color-css.d.ts.map +0 -1
  212. package/dist/diagram/drawing-color.d.ts.map +0 -1
  213. package/dist/diagram/drawing-fill.d.ts.map +0 -1
  214. package/dist/diagram/drawing-geometry.d.ts.map +0 -1
  215. package/dist/diagram/drawing-shadow.d.ts.map +0 -1
  216. package/dist/diagram/drawing-text.d.ts.map +0 -1
  217. package/dist/diagram/gradient-geometry.d.ts.map +0 -1
  218. package/dist/diagram/gradient-preset-data.d.ts.map +0 -1
  219. package/dist/diagram/gradient-presets.d.ts.map +0 -1
  220. package/dist/diagram/ordered-color-transforms.d.ts.map +0 -1
  221. package/dist/diagram/rect-path-gradient.d.ts.map +0 -1
  222. package/dist/diagram/write-color.d.ts +0 -4
  223. package/dist/diagram/write-color.d.ts.map +0 -1
  224. package/dist/diagram/write-fill.d.ts.map +0 -1
  225. package/dist/pptx/chunks/index-lk7dyOPS.d.ts.map +0 -1
  226. package/dist/pptx/chunks/text-operations-CDLx4hD5.d.ts.map +0 -1
  227. /package/dist/{diagram → drawingml}/drawing-color-css.d.ts +0 -0
  228. /package/dist/{diagram → drawingml}/drawing-shadow.d.ts +0 -0
  229. /package/dist/{diagram → drawingml}/gradient-preset-data.d.ts +0 -0
  230. /package/dist/{diagram → drawingml}/rect-path-gradient.d.ts +0 -0
@@ -873,9 +873,101 @@ function isValidLanguageTag(value) {
873
873
  return /^(?:[A-Za-z]{2,8})(?:-[A-Za-z0-9]{1,8})*$/.test(value);
874
874
  }
875
875
 
876
- // docx/theme.ts
877
- var DRAWING_NS = "http://schemas.openxmlformats.org/drawingml/2006/main";
878
- var SCHEME_ORDER = [
876
+ // color/color-primitives.ts
877
+ function toHex(value) {
878
+ return Math.min(255, Math.max(0, Math.round(value))).toString(16).padStart(2, "0").toUpperCase();
879
+ }
880
+
881
+ // drawingml/dom.ts
882
+ function attributeReader(element) {
883
+ return (name) => {
884
+ if (!element) return void 0;
885
+ const direct = element.getAttribute(name);
886
+ if (direct !== null) return direct;
887
+ const attributes = element.attributes;
888
+ for (let index = 0; index < attributes.length; index++) {
889
+ const candidate = attributes.item(index);
890
+ if (candidate && candidate.localName === name) return candidate.value;
891
+ }
892
+ return void 0;
893
+ };
894
+ }
895
+ function stringAttribute(element, name) {
896
+ const value = attributeReader(element)(name)?.trim();
897
+ return value ? value : void 0;
898
+ }
899
+ function integerAttribute(element, name) {
900
+ const parsed = Number.parseInt(attributeReader(element)(name) ?? "", 10);
901
+ return Number.isFinite(parsed) ? parsed : void 0;
902
+ }
903
+ function booleanAttribute(element, name) {
904
+ const value = attributeReader(element)(name)?.trim().toLowerCase();
905
+ if (value === "1" || value === "true") return true;
906
+ if (value === "0" || value === "false") return false;
907
+ return void 0;
908
+ }
909
+ function descendants(root, local) {
910
+ const result = [];
911
+ const visit = (node) => {
912
+ for (const child3 of Array.from(node.childNodes)) {
913
+ if (!isElement(child3)) continue;
914
+ if (child3.localName === local) result.push(child3);
915
+ visit(child3);
916
+ }
917
+ };
918
+ visit(root);
919
+ return result;
920
+ }
921
+
922
+ // drawingml/drawing-color.ts
923
+ var COLOR_ELEMENTS = {
924
+ srgbClr: "srgb",
925
+ schemeClr: "scheme",
926
+ sysClr: "system",
927
+ prstClr: "preset",
928
+ scrgbClr: "scrgb",
929
+ hslClr: "hsl"
930
+ };
931
+ function colorValue(kind, element) {
932
+ const attribute = (name) => element.getAttribute(name) ?? "";
933
+ if (kind === "scrgb") return `${attribute("r")},${attribute("g")},${attribute("b")}`;
934
+ if (kind === "hsl") return `${attribute("hue")},${attribute("sat")},${attribute("lum")}`;
935
+ return attribute("val");
936
+ }
937
+ function parseDrawingColorIn(container) {
938
+ if (!container) return void 0;
939
+ for (const element of elements(container)) {
940
+ const kind = COLOR_ELEMENTS[element.localName];
941
+ if (!kind || element.namespaceURI && element.namespaceURI !== NS.a) continue;
942
+ return parseDrawingColor(element);
943
+ }
944
+ return void 0;
945
+ }
946
+ function parseDrawingColor(element) {
947
+ const kind = COLOR_ELEMENTS[element.localName];
948
+ if (!kind) return void 0;
949
+ const color = {
950
+ kind,
951
+ value: colorValue(kind, element),
952
+ transforms: elements(element).map((child3) => ({
953
+ name: child3.localName,
954
+ value: child3.getAttribute("val") ?? ""
955
+ }))
956
+ };
957
+ const fallback = kind === "system" ? element.getAttribute("lastClr") : null;
958
+ if (fallback) color.fallback = fallback;
959
+ return color;
960
+ }
961
+ function parseDrawingColorList(container) {
962
+ if (!container) return [];
963
+ return elements(container).flatMap((element) => {
964
+ const color = parseDrawingColor(element);
965
+ return color ? [color] : [];
966
+ });
967
+ }
968
+
969
+ // drawingml/theme-model.ts
970
+ var THEME_COLOR_SLOTS = [
879
971
  "dk1",
880
972
  "lt1",
881
973
  "dk2",
@@ -889,46 +981,89 @@ var SCHEME_ORDER = [
889
981
  "hlink",
890
982
  "folHlink"
891
983
  ];
892
- function drawingChild(parent, local) {
893
- if (!parent) return void 0;
894
- for (const node of Array.from(parent.childNodes)) {
895
- const element = node;
896
- if (element.nodeType === 1 && element.localName === local && element.namespaceURI === DRAWING_NS)
897
- return element;
984
+
985
+ // drawingml/theme.ts
986
+ new Set(THEME_COLOR_SLOTS);
987
+ function nonEmpty(value) {
988
+ return value ? value : void 0;
989
+ }
990
+ function parseThemeColorScheme(scheme) {
991
+ const result = { colors: {} };
992
+ if (!scheme) return result;
993
+ const name = nonEmpty(scheme.getAttribute("name"));
994
+ if (name) result.name = name;
995
+ for (const slot2 of THEME_COLOR_SLOTS) {
996
+ const color = parseDrawingColorIn(first(scheme, slot2, NS.a));
997
+ if (color) result.colors[slot2] = color;
898
998
  }
899
- return void 0;
999
+ return result;
900
1000
  }
901
- function colorOf(slot2) {
902
- const srgb = drawingChild(slot2, "srgbClr");
903
- if (srgb) return srgb.getAttribute("val")?.toUpperCase() || void 0;
904
- const sys = drawingChild(slot2, "sysClr");
905
- if (sys) return sys.getAttribute("lastClr")?.toUpperCase() || void 0;
906
- return void 0;
1001
+ function parseFontCollection(collection) {
1002
+ const result = { scripts: {} };
1003
+ if (!collection) return result;
1004
+ const typeface = (local) => nonEmpty(first(collection, local, NS.a)?.getAttribute("typeface"));
1005
+ const latin = typeface("latin");
1006
+ const eastAsia = typeface("ea");
1007
+ const complexScript = typeface("cs");
1008
+ if (latin) result.latin = latin;
1009
+ if (eastAsia) result.eastAsia = eastAsia;
1010
+ if (complexScript) result.complexScript = complexScript;
1011
+ for (const font of elements(collection)) {
1012
+ if (font.localName !== "font") continue;
1013
+ const script = nonEmpty(font.getAttribute("script"));
1014
+ const face = nonEmpty(font.getAttribute("typeface"));
1015
+ if (script && face && !Object.hasOwn(result.scripts, script)) result.scripts[script] = face;
1016
+ }
1017
+ return result;
907
1018
  }
908
- function fontSetOf(element) {
909
- if (!element) return {};
910
- const latin = drawingChild(element, "latin")?.getAttribute("typeface") || void 0;
911
- const ea = drawingChild(element, "ea")?.getAttribute("typeface") || void 0;
912
- const cs = drawingChild(element, "cs")?.getAttribute("typeface") || void 0;
1019
+ function parseThemeFontScheme(scheme) {
1020
+ const result = {
1021
+ major: parseFontCollection(first(scheme, "majorFont", NS.a)),
1022
+ minor: parseFontCollection(first(scheme, "minorFont", NS.a))
1023
+ };
1024
+ const name = nonEmpty(scheme?.getAttribute("name"));
1025
+ if (name) result.name = name;
1026
+ return result;
1027
+ }
1028
+ function rootOf(source) {
1029
+ return "documentElement" in source ? source.documentElement : source;
1030
+ }
1031
+ function parseTheme(source) {
1032
+ const root = rootOf(source);
1033
+ const holder = first(root, "themeElements", NS.a) ?? root;
1034
+ const theme = {
1035
+ colorScheme: parseThemeColorScheme(first(holder, "clrScheme", NS.a)),
1036
+ fontScheme: parseThemeFontScheme(first(holder, "fontScheme", NS.a))
1037
+ };
1038
+ const name = nonEmpty(root.getAttribute("name"));
1039
+ if (name) theme.name = name;
1040
+ return theme;
1041
+ }
1042
+
1043
+ // drawingml/theme-color.ts
1044
+ function themeSlotHex(color) {
1045
+ if (!color) return void 0;
1046
+ const value = color.kind === "srgb" ? color.value : color.kind === "system" ? color.fallback : void 0;
1047
+ return value ? value.toUpperCase() : void 0;
1048
+ }
1049
+
1050
+ // docx/theme.ts
1051
+ function fontSetOf(collection) {
1052
+ const { latin, eastAsia, complexScript } = collection;
913
1053
  return {
914
1054
  ...latin ? { latin } : {},
915
- ...ea ? { eastAsia: ea } : {},
916
- ...cs ? { complexScript: cs } : {}
1055
+ ...eastAsia ? { eastAsia } : {},
1056
+ ...complexScript ? { complexScript } : {}
917
1057
  };
918
1058
  }
919
- function parseTheme(xml) {
920
- const document = parseXml2(xml);
921
- const root = document.documentElement;
922
- const clrScheme = Array.from(root.getElementsByTagNameNS(DRAWING_NS, "clrScheme"))[0];
1059
+ function parseTheme2(xml) {
1060
+ const theme = parseTheme(parseXml2(xml));
923
1061
  const colors = {};
924
- for (const slotName of SCHEME_ORDER) {
925
- const slot2 = drawingChild(clrScheme, slotName);
926
- const value = colorOf(slot2);
927
- if (value) colors[slotName] = value;
928
- }
929
- const fontScheme = Array.from(root.getElementsByTagNameNS(DRAWING_NS, "fontScheme"))[0];
930
- const major = drawingChild(fontScheme, "majorFont");
931
- const minor = drawingChild(fontScheme, "minorFont");
1062
+ for (const slot2 of THEME_COLOR_SLOTS) {
1063
+ const value = themeSlotHex(theme.colorScheme.colors[slot2]);
1064
+ if (value) colors[slot2] = value;
1065
+ }
1066
+ const { major, minor } = theme.fontScheme;
932
1067
  return { colors, colorMapping: {}, fonts: { major: fontSetOf(major), minor: fontSetOf(minor) } };
933
1068
  }
934
1069
  var MAPPING_KEYS = ["bg1", "tx1", "bg2", "tx2"];
@@ -966,9 +1101,6 @@ function parseColorSchemeMapping(xml) {
966
1101
  function isThemeColorToken(value) {
967
1102
  return isStThemeColor(value);
968
1103
  }
969
- function toHex(value) {
970
- return Math.min(255, Math.max(0, Math.round(value))).toString(16).padStart(2, "0").toUpperCase();
971
- }
972
1104
  function fractionToThemeByte(fraction) {
973
1105
  return toHex(Math.round(Math.min(1, Math.max(0, fraction)) * 255));
974
1106
  }
@@ -3004,7 +3136,7 @@ var NAMED = {
3004
3136
  var POINT_TO_PX = 96 / 72;
3005
3137
  var WATERMARK_PREFIX = "PowerPlusWaterMarkObject";
3006
3138
  var DEFAULT_WATERMARK_COLOR = "#c0c0c0";
3007
- function colorOf2(value) {
3139
+ function colorOf(value) {
3008
3140
  const text = (value ?? "").trim().toLowerCase().split(/\s/)[0] ?? "";
3009
3141
  if (NAMED[text]) return NAMED[text];
3010
3142
  const hex = /^#?([0-9a-f]{6})$/.exec(text);
@@ -3025,7 +3157,7 @@ function parseWatermarkShape(shape) {
3025
3157
  const rotation = /rotation:\s*(-?[\d.]+)/i.exec(style);
3026
3158
  const spec = {
3027
3159
  text: path.getAttribute("string") ?? "",
3028
- color: colorOf2(shape.getAttribute("fillcolor")),
3160
+ color: colorOf(shape.getAttribute("fillcolor")),
3029
3161
  semitransparent: opacity !== null && opacity !== "" && opacity !== "1",
3030
3162
  layout: rotation && Math.abs(Number(rotation[1]) % 360) > 1 ? "diagonal" : "horizontal",
3031
3163
  ...family ? { fontFamily: family.trim() } : {}
@@ -3137,7 +3269,7 @@ var add = (parent, ...items) => {
3137
3269
  return parent;
3138
3270
  };
3139
3271
  var emu = (px2) => String(Math.max(1, Math.round(px2 * EMU_PER_PIXEL)));
3140
- var descendants = (root, ns, local) => Array.from(root.getElementsByTagNameNS(ns, local));
3272
+ var descendants2 = (root, ns, local) => Array.from(root.getElementsByTagNameNS(ns, local));
3141
3273
  function paragraphsFor(doc, lines) {
3142
3274
  return (lines.length ? lines : [""]).map((line) => {
3143
3275
  const paragraph = makeW(doc, "p");
@@ -3229,23 +3361,23 @@ function buildTextBoxDrawing(doc, image, docPrId) {
3229
3361
  }
3230
3362
  function isSimpleTextBox(graphicData, anchored) {
3231
3363
  if (!graphicData || anchored) return false;
3232
- const content = descendants(graphicData, W_NS, "txbxContent")[0];
3364
+ const content = descendants2(graphicData, W_NS, "txbxContent")[0];
3233
3365
  if (!content) return false;
3234
3366
  const plain = (node, allowed) => Array.from(node.childNodes).filter(isElement).every((child3) => child3.namespaceURI === W_NS && allowed.includes(child3.localName));
3235
- return plain(content, ["p"]) && descendants(content, W_NS, "p").every(
3236
- (paragraph) => plain(paragraph, ["r"]) && descendants(paragraph, W_NS, "r").every((run) => plain(run, ["t"]))
3367
+ return plain(content, ["p"]) && descendants2(content, W_NS, "p").every(
3368
+ (paragraph) => plain(paragraph, ["r"]) && descendants2(paragraph, W_NS, "r").every((run) => plain(run, ["t"]))
3237
3369
  );
3238
3370
  }
3239
3371
  function textBoxHasBorder(graphicData) {
3240
- const spPr = graphicData && descendants(graphicData, WPS_NS, "spPr")[0];
3372
+ const spPr = graphicData && descendants2(graphicData, WPS_NS, "spPr")[0];
3241
3373
  const ln = spPr && Array.from(spPr.getElementsByTagNameNS(A_NS, "ln"))[0];
3242
3374
  return Boolean(ln && !ln.getElementsByTagNameNS(A_NS, "noFill").length);
3243
3375
  }
3244
3376
  function patchTextBox(doc, drawing, image, base) {
3245
3377
  if (image.widthPx !== base.widthPx || image.heightPx !== base.heightPx)
3246
3378
  for (const node of [
3247
- ...descendants(drawing, WP_NS, "extent"),
3248
- ...descendants(drawing, A_NS, "ext").filter(
3379
+ ...descendants2(drawing, WP_NS, "extent"),
3380
+ ...descendants2(drawing, A_NS, "ext").filter(
3249
3381
  (ext) => ext.parentNode?.localName === "xfrm"
3250
3382
  )
3251
3383
  ]) {
@@ -3253,14 +3385,14 @@ function patchTextBox(doc, drawing, image, base) {
3253
3385
  node.setAttribute("cy", emu(image.heightPx));
3254
3386
  }
3255
3387
  if (JSON.stringify(image.textBoxText) !== JSON.stringify(base.textBoxText)) {
3256
- const content = descendants(drawing, W_NS, "txbxContent")[0];
3388
+ const content = descendants2(drawing, W_NS, "txbxContent")[0];
3257
3389
  if (content) {
3258
3390
  for (const child3 of Array.from(content.childNodes)) content.removeChild(child3);
3259
3391
  add(content, ...paragraphsFor(doc, image.textBoxText ?? []));
3260
3392
  }
3261
3393
  }
3262
3394
  if (image.textBoxBorder !== false !== (base.textBoxBorder !== false)) {
3263
- const spPr = descendants(drawing, WPS_NS, "spPr")[0];
3395
+ const spPr = descendants2(drawing, WPS_NS, "spPr")[0];
3264
3396
  if (spPr) {
3265
3397
  for (const old of Array.from(spPr.childNodes).filter(
3266
3398
  (node) => isElement(node) && node.localName === "ln"
@@ -3423,47 +3555,6 @@ var DIAGRAM_RELATIONSHIP_TYPES = {
3423
3555
  drawing: RELATIONSHIP_TYPES.diagramDrawing
3424
3556
  };
3425
3557
 
3426
- // diagram/dom.ts
3427
- function attributeReader(element) {
3428
- return (name) => {
3429
- if (!element) return void 0;
3430
- const direct = element.getAttribute(name);
3431
- if (direct !== null) return direct;
3432
- const attributes = element.attributes;
3433
- for (let index = 0; index < attributes.length; index++) {
3434
- const candidate = attributes.item(index);
3435
- if (candidate && candidate.localName === name) return candidate.value;
3436
- }
3437
- return void 0;
3438
- };
3439
- }
3440
- function stringAttribute(element, name) {
3441
- const value = attributeReader(element)(name)?.trim();
3442
- return value ? value : void 0;
3443
- }
3444
- function integerAttribute(element, name) {
3445
- const parsed = Number.parseInt(attributeReader(element)(name) ?? "", 10);
3446
- return Number.isFinite(parsed) ? parsed : void 0;
3447
- }
3448
- function booleanAttribute(element, name) {
3449
- const value = attributeReader(element)(name)?.trim().toLowerCase();
3450
- if (value === "1" || value === "true") return true;
3451
- if (value === "0" || value === "false") return false;
3452
- return void 0;
3453
- }
3454
- function descendants2(root, local) {
3455
- const result = [];
3456
- const visit = (node) => {
3457
- for (const child3 of Array.from(node.childNodes)) {
3458
- if (!isElement(child3)) continue;
3459
- if (child3.localName === local) result.push(child3);
3460
- visit(child3);
3461
- }
3462
- };
3463
- visit(root);
3464
- return result;
3465
- }
3466
-
3467
3558
  // diagram/data-model.ts
3468
3559
  var TRANSITION_TYPES = /* @__PURE__ */ new Set(["parTrans", "sibTrans"]);
3469
3560
  var STRUCTURAL_TYPES = /* @__PURE__ */ new Set(["doc", "pres", "parTrans", "sibTrans"]);
@@ -3487,7 +3578,7 @@ function connectionLabel(connection, transitionText) {
3487
3578
  function textBodyParagraphs(body) {
3488
3579
  if (!body) return [];
3489
3580
  return children(body, "p", NS.a).map(
3490
- (paragraph) => descendants2(paragraph, "t").map((run) => run.textContent ?? "").join("")
3581
+ (paragraph) => descendants(paragraph, "t").map((run) => run.textContent ?? "").join("")
3491
3582
  );
3492
3583
  }
3493
3584
  function parsePoint(element) {
@@ -3567,7 +3658,7 @@ function parseDiagramDataModel(source, part) {
3567
3658
  if ((!connection.type || connection.type === "parOf") && !parentById.has(connection.destId))
3568
3659
  parentById.set(connection.destId, connection.sourceId);
3569
3660
  }
3570
- const ext = descendants2(root, "dataModelExt")[0];
3661
+ const ext = descendants(root, "dataModelExt")[0];
3571
3662
  const drawingRelId = stringAttribute(ext, "relId");
3572
3663
  return {
3573
3664
  points,
@@ -3579,55 +3670,8 @@ function parseDiagramDataModel(source, part) {
3579
3670
  };
3580
3671
  }
3581
3672
 
3582
- // diagram/drawing-color.ts
3583
- var COLOR_ELEMENTS = {
3584
- srgbClr: "srgb",
3585
- schemeClr: "scheme",
3586
- sysClr: "system",
3587
- prstClr: "preset",
3588
- scrgbClr: "scrgb",
3589
- hslClr: "hsl"
3590
- };
3591
- function colorValue(kind, element) {
3592
- const attribute = (name) => element.getAttribute(name) ?? "";
3593
- if (kind === "scrgb") return `${attribute("r")},${attribute("g")},${attribute("b")}`;
3594
- if (kind === "hsl") return `${attribute("hue")},${attribute("sat")},${attribute("lum")}`;
3595
- return attribute("val");
3596
- }
3597
- function parseDrawingColorIn(container) {
3598
- if (!container) return void 0;
3599
- for (const element of elements(container)) {
3600
- const kind = COLOR_ELEMENTS[element.localName];
3601
- if (!kind || element.namespaceURI && element.namespaceURI !== NS.a) continue;
3602
- return parseDrawingColor(element);
3603
- }
3604
- return void 0;
3605
- }
3606
- function parseDrawingColor(element) {
3607
- const kind = COLOR_ELEMENTS[element.localName];
3608
- if (!kind) return void 0;
3609
- const color = {
3610
- kind,
3611
- value: colorValue(kind, element),
3612
- transforms: elements(element).map((child3) => ({
3613
- name: child3.localName,
3614
- value: child3.getAttribute("val") ?? ""
3615
- }))
3616
- };
3617
- const fallback = kind === "system" ? element.getAttribute("lastClr") : null;
3618
- if (fallback) color.fallback = fallback;
3619
- return color;
3620
- }
3621
- function parseDrawingColorList(container) {
3622
- if (!container) return [];
3623
- return elements(container).flatMap((element) => {
3624
- const color = parseDrawingColor(element);
3625
- return color ? [color] : [];
3626
- });
3627
- }
3628
-
3629
3673
  // diagram/definitions.ts
3630
- var rootOf = (source) => (typeof source === "string" ? parseXml(source, { label: "DiagramML" }) : source).documentElement;
3674
+ var rootOf2 = (source) => (typeof source === "string" ? parseXml(source, { label: "DiagramML" }) : source).documentElement;
3631
3675
  function parseDefinitionHeader(root) {
3632
3676
  const header = {
3633
3677
  uniqueId: stringAttribute(root, "uniqueId") ?? "",
@@ -3648,7 +3692,7 @@ function colorList(container) {
3648
3692
  return { ...method ? { method } : {}, colors: parseDrawingColorList(container) };
3649
3693
  }
3650
3694
  function parseDiagramColors(source) {
3651
- const root = rootOf(source);
3695
+ const root = rootOf2(source);
3652
3696
  const labels = children(root, "styleLbl", NS.dgm).map((label) => ({
3653
3697
  name: stringAttribute(label, "name") ?? "",
3654
3698
  fill: colorList(first(label, "fillClrLst", NS.dgm)),
@@ -3688,7 +3732,7 @@ function parseStyleReferences(style) {
3688
3732
  }
3689
3733
  var hasContent = (element) => Boolean(element && (element.attributes.length > 0 || elements(element).length > 0));
3690
3734
  function parseDiagramQuickStyle(source) {
3691
- const root = rootOf(source);
3735
+ const root = rootOf2(source);
3692
3736
  const labels = children(root, "styleLbl", NS.dgm).map((label) => ({
3693
3737
  name: stringAttribute(label, "name") ?? "",
3694
3738
  ...parseStyleReferences(first(label, "style", NS.dgm)),
@@ -3702,7 +3746,7 @@ function parseDiagramQuickStyle(source) {
3702
3746
  };
3703
3747
  }
3704
3748
  function parseDiagramLayoutSummary(source) {
3705
- const root = rootOf(source);
3749
+ const root = rootOf2(source);
3706
3750
  const header = parseDefinitionHeader(root);
3707
3751
  const family = resolveDiagramLayoutCategory(
3708
3752
  header.uniqueId,
@@ -3714,11 +3758,11 @@ function parseDiagramLayoutSummary(source) {
3714
3758
  ...header,
3715
3759
  ...family ? { family } : {},
3716
3760
  ...rootAlgorithm ? { rootAlgorithm } : {},
3717
- layoutNodeCount: descendants2(root, "layoutNode").length
3761
+ layoutNodeCount: descendants(root, "layoutNode").length
3718
3762
  };
3719
3763
  }
3720
3764
 
3721
- // diagram/drawing-fill.ts
3765
+ // drawingml/drawing-fill.ts
3722
3766
  var FILL_ELEMENTS = /* @__PURE__ */ new Set([
3723
3767
  "noFill",
3724
3768
  "solidFill",
@@ -3810,7 +3854,7 @@ function parseDrawingLine(ln) {
3810
3854
  return line;
3811
3855
  }
3812
3856
 
3813
- // diagram/drawing-text.ts
3857
+ // drawingml/drawing-text.ts
3814
3858
  function parseSpacing(parent) {
3815
3859
  for (const [name, unit, divisor] of [
3816
3860
  ["spcPts", "points", 100],
@@ -3889,7 +3933,7 @@ function parseDrawingTextBody(body) {
3889
3933
  return result;
3890
3934
  }
3891
3935
 
3892
- // diagram/drawing-geometry.ts
3936
+ // drawingml/drawing-geometry.ts
3893
3937
  var int = (element, name) => Number.parseInt(element?.getAttribute(name) ?? "", 10);
3894
3938
  function parseFrame(container) {
3895
3939
  const off = first(container, "off", NS.a);
@@ -4691,6 +4735,23 @@ function parseRunPropertiesSnapshot(xml) {
4691
4735
  return parsePropertiesSnapshot(xml, "rPr");
4692
4736
  }
4693
4737
 
4738
+ // docx/field-flags.ts
4739
+ function parseFieldFlags(element) {
4740
+ const locked = onOffAttribute(element, "fldLock");
4741
+ const dirty = onOffAttribute(element, "dirty");
4742
+ if (locked === void 0 && dirty === void 0) return void 0;
4743
+ return { ...locked !== void 0 && { locked }, ...dirty !== void 0 && { dirty } };
4744
+ }
4745
+ function writeFieldFlags(element, flags) {
4746
+ for (const [name, value] of [
4747
+ ["fldLock", flags?.locked],
4748
+ ["dirty", flags?.dirty]
4749
+ ]) {
4750
+ if (value === void 0) element.removeAttributeNS(WORD_NS, name);
4751
+ else element.setAttributeNS(WORD_NS, `w:${name}`, value ? "true" : "false");
4752
+ }
4753
+ }
4754
+
4694
4755
  // docx/write-run.ts
4695
4756
  function setAttribute6(element, local, value) {
4696
4757
  element.setAttributeNS(WORD_NS, `w:${local}`, value);
@@ -4876,6 +4937,7 @@ function createRun(doc, run, base, old, allocator) {
4876
4937
  if (run.fieldChar) {
4877
4938
  const marker = makeW(doc, "fldChar");
4878
4939
  setAttribute6(marker, "fldCharType", run.fieldChar);
4940
+ writeFieldFlags(marker, run.fieldFlags);
4879
4941
  node.appendChild(marker);
4880
4942
  return node;
4881
4943
  }
@@ -4956,6 +5018,11 @@ function takeSimpleFieldCommentEdges(doc, runs, start, end, opens, closes) {
4956
5018
  after: take(closes, end - 1).reverse().flatMap((edge) => rangeEndNodes(doc, edge))
4957
5019
  };
4958
5020
  }
5021
+
5022
+ // docx/field-lock.ts
5023
+ function sameFieldFlags(a, b) {
5024
+ return a?.locked === b?.locked && a?.dirty === b?.dirty;
5025
+ }
4959
5026
  var MATH_NAMESPACES = /* @__PURE__ */ new Set([
4960
5027
  "http://schemas.openxmlformats.org/officeDocument/2006/math",
4961
5028
  "http://purl.oclc.org/ooxml/officeDocument/math"
@@ -5280,6 +5347,7 @@ function buildInlineContent(doc, runs, base, slots, allocator, ranges) {
5280
5347
  container = makeW(doc, "fldSimple");
5281
5348
  setW6(container, "instr", ` ${group.instr} `);
5282
5349
  }
5350
+ if (group.kind === "simpleField") writeFieldFlags(container, runAt(start).fieldFlags);
5283
5351
  const edges = group.kind === "simpleField" ? takeSimpleFieldCommentEdges(doc, runs, start, index, opens, closes) : { before: [], after: [] };
5284
5352
  for (let item = start; item < index; item++)
5285
5353
  for (const node of nodesFor(item)) container.appendChild(node);
@@ -5290,13 +5358,18 @@ function buildInlineContent(doc, runs, base, slots, allocator, ranges) {
5290
5358
  function containerGroup(run) {
5291
5359
  if (run.link) return { kind: "link", link: run.link };
5292
5360
  if (run.field?.simple)
5293
- return { kind: "simpleField", instr: run.field.instr, instanceId: run.fieldInstanceId };
5361
+ return {
5362
+ kind: "simpleField",
5363
+ instr: run.field.instr,
5364
+ instanceId: run.fieldInstanceId,
5365
+ fieldFlags: run.fieldFlags
5366
+ };
5294
5367
  return void 0;
5295
5368
  }
5296
5369
  function sameGroup(a, b) {
5297
5370
  if (!a || !b) return a === b;
5298
5371
  if (a.kind === "link" && b.kind === "link") return sameLink(a.link, b.link);
5299
- return a.kind === "simpleField" && b.kind === "simpleField" && a.instr === b.instr && a.instanceId === b.instanceId;
5372
+ return a.kind === "simpleField" && b.kind === "simpleField" && a.instr === b.instr && a.instanceId === b.instanceId && sameFieldFlags(a.fieldFlags, b.fieldFlags);
5300
5373
  }
5301
5374
 
5302
5375
  // docx/paragraph-properties.ts
@@ -6220,6 +6293,217 @@ async function registerNumberingPart(zip) {
6220
6293
  zip.file(relsPath, buildXml(relsDoc));
6221
6294
  }
6222
6295
 
6296
+ // docx/numbering-parse.ts
6297
+ var integer2 = (value, fallback) => parseInteger(value) ?? fallback;
6298
+ var flag = (element) => onOffElement(element) === true;
6299
+ function byName(root, local) {
6300
+ return Array.from(root.getElementsByTagName("*")).filter(
6301
+ (node) => node.nodeType === 1 && named2(node, local)
6302
+ );
6303
+ }
6304
+ function parseMarkerFormat(rPr) {
6305
+ if (!rPr) return void 0;
6306
+ const format = {};
6307
+ const family = getW(first2(rPr, "rFonts"), "ascii");
6308
+ if (family) format.fontFamily = family;
6309
+ const size = parseInteger(getW(first2(rPr, "sz"), "val"));
6310
+ if (size !== void 0 && size > 0) format.fontSizeHalfPoints = size;
6311
+ if (onOffElement(first2(rPr, "b")) === true) format.bold = true;
6312
+ if (onOffElement(first2(rPr, "i")) === true) format.italic = true;
6313
+ const color = getW(first2(rPr, "color"), "val");
6314
+ if (color && /^[0-9a-f]{6}$/i.test(color)) format.color = `#${color.toLowerCase()}`;
6315
+ return Object.keys(format).length ? format : void 0;
6316
+ }
6317
+ function parseNumberingLevel(lvl) {
6318
+ const level = integer2(getW(lvl, "ilvl"), 0);
6319
+ const start = integer2(getW(first2(lvl, "start"), "val"), 1);
6320
+ const numFmt = enumValue(isStNumberFormat, getW(first2(lvl, "numFmt"), "val"), "w:numFmt") ?? "decimal";
6321
+ const lvlText = getW(first2(lvl, "lvlText"), "val") ?? "";
6322
+ const jc = getW(first2(lvl, "lvlJc"), "val");
6323
+ const ind = first2(first2(lvl, "pPr"), "ind");
6324
+ const suffRaw = getW(first2(lvl, "suff"), "val");
6325
+ const result = { level, start, numFmt, lvlText };
6326
+ if (!first2(lvl, "start")) result.startWasOmitted = true;
6327
+ const paragraphStyleId = getW(first2(lvl, "pStyle"), "val");
6328
+ if (paragraphStyleId) result.paragraphStyleId = paragraphStyleId;
6329
+ if (jc === "left" || jc === "center" || jc === "right") result.lvlJc = jc;
6330
+ const left = getW(ind, "left") ?? getW(ind, "start");
6331
+ if (left !== void 0) result.indentLeftTwips = parseSignedTwips(left) ?? signedTwips(0);
6332
+ const hanging = getW(ind, "hanging");
6333
+ if (hanging !== void 0) result.hangingTwips = parseTwips(hanging) ?? twips(0);
6334
+ const firstLine = getW(ind, "firstLine");
6335
+ if (firstLine !== void 0) result.firstLineTwips = parseTwips(firstLine) ?? twips(0);
6336
+ const tabs = first2(first2(lvl, "pPr"), "tabs");
6337
+ const tab = tabs ? children2(tabs, "tab").find((stop) => getW(stop, "val") !== "clear") : void 0;
6338
+ const tabPos = tab ? parseTwips(getW(tab, "pos")) : void 0;
6339
+ if (tabPos !== void 0) result.tabStopTwips = tabPos;
6340
+ if (flag(first2(lvl, "isLgl"))) result.isLgl = true;
6341
+ const restart = getW(first2(lvl, "lvlRestart"), "val");
6342
+ if (restart !== void 0) result.lvlRestart = integer2(restart, 0);
6343
+ const marker = parseMarkerFormat(first2(lvl, "rPr"));
6344
+ if (marker) result.markerFormat = marker;
6345
+ result.suffix = suffRaw === "space" ? "space" : suffRaw === "nothing" ? "none" : "tab";
6346
+ return result;
6347
+ }
6348
+ function parseAbstractNum(element) {
6349
+ const id = getW(element, "abstractNumId");
6350
+ if (!id) return void 0;
6351
+ const levels = {};
6352
+ for (const lvl of children2(element, "lvl")) {
6353
+ const parsed = parseNumberingLevel(lvl);
6354
+ levels[parsed.level] = parsed;
6355
+ }
6356
+ return { id, levels };
6357
+ }
6358
+ function parseNum(element) {
6359
+ const id = getW(element, "numId");
6360
+ if (!id) return void 0;
6361
+ const abstractNumId = getW(first2(element, "abstractNumId"), "val") ?? "";
6362
+ const levelOverrides = {};
6363
+ for (const override of children2(element, "lvlOverride")) {
6364
+ const level = integer2(getW(override, "ilvl"), 0);
6365
+ const entry = {};
6366
+ const startOverride = getW(first2(override, "startOverride"), "val");
6367
+ if (startOverride !== void 0) entry.startOverride = integer2(startOverride, 1);
6368
+ const lvl = first2(override, "lvl");
6369
+ if (lvl) entry.lvl = parseNumberingLevel(lvl);
6370
+ if (Object.keys(entry).length) levelOverrides[level] = entry;
6371
+ }
6372
+ return {
6373
+ id,
6374
+ abstractNumId,
6375
+ ...Object.keys(levelOverrides).length ? { levelOverrides } : {}
6376
+ };
6377
+ }
6378
+ function parseNumberingCatalog(xml) {
6379
+ const document = parseXml2(xml);
6380
+ const root = document.documentElement;
6381
+ const abstractNums = {};
6382
+ const warnings = [];
6383
+ for (const element of byName(root, "abstractNum")) {
6384
+ const parsed = parseAbstractNum(element);
6385
+ if (!parsed) continue;
6386
+ abstractNums[parsed.id] = parsed;
6387
+ const link = getW(first2(element, "numStyleLink"), "val");
6388
+ if (link)
6389
+ warnings.push(
6390
+ `Numbering definition abstractNum ${parsed.id} links to style "${link}"; style-linked numbering levels are not resolved.`
6391
+ );
6392
+ if (byName(element, "lvlPicBulletId").length)
6393
+ warnings.push(
6394
+ `Numbering definition abstractNum ${parsed.id} uses a picture bullet; picture bullets are not rendered.`
6395
+ );
6396
+ }
6397
+ const nums = {};
6398
+ for (const element of byName(root, "num")) {
6399
+ const parsed = parseNum(element);
6400
+ if (parsed) nums[parsed.id] = parsed;
6401
+ }
6402
+ return { abstractNums, nums, warnings: [...new Set(warnings)] };
6403
+ }
6404
+ function resolveNumberingLevel(catalog, numId, level) {
6405
+ const num = catalog.nums[numId];
6406
+ if (!num) return void 0;
6407
+ const override = num.levelOverrides?.[level];
6408
+ const sourceAbstract = catalog.abstractNums[num.abstractNumId]?.levels[level];
6409
+ const abstract = sourceAbstract?.startWasOmitted && sourceAbstract.start === 1 ? { ...sourceAbstract, start: 0 } : sourceAbstract;
6410
+ let base = override?.lvl ?? abstract;
6411
+ if (!base) return void 0;
6412
+ if (override?.lvl) {
6413
+ const { lvlRestart: _ignored, ...properties } = base;
6414
+ base = {
6415
+ ...properties,
6416
+ ...abstract?.lvlRestart !== void 0 ? { lvlRestart: abstract.lvlRestart } : {}
6417
+ };
6418
+ }
6419
+ let start = override?.startOverride ?? base.start;
6420
+ if (override?.lvl) {
6421
+ if (abstract?.lvlRestart === 0 && override.startOverride === void 0) start = abstract.start;
6422
+ else if (!override.lvl.startWasOmitted || override.lvl.start !== 1) start = override.lvl.start;
6423
+ else start = override.startOverride ?? 0;
6424
+ }
6425
+ return start !== base.start ? { ...base, start } : base;
6426
+ }
6427
+
6428
+ // docx/numbering-start-edit.ts
6429
+ function assertListStartValue(level, start) {
6430
+ if (!Number.isInteger(level) || level < 0 || level > 8)
6431
+ throw new Error("List level must be an integer from 0 through 8.");
6432
+ if (!Number.isInteger(start) || start < 0 || start > 2147483647)
6433
+ throw new Error("List start must be an integer from 0 through 2147483647.");
6434
+ }
6435
+
6436
+ // docx/numbering-start-patch.ts
6437
+ function withoutStarts(num) {
6438
+ const { levelOverrides, ...properties } = num;
6439
+ const kept = {};
6440
+ for (const [level, override] of Object.entries(levelOverrides ?? {})) {
6441
+ const { startOverride: _start, ...rest } = override;
6442
+ if (Object.keys(rest).length) kept[level] = rest;
6443
+ }
6444
+ return { ...properties, ...Object.keys(kept).length ? { levelOverrides: kept } : {} };
6445
+ }
6446
+ function numberingStartChanges(prior, next) {
6447
+ const changes = [];
6448
+ for (const [id, previous] of Object.entries(prior?.nums ?? {})) {
6449
+ const current = next.nums[id];
6450
+ if (!current || JSON.stringify(withoutStarts(current)) !== JSON.stringify(withoutStarts(previous)))
6451
+ throw new Error(
6452
+ `Cannot edit numbering definition num "${id}" except its supported start overrides.`
6453
+ );
6454
+ for (const key of /* @__PURE__ */ new Set([
6455
+ ...Object.keys(previous.levelOverrides ?? {}),
6456
+ ...Object.keys(current.levelOverrides ?? {})
6457
+ ])) {
6458
+ const level = Number(key);
6459
+ const old = previous.levelOverrides?.[level];
6460
+ const value = current.levelOverrides?.[level];
6461
+ if (old?.startOverride === value?.startOverride) continue;
6462
+ if (value?.startOverride === void 0)
6463
+ throw new Error("Removing a list start override is unsupported.");
6464
+ assertListStartValue(level, value.startOverride);
6465
+ if (String(level) !== key || !prior || !resolveNumberingLevel(prior, id, level))
6466
+ throw new Error("List instance or level does not exist.");
6467
+ if (old?.lvl || value.lvl)
6468
+ throw new Error("Changing starts with a full level override is unsupported.");
6469
+ changes.push({ numId: id, level, start: value.startOverride });
6470
+ }
6471
+ }
6472
+ return changes;
6473
+ }
6474
+ function patchNumberingStarts(doc, changes) {
6475
+ const sameNumber = (source, expected) => source !== void 0 && /^[+-]?\d+$/.test(source) && Number(source) === Number(expected);
6476
+ const prepared = changes.map((change) => {
6477
+ const nums = children2(doc.documentElement, "num").filter(
6478
+ (num2) => sameNumber(getW(num2, "numId"), change.numId)
6479
+ );
6480
+ if (nums.length !== 1 || getW(nums[0], "numId") !== change.numId)
6481
+ throw new Error("Cannot patch an ambiguous or missing source list instance.");
6482
+ const num = nums[0];
6483
+ const overrides = children2(num, "lvlOverride").filter(
6484
+ (node) => sameNumber(getW(node, "ilvl"), String(change.level))
6485
+ );
6486
+ if (overrides.length > 1) throw new Error("Cannot patch duplicate source level overrides.");
6487
+ const override = overrides[0];
6488
+ if (override && getW(override, "ilvl") !== String(change.level))
6489
+ throw new Error("Cannot patch a noncanonical source level override.");
6490
+ if (override && (children2(override, "lvl").length || children2(override, "startOverride").length > 1))
6491
+ throw new Error("Cannot patch a full or ambiguous source level override.");
6492
+ return { change, num, override };
6493
+ });
6494
+ for (const { change, num, override: existing } of prepared) {
6495
+ const override = existing ?? makeW(doc, "lvlOverride");
6496
+ if (!existing) {
6497
+ override.setAttributeNS(WORD_NS, "w:ilvl", String(change.level));
6498
+ const after = children2(num, "lvlOverride").at(-1) ?? children2(num, "abstractNumId")[0];
6499
+ num.insertBefore(override, after?.nextSibling ?? null);
6500
+ }
6501
+ const start = children2(override, "startOverride")[0] ?? makeW(doc, "startOverride");
6502
+ start.setAttributeNS(WORD_NS, "w:val", String(change.start));
6503
+ if (!start.parentNode) override.insertBefore(start, override.firstChild);
6504
+ }
6505
+ }
6506
+
6223
6507
  // docx/numbering-package.ts
6224
6508
  function setAttribute8(element, local, value) {
6225
6509
  element.setAttributeNS(WORD_NS, `w:${local}`, value);
@@ -6324,17 +6608,14 @@ async function applyNumberingCatalog(zip, model, binding) {
6324
6608
  throw new Error(
6325
6609
  `Cannot edit numbering definition abstractNum "${id}"; the original numbering.xml is preserved unchanged.`
6326
6610
  );
6327
- for (const id of Object.keys(prior?.nums ?? {}))
6328
- if (JSON.stringify(next.nums[id]) !== JSON.stringify(prior?.nums[id]))
6329
- throw new Error(
6330
- `Cannot edit numbering definition num "${id}"; the original numbering.xml is preserved unchanged.`
6331
- );
6611
+ const startChanges = numberingStartChanges(prior, next);
6332
6612
  const newAbstractIds = Object.keys(next.abstractNums).filter((id) => !prior?.abstractNums[id]);
6333
6613
  const newNumIds = Object.keys(next.nums).filter((id) => !prior?.nums[id]);
6334
- if (!newAbstractIds.length && !newNumIds.length) return;
6614
+ if (!newAbstractIds.length && !newNumIds.length && !startChanges.length) return;
6335
6615
  const existingFile = zip.file("word/numbering.xml");
6336
6616
  const doc = existingFile ? parseXml2(await existingFile.async("string")) : parseXml2(`<w:numbering xmlns:w="${WORD_NS}"/>`);
6337
6617
  const root = doc.documentElement;
6618
+ patchNumberingStarts(doc, startChanges);
6338
6619
  const cleanup = children2(root, "numIdMacAtCleanup")[0] ?? null;
6339
6620
  const firstNum = children2(root, "num")[0] ?? cleanup;
6340
6621
  for (const id of newAbstractIds) {
@@ -7200,23 +7481,31 @@ function createFieldTracker() {
7200
7481
  const stack = [];
7201
7482
  return (element, run) => {
7202
7483
  let resultInstr;
7484
+ let resultLocked;
7203
7485
  for (const child3 of Array.from(element.childNodes)) {
7204
7486
  if (!isElement(child3)) continue;
7205
7487
  if (named2(child3, "fldChar")) {
7206
7488
  const type = getW(child3, "fldCharType");
7207
- if (type === "begin") stack.push({ instr: "", inResult: false });
7208
- else if (type === "separate") {
7489
+ if (type === "begin") {
7490
+ const locked = parseFieldFlags(child3)?.locked;
7491
+ stack.push({ instr: "", inResult: false, ...locked !== void 0 && { locked } });
7492
+ } else if (type === "separate") {
7209
7493
  const top = stack.at(-1);
7210
7494
  if (top) top.inResult = true;
7211
7495
  } else if (type === "end") stack.pop();
7212
7496
  } else {
7213
7497
  const top = stack.at(-1);
7214
7498
  if (named2(child3, "instrText") && top && !top.inResult) top.instr += textContent(child3);
7215
- else if ((named2(child3, "t") || named2(child3, "delText")) && top?.inResult)
7499
+ else if ((named2(child3, "t") || named2(child3, "delText")) && top?.inResult) {
7216
7500
  resultInstr = top.instr.trim();
7501
+ resultLocked = top.locked;
7502
+ }
7217
7503
  }
7218
7504
  }
7219
- if (resultInstr) run.field = { instr: resultInstr };
7505
+ if (resultInstr) {
7506
+ run.field = { instr: resultInstr };
7507
+ if (resultLocked !== void 0) run.fieldFlags = { locked: resultLocked };
7508
+ }
7220
7509
  return run;
7221
7510
  };
7222
7511
  }
@@ -7227,7 +7516,11 @@ function storyFieldResults(container) {
7227
7516
  if (named2(element, "fldSimple") || named2(element, "txbxContent")) return;
7228
7517
  if (named2(element, "r")) {
7229
7518
  const run = trackField(element, { text: "" });
7230
- if (run.field) metadata.set(element, run.field);
7519
+ if (run.field)
7520
+ metadata.set(element, {
7521
+ field: run.field,
7522
+ ...run.fieldFlags && { fieldFlags: run.fieldFlags }
7523
+ });
7231
7524
  return;
7232
7525
  }
7233
7526
  for (const child3 of Array.from(element.childNodes)) if (isElement(child3)) visit(child3);
@@ -7319,7 +7612,11 @@ function parseRun2(node, revision) {
7319
7612
  if (breakKind) run.break = breakKind;
7320
7613
  if (noteReference) run.noteReference = noteReference;
7321
7614
  if (noteMark) run.noteMark = noteMark;
7322
- if (fieldChar) run.fieldChar = fieldChar;
7615
+ if (fieldChar) {
7616
+ run.fieldChar = fieldChar;
7617
+ const flags = parseFieldFlags(only);
7618
+ if (flags) run.fieldFlags = flags;
7619
+ }
7323
7620
  if (fieldCode !== void 0) run.fieldCode = fieldCode;
7324
7621
  const runRevision = revision ?? runFormatRevision(props);
7325
7622
  if (runRevision) run.revision = runRevision;
@@ -7338,8 +7635,11 @@ function parseParagraph2(node, id, fields) {
7338
7635
  (element, revision) => {
7339
7636
  const run = parseRun2(element, revision);
7340
7637
  if (!fields) return trackField(element, run);
7341
- const field = fields.get(element);
7342
- if (field) run.field = { ...field };
7638
+ const metadata = fields.get(element);
7639
+ if (metadata) {
7640
+ run.field = { ...metadata.field };
7641
+ if (metadata.fieldFlags) run.fieldFlags = { ...metadata.fieldFlags };
7642
+ }
7343
7643
  return run;
7344
7644
  },
7345
7645
  (item) => {
@@ -7361,20 +7661,23 @@ function parseParagraph2(node, id, fields) {
7361
7661
  );
7362
7662
  if (link) return results.map((run) => ({ ...run, link }));
7363
7663
  const field = { instr: instr.trim(), simple: true };
7664
+ const flags = parseFieldFlags(item);
7665
+ const fieldState = flags ? { fieldFlags: flags } : {};
7364
7666
  const fieldInstanceId = `${id}:simple-field-${simpleFieldIndex++}`;
7365
- if (!results.length) return [{ text: fieldPlaceholderText(instr), field, fieldInstanceId }];
7667
+ if (!results.length)
7668
+ return [{ text: fieldPlaceholderText(instr), field, fieldInstanceId, ...fieldState }];
7366
7669
  if (results.every(
7367
7670
  (run) => !run.text && !run.equation && !run.image && !run.break && !run.noteReference && !run.noteMark && !run.fieldChar && run.fieldCode === void 0
7368
7671
  )) {
7369
7672
  return [
7370
- { text: "", fieldChar: "begin" },
7673
+ { text: "", fieldChar: "begin", ...fieldState },
7371
7674
  { text: "", fieldCode: instr },
7372
7675
  { text: "", fieldChar: "separate" },
7373
7676
  ...results,
7374
7677
  { text: "", fieldChar: "end" }
7375
7678
  ];
7376
7679
  }
7377
- return results.map((run) => ({ ...run, field, fieldInstanceId }));
7680
+ return results.map((run) => ({ ...run, field, fieldInstanceId, ...fieldState }));
7378
7681
  },
7379
7682
  (hyperlink) => {
7380
7683
  if (!activeContext) return void 0;
@@ -7676,115 +7979,6 @@ async function parseDocumentParts(zip, body, blocks, drawings) {
7676
7979
  };
7677
7980
  }
7678
7981
 
7679
- // docx/numbering-parse.ts
7680
- var integer2 = (value, fallback) => parseInteger(value) ?? fallback;
7681
- var flag = (element) => onOffElement(element) === true;
7682
- function byName(root, local) {
7683
- return Array.from(root.getElementsByTagName("*")).filter(
7684
- (node) => node.nodeType === 1 && named2(node, local)
7685
- );
7686
- }
7687
- function parseMarkerFormat(rPr) {
7688
- if (!rPr) return void 0;
7689
- const format = {};
7690
- const family = getW(first2(rPr, "rFonts"), "ascii");
7691
- if (family) format.fontFamily = family;
7692
- const size = parseInteger(getW(first2(rPr, "sz"), "val"));
7693
- if (size !== void 0 && size > 0) format.fontSizeHalfPoints = size;
7694
- if (onOffElement(first2(rPr, "b")) === true) format.bold = true;
7695
- if (onOffElement(first2(rPr, "i")) === true) format.italic = true;
7696
- const color = getW(first2(rPr, "color"), "val");
7697
- if (color && /^[0-9a-f]{6}$/i.test(color)) format.color = `#${color.toLowerCase()}`;
7698
- return Object.keys(format).length ? format : void 0;
7699
- }
7700
- function parseNumberingLevel(lvl) {
7701
- const level = integer2(getW(lvl, "ilvl"), 0);
7702
- const start = integer2(getW(first2(lvl, "start"), "val"), 1);
7703
- const numFmt = enumValue(isStNumberFormat, getW(first2(lvl, "numFmt"), "val"), "w:numFmt") ?? "decimal";
7704
- const lvlText = getW(first2(lvl, "lvlText"), "val") ?? "";
7705
- const jc = getW(first2(lvl, "lvlJc"), "val");
7706
- const ind = first2(first2(lvl, "pPr"), "ind");
7707
- const suffRaw = getW(first2(lvl, "suff"), "val");
7708
- const result = { level, start, numFmt, lvlText };
7709
- if (!first2(lvl, "start")) result.startWasOmitted = true;
7710
- const paragraphStyleId = getW(first2(lvl, "pStyle"), "val");
7711
- if (paragraphStyleId) result.paragraphStyleId = paragraphStyleId;
7712
- if (jc === "left" || jc === "center" || jc === "right") result.lvlJc = jc;
7713
- const left = getW(ind, "left") ?? getW(ind, "start");
7714
- if (left !== void 0) result.indentLeftTwips = parseSignedTwips(left) ?? signedTwips(0);
7715
- const hanging = getW(ind, "hanging");
7716
- if (hanging !== void 0) result.hangingTwips = parseTwips(hanging) ?? twips(0);
7717
- const firstLine = getW(ind, "firstLine");
7718
- if (firstLine !== void 0) result.firstLineTwips = parseTwips(firstLine) ?? twips(0);
7719
- const tabs = first2(first2(lvl, "pPr"), "tabs");
7720
- const tab = tabs ? children2(tabs, "tab").find((stop) => getW(stop, "val") !== "clear") : void 0;
7721
- const tabPos = tab ? parseTwips(getW(tab, "pos")) : void 0;
7722
- if (tabPos !== void 0) result.tabStopTwips = tabPos;
7723
- if (flag(first2(lvl, "isLgl"))) result.isLgl = true;
7724
- const restart = getW(first2(lvl, "lvlRestart"), "val");
7725
- if (restart !== void 0) result.lvlRestart = integer2(restart, 0);
7726
- const marker = parseMarkerFormat(first2(lvl, "rPr"));
7727
- if (marker) result.markerFormat = marker;
7728
- result.suffix = suffRaw === "space" ? "space" : suffRaw === "nothing" ? "none" : "tab";
7729
- return result;
7730
- }
7731
- function parseAbstractNum(element) {
7732
- const id = getW(element, "abstractNumId");
7733
- if (!id) return void 0;
7734
- const levels = {};
7735
- for (const lvl of children2(element, "lvl")) {
7736
- const parsed = parseNumberingLevel(lvl);
7737
- levels[parsed.level] = parsed;
7738
- }
7739
- return { id, levels };
7740
- }
7741
- function parseNum(element) {
7742
- const id = getW(element, "numId");
7743
- if (!id) return void 0;
7744
- const abstractNumId = getW(first2(element, "abstractNumId"), "val") ?? "";
7745
- const levelOverrides = {};
7746
- for (const override of children2(element, "lvlOverride")) {
7747
- const level = integer2(getW(override, "ilvl"), 0);
7748
- const entry = {};
7749
- const startOverride = getW(first2(override, "startOverride"), "val");
7750
- if (startOverride !== void 0) entry.startOverride = integer2(startOverride, 1);
7751
- const lvl = first2(override, "lvl");
7752
- if (lvl) entry.lvl = parseNumberingLevel(lvl);
7753
- if (Object.keys(entry).length) levelOverrides[level] = entry;
7754
- }
7755
- return {
7756
- id,
7757
- abstractNumId,
7758
- ...Object.keys(levelOverrides).length ? { levelOverrides } : {}
7759
- };
7760
- }
7761
- function parseNumberingCatalog(xml) {
7762
- const document = parseXml2(xml);
7763
- const root = document.documentElement;
7764
- const abstractNums = {};
7765
- const warnings = [];
7766
- for (const element of byName(root, "abstractNum")) {
7767
- const parsed = parseAbstractNum(element);
7768
- if (!parsed) continue;
7769
- abstractNums[parsed.id] = parsed;
7770
- const link = getW(first2(element, "numStyleLink"), "val");
7771
- if (link)
7772
- warnings.push(
7773
- `Numbering definition abstractNum ${parsed.id} links to style "${link}"; style-linked numbering levels are not resolved.`
7774
- );
7775
- if (byName(element, "lvlPicBulletId").length)
7776
- warnings.push(
7777
- `Numbering definition abstractNum ${parsed.id} uses a picture bullet; picture bullets are not rendered.`
7778
- );
7779
- }
7780
- const nums = {};
7781
- for (const element of byName(root, "num")) {
7782
- const parsed = parseNum(element);
7783
- if (parsed) nums[parsed.id] = parsed;
7784
- }
7785
- return { abstractNums, nums, warnings: [...new Set(warnings)] };
7786
- }
7787
-
7788
7982
  // docx/comments.ts
7789
7983
  var W14_NS2 = "http://schemas.microsoft.com/office/word/2010/wordml";
7790
7984
  var W15_NS2 = "http://schemas.microsoft.com/office/word/2012/wordml";
@@ -8019,7 +8213,7 @@ async function readPackage(input) {
8019
8213
  const themeFile = zip.file("word/theme/theme1.xml");
8020
8214
  const settingsFile = zip.file("word/settings.xml");
8021
8215
  if (themeFile) {
8022
- model.theme = parseTheme(await themeFile.async("string"));
8216
+ model.theme = parseTheme2(await themeFile.async("string"));
8023
8217
  if (settingsFile) {
8024
8218
  const settingsXml = await settingsFile.async("string");
8025
8219
  model.theme.colorMapping = withParseWarnings(