@gilav21/shadcn-angular-rte 0.2.0 → 0.2.2

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 (19) hide show
  1. package/fesm2022/{gilav21-shadcn-angular-rte-docx-parser-CdxuIlVT.mjs → gilav21-shadcn-angular-rte-docx-parser-CAPT-WC9.mjs} +63 -38
  2. package/fesm2022/gilav21-shadcn-angular-rte-docx-parser-CAPT-WC9.mjs.map +1 -0
  3. package/fesm2022/{gilav21-shadcn-angular-rte-docx-to-editor-html-Cl9eIhkC.mjs → gilav21-shadcn-angular-rte-docx-to-editor-html-BreagmS_.mjs} +43 -33
  4. package/fesm2022/gilav21-shadcn-angular-rte-docx-to-editor-html-BreagmS_.mjs.map +1 -0
  5. package/fesm2022/{gilav21-shadcn-angular-rte-gilav21-shadcn-angular-rte-BFcfCqW4.mjs → gilav21-shadcn-angular-rte-gilav21-shadcn-angular-rte-CjHrbpSa.mjs} +3899 -2102
  6. package/fesm2022/gilav21-shadcn-angular-rte-gilav21-shadcn-angular-rte-CjHrbpSa.mjs.map +1 -0
  7. package/fesm2022/gilav21-shadcn-angular-rte-markup-safety-qJk8EoPk.mjs +69 -0
  8. package/fesm2022/gilav21-shadcn-angular-rte-markup-safety-qJk8EoPk.mjs.map +1 -0
  9. package/fesm2022/{gilav21-shadcn-angular-rte-pdf-readable-DmE-CIxv.mjs → gilav21-shadcn-angular-rte-pdf-readable-JvCpuNQH.mjs} +445 -124
  10. package/fesm2022/gilav21-shadcn-angular-rte-pdf-readable-JvCpuNQH.mjs.map +1 -0
  11. package/fesm2022/gilav21-shadcn-angular-rte.mjs +1 -1
  12. package/package.json +1 -1
  13. package/styles.css +1 -1
  14. package/types/gilav21-shadcn-angular-rte.d.ts +427 -132
  15. package/types/gilav21-shadcn-angular-rte.d.ts.map +1 -1
  16. package/fesm2022/gilav21-shadcn-angular-rte-docx-parser-CdxuIlVT.mjs.map +0 -1
  17. package/fesm2022/gilav21-shadcn-angular-rte-docx-to-editor-html-Cl9eIhkC.mjs.map +0 -1
  18. package/fesm2022/gilav21-shadcn-angular-rte-gilav21-shadcn-angular-rte-BFcfCqW4.mjs.map +0 -1
  19. package/fesm2022/gilav21-shadcn-angular-rte-pdf-readable-DmE-CIxv.mjs.map +0 -1
@@ -1,3 +1,5 @@
1
+ import { e as escapeAttribute, c as cssColor, a as cssFontFamily, s as safeLinkHref, i as imageDataUrl } from './gilav21-shadcn-angular-rte-markup-safety-qJk8EoPk.mjs';
2
+
1
3
  /**
2
4
  * Renders a DocxParseResult into inline-styled HTML suitable for
3
5
  * insertion into the rich text editor. Uses only inline styles
@@ -81,6 +83,12 @@ function renderListItem(elements, index, baseLevel, output) {
81
83
  return index + 1;
82
84
  }
83
85
  // --- Paragraph rendering ---
86
+ /**
87
+ * The parser only ever produces these keywords; a model built by hand may hold
88
+ * anything, and a keyword is written into a declaration unquoted.
89
+ */
90
+ const TEXT_ALIGNS = new Set(['left', 'right', 'center', 'justify']);
91
+ const VERTICAL_ALIGNS = new Set(['top', 'middle', 'bottom']);
84
92
  function renderParagraph(p) {
85
93
  const pageBreak = p.runs.some(r => r.breakType === 'page');
86
94
  let prefix = '';
@@ -94,16 +102,16 @@ function renderParagraph(p) {
94
102
  const level = Math.min(Number(headingMatch[1]), 6);
95
103
  const tag = `h${level}`;
96
104
  const styleAttr = buildParagraphStyle(p);
97
- const styleStr = styleAttr ? ` style="${styleAttr}"` : '';
105
+ const styleStr = styleAttr ? ` style="${escapeAttribute(styleAttr)}"` : '';
98
106
  return `${prefix}<${tag}${dirAttr}${styleStr}>${content}</${tag}>`;
99
107
  }
100
108
  const styleAttr = buildParagraphStyle(p);
101
- const styleStr = styleAttr ? ` style="${styleAttr}"` : '';
109
+ const styleStr = styleAttr ? ` style="${escapeAttribute(styleAttr)}"` : '';
102
110
  return `${prefix}<p${dirAttr}${styleStr}>${content}</p>`;
103
111
  }
104
112
  function buildParagraphStyle(p) {
105
113
  const styles = [];
106
- if (p.alignment) {
114
+ if (p.alignment && TEXT_ALIGNS.has(p.alignment)) {
107
115
  styles.push(`text-align:${p.alignment}`);
108
116
  }
109
117
  if (p.spacingBefore != null) {
@@ -132,8 +140,9 @@ function buildParagraphStyle(p) {
132
140
  styles.push(`line-height:${p.lineSpacing.toFixed(2)}`);
133
141
  }
134
142
  }
135
- if (p.shading) {
136
- styles.push(`background-color:${p.shading}`);
143
+ const shading = cssColor(p.shading);
144
+ if (shading) {
145
+ styles.push(`background-color:${shading}`);
137
146
  }
138
147
  if (p.borders) {
139
148
  appendParagraphBorders(styles, p.borders);
@@ -156,7 +165,8 @@ function appendParagraphBorders(styles, borders) {
156
165
  function formatBorder(b) {
157
166
  const widthPt = Math.max(b.size, 0.5);
158
167
  const style = mapBorderStyle(b.style);
159
- return `${widthPt}pt ${style} ${b.color}`;
168
+ const color = cssColor(b.color);
169
+ return color ? `${widthPt}pt ${style} ${color}` : `${widthPt}pt ${style}`;
160
170
  }
161
171
  const DASHED_BORDER_STYLES = new Set(['dashed', 'dashDotStroked', 'dashSmallGap']);
162
172
  const DOTTED_BORDER_STYLES = new Set(['dotted', 'dotDash', 'dotDotDash']);
@@ -215,23 +225,26 @@ function applyRunFormatting(html, style) {
215
225
  const spanStyle = buildRunSpanStyle(style);
216
226
  const dirAttr = style.rtl ? ' dir="rtl"' : '';
217
227
  if (spanStyle || dirAttr) {
218
- const styleAttr = spanStyle ? ` style="${spanStyle}"` : '';
228
+ const styleAttr = spanStyle ? ` style="${escapeAttribute(spanStyle)}"` : '';
219
229
  result = `<span${dirAttr}${styleAttr}>${result}</span>`;
220
230
  }
221
231
  return result;
222
232
  }
223
233
  function buildRunSpanStyle(style) {
224
234
  const parts = [];
225
- if (style.color)
226
- parts.push(`color:${style.color}`);
235
+ const color = cssColor(style.color);
236
+ if (color)
237
+ parts.push(`color:${color}`);
227
238
  if (style.fontSize)
228
239
  parts.push(`font-size:${style.fontSize}pt`);
229
240
  if (style.fontFamily)
230
- parts.push(`font-family:${escapeAttr(style.fontFamily)}`);
231
- if (style.highlight)
232
- parts.push(`background-color:${style.highlight}`);
233
- if (style.backgroundColor)
234
- parts.push(`background-color:${style.backgroundColor}`);
241
+ parts.push(`font-family:${cssFontFamily(style.fontFamily)}`);
242
+ const highlight = cssColor(style.highlight);
243
+ if (highlight)
244
+ parts.push(`background-color:${highlight}`);
245
+ const background = cssColor(style.backgroundColor);
246
+ if (background)
247
+ parts.push(`background-color:${background}`);
235
248
  if (style.charSpacing)
236
249
  parts.push(`letter-spacing:${formatPt(style.charSpacing)}pt`);
237
250
  if (style.smallCaps)
@@ -248,17 +261,20 @@ function applyTrackChanges(html, run) {
248
261
  return html;
249
262
  }
250
263
  function applyHyperlink(html, run) {
251
- if (run.href) {
252
- return `<a href="${escapeAttr(run.href)}" target="_blank" rel="noopener noreferrer">${html}</a>`;
253
- }
254
- return html;
264
+ const href = run.href ? safeLinkHref(run.href) : undefined;
265
+ if (href === undefined)
266
+ return html;
267
+ return `<a href="${escapeAttribute(href)}" target="_blank" rel="noopener noreferrer">${html}</a>`;
255
268
  }
256
269
  // --- Image rendering ---
257
270
  function renderImage(img) {
271
+ const src = imageDataUrl(img.dataUrl);
272
+ if (src === undefined)
273
+ return '';
258
274
  const widthAttr = img.width > 0 ? ` width="${img.width}"` : '';
259
275
  const heightAttr = img.height > 0 ? ` height="${img.height}"` : '';
260
- const alt = escapeAttr(img.altText || 'image');
261
- return `<img src="${escapeAttr(img.dataUrl)}"${widthAttr}${heightAttr} alt="${alt}">`;
276
+ const alt = escapeAttribute(img.altText || 'image');
277
+ return `<img src="${escapeAttribute(src)}"${widthAttr}${heightAttr} alt="${alt}">`;
262
278
  }
263
279
  // --- Table rendering ---
264
280
  function buildBorderFallbacks(table) {
@@ -286,7 +302,7 @@ function splitTableRows(rows) {
286
302
  }
287
303
  function renderTable(table) {
288
304
  const tableStyle = buildTableStyle(table.tableStyle);
289
- const styleStr = tableStyle ? ` style="${tableStyle}"` : '';
305
+ const styleStr = tableStyle ? ` style="${escapeAttribute(tableStyle)}"` : '';
290
306
  const borderFallbacks = buildBorderFallbacks(table);
291
307
  const { headerRows, bodyRows } = splitTableRows(table.rows);
292
308
  const totalRows = table.rows.length;
@@ -339,16 +355,17 @@ function renderTableCell(cell, tag, fallbacks, rowIndex, colIndex, totalRows, to
339
355
  attrs.push(`rowspan="${cell.rowSpan}"`);
340
356
  const cellStyle = buildCellStyle(cell.cellStyle, fallbacks, rowIndex, colIndex, totalRows, totalCols);
341
357
  if (cellStyle)
342
- attrs.push(`style="${cellStyle}"`);
358
+ attrs.push(`style="${escapeAttribute(cellStyle)}"`);
343
359
  const attrStr = attrs.length > 0 ? ` ${attrs.join(' ')}` : '';
344
360
  const content = renderCellContent(cell.elements);
345
361
  return `<${tag}${attrStr}>${content}</${tag}>`;
346
362
  }
347
363
  function buildCellStyle(style, fallbacks, rowIndex, colIndex, totalRows, totalCols) {
348
364
  const parts = [];
349
- if (style?.backgroundColor)
350
- parts.push(`background-color:${style.backgroundColor}`);
351
- if (style?.verticalAlign)
365
+ const background = cssColor(style?.backgroundColor);
366
+ if (background)
367
+ parts.push(`background-color:${background}`);
368
+ if (style?.verticalAlign && VERTICAL_ALIGNS.has(style.verticalAlign))
352
369
  parts.push(`vertical-align:${style.verticalAlign}`);
353
370
  if (style?.width) {
354
371
  const unit = style.widthUnit === 'pct' ? '%' : 'pt';
@@ -411,13 +428,6 @@ function escapeHtml(text) {
411
428
  .replaceAll('"', '&quot;')
412
429
  .replaceAll('\t', '\u2003');
413
430
  }
414
- function escapeAttr(value) {
415
- return value
416
- .replaceAll('&', '&amp;')
417
- .replaceAll('"', '&quot;')
418
- .replaceAll('<', '&lt;')
419
- .replaceAll('>', '&gt;');
420
- }
421
431
 
422
432
  export { renderDocxForEditor };
423
- //# sourceMappingURL=gilav21-shadcn-angular-rte-docx-to-editor-html-Cl9eIhkC.mjs.map
433
+ //# sourceMappingURL=gilav21-shadcn-angular-rte-docx-to-editor-html-BreagmS_.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gilav21-shadcn-angular-rte-docx-to-editor-html-BreagmS_.mjs","sources":["../../../packages/rte-package/src/lib/parsers/docx-to-editor-html.ts"],"sourcesContent":["import type {\n DocxParseResult,\n DocxElement,\n DocxParagraph,\n DocxTable,\n DocxImage,\n DocxRun,\n DocxRunStyle,\n DocxTableCell,\n DocxTableRow,\n DocxBorder,\n DocxTableBorder,\n DocxParagraphBorders,\n DocxTableCellStyle,\n DocxTableStyle,\n} from './docx-parser';\nimport { cssColor, cssFontFamily, escapeAttribute, imageDataUrl, safeLinkHref } from './markup-safety';\n\n/**\n * Renders a DocxParseResult into inline-styled HTML suitable for\n * insertion into the rich text editor. Uses only inline styles\n * (no Tailwind classes) so the editor sanitizer preserves them.\n */\nexport function renderDocxForEditor(result: DocxParseResult): string {\n return renderElements(result.elements);\n}\n\nfunction renderElements(elements: ReadonlyArray<DocxElement>): string {\n const parts: string[] = [];\n let i = 0;\n\n while (i < elements.length) {\n const el = elements[i];\n\n if (el.type === 'paragraph' && el.listLevel != null && el.listType) {\n i = renderListGroup(elements, i, parts);\n } else if (el.type === 'paragraph') {\n parts.push(renderParagraph(el));\n i++;\n } else if (el.type === 'table') {\n parts.push(renderTable(el));\n i++;\n } else {\n parts.push(renderImage(el));\n i++;\n }\n }\n\n return parts.join('');\n}\n\n// --- List grouping ---\n\nfunction hasNestedListChild(\n elements: ReadonlyArray<DocxElement>,\n index: number,\n baseLevel: number,\n): boolean {\n if (index + 1 >= elements.length) return false;\n const next = elements[index + 1];\n return next.type === 'paragraph' &&\n next.listLevel != null &&\n next.listType != null &&\n next.listLevel > baseLevel;\n}\n\nfunction renderListGroup(\n elements: ReadonlyArray<DocxElement>,\n startIndex: number,\n output: string[],\n): number {\n const first = elements[startIndex];\n if (first.type !== 'paragraph') return startIndex;\n const listType = first.listType ?? 'bullet';\n const baseLevel = first.listLevel ?? 0;\n const tag = listType === 'numbered' ? 'ol' : 'ul';\n\n output.push(`<${tag}>`);\n let i = startIndex;\n\n while (i < elements.length) {\n const el = elements[i];\n if (el.type !== 'paragraph' || el.listLevel == null || el.listType == null) break;\n if (el.listLevel < baseLevel) break;\n\n if (el.listLevel === baseLevel && el.listType === listType) {\n i = renderListItem(elements, i, baseLevel, output);\n } else if (el.listLevel > baseLevel) {\n i = renderListGroup(elements, i, output);\n } else {\n break;\n }\n }\n\n output.push(`</${tag}>`);\n return i;\n}\n\nfunction renderListItem(\n elements: ReadonlyArray<DocxElement>,\n index: number,\n baseLevel: number,\n output: string[],\n): number {\n const el = elements[index];\n if (el.type !== 'paragraph') return index + 1;\n output.push(`<li>${renderRuns(el.runs)}`);\n\n if (hasNestedListChild(elements, index, baseLevel)) {\n const nextIndex = renderListGroup(elements, index + 1, output);\n output.push('</li>');\n return nextIndex;\n }\n\n output.push('</li>');\n return index + 1;\n}\n\n// --- Paragraph rendering ---\n\n/**\n * The parser only ever produces these keywords; a model built by hand may hold\n * anything, and a keyword is written into a declaration unquoted.\n */\nconst TEXT_ALIGNS: ReadonlySet<string> = new Set(['left', 'right', 'center', 'justify']);\nconst VERTICAL_ALIGNS: ReadonlySet<string> = new Set(['top', 'middle', 'bottom']);\n\nfunction renderParagraph(p: DocxParagraph): string {\n const pageBreak = p.runs.some(r => r.breakType === 'page');\n let prefix = '';\n if (pageBreak) {\n prefix = '<hr>';\n }\n\n const dirAttr = p.rtl ? ' dir=\"rtl\"' : '';\n const content = renderRuns(p.runs) || '<br>';\n\n const headingMatch = /^Heading(\\d)$/i.exec(p.style);\n if (headingMatch) {\n const level = Math.min(Number(headingMatch[1]), 6);\n const tag = `h${level}`;\n const styleAttr = buildParagraphStyle(p);\n const styleStr = styleAttr ? ` style=\"${escapeAttribute(styleAttr)}\"` : '';\n return `${prefix}<${tag}${dirAttr}${styleStr}>${content}</${tag}>`;\n }\n\n const styleAttr = buildParagraphStyle(p);\n const styleStr = styleAttr ? ` style=\"${escapeAttribute(styleAttr)}\"` : '';\n return `${prefix}<p${dirAttr}${styleStr}>${content}</p>`;\n}\n\nfunction buildParagraphStyle(p: DocxParagraph): string {\n const styles: string[] = [];\n\n if (p.alignment && TEXT_ALIGNS.has(p.alignment)) {\n styles.push(`text-align:${p.alignment}`);\n }\n if (p.spacingBefore != null) {\n styles.push(`margin-top:${formatPt(p.spacingBefore)}pt`);\n }\n if (p.spacingAfter != null) {\n styles.push(`margin-bottom:${formatPt(p.spacingAfter)}pt`);\n }\n if (p.indentLeft != null) {\n styles.push(`margin-left:${formatPt(p.indentLeft)}pt`);\n }\n if (p.indentRight != null) {\n styles.push(`margin-right:${formatPt(p.indentRight)}pt`);\n }\n if (p.indentFirstLine != null) {\n styles.push(`text-indent:${formatPt(p.indentFirstLine)}pt`);\n }\n if (p.indentHanging != null && p.indentFirstLine == null) {\n styles.push(`text-indent:-${formatPt(p.indentHanging)}pt`);\n }\n if (p.lineSpacing != null) {\n if (p.lineSpacing > 4) {\n styles.push(`line-height:${p.lineSpacing.toFixed(1)}pt`);\n } else {\n styles.push(`line-height:${p.lineSpacing.toFixed(2)}`);\n }\n }\n const shading = cssColor(p.shading);\n if (shading) {\n styles.push(`background-color:${shading}`);\n }\n if (p.borders) {\n appendParagraphBorders(styles, p.borders);\n }\n\n return styles.join(';');\n}\n\nfunction appendParagraphBorders(styles: string[], borders: DocxParagraphBorders): void {\n if (borders.top) styles.push(`border-top:${formatBorder(borders.top)}`);\n if (borders.bottom) styles.push(`border-bottom:${formatBorder(borders.bottom)}`);\n if (borders.left) styles.push(`border-left:${formatBorder(borders.left)}`);\n if (borders.right) styles.push(`border-right:${formatBorder(borders.right)}`);\n if (borders.top || borders.bottom || borders.left || borders.right) {\n styles.push('padding:2pt 4pt');\n }\n}\n\nfunction formatBorder(b: DocxBorder | DocxTableBorder): string {\n const widthPt = Math.max(b.size, 0.5);\n const style = mapBorderStyle(b.style);\n const color = cssColor(b.color);\n return color ? `${widthPt}pt ${style} ${color}` : `${widthPt}pt ${style}`;\n}\n\nconst DASHED_BORDER_STYLES = new Set(['dashed', 'dashDotStroked', 'dashSmallGap']);\nconst DOTTED_BORDER_STYLES = new Set(['dotted', 'dotDash', 'dotDotDash']);\nconst DOUBLE_BORDER_STYLES = new Set([\n 'double', 'triple', 'thinThickSmallGap', 'thickThinSmallGap',\n 'thinThickMediumGap', 'thickThinMediumGap', 'thinThickLargeGap', 'thickThinLargeGap',\n]);\n\nfunction mapBorderStyle(docxStyle: string): string {\n if (DASHED_BORDER_STYLES.has(docxStyle)) return 'dashed';\n if (DOTTED_BORDER_STYLES.has(docxStyle)) return 'dotted';\n if (DOUBLE_BORDER_STYLES.has(docxStyle)) return 'double';\n if (docxStyle === 'none' || docxStyle === 'nil') return 'none';\n return 'solid';\n}\n\n// --- Run rendering ---\n\nfunction renderRuns(runs: ReadonlyArray<DocxRun>): string {\n const parts: string[] = [];\n\n for (const run of runs) {\n if (run.style.hidden) continue;\n if (run.breakType === 'page') continue;\n if (run.breakType === 'textWrapping' || run.breakType === 'column') {\n parts.push('<br>');\n continue;\n }\n\n let html = escapeHtml(run.text);\n\n html = applyRunFormatting(html, run.style);\n html = applyTrackChanges(html, run);\n html = applyHyperlink(html, run);\n\n parts.push(html);\n }\n\n return parts.join('');\n}\n\nfunction applyRunFormatting(html: string, style: DocxRunStyle): string {\n let result = html;\n\n if (style.bold) result = `<strong>${result}</strong>`;\n if (style.italic) result = `<em>${result}</em>`;\n if (style.underline) result = `<u>${result}</u>`;\n if (style.strikethrough) result = `<s>${result}</s>`;\n if (style.doubleStrikethrough) {\n result = `<s style=\"text-decoration-style:double\">${result}</s>`;\n }\n if (style.vertAlign === 'superscript') result = `<sup>${result}</sup>`;\n if (style.vertAlign === 'subscript') result = `<sub>${result}</sub>`;\n\n const spanStyle = buildRunSpanStyle(style);\n const dirAttr = style.rtl ? ' dir=\"rtl\"' : '';\n if (spanStyle || dirAttr) {\n const styleAttr = spanStyle ? ` style=\"${escapeAttribute(spanStyle)}\"` : '';\n result = `<span${dirAttr}${styleAttr}>${result}</span>`;\n }\n\n return result;\n}\n\nfunction buildRunSpanStyle(style: DocxRunStyle): string {\n const parts: string[] = [];\n\n const color = cssColor(style.color);\n if (color) parts.push(`color:${color}`);\n if (style.fontSize) parts.push(`font-size:${style.fontSize}pt`);\n if (style.fontFamily) parts.push(`font-family:${cssFontFamily(style.fontFamily)}`);\n const highlight = cssColor(style.highlight);\n if (highlight) parts.push(`background-color:${highlight}`);\n const background = cssColor(style.backgroundColor);\n if (background) parts.push(`background-color:${background}`);\n if (style.charSpacing) parts.push(`letter-spacing:${formatPt(style.charSpacing)}pt`);\n if (style.smallCaps) parts.push('font-variant:small-caps');\n if (style.caps) parts.push('text-transform:uppercase');\n\n return parts.join(';');\n}\n\nfunction applyTrackChanges(html: string, run: DocxRun): string {\n if (run.isInserted) return `<ins>${html}</ins>`;\n if (run.isDeleted) return `<del>${html}</del>`;\n return html;\n}\n\nfunction applyHyperlink(html: string, run: DocxRun): string {\n const href = run.href ? safeLinkHref(run.href) : undefined;\n if (href === undefined) return html;\n return `<a href=\"${escapeAttribute(href)}\" target=\"_blank\" rel=\"noopener noreferrer\">${html}</a>`;\n}\n\n// --- Image rendering ---\n\nfunction renderImage(img: DocxImage): string {\n const src = imageDataUrl(img.dataUrl);\n if (src === undefined) return '';\n const widthAttr = img.width > 0 ? ` width=\"${img.width}\"` : '';\n const heightAttr = img.height > 0 ? ` height=\"${img.height}\"` : '';\n const alt = escapeAttribute(img.altText || 'image');\n return `<img src=\"${escapeAttribute(src)}\"${widthAttr}${heightAttr} alt=\"${alt}\">`;\n}\n\n// --- Table rendering ---\n\nfunction buildBorderFallbacks(table: DocxTable): TableBorderFallbacks {\n return {\n insideH: table.tableStyle?.borders?.insideH,\n insideV: table.tableStyle?.borders?.insideV,\n top: table.tableStyle?.borders?.top,\n bottom: table.tableStyle?.borders?.bottom,\n left: table.tableStyle?.borders?.left,\n right: table.tableStyle?.borders?.right,\n };\n}\n\nfunction splitTableRows(rows: readonly DocxTableRow[]): { headerRows: DocxTableRow[]; bodyRows: DocxTableRow[] } {\n const headerRows: DocxTableRow[] = [];\n const bodyRows: DocxTableRow[] = [];\n for (const row of rows) {\n if (row.rowStyle?.isHeader) { headerRows.push(row); } else { bodyRows.push(row); }\n }\n return { headerRows, bodyRows };\n}\n\nfunction renderTable(table: DocxTable): string {\n const tableStyle = buildTableStyle(table.tableStyle);\n const styleStr = tableStyle ? ` style=\"${escapeAttribute(tableStyle)}\"` : '';\n const borderFallbacks = buildBorderFallbacks(table);\n const { headerRows, bodyRows } = splitTableRows(table.rows);\n const totalRows = table.rows.length;\n const parts: string[] = [`<table${styleStr}>`];\n let rowIndex = 0;\n\n if (headerRows.length > 0) {\n parts.push('<thead>');\n for (const row of headerRows) {\n parts.push(renderTableRow(row, true, borderFallbacks, rowIndex, totalRows));\n rowIndex++;\n }\n parts.push('</thead>');\n }\n\n parts.push('<tbody>');\n for (const row of bodyRows) {\n parts.push(renderTableRow(row, false, borderFallbacks, rowIndex, totalRows));\n rowIndex++;\n }\n parts.push('</tbody>', '</table>');\n return parts.join('');\n}\n\nfunction buildTableStyle(style?: DocxTableStyle): string {\n const parts: string[] = ['border-collapse:collapse'];\n\n if (style?.width) {\n const unit = style.widthUnit === 'pct' ? '%' : 'pt';\n const value = unit === '%' ? (style.width / 50).toFixed(1) : twipsToPt(style.width);\n parts.push(`width:${value}${unit}`);\n }\n\n return parts.join(';');\n}\n\ninterface TableBorderFallbacks {\n readonly insideH?: DocxTableBorder;\n readonly insideV?: DocxTableBorder;\n readonly top?: DocxTableBorder;\n readonly bottom?: DocxTableBorder;\n readonly left?: DocxTableBorder;\n readonly right?: DocxTableBorder;\n}\n\nfunction renderTableRow(\n row: DocxTableRow, isHeader: boolean,\n fallbacks: TableBorderFallbacks, rowIndex: number, totalRows: number,\n): string {\n const heightStyle = row.rowStyle?.height\n ? ` style=\"height:${formatPt(row.rowStyle.height)}pt\"`\n : '';\n const tag = isHeader ? 'th' : 'td';\n const totalCols = row.cells.reduce((sum, c) => sum + c.colSpan, 0);\n\n let colIndex = 0;\n const cellsHtml: string[] = [];\n for (const cell of row.cells) {\n cellsHtml.push(renderTableCell(cell, tag, fallbacks, rowIndex, colIndex, totalRows, totalCols));\n colIndex += cell.colSpan;\n }\n return `<tr${heightStyle}>${cellsHtml.join('')}</tr>`;\n}\n\nfunction renderTableCell(\n cell: DocxTableCell, tag: string,\n fallbacks: TableBorderFallbacks, rowIndex: number, colIndex: number,\n totalRows: number, totalCols: number,\n): string {\n const attrs: string[] = [];\n\n if (cell.colSpan > 1) attrs.push(`colspan=\"${cell.colSpan}\"`);\n if (cell.rowSpan > 1) attrs.push(`rowspan=\"${cell.rowSpan}\"`);\n\n const cellStyle = buildCellStyle(cell.cellStyle, fallbacks, rowIndex, colIndex, totalRows, totalCols);\n if (cellStyle) attrs.push(`style=\"${escapeAttribute(cellStyle)}\"`);\n\n const attrStr = attrs.length > 0 ? ` ${attrs.join(' ')}` : '';\n const content = renderCellContent(cell.elements);\n return `<${tag}${attrStr}>${content}</${tag}>`;\n}\n\nfunction buildCellStyle(\n style: DocxTableCellStyle | undefined,\n fallbacks: TableBorderFallbacks, rowIndex: number, colIndex: number,\n totalRows: number, totalCols: number,\n): string {\n const parts: string[] = [];\n\n const background = cssColor(style?.backgroundColor);\n if (background) parts.push(`background-color:${background}`);\n if (style?.verticalAlign && VERTICAL_ALIGNS.has(style.verticalAlign)) parts.push(`vertical-align:${style.verticalAlign}`);\n if (style?.width) {\n const unit = style.widthUnit === 'pct' ? '%' : 'pt';\n const value = unit === '%' ? (style.width / 50).toFixed(1) : twipsToPt(style.width);\n parts.push(`width:${value}${unit}`);\n }\n\n appendCellBorders(parts, style, fallbacks, rowIndex, colIndex, totalRows, totalCols);\n if (style) appendCellPaddings(parts, style);\n\n return parts.join(';');\n}\n\nfunction resolveCellBorder(\n own: DocxTableBorder | undefined,\n isEdge: boolean,\n edgeFallback: DocxTableBorder | undefined,\n innerFallback: DocxTableBorder | undefined,\n): DocxTableBorder | undefined {\n return own ?? (isEdge ? edgeFallback : innerFallback);\n}\n\nfunction appendCellBorders(\n parts: string[], style: DocxTableCellStyle | undefined,\n fallbacks: TableBorderFallbacks, rowIndex: number, colIndex: number,\n totalRows: number, totalCols: number,\n): void {\n const top = resolveCellBorder(style?.borders?.top, rowIndex === 0, fallbacks.top, fallbacks.insideH);\n const bottom = resolveCellBorder(style?.borders?.bottom, rowIndex === totalRows - 1, fallbacks.bottom, fallbacks.insideH);\n const left = resolveCellBorder(style?.borders?.left, colIndex === 0, fallbacks.left, fallbacks.insideV);\n const right = resolveCellBorder(style?.borders?.right, colIndex === totalCols - 1, fallbacks.right, fallbacks.insideV);\n\n if (top) parts.push(`border-top:${formatBorder(top)}`);\n if (bottom) parts.push(`border-bottom:${formatBorder(bottom)}`);\n if (left) parts.push(`border-left:${formatBorder(left)}`);\n if (right) parts.push(`border-right:${formatBorder(right)}`);\n}\n\nfunction appendCellPaddings(parts: string[], style: DocxTableCellStyle): void {\n if (!style.paddings) return;\n if (style.paddings.top != null) parts.push(`padding-top:${formatPt(style.paddings.top)}pt`);\n if (style.paddings.bottom != null) parts.push(`padding-bottom:${formatPt(style.paddings.bottom)}pt`);\n if (style.paddings.left != null) parts.push(`padding-left:${formatPt(style.paddings.left)}pt`);\n if (style.paddings.right != null) parts.push(`padding-right:${formatPt(style.paddings.right)}pt`);\n}\n\nfunction renderCellContent(elements: ReadonlyArray<DocxParagraph | DocxTable>): string {\n return elements.map(el => {\n if (el.type === 'table') return renderTable(el);\n return renderParagraph(el);\n }).join('');\n}\n\n// --- Utilities ---\n\nfunction formatPt(pts: number): string {\n return pts.toFixed(1).replace(/\\.0$/, '');\n}\n\nfunction twipsToPt(twips: number): string {\n return (twips / 20).toFixed(1).replace(/\\.0$/, '');\n}\n\nfunction escapeHtml(text: string): string {\n return text\n .replaceAll('&', '&amp;')\n .replaceAll('<', '&lt;')\n .replaceAll('>', '&gt;')\n .replaceAll('\"', '&quot;')\n .replaceAll('\\t', '\\u2003');\n}\n"],"names":[],"mappings":"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"}