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
@@ -867,9 +867,101 @@ function isValidLanguageTag(value) {
867
867
  return /^(?:[A-Za-z]{2,8})(?:-[A-Za-z0-9]{1,8})*$/.test(value);
868
868
  }
869
869
 
870
- // docx/theme.ts
871
- var DRAWING_NS = "http://schemas.openxmlformats.org/drawingml/2006/main";
872
- var SCHEME_ORDER = [
870
+ // color/color-primitives.ts
871
+ function toHex(value) {
872
+ return Math.min(255, Math.max(0, Math.round(value))).toString(16).padStart(2, "0").toUpperCase();
873
+ }
874
+
875
+ // drawingml/dom.ts
876
+ function attributeReader(element) {
877
+ return (name) => {
878
+ if (!element) return void 0;
879
+ const direct = element.getAttribute(name);
880
+ if (direct !== null) return direct;
881
+ const attributes = element.attributes;
882
+ for (let index = 0; index < attributes.length; index++) {
883
+ const candidate = attributes.item(index);
884
+ if (candidate && candidate.localName === name) return candidate.value;
885
+ }
886
+ return void 0;
887
+ };
888
+ }
889
+ function stringAttribute(element, name) {
890
+ const value = attributeReader(element)(name)?.trim();
891
+ return value ? value : void 0;
892
+ }
893
+ function integerAttribute(element, name) {
894
+ const parsed = Number.parseInt(attributeReader(element)(name) ?? "", 10);
895
+ return Number.isFinite(parsed) ? parsed : void 0;
896
+ }
897
+ function booleanAttribute(element, name) {
898
+ const value = attributeReader(element)(name)?.trim().toLowerCase();
899
+ if (value === "1" || value === "true") return true;
900
+ if (value === "0" || value === "false") return false;
901
+ return void 0;
902
+ }
903
+ function descendants(root, local) {
904
+ const result = [];
905
+ const visit = (node) => {
906
+ for (const child3 of Array.from(node.childNodes)) {
907
+ if (!isElement(child3)) continue;
908
+ if (child3.localName === local) result.push(child3);
909
+ visit(child3);
910
+ }
911
+ };
912
+ visit(root);
913
+ return result;
914
+ }
915
+
916
+ // drawingml/drawing-color.ts
917
+ var COLOR_ELEMENTS = {
918
+ srgbClr: "srgb",
919
+ schemeClr: "scheme",
920
+ sysClr: "system",
921
+ prstClr: "preset",
922
+ scrgbClr: "scrgb",
923
+ hslClr: "hsl"
924
+ };
925
+ function colorValue(kind, element) {
926
+ const attribute = (name) => element.getAttribute(name) ?? "";
927
+ if (kind === "scrgb") return `${attribute("r")},${attribute("g")},${attribute("b")}`;
928
+ if (kind === "hsl") return `${attribute("hue")},${attribute("sat")},${attribute("lum")}`;
929
+ return attribute("val");
930
+ }
931
+ function parseDrawingColorIn(container) {
932
+ if (!container) return void 0;
933
+ for (const element of elements(container)) {
934
+ const kind = COLOR_ELEMENTS[element.localName];
935
+ if (!kind || element.namespaceURI && element.namespaceURI !== NS.a) continue;
936
+ return parseDrawingColor(element);
937
+ }
938
+ return void 0;
939
+ }
940
+ function parseDrawingColor(element) {
941
+ const kind = COLOR_ELEMENTS[element.localName];
942
+ if (!kind) return void 0;
943
+ const color = {
944
+ kind,
945
+ value: colorValue(kind, element),
946
+ transforms: elements(element).map((child3) => ({
947
+ name: child3.localName,
948
+ value: child3.getAttribute("val") ?? ""
949
+ }))
950
+ };
951
+ const fallback = kind === "system" ? element.getAttribute("lastClr") : null;
952
+ if (fallback) color.fallback = fallback;
953
+ return color;
954
+ }
955
+ function parseDrawingColorList(container) {
956
+ if (!container) return [];
957
+ return elements(container).flatMap((element) => {
958
+ const color = parseDrawingColor(element);
959
+ return color ? [color] : [];
960
+ });
961
+ }
962
+
963
+ // drawingml/theme-model.ts
964
+ var THEME_COLOR_SLOTS = [
873
965
  "dk1",
874
966
  "lt1",
875
967
  "dk2",
@@ -883,46 +975,89 @@ var SCHEME_ORDER = [
883
975
  "hlink",
884
976
  "folHlink"
885
977
  ];
886
- function drawingChild(parent, local) {
887
- if (!parent) return void 0;
888
- for (const node of Array.from(parent.childNodes)) {
889
- const element = node;
890
- if (element.nodeType === 1 && element.localName === local && element.namespaceURI === DRAWING_NS)
891
- return element;
978
+
979
+ // drawingml/theme.ts
980
+ new Set(THEME_COLOR_SLOTS);
981
+ function nonEmpty(value) {
982
+ return value ? value : void 0;
983
+ }
984
+ function parseThemeColorScheme(scheme) {
985
+ const result = { colors: {} };
986
+ if (!scheme) return result;
987
+ const name = nonEmpty(scheme.getAttribute("name"));
988
+ if (name) result.name = name;
989
+ for (const slot2 of THEME_COLOR_SLOTS) {
990
+ const color = parseDrawingColorIn(first(scheme, slot2, NS.a));
991
+ if (color) result.colors[slot2] = color;
892
992
  }
893
- return void 0;
993
+ return result;
894
994
  }
895
- function colorOf(slot2) {
896
- const srgb = drawingChild(slot2, "srgbClr");
897
- if (srgb) return srgb.getAttribute("val")?.toUpperCase() || void 0;
898
- const sys = drawingChild(slot2, "sysClr");
899
- if (sys) return sys.getAttribute("lastClr")?.toUpperCase() || void 0;
900
- return void 0;
995
+ function parseFontCollection(collection) {
996
+ const result = { scripts: {} };
997
+ if (!collection) return result;
998
+ const typeface = (local) => nonEmpty(first(collection, local, NS.a)?.getAttribute("typeface"));
999
+ const latin = typeface("latin");
1000
+ const eastAsia = typeface("ea");
1001
+ const complexScript = typeface("cs");
1002
+ if (latin) result.latin = latin;
1003
+ if (eastAsia) result.eastAsia = eastAsia;
1004
+ if (complexScript) result.complexScript = complexScript;
1005
+ for (const font of elements(collection)) {
1006
+ if (font.localName !== "font") continue;
1007
+ const script = nonEmpty(font.getAttribute("script"));
1008
+ const face = nonEmpty(font.getAttribute("typeface"));
1009
+ if (script && face && !Object.hasOwn(result.scripts, script)) result.scripts[script] = face;
1010
+ }
1011
+ return result;
901
1012
  }
902
- function fontSetOf(element) {
903
- if (!element) return {};
904
- const latin = drawingChild(element, "latin")?.getAttribute("typeface") || void 0;
905
- const ea = drawingChild(element, "ea")?.getAttribute("typeface") || void 0;
906
- const cs = drawingChild(element, "cs")?.getAttribute("typeface") || void 0;
1013
+ function parseThemeFontScheme(scheme) {
1014
+ const result = {
1015
+ major: parseFontCollection(first(scheme, "majorFont", NS.a)),
1016
+ minor: parseFontCollection(first(scheme, "minorFont", NS.a))
1017
+ };
1018
+ const name = nonEmpty(scheme?.getAttribute("name"));
1019
+ if (name) result.name = name;
1020
+ return result;
1021
+ }
1022
+ function rootOf(source) {
1023
+ return "documentElement" in source ? source.documentElement : source;
1024
+ }
1025
+ function parseTheme(source) {
1026
+ const root = rootOf(source);
1027
+ const holder = first(root, "themeElements", NS.a) ?? root;
1028
+ const theme = {
1029
+ colorScheme: parseThemeColorScheme(first(holder, "clrScheme", NS.a)),
1030
+ fontScheme: parseThemeFontScheme(first(holder, "fontScheme", NS.a))
1031
+ };
1032
+ const name = nonEmpty(root.getAttribute("name"));
1033
+ if (name) theme.name = name;
1034
+ return theme;
1035
+ }
1036
+
1037
+ // drawingml/theme-color.ts
1038
+ function themeSlotHex(color) {
1039
+ if (!color) return void 0;
1040
+ const value = color.kind === "srgb" ? color.value : color.kind === "system" ? color.fallback : void 0;
1041
+ return value ? value.toUpperCase() : void 0;
1042
+ }
1043
+
1044
+ // docx/theme.ts
1045
+ function fontSetOf(collection) {
1046
+ const { latin, eastAsia, complexScript } = collection;
907
1047
  return {
908
1048
  ...latin ? { latin } : {},
909
- ...ea ? { eastAsia: ea } : {},
910
- ...cs ? { complexScript: cs } : {}
1049
+ ...eastAsia ? { eastAsia } : {},
1050
+ ...complexScript ? { complexScript } : {}
911
1051
  };
912
1052
  }
913
- function parseTheme(xml) {
914
- const document = parseXml2(xml);
915
- const root = document.documentElement;
916
- const clrScheme = Array.from(root.getElementsByTagNameNS(DRAWING_NS, "clrScheme"))[0];
1053
+ function parseTheme2(xml) {
1054
+ const theme = parseTheme(parseXml2(xml));
917
1055
  const colors = {};
918
- for (const slotName of SCHEME_ORDER) {
919
- const slot2 = drawingChild(clrScheme, slotName);
920
- const value = colorOf(slot2);
921
- if (value) colors[slotName] = value;
922
- }
923
- const fontScheme = Array.from(root.getElementsByTagNameNS(DRAWING_NS, "fontScheme"))[0];
924
- const major = drawingChild(fontScheme, "majorFont");
925
- const minor = drawingChild(fontScheme, "minorFont");
1056
+ for (const slot2 of THEME_COLOR_SLOTS) {
1057
+ const value = themeSlotHex(theme.colorScheme.colors[slot2]);
1058
+ if (value) colors[slot2] = value;
1059
+ }
1060
+ const { major, minor } = theme.fontScheme;
926
1061
  return { colors, colorMapping: {}, fonts: { major: fontSetOf(major), minor: fontSetOf(minor) } };
927
1062
  }
928
1063
  var MAPPING_KEYS = ["bg1", "tx1", "bg2", "tx2"];
@@ -960,9 +1095,6 @@ function parseColorSchemeMapping(xml) {
960
1095
  function isThemeColorToken(value) {
961
1096
  return isStThemeColor(value);
962
1097
  }
963
- function toHex(value) {
964
- return Math.min(255, Math.max(0, Math.round(value))).toString(16).padStart(2, "0").toUpperCase();
965
- }
966
1098
  function fractionToThemeByte(fraction) {
967
1099
  return toHex(Math.round(Math.min(1, Math.max(0, fraction)) * 255));
968
1100
  }
@@ -2998,7 +3130,7 @@ var NAMED = {
2998
3130
  var POINT_TO_PX = 96 / 72;
2999
3131
  var WATERMARK_PREFIX = "PowerPlusWaterMarkObject";
3000
3132
  var DEFAULT_WATERMARK_COLOR = "#c0c0c0";
3001
- function colorOf2(value) {
3133
+ function colorOf(value) {
3002
3134
  const text = (value ?? "").trim().toLowerCase().split(/\s/)[0] ?? "";
3003
3135
  if (NAMED[text]) return NAMED[text];
3004
3136
  const hex = /^#?([0-9a-f]{6})$/.exec(text);
@@ -3019,7 +3151,7 @@ function parseWatermarkShape(shape) {
3019
3151
  const rotation = /rotation:\s*(-?[\d.]+)/i.exec(style);
3020
3152
  const spec = {
3021
3153
  text: path.getAttribute("string") ?? "",
3022
- color: colorOf2(shape.getAttribute("fillcolor")),
3154
+ color: colorOf(shape.getAttribute("fillcolor")),
3023
3155
  semitransparent: opacity !== null && opacity !== "" && opacity !== "1",
3024
3156
  layout: rotation && Math.abs(Number(rotation[1]) % 360) > 1 ? "diagonal" : "horizontal",
3025
3157
  ...family ? { fontFamily: family.trim() } : {}
@@ -3131,7 +3263,7 @@ var add = (parent, ...items) => {
3131
3263
  return parent;
3132
3264
  };
3133
3265
  var emu = (px2) => String(Math.max(1, Math.round(px2 * EMU_PER_PIXEL)));
3134
- var descendants = (root, ns, local) => Array.from(root.getElementsByTagNameNS(ns, local));
3266
+ var descendants2 = (root, ns, local) => Array.from(root.getElementsByTagNameNS(ns, local));
3135
3267
  function paragraphsFor(doc, lines) {
3136
3268
  return (lines.length ? lines : [""]).map((line) => {
3137
3269
  const paragraph = makeW(doc, "p");
@@ -3223,23 +3355,23 @@ function buildTextBoxDrawing(doc, image, docPrId) {
3223
3355
  }
3224
3356
  function isSimpleTextBox(graphicData, anchored) {
3225
3357
  if (!graphicData || anchored) return false;
3226
- const content = descendants(graphicData, W_NS, "txbxContent")[0];
3358
+ const content = descendants2(graphicData, W_NS, "txbxContent")[0];
3227
3359
  if (!content) return false;
3228
3360
  const plain = (node, allowed) => Array.from(node.childNodes).filter(isElement).every((child3) => child3.namespaceURI === W_NS && allowed.includes(child3.localName));
3229
- return plain(content, ["p"]) && descendants(content, W_NS, "p").every(
3230
- (paragraph) => plain(paragraph, ["r"]) && descendants(paragraph, W_NS, "r").every((run) => plain(run, ["t"]))
3361
+ return plain(content, ["p"]) && descendants2(content, W_NS, "p").every(
3362
+ (paragraph) => plain(paragraph, ["r"]) && descendants2(paragraph, W_NS, "r").every((run) => plain(run, ["t"]))
3231
3363
  );
3232
3364
  }
3233
3365
  function textBoxHasBorder(graphicData) {
3234
- const spPr = graphicData && descendants(graphicData, WPS_NS, "spPr")[0];
3366
+ const spPr = graphicData && descendants2(graphicData, WPS_NS, "spPr")[0];
3235
3367
  const ln = spPr && Array.from(spPr.getElementsByTagNameNS(A_NS, "ln"))[0];
3236
3368
  return Boolean(ln && !ln.getElementsByTagNameNS(A_NS, "noFill").length);
3237
3369
  }
3238
3370
  function patchTextBox(doc, drawing, image, base) {
3239
3371
  if (image.widthPx !== base.widthPx || image.heightPx !== base.heightPx)
3240
3372
  for (const node of [
3241
- ...descendants(drawing, WP_NS, "extent"),
3242
- ...descendants(drawing, A_NS, "ext").filter(
3373
+ ...descendants2(drawing, WP_NS, "extent"),
3374
+ ...descendants2(drawing, A_NS, "ext").filter(
3243
3375
  (ext) => ext.parentNode?.localName === "xfrm"
3244
3376
  )
3245
3377
  ]) {
@@ -3247,14 +3379,14 @@ function patchTextBox(doc, drawing, image, base) {
3247
3379
  node.setAttribute("cy", emu(image.heightPx));
3248
3380
  }
3249
3381
  if (JSON.stringify(image.textBoxText) !== JSON.stringify(base.textBoxText)) {
3250
- const content = descendants(drawing, W_NS, "txbxContent")[0];
3382
+ const content = descendants2(drawing, W_NS, "txbxContent")[0];
3251
3383
  if (content) {
3252
3384
  for (const child3 of Array.from(content.childNodes)) content.removeChild(child3);
3253
3385
  add(content, ...paragraphsFor(doc, image.textBoxText ?? []));
3254
3386
  }
3255
3387
  }
3256
3388
  if (image.textBoxBorder !== false !== (base.textBoxBorder !== false)) {
3257
- const spPr = descendants(drawing, WPS_NS, "spPr")[0];
3389
+ const spPr = descendants2(drawing, WPS_NS, "spPr")[0];
3258
3390
  if (spPr) {
3259
3391
  for (const old of Array.from(spPr.childNodes).filter(
3260
3392
  (node) => isElement(node) && node.localName === "ln"
@@ -3417,47 +3549,6 @@ var DIAGRAM_RELATIONSHIP_TYPES = {
3417
3549
  drawing: RELATIONSHIP_TYPES.diagramDrawing
3418
3550
  };
3419
3551
 
3420
- // diagram/dom.ts
3421
- function attributeReader(element) {
3422
- return (name) => {
3423
- if (!element) return void 0;
3424
- const direct = element.getAttribute(name);
3425
- if (direct !== null) return direct;
3426
- const attributes = element.attributes;
3427
- for (let index = 0; index < attributes.length; index++) {
3428
- const candidate = attributes.item(index);
3429
- if (candidate && candidate.localName === name) return candidate.value;
3430
- }
3431
- return void 0;
3432
- };
3433
- }
3434
- function stringAttribute(element, name) {
3435
- const value = attributeReader(element)(name)?.trim();
3436
- return value ? value : void 0;
3437
- }
3438
- function integerAttribute(element, name) {
3439
- const parsed = Number.parseInt(attributeReader(element)(name) ?? "", 10);
3440
- return Number.isFinite(parsed) ? parsed : void 0;
3441
- }
3442
- function booleanAttribute(element, name) {
3443
- const value = attributeReader(element)(name)?.trim().toLowerCase();
3444
- if (value === "1" || value === "true") return true;
3445
- if (value === "0" || value === "false") return false;
3446
- return void 0;
3447
- }
3448
- function descendants2(root, local) {
3449
- const result = [];
3450
- const visit = (node) => {
3451
- for (const child3 of Array.from(node.childNodes)) {
3452
- if (!isElement(child3)) continue;
3453
- if (child3.localName === local) result.push(child3);
3454
- visit(child3);
3455
- }
3456
- };
3457
- visit(root);
3458
- return result;
3459
- }
3460
-
3461
3552
  // diagram/data-model.ts
3462
3553
  var TRANSITION_TYPES = /* @__PURE__ */ new Set(["parTrans", "sibTrans"]);
3463
3554
  var STRUCTURAL_TYPES = /* @__PURE__ */ new Set(["doc", "pres", "parTrans", "sibTrans"]);
@@ -3481,7 +3572,7 @@ function connectionLabel(connection, transitionText) {
3481
3572
  function textBodyParagraphs(body) {
3482
3573
  if (!body) return [];
3483
3574
  return children(body, "p", NS.a).map(
3484
- (paragraph) => descendants2(paragraph, "t").map((run) => run.textContent ?? "").join("")
3575
+ (paragraph) => descendants(paragraph, "t").map((run) => run.textContent ?? "").join("")
3485
3576
  );
3486
3577
  }
3487
3578
  function parsePoint(element) {
@@ -3561,7 +3652,7 @@ function parseDiagramDataModel(source, part) {
3561
3652
  if ((!connection.type || connection.type === "parOf") && !parentById.has(connection.destId))
3562
3653
  parentById.set(connection.destId, connection.sourceId);
3563
3654
  }
3564
- const ext = descendants2(root, "dataModelExt")[0];
3655
+ const ext = descendants(root, "dataModelExt")[0];
3565
3656
  const drawingRelId = stringAttribute(ext, "relId");
3566
3657
  return {
3567
3658
  points,
@@ -3573,55 +3664,8 @@ function parseDiagramDataModel(source, part) {
3573
3664
  };
3574
3665
  }
3575
3666
 
3576
- // diagram/drawing-color.ts
3577
- var COLOR_ELEMENTS = {
3578
- srgbClr: "srgb",
3579
- schemeClr: "scheme",
3580
- sysClr: "system",
3581
- prstClr: "preset",
3582
- scrgbClr: "scrgb",
3583
- hslClr: "hsl"
3584
- };
3585
- function colorValue(kind, element) {
3586
- const attribute = (name) => element.getAttribute(name) ?? "";
3587
- if (kind === "scrgb") return `${attribute("r")},${attribute("g")},${attribute("b")}`;
3588
- if (kind === "hsl") return `${attribute("hue")},${attribute("sat")},${attribute("lum")}`;
3589
- return attribute("val");
3590
- }
3591
- function parseDrawingColorIn(container) {
3592
- if (!container) return void 0;
3593
- for (const element of elements(container)) {
3594
- const kind = COLOR_ELEMENTS[element.localName];
3595
- if (!kind || element.namespaceURI && element.namespaceURI !== NS.a) continue;
3596
- return parseDrawingColor(element);
3597
- }
3598
- return void 0;
3599
- }
3600
- function parseDrawingColor(element) {
3601
- const kind = COLOR_ELEMENTS[element.localName];
3602
- if (!kind) return void 0;
3603
- const color = {
3604
- kind,
3605
- value: colorValue(kind, element),
3606
- transforms: elements(element).map((child3) => ({
3607
- name: child3.localName,
3608
- value: child3.getAttribute("val") ?? ""
3609
- }))
3610
- };
3611
- const fallback = kind === "system" ? element.getAttribute("lastClr") : null;
3612
- if (fallback) color.fallback = fallback;
3613
- return color;
3614
- }
3615
- function parseDrawingColorList(container) {
3616
- if (!container) return [];
3617
- return elements(container).flatMap((element) => {
3618
- const color = parseDrawingColor(element);
3619
- return color ? [color] : [];
3620
- });
3621
- }
3622
-
3623
3667
  // diagram/definitions.ts
3624
- var rootOf = (source) => (typeof source === "string" ? parseXml(source, { label: "DiagramML" }) : source).documentElement;
3668
+ var rootOf2 = (source) => (typeof source === "string" ? parseXml(source, { label: "DiagramML" }) : source).documentElement;
3625
3669
  function parseDefinitionHeader(root) {
3626
3670
  const header = {
3627
3671
  uniqueId: stringAttribute(root, "uniqueId") ?? "",
@@ -3642,7 +3686,7 @@ function colorList(container) {
3642
3686
  return { ...method ? { method } : {}, colors: parseDrawingColorList(container) };
3643
3687
  }
3644
3688
  function parseDiagramColors(source) {
3645
- const root = rootOf(source);
3689
+ const root = rootOf2(source);
3646
3690
  const labels = children(root, "styleLbl", NS.dgm).map((label) => ({
3647
3691
  name: stringAttribute(label, "name") ?? "",
3648
3692
  fill: colorList(first(label, "fillClrLst", NS.dgm)),
@@ -3682,7 +3726,7 @@ function parseStyleReferences(style) {
3682
3726
  }
3683
3727
  var hasContent = (element) => Boolean(element && (element.attributes.length > 0 || elements(element).length > 0));
3684
3728
  function parseDiagramQuickStyle(source) {
3685
- const root = rootOf(source);
3729
+ const root = rootOf2(source);
3686
3730
  const labels = children(root, "styleLbl", NS.dgm).map((label) => ({
3687
3731
  name: stringAttribute(label, "name") ?? "",
3688
3732
  ...parseStyleReferences(first(label, "style", NS.dgm)),
@@ -3696,7 +3740,7 @@ function parseDiagramQuickStyle(source) {
3696
3740
  };
3697
3741
  }
3698
3742
  function parseDiagramLayoutSummary(source) {
3699
- const root = rootOf(source);
3743
+ const root = rootOf2(source);
3700
3744
  const header = parseDefinitionHeader(root);
3701
3745
  const family = resolveDiagramLayoutCategory(
3702
3746
  header.uniqueId,
@@ -3708,11 +3752,11 @@ function parseDiagramLayoutSummary(source) {
3708
3752
  ...header,
3709
3753
  ...family ? { family } : {},
3710
3754
  ...rootAlgorithm ? { rootAlgorithm } : {},
3711
- layoutNodeCount: descendants2(root, "layoutNode").length
3755
+ layoutNodeCount: descendants(root, "layoutNode").length
3712
3756
  };
3713
3757
  }
3714
3758
 
3715
- // diagram/drawing-fill.ts
3759
+ // drawingml/drawing-fill.ts
3716
3760
  var FILL_ELEMENTS = /* @__PURE__ */ new Set([
3717
3761
  "noFill",
3718
3762
  "solidFill",
@@ -3804,7 +3848,7 @@ function parseDrawingLine(ln) {
3804
3848
  return line;
3805
3849
  }
3806
3850
 
3807
- // diagram/drawing-text.ts
3851
+ // drawingml/drawing-text.ts
3808
3852
  function parseSpacing(parent) {
3809
3853
  for (const [name, unit, divisor] of [
3810
3854
  ["spcPts", "points", 100],
@@ -3883,7 +3927,7 @@ function parseDrawingTextBody(body) {
3883
3927
  return result;
3884
3928
  }
3885
3929
 
3886
- // diagram/drawing-geometry.ts
3930
+ // drawingml/drawing-geometry.ts
3887
3931
  var int = (element, name) => Number.parseInt(element?.getAttribute(name) ?? "", 10);
3888
3932
  function parseFrame(container) {
3889
3933
  const off = first(container, "off", NS.a);
@@ -4685,6 +4729,23 @@ function parseRunPropertiesSnapshot(xml) {
4685
4729
  return parsePropertiesSnapshot(xml, "rPr");
4686
4730
  }
4687
4731
 
4732
+ // docx/field-flags.ts
4733
+ function parseFieldFlags(element) {
4734
+ const locked = onOffAttribute(element, "fldLock");
4735
+ const dirty = onOffAttribute(element, "dirty");
4736
+ if (locked === void 0 && dirty === void 0) return void 0;
4737
+ return { ...locked !== void 0 && { locked }, ...dirty !== void 0 && { dirty } };
4738
+ }
4739
+ function writeFieldFlags(element, flags) {
4740
+ for (const [name, value] of [
4741
+ ["fldLock", flags?.locked],
4742
+ ["dirty", flags?.dirty]
4743
+ ]) {
4744
+ if (value === void 0) element.removeAttributeNS(WORD_NS, name);
4745
+ else element.setAttributeNS(WORD_NS, `w:${name}`, value ? "true" : "false");
4746
+ }
4747
+ }
4748
+
4688
4749
  // docx/write-run.ts
4689
4750
  function setAttribute6(element, local, value) {
4690
4751
  element.setAttributeNS(WORD_NS, `w:${local}`, value);
@@ -4870,6 +4931,7 @@ function createRun(doc, run, base, old, allocator) {
4870
4931
  if (run.fieldChar) {
4871
4932
  const marker = makeW(doc, "fldChar");
4872
4933
  setAttribute6(marker, "fldCharType", run.fieldChar);
4934
+ writeFieldFlags(marker, run.fieldFlags);
4873
4935
  node.appendChild(marker);
4874
4936
  return node;
4875
4937
  }
@@ -4950,6 +5012,11 @@ function takeSimpleFieldCommentEdges(doc, runs, start, end, opens, closes) {
4950
5012
  after: take(closes, end - 1).reverse().flatMap((edge) => rangeEndNodes(doc, edge))
4951
5013
  };
4952
5014
  }
5015
+
5016
+ // docx/field-lock.ts
5017
+ function sameFieldFlags(a, b) {
5018
+ return a?.locked === b?.locked && a?.dirty === b?.dirty;
5019
+ }
4953
5020
  var MATH_NAMESPACES = /* @__PURE__ */ new Set([
4954
5021
  "http://schemas.openxmlformats.org/officeDocument/2006/math",
4955
5022
  "http://purl.oclc.org/ooxml/officeDocument/math"
@@ -5274,6 +5341,7 @@ function buildInlineContent(doc, runs, base, slots, allocator, ranges) {
5274
5341
  container = makeW(doc, "fldSimple");
5275
5342
  setW6(container, "instr", ` ${group.instr} `);
5276
5343
  }
5344
+ if (group.kind === "simpleField") writeFieldFlags(container, runAt(start).fieldFlags);
5277
5345
  const edges = group.kind === "simpleField" ? takeSimpleFieldCommentEdges(doc, runs, start, index, opens, closes) : { before: [], after: [] };
5278
5346
  for (let item = start; item < index; item++)
5279
5347
  for (const node of nodesFor(item)) container.appendChild(node);
@@ -5284,13 +5352,18 @@ function buildInlineContent(doc, runs, base, slots, allocator, ranges) {
5284
5352
  function containerGroup(run) {
5285
5353
  if (run.link) return { kind: "link", link: run.link };
5286
5354
  if (run.field?.simple)
5287
- return { kind: "simpleField", instr: run.field.instr, instanceId: run.fieldInstanceId };
5355
+ return {
5356
+ kind: "simpleField",
5357
+ instr: run.field.instr,
5358
+ instanceId: run.fieldInstanceId,
5359
+ fieldFlags: run.fieldFlags
5360
+ };
5288
5361
  return void 0;
5289
5362
  }
5290
5363
  function sameGroup(a, b) {
5291
5364
  if (!a || !b) return a === b;
5292
5365
  if (a.kind === "link" && b.kind === "link") return sameLink(a.link, b.link);
5293
- return a.kind === "simpleField" && b.kind === "simpleField" && a.instr === b.instr && a.instanceId === b.instanceId;
5366
+ return a.kind === "simpleField" && b.kind === "simpleField" && a.instr === b.instr && a.instanceId === b.instanceId && sameFieldFlags(a.fieldFlags, b.fieldFlags);
5294
5367
  }
5295
5368
 
5296
5369
  // docx/paragraph-properties.ts
@@ -6214,6 +6287,217 @@ async function registerNumberingPart(zip) {
6214
6287
  zip.file(relsPath, buildXml(relsDoc));
6215
6288
  }
6216
6289
 
6290
+ // docx/numbering-parse.ts
6291
+ var integer2 = (value, fallback) => parseInteger(value) ?? fallback;
6292
+ var flag = (element) => onOffElement(element) === true;
6293
+ function byName(root, local) {
6294
+ return Array.from(root.getElementsByTagName("*")).filter(
6295
+ (node) => node.nodeType === 1 && named2(node, local)
6296
+ );
6297
+ }
6298
+ function parseMarkerFormat(rPr) {
6299
+ if (!rPr) return void 0;
6300
+ const format = {};
6301
+ const family = getW(first2(rPr, "rFonts"), "ascii");
6302
+ if (family) format.fontFamily = family;
6303
+ const size = parseInteger(getW(first2(rPr, "sz"), "val"));
6304
+ if (size !== void 0 && size > 0) format.fontSizeHalfPoints = size;
6305
+ if (onOffElement(first2(rPr, "b")) === true) format.bold = true;
6306
+ if (onOffElement(first2(rPr, "i")) === true) format.italic = true;
6307
+ const color = getW(first2(rPr, "color"), "val");
6308
+ if (color && /^[0-9a-f]{6}$/i.test(color)) format.color = `#${color.toLowerCase()}`;
6309
+ return Object.keys(format).length ? format : void 0;
6310
+ }
6311
+ function parseNumberingLevel(lvl) {
6312
+ const level = integer2(getW(lvl, "ilvl"), 0);
6313
+ const start = integer2(getW(first2(lvl, "start"), "val"), 1);
6314
+ const numFmt = enumValue(isStNumberFormat, getW(first2(lvl, "numFmt"), "val"), "w:numFmt") ?? "decimal";
6315
+ const lvlText = getW(first2(lvl, "lvlText"), "val") ?? "";
6316
+ const jc = getW(first2(lvl, "lvlJc"), "val");
6317
+ const ind = first2(first2(lvl, "pPr"), "ind");
6318
+ const suffRaw = getW(first2(lvl, "suff"), "val");
6319
+ const result = { level, start, numFmt, lvlText };
6320
+ if (!first2(lvl, "start")) result.startWasOmitted = true;
6321
+ const paragraphStyleId = getW(first2(lvl, "pStyle"), "val");
6322
+ if (paragraphStyleId) result.paragraphStyleId = paragraphStyleId;
6323
+ if (jc === "left" || jc === "center" || jc === "right") result.lvlJc = jc;
6324
+ const left = getW(ind, "left") ?? getW(ind, "start");
6325
+ if (left !== void 0) result.indentLeftTwips = parseSignedTwips(left) ?? signedTwips(0);
6326
+ const hanging = getW(ind, "hanging");
6327
+ if (hanging !== void 0) result.hangingTwips = parseTwips(hanging) ?? twips(0);
6328
+ const firstLine = getW(ind, "firstLine");
6329
+ if (firstLine !== void 0) result.firstLineTwips = parseTwips(firstLine) ?? twips(0);
6330
+ const tabs = first2(first2(lvl, "pPr"), "tabs");
6331
+ const tab = tabs ? children2(tabs, "tab").find((stop) => getW(stop, "val") !== "clear") : void 0;
6332
+ const tabPos = tab ? parseTwips(getW(tab, "pos")) : void 0;
6333
+ if (tabPos !== void 0) result.tabStopTwips = tabPos;
6334
+ if (flag(first2(lvl, "isLgl"))) result.isLgl = true;
6335
+ const restart = getW(first2(lvl, "lvlRestart"), "val");
6336
+ if (restart !== void 0) result.lvlRestart = integer2(restart, 0);
6337
+ const marker = parseMarkerFormat(first2(lvl, "rPr"));
6338
+ if (marker) result.markerFormat = marker;
6339
+ result.suffix = suffRaw === "space" ? "space" : suffRaw === "nothing" ? "none" : "tab";
6340
+ return result;
6341
+ }
6342
+ function parseAbstractNum(element) {
6343
+ const id = getW(element, "abstractNumId");
6344
+ if (!id) return void 0;
6345
+ const levels = {};
6346
+ for (const lvl of children2(element, "lvl")) {
6347
+ const parsed = parseNumberingLevel(lvl);
6348
+ levels[parsed.level] = parsed;
6349
+ }
6350
+ return { id, levels };
6351
+ }
6352
+ function parseNum(element) {
6353
+ const id = getW(element, "numId");
6354
+ if (!id) return void 0;
6355
+ const abstractNumId = getW(first2(element, "abstractNumId"), "val") ?? "";
6356
+ const levelOverrides = {};
6357
+ for (const override of children2(element, "lvlOverride")) {
6358
+ const level = integer2(getW(override, "ilvl"), 0);
6359
+ const entry = {};
6360
+ const startOverride = getW(first2(override, "startOverride"), "val");
6361
+ if (startOverride !== void 0) entry.startOverride = integer2(startOverride, 1);
6362
+ const lvl = first2(override, "lvl");
6363
+ if (lvl) entry.lvl = parseNumberingLevel(lvl);
6364
+ if (Object.keys(entry).length) levelOverrides[level] = entry;
6365
+ }
6366
+ return {
6367
+ id,
6368
+ abstractNumId,
6369
+ ...Object.keys(levelOverrides).length ? { levelOverrides } : {}
6370
+ };
6371
+ }
6372
+ function parseNumberingCatalog(xml) {
6373
+ const document = parseXml2(xml);
6374
+ const root = document.documentElement;
6375
+ const abstractNums = {};
6376
+ const warnings = [];
6377
+ for (const element of byName(root, "abstractNum")) {
6378
+ const parsed = parseAbstractNum(element);
6379
+ if (!parsed) continue;
6380
+ abstractNums[parsed.id] = parsed;
6381
+ const link = getW(first2(element, "numStyleLink"), "val");
6382
+ if (link)
6383
+ warnings.push(
6384
+ `Numbering definition abstractNum ${parsed.id} links to style "${link}"; style-linked numbering levels are not resolved.`
6385
+ );
6386
+ if (byName(element, "lvlPicBulletId").length)
6387
+ warnings.push(
6388
+ `Numbering definition abstractNum ${parsed.id} uses a picture bullet; picture bullets are not rendered.`
6389
+ );
6390
+ }
6391
+ const nums = {};
6392
+ for (const element of byName(root, "num")) {
6393
+ const parsed = parseNum(element);
6394
+ if (parsed) nums[parsed.id] = parsed;
6395
+ }
6396
+ return { abstractNums, nums, warnings: [...new Set(warnings)] };
6397
+ }
6398
+ function resolveNumberingLevel(catalog, numId, level) {
6399
+ const num = catalog.nums[numId];
6400
+ if (!num) return void 0;
6401
+ const override = num.levelOverrides?.[level];
6402
+ const sourceAbstract = catalog.abstractNums[num.abstractNumId]?.levels[level];
6403
+ const abstract = sourceAbstract?.startWasOmitted && sourceAbstract.start === 1 ? { ...sourceAbstract, start: 0 } : sourceAbstract;
6404
+ let base = override?.lvl ?? abstract;
6405
+ if (!base) return void 0;
6406
+ if (override?.lvl) {
6407
+ const { lvlRestart: _ignored, ...properties } = base;
6408
+ base = {
6409
+ ...properties,
6410
+ ...abstract?.lvlRestart !== void 0 ? { lvlRestart: abstract.lvlRestart } : {}
6411
+ };
6412
+ }
6413
+ let start = override?.startOverride ?? base.start;
6414
+ if (override?.lvl) {
6415
+ if (abstract?.lvlRestart === 0 && override.startOverride === void 0) start = abstract.start;
6416
+ else if (!override.lvl.startWasOmitted || override.lvl.start !== 1) start = override.lvl.start;
6417
+ else start = override.startOverride ?? 0;
6418
+ }
6419
+ return start !== base.start ? { ...base, start } : base;
6420
+ }
6421
+
6422
+ // docx/numbering-start-edit.ts
6423
+ function assertListStartValue(level, start) {
6424
+ if (!Number.isInteger(level) || level < 0 || level > 8)
6425
+ throw new Error("List level must be an integer from 0 through 8.");
6426
+ if (!Number.isInteger(start) || start < 0 || start > 2147483647)
6427
+ throw new Error("List start must be an integer from 0 through 2147483647.");
6428
+ }
6429
+
6430
+ // docx/numbering-start-patch.ts
6431
+ function withoutStarts(num) {
6432
+ const { levelOverrides, ...properties } = num;
6433
+ const kept = {};
6434
+ for (const [level, override] of Object.entries(levelOverrides ?? {})) {
6435
+ const { startOverride: _start, ...rest } = override;
6436
+ if (Object.keys(rest).length) kept[level] = rest;
6437
+ }
6438
+ return { ...properties, ...Object.keys(kept).length ? { levelOverrides: kept } : {} };
6439
+ }
6440
+ function numberingStartChanges(prior, next) {
6441
+ const changes = [];
6442
+ for (const [id, previous] of Object.entries(prior?.nums ?? {})) {
6443
+ const current = next.nums[id];
6444
+ if (!current || JSON.stringify(withoutStarts(current)) !== JSON.stringify(withoutStarts(previous)))
6445
+ throw new Error(
6446
+ `Cannot edit numbering definition num "${id}" except its supported start overrides.`
6447
+ );
6448
+ for (const key of /* @__PURE__ */ new Set([
6449
+ ...Object.keys(previous.levelOverrides ?? {}),
6450
+ ...Object.keys(current.levelOverrides ?? {})
6451
+ ])) {
6452
+ const level = Number(key);
6453
+ const old = previous.levelOverrides?.[level];
6454
+ const value = current.levelOverrides?.[level];
6455
+ if (old?.startOverride === value?.startOverride) continue;
6456
+ if (value?.startOverride === void 0)
6457
+ throw new Error("Removing a list start override is unsupported.");
6458
+ assertListStartValue(level, value.startOverride);
6459
+ if (String(level) !== key || !prior || !resolveNumberingLevel(prior, id, level))
6460
+ throw new Error("List instance or level does not exist.");
6461
+ if (old?.lvl || value.lvl)
6462
+ throw new Error("Changing starts with a full level override is unsupported.");
6463
+ changes.push({ numId: id, level, start: value.startOverride });
6464
+ }
6465
+ }
6466
+ return changes;
6467
+ }
6468
+ function patchNumberingStarts(doc, changes) {
6469
+ const sameNumber = (source, expected) => source !== void 0 && /^[+-]?\d+$/.test(source) && Number(source) === Number(expected);
6470
+ const prepared = changes.map((change) => {
6471
+ const nums = children2(doc.documentElement, "num").filter(
6472
+ (num2) => sameNumber(getW(num2, "numId"), change.numId)
6473
+ );
6474
+ if (nums.length !== 1 || getW(nums[0], "numId") !== change.numId)
6475
+ throw new Error("Cannot patch an ambiguous or missing source list instance.");
6476
+ const num = nums[0];
6477
+ const overrides = children2(num, "lvlOverride").filter(
6478
+ (node) => sameNumber(getW(node, "ilvl"), String(change.level))
6479
+ );
6480
+ if (overrides.length > 1) throw new Error("Cannot patch duplicate source level overrides.");
6481
+ const override = overrides[0];
6482
+ if (override && getW(override, "ilvl") !== String(change.level))
6483
+ throw new Error("Cannot patch a noncanonical source level override.");
6484
+ if (override && (children2(override, "lvl").length || children2(override, "startOverride").length > 1))
6485
+ throw new Error("Cannot patch a full or ambiguous source level override.");
6486
+ return { change, num, override };
6487
+ });
6488
+ for (const { change, num, override: existing } of prepared) {
6489
+ const override = existing ?? makeW(doc, "lvlOverride");
6490
+ if (!existing) {
6491
+ override.setAttributeNS(WORD_NS, "w:ilvl", String(change.level));
6492
+ const after = children2(num, "lvlOverride").at(-1) ?? children2(num, "abstractNumId")[0];
6493
+ num.insertBefore(override, after?.nextSibling ?? null);
6494
+ }
6495
+ const start = children2(override, "startOverride")[0] ?? makeW(doc, "startOverride");
6496
+ start.setAttributeNS(WORD_NS, "w:val", String(change.start));
6497
+ if (!start.parentNode) override.insertBefore(start, override.firstChild);
6498
+ }
6499
+ }
6500
+
6217
6501
  // docx/numbering-package.ts
6218
6502
  function setAttribute8(element, local, value) {
6219
6503
  element.setAttributeNS(WORD_NS, `w:${local}`, value);
@@ -6318,17 +6602,14 @@ async function applyNumberingCatalog(zip, model, binding) {
6318
6602
  throw new Error(
6319
6603
  `Cannot edit numbering definition abstractNum "${id}"; the original numbering.xml is preserved unchanged.`
6320
6604
  );
6321
- for (const id of Object.keys(prior?.nums ?? {}))
6322
- if (JSON.stringify(next.nums[id]) !== JSON.stringify(prior?.nums[id]))
6323
- throw new Error(
6324
- `Cannot edit numbering definition num "${id}"; the original numbering.xml is preserved unchanged.`
6325
- );
6605
+ const startChanges = numberingStartChanges(prior, next);
6326
6606
  const newAbstractIds = Object.keys(next.abstractNums).filter((id) => !prior?.abstractNums[id]);
6327
6607
  const newNumIds = Object.keys(next.nums).filter((id) => !prior?.nums[id]);
6328
- if (!newAbstractIds.length && !newNumIds.length) return;
6608
+ if (!newAbstractIds.length && !newNumIds.length && !startChanges.length) return;
6329
6609
  const existingFile = zip.file("word/numbering.xml");
6330
6610
  const doc = existingFile ? parseXml2(await existingFile.async("string")) : parseXml2(`<w:numbering xmlns:w="${WORD_NS}"/>`);
6331
6611
  const root = doc.documentElement;
6612
+ patchNumberingStarts(doc, startChanges);
6332
6613
  const cleanup = children2(root, "numIdMacAtCleanup")[0] ?? null;
6333
6614
  const firstNum = children2(root, "num")[0] ?? cleanup;
6334
6615
  for (const id of newAbstractIds) {
@@ -7194,23 +7475,31 @@ function createFieldTracker() {
7194
7475
  const stack = [];
7195
7476
  return (element, run) => {
7196
7477
  let resultInstr;
7478
+ let resultLocked;
7197
7479
  for (const child3 of Array.from(element.childNodes)) {
7198
7480
  if (!isElement(child3)) continue;
7199
7481
  if (named2(child3, "fldChar")) {
7200
7482
  const type = getW(child3, "fldCharType");
7201
- if (type === "begin") stack.push({ instr: "", inResult: false });
7202
- else if (type === "separate") {
7483
+ if (type === "begin") {
7484
+ const locked = parseFieldFlags(child3)?.locked;
7485
+ stack.push({ instr: "", inResult: false, ...locked !== void 0 && { locked } });
7486
+ } else if (type === "separate") {
7203
7487
  const top = stack.at(-1);
7204
7488
  if (top) top.inResult = true;
7205
7489
  } else if (type === "end") stack.pop();
7206
7490
  } else {
7207
7491
  const top = stack.at(-1);
7208
7492
  if (named2(child3, "instrText") && top && !top.inResult) top.instr += textContent(child3);
7209
- else if ((named2(child3, "t") || named2(child3, "delText")) && top?.inResult)
7493
+ else if ((named2(child3, "t") || named2(child3, "delText")) && top?.inResult) {
7210
7494
  resultInstr = top.instr.trim();
7495
+ resultLocked = top.locked;
7496
+ }
7211
7497
  }
7212
7498
  }
7213
- if (resultInstr) run.field = { instr: resultInstr };
7499
+ if (resultInstr) {
7500
+ run.field = { instr: resultInstr };
7501
+ if (resultLocked !== void 0) run.fieldFlags = { locked: resultLocked };
7502
+ }
7214
7503
  return run;
7215
7504
  };
7216
7505
  }
@@ -7221,7 +7510,11 @@ function storyFieldResults(container) {
7221
7510
  if (named2(element, "fldSimple") || named2(element, "txbxContent")) return;
7222
7511
  if (named2(element, "r")) {
7223
7512
  const run = trackField(element, { text: "" });
7224
- if (run.field) metadata.set(element, run.field);
7513
+ if (run.field)
7514
+ metadata.set(element, {
7515
+ field: run.field,
7516
+ ...run.fieldFlags && { fieldFlags: run.fieldFlags }
7517
+ });
7225
7518
  return;
7226
7519
  }
7227
7520
  for (const child3 of Array.from(element.childNodes)) if (isElement(child3)) visit(child3);
@@ -7313,7 +7606,11 @@ function parseRun2(node, revision) {
7313
7606
  if (breakKind) run.break = breakKind;
7314
7607
  if (noteReference) run.noteReference = noteReference;
7315
7608
  if (noteMark) run.noteMark = noteMark;
7316
- if (fieldChar) run.fieldChar = fieldChar;
7609
+ if (fieldChar) {
7610
+ run.fieldChar = fieldChar;
7611
+ const flags = parseFieldFlags(only);
7612
+ if (flags) run.fieldFlags = flags;
7613
+ }
7317
7614
  if (fieldCode !== void 0) run.fieldCode = fieldCode;
7318
7615
  const runRevision = revision ?? runFormatRevision(props);
7319
7616
  if (runRevision) run.revision = runRevision;
@@ -7332,8 +7629,11 @@ function parseParagraph2(node, id, fields) {
7332
7629
  (element, revision) => {
7333
7630
  const run = parseRun2(element, revision);
7334
7631
  if (!fields) return trackField(element, run);
7335
- const field = fields.get(element);
7336
- if (field) run.field = { ...field };
7632
+ const metadata = fields.get(element);
7633
+ if (metadata) {
7634
+ run.field = { ...metadata.field };
7635
+ if (metadata.fieldFlags) run.fieldFlags = { ...metadata.fieldFlags };
7636
+ }
7337
7637
  return run;
7338
7638
  },
7339
7639
  (item) => {
@@ -7355,20 +7655,23 @@ function parseParagraph2(node, id, fields) {
7355
7655
  );
7356
7656
  if (link) return results.map((run) => ({ ...run, link }));
7357
7657
  const field = { instr: instr.trim(), simple: true };
7658
+ const flags = parseFieldFlags(item);
7659
+ const fieldState = flags ? { fieldFlags: flags } : {};
7358
7660
  const fieldInstanceId = `${id}:simple-field-${simpleFieldIndex++}`;
7359
- if (!results.length) return [{ text: fieldPlaceholderText(instr), field, fieldInstanceId }];
7661
+ if (!results.length)
7662
+ return [{ text: fieldPlaceholderText(instr), field, fieldInstanceId, ...fieldState }];
7360
7663
  if (results.every(
7361
7664
  (run) => !run.text && !run.equation && !run.image && !run.break && !run.noteReference && !run.noteMark && !run.fieldChar && run.fieldCode === void 0
7362
7665
  )) {
7363
7666
  return [
7364
- { text: "", fieldChar: "begin" },
7667
+ { text: "", fieldChar: "begin", ...fieldState },
7365
7668
  { text: "", fieldCode: instr },
7366
7669
  { text: "", fieldChar: "separate" },
7367
7670
  ...results,
7368
7671
  { text: "", fieldChar: "end" }
7369
7672
  ];
7370
7673
  }
7371
- return results.map((run) => ({ ...run, field, fieldInstanceId }));
7674
+ return results.map((run) => ({ ...run, field, fieldInstanceId, ...fieldState }));
7372
7675
  },
7373
7676
  (hyperlink) => {
7374
7677
  if (!activeContext) return void 0;
@@ -7670,115 +7973,6 @@ async function parseDocumentParts(zip, body, blocks, drawings) {
7670
7973
  };
7671
7974
  }
7672
7975
 
7673
- // docx/numbering-parse.ts
7674
- var integer2 = (value, fallback) => parseInteger(value) ?? fallback;
7675
- var flag = (element) => onOffElement(element) === true;
7676
- function byName(root, local) {
7677
- return Array.from(root.getElementsByTagName("*")).filter(
7678
- (node) => node.nodeType === 1 && named2(node, local)
7679
- );
7680
- }
7681
- function parseMarkerFormat(rPr) {
7682
- if (!rPr) return void 0;
7683
- const format = {};
7684
- const family = getW(first2(rPr, "rFonts"), "ascii");
7685
- if (family) format.fontFamily = family;
7686
- const size = parseInteger(getW(first2(rPr, "sz"), "val"));
7687
- if (size !== void 0 && size > 0) format.fontSizeHalfPoints = size;
7688
- if (onOffElement(first2(rPr, "b")) === true) format.bold = true;
7689
- if (onOffElement(first2(rPr, "i")) === true) format.italic = true;
7690
- const color = getW(first2(rPr, "color"), "val");
7691
- if (color && /^[0-9a-f]{6}$/i.test(color)) format.color = `#${color.toLowerCase()}`;
7692
- return Object.keys(format).length ? format : void 0;
7693
- }
7694
- function parseNumberingLevel(lvl) {
7695
- const level = integer2(getW(lvl, "ilvl"), 0);
7696
- const start = integer2(getW(first2(lvl, "start"), "val"), 1);
7697
- const numFmt = enumValue(isStNumberFormat, getW(first2(lvl, "numFmt"), "val"), "w:numFmt") ?? "decimal";
7698
- const lvlText = getW(first2(lvl, "lvlText"), "val") ?? "";
7699
- const jc = getW(first2(lvl, "lvlJc"), "val");
7700
- const ind = first2(first2(lvl, "pPr"), "ind");
7701
- const suffRaw = getW(first2(lvl, "suff"), "val");
7702
- const result = { level, start, numFmt, lvlText };
7703
- if (!first2(lvl, "start")) result.startWasOmitted = true;
7704
- const paragraphStyleId = getW(first2(lvl, "pStyle"), "val");
7705
- if (paragraphStyleId) result.paragraphStyleId = paragraphStyleId;
7706
- if (jc === "left" || jc === "center" || jc === "right") result.lvlJc = jc;
7707
- const left = getW(ind, "left") ?? getW(ind, "start");
7708
- if (left !== void 0) result.indentLeftTwips = parseSignedTwips(left) ?? signedTwips(0);
7709
- const hanging = getW(ind, "hanging");
7710
- if (hanging !== void 0) result.hangingTwips = parseTwips(hanging) ?? twips(0);
7711
- const firstLine = getW(ind, "firstLine");
7712
- if (firstLine !== void 0) result.firstLineTwips = parseTwips(firstLine) ?? twips(0);
7713
- const tabs = first2(first2(lvl, "pPr"), "tabs");
7714
- const tab = tabs ? children2(tabs, "tab").find((stop) => getW(stop, "val") !== "clear") : void 0;
7715
- const tabPos = tab ? parseTwips(getW(tab, "pos")) : void 0;
7716
- if (tabPos !== void 0) result.tabStopTwips = tabPos;
7717
- if (flag(first2(lvl, "isLgl"))) result.isLgl = true;
7718
- const restart = getW(first2(lvl, "lvlRestart"), "val");
7719
- if (restart !== void 0) result.lvlRestart = integer2(restart, 0);
7720
- const marker = parseMarkerFormat(first2(lvl, "rPr"));
7721
- if (marker) result.markerFormat = marker;
7722
- result.suffix = suffRaw === "space" ? "space" : suffRaw === "nothing" ? "none" : "tab";
7723
- return result;
7724
- }
7725
- function parseAbstractNum(element) {
7726
- const id = getW(element, "abstractNumId");
7727
- if (!id) return void 0;
7728
- const levels = {};
7729
- for (const lvl of children2(element, "lvl")) {
7730
- const parsed = parseNumberingLevel(lvl);
7731
- levels[parsed.level] = parsed;
7732
- }
7733
- return { id, levels };
7734
- }
7735
- function parseNum(element) {
7736
- const id = getW(element, "numId");
7737
- if (!id) return void 0;
7738
- const abstractNumId = getW(first2(element, "abstractNumId"), "val") ?? "";
7739
- const levelOverrides = {};
7740
- for (const override of children2(element, "lvlOverride")) {
7741
- const level = integer2(getW(override, "ilvl"), 0);
7742
- const entry = {};
7743
- const startOverride = getW(first2(override, "startOverride"), "val");
7744
- if (startOverride !== void 0) entry.startOverride = integer2(startOverride, 1);
7745
- const lvl = first2(override, "lvl");
7746
- if (lvl) entry.lvl = parseNumberingLevel(lvl);
7747
- if (Object.keys(entry).length) levelOverrides[level] = entry;
7748
- }
7749
- return {
7750
- id,
7751
- abstractNumId,
7752
- ...Object.keys(levelOverrides).length ? { levelOverrides } : {}
7753
- };
7754
- }
7755
- function parseNumberingCatalog(xml) {
7756
- const document = parseXml2(xml);
7757
- const root = document.documentElement;
7758
- const abstractNums = {};
7759
- const warnings = [];
7760
- for (const element of byName(root, "abstractNum")) {
7761
- const parsed = parseAbstractNum(element);
7762
- if (!parsed) continue;
7763
- abstractNums[parsed.id] = parsed;
7764
- const link = getW(first2(element, "numStyleLink"), "val");
7765
- if (link)
7766
- warnings.push(
7767
- `Numbering definition abstractNum ${parsed.id} links to style "${link}"; style-linked numbering levels are not resolved.`
7768
- );
7769
- if (byName(element, "lvlPicBulletId").length)
7770
- warnings.push(
7771
- `Numbering definition abstractNum ${parsed.id} uses a picture bullet; picture bullets are not rendered.`
7772
- );
7773
- }
7774
- const nums = {};
7775
- for (const element of byName(root, "num")) {
7776
- const parsed = parseNum(element);
7777
- if (parsed) nums[parsed.id] = parsed;
7778
- }
7779
- return { abstractNums, nums, warnings: [...new Set(warnings)] };
7780
- }
7781
-
7782
7976
  // docx/comments.ts
7783
7977
  var W14_NS2 = "http://schemas.microsoft.com/office/word/2010/wordml";
7784
7978
  var W15_NS2 = "http://schemas.microsoft.com/office/word/2012/wordml";
@@ -8013,7 +8207,7 @@ async function readPackage(input) {
8013
8207
  const themeFile = zip.file("word/theme/theme1.xml");
8014
8208
  const settingsFile = zip.file("word/settings.xml");
8015
8209
  if (themeFile) {
8016
- model.theme = parseTheme(await themeFile.async("string"));
8210
+ model.theme = parseTheme2(await themeFile.async("string"));
8017
8211
  if (settingsFile) {
8018
8212
  const settingsXml = await settingsFile.async("string");
8019
8213
  model.theme.colorMapping = withParseWarnings(