dom-docx 0.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 (132) hide show
  1. package/API.md +533 -0
  2. package/LICENSE +21 -0
  3. package/README.md +236 -0
  4. package/dist/browser.d.ts +34 -0
  5. package/dist/browser.d.ts.map +1 -0
  6. package/dist/browser.js +35 -0
  7. package/dist/browser.js.map +1 -0
  8. package/dist/cli.d.ts +3 -0
  9. package/dist/cli.d.ts.map +1 -0
  10. package/dist/cli.js +118 -0
  11. package/dist/cli.js.map +1 -0
  12. package/dist/converter/bordered-block.d.ts +54 -0
  13. package/dist/converter/bordered-block.d.ts.map +1 -0
  14. package/dist/converter/bordered-block.js +124 -0
  15. package/dist/converter/bordered-block.js.map +1 -0
  16. package/dist/converter/build-docx.d.ts +46 -0
  17. package/dist/converter/build-docx.d.ts.map +1 -0
  18. package/dist/converter/build-docx.js +161 -0
  19. package/dist/converter/build-docx.js.map +1 -0
  20. package/dist/converter/computed-style-snapshot.browser.js +73 -0
  21. package/dist/converter/computed-style-snapshot.d.ts +10 -0
  22. package/dist/converter/computed-style-snapshot.d.ts.map +1 -0
  23. package/dist/converter/computed-style-snapshot.js +78 -0
  24. package/dist/converter/computed-style-snapshot.js.map +1 -0
  25. package/dist/converter/constants.d.ts +51 -0
  26. package/dist/converter/constants.d.ts.map +1 -0
  27. package/dist/converter/constants.js +163 -0
  28. package/dist/converter/constants.js.map +1 -0
  29. package/dist/converter/css.d.ts +112 -0
  30. package/dist/converter/css.d.ts.map +1 -0
  31. package/dist/converter/css.js +621 -0
  32. package/dist/converter/css.js.map +1 -0
  33. package/dist/converter/flex.d.ts +59 -0
  34. package/dist/converter/flex.d.ts.map +1 -0
  35. package/dist/converter/flex.js +252 -0
  36. package/dist/converter/flex.js.map +1 -0
  37. package/dist/converter/image.d.ts +38 -0
  38. package/dist/converter/image.d.ts.map +1 -0
  39. package/dist/converter/image.js +159 -0
  40. package/dist/converter/image.js.map +1 -0
  41. package/dist/converter/inline.d.ts +18 -0
  42. package/dist/converter/inline.d.ts.map +1 -0
  43. package/dist/converter/inline.js +213 -0
  44. package/dist/converter/inline.js.map +1 -0
  45. package/dist/converter/ooxml-patch.d.ts +23 -0
  46. package/dist/converter/ooxml-patch.d.ts.map +1 -0
  47. package/dist/converter/ooxml-patch.js +54 -0
  48. package/dist/converter/ooxml-patch.js.map +1 -0
  49. package/dist/converter/style-path.d.ts +4 -0
  50. package/dist/converter/style-path.d.ts.map +1 -0
  51. package/dist/converter/style-path.js +17 -0
  52. package/dist/converter/style-path.js.map +1 -0
  53. package/dist/converter/style-resolver-node.d.ts +7 -0
  54. package/dist/converter/style-resolver-node.d.ts.map +1 -0
  55. package/dist/converter/style-resolver-node.js +26 -0
  56. package/dist/converter/style-resolver-node.js.map +1 -0
  57. package/dist/converter/style-resolver.d.ts +24 -0
  58. package/dist/converter/style-resolver.d.ts.map +1 -0
  59. package/dist/converter/style-resolver.js +122 -0
  60. package/dist/converter/style-resolver.js.map +1 -0
  61. package/dist/converter/svg.d.ts +11 -0
  62. package/dist/converter/svg.d.ts.map +1 -0
  63. package/dist/converter/svg.js +116 -0
  64. package/dist/converter/svg.js.map +1 -0
  65. package/dist/converter/table.d.ts +8 -0
  66. package/dist/converter/table.d.ts.map +1 -0
  67. package/dist/converter/table.js +745 -0
  68. package/dist/converter/table.js.map +1 -0
  69. package/dist/converter/text-metrics.d.ts +17 -0
  70. package/dist/converter/text-metrics.d.ts.map +1 -0
  71. package/dist/converter/text-metrics.js +51 -0
  72. package/dist/converter/text-metrics.js.map +1 -0
  73. package/dist/converter/types.d.ts +82 -0
  74. package/dist/converter/types.d.ts.map +1 -0
  75. package/dist/converter/types.js +9 -0
  76. package/dist/converter/types.js.map +1 -0
  77. package/dist/converter/visitor.d.ts +11 -0
  78. package/dist/converter/visitor.d.ts.map +1 -0
  79. package/dist/converter/visitor.js +910 -0
  80. package/dist/converter/visitor.js.map +1 -0
  81. package/dist/converter.d.ts +28 -0
  82. package/dist/converter.d.ts.map +1 -0
  83. package/dist/converter.js +44 -0
  84. package/dist/converter.js.map +1 -0
  85. package/dist/html-wrap.d.ts +3 -0
  86. package/dist/html-wrap.d.ts.map +1 -0
  87. package/dist/html-wrap.js +26 -0
  88. package/dist/html-wrap.js.map +1 -0
  89. package/dist/index.d.ts +17 -0
  90. package/dist/index.d.ts.map +1 -0
  91. package/dist/index.js +16 -0
  92. package/dist/index.js.map +1 -0
  93. package/examples/README.md +39 -0
  94. package/examples/balance-sheet/compare_side_by_side.png +0 -0
  95. package/examples/balance-sheet/input.html +41 -0
  96. package/examples/balance-sheet/output.docx +0 -0
  97. package/examples/balance-sheet/preview.png +0 -0
  98. package/examples/invoice/compare_side_by_side.png +0 -0
  99. package/examples/invoice/input.html +88 -0
  100. package/examples/invoice/logo.png +0 -0
  101. package/examples/invoice/output.docx +0 -0
  102. package/examples/invoice/preview.png +0 -0
  103. package/examples/javascript-essay/compare_side_by_side.png +0 -0
  104. package/examples/javascript-essay/input.html +39 -0
  105. package/examples/javascript-essay/output.docx +0 -0
  106. package/examples/javascript-essay/preview.png +0 -0
  107. package/examples/product-launch-brief/compare_side_by_side.png +0 -0
  108. package/examples/product-launch-brief/input.html +120 -0
  109. package/examples/product-launch-brief/output.docx +0 -0
  110. package/examples/product-launch-brief/preview.png +0 -0
  111. package/examples/quarterly-financials/compare_side_by_side.png +0 -0
  112. package/examples/quarterly-financials/input.html +27 -0
  113. package/examples/quarterly-financials/output.docx +0 -0
  114. package/examples/quarterly-financials/preview.png +0 -0
  115. package/examples/react-dashboard/compare_side_by_side.png +0 -0
  116. package/examples/react-dashboard/input.html +1 -0
  117. package/examples/react-dashboard/output.docx +0 -0
  118. package/examples/react-dashboard/preview.html +107 -0
  119. package/examples/react-dashboard/preview.png +0 -0
  120. package/examples/regional-sales-dashboard/compare_side_by_side.png +0 -0
  121. package/examples/regional-sales-dashboard/input.html +129 -0
  122. package/examples/regional-sales-dashboard/output.docx +0 -0
  123. package/examples/regional-sales-dashboard/preview.png +0 -0
  124. package/examples/sales-contract/compare_side_by_side.png +0 -0
  125. package/examples/sales-contract/input.html +68 -0
  126. package/examples/sales-contract/output.docx +0 -0
  127. package/examples/sales-contract/preview.png +0 -0
  128. package/examples/sprint-retrospective/compare_side_by_side.png +0 -0
  129. package/examples/sprint-retrospective/input.html +51 -0
  130. package/examples/sprint-retrospective/output.docx +0 -0
  131. package/examples/sprint-retrospective/preview.png +0 -0
  132. package/package.json +108 -0
@@ -0,0 +1,621 @@
1
+ import { AlignmentType, BorderStyle, LineRuleType, ShadingType } from "docx";
2
+ import { BLOCK_TAGS, BODY_LINE_BOX_PX } from "./constants.js";
3
+ import { INLINE_STYLE_RESOLVER } from "./style-resolver.js";
4
+ const PX_TO_TWIPS = 15;
5
+ const PX_TO_HALF_POINTS = 1.5;
6
+ const PX_TO_BORDER_SIZE = 6;
7
+ export function pxToTwips(px) {
8
+ return Math.round(px * PX_TO_TWIPS);
9
+ }
10
+ export function pxToHalfPoints(px) {
11
+ return Math.round(px * PX_TO_HALF_POINTS);
12
+ }
13
+ /** Flex gap in twips from px or bare number (treated as px). */
14
+ export function parseGap(value) {
15
+ if (!value)
16
+ return undefined;
17
+ const trimmed = value.trim();
18
+ if (trimmed.endsWith("px"))
19
+ return pxToTwips(parseFloat(trimmed));
20
+ const num = parseFloat(trimmed);
21
+ return Number.isFinite(num) ? pxToTwips(num) : undefined;
22
+ }
23
+ export function parseColor(value) {
24
+ if (!value)
25
+ return undefined;
26
+ const trimmed = value.trim().toLowerCase();
27
+ if (trimmed === "transparent")
28
+ return undefined;
29
+ if (trimmed.startsWith("#")) {
30
+ let hex = trimmed.slice(1);
31
+ if (hex.length === 3) {
32
+ hex = hex
33
+ .split("")
34
+ .map((c) => c + c)
35
+ .join("");
36
+ }
37
+ return hex.length === 6 ? hex : undefined;
38
+ }
39
+ if (trimmed.startsWith("rgb")) {
40
+ const match = trimmed.match(/rgba?\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)(?:\s*,\s*([\d.]+))?\s*\)/);
41
+ if (!match)
42
+ return undefined;
43
+ const alpha = match[4] !== undefined ? parseFloat(match[4]) : 1;
44
+ if (!Number.isFinite(alpha) || alpha <= 0)
45
+ return undefined;
46
+ const [, r, g, b] = match;
47
+ return [r, g, b]
48
+ .map((n) => Math.round(Number(n)).toString(16).padStart(2, "0"))
49
+ .join("");
50
+ }
51
+ return undefined;
52
+ }
53
+ /**
54
+ * CSS font stacks → Word/LibreOffice-safe installed fonts. First recognized
55
+ * family in the stack wins (browser semantics); generic keywords are the
56
+ * fallback. Unrecognized stacks stay on the document default (Arial).
57
+ */
58
+ const FONT_FAMILY_MAP = {
59
+ georgia: "Georgia",
60
+ "times new roman": "Times New Roman",
61
+ times: "Times New Roman",
62
+ cambria: "Cambria",
63
+ garamond: "Garamond",
64
+ "palatino linotype": "Palatino Linotype",
65
+ palatino: "Palatino Linotype",
66
+ arial: "Arial",
67
+ helvetica: "Arial",
68
+ verdana: "Verdana",
69
+ tahoma: "Tahoma",
70
+ "trebuchet ms": "Trebuchet MS",
71
+ "segoe ui": "Arial",
72
+ "courier new": "Courier New",
73
+ courier: "Courier New",
74
+ // Consolas: native in Word (ships with Office); LibreOffice substitutes its
75
+ // bundled DejaVu Sans Mono. Both are full-weight — Courier New's thin strokes
76
+ // read faint next to a browser's Menlo/Consolas.
77
+ consolas: "Consolas",
78
+ menlo: "Consolas",
79
+ monaco: "Consolas",
80
+ serif: "Times New Roman",
81
+ "sans-serif": "Arial",
82
+ monospace: "Consolas",
83
+ };
84
+ function mapFontFamily(value) {
85
+ for (const family of value.split(",")) {
86
+ const key = family.trim().replace(/^['"]|['"]$/g, "").toLowerCase();
87
+ const mapped = FONT_FAMILY_MAP[key];
88
+ if (mapped)
89
+ return mapped;
90
+ }
91
+ return undefined;
92
+ }
93
+ function parseLength(value) {
94
+ if (!value)
95
+ return undefined;
96
+ const trimmed = value.trim();
97
+ if (trimmed.endsWith("px"))
98
+ return pxToTwips(parseFloat(trimmed));
99
+ if (trimmed.endsWith("pt"))
100
+ return Math.round(parseFloat(trimmed) * 20);
101
+ if (trimmed.endsWith("em"))
102
+ return pxToTwips(parseFloat(trimmed) * 16);
103
+ const num = parseFloat(trimmed);
104
+ return Number.isFinite(num) ? pxToTwips(num) : undefined;
105
+ }
106
+ export function parseFontSize(value) {
107
+ if (!value)
108
+ return undefined;
109
+ const trimmed = value.trim();
110
+ if (trimmed.endsWith("px"))
111
+ return pxToHalfPoints(parseFloat(trimmed));
112
+ if (trimmed.endsWith("pt"))
113
+ return Math.round(parseFloat(trimmed) * 2);
114
+ if (trimmed.endsWith("em"))
115
+ return pxToHalfPoints(parseFloat(trimmed) * 16);
116
+ const num = parseFloat(trimmed);
117
+ return Number.isFinite(num) ? pxToHalfPoints(num) : undefined;
118
+ }
119
+ function parseBorderShorthand(value) {
120
+ if (/\b(?:none|hidden)\b/i.test(value))
121
+ return undefined;
122
+ const widthMatch = value.match(/(\d+(?:\.\d+)?)\s*px/i);
123
+ const widthPx = widthMatch ? parseFloat(widthMatch[1]) : 1;
124
+ if (widthPx <= 0)
125
+ return undefined;
126
+ const hexMatch = value.match(/#([0-9a-f]{3,8})/i);
127
+ const rgbMatch = value.match(/rgba?\([^)]+\)/i);
128
+ const colorRaw = hexMatch?.[0] ?? rgbMatch?.[0];
129
+ return {
130
+ widthPx,
131
+ color: parseColor(colorRaw),
132
+ };
133
+ }
134
+ function applyBoxShorthand(value, result, prefix) {
135
+ const parts = value.split(/\s+/).map(parseLength);
136
+ if (parts.some((p) => p === undefined))
137
+ return;
138
+ const [top, right = top, bottom = top, left = right] = parts;
139
+ if (prefix === "margin") {
140
+ result.marginTop = top;
141
+ result.marginRight = right;
142
+ result.marginBottom = bottom;
143
+ result.marginLeft = left;
144
+ }
145
+ else {
146
+ result.paddingTop = top;
147
+ result.paddingRight = right;
148
+ result.paddingBottom = bottom;
149
+ result.paddingLeft = left;
150
+ }
151
+ }
152
+ export function parseInlineStyle(style) {
153
+ if (!style)
154
+ return {};
155
+ const result = {};
156
+ for (const declaration of style.split(";")) {
157
+ const colon = declaration.indexOf(":");
158
+ if (colon === -1)
159
+ continue;
160
+ const property = declaration.slice(0, colon).trim().toLowerCase();
161
+ const value = declaration.slice(colon + 1).trim();
162
+ switch (property) {
163
+ case "color":
164
+ result.color = parseColor(value);
165
+ break;
166
+ case "background-color":
167
+ case "background":
168
+ result.backgroundColor = parseColor(value);
169
+ break;
170
+ case "display":
171
+ result.display = value.trim().toLowerCase();
172
+ break;
173
+ case "flex-direction":
174
+ result.flexDirection = value.trim().toLowerCase();
175
+ break;
176
+ case "gap":
177
+ case "row-gap":
178
+ case "column-gap":
179
+ result.gap = parseGap(value);
180
+ break;
181
+ case "text-align":
182
+ result.textAlign = value.toLowerCase();
183
+ break;
184
+ case "text-transform":
185
+ result.textTransform = value.trim().toLowerCase();
186
+ break;
187
+ case "border-collapse":
188
+ result.borderCollapse = value.trim().toLowerCase();
189
+ break;
190
+ case "letter-spacing": {
191
+ const trimmed = value.trim();
192
+ if (trimmed.endsWith("em")) {
193
+ const em = parseFloat(trimmed);
194
+ if (Number.isFinite(em))
195
+ result.letterSpacingEm = em;
196
+ }
197
+ else {
198
+ result.letterSpacingTwips = parseLength(trimmed);
199
+ }
200
+ break;
201
+ }
202
+ case "list-style-type":
203
+ case "list-style":
204
+ // For the shorthand, the type is the last keyword (e.g. "none inside square").
205
+ result.listStyleType = value.trim().toLowerCase().split(/\s+/).pop();
206
+ break;
207
+ case "font-size":
208
+ result.fontSize = parseFontSize(value);
209
+ break;
210
+ case "font-weight":
211
+ result.fontWeight = value;
212
+ break;
213
+ case "font-style":
214
+ result.fontStyle = value;
215
+ break;
216
+ case "font-family":
217
+ result.fontFamily = mapFontFamily(value);
218
+ break;
219
+ case "margin":
220
+ applyBoxShorthand(value, result, "margin");
221
+ break;
222
+ case "margin-top":
223
+ result.marginTop = parseLength(value);
224
+ break;
225
+ case "margin-right":
226
+ result.marginRight = parseLength(value);
227
+ break;
228
+ case "margin-bottom":
229
+ result.marginBottom = parseLength(value);
230
+ break;
231
+ case "margin-left":
232
+ result.marginLeft = parseLength(value);
233
+ break;
234
+ case "padding":
235
+ applyBoxShorthand(value, result, "padding");
236
+ break;
237
+ case "padding-top":
238
+ result.paddingTop = parseLength(value);
239
+ break;
240
+ case "padding-right":
241
+ result.paddingRight = parseLength(value);
242
+ break;
243
+ case "padding-bottom":
244
+ result.paddingBottom = parseLength(value);
245
+ break;
246
+ case "padding-left":
247
+ result.paddingLeft = parseLength(value);
248
+ break;
249
+ case "height":
250
+ result.heightTwips = parseLength(value);
251
+ break;
252
+ case "width": {
253
+ const percent = value.trim().match(/^(\d+(?:\.\d+)?)\s*%$/);
254
+ if (percent)
255
+ result.widthPercent = parseFloat(percent[1]);
256
+ else
257
+ result.widthTwips = parseLength(value);
258
+ break;
259
+ }
260
+ case "max-width":
261
+ result.maxWidthTwips = parseLength(value);
262
+ break;
263
+ case "max-height":
264
+ result.maxHeightTwips = parseLength(value);
265
+ break;
266
+ case "visibility":
267
+ result.visibility = value.trim().toLowerCase();
268
+ break;
269
+ case "opacity": {
270
+ const opacity = parseFloat(value);
271
+ if (Number.isFinite(opacity))
272
+ result.opacity = opacity;
273
+ break;
274
+ }
275
+ case "overflow":
276
+ result.overflow = value.trim().toLowerCase();
277
+ break;
278
+ case "border":
279
+ result.border = parseBorderShorthand(value);
280
+ break;
281
+ case "border-color":
282
+ result.borderColor = parseColor(value.trim().split(/\s+/)[0]);
283
+ break;
284
+ case "border-top":
285
+ result.borderTop = parseBorderShorthand(value);
286
+ break;
287
+ case "border-right":
288
+ result.borderRight = parseBorderShorthand(value);
289
+ break;
290
+ case "border-bottom":
291
+ result.borderBottom = parseBorderShorthand(value);
292
+ break;
293
+ case "border-left":
294
+ result.borderLeft = parseBorderShorthand(value);
295
+ break;
296
+ default:
297
+ break;
298
+ }
299
+ }
300
+ return result;
301
+ }
302
+ /**
303
+ * Element is invisible in a browser — skip it entirely. Covers `display:none`,
304
+ * `visibility:hidden`, `opacity:0`, and the email-preheader idiom
305
+ * (`max-height:0` + `overflow:hidden`).
306
+ */
307
+ export function isHiddenCss(css) {
308
+ if (css.display === "none")
309
+ return true;
310
+ if (css.visibility === "hidden" || css.visibility === "collapse")
311
+ return true;
312
+ if (css.opacity !== undefined && css.opacity <= 0)
313
+ return true;
314
+ if (css.maxHeightTwips !== undefined && css.maxHeightTwips <= 0 && css.overflow === "hidden") {
315
+ return true;
316
+ }
317
+ return false;
318
+ }
319
+ export function isHiddenElement(element, resolver = INLINE_STYLE_RESOLVER) {
320
+ return isHiddenCss(resolver.getCss(element));
321
+ }
322
+ /** HTML `<font size=1..7>` → CSS absolute-size px (Chromium keyword scale). */
323
+ const FONT_SIZE_ATTR_PX = {
324
+ 1: 10,
325
+ 2: 13,
326
+ 3: 16,
327
+ 4: 18,
328
+ 5: 24,
329
+ 6: 32,
330
+ 7: 48,
331
+ };
332
+ /**
333
+ * Legacy presentational attributes (`bgcolor`, `<font color/size/face>`,
334
+ * `align`, `<center>`) → their CSS equivalents. Inline `style=""` wins over
335
+ * attributes, matching browser precedence.
336
+ */
337
+ export function presentationalAttributesCss(element) {
338
+ const attribs = element.attribs ?? {};
339
+ const tag = element.name.toLowerCase();
340
+ const css = {};
341
+ if (attribs.bgcolor) {
342
+ const color = parseColor(attribs.bgcolor);
343
+ if (color)
344
+ css.backgroundColor = color;
345
+ }
346
+ if (tag === "font") {
347
+ if (attribs.color) {
348
+ const color = parseColor(attribs.color);
349
+ if (color)
350
+ css.color = color;
351
+ }
352
+ const sizeAttr = attribs.size?.trim();
353
+ if (sizeAttr) {
354
+ const relative = /^[+-]/.test(sizeAttr);
355
+ const parsed = parseInt(sizeAttr, 10);
356
+ if (Number.isFinite(parsed)) {
357
+ const level = Math.min(7, Math.max(1, relative ? 3 + parsed : parsed));
358
+ css.fontSize = pxToHalfPoints(FONT_SIZE_ATTR_PX[level]);
359
+ }
360
+ }
361
+ if (attribs.face)
362
+ css.fontFamily = mapFontFamily(attribs.face);
363
+ }
364
+ // `align` on table means table positioning (handled by the table converter),
365
+ // not text alignment; on images it means float.
366
+ const align = attribs.align?.trim().toLowerCase();
367
+ if (align && tag !== "table" && tag !== "img") {
368
+ if (["left", "center", "right", "justify"].includes(align))
369
+ css.textAlign = align;
370
+ }
371
+ if (tag === "center")
372
+ css.textAlign = "center";
373
+ return css;
374
+ }
375
+ /** Block if tag is structural block OR display is block / inline-block. */
376
+ export function isBlockElement(element, resolver = INLINE_STYLE_RESOLVER) {
377
+ // `<svg>` is always handled as a block via convertSvg. Computed `getComputedStyle`
378
+ // reports display:inline for inline SVG, which would otherwise skip the svg dispatch.
379
+ if (element.name.toLowerCase() === "svg")
380
+ return true;
381
+ const css = resolver.getCss(element);
382
+ const display = css.display;
383
+ if (display === "block" || display === "inline-block")
384
+ return true;
385
+ if (display === "flex")
386
+ return true;
387
+ if (display === "inline" || display === "inline-flex")
388
+ return false;
389
+ return BLOCK_TAGS.has(element.name.toLowerCase());
390
+ }
391
+ function sumTwips(...values) {
392
+ const total = values.reduce((acc, v) => acc + (v ?? 0), 0);
393
+ return total > 0 ? total : undefined;
394
+ }
395
+ export function mapTextAlign(value) {
396
+ switch (value) {
397
+ case "center":
398
+ return AlignmentType.CENTER;
399
+ case "right":
400
+ return AlignmentType.RIGHT;
401
+ case "justify":
402
+ return AlignmentType.JUSTIFIED;
403
+ default:
404
+ return AlignmentType.LEFT;
405
+ }
406
+ }
407
+ export function pxPaddingToBorderSpace(paddingTwips) {
408
+ if (!paddingTwips)
409
+ return 4;
410
+ return Math.max(1, Math.round(paddingTwips / 20));
411
+ }
412
+ function borderSideToDocx(side, paddingTwips) {
413
+ if (!side)
414
+ return undefined;
415
+ return {
416
+ size: Math.max(1, Math.round(side.widthPx * PX_TO_BORDER_SIZE)),
417
+ space: pxPaddingToBorderSpace(paddingTwips),
418
+ color: side.color ?? "000000",
419
+ };
420
+ }
421
+ function buildBlockBorders(css) {
422
+ const fallback = css.border;
423
+ const top = css.borderTop ?? fallback;
424
+ const right = css.borderRight ?? fallback;
425
+ const bottom = css.borderBottom ?? fallback;
426
+ const left = css.borderLeft ?? fallback;
427
+ if (!top && !right && !bottom && !left)
428
+ return undefined;
429
+ const borders = {
430
+ top: borderSideToDocx(top, css.paddingTop),
431
+ right: borderSideToDocx(right, css.paddingRight),
432
+ bottom: borderSideToDocx(bottom, css.paddingBottom),
433
+ left: borderSideToDocx(left, css.paddingLeft),
434
+ };
435
+ return Object.values(borders).some(Boolean) ? borders : undefined;
436
+ }
437
+ /** Block containers: background-color → paragraph shading only. */
438
+ export function cssToBlockLayout(css) {
439
+ return {
440
+ // Leave undefined when text-align is absent so block children can inherit a
441
+ // container's alignment (Word still defaults to left when nothing is set).
442
+ alignment: css.textAlign ? mapTextAlign(css.textAlign) : undefined,
443
+ shading: css.backgroundColor
444
+ ? { fill: css.backgroundColor, color: "auto" }
445
+ : undefined,
446
+ paddingTop: css.paddingTop,
447
+ paddingBottom: css.paddingBottom,
448
+ paddingLeft: css.paddingLeft,
449
+ paddingRight: css.paddingRight,
450
+ marginTop: css.marginTop,
451
+ marginBottom: css.marginBottom,
452
+ marginLeft: css.marginLeft,
453
+ marginRight: css.marginRight,
454
+ spacingBefore: sumTwips(css.paddingTop, css.marginTop),
455
+ spacingAfter: sumTwips(css.paddingBottom, css.marginBottom),
456
+ indentLeft: sumTwips(css.marginLeft, css.paddingLeft),
457
+ indentRight: sumTwips(css.marginRight, css.paddingRight),
458
+ borders: buildBlockBorders(css),
459
+ };
460
+ }
461
+ /** Block foreground typography — never carries background-color. */
462
+ export function cssToBlockTypography(css) {
463
+ const typography = {
464
+ color: css.color,
465
+ fontSize: css.fontSize,
466
+ };
467
+ if (css.fontWeight === "bold" || Number(css.fontWeight) >= 600) {
468
+ typography.bold = true;
469
+ }
470
+ if (css.fontStyle === "italic") {
471
+ typography.italics = true;
472
+ }
473
+ if (css.fontFamily) {
474
+ typography.font = css.fontFamily;
475
+ }
476
+ if (css.textTransform === "uppercase") {
477
+ typography.allCaps = true;
478
+ }
479
+ const letterSpacing = css.letterSpacingTwips ??
480
+ (css.letterSpacingEm !== undefined
481
+ ? Math.round(css.letterSpacingEm * (((css.fontSize ?? 21) / 1.5) * 15))
482
+ : undefined);
483
+ if (letterSpacing) {
484
+ typography.characterSpacing = letterSpacing;
485
+ }
486
+ return typography;
487
+ }
488
+ /** Inline elements: background-color → TextRun shading only. */
489
+ export function cssToInlineRunTypography(css) {
490
+ const typography = cssToBlockTypography(css);
491
+ if (css.backgroundColor) {
492
+ typography.shading = { fill: css.backgroundColor, color: "auto" };
493
+ const hex = css.backgroundColor.replace(/^#/, "").toUpperCase();
494
+ const expanded = hex.length === 3 ? hex.split("").map((c) => c + c).join("") : hex;
495
+ if (expanded === "FFFF00") {
496
+ typography.color = typography.color ?? "111111";
497
+ }
498
+ }
499
+ return typography;
500
+ }
501
+ export function layoutFromElement(element, resolver = INLINE_STYLE_RESOLVER) {
502
+ return cssToBlockLayout(resolver.getCss(element));
503
+ }
504
+ /** Nearest `font-family` up the ancestor chain (CSS inheritance), if any. */
505
+ export function inheritedFontFamily(element, resolver = INLINE_STYLE_RESOLVER) {
506
+ let node = element;
507
+ while (node) {
508
+ const font = resolver.getCss(node).fontFamily;
509
+ if (font)
510
+ return font;
511
+ node =
512
+ node.parent && node.parent.type === "tag" ? node.parent : undefined;
513
+ }
514
+ return undefined;
515
+ }
516
+ export function typographyFromBlockElement(element, resolver = INLINE_STYLE_RESOLVER) {
517
+ const typography = cssToBlockTypography(resolver.getCss(element));
518
+ if (!typography.font) {
519
+ const font = inheritedFontFamily(element, resolver);
520
+ if (font)
521
+ typography.font = font;
522
+ }
523
+ return typography;
524
+ }
525
+ /** Native shaded block: keep padding fields for makeParagraph; no indent/spacing bleed. */
526
+ export function layoutForNativeShadedBlock(layout) {
527
+ if (!layout.shading?.fill)
528
+ return layout;
529
+ return {
530
+ ...layout,
531
+ spacingBefore: undefined,
532
+ spacingAfter: undefined,
533
+ indentLeft: undefined,
534
+ indentRight: undefined,
535
+ };
536
+ }
537
+ /** Normalize fill hex for consistent LO PDF rendering. */
538
+ export function runShadingForFill(fill) {
539
+ const hex = fill.replace(/^#/, "").toUpperCase();
540
+ const expanded = hex.length === 3 ? hex.split("").map((c) => c + c).join("") : hex;
541
+ return {
542
+ type: ShadingType.CLEAR,
543
+ fill: `#${expanded}`,
544
+ color: "auto",
545
+ };
546
+ }
547
+ /** Extra EXACT line twips — LO PDF band height vs HTML harness (0 = omit for tighter band). */
548
+ const SHADED_LINE_FUDGE_TWIPS = 0;
549
+ /**
550
+ * Vertical padding inside a shaded paragraph band.
551
+ * Embed all padding in one EXACT line — LO paints spacing.before outside w:shd.
552
+ */
553
+ export function shadedBlockParagraphSpacing(layout) {
554
+ const padTop = layout.paddingTop ?? 0;
555
+ const padBottom = layout.paddingBottom ?? 0;
556
+ const contentLine = pxToTwips(layout.shadedContentLinePx ?? BODY_LINE_BOX_PX);
557
+ return {
558
+ before: 0,
559
+ after: layout.marginBottom ?? 0,
560
+ line: padTop + contentLine + padBottom + SHADED_LINE_FUDGE_TWIPS,
561
+ lineRule: LineRuleType.EXACT,
562
+ };
563
+ }
564
+ export function blockLayoutToParagraphProps(layout) {
565
+ const borderEntries = layout.borders
566
+ ? Object.entries(layout.borders).filter(([, side]) => side !== undefined)
567
+ : [];
568
+ let indent;
569
+ if (layout.indentLeft || layout.indentRight) {
570
+ indent = {
571
+ left: layout.indentLeft,
572
+ right: layout.indentRight,
573
+ ...(layout.hangingIndent ? { hanging: layout.hangingIndent } : {}),
574
+ };
575
+ }
576
+ return {
577
+ ...(layout.alignment ? { alignment: layout.alignment } : {}),
578
+ ...(layout.shading
579
+ ? { shading: { type: ShadingType.CLEAR, ...layout.shading } }
580
+ : {}),
581
+ ...(layout.spacingBefore || layout.spacingAfter
582
+ ? {
583
+ spacing: {
584
+ before: layout.spacingBefore,
585
+ after: layout.spacingAfter,
586
+ },
587
+ }
588
+ : {}),
589
+ ...(indent ? { indent } : {}),
590
+ ...(borderEntries.length > 0
591
+ ? {
592
+ border: Object.fromEntries(borderEntries.map(([side, spec]) => [
593
+ side,
594
+ {
595
+ style: BorderStyle.SINGLE,
596
+ size: spec.size,
597
+ space: spec.space,
598
+ color: spec.color,
599
+ },
600
+ ])),
601
+ }
602
+ : {}),
603
+ };
604
+ }
605
+ /** @deprecated */
606
+ export function cssToBlockStyle(css) {
607
+ return cssToBlockLayout(css);
608
+ }
609
+ /** @deprecated */
610
+ export function cssToRunTypography(_css, _tag) {
611
+ return cssToBlockTypography(_css);
612
+ }
613
+ /** @deprecated */
614
+ export function cssToRunStyle(css, tag) {
615
+ return cssToRunTypography(css, tag);
616
+ }
617
+ /** @deprecated */
618
+ export function blockStyleToParagraphProps(layout) {
619
+ return blockLayoutToParagraphProps(layout);
620
+ }
621
+ //# sourceMappingURL=css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"css.js","sourceRoot":"","sources":["../../src/converter/css.ts"],"names":[],"mappings":"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"}