@usejunior/docx-core 0.10.0 → 0.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (248) hide show
  1. package/LICENSE +202 -21
  2. package/NOTICE +2 -0
  3. package/README.md +2 -2
  4. package/dist/.tsbuildinfo +1 -1
  5. package/dist/atomizer.d.ts +13 -7
  6. package/dist/atomizer.d.ts.map +1 -1
  7. package/dist/atomizer.js +59 -24
  8. package/dist/atomizer.js.map +1 -1
  9. package/dist/baselines/atomizer/auxiliaryIdCollision.d.ts +99 -0
  10. package/dist/baselines/atomizer/auxiliaryIdCollision.d.ts.map +1 -0
  11. package/dist/baselines/atomizer/auxiliaryIdCollision.js +415 -0
  12. package/dist/baselines/atomizer/auxiliaryIdCollision.js.map +1 -0
  13. package/dist/baselines/atomizer/documentReconstructor.d.ts.map +1 -1
  14. package/dist/baselines/atomizer/documentReconstructor.js +120 -27
  15. package/dist/baselines/atomizer/documentReconstructor.js.map +1 -1
  16. package/dist/baselines/atomizer/inPlaceModifier-wrappers.d.ts +9 -0
  17. package/dist/baselines/atomizer/inPlaceModifier-wrappers.d.ts.map +1 -1
  18. package/dist/baselines/atomizer/inPlaceModifier-wrappers.js +52 -4
  19. package/dist/baselines/atomizer/inPlaceModifier-wrappers.js.map +1 -1
  20. package/dist/baselines/atomizer/pipeline.d.ts +12 -53
  21. package/dist/baselines/atomizer/pipeline.d.ts.map +1 -1
  22. package/dist/baselines/atomizer/pipeline.js +126 -231
  23. package/dist/baselines/atomizer/pipeline.js.map +1 -1
  24. package/dist/baselines/atomizer/trackChangesAcceptorAst.d.ts.map +1 -1
  25. package/dist/baselines/atomizer/trackChangesAcceptorAst.js +153 -23
  26. package/dist/baselines/atomizer/trackChangesAcceptorAst.js.map +1 -1
  27. package/dist/baselines/wmlcomparer/DotnetCli.d.ts.map +1 -1
  28. package/dist/baselines/wmlcomparer/DotnetCli.js +7 -0
  29. package/dist/baselines/wmlcomparer/DotnetCli.js.map +1 -1
  30. package/dist/cli/compare-two.d.ts.map +1 -1
  31. package/dist/cli/compare-two.js +3 -1
  32. package/dist/cli/compare-two.js.map +1 -1
  33. package/dist/cli/conformance-adapter.d.ts +3 -0
  34. package/dist/cli/conformance-adapter.d.ts.map +1 -0
  35. package/dist/cli/conformance-adapter.js +93 -0
  36. package/dist/cli/conformance-adapter.js.map +1 -0
  37. package/dist/cli/index.d.ts.map +1 -1
  38. package/dist/cli/index.js +5 -1
  39. package/dist/cli/index.js.map +1 -1
  40. package/dist/compare-types.d.ts +46 -0
  41. package/dist/compare-types.d.ts.map +1 -1
  42. package/dist/generation/compile.d.ts +22 -0
  43. package/dist/generation/compile.d.ts.map +1 -0
  44. package/dist/generation/compile.js +58 -0
  45. package/dist/generation/compile.js.map +1 -0
  46. package/dist/generation/context.d.ts +42 -0
  47. package/dist/generation/context.d.ts.map +1 -0
  48. package/dist/generation/context.js +65 -0
  49. package/dist/generation/context.js.map +1 -0
  50. package/dist/generation/emit/comments-part.d.ts +36 -0
  51. package/dist/generation/emit/comments-part.d.ts.map +1 -0
  52. package/dist/generation/emit/comments-part.js +116 -0
  53. package/dist/generation/emit/comments-part.js.map +1 -0
  54. package/dist/generation/emit/document-part.d.ts +24 -0
  55. package/dist/generation/emit/document-part.d.ts.map +1 -0
  56. package/dist/generation/emit/document-part.js +60 -0
  57. package/dist/generation/emit/document-part.js.map +1 -0
  58. package/dist/generation/emit/emit-context.d.ts +28 -0
  59. package/dist/generation/emit/emit-context.d.ts.map +1 -0
  60. package/dist/generation/emit/emit-context.js +19 -0
  61. package/dist/generation/emit/emit-context.js.map +1 -0
  62. package/dist/generation/emit/font-table-part.d.ts +16 -0
  63. package/dist/generation/emit/font-table-part.d.ts.map +1 -0
  64. package/dist/generation/emit/font-table-part.js +74 -0
  65. package/dist/generation/emit/font-table-part.js.map +1 -0
  66. package/dist/generation/emit/header-footer-part.d.ts +23 -0
  67. package/dist/generation/emit/header-footer-part.d.ts.map +1 -0
  68. package/dist/generation/emit/header-footer-part.js +57 -0
  69. package/dist/generation/emit/header-footer-part.js.map +1 -0
  70. package/dist/generation/emit/numbering-part.d.ts +29 -0
  71. package/dist/generation/emit/numbering-part.d.ts.map +1 -0
  72. package/dist/generation/emit/numbering-part.js +102 -0
  73. package/dist/generation/emit/numbering-part.js.map +1 -0
  74. package/dist/generation/emit/package-parts.d.ts +24 -0
  75. package/dist/generation/emit/package-parts.d.ts.map +1 -0
  76. package/dist/generation/emit/package-parts.js +121 -0
  77. package/dist/generation/emit/package-parts.js.map +1 -0
  78. package/dist/generation/emit/paragraph.d.ts +24 -0
  79. package/dist/generation/emit/paragraph.d.ts.map +1 -0
  80. package/dist/generation/emit/paragraph.js +63 -0
  81. package/dist/generation/emit/paragraph.js.map +1 -0
  82. package/dist/generation/emit/properties.d.ts +36 -0
  83. package/dist/generation/emit/properties.d.ts.map +1 -0
  84. package/dist/generation/emit/properties.js +154 -0
  85. package/dist/generation/emit/properties.js.map +1 -0
  86. package/dist/generation/emit/run.d.ts +16 -0
  87. package/dist/generation/emit/run.d.ts.map +1 -0
  88. package/dist/generation/emit/run.js +71 -0
  89. package/dist/generation/emit/run.js.map +1 -0
  90. package/dist/generation/emit/section.d.ts +29 -0
  91. package/dist/generation/emit/section.d.ts.map +1 -0
  92. package/dist/generation/emit/section.js +117 -0
  93. package/dist/generation/emit/section.js.map +1 -0
  94. package/dist/generation/emit/settings-part.d.ts +13 -0
  95. package/dist/generation/emit/settings-part.d.ts.map +1 -0
  96. package/dist/generation/emit/settings-part.js +68 -0
  97. package/dist/generation/emit/settings-part.js.map +1 -0
  98. package/dist/generation/emit/styles-part.d.ts +16 -0
  99. package/dist/generation/emit/styles-part.d.ts.map +1 -0
  100. package/dist/generation/emit/styles-part.js +82 -0
  101. package/dist/generation/emit/styles-part.js.map +1 -0
  102. package/dist/generation/emit/table.d.ts +26 -0
  103. package/dist/generation/emit/table.d.ts.map +1 -0
  104. package/dist/generation/emit/table.js +209 -0
  105. package/dist/generation/emit/table.js.map +1 -0
  106. package/dist/generation/emit/theme-part.d.ts +21 -0
  107. package/dist/generation/emit/theme-part.d.ts.map +1 -0
  108. package/dist/generation/emit/theme-part.js +151 -0
  109. package/dist/generation/emit/theme-part.js.map +1 -0
  110. package/dist/generation/emit/web-settings-part.d.ts +12 -0
  111. package/dist/generation/emit/web-settings-part.d.ts.map +1 -0
  112. package/dist/generation/emit/web-settings-part.js +19 -0
  113. package/dist/generation/emit/web-settings-part.js.map +1 -0
  114. package/dist/generation/errors.d.ts +22 -0
  115. package/dist/generation/errors.d.ts.map +1 -0
  116. package/dist/generation/errors.js +29 -0
  117. package/dist/generation/errors.js.map +1 -0
  118. package/dist/generation/index.d.ts +13 -0
  119. package/dist/generation/index.d.ts.map +1 -0
  120. package/dist/generation/index.js +12 -0
  121. package/dist/generation/index.js.map +1 -0
  122. package/dist/generation/ordering.d.ts +46 -0
  123. package/dist/generation/ordering.d.ts.map +1 -0
  124. package/dist/generation/ordering.js +119 -0
  125. package/dist/generation/ordering.js.map +1 -0
  126. package/dist/generation/recipes.d.ts +70 -0
  127. package/dist/generation/recipes.d.ts.map +1 -0
  128. package/dist/generation/recipes.js +149 -0
  129. package/dist/generation/recipes.js.map +1 -0
  130. package/dist/generation/structural-checks.d.ts +24 -0
  131. package/dist/generation/structural-checks.d.ts.map +1 -0
  132. package/dist/generation/structural-checks.js +318 -0
  133. package/dist/generation/structural-checks.js.map +1 -0
  134. package/dist/generation/theme-colors.d.ts +4 -0
  135. package/dist/generation/theme-colors.d.ts.map +1 -0
  136. package/dist/generation/theme-colors.js +18 -0
  137. package/dist/generation/theme-colors.js.map +1 -0
  138. package/dist/generation/types.d.ts +249 -0
  139. package/dist/generation/types.d.ts.map +1 -0
  140. package/dist/generation/types.js +54 -0
  141. package/dist/generation/types.js.map +1 -0
  142. package/dist/generation/validate-spec.d.ts +27 -0
  143. package/dist/generation/validate-spec.d.ts.map +1 -0
  144. package/dist/generation/validate-spec.js +359 -0
  145. package/dist/generation/validate-spec.js.map +1 -0
  146. package/dist/index.d.ts +3 -0
  147. package/dist/index.d.ts.map +1 -1
  148. package/dist/index.js +8 -0
  149. package/dist/index.js.map +1 -1
  150. package/dist/integration/generation-probes.d.ts +15 -0
  151. package/dist/integration/generation-probes.d.ts.map +1 -0
  152. package/dist/integration/generation-probes.js +84 -0
  153. package/dist/integration/generation-probes.js.map +1 -0
  154. package/dist/integration/libreoffice-oracle.d.ts +8 -0
  155. package/dist/integration/libreoffice-oracle.d.ts.map +1 -1
  156. package/dist/integration/libreoffice-oracle.js +14 -6
  157. package/dist/integration/libreoffice-oracle.js.map +1 -1
  158. package/dist/integration/synthetic-docx-fixture.d.ts +72 -0
  159. package/dist/integration/synthetic-docx-fixture.d.ts.map +1 -1
  160. package/dist/integration/synthetic-docx-fixture.js +131 -4
  161. package/dist/integration/synthetic-docx-fixture.js.map +1 -1
  162. package/dist/primitives/accept_changes.d.ts +2 -1
  163. package/dist/primitives/accept_changes.d.ts.map +1 -1
  164. package/dist/primitives/accept_changes.js +153 -12
  165. package/dist/primitives/accept_changes.js.map +1 -1
  166. package/dist/primitives/document.d.ts +38 -0
  167. package/dist/primitives/document.d.ts.map +1 -1
  168. package/dist/primitives/document.js +75 -9
  169. package/dist/primitives/document.js.map +1 -1
  170. package/dist/primitives/document_view-comments.d.ts.map +1 -1
  171. package/dist/primitives/document_view-comments.js +4 -3
  172. package/dist/primitives/document_view-comments.js.map +1 -1
  173. package/dist/primitives/document_view-types.d.ts +15 -0
  174. package/dist/primitives/document_view-types.d.ts.map +1 -1
  175. package/dist/primitives/document_view.d.ts.map +1 -1
  176. package/dist/primitives/document_view.js +21 -13
  177. package/dist/primitives/document_view.js.map +1 -1
  178. package/dist/primitives/formatting_tags.d.ts +1 -0
  179. package/dist/primitives/formatting_tags.d.ts.map +1 -1
  180. package/dist/primitives/formatting_tags.js +16 -10
  181. package/dist/primitives/formatting_tags.js.map +1 -1
  182. package/dist/primitives/index.d.ts +4 -0
  183. package/dist/primitives/index.d.ts.map +1 -1
  184. package/dist/primitives/index.js +4 -0
  185. package/dist/primitives/index.js.map +1 -1
  186. package/dist/primitives/layout.d.ts.map +1 -1
  187. package/dist/primitives/layout.js +13 -0
  188. package/dist/primitives/layout.js.map +1 -1
  189. package/dist/primitives/minimal_save.d.ts +38 -0
  190. package/dist/primitives/minimal_save.d.ts.map +1 -0
  191. package/dist/primitives/minimal_save.js +323 -0
  192. package/dist/primitives/minimal_save.js.map +1 -0
  193. package/dist/primitives/namespaces.d.ts +46 -0
  194. package/dist/primitives/namespaces.d.ts.map +1 -1
  195. package/dist/primitives/namespaces.js +49 -0
  196. package/dist/primitives/namespaces.js.map +1 -1
  197. package/dist/primitives/reject_changes.d.ts +4 -2
  198. package/dist/primitives/reject_changes.d.ts.map +1 -1
  199. package/dist/primitives/reject_changes.js +177 -24
  200. package/dist/primitives/reject_changes.js.map +1 -1
  201. package/dist/primitives/revision-parts.d.ts +7 -0
  202. package/dist/primitives/revision-parts.d.ts.map +1 -0
  203. package/dist/primitives/revision-parts.js +27 -0
  204. package/dist/primitives/revision-parts.js.map +1 -0
  205. package/dist/primitives/revision-vocabulary.d.ts +7 -0
  206. package/dist/primitives/revision-vocabulary.d.ts.map +1 -0
  207. package/dist/primitives/revision-vocabulary.js +39 -0
  208. package/dist/primitives/revision-vocabulary.js.map +1 -0
  209. package/dist/primitives/schema-corpus-capture.d.ts +19 -0
  210. package/dist/primitives/schema-corpus-capture.d.ts.map +1 -0
  211. package/dist/primitives/schema-corpus-capture.js +29 -0
  212. package/dist/primitives/schema-corpus-capture.js.map +1 -0
  213. package/dist/primitives/sectPrAudit.d.ts +19 -0
  214. package/dist/primitives/sectPrAudit.d.ts.map +1 -0
  215. package/dist/primitives/sectPrAudit.js +165 -0
  216. package/dist/primitives/sectPrAudit.js.map +1 -0
  217. package/dist/primitives/semantic_tags.d.ts.map +1 -1
  218. package/dist/primitives/semantic_tags.js +2 -1
  219. package/dist/primitives/semantic_tags.js.map +1 -1
  220. package/dist/primitives/serialize_html.d.ts +1 -0
  221. package/dist/primitives/serialize_html.d.ts.map +1 -1
  222. package/dist/primitives/serialize_html.js +4 -2
  223. package/dist/primitives/serialize_html.js.map +1 -1
  224. package/dist/primitives/styles.d.ts +15 -0
  225. package/dist/primitives/styles.d.ts.map +1 -1
  226. package/dist/primitives/styles.js +11 -0
  227. package/dist/primitives/styles.js.map +1 -1
  228. package/dist/primitives/track-changes-emitter.d.ts +9 -0
  229. package/dist/primitives/track-changes-emitter.d.ts.map +1 -1
  230. package/dist/primitives/track-changes-emitter.js +54 -4
  231. package/dist/primitives/track-changes-emitter.js.map +1 -1
  232. package/dist/primitives/validate_ai_revisions.d.ts +35 -0
  233. package/dist/primitives/validate_ai_revisions.d.ts.map +1 -0
  234. package/dist/primitives/validate_ai_revisions.js +323 -0
  235. package/dist/primitives/validate_ai_revisions.js.map +1 -0
  236. package/dist/primitives/xml.d.ts +5 -0
  237. package/dist/primitives/xml.d.ts.map +1 -1
  238. package/dist/primitives/xml.js +5 -0
  239. package/dist/primitives/xml.js.map +1 -1
  240. package/dist/primitives/zip.d.ts +1 -0
  241. package/dist/primitives/zip.d.ts.map +1 -1
  242. package/dist/primitives/zip.js +21 -3
  243. package/dist/primitives/zip.js.map +1 -1
  244. package/dist/shared/field-structure.d.ts +14 -0
  245. package/dist/shared/field-structure.d.ts.map +1 -0
  246. package/dist/shared/field-structure.js +166 -0
  247. package/dist/shared/field-structure.js.map +1 -0
  248. package/package.json +7 -4
@@ -0,0 +1,68 @@
1
+ /**
2
+ * word/settings.xml emitter.
3
+ *
4
+ * Only emitted when the document actually needs a setting: `w:evenAndOddHeaders`
5
+ * for any section declaring an even-page header or footer, or
6
+ * `w:clrSchemeMapping` when theme-relative authoring or a custom theme is used.
7
+ *
8
+ * @conformance ECMA-376 edition 5, Part 1 § 17.10.1
9
+ */
10
+ import { createWmlElement } from '../../primitives/dom-helpers.js';
11
+ import { OOXML, W } from '../../primitives/namespaces.js';
12
+ import { parseXml, serializeXml, XML_DECL } from '../../primitives/xml.js';
13
+ const SETTINGS_CONTENT_TYPE = 'application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml';
14
+ const SETTINGS_REL_TYPE = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings';
15
+ export function emitSettingsPartIfNeeded(spec, ctx) {
16
+ const needsEvenOdd = spec.sections.some((s) => s.headers?.even || s.footers?.even);
17
+ const needsColorSchemeMapping = spec.theme !== undefined || usesThemeRelativeAuthoring(spec);
18
+ if (!needsEvenOdd && !needsColorSchemeMapping)
19
+ return;
20
+ ctx.registerPart('word/settings.xml', SETTINGS_CONTENT_TYPE, SETTINGS_REL_TYPE);
21
+ const doc = parseXml(`<w:settings xmlns:w="${OOXML.W_NS}"/>`);
22
+ if (needsEvenOdd) {
23
+ doc.documentElement.appendChild(createWmlElement(doc, W.evenAndOddHeaders));
24
+ }
25
+ if (needsColorSchemeMapping) {
26
+ doc.documentElement.appendChild(createWmlElement(doc, W.clrSchemeMapping, {
27
+ 'w:bg1': 'light1',
28
+ 'w:t1': 'dark1',
29
+ 'w:bg2': 'light2',
30
+ 'w:t2': 'dark2',
31
+ 'w:accent1': 'accent1',
32
+ 'w:accent2': 'accent2',
33
+ 'w:accent3': 'accent3',
34
+ 'w:accent4': 'accent4',
35
+ 'w:accent5': 'accent5',
36
+ 'w:accent6': 'accent6',
37
+ 'w:hyperlink': 'hyperlink',
38
+ 'w:followedHyperlink': 'followedHyperlink',
39
+ }));
40
+ }
41
+ ctx.setFileContent('word/settings.xml', XML_DECL + serializeXml(doc));
42
+ }
43
+ function usesThemeRelativeAuthoring(spec) {
44
+ if (spec.styles?.some((style) => style.run?.themeColor !== undefined))
45
+ return true;
46
+ if (spec.numbering?.some((numbering) => numbering.levels.some((level) => level.runProps?.themeColor !== undefined)))
47
+ return true;
48
+ return spec.sections.some((section) => {
49
+ const blocks = [
50
+ ...section.blocks,
51
+ ...Object.values(section.headers ?? {}).flatMap((story) => story?.blocks ?? []),
52
+ ...Object.values(section.footers ?? {}).flatMap((story) => story?.blocks ?? []),
53
+ ];
54
+ return blocks.some(blockUsesThemeRelativeAuthoring);
55
+ });
56
+ }
57
+ function blockUsesThemeRelativeAuthoring(block) {
58
+ if (block.kind === 'paragraph')
59
+ return block.runs.some(inlineUsesThemeRelativeAuthoring);
60
+ return block.rows.some((row) => row.cells.some(cellUsesThemeRelativeAuthoring));
61
+ }
62
+ function inlineUsesThemeRelativeAuthoring(inline) {
63
+ return (inline.kind === 'text' || inline.kind === 'field') && inline.themeColor !== undefined;
64
+ }
65
+ function cellUsesThemeRelativeAuthoring(cell) {
66
+ return cell.themeFill !== undefined || cell.blocks.some(blockUsesThemeRelativeAuthoring);
67
+ }
68
+ //# sourceMappingURL=settings-part.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-part.js","sourceRoot":"","sources":["../../../src/generation/emit/settings-part.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * word/styles.xml emitter.
3
+ *
4
+ * Always emitted: document defaults, the Normal paragraph style, and every
5
+ * declared StyleSpec. Style pPr/rPr go through the same shared property
6
+ * builders as direct formatting (emit/properties.ts), so a style definition
7
+ * and an inline run can never disagree on how a property serializes.
8
+ *
9
+ * @conformance ECMA-376 edition 5, Part 1 § 17.7.4.18
10
+ */
11
+ import type { CompileContext } from '../context.js';
12
+ import type { DocumentSpec } from '../types.js';
13
+ export declare const STYLES_CONTENT_TYPE = "application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml";
14
+ export declare const STYLES_REL_TYPE = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles";
15
+ export declare function emitStylesPart(spec: DocumentSpec, ctx: CompileContext): void;
16
+ //# sourceMappingURL=styles-part.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles-part.d.ts","sourceRoot":"","sources":["../../../src/generation/emit/styles-part.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAA6B,MAAM,aAAa,CAAC;AAI3E,eAAO,MAAM,mBAAmB,8EAA8E,CAAC;AAC/G,eAAO,MAAM,eAAe,+EAA+E,CAAC;AAQ5G,wBAAgB,cAAc,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,cAAc,GAAG,IAAI,CAc5E"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * word/styles.xml emitter.
3
+ *
4
+ * Always emitted: document defaults, the Normal paragraph style, and every
5
+ * declared StyleSpec. Style pPr/rPr go through the same shared property
6
+ * builders as direct formatting (emit/properties.ts), so a style definition
7
+ * and an inline run can never disagree on how a property serializes.
8
+ *
9
+ * @conformance ECMA-376 edition 5, Part 1 § 17.7.4.18
10
+ */
11
+ import { createWmlElement } from '../../primitives/dom-helpers.js';
12
+ import { OOXML, W } from '../../primitives/namespaces.js';
13
+ import { parseXml, serializeXml, XML_DECL } from '../../primitives/xml.js';
14
+ import { resolveThemeColorValues } from '../theme-colors.js';
15
+ import { buildParagraphPropsElement, buildRunPropsElement, styleParagraphProps } from './properties.js';
16
+ export const STYLES_CONTENT_TYPE = 'application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml';
17
+ export const STYLES_REL_TYPE = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles';
18
+ const STYLES_SKELETON = `<w:styles xmlns:w="${OOXML.W_NS}"/>`;
19
+ /** Default run properties for docDefaults: Calibri 11pt, matching Word's baseline. */
20
+ const DEFAULT_FONT = 'Calibri';
21
+ const DEFAULT_SIZE_HALF_POINTS = '22';
22
+ export function emitStylesPart(spec, ctx) {
23
+ ctx.registerPart('word/styles.xml', STYLES_CONTENT_TYPE, STYLES_REL_TYPE);
24
+ const doc = parseXml(STYLES_SKELETON);
25
+ const root = doc.documentElement;
26
+ const themeColorValues = resolveThemeColorValues(spec.theme);
27
+ root.appendChild(buildDocDefaults(doc));
28
+ root.appendChild(buildNormalStyle(doc));
29
+ for (const style of spec.styles ?? []) {
30
+ root.appendChild(buildStyle(doc, style, themeColorValues));
31
+ }
32
+ ctx.setFileContent('word/styles.xml', XML_DECL + serializeXml(doc));
33
+ }
34
+ /** @conformance ECMA-376 edition 5, Part 1 § 17.7.5.1 */
35
+ function buildDocDefaults(doc) {
36
+ const docDefaults = createWmlElement(doc, W.docDefaults);
37
+ const rPrDefault = createWmlElement(doc, W.rPrDefault);
38
+ const rPr = createWmlElement(doc, W.rPr);
39
+ rPr.appendChild(createWmlElement(doc, W.rFonts, {
40
+ 'w:ascii': DEFAULT_FONT,
41
+ 'w:hAnsi': DEFAULT_FONT,
42
+ 'w:cs': DEFAULT_FONT,
43
+ }));
44
+ rPr.appendChild(createWmlElement(doc, W.sz, { 'w:val': DEFAULT_SIZE_HALF_POINTS }));
45
+ rPr.appendChild(createWmlElement(doc, W.szCs, { 'w:val': DEFAULT_SIZE_HALF_POINTS }));
46
+ rPrDefault.appendChild(rPr);
47
+ docDefaults.appendChild(rPrDefault);
48
+ const pPrDefault = createWmlElement(doc, W.pPrDefault);
49
+ docDefaults.appendChild(pPrDefault);
50
+ return docDefaults;
51
+ }
52
+ function buildNormalStyle(doc) {
53
+ const style = createWmlElement(doc, W.style, { 'w:type': 'paragraph', 'w:styleId': 'Normal', 'w:default': '1' });
54
+ style.appendChild(createWmlElement(doc, W.name, { 'w:val': 'Normal' }));
55
+ style.appendChild(createWmlElement(doc, W.qFormat));
56
+ return style;
57
+ }
58
+ /** @conformance ECMA-376 edition 5, Part 1 § 17.7.4.17 */
59
+ function buildStyle(doc, spec, themeColorValues) {
60
+ const style = createWmlElement(doc, W.style, { 'w:type': spec.type, 'w:styleId': spec.styleId });
61
+ style.appendChild(createWmlElement(doc, W.name, { 'w:val': spec.name }));
62
+ if (spec.basedOn !== undefined) {
63
+ style.appendChild(createWmlElement(doc, W.basedOn, { 'w:val': spec.basedOn }));
64
+ }
65
+ if (spec.next !== undefined) {
66
+ style.appendChild(createWmlElement(doc, W.next, { 'w:val': spec.next }));
67
+ }
68
+ style.appendChild(createWmlElement(doc, W.qFormat));
69
+ // CT_Style declares pPr before rPr.
70
+ if (spec.paragraph) {
71
+ const pPr = buildParagraphPropsElement(doc, styleParagraphProps(spec));
72
+ if (pPr)
73
+ style.appendChild(pPr);
74
+ }
75
+ if (spec.run) {
76
+ const rPr = buildRunPropsElement(doc, spec.run, { themeColorValues });
77
+ if (rPr)
78
+ style.appendChild(rPr);
79
+ }
80
+ return style;
81
+ }
82
+ //# sourceMappingURL=styles-part.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles-part.js","sourceRoot":"","sources":["../../../src/generation/emit/styles-part.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Table emitter.
3
+ *
4
+ * Compiles TableSpec nodes into w:tbl structures: table-level properties and
5
+ * the column grid, then rows and cells. Cell content reuses the paragraph
6
+ * emitter, and nested tables recurse through buildTable. Two invariants are
7
+ * enforced by construction rather than checked after the fact:
8
+ *
9
+ * - every cell ends with a w:p (readers treat a cell whose last block is a
10
+ * table as corrupt), and
11
+ * - cell widths always come from somewhere deterministic — an explicit
12
+ * widthTwips, or the sum of the grid columns the cell spans.
13
+ */
14
+ import type { BlockSpec, TableSpec } from '../types.js';
15
+ import type { BlockEmitContext } from './emit-context.js';
16
+ /**
17
+ * Build the w:tbl element for a table block.
18
+ *
19
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.37
20
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.59
21
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.48
22
+ */
23
+ export declare function buildTable(doc: Document, table: TableSpec, ctx?: BlockEmitContext): Element;
24
+ /** Dispatch a block-level spec node to its emitter (cells hold both kinds). */
25
+ export declare function buildBlock(doc: Document, block: BlockSpec, ctx?: BlockEmitContext): Element;
26
+ //# sourceMappingURL=table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../../src/generation/emit/table.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAyD,SAAS,EAAE,MAAM,aAAa,CAAC;AAC/G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG1D;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAQ3F;AA4ID,+EAA+E;AAC/E,wBAAgB,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAE3F"}
@@ -0,0 +1,209 @@
1
+ /**
2
+ * Table emitter.
3
+ *
4
+ * Compiles TableSpec nodes into w:tbl structures: table-level properties and
5
+ * the column grid, then rows and cells. Cell content reuses the paragraph
6
+ * emitter, and nested tables recurse through buildTable. Two invariants are
7
+ * enforced by construction rather than checked after the fact:
8
+ *
9
+ * - every cell ends with a w:p (readers treat a cell whose last block is a
10
+ * table as corrupt), and
11
+ * - cell widths always come from somewhere deterministic — an explicit
12
+ * widthTwips, or the sum of the grid columns the cell spans.
13
+ */
14
+ import { createWmlElement } from '../../primitives/dom-helpers.js';
15
+ import { W } from '../../primitives/namespaces.js';
16
+ import { appendInOrder, TBLPR_ORDER, TCPR_ORDER, TRPR_ORDER } from '../ordering.js';
17
+ import { buildParagraph } from './paragraph.js';
18
+ /**
19
+ * Build the w:tbl element for a table block.
20
+ *
21
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.37
22
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.59
23
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.48
24
+ */
25
+ export function buildTable(doc, table, ctx) {
26
+ const tbl = createWmlElement(doc, W.tbl);
27
+ tbl.appendChild(buildTblPr(doc, table));
28
+ tbl.appendChild(buildTblGrid(doc, table));
29
+ for (const row of table.rows) {
30
+ tbl.appendChild(buildRow(doc, table, row, ctx));
31
+ }
32
+ return tbl;
33
+ }
34
+ /**
35
+ * Table-level properties. w:tblW always carries the dxa sum of the declared
36
+ * grid so the preferred width and the grid agree, and w:tblLayout is always
37
+ * emitted explicitly (fixed by default) because autofit is the reader-side
38
+ * default and silently reflows fixed designs.
39
+ *
40
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.63
41
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.52
42
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.38
43
+ */
44
+ function buildTblPr(doc, table) {
45
+ const tblPr = createWmlElement(doc, W.tblPr);
46
+ const props = new Map();
47
+ const widthSum = table.columnWidthsTwips.reduce((sum, w) => sum + w, 0);
48
+ props.set(W.tblW, createWmlElement(doc, W.tblW, { 'w:w': String(widthSum), 'w:type': 'dxa' }));
49
+ if (table.borders) {
50
+ props.set(W.tblBorders, buildBordersElement(doc, W.tblBorders, table.borders));
51
+ }
52
+ props.set(W.tblLayout, createWmlElement(doc, W.tblLayout, { 'w:type': table.layout ?? 'fixed' }));
53
+ appendInOrder(tblPr, props, TBLPR_ORDER);
54
+ return tblPr;
55
+ }
56
+ /**
57
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.16
58
+ */
59
+ function buildTblGrid(doc, table) {
60
+ const tblGrid = createWmlElement(doc, W.tblGrid);
61
+ for (const width of table.columnWidthsTwips) {
62
+ tblGrid.appendChild(createWmlElement(doc, W.gridCol, { 'w:w': String(width) }));
63
+ }
64
+ return tblGrid;
65
+ }
66
+ /**
67
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.78
68
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.80
69
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.49
70
+ */
71
+ function buildRow(doc, table, row, ctx) {
72
+ const tr = createWmlElement(doc, W.tr);
73
+ const props = new Map();
74
+ if (row.heightTwips !== undefined) {
75
+ props.set(W.trHeight, createWmlElement(doc, W.trHeight, {
76
+ 'w:val': String(row.heightTwips),
77
+ 'w:hRule': row.heightRule ?? 'atLeast',
78
+ }));
79
+ }
80
+ if (row.header) {
81
+ props.set(W.tblHeader, createWmlElement(doc, W.tblHeader));
82
+ }
83
+ if (props.size > 0) {
84
+ const trPr = createWmlElement(doc, W.trPr);
85
+ appendInOrder(trPr, props, TRPR_ORDER);
86
+ tr.appendChild(trPr);
87
+ }
88
+ let gridOffset = 0;
89
+ for (const cell of row.cells) {
90
+ const span = cell.gridSpan ?? 1;
91
+ tr.appendChild(buildCell(doc, table, cell, gridOffset, ctx));
92
+ gridOffset += span;
93
+ }
94
+ return tr;
95
+ }
96
+ /**
97
+ * Cell properties in TCPR_ORDER, then cell content. An unspecified width
98
+ * falls back to the sum of the spanned grid columns; a vertical-merge
99
+ * continuation is the bare element form Word itself writes.
100
+ *
101
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.65
102
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.69
103
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.71
104
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.17
105
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.84
106
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.32
107
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.83
108
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.68
109
+ */
110
+ function buildCell(doc, table, cell, gridOffset, ctx) {
111
+ const tc = createWmlElement(doc, W.tc);
112
+ const tcPr = createWmlElement(doc, W.tcPr);
113
+ const props = new Map();
114
+ const span = cell.gridSpan ?? 1;
115
+ const width = cell.widthTwips ?? table.columnWidthsTwips.slice(gridOffset, gridOffset + span).reduce((sum, w) => sum + w, 0);
116
+ props.set(W.tcW, createWmlElement(doc, W.tcW, { 'w:w': String(width), 'w:type': 'dxa' }));
117
+ if (cell.gridSpan !== undefined && cell.gridSpan > 1) {
118
+ props.set(W.gridSpan, createWmlElement(doc, W.gridSpan, { 'w:val': String(cell.gridSpan) }));
119
+ }
120
+ if (cell.vMerge !== undefined) {
121
+ props.set(W.vMerge, cell.vMerge === 'restart' ? createWmlElement(doc, W.vMerge, { 'w:val': 'restart' }) : createWmlElement(doc, W.vMerge));
122
+ }
123
+ if (cell.borders) {
124
+ props.set(W.tcBorders, buildBordersElement(doc, W.tcBorders, cell.borders));
125
+ }
126
+ if (cell.shadingHex !== undefined || cell.themeFill !== undefined) {
127
+ const attrs = { 'w:val': 'clear', 'w:color': 'auto' };
128
+ if (cell.shadingHex !== undefined)
129
+ attrs['w:fill'] = cell.shadingHex;
130
+ if (cell.themeFill !== undefined) {
131
+ attrs['w:themeFill'] = cell.themeFill;
132
+ const fallback = ctx?.themeColorValues?.get(cell.themeFill);
133
+ if (fallback !== undefined && attrs['w:fill'] === undefined)
134
+ attrs['w:fill'] = fallback;
135
+ }
136
+ if (cell.themeFillTint !== undefined)
137
+ attrs['w:themeFillTint'] = cell.themeFillTint;
138
+ if (cell.themeFillShade !== undefined)
139
+ attrs['w:themeFillShade'] = cell.themeFillShade;
140
+ props.set(W.shd, createWmlElement(doc, W.shd, attrs));
141
+ }
142
+ if (cell.marginsTwips) {
143
+ props.set(W.tcMar, buildCellMargins(doc, cell.marginsTwips));
144
+ }
145
+ if (cell.vAlign !== undefined) {
146
+ props.set(W.vAlign, createWmlElement(doc, W.vAlign, { 'w:val': cell.vAlign }));
147
+ }
148
+ appendInOrder(tcPr, props, TCPR_ORDER);
149
+ tc.appendChild(tcPr);
150
+ for (const block of cell.blocks) {
151
+ tc.appendChild(buildBlock(doc, block, ctx));
152
+ }
153
+ // A cell must end with a paragraph: readers reject a cell that is empty or
154
+ // whose last block is a table.
155
+ const last = cell.blocks[cell.blocks.length - 1];
156
+ if (!last || last.kind === 'table') {
157
+ tc.appendChild(createWmlElement(doc, W.p));
158
+ }
159
+ return tc;
160
+ }
161
+ /** Dispatch a block-level spec node to its emitter (cells hold both kinds). */
162
+ export function buildBlock(doc, block, ctx) {
163
+ return block.kind === 'table' ? buildTable(doc, block, ctx) : buildParagraph(doc, block, ctx);
164
+ }
165
+ /**
166
+ * Border collection in CT_TblBorders / CT_TcBorders schema order. Every edge
167
+ * present in the spec is emitted with explicit size/space/color so readers
168
+ * don't fall back to divergent defaults.
169
+ *
170
+ * @conformance ECMA-376 edition 5, Part 1 § 17.4.66
171
+ */
172
+ function buildBordersElement(doc, localName, borders) {
173
+ const container = createWmlElement(doc, localName);
174
+ const edges = [
175
+ [W.top, borders.top],
176
+ [W.left, borders.left],
177
+ [W.bottom, borders.bottom],
178
+ [W.right, borders.right],
179
+ [W.insideH, borders.insideH],
180
+ [W.insideV, borders.insideV],
181
+ ];
182
+ for (const [edge, spec] of edges) {
183
+ if (!spec)
184
+ continue;
185
+ container.appendChild(createWmlElement(doc, edge, {
186
+ 'w:val': spec.style,
187
+ 'w:sz': String(spec.style === 'none' ? 0 : (spec.sizeEighthPt ?? 4)),
188
+ 'w:space': '0',
189
+ 'w:color': spec.colorHex ?? 'auto',
190
+ }));
191
+ }
192
+ return container;
193
+ }
194
+ function buildCellMargins(doc, margins) {
195
+ const tcMar = createWmlElement(doc, W.tcMar);
196
+ const edges = [
197
+ [W.top, margins.top],
198
+ [W.left, margins.left],
199
+ [W.bottom, margins.bottom],
200
+ [W.right, margins.right],
201
+ ];
202
+ for (const [edge, value] of edges) {
203
+ if (value === undefined)
204
+ continue;
205
+ tcMar.appendChild(createWmlElement(doc, edge, { 'w:w': String(value), 'w:type': 'dxa' }));
206
+ }
207
+ return tcMar;
208
+ }
209
+ //# sourceMappingURL=table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table.js","sourceRoot":"","sources":["../../../src/generation/emit/table.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * word/theme/theme1.xml emitter.
3
+ *
4
+ * Emitted on every package. Word-authored documents always reference a theme
5
+ * (default fonts/colors resolve through it); shipping the canonical Office theme
6
+ * keeps generated output part-for-part comparable to genuine Word output and
7
+ * removes a suspected Word-for-Mac repair trigger (issue #482). The body is the
8
+ * complete, static Office default theme — a truncated fmtScheme is itself a repair
9
+ * trigger, so the full color/font/format scheme is emitted verbatim. Static body →
10
+ * determinism holds.
11
+ *
12
+ * The root is the DrawingML `a:theme` element carrying themeElements
13
+ * (clrScheme + fontScheme + fmtScheme). Optional generation theme input applies
14
+ * partial color/font overrides to that canonical template before serialization.
15
+ */
16
+ import type { CompileContext } from '../context.js';
17
+ import type { DocumentThemeSpec, ThemeColorSlot } from '../types.js';
18
+ /** Maps each authoring slot to its `clrScheme` child element name in theme1.xml. */
19
+ export declare const THEME_SLOT_TO_CLR_SCHEME: Record<ThemeColorSlot, string>;
20
+ export declare function emitThemePart(ctx: CompileContext, theme?: DocumentThemeSpec): void;
21
+ //# sourceMappingURL=theme-part.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-part.d.ts","sourceRoot":"","sources":["../../../src/generation/emit/theme-part.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAQrE,oFAAoF;AACpF,eAAO,MAAM,wBAAwB,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAanE,CAAC;AAgFF,wBAAgB,aAAa,CAAC,GAAG,EAAE,cAAc,EAAE,KAAK,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAQlF"}
@@ -0,0 +1,151 @@
1
+ /**
2
+ * word/theme/theme1.xml emitter.
3
+ *
4
+ * Emitted on every package. Word-authored documents always reference a theme
5
+ * (default fonts/colors resolve through it); shipping the canonical Office theme
6
+ * keeps generated output part-for-part comparable to genuine Word output and
7
+ * removes a suspected Word-for-Mac repair trigger (issue #482). The body is the
8
+ * complete, static Office default theme — a truncated fmtScheme is itself a repair
9
+ * trigger, so the full color/font/format scheme is emitted verbatim. Static body →
10
+ * determinism holds.
11
+ *
12
+ * The root is the DrawingML `a:theme` element carrying themeElements
13
+ * (clrScheme + fontScheme + fmtScheme). Optional generation theme input applies
14
+ * partial color/font overrides to that canonical template before serialization.
15
+ */
16
+ import { parseXml, serializeXml, XML_DECL } from '../../primitives/xml.js';
17
+ const THEME_CONTENT_TYPE = 'application/vnd.openxmlformats-officedocument.theme+xml';
18
+ const THEME_REL_TYPE = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme';
19
+ const A_NS = 'http://schemas.openxmlformats.org/drawingml/2006/main';
20
+ /** Maps each authoring slot to its `clrScheme` child element name in theme1.xml. */
21
+ export const THEME_SLOT_TO_CLR_SCHEME = {
22
+ text1: 'dk1',
23
+ background1: 'lt1',
24
+ text2: 'dk2',
25
+ background2: 'lt2',
26
+ accent1: 'accent1',
27
+ accent2: 'accent2',
28
+ accent3: 'accent3',
29
+ accent4: 'accent4',
30
+ accent5: 'accent5',
31
+ accent6: 'accent6',
32
+ hyperlink: 'hlink',
33
+ followedHyperlink: 'folHlink',
34
+ };
35
+ /** The canonical Office default theme (clrScheme + fontScheme + full fmtScheme). */
36
+ const THEME1_XML = `<a:theme xmlns:a="${A_NS}" name="Office Theme">` +
37
+ '<a:themeElements>' +
38
+ '<a:clrScheme name="Office">' +
39
+ '<a:dk1><a:sysClr val="windowText" lastClr="000000"/></a:dk1>' +
40
+ '<a:lt1><a:sysClr val="window" lastClr="FFFFFF"/></a:lt1>' +
41
+ '<a:dk2><a:srgbClr val="44546A"/></a:dk2>' +
42
+ '<a:lt2><a:srgbClr val="E7E6E6"/></a:lt2>' +
43
+ '<a:accent1><a:srgbClr val="4472C4"/></a:accent1>' +
44
+ '<a:accent2><a:srgbClr val="ED7D31"/></a:accent2>' +
45
+ '<a:accent3><a:srgbClr val="A5A5A5"/></a:accent3>' +
46
+ '<a:accent4><a:srgbClr val="FFC000"/></a:accent4>' +
47
+ '<a:accent5><a:srgbClr val="5B9BD5"/></a:accent5>' +
48
+ '<a:accent6><a:srgbClr val="70AD47"/></a:accent6>' +
49
+ '<a:hlink><a:srgbClr val="0563C1"/></a:hlink>' +
50
+ '<a:folHlink><a:srgbClr val="954F72"/></a:folHlink>' +
51
+ '</a:clrScheme>' +
52
+ '<a:fontScheme name="Office">' +
53
+ '<a:majorFont>' +
54
+ '<a:latin typeface="Calibri Light" panose="020F0302020204030204"/>' +
55
+ '<a:ea typeface=""/>' +
56
+ '<a:cs typeface=""/>' +
57
+ '</a:majorFont>' +
58
+ '<a:minorFont>' +
59
+ '<a:latin typeface="Calibri" panose="020F0502020204030204"/>' +
60
+ '<a:ea typeface=""/>' +
61
+ '<a:cs typeface=""/>' +
62
+ '</a:minorFont>' +
63
+ '</a:fontScheme>' +
64
+ '<a:fmtScheme name="Office">' +
65
+ '<a:fillStyleLst>' +
66
+ '<a:solidFill><a:schemeClr val="phClr"/></a:solidFill>' +
67
+ '<a:gradFill rotWithShape="1">' +
68
+ '<a:gsLst>' +
69
+ '<a:gs pos="0"><a:schemeClr val="phClr"><a:lumMod val="110000"/><a:satMod val="105000"/><a:tint val="67000"/></a:schemeClr></a:gs>' +
70
+ '<a:gs pos="50000"><a:schemeClr val="phClr"><a:lumMod val="105000"/><a:satMod val="103000"/><a:tint val="73000"/></a:schemeClr></a:gs>' +
71
+ '<a:gs pos="100000"><a:schemeClr val="phClr"><a:lumMod val="105000"/><a:satMod val="109000"/><a:tint val="81000"/></a:schemeClr></a:gs>' +
72
+ '</a:gsLst>' +
73
+ '<a:lin ang="5400000" scaled="0"/>' +
74
+ '</a:gradFill>' +
75
+ '<a:gradFill rotWithShape="1">' +
76
+ '<a:gsLst>' +
77
+ '<a:gs pos="0"><a:schemeClr val="phClr"><a:satMod val="103000"/><a:lumMod val="102000"/><a:tint val="94000"/></a:schemeClr></a:gs>' +
78
+ '<a:gs pos="50000"><a:schemeClr val="phClr"><a:satMod val="110000"/><a:lumMod val="100000"/><a:shade val="100000"/></a:schemeClr></a:gs>' +
79
+ '<a:gs pos="100000"><a:schemeClr val="phClr"><a:lumMod val="99000"/><a:satMod val="120000"/><a:shade val="78000"/></a:schemeClr></a:gs>' +
80
+ '</a:gsLst>' +
81
+ '<a:lin ang="5400000" scaled="0"/>' +
82
+ '</a:gradFill>' +
83
+ '</a:fillStyleLst>' +
84
+ '<a:lnStyleLst>' +
85
+ '<a:ln w="6350" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/><a:miter lim="800000"/></a:ln>' +
86
+ '<a:ln w="12700" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/><a:miter lim="800000"/></a:ln>' +
87
+ '<a:ln w="19050" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/><a:miter lim="800000"/></a:ln>' +
88
+ '</a:lnStyleLst>' +
89
+ '<a:effectStyleLst>' +
90
+ '<a:effectStyle><a:effectLst/></a:effectStyle>' +
91
+ '<a:effectStyle><a:effectLst/></a:effectStyle>' +
92
+ '<a:effectStyle><a:effectLst><a:outerShdw blurRad="57150" dist="19050" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="63000"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle>' +
93
+ '</a:effectStyleLst>' +
94
+ '<a:bgFillStyleLst>' +
95
+ '<a:solidFill><a:schemeClr val="phClr"/></a:solidFill>' +
96
+ '<a:solidFill><a:schemeClr val="phClr"><a:tint val="95000"/><a:satMod val="170000"/></a:schemeClr></a:solidFill>' +
97
+ '<a:gradFill rotWithShape="1">' +
98
+ '<a:gsLst>' +
99
+ '<a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="93000"/><a:satMod val="150000"/><a:shade val="98000"/><a:lumMod val="102000"/></a:schemeClr></a:gs>' +
100
+ '<a:gs pos="50000"><a:schemeClr val="phClr"><a:tint val="98000"/><a:satMod val="130000"/><a:shade val="90000"/><a:lumMod val="103000"/></a:schemeClr></a:gs>' +
101
+ '<a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="63000"/><a:satMod val="120000"/></a:schemeClr></a:gs>' +
102
+ '</a:gsLst>' +
103
+ '<a:lin ang="5400000" scaled="0"/>' +
104
+ '</a:gradFill>' +
105
+ '</a:bgFillStyleLst>' +
106
+ '</a:fmtScheme>' +
107
+ '</a:themeElements>' +
108
+ '<a:objectDefaults/>' +
109
+ '<a:extraClrSchemeLst/>' +
110
+ '</a:theme>';
111
+ export function emitThemePart(ctx, theme) {
112
+ ctx.registerPart('word/theme/theme1.xml', THEME_CONTENT_TYPE, THEME_REL_TYPE);
113
+ // Parse + reserialize: normalizes output and fails loudly if the static body is
114
+ // ever edited into malformed XML. Theme overrides mutate that parsed template
115
+ // so callers get the complete Office fmtScheme with only requested changes.
116
+ const doc = parseXml(THEME1_XML);
117
+ applyThemeOverrides(doc, theme);
118
+ ctx.setFileContent('word/theme/theme1.xml', XML_DECL + serializeXml(doc));
119
+ }
120
+ function applyThemeOverrides(doc, theme) {
121
+ if (!theme)
122
+ return;
123
+ for (const [slot, hex] of Object.entries(theme.colors ?? {})) {
124
+ replaceSchemeColor(doc, slot, hex);
125
+ }
126
+ if (theme.fonts?.major !== undefined) {
127
+ setLatinTypeface(doc, 'a:majorFont', theme.fonts.major);
128
+ }
129
+ if (theme.fonts?.minor !== undefined) {
130
+ setLatinTypeface(doc, 'a:minorFont', theme.fonts.minor);
131
+ }
132
+ }
133
+ function replaceSchemeColor(doc, slot, hex) {
134
+ const elementName = THEME_SLOT_TO_CLR_SCHEME[slot];
135
+ const schemeEl = doc.getElementsByTagName(`a:${elementName}`).item(0);
136
+ if (!schemeEl)
137
+ throw new Error(`theme clrScheme is missing a:${elementName}`);
138
+ while (schemeEl.firstChild)
139
+ schemeEl.removeChild(schemeEl.firstChild);
140
+ const srgb = doc.createElementNS(A_NS, 'a:srgbClr');
141
+ srgb.setAttribute('val', hex);
142
+ schemeEl.appendChild(srgb);
143
+ }
144
+ function setLatinTypeface(doc, fontElementName, typeface) {
145
+ const fontEl = doc.getElementsByTagName(fontElementName).item(0);
146
+ const latin = fontEl?.getElementsByTagName('a:latin').item(0);
147
+ if (!latin)
148
+ throw new Error(`theme fontScheme is missing ${fontElementName}/a:latin`);
149
+ latin.setAttribute('typeface', typeface);
150
+ }
151
+ //# sourceMappingURL=theme-part.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-part.js","sourceRoot":"","sources":["../../../src/generation/emit/theme-part.ts"],"names":[],"mappings":"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"}