@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,24 @@
1
+ /**
2
+ * Paragraph emitter.
3
+ *
4
+ * Shipped: paragraphs with style references and direct formatting
5
+ * (alignment, spacing, indentation, tabs, keepNext, pageBreakBefore), all
6
+ * routed through the shared pPr builder and PPR_ORDER. The section-break
7
+ * injection hook (a pPr-only sectPr) arrives with the multi-section phase.
8
+ */
9
+ import type { ParagraphSpec } from '../types.js';
10
+ import type { BlockEmitContext } from './emit-context.js';
11
+ /**
12
+ * List paragraphs reference their numbering definition through w:numPr
13
+ * (w:ilvl then w:numId, per CT_NumPr); the numeric id comes from the
14
+ * numbering part's deterministic handle map.
15
+ *
16
+ * @conformance ECMA-376 edition 5, Part 1 § 17.3.1.19
17
+ * @conformance ECMA-376 edition 5, Part 1 § 17.9.3
18
+ * @conformance ECMA-376 edition 5, Part 1 § 17.9.18
19
+ * @conformance ECMA-376 edition 5, Part 1 § 17.13.4.4
20
+ * @conformance ECMA-376 edition 5, Part 1 § 17.13.4.3
21
+ * @conformance ECMA-376 edition 5, Part 1 § 17.13.4.5
22
+ */
23
+ export declare function buildParagraph(doc: Document, paragraph: ParagraphSpec, ctx?: BlockEmitContext): Element;
24
+ //# sourceMappingURL=paragraph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paragraph.d.ts","sourceRoot":"","sources":["../../../src/generation/emit/paragraph.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAI1D;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAsCvG"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Paragraph emitter.
3
+ *
4
+ * Shipped: paragraphs with style references and direct formatting
5
+ * (alignment, spacing, indentation, tabs, keepNext, pageBreakBefore), all
6
+ * routed through the shared pPr builder and PPR_ORDER. The section-break
7
+ * injection hook (a pPr-only sectPr) arrives with the multi-section phase.
8
+ */
9
+ import { createWmlElement } from '../../primitives/dom-helpers.js';
10
+ import { W } from '../../primitives/namespaces.js';
11
+ import { GenerationInternalError } from '../errors.js';
12
+ import { buildParagraphPropsElement } from './properties.js';
13
+ import { buildInlineRuns } from './run.js';
14
+ /**
15
+ * List paragraphs reference their numbering definition through w:numPr
16
+ * (w:ilvl then w:numId, per CT_NumPr); the numeric id comes from the
17
+ * numbering part's deterministic handle map.
18
+ *
19
+ * @conformance ECMA-376 edition 5, Part 1 § 17.3.1.19
20
+ * @conformance ECMA-376 edition 5, Part 1 § 17.9.3
21
+ * @conformance ECMA-376 edition 5, Part 1 § 17.9.18
22
+ * @conformance ECMA-376 edition 5, Part 1 § 17.13.4.4
23
+ * @conformance ECMA-376 edition 5, Part 1 § 17.13.4.3
24
+ * @conformance ECMA-376 edition 5, Part 1 § 17.13.4.5
25
+ */
26
+ export function buildParagraph(doc, paragraph, ctx) {
27
+ const p = createWmlElement(doc, W.p);
28
+ let extras;
29
+ if (paragraph.list !== undefined) {
30
+ const numericId = ctx?.numberingIds?.get(paragraph.list.numId);
31
+ if (numericId === undefined) {
32
+ throw new GenerationInternalError(`List paragraph references numbering handle '${paragraph.list.numId}' with no allocated numeric id`);
33
+ }
34
+ const numPr = createWmlElement(doc, W.numPr);
35
+ numPr.appendChild(createWmlElement(doc, W.ilvl, { 'w:val': String(paragraph.list.ilvl) }));
36
+ numPr.appendChild(createWmlElement(doc, W.numId, { 'w:val': String(numericId) }));
37
+ extras = new Map([[W.numPr, numPr]]);
38
+ }
39
+ const pPr = buildParagraphPropsElement(doc, paragraph, extras);
40
+ if (pPr)
41
+ p.appendChild(pPr);
42
+ // Drafting-note anchors: range markers bracket the paragraph's content and
43
+ // the reference run trails it (§ 17.13.4.4 / .3 / .5). Absent a collector
44
+ // (notes disabled, or a story that cannot carry them) the paragraph
45
+ // serializes without any trace of the note.
46
+ const noteId = paragraph.note !== undefined && ctx?.notes ? ctx.notes.allocate(paragraph.note) : undefined;
47
+ if (noteId !== undefined) {
48
+ p.appendChild(createWmlElement(doc, W.commentRangeStart, { 'w:id': String(noteId) }));
49
+ }
50
+ for (const inline of paragraph.runs) {
51
+ for (const run of buildInlineRuns(doc, inline, ctx)) {
52
+ p.appendChild(run);
53
+ }
54
+ }
55
+ if (noteId !== undefined) {
56
+ p.appendChild(createWmlElement(doc, W.commentRangeEnd, { 'w:id': String(noteId) }));
57
+ const referenceRun = createWmlElement(doc, W.r);
58
+ referenceRun.appendChild(createWmlElement(doc, W.commentReference, { 'w:id': String(noteId) }));
59
+ p.appendChild(referenceRun);
60
+ }
61
+ return p;
62
+ }
63
+ //# sourceMappingURL=paragraph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paragraph.js","sourceRoot":"","sources":["../../../src/generation/emit/paragraph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Shared property builders: RunProps → w:rPr and paragraph formatting → w:pPr
3
+ * child maps, used by both the body emitters (run.ts / paragraph.ts) and the
4
+ * styles-part emitter so direct formatting and style definitions can never
5
+ * drift apart. All children are routed through the ordering tables.
6
+ */
7
+ import type { ParagraphSpec, RunProps, StyleSpec, ThemeColorSlot } from '../types.js';
8
+ /** Paragraph-formatting subset shared by ParagraphSpec and StyleSpec.paragraph. */
9
+ export type ParagraphProps = Pick<ParagraphSpec, 'alignment' | 'spacing' | 'indent' | 'tabs' | 'pageBreakBefore' | 'keepNext'> & {
10
+ styleId?: string;
11
+ };
12
+ /**
13
+ * Build the ordered rPr children for a RunProps value. Returns null when no
14
+ * property is set so callers can omit the rPr container entirely.
15
+ *
16
+ * Complex-script twins (bCs/iCs/szCs) and the full rFonts script coverage
17
+ * (ascii + hAnsi + cs) are always emitted alongside their base properties so
18
+ * all script ranges agree.
19
+ *
20
+ * @conformance ECMA-376 edition 5, Part 1 § 17.3.2.28
21
+ */
22
+ export declare function buildRunPropsElement(doc: Document, props: RunProps, opts?: {
23
+ themeColorValues?: ReadonlyMap<ThemeColorSlot, string>;
24
+ }): Element | null;
25
+ /**
26
+ * Build the ordered pPr children for a paragraph-formatting subset. Returns
27
+ * null when nothing is set. The optional extras hook lets phase-specific
28
+ * callers add already-built children (e.g. a section break sectPr) that
29
+ * still go through the same ordering discipline.
30
+ *
31
+ * @conformance ECMA-376 edition 5, Part 1 § 17.3.1.26
32
+ */
33
+ export declare function buildParagraphPropsElement(doc: Document, props: ParagraphProps, extras?: ReadonlyMap<string, Element | Element[]>): Element | null;
34
+ /** Paragraph-formatting subset of a StyleSpec, normalized for the builder. */
35
+ export declare function styleParagraphProps(style: StyleSpec): ParagraphProps;
36
+ //# sourceMappingURL=properties.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"properties.d.ts","sourceRoot":"","sources":["../../../src/generation/emit/properties.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAEtF,mFAAmF;AACnF,MAAM,MAAM,cAAc,GAAG,IAAI,CAC/B,aAAa,EACb,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,GAAG,iBAAiB,GAAG,UAAU,CAC7E,GAAG;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AASzB;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,QAAQ,EACb,KAAK,EAAE,QAAQ,EACf,IAAI,CAAC,EAAE;IAAE,gBAAgB,CAAC,EAAE,WAAW,CAAC,cAAc,EAAE,MAAM,CAAC,CAAA;CAAE,GAChE,OAAO,GAAG,IAAI,CAoDhB;AAED;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,QAAQ,EACb,KAAK,EAAE,cAAc,EACrB,MAAM,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,EAAE,CAAC,GAChD,OAAO,GAAG,IAAI,CAkDhB;AAED,8EAA8E;AAC9E,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,GAAG,cAAc,CAEpE"}
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Shared property builders: RunProps → w:rPr and paragraph formatting → w:pPr
3
+ * child maps, used by both the body emitters (run.ts / paragraph.ts) and the
4
+ * styles-part emitter so direct formatting and style definitions can never
5
+ * drift apart. All children are routed through the ordering tables.
6
+ */
7
+ import { createWmlElement } from '../../primitives/dom-helpers.js';
8
+ import { W } from '../../primitives/namespaces.js';
9
+ import { appendInOrder, PPR_ORDER, RPR_ORDER } from '../ordering.js';
10
+ const ALIGNMENT_TO_JC = {
11
+ left: 'left',
12
+ center: 'center',
13
+ right: 'right',
14
+ justify: 'both',
15
+ };
16
+ /**
17
+ * Build the ordered rPr children for a RunProps value. Returns null when no
18
+ * property is set so callers can omit the rPr container entirely.
19
+ *
20
+ * Complex-script twins (bCs/iCs/szCs) and the full rFonts script coverage
21
+ * (ascii + hAnsi + cs) are always emitted alongside their base properties so
22
+ * all script ranges agree.
23
+ *
24
+ * @conformance ECMA-376 edition 5, Part 1 § 17.3.2.28
25
+ */
26
+ export function buildRunPropsElement(doc, props, opts) {
27
+ const children = new Map();
28
+ if (props.font !== undefined) {
29
+ children.set(W.rFonts, createWmlElement(doc, W.rFonts, {
30
+ 'w:ascii': props.font,
31
+ 'w:hAnsi': props.font,
32
+ 'w:cs': props.font,
33
+ }));
34
+ }
35
+ if (props.bold !== undefined) {
36
+ children.set(W.b, createWmlElement(doc, W.b, props.bold ? undefined : { 'w:val': '0' }));
37
+ children.set(W.bCs, createWmlElement(doc, W.bCs, props.bold ? undefined : { 'w:val': '0' }));
38
+ }
39
+ if (props.italic !== undefined) {
40
+ children.set(W.i, createWmlElement(doc, W.i, props.italic ? undefined : { 'w:val': '0' }));
41
+ children.set(W.iCs, createWmlElement(doc, W.iCs, props.italic ? undefined : { 'w:val': '0' }));
42
+ }
43
+ if (props.caps !== undefined) {
44
+ children.set(W.caps, createWmlElement(doc, W.caps, props.caps ? undefined : { 'w:val': '0' }));
45
+ }
46
+ if (props.smallCaps !== undefined) {
47
+ children.set(W.smallCaps, createWmlElement(doc, W.smallCaps, props.smallCaps ? undefined : { 'w:val': '0' }));
48
+ }
49
+ if (props.colorHex !== undefined || props.themeColor !== undefined) {
50
+ const attrs = {};
51
+ if (props.colorHex !== undefined)
52
+ attrs['w:val'] = props.colorHex;
53
+ if (props.themeColor !== undefined) {
54
+ attrs['w:themeColor'] = props.themeColor;
55
+ const fallback = opts?.themeColorValues?.get(props.themeColor);
56
+ if (fallback !== undefined && attrs['w:val'] === undefined)
57
+ attrs['w:val'] = fallback;
58
+ }
59
+ if (props.themeTint !== undefined)
60
+ attrs['w:themeTint'] = props.themeTint;
61
+ if (props.themeShade !== undefined)
62
+ attrs['w:themeShade'] = props.themeShade;
63
+ children.set(W.color, createWmlElement(doc, W.color, attrs));
64
+ }
65
+ if (props.sizePt !== undefined) {
66
+ const halfPoints = String(Math.round(props.sizePt * 2));
67
+ children.set(W.sz, createWmlElement(doc, W.sz, { 'w:val': halfPoints }));
68
+ children.set(W.szCs, createWmlElement(doc, W.szCs, { 'w:val': halfPoints }));
69
+ }
70
+ if (props.highlight !== undefined) {
71
+ children.set(W.highlight, createWmlElement(doc, W.highlight, { 'w:val': props.highlight }));
72
+ }
73
+ if (props.underline !== undefined) {
74
+ children.set(W.u, createWmlElement(doc, W.u, { 'w:val': props.underline }));
75
+ }
76
+ if (children.size === 0)
77
+ return null;
78
+ const rPr = createWmlElement(doc, W.rPr);
79
+ appendInOrder(rPr, children, RPR_ORDER);
80
+ return rPr;
81
+ }
82
+ /**
83
+ * Build the ordered pPr children for a paragraph-formatting subset. Returns
84
+ * null when nothing is set. The optional extras hook lets phase-specific
85
+ * callers add already-built children (e.g. a section break sectPr) that
86
+ * still go through the same ordering discipline.
87
+ *
88
+ * @conformance ECMA-376 edition 5, Part 1 § 17.3.1.26
89
+ */
90
+ export function buildParagraphPropsElement(doc, props, extras) {
91
+ const children = new Map();
92
+ if (props.styleId !== undefined) {
93
+ children.set(W.pStyle, createWmlElement(doc, W.pStyle, { 'w:val': props.styleId }));
94
+ }
95
+ if (props.keepNext) {
96
+ children.set(W.keepNext, createWmlElement(doc, W.keepNext));
97
+ }
98
+ if (props.pageBreakBefore) {
99
+ children.set(W.pageBreakBefore, createWmlElement(doc, W.pageBreakBefore));
100
+ }
101
+ if (props.tabs && props.tabs.length > 0) {
102
+ const tabs = createWmlElement(doc, W.tabs);
103
+ for (const stop of props.tabs) {
104
+ const attrs = { 'w:val': stop.align, 'w:pos': String(stop.posTwips) };
105
+ if (stop.leader && stop.leader !== 'none')
106
+ attrs['w:leader'] = stop.leader;
107
+ tabs.appendChild(createWmlElement(doc, W.tab, attrs));
108
+ }
109
+ children.set(W.tabs, tabs);
110
+ }
111
+ if (props.spacing) {
112
+ const attrs = {};
113
+ if (props.spacing.beforeTwips !== undefined)
114
+ attrs['w:before'] = String(props.spacing.beforeTwips);
115
+ if (props.spacing.afterTwips !== undefined)
116
+ attrs['w:after'] = String(props.spacing.afterTwips);
117
+ if (props.spacing.lineTwips !== undefined) {
118
+ attrs['w:line'] = String(props.spacing.lineTwips);
119
+ attrs['w:lineRule'] = props.spacing.lineRule ?? 'auto';
120
+ }
121
+ if (Object.keys(attrs).length > 0)
122
+ children.set(W.spacing, createWmlElement(doc, W.spacing, attrs));
123
+ }
124
+ if (props.indent) {
125
+ const attrs = {};
126
+ if (props.indent.leftTwips !== undefined)
127
+ attrs['w:left'] = String(props.indent.leftTwips);
128
+ if (props.indent.rightTwips !== undefined)
129
+ attrs['w:right'] = String(props.indent.rightTwips);
130
+ if (props.indent.firstLineTwips !== undefined)
131
+ attrs['w:firstLine'] = String(props.indent.firstLineTwips);
132
+ if (props.indent.hangingTwips !== undefined)
133
+ attrs['w:hanging'] = String(props.indent.hangingTwips);
134
+ if (Object.keys(attrs).length > 0)
135
+ children.set(W.ind, createWmlElement(doc, W.ind, attrs));
136
+ }
137
+ if (props.alignment !== undefined) {
138
+ children.set(W.jc, createWmlElement(doc, W.jc, { 'w:val': ALIGNMENT_TO_JC[props.alignment] }));
139
+ }
140
+ if (extras) {
141
+ for (const [name, value] of extras)
142
+ children.set(name, value);
143
+ }
144
+ if (children.size === 0)
145
+ return null;
146
+ const pPr = createWmlElement(doc, W.pPr);
147
+ appendInOrder(pPr, children, PPR_ORDER);
148
+ return pPr;
149
+ }
150
+ /** Paragraph-formatting subset of a StyleSpec, normalized for the builder. */
151
+ export function styleParagraphProps(style) {
152
+ return { ...style.paragraph };
153
+ }
154
+ //# sourceMappingURL=properties.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"properties.js","sourceRoot":"","sources":["../../../src/generation/emit/properties.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Inline-run emitter.
3
+ *
4
+ * Shipped: text runs with full RunProps formatting, tab and break runs, and
5
+ * complete five-part complex fields. A FieldSpec compiles to
6
+ * begin → instruction text → separate → cached result → end so reading
7
+ * applications always display a value without recomputation prompts — the
8
+ * required `cachedResult` makes the no-recovery-dialog property
9
+ * unrepresentable-by-omission. `w:dirty` is never set (it triggers
10
+ * update-fields prompts in some readers).
11
+ */
12
+ import type { InlineSpec } from '../types.js';
13
+ import type { BlockEmitContext } from './emit-context.js';
14
+ /** Build the w:r element(s) for one inline spec node. */
15
+ export declare function buildInlineRuns(doc: Document, inline: InlineSpec, ctx?: BlockEmitContext): Element[];
16
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/generation/emit/run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,KAAK,EAAa,UAAU,EAAY,MAAM,aAAa,CAAC;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAqC1D,yDAAyD;AACzD,wBAAgB,eAAe,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,EAAE,gBAAgB,GAAG,OAAO,EAAE,CAsBpG"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Inline-run emitter.
3
+ *
4
+ * Shipped: text runs with full RunProps formatting, tab and break runs, and
5
+ * complete five-part complex fields. A FieldSpec compiles to
6
+ * begin → instruction text → separate → cached result → end so reading
7
+ * applications always display a value without recomputation prompts — the
8
+ * required `cachedResult` makes the no-recovery-dialog property
9
+ * unrepresentable-by-omission. `w:dirty` is never set (it triggers
10
+ * update-fields prompts in some readers).
11
+ */
12
+ import { createWmlElement, createWmlTextElement } from '../../primitives/dom-helpers.js';
13
+ import { W } from '../../primitives/namespaces.js';
14
+ import { GenerationInternalError } from '../errors.js';
15
+ import { buildRunPropsElement } from './properties.js';
16
+ /** Instruction text per field, with the canonical surrounding spaces. */
17
+ const FIELD_INSTRUCTION_TEXT = {
18
+ PAGE: ' PAGE ',
19
+ NUMPAGES: ' NUMPAGES ',
20
+ };
21
+ function makeRun(doc, props, ctx, ...children) {
22
+ const run = createWmlElement(doc, W.r);
23
+ const rPr = buildRunPropsElement(doc, props, { themeColorValues: ctx?.themeColorValues });
24
+ if (rPr)
25
+ run.appendChild(rPr);
26
+ for (const child of children)
27
+ run.appendChild(child);
28
+ return run;
29
+ }
30
+ /**
31
+ * Five sibling runs per field: fldChar begin, preserved-space instruction
32
+ * text, fldChar separate, the cached result, fldChar end.
33
+ *
34
+ * @conformance ECMA-376 edition 5, Part 1 § 17.16.18
35
+ */
36
+ function buildFieldRuns(doc, field, ctx) {
37
+ const instr = createWmlElement(doc, W.instrText);
38
+ instr.setAttribute('xml:space', 'preserve');
39
+ instr.appendChild(doc.createTextNode(FIELD_INSTRUCTION_TEXT[field.field]));
40
+ return [
41
+ makeRun(doc, field, ctx, createWmlElement(doc, W.fldChar, { 'w:fldCharType': 'begin' })),
42
+ makeRun(doc, field, ctx, instr),
43
+ makeRun(doc, field, ctx, createWmlElement(doc, W.fldChar, { 'w:fldCharType': 'separate' })),
44
+ makeRun(doc, field, ctx, createWmlTextElement(doc, field.cachedResult)),
45
+ makeRun(doc, field, ctx, createWmlElement(doc, W.fldChar, { 'w:fldCharType': 'end' })),
46
+ ];
47
+ }
48
+ /** Build the w:r element(s) for one inline spec node. */
49
+ export function buildInlineRuns(doc, inline, ctx) {
50
+ switch (inline.kind) {
51
+ case 'text': {
52
+ const run = createWmlElement(doc, W.r);
53
+ const rPr = buildRunPropsElement(doc, inline, { themeColorValues: ctx?.themeColorValues });
54
+ if (rPr)
55
+ run.appendChild(rPr);
56
+ run.appendChild(createWmlTextElement(doc, inline.text));
57
+ return [run];
58
+ }
59
+ case 'field':
60
+ return buildFieldRuns(doc, inline, ctx);
61
+ case 'tab':
62
+ return [makeRun(doc, {}, ctx, createWmlElement(doc, W.tab))];
63
+ case 'break': {
64
+ const attrs = inline.breakType === 'page' ? { 'w:type': 'page' } : undefined;
65
+ return [makeRun(doc, {}, ctx, createWmlElement(doc, W.br, attrs))];
66
+ }
67
+ default:
68
+ throw new GenerationInternalError(`Inline kind '${inline.kind}' reached the run emitter without a shipped emitter`);
69
+ }
70
+ }
71
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/generation/emit/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Section-properties emitter.
3
+ *
4
+ * Shipped: page size/margins, page numbering, section break type, title-page
5
+ * switch, and header/footer references. The reference rIds come from the
6
+ * header/footer part allocation pass (emit/header-footer-part.ts), which runs
7
+ * before the document part so the sectPr can bind them.
8
+ */
9
+ import type { SectionSpec } from '../types.js';
10
+ /** Header/footer part references for one section, allocated by the parts pass. */
11
+ export type SectionHeaderFooterRefs = {
12
+ headers: Partial<Record<'default' | 'first' | 'even', string>>;
13
+ footers: Partial<Record<'default' | 'first' | 'even', string>>;
14
+ };
15
+ /**
16
+ * Build the w:sectPr element for a section.
17
+ *
18
+ * Width/height are always emitted explicitly (never reader defaults); a
19
+ * landscape request swaps the dimensions and sets w:orient. Header/footer
20
+ * references lead the child sequence; w:titlePg is implied whenever a
21
+ * first-page header or footer is present.
22
+ *
23
+ * @conformance ECMA-376 edition 5, Part 1 § 17.6.13
24
+ * @conformance ECMA-376 edition 5, Part 1 § 17.6.12
25
+ * @conformance ECMA-376 edition 5, Part 1 § 17.10.6
26
+ */
27
+ export declare function buildSectPr(doc: Document, section: SectionSpec, refs?: SectionHeaderFooterRefs): Element;
28
+ export declare function titlePgImplied(section: SectionSpec): boolean;
29
+ //# sourceMappingURL=section.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"section.d.ts","sourceRoot":"","sources":["../../../src/generation/emit/section.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAgB/C,kFAAkF;AAClF,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,GAAG,OAAO,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/D,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,GAAG,OAAO,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAChE,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE,uBAAuB,GAAG,OAAO,CA4BxG;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAE5D"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Section-properties emitter.
3
+ *
4
+ * Shipped: page size/margins, page numbering, section break type, title-page
5
+ * switch, and header/footer references. The reference rIds come from the
6
+ * header/footer part allocation pass (emit/header-footer-part.ts), which runs
7
+ * before the document part so the sectPr can bind them.
8
+ */
9
+ import { createWmlElement } from '../../primitives/dom-helpers.js';
10
+ import { OOXML, W } from '../../primitives/namespaces.js';
11
+ import { appendInOrder, SECTPR_ORDER } from '../ordering.js';
12
+ /** US Letter, in twentieths of a point. */
13
+ const DEFAULT_PAGE = { w: 12240, h: 15840 };
14
+ /** One-inch page margins, half-inch header/footer offsets, no gutter. */
15
+ const DEFAULT_MARGINS = {
16
+ top: 1440,
17
+ right: 1440,
18
+ bottom: 1440,
19
+ left: 1440,
20
+ header: 720,
21
+ footer: 720,
22
+ gutter: 0,
23
+ };
24
+ /**
25
+ * Build the w:sectPr element for a section.
26
+ *
27
+ * Width/height are always emitted explicitly (never reader defaults); a
28
+ * landscape request swaps the dimensions and sets w:orient. Header/footer
29
+ * references lead the child sequence; w:titlePg is implied whenever a
30
+ * first-page header or footer is present.
31
+ *
32
+ * @conformance ECMA-376 edition 5, Part 1 § 17.6.13
33
+ * @conformance ECMA-376 edition 5, Part 1 § 17.6.12
34
+ * @conformance ECMA-376 edition 5, Part 1 § 17.10.6
35
+ */
36
+ export function buildSectPr(doc, section, refs) {
37
+ const sectPr = createWmlElement(doc, W.sectPr);
38
+ const props = new Map();
39
+ if (refs) {
40
+ const headerRefs = buildReferences(doc, W.headerReference, refs.headers);
41
+ const footerRefs = buildReferences(doc, W.footerReference, refs.footers);
42
+ if (headerRefs.length > 0)
43
+ props.set(W.headerReference, headerRefs);
44
+ if (footerRefs.length > 0)
45
+ props.set(W.footerReference, footerRefs);
46
+ }
47
+ if (section.breakType !== undefined) {
48
+ props.set(W.type, createWmlElement(doc, W.type, { 'w:val': section.breakType }));
49
+ }
50
+ props.set(W.pgSz, buildPgSz(doc, section));
51
+ props.set(W.pgMar, buildPgMar(doc, section));
52
+ if (section.pageNumbering) {
53
+ const attrs = {};
54
+ if (section.pageNumbering.start !== undefined)
55
+ attrs['w:start'] = String(section.pageNumbering.start);
56
+ if (section.pageNumbering.format !== undefined)
57
+ attrs['w:fmt'] = section.pageNumbering.format;
58
+ props.set(W.pgNumType, createWmlElement(doc, W.pgNumType, attrs));
59
+ }
60
+ if (titlePgImplied(section)) {
61
+ props.set(W.titlePg, createWmlElement(doc, W.titlePg));
62
+ }
63
+ appendInOrder(sectPr, props, SECTPR_ORDER);
64
+ return sectPr;
65
+ }
66
+ export function titlePgImplied(section) {
67
+ return Boolean(section.titlePg || section.headers?.first || section.footers?.first);
68
+ }
69
+ /**
70
+ * One reference element per declared header/footer slot, in a fixed
71
+ * first/default/even emission order so output is deterministic.
72
+ *
73
+ * @conformance ECMA-376 edition 5, Part 1 § 17.10.5
74
+ * @conformance ECMA-376 edition 5, Part 1 § 17.10.2
75
+ */
76
+ function buildReferences(doc, localName, slots) {
77
+ const out = [];
78
+ for (const type of ['first', 'default', 'even']) {
79
+ const rId = slots[type];
80
+ if (!rId)
81
+ continue;
82
+ const el = createWmlElement(doc, localName, { 'w:type': type });
83
+ el.setAttributeNS(OOXML.R_NS, 'r:id', rId);
84
+ out.push(el);
85
+ }
86
+ return out;
87
+ }
88
+ function buildPgSz(doc, section) {
89
+ const requested = section.page?.sizeTwips ?? DEFAULT_PAGE;
90
+ const landscape = section.page?.orientation === 'landscape';
91
+ const w = landscape ? Math.max(requested.w, requested.h) : requested.w;
92
+ const h = landscape ? Math.min(requested.w, requested.h) : requested.h;
93
+ const attrs = { 'w:w': String(w), 'w:h': String(h) };
94
+ if (landscape)
95
+ attrs['w:orient'] = 'landscape';
96
+ return createWmlElement(doc, W.pgSz, attrs);
97
+ }
98
+ /**
99
+ * The full attribute set (top/right/bottom/left/header/footer/gutter) is
100
+ * always emitted because readers diverge in their defaults when attributes
101
+ * are omitted.
102
+ *
103
+ * @conformance ECMA-376 edition 5, Part 1 § 17.6.11
104
+ */
105
+ function buildPgMar(doc, section) {
106
+ const margins = { ...DEFAULT_MARGINS, ...section.page?.marginsTwips };
107
+ return createWmlElement(doc, W.pgMar, {
108
+ 'w:top': String(margins.top),
109
+ 'w:right': String(margins.right),
110
+ 'w:bottom': String(margins.bottom),
111
+ 'w:left': String(margins.left),
112
+ 'w:header': String(margins.header),
113
+ 'w:footer': String(margins.footer),
114
+ 'w:gutter': String(margins.gutter),
115
+ });
116
+ }
117
+ //# sourceMappingURL=section.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"section.js","sourceRoot":"","sources":["../../../src/generation/emit/section.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
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 type { CompileContext } from '../context.js';
11
+ import type { DocumentSpec } from '../types.js';
12
+ export declare function emitSettingsPartIfNeeded(spec: DocumentSpec, ctx: CompileContext): void;
13
+ //# sourceMappingURL=settings-part.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-part.d.ts","sourceRoot":"","sources":["../../../src/generation/emit/settings-part.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAa,YAAY,EAA6B,MAAM,aAAa,CAAC;AAKtF,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,cAAc,GAAG,IAAI,CA6BtF"}