@shbernal/ts-pptx 3.2.0 → 3.3.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 (71) hide show
  1. package/README.md +19 -20
  2. package/dist/{autopage-QQyfRtoK.js → autopage-D1sqK6j7.js} +16 -15
  3. package/dist/{autopage-QQyfRtoK.js.map → autopage-D1sqK6j7.js.map} +1 -1
  4. package/dist/browser.d.ts +6 -6
  5. package/dist/browser.js +5 -6
  6. package/dist/browser.js.map +1 -1
  7. package/dist/{diagnostics-Chjz_4_Q.d.ts → diagnostics-B2yWpcjB.d.ts} +31 -14
  8. package/dist/{diagnostics-Chjz_4_Q.d.ts.map → diagnostics-B2yWpcjB.d.ts.map} +1 -1
  9. package/dist/{diagnostics-DYQC7xLV.js → diagnostics-H1QzgRSw.js} +0 -0
  10. package/dist/{diagnostics-DYQC7xLV.js.map → diagnostics-H1QzgRSw.js.map} +1 -1
  11. package/dist/{enums-CoXnxiCI.d.ts → enums-CvRYniUA.d.ts} +13 -3
  12. package/dist/{enums-CoXnxiCI.d.ts.map → enums-CvRYniUA.d.ts.map} +1 -1
  13. package/dist/{errors-BVLCFr-t.d.ts → errors-fB1KDJKQ.d.ts} +5 -5
  14. package/dist/{errors-BVLCFr-t.d.ts.map → errors-fB1KDJKQ.d.ts.map} +1 -1
  15. package/dist/{fit-DhMbQG5O.js → fit-CYJ1jkQI.js} +0 -0
  16. package/dist/fit-CYJ1jkQI.js.map +1 -0
  17. package/dist/{html-dom-DajBuobe.js → html-dom-CzewEdE1.js} +4 -5
  18. package/dist/{html-dom-DajBuobe.js.map → html-dom-CzewEdE1.js.map} +1 -1
  19. package/dist/html.d.ts +3 -3
  20. package/dist/html.js +1 -1
  21. package/dist/index.d.ts +6 -6
  22. package/dist/index.js +5 -6
  23. package/dist/index.js.map +1 -1
  24. package/dist/inspect.d.ts +1 -1
  25. package/dist/inspect.js +4 -4
  26. package/dist/math.d.ts +1 -1
  27. package/dist/measure.d.ts +96 -6
  28. package/dist/measure.d.ts.map +1 -1
  29. package/dist/measure.js +2 -2
  30. package/dist/node.d.ts +6 -6
  31. package/dist/node.js +4 -5
  32. package/dist/node.js.map +1 -1
  33. package/dist/notes-SCvpJz0l.js +1646 -0
  34. package/dist/notes-SCvpJz0l.js.map +1 -0
  35. package/dist/{pres-C-EU3SkN.d.ts → pres-Cb-1xDne.d.ts} +4 -4
  36. package/dist/{pres-C-EU3SkN.d.ts.map → pres-Cb-1xDne.d.ts.map} +1 -1
  37. package/dist/{presentation-CxnUVhK9.js → presentation-DeKTJGHf.js} +1002 -422
  38. package/dist/presentation-DeKTJGHf.js.map +1 -0
  39. package/dist/{presentation-Osx1cDdJ.d.ts → presentation-types-B50aOUFI.d.ts} +679 -11
  40. package/dist/presentation-types-B50aOUFI.d.ts.map +1 -0
  41. package/dist/read.d.ts +4 -5
  42. package/dist/read.d.ts.map +1 -1
  43. package/dist/read.js +2 -2
  44. package/dist/script.d.ts +2 -2
  45. package/dist/script.d.ts.map +1 -1
  46. package/dist/script.js +0 -0
  47. package/dist/script.js.map +1 -1
  48. package/dist/{shapes-DoJBPrwN.js → shapes-BXVgsk0F.js} +3 -3
  49. package/dist/{shapes-DoJBPrwN.js.map → shapes-BXVgsk0F.js.map} +1 -1
  50. package/dist/{slide-BTfn1Pyp.d.ts → slide-DWw9UoI6.d.ts} +39 -3
  51. package/dist/slide-DWw9UoI6.d.ts.map +1 -0
  52. package/dist/{st-enums-evQG2A7Z.js → st-enums-bVnezkMJ.js} +33 -12
  53. package/dist/{st-enums-evQG2A7Z.js.map → st-enums-bVnezkMJ.js.map} +1 -1
  54. package/dist/{text-C4P9MNdf.js → text-uM-zGton.js} +219 -1668
  55. package/dist/text-uM-zGton.js.map +1 -0
  56. package/dist/{units-internal-CR8s8YQa.js → units-internal-CGf4VrXy.js} +156 -4
  57. package/dist/units-internal-CGf4VrXy.js.map +1 -0
  58. package/dist/zip.d.ts +2 -2
  59. package/package.json +36 -27
  60. package/dist/embedded-fonts-MaynAHa9.js +0 -94
  61. package/dist/embedded-fonts-MaynAHa9.js.map +0 -1
  62. package/dist/fit-DhMbQG5O.js.map +0 -1
  63. package/dist/presentation-CxnUVhK9.js.map +0 -1
  64. package/dist/presentation-Osx1cDdJ.d.ts.map +0 -1
  65. package/dist/presentation-types-Dj4riuDs.d.ts +0 -538
  66. package/dist/presentation-types-Dj4riuDs.d.ts.map +0 -1
  67. package/dist/slide-BTfn1Pyp.d.ts.map +0 -1
  68. package/dist/text-C4P9MNdf.js.map +0 -1
  69. package/dist/units-C7QM1KgH.js +0 -144
  70. package/dist/units-C7QM1KgH.js.map +0 -1
  71. package/dist/units-internal-CR8s8YQa.js.map +0 -1
package/README.md CHANGED
@@ -14,7 +14,7 @@ reproducible package verification, and agent-assisted OOXML development.
14
14
  > (MIT), detached at its v6.0.0 (June 2025) and developed independently since. It
15
15
  > does not track, merge from, or mirror the original project, and pursues its own
16
16
  > Node-first direction (see _Project Target_). The original work remains under its
17
- > MIT license — see _License_ below.
17
+ > MIT license: see _License_ below.
18
18
 
19
19
  ## Project Target
20
20
 
@@ -50,7 +50,7 @@ Any commit is installable directly from GitHub, without waiting for a release:
50
50
  npm install github:shbernal/ts-pptx#<commit-sha>
51
51
  ```
52
52
 
53
- `master` (`github:shbernal/ts-pptx`) works too, but pin the sha — a branch spec
53
+ `master` (`github:shbernal/ts-pptx`) works too, but pin the sha: a branch spec
54
54
  re-resolves to whatever is at the head of it when the lockfile is next written.
55
55
 
56
56
  `dist/` is not committed, so this builds the package on install: your package
@@ -96,21 +96,21 @@ await pptx.writeFile({ fileName: "example.pptx" })
96
96
  ## Scope And Contributions
97
97
 
98
98
  This project is **Node-first**: it generates and is tested without a browser or any
99
- office application. Two areas are out of *active* maintenance scope — not because
99
+ office application. Two areas are out of *active* maintenance scope, not because
100
100
  they lack merit, but because there is no in-house use case driving them, so the
101
101
  maintainer generally will not pick up bugs or feature requests there:
102
102
 
103
- - **Live-DOM / browser-layout features** — anything whose answer comes from a
103
+ - **Live-DOM / browser-layout features**, anything whose answer comes from a
104
104
  *rendered* page: real `offsetWidth` after layout, the resolved cascade, fonts as
105
105
  the browser actually chose them. (Converting an HTML `<table>` is *not* in this
106
- category — see [HTML tables → slides](#html-tables--slides) below. Only real
106
+ category: see [HTML tables → slides](#html-tables--slides) below. Only real
107
107
  measurement needs a browser.)
108
108
  - **Third-party office-suite interop quirks** that appear only after a file is
109
109
  round-tripped through another application (for example, copy/paste inside WPS
110
110
  Office, then opening in PowerPoint) when the generated package is itself valid
111
111
  OOXML. The supported bar is that output opens cleanly in Microsoft PowerPoint.
112
112
 
113
- **Contributions in these areas are welcome** — issues and pull requests are
113
+ **Contributions in these areas are welcome**: issues and pull requests are
114
114
  encouraged even though the maintainer is not actively developing them. See
115
115
  [`docs/project-target.md`](docs/project-target.md) for the full scope statement
116
116
  and suggested testing approaches.
@@ -118,7 +118,7 @@ and suggested testing approaches.
118
118
  ## Hit A Bug? There Is A Skill For That
119
119
 
120
120
  Most code that uses this library is written by an agent, and an agent that hits a
121
- library defect will usually route around it silently — so the defect is never
121
+ library defect will usually route around it silently, so the defect is never
122
122
  reported and never fixed. `ts-pptx-upstream` is a skill that turns that moment into
123
123
  a filed issue with a minimal reproduction, which is what becomes a permanent
124
124
  regression test here. It ships inside the package, so it is already on disk:
@@ -132,19 +132,19 @@ npx skills add shbernal/ts-pptx # same flags, straight from the repo instead o
132
132
  ```
133
133
 
134
134
  Drop the flags for an interactive prompt if you are at a terminal yourself. Do not reach
135
- for `--all` to avoid the prompt — it installs into every runtime the CLI knows about,
135
+ for `--all` to avoid the prompt: it installs into every runtime the CLI knows about,
136
136
  around seventy of them, and leaves an `agent/` directory at your repository root for
137
137
  runtimes nobody there uses. Name the ones you have.
138
138
 
139
139
  Two things about living with the installed copy. It is a copy, so **a version bump does
140
- not update it** — re-run the command above, or `npx skills update ts-pptx-upstream`, in
140
+ not update it**: re-run the command above, or `npx skills update ts-pptx-upstream`, in
141
141
  the same commit as the bump. And if you track it, track `skills-lock.json` and ignore the
142
142
  copy: `skills experimental_install` restores the file from that lock but creates none of
143
143
  the runtime links, so it is a record, not a restore command.
144
144
 
145
145
  It covers triage (is this ours, your deck's, or out of scope?), reducing a failure to
146
- a script that builds its own deck, and — because presentations carry client names and
147
- unreleased numbers — never uploading one to a public tracker. Once the reproduction
146
+ a script that builds its own deck, and (because presentations carry client names and
147
+ unreleased numbers) never uploading one to a public tracker. Once the reproduction
148
148
  stands on its own it files without interrupting you, and tells you the issue number
149
149
  afterwards. It also covers the far end of the cycle, which is the half that usually
150
150
  rots: when a release lands, finding every workaround it retires and deleting them.
@@ -168,8 +168,8 @@ Supported package surface:
168
168
  - `import { latexToOmml } from "@shbernal/ts-pptx/math"`
169
169
  - `import { tableToSlides } from "@shbernal/ts-pptx/html"`
170
170
  - `import TsPptx from "@shbernal/ts-pptx/node"`
171
- - `import TsPptx from "@shbernal/ts-pptx/browser"`
172
- — the bare specifier resolves to one of these two by export condition, so Node
171
+ - `import TsPptx from "@shbernal/ts-pptx/browser"`:
172
+ the bare specifier resolves to one of these two by export condition, so Node
173
173
  and bundled browser apps get the right build without naming it. A runtime that
174
174
  sets neither (Deno, Bun, edge workers) gets a runtime-agnostic build that
175
175
  authors and exports bytes normally but has no `writeFile` destination; see
@@ -234,7 +234,7 @@ the border box and computed `width` the content box, so padding alone can put th
234
234
  two bases in different proportions. The same table can therefore come out with
235
235
  different column widths in a browser and outside one.
236
236
 
237
- To pin widths regardless of runtime, annotate the `<thead>` header cells — these
237
+ To pin widths regardless of runtime, annotate the `<thead>` header cells, which
238
238
  win outright on every path:
239
239
 
240
240
  ```html
@@ -274,11 +274,8 @@ pnpm run verify
274
274
  ```
275
275
 
276
276
  OOXML serialization changes should also add or update a schema fixture in
277
- `test/schema-cases.js`. The schema suite needs the validator installed once:
278
-
279
- ```bash
280
- ./tools/ooxml-validator/install.sh
281
- ```
277
+ `test/schema-cases.js`. The schema suite validates through `ooxml-validate`, which
278
+ fetches and caches its oracle binary on first use, so there is nothing to install.
282
279
 
283
280
  Package-boundary changes should run:
284
281
 
@@ -288,8 +285,10 @@ pnpm run check:package
288
285
 
289
286
  ## Demos
290
287
 
288
+ - `demos/showcases` builds the two flagship decks from one command.
291
289
  - `demos/node` exercises Node.js ESM generation and stream output.
292
- - `demos/vite-demo` exercises a modern React, TypeScript, and Vite app.
290
+ - The [demos page](https://shbernal.github.io/ts-pptx/demos) builds the quarterly review in
291
+ your browser and previews the slides: nothing to clone.
293
292
 
294
293
  ## Relationship To Upstream
295
294
 
@@ -1,6 +1,5 @@
1
- import { n as warn } from "./diagnostics-DYQC7xLV.js";
2
- import { i as EMU_PER_POINT, r as EMU_PER_INCH } from "./units-C7QM1KgH.js";
3
- import { E as DEF_SLIDE_MARGIN_IN, P as LINEH_MODIFIER, i as inch2Emu, o as marginToEmu, r as getSmartParseNumber } from "./units-internal-CR8s8YQa.js";
1
+ import { n as warn } from "./diagnostics-H1QzgRSw.js";
2
+ import { E as DEF_SLIDE_MARGIN_IN, P as LINEH_MODIFIER, at as EMU_PER_POINT, i as inch2Emu, it as EMU_PER_INCH, o as marginToEmu, r as getSmartParseNumber } from "./units-internal-CGf4VrXy.js";
4
3
  //#region src/gen/table/autopage.ts
5
4
  /**
6
5
  * Break cell text into lines based upon table column width (e.g.: Magic Happens Here(tm))
@@ -231,17 +230,19 @@ function getSlidesForTableRows(tableRows = [], tableProps = {}, presLayout, mast
231
230
  }
232
231
  emuSlideTabW = tableCalcW || inch2Emu((tablePropX ? tablePropX / 914400 : arrInchMargins[1]) + arrInchMargins[3]);
233
232
  if (tableProps.verbose) console.log(`| emuSlideTabW .................................... = ${(emuSlideTabW / EMU_PER_INCH).toFixed(1)}`);
234
- if (!tableProps.colW || !Array.isArray(tableProps.colW)) if (tableProps.colW && !isNaN(Number(tableProps.colW))) {
235
- const arrColW = [];
236
- const colW = Number(tableProps.colW);
237
- (tableRows[0] || []).forEach(() => arrColW.push(colW));
238
- tableProps.colW = [];
239
- arrColW.forEach((val) => {
240
- if (Array.isArray(tableProps.colW)) tableProps.colW.push(val);
241
- });
242
- } else {
243
- tableProps.colW = [];
244
- for (let iCol = 0; iCol < numCols; iCol++) tableProps.colW.push(emuSlideTabW / EMU_PER_INCH / numCols);
233
+ if (!tableProps.colW || !Array.isArray(tableProps.colW)) {
234
+ if (tableProps.colW && !isNaN(Number(tableProps.colW))) {
235
+ const arrColW = [];
236
+ const colW = Number(tableProps.colW);
237
+ (tableRows[0] || []).forEach(() => arrColW.push(colW));
238
+ tableProps.colW = [];
239
+ arrColW.forEach((val) => {
240
+ if (Array.isArray(tableProps.colW)) tableProps.colW.push(val);
241
+ });
242
+ } else {
243
+ tableProps.colW = [];
244
+ for (let iCol = 0; iCol < numCols; iCol++) tableProps.colW.push(emuSlideTabW / EMU_PER_INCH / numCols);
245
+ }
245
246
  }
246
247
  const resolveRowH = (origRowIdx) => Array.isArray(tableProps.rowH) && typeof tableProps.rowH[origRowIdx] === "number" ? tableProps.rowH[origRowIdx] : void 0;
247
248
  let newTableRowSlide = {
@@ -416,4 +417,4 @@ function getSlidesForTableRows(tableRows = [], tableProps = {}, presLayout, mast
416
417
  //#endregion
417
418
  export { getSlidesForTableRows as t };
418
419
 
419
- //# sourceMappingURL=autopage-QQyfRtoK.js.map
420
+ //# sourceMappingURL=autopage-D1sqK6j7.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"autopage-QQyfRtoK.js","names":[],"sources":["../src/gen/table/autopage.ts"],"sourcesContent":["/**\n * ts-pptx: Table auto-paging core\n *\n * The DOM-independent heart of table generation: given rows that overflow a slide,\n * split them across as many slides as needed, measuring wrapped text to compute line\n * counts and row heights. `getSlidesForTableRows` is the in-memory core (fully\n * Node-testable); `parseTextToLines` is its private cell-wrapping helper.\n */\n\nimport { SlideObjectType } from '../../enums.js'\nimport { DEF_FONT_SIZE, DEF_SLIDE_MARGIN_IN, LINEH_MODIFIER } from '../../constants-internal.js'\nimport type {\n\tPresLayout,\n\tTableCell,\n\tTableToSlidesProps,\n\tTableRow,\n\tTableRowSlide,\n\tTableCellProps,\n} from '../../types/index.js'\nimport type { SlideLayoutInternal } from '../../types/internal.js'\nimport { getSmartParseNumber, inch2Emu, marginToEmu } from '../../units-internal.js'\nimport { warn } from '../../diagnostics.js'\nimport { EMU_PER_INCH, EMU_PER_POINT } from '../../units.js'\n\ntype AutoPageCell = TableCell & {\n\t_lineHeight: number\n\t_lines: TableCell[][]\n\toptions: TableCellProps\n\ttext: TableCell[]\n}\n\n// ===== Cell text wrapping =====\n\n/**\n * Break cell text into lines based upon table column width (e.g.: Magic Happens Here(tm))\n * @param {TableCell} cell - table cell\n * @param {number} colWidth - table column width (inches)\n * @return {TableRow[]} - cell's text objects grouped into lines\n */\nfunction parseTextToLines(cell: TableCell, colWidth: number, verbose?: boolean): TableCell[][] {\n\t// FYI: CPL = Width / (font-size / font-constant)\n\t// FYI: CHAR:2.3, colWidth:10, fontSize:12 => CPL=138, (actual chars per line in PPT)=145 [14.5 CPI]\n\t// FYI: CHAR:2.3, colWidth:7 , fontSize:12 => CPL= 97, (actual chars per line in PPT)=100 [14.3 CPI]\n\t// FYI: CHAR:2.3, colWidth:9 , fontSize:16 => CPL= 96, (actual chars per line in PPT)=84 [ 9.3 CPI]\n\tconst FOCO = 2.3 + (cell.options?.autoPageCharWeight ? cell.options.autoPageCharWeight : 0) // Character Constant\n\tconst CPL =\n\t\tMath.floor((colWidth / EMU_PER_POINT) * EMU_PER_INCH) /\n\t\t((cell.options?.fontSize ? cell.options.fontSize : DEF_FONT_SIZE) / FOCO) // Chars-Per-Line\n\n\tconst parsedLines: TableCell[][] = []\n\tlet inputCells: TableCell[] = []\n\tconst inputLines1: TableCell[][] = []\n\tconst inputLines2: TableCell[][] = []\n\t/*\n\t\tif (cell.options && cell.options.autoPageCharWeight) {\n\t\t\tlet CHR1 = 2.3 + (cell.options && cell.options.autoPageCharWeight ? cell.options.autoPageCharWeight : 0) // Character Constant\n\t\t\tlet CPL1 = ((colWidth / EMU_PER_POINT) * EMU_PER_INCH) / ((cell.options && cell.options.fontSize ? cell.options.fontSize : DEF_FONT_SIZE) / CHR1) // Chars-Per-Line\n\t\t\tconsole.log(`cell.options.autoPageCharWeight: '${cell.options.autoPageCharWeight}' => CPL: ${CPL1}`)\n\t\t\tlet CHR2 = 2.3 + 0\n\t\t\tlet CPL2 = ((colWidth / EMU_PER_POINT) * EMU_PER_INCH) / ((cell.options && cell.options.fontSize ? cell.options.fontSize : DEF_FONT_SIZE) / CHR2) // Chars-Per-Line\n\t\t\tconsole.log(`cell.options.autoPageCharWeight: '0' => CPL: ${CPL2}`)\n\t\t}\n\t*/\n\n\t/**\n\t * EX INPUTS: `cell.text`\n\t * - string....: \"Account Name Column\"\n\t * - object....: { text:\"Account Name Column\" }\n\t * - object[]..: [{ text:\"Account Name\", options:{ bold:true } }, { text:\" Column\" }]\n\t * - object[]..: [{ text:\"Account Name\", options:{ breakLine:true } }, { text:\"Input\" }]\n\t */\n\n\t/**\n\t * EX OUTPUTS:\n\t * - string....: [{ text:\"Account Name Column\" }]\n\t * - object....: [{ text:\"Account Name Column\" }]\n\t * - object[]..: [{ text:\"Account Name\", options:{ breakLine:true } }, { text:\"Input\" }]\n\t * - object[]..: [{ text:\"Account Name\", options:{ breakLine:true } }, { text:\"Input\" }]\n\t */\n\n\t// STEP 1: Ensure inputCells is an array of TableCells\n\tif (cell.text && cell.text.toString().trim().length === 0) {\n\t\t// Allow a single space/whitespace as cell text (user-requested feature)\n\t\tinputCells.push({ _type: SlideObjectType.tablecell, text: ' ' })\n\t} else if (typeof cell.text === 'number' || typeof cell.text === 'string') {\n\t\tinputCells.push({ _type: SlideObjectType.tablecell, text: (cell.text || '').toString().trim() })\n\t} else if (Array.isArray(cell.text)) {\n\t\tinputCells = cell.text\n\t}\n\tif (verbose) {\n\t\tconsole.log('[1/4] inputCells')\n\t\tinputCells.forEach((cell, idx) => console.log(`[1/4] [${idx + 1}] cell: ${JSON.stringify(cell)}`))\n\t}\n\n\t// STEP 2: Group table cells into lines based on \"\\n\" or `breakLine` prop\n\t/**\n\t * - EX: `[{ text:\"Input Output\" }, { text:\"Extra\" }]` == 1 line\n\t * - EX: `[{ text:\"Input\" }, { text:\"Output\", options:{ breakLine:true } }]` == 1 line\n\t * - EX: `[{ text:\"Input\\nOutput\" }]` == 2 lines\n\t * - EX: `[{ text:\"Input\", options:{ breakLine:true } }, { text:\"Output\" }]` == 2 lines\n\t */\n\tlet newLine: TableCell[] = []\n\tinputCells.forEach((cell) => {\n\t\tif (typeof cell.text !== 'string') return\n\n\t\tif (cell.text.includes('\\n')) {\n\t\t\t// Each non-last \\n-split part ends with a forced paragraph break; the last\n\t\t\t// part accumulates in newLine so subsequent runs stay on the same paragraph.\n\t\t\tconst parts = cell.text.split('\\n')\n\t\t\tparts.forEach((part, partIdx) => {\n\t\t\t\tconst isLastPart = partIdx === parts.length - 1\n\t\t\t\tif (isLastPart) {\n\t\t\t\t\tnewLine.push({ _type: SlideObjectType.tablecell, text: part, options: cell.options })\n\t\t\t\t} else {\n\t\t\t\t\tnewLine.push({\n\t\t\t\t\t\t_type: SlideObjectType.tablecell,\n\t\t\t\t\t\ttext: part,\n\t\t\t\t\t\toptions: { ...cell.options, breakLine: true },\n\t\t\t\t\t})\n\t\t\t\t\tinputLines1.push(newLine)\n\t\t\t\t\tnewLine = []\n\t\t\t\t}\n\t\t\t})\n\t\t} else {\n\t\t\tnewLine.push({ _type: SlideObjectType.tablecell, text: cell.text.trim(), options: cell.options })\n\t\t}\n\n\t\tif (cell.options?.breakLine) {\n\t\t\tif (verbose) console.log(`inputCells: new line > ${JSON.stringify(newLine)}`)\n\t\t\tinputLines1.push(newLine)\n\t\t\tnewLine = []\n\t\t}\n\t})\n\t// Flush remaining buffer after all cells are processed\n\tif (newLine.length > 0) {\n\t\tinputLines1.push(newLine)\n\t\tnewLine = []\n\t}\n\tif (verbose) {\n\t\tconsole.log(`[2/4] inputLines1 (${inputLines1.length})`)\n\t\tinputLines1.forEach((line, idx) => console.log(`[2/4] [${idx + 1}] line: ${JSON.stringify(line)}`))\n\t}\n\n\t// STEP 3: Tokenize every text object into words. All runs of one logical paragraph\n\t// are flattened into a single token list so step 4 tracks column position across\n\t// styled-run boundaries (fixes independent-reset bug for rich-text cells).\n\tinputLines1.forEach((line) => {\n\t\tconst lineTokens: TableCell[] = []\n\t\tline.forEach((cell) => {\n\t\t\tconst cellTextStr = String(cell.text) // force convert to string (compiled JS is better with this than a cast)\n\t\t\tconst lineWords = cellTextStr.split(' ')\n\n\t\t\tlineWords.forEach((word, idx) => {\n\t\t\t\tconst cellProps = { ...cell.options }\n\t\t\t\t// IMPORTANT: Handle `breakLine` prop - we cannot apply to each word - only apply to very last word!\n\t\t\t\tif (cellProps?.breakLine) cellProps.breakLine = idx + 1 === lineWords.length\n\t\t\t\tlineTokens.push({\n\t\t\t\t\t_type: SlideObjectType.tablecell,\n\t\t\t\t\ttext: word + (idx + 1 < lineWords.length ? ' ' : ''),\n\t\t\t\t\toptions: cellProps,\n\t\t\t\t})\n\t\t\t})\n\t\t})\n\t\tinputLines2.push(lineTokens)\n\t})\n\tif (verbose) {\n\t\tconsole.log(`[3/4] inputLines2 (${inputLines2.length})`)\n\t\tinputLines2.forEach((line) => console.log(`[3/4] line: ${JSON.stringify(line)}`))\n\t}\n\n\t// STEP 4: Group cells/words into lines based upon space consumed by word letters\n\tinputLines2.forEach((line) => {\n\t\tlet lineCells: TableCell[] = []\n\t\tlet strCurrLine = ''\n\n\t\tline.forEach((word) => {\n\t\t\tconst wordText = String(word.text || '')\n\t\t\t// A: create new line when horizontal space is exhausted\n\t\t\tif (strCurrLine.length + wordText.length > CPL) {\n\t\t\t\tparsedLines.push(lineCells)\n\t\t\t\tlineCells = []\n\t\t\t\tstrCurrLine = ''\n\t\t\t}\n\n\t\t\t// B: add current word to line cells\n\t\t\tlineCells.push(word)\n\n\t\t\t// C: add current word to `strCurrLine` which we use to keep track of line's char length\n\t\t\tstrCurrLine += wordText\n\t\t})\n\n\t\t// Flush buffer: Only create a line when there's text to avoid empty row\n\t\tif (lineCells.length > 0) parsedLines.push(lineCells)\n\t})\n\tif (verbose) {\n\t\tconsole.log(`[4/4] parsedLines (${parsedLines.length})`)\n\t\tparsedLines.forEach((line, idx) => console.log(`[4/4] [Line ${idx + 1}]:\\n${JSON.stringify(line)}`))\n\t\tconsole.log('...............................................\\n\\n')\n\t}\n\n\t// Done:\n\treturn parsedLines\n}\n\n// ===== Auto-page engine =====\n// The in-memory core (fully Node-testable). Internally signposted by the\n// `// STEP 1..7` markers below: margins → column count → widths → the main\n// row-iteration/overflow loop (STEP 6) → final-slide flush (STEP 7).\n\n/**\n * Takes an array of table rows and breaks into an array of slides, which contain the calculated amount of table rows that fit on that slide\n * @param {TableCell[][]} tableRows - table rows\n * @param {TableToSlidesProps} tableProps - table2slides properties\n * @param {PresLayout} presLayout - presentation layout\n * @param {SlideLayoutInternal} masterSlide - master slide\n * @return {TableRowSlide[]} array of table rows\n */\nexport function getSlidesForTableRows(\n\ttableRows: TableCell[][] = [],\n\ttableProps: TableToSlidesProps = {},\n\tpresLayout: PresLayout,\n\tmasterSlide?: SlideLayoutInternal | null\n): TableRowSlide[] {\n\tlet arrInchMargins = DEF_SLIDE_MARGIN_IN\n\tlet emuSlideTabW: number\n\tlet emuSlideTabH = EMU_PER_INCH * 1\n\tlet emuTabCurrH = 0\n\tlet numCols = 0\n\tlet warnedNoTabH = false\n\tconst tableRowSlides: TableRowSlide[] = []\n\tconst tablePropX = getSmartParseNumber(tableProps.x, 'X', presLayout)\n\tconst tablePropY = getSmartParseNumber(tableProps.y, 'Y', presLayout)\n\tconst tablePropW = getSmartParseNumber(tableProps.w, 'X', presLayout)\n\tconst tablePropH = getSmartParseNumber(tableProps.h, 'Y', presLayout)\n\tlet tableCalcW: number = tablePropW\n\n\tfunction calcSlideTabH(): void {\n\t\tlet emuStartY = 0\n\t\tif (tableRowSlides.length === 0) emuStartY = tablePropY || inch2Emu(arrInchMargins[0])\n\t\tif (tableRowSlides.length > 0) emuStartY = inch2Emu(tableProps.autoPageSlideStartY || arrInchMargins[0])\n\t\temuSlideTabH = (tablePropH || presLayout.height) - emuStartY - inch2Emu(arrInchMargins[2])\n\t\t// EXPLICIT-H FIX: an explicit `h` is the table's height (an extent), not a\n\t\t// bottom coordinate, so — unlike `presLayout.height` — the first slide must NOT subtract the\n\t\t// start-Y from it. Otherwise a table that begins mid-slide gets a tiny first page (only a few\n\t\t// rows) while later pages, which already clamp to `h`, render normally. Mirror the\n\t\t// subsequent-slide rule below: never let an explicit `h` shrink the usable height below `h`.\n\t\tif (tableRowSlides.length === 0 && tablePropH && emuSlideTabH < tablePropH) emuSlideTabH = tablePropH\n\t\tif (tableRowSlides.length > 1) {\n\t\t\t// D: RULE: Use margins for starting point after the initial Slide, not `opt.y`\n\t\t\tif (typeof tableProps.autoPageSlideStartY === 'number') {\n\t\t\t\temuSlideTabH = (tablePropH || presLayout.height) - inch2Emu(tableProps.autoPageSlideStartY + arrInchMargins[2])\n\t\t\t} else if (tablePropY) {\n\t\t\t\temuSlideTabH =\n\t\t\t\t\t(tablePropH || presLayout.height) -\n\t\t\t\t\tinch2Emu(\n\t\t\t\t\t\t(tablePropY / EMU_PER_INCH < arrInchMargins[0] ? tablePropY / EMU_PER_INCH : arrInchMargins[0]) +\n\t\t\t\t\t\t\tarrInchMargins[2]\n\t\t\t\t\t)\n\t\t\t\t// Use whichever is greater: area between margins or the table H provided (dont shrink usable area - the whole point of over-riding Y on paging is to *increase* usable space)\n\t\t\t\tif (emuSlideTabH < tablePropH) emuSlideTabH = tablePropH\n\t\t\t}\n\t\t}\n\n\t\t// GUARD: a non-positive height, or one too small to fit even a single line of the base font,\n\t\t// means no row ever fits. That previously emitted degenerate empty overflow pages (rows:[]),\n\t\t// which made the recursive addTable throw \"Array expected\", or — with `h` smaller than one\n\t\t// line — placed one row per slide forever. Ignore the unusable height, fall back to the full\n\t\t// slide area between margins, and warn once rather than emit a broken table.\n\t\tconst emuBaseLineH = inch2Emu(\n\t\t\t((typeof tableProps.fontSize === 'number' ? tableProps.fontSize : DEF_FONT_SIZE) *\n\t\t\t\t(LINEH_MODIFIER + (tableProps.autoPageLineWeight || 0))) /\n\t\t\t\t100\n\t\t)\n\t\tif (emuSlideTabH < emuBaseLineH) {\n\t\t\tconst emuStartY =\n\t\t\t\ttableRowSlides.length === 0\n\t\t\t\t\t? tablePropY || inch2Emu(arrInchMargins[0])\n\t\t\t\t\t: inch2Emu(tableProps.autoPageSlideStartY || arrInchMargins[0])\n\t\t\tconst fallbackH = presLayout.height - emuStartY - inch2Emu(arrInchMargins[2])\n\t\t\tif (!warnedNoTabH) {\n\t\t\t\twarn(\n\t\t\t\t\t'table/autopage-height-too-small',\n\t\t\t\t\t'addTable/autoPage: the table height (`h`) leaves no room to paginate; ignoring it and using the slide height. Increase `h` or decrease `y`.'\n\t\t\t\t)\n\t\t\t\twarnedNoTabH = true\n\t\t\t}\n\t\t\temuSlideTabH = fallbackH > 0 ? fallbackH : presLayout.height\n\t\t}\n\t}\n\n\tif (tableProps.verbose) {\n\t\tconsole.log('[[VERBOSE MODE]]')\n\t\tconsole.log('|-- TABLE PROPS --------------------------------------------------------|')\n\t\tconsole.log(`| presLayout.width ................................ = ${(presLayout.width / EMU_PER_INCH).toFixed(1)}`)\n\t\tconsole.log(\n\t\t\t`| presLayout.height ............................... = ${(presLayout.height / EMU_PER_INCH).toFixed(1)}`\n\t\t)\n\t\tconsole.log(\n\t\t\t`| tableProps.x .................................... = ${typeof tableProps.x === 'number' ? (tableProps.x / EMU_PER_INCH).toFixed(1) : tableProps.x}`\n\t\t)\n\t\tconsole.log(\n\t\t\t`| tableProps.y .................................... = ${typeof tableProps.y === 'number' ? (tableProps.y / EMU_PER_INCH).toFixed(1) : tableProps.y}`\n\t\t)\n\t\tconsole.log(\n\t\t\t`| tableProps.w .................................... = ${typeof tableProps.w === 'number' ? (tableProps.w / EMU_PER_INCH).toFixed(1) : tableProps.w}`\n\t\t)\n\t\tconsole.log(\n\t\t\t`| tableProps.h .................................... = ${typeof tableProps.h === 'number' ? (tableProps.h / EMU_PER_INCH).toFixed(1) : tableProps.h}`\n\t\t)\n\t\tconsole.log(\n\t\t\t`| tableProps.slideMargin .......................... = ${tableProps.slideMargin ? String(tableProps.slideMargin) : ''}`\n\t\t)\n\t\tconsole.log(`| tableProps.margin ............................... = ${String(tableProps.margin)}`)\n\t\tconsole.log(`| tableProps.colW ................................. = ${String(tableProps.colW)}`)\n\t\tconsole.log(`| tableProps.autoPageSlideStartY .................. = ${tableProps.autoPageSlideStartY}`)\n\t\tconsole.log(`| tableProps.autoPageCharWeight ................... = ${tableProps.autoPageCharWeight}`)\n\t\tconsole.log('|-- CALCULATIONS -------------------------------------------------------|')\n\t\tconsole.log(`| tablePropX ...................................... = ${tablePropX / EMU_PER_INCH}`)\n\t\tconsole.log(`| tablePropY ...................................... = ${tablePropY / EMU_PER_INCH}`)\n\t\tconsole.log(`| tablePropW ...................................... = ${tablePropW / EMU_PER_INCH}`)\n\t\tconsole.log(`| tablePropH ...................................... = ${tablePropH / EMU_PER_INCH}`)\n\t\tconsole.log(`| tableCalcW ...................................... = ${tableCalcW / EMU_PER_INCH}`)\n\t}\n\n\t// STEP 1: Calculate margins\n\t{\n\t\t// Important: Use default size as zero cell margin is causing our tables to be too large and touch bottom of slide!\n\t\tif (!tableProps.slideMargin && tableProps.slideMargin !== 0) tableProps.slideMargin = DEF_SLIDE_MARGIN_IN[0]\n\n\t\tif (masterSlide && typeof masterSlide._margin !== 'undefined') {\n\t\t\tif (Array.isArray(masterSlide._margin)) arrInchMargins = masterSlide._margin\n\t\t\telse if (!isNaN(Number(masterSlide._margin))) {\n\t\t\t\tarrInchMargins = [\n\t\t\t\t\tNumber(masterSlide._margin),\n\t\t\t\t\tNumber(masterSlide._margin),\n\t\t\t\t\tNumber(masterSlide._margin),\n\t\t\t\t\tNumber(masterSlide._margin),\n\t\t\t\t]\n\t\t\t}\n\t\t} else if (tableProps.slideMargin || tableProps.slideMargin === 0) {\n\t\t\tif (Array.isArray(tableProps.slideMargin)) arrInchMargins = tableProps.slideMargin\n\t\t\telse if (!isNaN(tableProps.slideMargin))\n\t\t\t\tarrInchMargins = [\n\t\t\t\t\ttableProps.slideMargin,\n\t\t\t\t\ttableProps.slideMargin,\n\t\t\t\t\ttableProps.slideMargin,\n\t\t\t\t\ttableProps.slideMargin,\n\t\t\t\t]\n\t\t}\n\n\t\tif (tableProps.verbose)\n\t\t\tconsole.log(`| arrInchMargins .................................. = [${arrInchMargins.join(', ')}]`)\n\t}\n\n\t// STEP 2: Calculate number of columns\n\t{\n\t\t// NOTE: Cells may have a colspan, so merely taking the length of the [0] (or any other) row is not\n\t\t// ....: sufficient to determine column count. Therefore, check each cell for a colspan and total cols as reqd\n\t\tconst firstRow = tableRows[0] || []\n\t\tfirstRow.forEach((cell) => {\n\t\t\tif (!cell) cell = { _type: SlideObjectType.tablecell }\n\t\t\tconst cellOpts = cell.options || null\n\t\t\tnumCols += Number(cellOpts?.colspan ? cellOpts.colspan : 1)\n\t\t})\n\t\tif (tableProps.verbose) console.log(`| numCols ......................................... = ${numCols}`)\n\t}\n\n\t// Track per-column remaining rowspan depths so we can suppress page breaks that would\n\t// fall inside a rowspan group. colSpanDepths[c] = how many more rows column c is still\n\t// occupied by a rowspan that started in a previous row.\n\tconst colSpanDepths: number[] = new Array<number>(numCols).fill(0)\n\n\t// STEP 3: Calculate width using tableProps.colW if possible\n\tif (!tablePropW && tableProps.colW) {\n\t\ttableCalcW = Array.isArray(tableProps.colW)\n\t\t\t? tableProps.colW.reduce((p, n) => p + n) * EMU_PER_INCH\n\t\t\t: tableProps.colW * numCols || 0\n\t\tif (tableProps.verbose)\n\t\t\tconsole.log(`| tableCalcW ...................................... = ${tableCalcW / EMU_PER_INCH}`)\n\t}\n\n\t// STEP 4: Calculate usable width now that total usable space is known (`emuSlideTabW`)\n\t{\n\t\temuSlideTabW =\n\t\t\ttableCalcW || inch2Emu((tablePropX ? tablePropX / EMU_PER_INCH : arrInchMargins[1]) + arrInchMargins[3])\n\t\tif (tableProps.verbose)\n\t\t\tconsole.log(`| emuSlideTabW .................................... = ${(emuSlideTabW / EMU_PER_INCH).toFixed(1)}`)\n\t}\n\n\t// STEP 5: Calculate column widths if not provided (emuSlideTabW will be used below to determine lines-per-col)\n\tif (!tableProps.colW || !Array.isArray(tableProps.colW)) {\n\t\tif (tableProps.colW && !isNaN(Number(tableProps.colW))) {\n\t\t\tconst arrColW: number[] = []\n\t\t\tconst colW = Number(tableProps.colW)\n\t\t\tconst firstRow = tableRows[0] || []\n\t\t\tfirstRow.forEach(() => arrColW.push(colW))\n\t\t\ttableProps.colW = []\n\t\t\tarrColW.forEach((val) => {\n\t\t\t\tif (Array.isArray(tableProps.colW)) tableProps.colW.push(val)\n\t\t\t})\n\t\t} else {\n\t\t\t// No column widths provided? Then distribute cols.\n\t\t\ttableProps.colW = []\n\t\t\tfor (let iCol = 0; iCol < numCols; iCol++) {\n\t\t\t\ttableProps.colW.push(emuSlideTabW / EMU_PER_INCH / numCols)\n\t\t\t}\n\t\t}\n\t}\n\n\t// Resolve a row's explicit height (inches) from the original `rowH` *array*, keyed by original\n\t// row index. A single-number `rowH` is left to propagate via table options (it applies uniformly,\n\t// so it needs no per-row remapping); only the array form is index-sensitive after pagination.\n\tconst resolveRowH = (origRowIdx: number): number | undefined =>\n\t\tArray.isArray(tableProps.rowH) && typeof tableProps.rowH[origRowIdx] === 'number'\n\t\t\t? tableProps.rowH[origRowIdx]\n\t\t\t: undefined\n\n\t// STEP 6: **MAIN** Iterate over rows, add table content, create new slides as rows overflow\n\tlet newTableRowSlide: TableRowSlide = { rows: [] as TableRow[], rowH: [] as Array<number | undefined> }\n\ttableRows.forEach((row, iRow) => {\n\t\t// A: Row variables — detect active rowspan at the start of this row so we can\n\t\t// suppress page breaks that would split a rowspan group across slides.\n\t\tconst hasActiveRowSpan = colSpanDepths.some((d) => d > 0)\n\t\tconst rowCellLines: AutoPageCell[] = []\n\t\tlet maxCellMarTopEmu = 0\n\t\tlet maxCellMarBtmEmu = 0\n\n\t\t// B: Create new row in data model, calc `maxCellMar*`\n\t\tlet currTableRow: TableRow = []\n\t\trow.forEach((cell) => {\n\t\t\tcurrTableRow.push({\n\t\t\t\t_type: SlideObjectType.tablecell,\n\t\t\t\ttext: [],\n\t\t\t\toptions: cell.options,\n\t\t\t})\n\n\t\t\t// Cell margins are inches (see `marginToEmu`); prefer the cell's own top/bottom margin, else the table's.\n\t\t\tconst cellMargin = Array.isArray(cell.options?.margin) ? cell.options.margin : undefined\n\t\t\tconst tableMargin = Array.isArray(tableProps.margin) ? tableProps.margin : null\n\t\t\tif (cellMargin?.[0] && marginToEmu(cellMargin[0]) > maxCellMarTopEmu)\n\t\t\t\tmaxCellMarTopEmu = marginToEmu(cellMargin[0])\n\t\t\telse if (tableMargin?.[0] && marginToEmu(tableMargin[0]) > maxCellMarTopEmu)\n\t\t\t\tmaxCellMarTopEmu = marginToEmu(tableMargin[0])\n\t\t\tif (cellMargin?.[2] && marginToEmu(cellMargin[2]) > maxCellMarBtmEmu)\n\t\t\t\tmaxCellMarBtmEmu = marginToEmu(cellMargin[2])\n\t\t\telse if (tableMargin?.[2] && marginToEmu(tableMargin[2]) > maxCellMarBtmEmu)\n\t\t\t\tmaxCellMarBtmEmu = marginToEmu(tableMargin[2])\n\t\t})\n\n\t\t// C: Calc usable vertical space/table height. Set default value first, adjust below when necessary.\n\t\tcalcSlideTabH()\n\t\temuTabCurrH += maxCellMarTopEmu + maxCellMarBtmEmu // Start row height with margins\n\t\tif (tableProps.verbose && iRow === 0)\n\t\t\tconsole.log(\n\t\t\t\t`| SLIDE [${tableRowSlides.length}]: emuSlideTabH ...... = ${(emuSlideTabH / EMU_PER_INCH).toFixed(1)} `\n\t\t\t)\n\n\t\t// D: --==[[ BUILD DATA SET ]]==-- (iterate over cells: split text into lines[], set `lineHeight`)\n\t\trow.forEach((cell, iCell) => {\n\t\t\tconst newCellOptions = cell.options || {}\n\t\t\tconst newCell: AutoPageCell = {\n\t\t\t\t_type: SlideObjectType.tablecell,\n\t\t\t\t_lines: [],\n\t\t\t\t_lineHeight: inch2Emu(\n\t\t\t\t\t((cell.options?.fontSize\n\t\t\t\t\t\t? cell.options.fontSize\n\t\t\t\t\t\t: tableProps.fontSize\n\t\t\t\t\t\t\t? tableProps.fontSize\n\t\t\t\t\t\t\t: DEF_FONT_SIZE) *\n\t\t\t\t\t\t(LINEH_MODIFIER + (tableProps.autoPageLineWeight ? tableProps.autoPageLineWeight : 0))) /\n\t\t\t\t\t\t100\n\t\t\t\t),\n\t\t\t\ttext: [],\n\t\t\t\toptions: newCellOptions,\n\t\t\t}\n\n\t\t\t// E-1: Exempt cells with `rowspan` from increasing lineHeight (or we could create a new slide when unecessary!)\n\t\t\tif (newCellOptions.rowspan) newCell._lineHeight = 0\n\n\t\t\t// E-2: The parseTextToLines method uses `autoPageCharWeight`, so inherit from table options\n\t\t\tnewCellOptions.autoPageCharWeight = tableProps.autoPageCharWeight || undefined\n\n\t\t\t// E-3: **MAIN** Parse cell contents into lines based upon col width, font, etc\n\t\t\tconst tableColW = Array.isArray(tableProps.colW) ? tableProps.colW : []\n\t\t\tlet totalColW = tableColW[iCell] ?? 0\n\t\t\tconst cellColspan = cell.options?.colspan\n\t\t\tif (cellColspan) {\n\t\t\t\ttotalColW = tableColW\n\t\t\t\t\t.filter((_cell, idx) => idx >= iCell && idx < idx + cellColspan)\n\t\t\t\t\t.reduce((prev, curr) => prev + curr)\n\t\t\t}\n\n\t\t\t// E-4: Create lines based upon available column width\n\t\t\tnewCell._lines = parseTextToLines(cell, totalColW, false)\n\n\t\t\t// E-5: Add cell to array\n\t\t\trowCellLines.push(newCell)\n\t\t})\n\n\t\t/** E: --==[[ PAGE DATA SET ]]==--\n\t\t * Add text one-line-a-time to this row's cells until: lines are exhausted OR table height limit is hit\n\t\t *\n\t\t * Design:\n\t\t * - Building cells L-to-R/loop style wont work as one could be 100 lines and another 1 line\n\t\t * - Therefore, build the whole row, one-line-at-a-time, across each table columns\n\t\t * - Then, when the vertical size limit is hit is by any of the cells, make a new slide and continue adding any remaining lines\n\t\t *\n\t\t * Implementation:\n\t\t * - `rowCellLines` is an array of cells, one for each column in the table, with each cell containing an array of lines\n\t\t *\n\t\t * Sample Data:\n\t\t * - `rowCellLines` ..: [ TableCell, TableCell, TableCell ]\n\t\t * - `TableCell` .....: { _type: 'tablecell', _lines: TableCell[], _lineHeight: 10 }\n\t\t * - `_lines` ........: [ {_type: 'tablecell', text: 'cell-1,line-1', options: {…}}, {_type: 'tablecell', text: 'cell-1,line-2', options: {…}} }\n\t\t * - `_lines` is TableCell[] (the 1-N words in the line)\n\t\t * {\n\t\t * _lines: [{ text:'cell-1,line-1' }, { text:'cell-1,line-2' }], // TOTAL-CELL-HEIGHT = 2\n\t\t * _lines: [{ text:'cell-2,line-1' }, { text:'cell-2,line-2' }], // TOTAL-CELL-HEIGHT = 2\n\t\t * _lines: [{ text:'cell-3,line-1' }, { text:'cell-3,line-2' }, { text:'cell-3,line-3' }, { text:'cell-3,line-4' }], // TOTAL-CELL-HEIGHT = 4\n\t\t * }\n\t\t *\n\t\t * Example: 2 rows, with the firstrow overflowing onto a new slide\n\t\t * SLIDE 1:\n\t\t * |--------|--------|--------|--------|\n\t\t * | line-1 | line-1 | line-1 | line-1 |\n\t\t * | | | line-2 | |\n\t\t * | | | line-3 | |\n\t\t * |--------|--------|--------|--------|\n\t\t *\n\t\t * SLIDE 2:\n\t\t * |--------|--------|--------|--------|\n\t\t * | | | line-4 | |\n\t\t * |--------|--------|--------|--------|\n\t\t * | line-1 | line-1 | line-1 | line-1 |\n\t\t * |--------|--------|--------|--------|\n\t\t */\n\t\tif (tableProps.verbose) console.log(`\\n| SLIDE [${tableRowSlides.length}]: ROW [${iRow}]: START...`)\n\t\tlet currCellIdx = 0\n\t\tlet emuLineMaxH = 0\n\t\tlet isDone = false\n\t\twhile (!isDone) {\n\t\t\tconst srcCell = rowCellLines[currCellIdx]\n\t\t\tif (!srcCell) break\n\t\t\tlet tgtCell = currTableRow[currCellIdx] // NOTE: may be redefined below (a new row may be created, thus changing this value)\n\n\t\t\t// 1: calc emuLineMaxH\n\t\t\trowCellLines.forEach((cell) => {\n\t\t\t\tif (cell._lineHeight >= emuLineMaxH) emuLineMaxH = cell._lineHeight\n\t\t\t})\n\n\t\t\t// 2: create a new slide if there is insufficient room for the current row,\n\t\t\t// but never break inside a rowspan group — keep spanned rows together.\n\t\t\tif (emuTabCurrH + emuLineMaxH > emuSlideTabH && !hasActiveRowSpan) {\n\t\t\t\tif (tableProps.verbose) {\n\t\t\t\t\tconsole.log('\\n|-----------------------------------------------------------------------|')\n\t\t\t\t\t// prettier-ignore\n\t\t\t\t\tconsole.log(`|-- NEW SLIDE CREATED (currTabH+currLineH > maxH) => ${(emuTabCurrH / EMU_PER_INCH).toFixed(2)} + ${(srcCell._lineHeight / EMU_PER_INCH).toFixed(2)} > ${emuSlideTabH / EMU_PER_INCH}`)\n\t\t\t\t\tconsole.log('|-----------------------------------------------------------------------|\\n\\n')\n\t\t\t\t}\n\n\t\t\t\t// A: add current row slide or it will be lost (only if it has rows and text)\n\t\t\t\tif (\n\t\t\t\t\tcurrTableRow.length > 0 &&\n\t\t\t\t\tcurrTableRow.map((cell) => (Array.isArray(cell.text) ? cell.text.length : 0)).reduce((p, n) => p + n) > 0\n\t\t\t\t) {\n\t\t\t\t\tnewTableRowSlide.rows.push(currTableRow)\n\t\t\t\t\tnewTableRowSlide.rowH?.push(resolveRowH(iRow))\n\t\t\t\t}\n\n\t\t\t\t// B: add current slide to Slides array (never push an empty page: a row that does not\n\t\t\t\t// fit yet has no content here, and an empty `rows` slide crashes the recursive addTable)\n\t\t\t\tif (newTableRowSlide.rows.length > 0) tableRowSlides.push(newTableRowSlide)\n\n\t\t\t\t// C: reset working/curr slide to hold rows as they're created\n\t\t\t\tconst newRows: TableRow[] = []\n\t\t\t\tnewTableRowSlide = { rows: newRows, rowH: [] as Array<number | undefined> }\n\n\t\t\t\t// D: reset working/curr row\n\t\t\t\tcurrTableRow = []\n\t\t\t\trow.forEach((cell) => currTableRow.push({ _type: SlideObjectType.tablecell, text: [], options: cell.options }))\n\n\t\t\t\t// E: Calc usable vertical space/table height now as we may still be in the same row and code above (\"C: Calc usable vertical space/table height.\") calc may now be invalid\n\t\t\t\tcalcSlideTabH()\n\n\t\t\t\t// F: reset current table height for this new Slide, then re-charge the row's cell\n\t\t\t\t// margins onto it — the row is starting over here, so it owes them again.\n\t\t\t\t//\n\t\t\t\t// ORDER IS LOAD-BEARING. These two statements used to run the other way round: the\n\t\t\t\t// margins were added and then wiped by the reset, so the first row of every\n\t\t\t\t// continuation slide was the only row in the table that paid no margin. That let a\n\t\t\t\t// continuation slide accept one row more than it had room for, and the extra row\n\t\t\t\t// hung off the bottom of the slide (upstream gitbrent/PptxGenJS#1200). The symptom\n\t\t\t\t// is easy to miss because the pager is *self*-consistent per slide: it only shows\n\t\t\t\t// up as the first slide and the continuation slides disagreeing about how many\n\t\t\t\t// identical rows fit the identical space — which is what\n\t\t\t\t// test/regression/table-autopage-continuation-budget.test.js pins.\n\t\t\t\temuTabCurrH = maxCellMarTopEmu + maxCellMarBtmEmu\n\t\t\t\tif (tableProps.verbose)\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t`| SLIDE [${tableRowSlides.length}]: emuSlideTabH ...... = ${(emuSlideTabH / EMU_PER_INCH).toFixed(1)} `\n\t\t\t\t\t)\n\n\t\t\t\t// G: handle repeat headers option /or/ Add new empty row to continue current lines into\n\t\t\t\tif (tableProps.autoPageRepeatHeader && tableProps._arrObjTabHeadRows) {\n\t\t\t\t\ttableProps._arrObjTabHeadRows.forEach((row, headIdx) => {\n\t\t\t\t\t\tconst newHeadRow: TableRow = []\n\t\t\t\t\t\tlet maxLineHeight = 0\n\t\t\t\t\t\trow.forEach((cell) => {\n\t\t\t\t\t\t\tnewHeadRow.push(cell)\n\t\t\t\t\t\t\tif ((cell._lineHeight || 0) > maxLineHeight) maxLineHeight = cell._lineHeight || 0\n\t\t\t\t\t\t})\n\t\t\t\t\t\tnewTableRowSlide.rows.push(newHeadRow)\n\t\t\t\t\t\t// Repeated header rows are the original leading rows, so carry their configured height.\n\t\t\t\t\t\tnewTableRowSlide.rowH?.push(resolveRowH(headIdx))\n\t\t\t\t\t\t// NOTE: possible imprecision — this accumulates line height only; cell top/bottom\n\t\t\t\t\t\t// margins are not added, so autoPage row-height estimates can run slightly short.\n\t\t\t\t\t\temuTabCurrH += maxLineHeight\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\t// WIP: NEW: TEST THIS!!\n\t\t\t\ttgtCell = currTableRow[currCellIdx]\n\t\t\t}\n\n\t\t\t// 3: set array of words that comprise this line\n\t\t\tconst currLine = srcCell._lines.shift()\n\n\t\t\t// 4: create new line by adding all words from curr line (or add empty if there are no words to avoid \"needs repair\" issue triggered when cells have null content)\n\t\t\tif (tgtCell && Array.isArray(tgtCell.text)) {\n\t\t\t\tif (currLine) tgtCell.text = tgtCell.text.concat(currLine)\n\t\t\t\telse if (tgtCell.text.length === 0)\n\t\t\t\t\ttgtCell.text = tgtCell.text.concat({ _type: SlideObjectType.tablecell, text: '' })\n\t\t\t\t// IMPORTANT: ^^^ add empty if there are no words to avoid \"needs repair\" issue triggered when cells have null content\n\t\t\t}\n\n\t\t\t// 5: increase table height by the curr line height (if we're on the last column)\n\t\t\tif (currCellIdx === rowCellLines.length - 1) emuTabCurrH += emuLineMaxH\n\n\t\t\t// 6: advance column/cell index (or circle back to first one to continue adding lines)\n\t\t\tcurrCellIdx = currCellIdx < rowCellLines.length - 1 ? currCellIdx + 1 : 0\n\n\t\t\t// 7: WIP: done?\n\t\t\tconst brent = rowCellLines.map((cell) => cell._lines.length).reduce((prev, next) => prev + next)\n\t\t\tif (brent === 0) isDone = true\n\t\t}\n\n\t\t// F: Flush/capture row buffer before it resets at the top of this loop\n\t\tif (currTableRow.length > 0) {\n\t\t\tnewTableRowSlide.rows.push(currTableRow)\n\t\t\tnewTableRowSlide.rowH?.push(resolveRowH(iRow))\n\t\t}\n\n\t\t// G: Update colSpanDepths for the next row's hasActiveRowSpan check.\n\t\t// Snapshot occupied columns *before* adding new spans from this row so that\n\t\t// cells in this row are placed correctly even when the row itself starts spans.\n\t\tconst occupiedBefore = [...colSpanDepths]\n\t\tlet colCursor = 0\n\t\trow.forEach((cell) => {\n\t\t\twhile (colCursor < numCols && (occupiedBefore[colCursor] ?? 0) > 0) colCursor++\n\t\t\tconst cellColspan = cell.options?.colspan ?? 1\n\t\t\tconst cellRowspan = cell.options?.rowspan ?? 1\n\t\t\tif (cellRowspan > 1) {\n\t\t\t\tfor (let c = 0; c < cellColspan && colCursor + c < numCols; c++) {\n\t\t\t\t\tcolSpanDepths[colCursor + c] = cellRowspan\n\t\t\t\t}\n\t\t\t}\n\t\t\tcolCursor += cellColspan\n\t\t})\n\t\t// Consume one row from every active span (including ones just opened above).\n\t\tfor (let c = 0; c < numCols; c++) {\n\t\t\tconst depth = colSpanDepths[c] ?? 0\n\t\t\tif (depth > 0) colSpanDepths[c] = depth - 1\n\t\t}\n\n\t\tif (tableProps.verbose) {\n\t\t\tconsole.log(\n\t\t\t\t`- SLIDE [${tableRowSlides.length}]: ROW [${iRow}]: ...COMPLETE ...... emuTabCurrH = ${(emuTabCurrH / EMU_PER_INCH).toFixed(2)} ( emuSlideTabH = ${(\n\t\t\t\t\temuSlideTabH / EMU_PER_INCH\n\t\t\t\t).toFixed(2)} )`\n\t\t\t)\n\t\t}\n\t})\n\n\t// STEP 7: Flush buffer / add final slide (skip an empty trailing buffer; always keep at least\n\t// one slide so a non-empty table is never reduced to zero pages)\n\tif (newTableRowSlide.rows.length > 0 || tableRowSlides.length === 0) tableRowSlides.push(newTableRowSlide)\n\n\tif (tableProps.verbose) {\n\t\tconsole.log('\\n|================================================|')\n\t\tconsole.log(`| FINAL: tableRowSlides.length = ${tableRowSlides.length}`)\n\t\ttableRowSlides.forEach((slide) => console.log(slide))\n\t\tconsole.log('|================================================|\\n\\n')\n\t}\n\n\t// LAST:\n\treturn tableRowSlides\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"autopage-D1sqK6j7.js","names":[],"sources":["../src/gen/table/autopage.ts"],"sourcesContent":["/**\n * ts-pptx: Table auto-paging core\n *\n * The DOM-independent heart of table generation: given rows that overflow a slide,\n * split them across as many slides as needed, measuring wrapped text to compute line\n * counts and row heights. `getSlidesForTableRows` is the in-memory core (fully\n * Node-testable); `parseTextToLines` is its private cell-wrapping helper.\n */\n\nimport { SlideObjectType } from '../../enums.js'\nimport { DEF_FONT_SIZE, DEF_SLIDE_MARGIN_IN, LINEH_MODIFIER } from '../../constants-internal.js'\nimport type {\n\tPresLayout,\n\tTableCell,\n\tTableToSlidesProps,\n\tTableRow,\n\tTableRowSlide,\n\tTableCellProps,\n} from '../../types/index.js'\nimport type { SlideLayoutInternal } from '../../types/internal.js'\nimport { getSmartParseNumber, inch2Emu, marginToEmu } from '../../units-internal.js'\nimport { warn } from '../../diagnostics.js'\nimport { EMU_PER_INCH, EMU_PER_POINT } from '../../units.js'\n\ntype AutoPageCell = TableCell & {\n\t_lineHeight: number\n\t_lines: TableCell[][]\n\toptions: TableCellProps\n\ttext: TableCell[]\n}\n\n// ===== Cell text wrapping =====\n\n/**\n * Break cell text into lines based upon table column width (e.g.: Magic Happens Here(tm))\n * @param {TableCell} cell - table cell\n * @param {number} colWidth - table column width (inches)\n * @return {TableRow[]} - cell's text objects grouped into lines\n */\nfunction parseTextToLines(cell: TableCell, colWidth: number, verbose?: boolean): TableCell[][] {\n\t// FYI: CPL = Width / (font-size / font-constant)\n\t// FYI: CHAR:2.3, colWidth:10, fontSize:12 => CPL=138, (actual chars per line in PPT)=145 [14.5 CPI]\n\t// FYI: CHAR:2.3, colWidth:7 , fontSize:12 => CPL= 97, (actual chars per line in PPT)=100 [14.3 CPI]\n\t// FYI: CHAR:2.3, colWidth:9 , fontSize:16 => CPL= 96, (actual chars per line in PPT)=84 [ 9.3 CPI]\n\tconst FOCO = 2.3 + (cell.options?.autoPageCharWeight ? cell.options.autoPageCharWeight : 0) // Character Constant\n\tconst CPL =\n\t\tMath.floor((colWidth / EMU_PER_POINT) * EMU_PER_INCH) /\n\t\t((cell.options?.fontSize ? cell.options.fontSize : DEF_FONT_SIZE) / FOCO) // Chars-Per-Line\n\n\tconst parsedLines: TableCell[][] = []\n\tlet inputCells: TableCell[] = []\n\tconst inputLines1: TableCell[][] = []\n\tconst inputLines2: TableCell[][] = []\n\t/*\n\t\tif (cell.options && cell.options.autoPageCharWeight) {\n\t\t\tlet CHR1 = 2.3 + (cell.options && cell.options.autoPageCharWeight ? cell.options.autoPageCharWeight : 0) // Character Constant\n\t\t\tlet CPL1 = ((colWidth / EMU_PER_POINT) * EMU_PER_INCH) / ((cell.options && cell.options.fontSize ? cell.options.fontSize : DEF_FONT_SIZE) / CHR1) // Chars-Per-Line\n\t\t\tconsole.log(`cell.options.autoPageCharWeight: '${cell.options.autoPageCharWeight}' => CPL: ${CPL1}`)\n\t\t\tlet CHR2 = 2.3 + 0\n\t\t\tlet CPL2 = ((colWidth / EMU_PER_POINT) * EMU_PER_INCH) / ((cell.options && cell.options.fontSize ? cell.options.fontSize : DEF_FONT_SIZE) / CHR2) // Chars-Per-Line\n\t\t\tconsole.log(`cell.options.autoPageCharWeight: '0' => CPL: ${CPL2}`)\n\t\t}\n\t*/\n\n\t/**\n\t * EX INPUTS: `cell.text`\n\t * - string....: \"Account Name Column\"\n\t * - object....: { text:\"Account Name Column\" }\n\t * - object[]..: [{ text:\"Account Name\", options:{ bold:true } }, { text:\" Column\" }]\n\t * - object[]..: [{ text:\"Account Name\", options:{ breakLine:true } }, { text:\"Input\" }]\n\t */\n\n\t/**\n\t * EX OUTPUTS:\n\t * - string....: [{ text:\"Account Name Column\" }]\n\t * - object....: [{ text:\"Account Name Column\" }]\n\t * - object[]..: [{ text:\"Account Name\", options:{ breakLine:true } }, { text:\"Input\" }]\n\t * - object[]..: [{ text:\"Account Name\", options:{ breakLine:true } }, { text:\"Input\" }]\n\t */\n\n\t// STEP 1: Ensure inputCells is an array of TableCells\n\tif (cell.text && cell.text.toString().trim().length === 0) {\n\t\t// Allow a single space/whitespace as cell text (user-requested feature)\n\t\tinputCells.push({ _type: SlideObjectType.tablecell, text: ' ' })\n\t} else if (typeof cell.text === 'number' || typeof cell.text === 'string') {\n\t\tinputCells.push({ _type: SlideObjectType.tablecell, text: (cell.text || '').toString().trim() })\n\t} else if (Array.isArray(cell.text)) {\n\t\tinputCells = cell.text\n\t}\n\tif (verbose) {\n\t\tconsole.log('[1/4] inputCells')\n\t\tinputCells.forEach((cell, idx) => console.log(`[1/4] [${idx + 1}] cell: ${JSON.stringify(cell)}`))\n\t}\n\n\t// STEP 2: Group table cells into lines based on \"\\n\" or `breakLine` prop\n\t/**\n\t * - EX: `[{ text:\"Input Output\" }, { text:\"Extra\" }]` == 1 line\n\t * - EX: `[{ text:\"Input\" }, { text:\"Output\", options:{ breakLine:true } }]` == 1 line\n\t * - EX: `[{ text:\"Input\\nOutput\" }]` == 2 lines\n\t * - EX: `[{ text:\"Input\", options:{ breakLine:true } }, { text:\"Output\" }]` == 2 lines\n\t */\n\tlet newLine: TableCell[] = []\n\tinputCells.forEach((cell) => {\n\t\tif (typeof cell.text !== 'string') return\n\n\t\tif (cell.text.includes('\\n')) {\n\t\t\t// Each non-last \\n-split part ends with a forced paragraph break; the last\n\t\t\t// part accumulates in newLine so subsequent runs stay on the same paragraph.\n\t\t\tconst parts = cell.text.split('\\n')\n\t\t\tparts.forEach((part, partIdx) => {\n\t\t\t\tconst isLastPart = partIdx === parts.length - 1\n\t\t\t\tif (isLastPart) {\n\t\t\t\t\tnewLine.push({ _type: SlideObjectType.tablecell, text: part, options: cell.options })\n\t\t\t\t} else {\n\t\t\t\t\tnewLine.push({\n\t\t\t\t\t\t_type: SlideObjectType.tablecell,\n\t\t\t\t\t\ttext: part,\n\t\t\t\t\t\toptions: { ...cell.options, breakLine: true },\n\t\t\t\t\t})\n\t\t\t\t\tinputLines1.push(newLine)\n\t\t\t\t\tnewLine = []\n\t\t\t\t}\n\t\t\t})\n\t\t} else {\n\t\t\tnewLine.push({ _type: SlideObjectType.tablecell, text: cell.text.trim(), options: cell.options })\n\t\t}\n\n\t\tif (cell.options?.breakLine) {\n\t\t\tif (verbose) console.log(`inputCells: new line > ${JSON.stringify(newLine)}`)\n\t\t\tinputLines1.push(newLine)\n\t\t\tnewLine = []\n\t\t}\n\t})\n\t// Flush remaining buffer after all cells are processed\n\tif (newLine.length > 0) {\n\t\tinputLines1.push(newLine)\n\t\tnewLine = []\n\t}\n\tif (verbose) {\n\t\tconsole.log(`[2/4] inputLines1 (${inputLines1.length})`)\n\t\tinputLines1.forEach((line, idx) => console.log(`[2/4] [${idx + 1}] line: ${JSON.stringify(line)}`))\n\t}\n\n\t// STEP 3: Tokenize every text object into words. All runs of one logical paragraph\n\t// are flattened into a single token list so step 4 tracks column position across\n\t// styled-run boundaries (fixes independent-reset bug for rich-text cells).\n\tinputLines1.forEach((line) => {\n\t\tconst lineTokens: TableCell[] = []\n\t\tline.forEach((cell) => {\n\t\t\tconst cellTextStr = String(cell.text) // force convert to string (compiled JS is better with this than a cast)\n\t\t\tconst lineWords = cellTextStr.split(' ')\n\n\t\t\tlineWords.forEach((word, idx) => {\n\t\t\t\tconst cellProps = { ...cell.options }\n\t\t\t\t// IMPORTANT: Handle `breakLine` prop - we cannot apply to each word - only apply to very last word!\n\t\t\t\tif (cellProps?.breakLine) cellProps.breakLine = idx + 1 === lineWords.length\n\t\t\t\tlineTokens.push({\n\t\t\t\t\t_type: SlideObjectType.tablecell,\n\t\t\t\t\ttext: word + (idx + 1 < lineWords.length ? ' ' : ''),\n\t\t\t\t\toptions: cellProps,\n\t\t\t\t})\n\t\t\t})\n\t\t})\n\t\tinputLines2.push(lineTokens)\n\t})\n\tif (verbose) {\n\t\tconsole.log(`[3/4] inputLines2 (${inputLines2.length})`)\n\t\tinputLines2.forEach((line) => console.log(`[3/4] line: ${JSON.stringify(line)}`))\n\t}\n\n\t// STEP 4: Group cells/words into lines based upon space consumed by word letters\n\tinputLines2.forEach((line) => {\n\t\tlet lineCells: TableCell[] = []\n\t\tlet strCurrLine = ''\n\n\t\tline.forEach((word) => {\n\t\t\tconst wordText = String(word.text || '')\n\t\t\t// A: create new line when horizontal space is exhausted\n\t\t\tif (strCurrLine.length + wordText.length > CPL) {\n\t\t\t\tparsedLines.push(lineCells)\n\t\t\t\tlineCells = []\n\t\t\t\tstrCurrLine = ''\n\t\t\t}\n\n\t\t\t// B: add current word to line cells\n\t\t\tlineCells.push(word)\n\n\t\t\t// C: add current word to `strCurrLine` which we use to keep track of line's char length\n\t\t\tstrCurrLine += wordText\n\t\t})\n\n\t\t// Flush buffer: Only create a line when there's text to avoid empty row\n\t\tif (lineCells.length > 0) parsedLines.push(lineCells)\n\t})\n\tif (verbose) {\n\t\tconsole.log(`[4/4] parsedLines (${parsedLines.length})`)\n\t\tparsedLines.forEach((line, idx) => console.log(`[4/4] [Line ${idx + 1}]:\\n${JSON.stringify(line)}`))\n\t\tconsole.log('...............................................\\n\\n')\n\t}\n\n\t// Done:\n\treturn parsedLines\n}\n\n// ===== Auto-page engine =====\n// The in-memory core (fully Node-testable). Internally signposted by the\n// `// STEP 1..7` markers below: margins → column count → widths → the main\n// row-iteration/overflow loop (STEP 6) → final-slide flush (STEP 7).\n\n/**\n * Takes an array of table rows and breaks into an array of slides, which contain the calculated amount of table rows that fit on that slide\n * @param {TableCell[][]} tableRows - table rows\n * @param {TableToSlidesProps} tableProps - table2slides properties\n * @param {PresLayout} presLayout - presentation layout\n * @param {SlideLayoutInternal} masterSlide - master slide\n * @return {TableRowSlide[]} array of table rows\n */\nexport function getSlidesForTableRows(\n\ttableRows: TableCell[][] = [],\n\ttableProps: TableToSlidesProps = {},\n\tpresLayout: PresLayout,\n\tmasterSlide?: SlideLayoutInternal | null\n): TableRowSlide[] {\n\tlet arrInchMargins = DEF_SLIDE_MARGIN_IN\n\tlet emuSlideTabW: number\n\tlet emuSlideTabH = EMU_PER_INCH * 1\n\tlet emuTabCurrH = 0\n\tlet numCols = 0\n\tlet warnedNoTabH = false\n\tconst tableRowSlides: TableRowSlide[] = []\n\tconst tablePropX = getSmartParseNumber(tableProps.x, 'X', presLayout)\n\tconst tablePropY = getSmartParseNumber(tableProps.y, 'Y', presLayout)\n\tconst tablePropW = getSmartParseNumber(tableProps.w, 'X', presLayout)\n\tconst tablePropH = getSmartParseNumber(tableProps.h, 'Y', presLayout)\n\tlet tableCalcW: number = tablePropW\n\n\tfunction calcSlideTabH(): void {\n\t\tlet emuStartY = 0\n\t\tif (tableRowSlides.length === 0) emuStartY = tablePropY || inch2Emu(arrInchMargins[0])\n\t\tif (tableRowSlides.length > 0) emuStartY = inch2Emu(tableProps.autoPageSlideStartY || arrInchMargins[0])\n\t\temuSlideTabH = (tablePropH || presLayout.height) - emuStartY - inch2Emu(arrInchMargins[2])\n\t\t// EXPLICIT-H FIX: an explicit `h` is the table's height (an extent), not a\n\t\t// bottom coordinate, so — unlike `presLayout.height` — the first slide must NOT subtract the\n\t\t// start-Y from it. Otherwise a table that begins mid-slide gets a tiny first page (only a few\n\t\t// rows) while later pages, which already clamp to `h`, render normally. Mirror the\n\t\t// subsequent-slide rule below: never let an explicit `h` shrink the usable height below `h`.\n\t\tif (tableRowSlides.length === 0 && tablePropH && emuSlideTabH < tablePropH) emuSlideTabH = tablePropH\n\t\tif (tableRowSlides.length > 1) {\n\t\t\t// D: RULE: Use margins for starting point after the initial Slide, not `opt.y`\n\t\t\tif (typeof tableProps.autoPageSlideStartY === 'number') {\n\t\t\t\temuSlideTabH = (tablePropH || presLayout.height) - inch2Emu(tableProps.autoPageSlideStartY + arrInchMargins[2])\n\t\t\t} else if (tablePropY) {\n\t\t\t\temuSlideTabH =\n\t\t\t\t\t(tablePropH || presLayout.height) -\n\t\t\t\t\tinch2Emu(\n\t\t\t\t\t\t(tablePropY / EMU_PER_INCH < arrInchMargins[0] ? tablePropY / EMU_PER_INCH : arrInchMargins[0]) +\n\t\t\t\t\t\t\tarrInchMargins[2]\n\t\t\t\t\t)\n\t\t\t\t// Use whichever is greater: area between margins or the table H provided (dont shrink usable area - the whole point of over-riding Y on paging is to *increase* usable space)\n\t\t\t\tif (emuSlideTabH < tablePropH) emuSlideTabH = tablePropH\n\t\t\t}\n\t\t}\n\n\t\t// GUARD: a non-positive height, or one too small to fit even a single line of the base font,\n\t\t// means no row ever fits. That previously emitted degenerate empty overflow pages (rows:[]),\n\t\t// which made the recursive addTable throw \"Array expected\", or — with `h` smaller than one\n\t\t// line — placed one row per slide forever. Ignore the unusable height, fall back to the full\n\t\t// slide area between margins, and warn once rather than emit a broken table.\n\t\tconst emuBaseLineH = inch2Emu(\n\t\t\t((typeof tableProps.fontSize === 'number' ? tableProps.fontSize : DEF_FONT_SIZE) *\n\t\t\t\t(LINEH_MODIFIER + (tableProps.autoPageLineWeight || 0))) /\n\t\t\t\t100\n\t\t)\n\t\tif (emuSlideTabH < emuBaseLineH) {\n\t\t\tconst emuStartY =\n\t\t\t\ttableRowSlides.length === 0\n\t\t\t\t\t? tablePropY || inch2Emu(arrInchMargins[0])\n\t\t\t\t\t: inch2Emu(tableProps.autoPageSlideStartY || arrInchMargins[0])\n\t\t\tconst fallbackH = presLayout.height - emuStartY - inch2Emu(arrInchMargins[2])\n\t\t\tif (!warnedNoTabH) {\n\t\t\t\twarn(\n\t\t\t\t\t'table/autopage-height-too-small',\n\t\t\t\t\t'addTable/autoPage: the table height (`h`) leaves no room to paginate; ignoring it and using the slide height. Increase `h` or decrease `y`.'\n\t\t\t\t)\n\t\t\t\twarnedNoTabH = true\n\t\t\t}\n\t\t\temuSlideTabH = fallbackH > 0 ? fallbackH : presLayout.height\n\t\t}\n\t}\n\n\tif (tableProps.verbose) {\n\t\tconsole.log('[[VERBOSE MODE]]')\n\t\tconsole.log('|-- TABLE PROPS --------------------------------------------------------|')\n\t\tconsole.log(`| presLayout.width ................................ = ${(presLayout.width / EMU_PER_INCH).toFixed(1)}`)\n\t\tconsole.log(\n\t\t\t`| presLayout.height ............................... = ${(presLayout.height / EMU_PER_INCH).toFixed(1)}`\n\t\t)\n\t\tconsole.log(\n\t\t\t`| tableProps.x .................................... = ${typeof tableProps.x === 'number' ? (tableProps.x / EMU_PER_INCH).toFixed(1) : tableProps.x}`\n\t\t)\n\t\tconsole.log(\n\t\t\t`| tableProps.y .................................... = ${typeof tableProps.y === 'number' ? (tableProps.y / EMU_PER_INCH).toFixed(1) : tableProps.y}`\n\t\t)\n\t\tconsole.log(\n\t\t\t`| tableProps.w .................................... = ${typeof tableProps.w === 'number' ? (tableProps.w / EMU_PER_INCH).toFixed(1) : tableProps.w}`\n\t\t)\n\t\tconsole.log(\n\t\t\t`| tableProps.h .................................... = ${typeof tableProps.h === 'number' ? (tableProps.h / EMU_PER_INCH).toFixed(1) : tableProps.h}`\n\t\t)\n\t\tconsole.log(\n\t\t\t`| tableProps.slideMargin .......................... = ${tableProps.slideMargin ? String(tableProps.slideMargin) : ''}`\n\t\t)\n\t\tconsole.log(`| tableProps.margin ............................... = ${String(tableProps.margin)}`)\n\t\tconsole.log(`| tableProps.colW ................................. = ${String(tableProps.colW)}`)\n\t\tconsole.log(`| tableProps.autoPageSlideStartY .................. = ${tableProps.autoPageSlideStartY}`)\n\t\tconsole.log(`| tableProps.autoPageCharWeight ................... = ${tableProps.autoPageCharWeight}`)\n\t\tconsole.log('|-- CALCULATIONS -------------------------------------------------------|')\n\t\tconsole.log(`| tablePropX ...................................... = ${tablePropX / EMU_PER_INCH}`)\n\t\tconsole.log(`| tablePropY ...................................... = ${tablePropY / EMU_PER_INCH}`)\n\t\tconsole.log(`| tablePropW ...................................... = ${tablePropW / EMU_PER_INCH}`)\n\t\tconsole.log(`| tablePropH ...................................... = ${tablePropH / EMU_PER_INCH}`)\n\t\tconsole.log(`| tableCalcW ...................................... = ${tableCalcW / EMU_PER_INCH}`)\n\t}\n\n\t// STEP 1: Calculate margins\n\t{\n\t\t// Important: Use default size as zero cell margin is causing our tables to be too large and touch bottom of slide!\n\t\tif (!tableProps.slideMargin && tableProps.slideMargin !== 0) tableProps.slideMargin = DEF_SLIDE_MARGIN_IN[0]\n\n\t\tif (masterSlide && typeof masterSlide._margin !== 'undefined') {\n\t\t\tif (Array.isArray(masterSlide._margin)) arrInchMargins = masterSlide._margin\n\t\t\telse if (!isNaN(Number(masterSlide._margin))) {\n\t\t\t\tarrInchMargins = [\n\t\t\t\t\tNumber(masterSlide._margin),\n\t\t\t\t\tNumber(masterSlide._margin),\n\t\t\t\t\tNumber(masterSlide._margin),\n\t\t\t\t\tNumber(masterSlide._margin),\n\t\t\t\t]\n\t\t\t}\n\t\t} else if (tableProps.slideMargin || tableProps.slideMargin === 0) {\n\t\t\tif (Array.isArray(tableProps.slideMargin)) arrInchMargins = tableProps.slideMargin\n\t\t\telse if (!isNaN(tableProps.slideMargin))\n\t\t\t\tarrInchMargins = [\n\t\t\t\t\ttableProps.slideMargin,\n\t\t\t\t\ttableProps.slideMargin,\n\t\t\t\t\ttableProps.slideMargin,\n\t\t\t\t\ttableProps.slideMargin,\n\t\t\t\t]\n\t\t}\n\n\t\tif (tableProps.verbose)\n\t\t\tconsole.log(`| arrInchMargins .................................. = [${arrInchMargins.join(', ')}]`)\n\t}\n\n\t// STEP 2: Calculate number of columns\n\t{\n\t\t// NOTE: Cells may have a colspan, so merely taking the length of the [0] (or any other) row is not\n\t\t// ....: sufficient to determine column count. Therefore, check each cell for a colspan and total cols as reqd\n\t\tconst firstRow = tableRows[0] || []\n\t\tfirstRow.forEach((cell) => {\n\t\t\tif (!cell) cell = { _type: SlideObjectType.tablecell }\n\t\t\tconst cellOpts = cell.options || null\n\t\t\tnumCols += Number(cellOpts?.colspan ? cellOpts.colspan : 1)\n\t\t})\n\t\tif (tableProps.verbose) console.log(`| numCols ......................................... = ${numCols}`)\n\t}\n\n\t// Track per-column remaining rowspan depths so we can suppress page breaks that would\n\t// fall inside a rowspan group. colSpanDepths[c] = how many more rows column c is still\n\t// occupied by a rowspan that started in a previous row.\n\tconst colSpanDepths: number[] = new Array<number>(numCols).fill(0)\n\n\t// STEP 3: Calculate width using tableProps.colW if possible\n\tif (!tablePropW && tableProps.colW) {\n\t\ttableCalcW = Array.isArray(tableProps.colW)\n\t\t\t? tableProps.colW.reduce((p, n) => p + n) * EMU_PER_INCH\n\t\t\t: tableProps.colW * numCols || 0\n\t\tif (tableProps.verbose)\n\t\t\tconsole.log(`| tableCalcW ...................................... = ${tableCalcW / EMU_PER_INCH}`)\n\t}\n\n\t// STEP 4: Calculate usable width now that total usable space is known (`emuSlideTabW`)\n\t{\n\t\temuSlideTabW =\n\t\t\ttableCalcW || inch2Emu((tablePropX ? tablePropX / EMU_PER_INCH : arrInchMargins[1]) + arrInchMargins[3])\n\t\tif (tableProps.verbose)\n\t\t\tconsole.log(`| emuSlideTabW .................................... = ${(emuSlideTabW / EMU_PER_INCH).toFixed(1)}`)\n\t}\n\n\t// STEP 5: Calculate column widths if not provided (emuSlideTabW will be used below to determine lines-per-col)\n\tif (!tableProps.colW || !Array.isArray(tableProps.colW)) {\n\t\tif (tableProps.colW && !isNaN(Number(tableProps.colW))) {\n\t\t\tconst arrColW: number[] = []\n\t\t\tconst colW = Number(tableProps.colW)\n\t\t\tconst firstRow = tableRows[0] || []\n\t\t\tfirstRow.forEach(() => arrColW.push(colW))\n\t\t\ttableProps.colW = []\n\t\t\tarrColW.forEach((val) => {\n\t\t\t\tif (Array.isArray(tableProps.colW)) tableProps.colW.push(val)\n\t\t\t})\n\t\t} else {\n\t\t\t// No column widths provided? Then distribute cols.\n\t\t\ttableProps.colW = []\n\t\t\tfor (let iCol = 0; iCol < numCols; iCol++) {\n\t\t\t\ttableProps.colW.push(emuSlideTabW / EMU_PER_INCH / numCols)\n\t\t\t}\n\t\t}\n\t}\n\n\t// Resolve a row's explicit height (inches) from the original `rowH` *array*, keyed by original\n\t// row index. A single-number `rowH` is left to propagate via table options (it applies uniformly,\n\t// so it needs no per-row remapping); only the array form is index-sensitive after pagination.\n\tconst resolveRowH = (origRowIdx: number): number | undefined =>\n\t\tArray.isArray(tableProps.rowH) && typeof tableProps.rowH[origRowIdx] === 'number'\n\t\t\t? tableProps.rowH[origRowIdx]\n\t\t\t: undefined\n\n\t// STEP 6: **MAIN** Iterate over rows, add table content, create new slides as rows overflow\n\tlet newTableRowSlide: TableRowSlide = { rows: [] as TableRow[], rowH: [] as Array<number | undefined> }\n\ttableRows.forEach((row, iRow) => {\n\t\t// A: Row variables — detect active rowspan at the start of this row so we can\n\t\t// suppress page breaks that would split a rowspan group across slides.\n\t\tconst hasActiveRowSpan = colSpanDepths.some((d) => d > 0)\n\t\tconst rowCellLines: AutoPageCell[] = []\n\t\tlet maxCellMarTopEmu = 0\n\t\tlet maxCellMarBtmEmu = 0\n\n\t\t// B: Create new row in data model, calc `maxCellMar*`\n\t\tlet currTableRow: TableRow = []\n\t\trow.forEach((cell) => {\n\t\t\tcurrTableRow.push({\n\t\t\t\t_type: SlideObjectType.tablecell,\n\t\t\t\ttext: [],\n\t\t\t\toptions: cell.options,\n\t\t\t})\n\n\t\t\t// Cell margins are inches (see `marginToEmu`); prefer the cell's own top/bottom margin, else the table's.\n\t\t\tconst cellMargin = Array.isArray(cell.options?.margin) ? cell.options.margin : undefined\n\t\t\tconst tableMargin = Array.isArray(tableProps.margin) ? tableProps.margin : null\n\t\t\tif (cellMargin?.[0] && marginToEmu(cellMargin[0]) > maxCellMarTopEmu)\n\t\t\t\tmaxCellMarTopEmu = marginToEmu(cellMargin[0])\n\t\t\telse if (tableMargin?.[0] && marginToEmu(tableMargin[0]) > maxCellMarTopEmu)\n\t\t\t\tmaxCellMarTopEmu = marginToEmu(tableMargin[0])\n\t\t\tif (cellMargin?.[2] && marginToEmu(cellMargin[2]) > maxCellMarBtmEmu)\n\t\t\t\tmaxCellMarBtmEmu = marginToEmu(cellMargin[2])\n\t\t\telse if (tableMargin?.[2] && marginToEmu(tableMargin[2]) > maxCellMarBtmEmu)\n\t\t\t\tmaxCellMarBtmEmu = marginToEmu(tableMargin[2])\n\t\t})\n\n\t\t// C: Calc usable vertical space/table height. Set default value first, adjust below when necessary.\n\t\tcalcSlideTabH()\n\t\temuTabCurrH += maxCellMarTopEmu + maxCellMarBtmEmu // Start row height with margins\n\t\tif (tableProps.verbose && iRow === 0)\n\t\t\tconsole.log(\n\t\t\t\t`| SLIDE [${tableRowSlides.length}]: emuSlideTabH ...... = ${(emuSlideTabH / EMU_PER_INCH).toFixed(1)} `\n\t\t\t)\n\n\t\t// D: --==[[ BUILD DATA SET ]]==-- (iterate over cells: split text into lines[], set `lineHeight`)\n\t\trow.forEach((cell, iCell) => {\n\t\t\tconst newCellOptions = cell.options || {}\n\t\t\tconst newCell: AutoPageCell = {\n\t\t\t\t_type: SlideObjectType.tablecell,\n\t\t\t\t_lines: [],\n\t\t\t\t_lineHeight: inch2Emu(\n\t\t\t\t\t((cell.options?.fontSize\n\t\t\t\t\t\t? cell.options.fontSize\n\t\t\t\t\t\t: tableProps.fontSize\n\t\t\t\t\t\t\t? tableProps.fontSize\n\t\t\t\t\t\t\t: DEF_FONT_SIZE) *\n\t\t\t\t\t\t(LINEH_MODIFIER + (tableProps.autoPageLineWeight ? tableProps.autoPageLineWeight : 0))) /\n\t\t\t\t\t\t100\n\t\t\t\t),\n\t\t\t\ttext: [],\n\t\t\t\toptions: newCellOptions,\n\t\t\t}\n\n\t\t\t// E-1: Exempt cells with `rowspan` from increasing lineHeight (or we could create a new slide when unecessary!)\n\t\t\tif (newCellOptions.rowspan) newCell._lineHeight = 0\n\n\t\t\t// E-2: The parseTextToLines method uses `autoPageCharWeight`, so inherit from table options\n\t\t\tnewCellOptions.autoPageCharWeight = tableProps.autoPageCharWeight || undefined\n\n\t\t\t// E-3: **MAIN** Parse cell contents into lines based upon col width, font, etc\n\t\t\tconst tableColW = Array.isArray(tableProps.colW) ? tableProps.colW : []\n\t\t\tlet totalColW = tableColW[iCell] ?? 0\n\t\t\tconst cellColspan = cell.options?.colspan\n\t\t\tif (cellColspan) {\n\t\t\t\ttotalColW = tableColW\n\t\t\t\t\t.filter((_cell, idx) => idx >= iCell && idx < idx + cellColspan)\n\t\t\t\t\t.reduce((prev, curr) => prev + curr)\n\t\t\t}\n\n\t\t\t// E-4: Create lines based upon available column width\n\t\t\tnewCell._lines = parseTextToLines(cell, totalColW, false)\n\n\t\t\t// E-5: Add cell to array\n\t\t\trowCellLines.push(newCell)\n\t\t})\n\n\t\t/** E: --==[[ PAGE DATA SET ]]==--\n\t\t * Add text one-line-a-time to this row's cells until: lines are exhausted OR table height limit is hit\n\t\t *\n\t\t * Design:\n\t\t * - Building cells L-to-R/loop style wont work as one could be 100 lines and another 1 line\n\t\t * - Therefore, build the whole row, one-line-at-a-time, across each table columns\n\t\t * - Then, when the vertical size limit is hit is by any of the cells, make a new slide and continue adding any remaining lines\n\t\t *\n\t\t * Implementation:\n\t\t * - `rowCellLines` is an array of cells, one for each column in the table, with each cell containing an array of lines\n\t\t *\n\t\t * Sample Data:\n\t\t * - `rowCellLines` ..: [ TableCell, TableCell, TableCell ]\n\t\t * - `TableCell` .....: { _type: 'tablecell', _lines: TableCell[], _lineHeight: 10 }\n\t\t * - `_lines` ........: [ {_type: 'tablecell', text: 'cell-1,line-1', options: {…}}, {_type: 'tablecell', text: 'cell-1,line-2', options: {…}} }\n\t\t * - `_lines` is TableCell[] (the 1-N words in the line)\n\t\t * {\n\t\t * _lines: [{ text:'cell-1,line-1' }, { text:'cell-1,line-2' }], // TOTAL-CELL-HEIGHT = 2\n\t\t * _lines: [{ text:'cell-2,line-1' }, { text:'cell-2,line-2' }], // TOTAL-CELL-HEIGHT = 2\n\t\t * _lines: [{ text:'cell-3,line-1' }, { text:'cell-3,line-2' }, { text:'cell-3,line-3' }, { text:'cell-3,line-4' }], // TOTAL-CELL-HEIGHT = 4\n\t\t * }\n\t\t *\n\t\t * Example: 2 rows, with the firstrow overflowing onto a new slide\n\t\t * SLIDE 1:\n\t\t * |--------|--------|--------|--------|\n\t\t * | line-1 | line-1 | line-1 | line-1 |\n\t\t * | | | line-2 | |\n\t\t * | | | line-3 | |\n\t\t * |--------|--------|--------|--------|\n\t\t *\n\t\t * SLIDE 2:\n\t\t * |--------|--------|--------|--------|\n\t\t * | | | line-4 | |\n\t\t * |--------|--------|--------|--------|\n\t\t * | line-1 | line-1 | line-1 | line-1 |\n\t\t * |--------|--------|--------|--------|\n\t\t */\n\t\tif (tableProps.verbose) console.log(`\\n| SLIDE [${tableRowSlides.length}]: ROW [${iRow}]: START...`)\n\t\tlet currCellIdx = 0\n\t\tlet emuLineMaxH = 0\n\t\tlet isDone = false\n\t\twhile (!isDone) {\n\t\t\tconst srcCell = rowCellLines[currCellIdx]\n\t\t\tif (!srcCell) break\n\t\t\tlet tgtCell = currTableRow[currCellIdx] // NOTE: may be redefined below (a new row may be created, thus changing this value)\n\n\t\t\t// 1: calc emuLineMaxH\n\t\t\trowCellLines.forEach((cell) => {\n\t\t\t\tif (cell._lineHeight >= emuLineMaxH) emuLineMaxH = cell._lineHeight\n\t\t\t})\n\n\t\t\t// 2: create a new slide if there is insufficient room for the current row,\n\t\t\t// but never break inside a rowspan group — keep spanned rows together.\n\t\t\tif (emuTabCurrH + emuLineMaxH > emuSlideTabH && !hasActiveRowSpan) {\n\t\t\t\tif (tableProps.verbose) {\n\t\t\t\t\tconsole.log('\\n|-----------------------------------------------------------------------|')\n\t\t\t\t\t// prettier-ignore\n\t\t\t\t\tconsole.log(`|-- NEW SLIDE CREATED (currTabH+currLineH > maxH) => ${(emuTabCurrH / EMU_PER_INCH).toFixed(2)} + ${(srcCell._lineHeight / EMU_PER_INCH).toFixed(2)} > ${emuSlideTabH / EMU_PER_INCH}`)\n\t\t\t\t\tconsole.log('|-----------------------------------------------------------------------|\\n\\n')\n\t\t\t\t}\n\n\t\t\t\t// A: add current row slide or it will be lost (only if it has rows and text)\n\t\t\t\tif (\n\t\t\t\t\tcurrTableRow.length > 0 &&\n\t\t\t\t\tcurrTableRow.map((cell) => (Array.isArray(cell.text) ? cell.text.length : 0)).reduce((p, n) => p + n) > 0\n\t\t\t\t) {\n\t\t\t\t\tnewTableRowSlide.rows.push(currTableRow)\n\t\t\t\t\tnewTableRowSlide.rowH?.push(resolveRowH(iRow))\n\t\t\t\t}\n\n\t\t\t\t// B: add current slide to Slides array (never push an empty page: a row that does not\n\t\t\t\t// fit yet has no content here, and an empty `rows` slide crashes the recursive addTable)\n\t\t\t\tif (newTableRowSlide.rows.length > 0) tableRowSlides.push(newTableRowSlide)\n\n\t\t\t\t// C: reset working/curr slide to hold rows as they're created\n\t\t\t\tconst newRows: TableRow[] = []\n\t\t\t\tnewTableRowSlide = { rows: newRows, rowH: [] as Array<number | undefined> }\n\n\t\t\t\t// D: reset working/curr row\n\t\t\t\tcurrTableRow = []\n\t\t\t\trow.forEach((cell) => currTableRow.push({ _type: SlideObjectType.tablecell, text: [], options: cell.options }))\n\n\t\t\t\t// E: Calc usable vertical space/table height now as we may still be in the same row and code above (\"C: Calc usable vertical space/table height.\") calc may now be invalid\n\t\t\t\tcalcSlideTabH()\n\n\t\t\t\t// F: reset current table height for this new Slide, then re-charge the row's cell\n\t\t\t\t// margins onto it — the row is starting over here, so it owes them again.\n\t\t\t\t//\n\t\t\t\t// ORDER IS LOAD-BEARING. These two statements used to run the other way round: the\n\t\t\t\t// margins were added and then wiped by the reset, so the first row of every\n\t\t\t\t// continuation slide was the only row in the table that paid no margin. That let a\n\t\t\t\t// continuation slide accept one row more than it had room for, and the extra row\n\t\t\t\t// hung off the bottom of the slide (upstream gitbrent/PptxGenJS#1200). The symptom\n\t\t\t\t// is easy to miss because the pager is *self*-consistent per slide: it only shows\n\t\t\t\t// up as the first slide and the continuation slides disagreeing about how many\n\t\t\t\t// identical rows fit the identical space — which is what\n\t\t\t\t// test/regression/table-autopage-continuation-budget.test.js pins.\n\t\t\t\temuTabCurrH = maxCellMarTopEmu + maxCellMarBtmEmu\n\t\t\t\tif (tableProps.verbose)\n\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t`| SLIDE [${tableRowSlides.length}]: emuSlideTabH ...... = ${(emuSlideTabH / EMU_PER_INCH).toFixed(1)} `\n\t\t\t\t\t)\n\n\t\t\t\t// G: handle repeat headers option /or/ Add new empty row to continue current lines into\n\t\t\t\tif (tableProps.autoPageRepeatHeader && tableProps._arrObjTabHeadRows) {\n\t\t\t\t\ttableProps._arrObjTabHeadRows.forEach((row, headIdx) => {\n\t\t\t\t\t\tconst newHeadRow: TableRow = []\n\t\t\t\t\t\tlet maxLineHeight = 0\n\t\t\t\t\t\trow.forEach((cell) => {\n\t\t\t\t\t\t\tnewHeadRow.push(cell)\n\t\t\t\t\t\t\tif ((cell._lineHeight || 0) > maxLineHeight) maxLineHeight = cell._lineHeight || 0\n\t\t\t\t\t\t})\n\t\t\t\t\t\tnewTableRowSlide.rows.push(newHeadRow)\n\t\t\t\t\t\t// Repeated header rows are the original leading rows, so carry their configured height.\n\t\t\t\t\t\tnewTableRowSlide.rowH?.push(resolveRowH(headIdx))\n\t\t\t\t\t\t// NOTE: possible imprecision — this accumulates line height only; cell top/bottom\n\t\t\t\t\t\t// margins are not added, so autoPage row-height estimates can run slightly short.\n\t\t\t\t\t\temuTabCurrH += maxLineHeight\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\t// WIP: NEW: TEST THIS!!\n\t\t\t\ttgtCell = currTableRow[currCellIdx]\n\t\t\t}\n\n\t\t\t// 3: set array of words that comprise this line\n\t\t\tconst currLine = srcCell._lines.shift()\n\n\t\t\t// 4: create new line by adding all words from curr line (or add empty if there are no words to avoid \"needs repair\" issue triggered when cells have null content)\n\t\t\tif (tgtCell && Array.isArray(tgtCell.text)) {\n\t\t\t\tif (currLine) tgtCell.text = tgtCell.text.concat(currLine)\n\t\t\t\telse if (tgtCell.text.length === 0)\n\t\t\t\t\ttgtCell.text = tgtCell.text.concat({ _type: SlideObjectType.tablecell, text: '' })\n\t\t\t\t// IMPORTANT: ^^^ add empty if there are no words to avoid \"needs repair\" issue triggered when cells have null content\n\t\t\t}\n\n\t\t\t// 5: increase table height by the curr line height (if we're on the last column)\n\t\t\tif (currCellIdx === rowCellLines.length - 1) emuTabCurrH += emuLineMaxH\n\n\t\t\t// 6: advance column/cell index (or circle back to first one to continue adding lines)\n\t\t\tcurrCellIdx = currCellIdx < rowCellLines.length - 1 ? currCellIdx + 1 : 0\n\n\t\t\t// 7: WIP: done?\n\t\t\tconst brent = rowCellLines.map((cell) => cell._lines.length).reduce((prev, next) => prev + next)\n\t\t\tif (brent === 0) isDone = true\n\t\t}\n\n\t\t// F: Flush/capture row buffer before it resets at the top of this loop\n\t\tif (currTableRow.length > 0) {\n\t\t\tnewTableRowSlide.rows.push(currTableRow)\n\t\t\tnewTableRowSlide.rowH?.push(resolveRowH(iRow))\n\t\t}\n\n\t\t// G: Update colSpanDepths for the next row's hasActiveRowSpan check.\n\t\t// Snapshot occupied columns *before* adding new spans from this row so that\n\t\t// cells in this row are placed correctly even when the row itself starts spans.\n\t\tconst occupiedBefore = [...colSpanDepths]\n\t\tlet colCursor = 0\n\t\trow.forEach((cell) => {\n\t\t\twhile (colCursor < numCols && (occupiedBefore[colCursor] ?? 0) > 0) colCursor++\n\t\t\tconst cellColspan = cell.options?.colspan ?? 1\n\t\t\tconst cellRowspan = cell.options?.rowspan ?? 1\n\t\t\tif (cellRowspan > 1) {\n\t\t\t\tfor (let c = 0; c < cellColspan && colCursor + c < numCols; c++) {\n\t\t\t\t\tcolSpanDepths[colCursor + c] = cellRowspan\n\t\t\t\t}\n\t\t\t}\n\t\t\tcolCursor += cellColspan\n\t\t})\n\t\t// Consume one row from every active span (including ones just opened above).\n\t\tfor (let c = 0; c < numCols; c++) {\n\t\t\tconst depth = colSpanDepths[c] ?? 0\n\t\t\tif (depth > 0) colSpanDepths[c] = depth - 1\n\t\t}\n\n\t\tif (tableProps.verbose) {\n\t\t\tconsole.log(\n\t\t\t\t`- SLIDE [${tableRowSlides.length}]: ROW [${iRow}]: ...COMPLETE ...... emuTabCurrH = ${(emuTabCurrH / EMU_PER_INCH).toFixed(2)} ( emuSlideTabH = ${(\n\t\t\t\t\temuSlideTabH / EMU_PER_INCH\n\t\t\t\t).toFixed(2)} )`\n\t\t\t)\n\t\t}\n\t})\n\n\t// STEP 7: Flush buffer / add final slide (skip an empty trailing buffer; always keep at least\n\t// one slide so a non-empty table is never reduced to zero pages)\n\tif (newTableRowSlide.rows.length > 0 || tableRowSlides.length === 0) tableRowSlides.push(newTableRowSlide)\n\n\tif (tableProps.verbose) {\n\t\tconsole.log('\\n|================================================|')\n\t\tconsole.log(`| FINAL: tableRowSlides.length = ${tableRowSlides.length}`)\n\t\ttableRowSlides.forEach((slide) => console.log(slide))\n\t\tconsole.log('|================================================|\\n\\n')\n\t}\n\n\t// LAST:\n\treturn tableRowSlides\n}\n"],"mappings":"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"}
package/dist/browser.d.ts CHANGED
@@ -1,8 +1,8 @@
1
- import { C as isChartExType, S as connectorPresetFor, _ as TextAnchor, a as CONNECTOR_PRESETS, b as ZIP_OUTPUT_TYPE, c as OutputType, d as SCHEME_COLORS, f as SHAPE_NAME, g as TableStyle, h as SlideObjectType, i as CHART_NAME, l as PLACEHOLDER_TYPE, m as ShapeType, n as AlignV, o as CONNECTOR_PRESET_NAME, p as SchemeColor, r as BulletType, s as ChartType, t as AlignH, u as PlaceholderType, v as VALID_SHAPE_PRESETS, x as asChartType, y as WRITE_OUTPUT_TYPE } from "./enums-CoXnxiCI.js";
2
- import { $ as HAlign, $t as ChartSeriesOpts, A as TableToSlidesDocument, At as ChartLineDash, B as ShapeAdjustHandleXY, Bt as ChartPropsChartHistogram, C as TableCell, Ct as ChartAreaProps, D as TableProps, Dt as ChartExBinning, E as TableCellProps, Et as ChartErrorBarOptions, F as MediaProps, Ft as ChartPropsAxisVal, G as BackgroundProps, Gt as ChartPropsChartStock, H as ShapeConnectionSite, Ht as ChartPropsChartPie, I as MediaType, It as ChartPropsBase, J as DataOrPathProps, Jt as ChartPropsDataLabel, K as Color, Kt as ChartPropsChartSurface, L as OleObjectProps, Lt as ChartPropsChartBar, M as TableToSlidesProps, Mt as ChartOpts, N as ImageBaseProps, Nt as ChartPropsAxisCat, O as TableRow, Ot as ChartExGeography, P as ImageProps, Pt as ChartPropsAxisSer, Q as GradientStopProps, Qt as ChartPropsTitle, R as ShapeAdjustHandle, Rt as ChartPropsChartBoxWhisker, S as TransitionType, Sn as textRuns, St as PresetMaterialType, T as TableCellDiagonals, Tt as ChartDataPointStyle, U as ShapeGuide, Ut as ChartPropsChartRadar, V as ShapeAdjustValue, Vt as ChartPropsChartLine, W as ShapeProps, Wt as ChartPropsChartRegionMap, X as GeometryPoint, Xt as ChartPropsFillLine, Y as DataOrPathRequiredProps, Yt as ChartPropsDataTable, Z as GradientFillProps, Zt as ChartPropsLegend, _ as AnimationProps, _n as TextGlowProps, _t as ShapeFillProps, a as Slide, an as PlaceholderProps, at as PatternPreset, b as TransitionProps, bn as TextPropsOptions, bt as LightRigDirection, c as Model3dPoint, cn as NotesProps, ct as TextVertType, d as MasterTextStyleLevel, dn as ResolvedCommentAuthor, dt as BorderProps, en as LineCap, et as HexColor, f as MasterTextStyleProps, fn as SlideComment, ft as ConnectorProps, g as SlideNumberProps, gn as TextFitShrinkProps, gt as ShadowProps, h as SlideMasterProps, hn as TextBaseProps, ht as HyperlinkProps, i as ObjectOptions, in as ObjectNameProps, it as PatternFillProps, j as TableToSlidesElement, jt as ChartMulti, k as TableRowSlide, kt as ChartExStatistics, l as Model3dProps, ln as NotesTextOptions, lt as ThemeColor, m as SlideMasterObject, mn as TableLayoutResult, mt as HyperlinkActionJump, n as GroupChildProps, nn as OptsChartGridLine, nt as LinearGradientFillProps, o as SlideLayout, on as CommentProps, ot as PositionProps, p as SlideMasterChartProps, pn as TableCellLayout, pt as ConnectorType, q as Coord, qt as ChartPropsChartWaterfall, r as GroupProps, rn as ObjectLockProps, rt as Margin, s as Model3dCameraProps, sn as MeasureTextOptions, st as RadialGradientFillProps, t as AddSlideProps, tn as OptsChartData, tt as ImageFillProps, u as MasterBulletProps, un as OverflowBoxOptions, ut as VAlign, v as AnimationTrigger, vn as TextMeasurement, vt as ShapeLineProps, w as TableCell3DProps, wt as ChartAxisTickMark, x as TransitionSoundProps, xn as textRun, xt as LightRigType, y as PresetEffect, yn as TextProps, yt as BevelPresetType, z as ShapeAdjustHandlePolar, zt as ChartPropsChartDoughnut } from "./slide-BTfn1Pyp.js";
3
- import { a as PresentationProps, c as WriteFileProps, d as ThemeProps, i as PresLayout, l as WriteProps, n as PackagePart, o as SectionProps, r as PartsProps, s as WriteBaseProps, t as CustomPropertyValue, u as ThemeColorScheme } from "./pres-C-EU3SkN.js";
4
- import { A as SectionZoomProps, C as emuToPixels, D as pixelsToEmu, E as percentToEmu, M as SummaryZoomProps, N as ZoomBaseProps, O as pointsToEmu, S as emuToInches, T as inchesToEmu, _ as POINTS_PER_INCH, a as FlatSide, b as StandardLayoutName, c as PresentationCore, d as EMU_PER_INCH, f as EMU_PER_POINT, g as PERCENT_SCALE, h as HUNDREDTHS_PER_POINT, i as ClipShape, j as SlideZoomProps, k as ptToHundredths, l as ANGLE_UNITS_PER_DEGREE, m as FIXED_PCT_PER_PERCENT, n as DiagnosticHandler, o as HalfDiscPreset, p as Emu, r as setDiagnosticHandler, s as clipPath, t as Diagnostic, u as DEFAULT_PX_PER_INCH, v as STANDARD_LAYOUTS, w as emuToPoints, x as coordToEmu, y as StandardLayout } from "./diagnostics-Chjz_4_Q.js";
5
- import { a as TsPptxError, c as DiagnosticCode, d as InvalidOptionErrorCode, f as MediaErrorCode, h as UnsupportedFeatureErrorCode, i as PackageReadError, l as ErrorCode, m as TsPptxCode, n as InvalidOptionError, o as TsPptxErrorOptions, p as PackageReadErrorCode, r as MediaError, s as UnsupportedFeatureError, t as InternalError, u as InternalErrorCode } from "./errors-BVLCFr-t.js";
1
+ import { C as isChartExType, S as connectorPresetFor, _ as TextAnchor, a as CONNECTOR_PRESETS, b as ZIP_OUTPUT_TYPE, c as OutputType, d as SCHEME_COLORS, f as SHAPE_NAME, g as TableStyle, h as SlideObjectType, i as CHART_NAME, l as PLACEHOLDER_TYPE, m as ShapeType, n as AlignV, o as CONNECTOR_PRESET_NAME, p as SchemeColor, r as BulletType, s as ChartType, t as AlignH, u as PlaceholderType, v as VALID_SHAPE_PRESETS, w as isChartType, x as asChartType, y as WRITE_OUTPUT_TYPE } from "./enums-CvRYniUA.js";
2
+ import { $ as HAlign, $t as ChartSeriesOpts, A as TableToSlidesDocument, At as ChartLineDash, B as ShapeAdjustHandleXY, Bt as ChartPropsChartHistogram, C as TableCell, Ct as ChartAreaProps, D as TableProps, Dt as ChartExBinning, E as TableCellProps, Et as ChartErrorBarOptions, F as MediaProps, Ft as ChartPropsAxisVal, G as BackgroundProps, Gt as ChartPropsChartStock, H as ShapeConnectionSite, Ht as ChartPropsChartPie, I as MediaType, It as ChartPropsBase, J as DataOrPathProps, Jt as ChartPropsDataLabel, K as Color, Kt as ChartPropsChartSurface, L as OleObjectProps, Lt as ChartPropsChartBar, M as TableToSlidesProps, Mt as ChartOpts, N as ImageBaseProps, Nt as ChartPropsAxisCat, O as TableRow, Ot as ChartExGeography, P as ImageProps, Pt as ChartPropsAxisSer, Q as GradientStopProps, Qt as ChartPropsTitle, R as ShapeAdjustHandle, Rt as ChartPropsChartBoxWhisker, S as TransitionType, Sn as textRuns, St as PresetMaterialType, T as TableCellDiagonals, Tt as ChartDataPointStyle, U as ShapeGuide, Ut as ChartPropsChartRadar, V as ShapeAdjustValue, Vt as ChartPropsChartLine, W as ShapeProps, Wt as ChartPropsChartRegionMap, X as GeometryPoint, Xt as ChartPropsFillLine, Y as DataOrPathRequiredProps, Yt as ChartPropsDataTable, Z as GradientFillProps, Zt as ChartPropsLegend, _ as AnimationProps, _n as TextGlowProps, _t as ShapeFillProps, a as Slide, an as PlaceholderProps, at as PatternPreset, b as TransitionProps, bn as TextPropsOptions, bt as LightRigDirection, c as Model3dPoint, cn as NotesProps, ct as TextVertType, d as MasterTextStyleLevel, dn as ResolvedCommentAuthor, dt as BorderProps, en as LineCap, et as HexColor, f as MasterTextStyleProps, fn as SlideComment, ft as ConnectorProps, g as SlideNumberProps, gn as TextFitShrinkProps, gt as ShadowProps, h as SlideMasterProps, hn as TextBaseProps, ht as HyperlinkProps, i as ObjectOptions, in as ObjectNameProps, it as PatternFillProps, j as TableToSlidesElement, jt as ChartMulti, k as TableRowSlide, kt as ChartExStatistics, l as Model3dProps, ln as NotesTextOptions, lt as ThemeColor, m as SlideMasterObject, mn as TableLayoutResult, mt as HyperlinkActionJump, n as GroupChildProps, nn as OptsChartGridLine, nt as LinearGradientFillProps, o as SlideLayout, on as CommentProps, ot as PositionProps, p as SlideMasterChartProps, pn as TableCellLayout, pt as ConnectorType, q as Coord, qt as ChartPropsChartWaterfall, r as GroupProps, rn as ObjectLockProps, rt as Margin, s as Model3dCameraProps, sn as MeasureTextOptions, st as RadialGradientFillProps, t as AddSlideProps, tn as OptsChartData, tt as ImageFillProps, u as MasterBulletProps, un as OverflowBoxOptions, ut as VAlign, v as AnimationTrigger, vn as TextMeasurement, vt as ShapeLineProps, w as TableCell3DProps, wt as ChartAxisTickMark, x as TransitionSoundProps, xn as textRun, xt as LightRigType, y as PresetEffect, yn as TextProps, yt as BevelPresetType, z as ShapeAdjustHandlePolar, zt as ChartPropsChartDoughnut } from "./slide-DWw9UoI6.js";
3
+ import { a as PresentationProps, c as WriteFileProps, d as ThemeProps, i as PresLayout, l as WriteProps, n as PackagePart, o as SectionProps, r as PartsProps, s as WriteBaseProps, t as CustomPropertyValue, u as ThemeColorScheme } from "./pres-Cb-1xDne.js";
4
+ import { A as SectionZoomProps, C as emuToPixels, D as pixelsToEmu, E as percentToEmu, M as SummaryZoomProps, N as ZoomBaseProps, O as pointsToEmu, S as emuToInches, T as inchesToEmu, _ as POINTS_PER_INCH, a as FlatSide, b as StandardLayoutName, c as PresentationCore, d as EMU_PER_INCH, f as EMU_PER_POINT, g as PERCENT_SCALE, h as HUNDREDTHS_PER_POINT, i as ClipShape, j as SlideZoomProps, k as ptToHundredths, l as ANGLE_UNITS_PER_DEGREE, m as FIXED_PCT_PER_PERCENT, n as DiagnosticHandler, o as HalfDiscPreset, p as Emu, r as setDiagnosticHandler, s as clipPath, t as Diagnostic, u as DEFAULT_PX_PER_INCH, v as STANDARD_LAYOUTS, w as emuToPoints, x as coordToEmu, y as StandardLayout } from "./diagnostics-B2yWpcjB.js";
5
+ import { a as TsPptxError, c as DiagnosticCode, d as InvalidOptionErrorCode, f as MediaErrorCode, h as UnsupportedFeatureErrorCode, i as PackageReadError, l as ErrorCode, m as TsPptxCode, n as InvalidOptionError, o as TsPptxErrorOptions, p as PackageReadErrorCode, r as MediaError, s as UnsupportedFeatureError, t as InternalError, u as InternalErrorCode } from "./errors-fB1KDJKQ.js";
6
6
  //#region src/browser.d.ts
7
7
  /**
8
8
  * The browser entry, reached through the `browser` export condition — a bundler resolving the
@@ -27,5 +27,5 @@ declare class TsPptx extends PresentationCore {
27
27
  tableToSlides(eleId: string, options?: TableToSlidesProps): void;
28
28
  }
29
29
  //#endregion
30
- export { ANGLE_UNITS_PER_DEGREE, AddSlideProps, AlignH, AlignV, AnimationProps, AnimationTrigger, BackgroundProps, type BevelPresetType, BorderProps, BulletType, CHART_NAME, CONNECTOR_PRESETS, CONNECTOR_PRESET_NAME, ChartAreaProps, ChartAxisTickMark, ChartDataPointStyle, ChartErrorBarOptions, ChartExBinning, ChartExGeography, ChartExStatistics, ChartLineDash, ChartMulti, ChartOpts, ChartPropsAxisCat, ChartPropsAxisSer, ChartPropsAxisVal, ChartPropsBase, ChartPropsChartBar, ChartPropsChartBoxWhisker, ChartPropsChartDoughnut, ChartPropsChartHistogram, ChartPropsChartLine, ChartPropsChartPie, ChartPropsChartRadar, ChartPropsChartRegionMap, ChartPropsChartStock, ChartPropsChartSurface, ChartPropsChartWaterfall, ChartPropsDataLabel, ChartPropsDataTable, ChartPropsFillLine, ChartPropsLegend, ChartPropsTitle, ChartSeriesOpts, ChartType, ClipShape, Color, CommentProps, ConnectorProps, ConnectorType, Coord, CustomPropertyValue, DEFAULT_PX_PER_INCH, DataOrPathProps, DataOrPathRequiredProps, type Diagnostic, type DiagnosticCode, type DiagnosticHandler, EMU_PER_INCH, EMU_PER_POINT, Emu, type ErrorCode, FIXED_PCT_PER_PERCENT, FlatSide, GeometryPoint, GradientFillProps, GradientStopProps, GroupChildProps, GroupProps, HAlign, HUNDREDTHS_PER_POINT, HalfDiscPreset, HexColor, HyperlinkActionJump, HyperlinkProps, ImageBaseProps, ImageFillProps, ImageProps, InternalError, type InternalErrorCode, InvalidOptionError, type InvalidOptionErrorCode, type LightRigDirection, type LightRigType, LineCap, LinearGradientFillProps, Margin, MasterBulletProps, MasterTextStyleLevel, MasterTextStyleProps, MeasureTextOptions, MediaError, type MediaErrorCode, MediaProps, MediaType, Model3dCameraProps, Model3dPoint, Model3dProps, NotesProps, NotesTextOptions, ObjectLockProps, ObjectNameProps, ObjectOptions, OleObjectProps, OptsChartData, OptsChartGridLine, OutputType, OverflowBoxOptions, PERCENT_SCALE, PLACEHOLDER_TYPE, POINTS_PER_INCH, PackagePart, PackageReadError, type PackageReadErrorCode, PartsProps, PatternFillProps, PatternPreset, PlaceholderProps, PlaceholderType, PositionProps, PresLayout, PresentationProps, PresetEffect, type PresetMaterialType, RadialGradientFillProps, ResolvedCommentAuthor, SCHEME_COLORS, SHAPE_NAME, STANDARD_LAYOUTS, SchemeColor, SectionProps, SectionZoomProps, ShadowProps, ShapeAdjustHandle, ShapeAdjustHandlePolar, ShapeAdjustHandleXY, ShapeAdjustValue, ShapeConnectionSite, ShapeFillProps, ShapeGuide, ShapeLineProps, ShapeProps, ShapeType, Slide, SlideComment, SlideLayout, SlideMasterChartProps, SlideMasterObject, SlideMasterProps, SlideNumberProps, SlideObjectType, SlideZoomProps, StandardLayout, StandardLayoutName, SummaryZoomProps, TableCell, TableCell3DProps, TableCellDiagonals, TableCellLayout, TableCellProps, TableLayoutResult, TableProps, TableRow, TableRowSlide, TableStyle, TableToSlidesDocument, TableToSlidesElement, TableToSlidesProps, TextAnchor, TextBaseProps, TextFitShrinkProps, TextGlowProps, TextMeasurement, TextProps, TextPropsOptions, TextVertType, ThemeColor, ThemeColorScheme, ThemeProps, TransitionProps, TransitionSoundProps, TransitionType, TsPptx, TsPptx as default, type TsPptxCode, TsPptxError, type TsPptxErrorOptions, UnsupportedFeatureError, type UnsupportedFeatureErrorCode, VALID_SHAPE_PRESETS, VAlign, WRITE_OUTPUT_TYPE, WriteBaseProps, WriteFileProps, WriteProps, ZIP_OUTPUT_TYPE, ZoomBaseProps, asChartType, clipPath, connectorPresetFor, coordToEmu, emuToInches, emuToPixels, emuToPoints, inchesToEmu, isChartExType, percentToEmu, pixelsToEmu, pointsToEmu, ptToHundredths, setDiagnosticHandler, textRun, textRuns };
30
+ export { ANGLE_UNITS_PER_DEGREE, AddSlideProps, AlignH, AlignV, AnimationProps, AnimationTrigger, BackgroundProps, type BevelPresetType, BorderProps, BulletType, CHART_NAME, CONNECTOR_PRESETS, CONNECTOR_PRESET_NAME, ChartAreaProps, ChartAxisTickMark, ChartDataPointStyle, ChartErrorBarOptions, ChartExBinning, ChartExGeography, ChartExStatistics, ChartLineDash, ChartMulti, ChartOpts, ChartPropsAxisCat, ChartPropsAxisSer, ChartPropsAxisVal, ChartPropsBase, ChartPropsChartBar, ChartPropsChartBoxWhisker, ChartPropsChartDoughnut, ChartPropsChartHistogram, ChartPropsChartLine, ChartPropsChartPie, ChartPropsChartRadar, ChartPropsChartRegionMap, ChartPropsChartStock, ChartPropsChartSurface, ChartPropsChartWaterfall, ChartPropsDataLabel, ChartPropsDataTable, ChartPropsFillLine, ChartPropsLegend, ChartPropsTitle, ChartSeriesOpts, ChartType, ClipShape, Color, CommentProps, ConnectorProps, ConnectorType, Coord, CustomPropertyValue, DEFAULT_PX_PER_INCH, DataOrPathProps, DataOrPathRequiredProps, type Diagnostic, type DiagnosticCode, type DiagnosticHandler, EMU_PER_INCH, EMU_PER_POINT, Emu, type ErrorCode, FIXED_PCT_PER_PERCENT, FlatSide, GeometryPoint, GradientFillProps, GradientStopProps, GroupChildProps, GroupProps, HAlign, HUNDREDTHS_PER_POINT, HalfDiscPreset, HexColor, HyperlinkActionJump, HyperlinkProps, ImageBaseProps, ImageFillProps, ImageProps, InternalError, type InternalErrorCode, InvalidOptionError, type InvalidOptionErrorCode, type LightRigDirection, type LightRigType, LineCap, LinearGradientFillProps, Margin, MasterBulletProps, MasterTextStyleLevel, MasterTextStyleProps, MeasureTextOptions, MediaError, type MediaErrorCode, MediaProps, MediaType, Model3dCameraProps, Model3dPoint, Model3dProps, NotesProps, NotesTextOptions, ObjectLockProps, ObjectNameProps, ObjectOptions, OleObjectProps, OptsChartData, OptsChartGridLine, OutputType, OverflowBoxOptions, PERCENT_SCALE, PLACEHOLDER_TYPE, POINTS_PER_INCH, PackagePart, PackageReadError, type PackageReadErrorCode, PartsProps, PatternFillProps, PatternPreset, PlaceholderProps, PlaceholderType, PositionProps, PresLayout, PresentationProps, PresetEffect, type PresetMaterialType, RadialGradientFillProps, ResolvedCommentAuthor, SCHEME_COLORS, SHAPE_NAME, STANDARD_LAYOUTS, SchemeColor, SectionProps, SectionZoomProps, ShadowProps, ShapeAdjustHandle, ShapeAdjustHandlePolar, ShapeAdjustHandleXY, ShapeAdjustValue, ShapeConnectionSite, ShapeFillProps, ShapeGuide, ShapeLineProps, ShapeProps, ShapeType, Slide, SlideComment, SlideLayout, SlideMasterChartProps, SlideMasterObject, SlideMasterProps, SlideNumberProps, SlideObjectType, SlideZoomProps, StandardLayout, StandardLayoutName, SummaryZoomProps, TableCell, TableCell3DProps, TableCellDiagonals, TableCellLayout, TableCellProps, TableLayoutResult, TableProps, TableRow, TableRowSlide, TableStyle, TableToSlidesDocument, TableToSlidesElement, TableToSlidesProps, TextAnchor, TextBaseProps, TextFitShrinkProps, TextGlowProps, TextMeasurement, TextProps, TextPropsOptions, TextVertType, ThemeColor, ThemeColorScheme, ThemeProps, TransitionProps, TransitionSoundProps, TransitionType, TsPptx, TsPptx as default, type TsPptxCode, TsPptxError, type TsPptxErrorOptions, UnsupportedFeatureError, type UnsupportedFeatureErrorCode, VALID_SHAPE_PRESETS, VAlign, WRITE_OUTPUT_TYPE, WriteBaseProps, WriteFileProps, WriteProps, ZIP_OUTPUT_TYPE, ZoomBaseProps, asChartType, clipPath, connectorPresetFor, coordToEmu, emuToInches, emuToPixels, emuToPoints, inchesToEmu, isChartExType, isChartType, percentToEmu, pixelsToEmu, pointsToEmu, ptToHundredths, setDiagnosticHandler, textRun, textRuns };
31
31
  //# sourceMappingURL=browser.d.ts.map
package/dist/browser.js CHANGED
@@ -1,9 +1,8 @@
1
- import { t as setDiagnosticHandler } from "./diagnostics-DYQC7xLV.js";
1
+ import { t as setDiagnosticHandler } from "./diagnostics-H1QzgRSw.js";
2
2
  import { a as TsPptxError, i as PackageReadError, n as InvalidOptionError, o as UnsupportedFeatureError, r as MediaError, t as InternalError } from "./errors-Bvln0H-7.js";
3
- import { _ as pointsToEmu, a as FIXED_PCT_PER_PERCENT, c as POINTS_PER_INCH, d as emuToInches, f as emuToPixels, g as pixelsToEmu, h as percentToEmu, i as EMU_PER_POINT, l as STANDARD_LAYOUTS, m as inchesToEmu, n as DEFAULT_PX_PER_INCH, o as HUNDREDTHS_PER_POINT, p as emuToPoints, r as EMU_PER_INCH, s as PERCENT_SCALE, t as ANGLE_UNITS_PER_DEGREE, u as coordToEmu, v as ptToHundredths } from "./units-C7QM1KgH.js";
4
- import { i as PresentationCore, n as textRuns, r as clipPath, t as textRun } from "./text-C4P9MNdf.js";
5
- import { $ as connectorPresetFor, B as AlignV, G as PlaceholderType, H as CONNECTOR_PRESETS, J as SlideObjectType, K as SchemeColor, Q as asChartType, U as ChartType, V as BulletType, W as OutputType, X as TextAnchor, Y as TableStyle, Z as VALID_SHAPE_PRESETS, et as isChartExType, j as IMG_SVG_PLACEHOLDER, q as ShapeType, z as AlignH } from "./units-internal-CR8s8YQa.js";
6
- import { t as genTableToSlides } from "./html-dom-DajBuobe.js";
3
+ import { $ as connectorPresetFor, B as AlignV, G as PlaceholderType, H as CONNECTOR_PRESETS, J as SlideObjectType, K as SchemeColor, Q as asChartType, U as ChartType, V as BulletType, W as OutputType, X as TextAnchor, Y as TableStyle, Z as VALID_SHAPE_PRESETS, _t as pixelsToEmu, at as EMU_PER_POINT, ct as PERCENT_SCALE, dt as coordToEmu, et as isChartExType, ft as emuToInches, gt as percentToEmu, ht as inchesToEmu, it as EMU_PER_INCH, j as IMG_SVG_PLACEHOLDER, lt as POINTS_PER_INCH, mt as emuToPoints, nt as ANGLE_UNITS_PER_DEGREE, ot as FIXED_PCT_PER_PERCENT, pt as emuToPixels, q as ShapeType, rt as DEFAULT_PX_PER_INCH, st as HUNDREDTHS_PER_POINT, tt as isChartType, ut as STANDARD_LAYOUTS, vt as pointsToEmu, yt as ptToHundredths, z as AlignH } from "./units-internal-CGf4VrXy.js";
4
+ import { i as PresentationCore, n as textRuns, r as clipPath, t as textRun } from "./text-uM-zGton.js";
5
+ import { t as genTableToSlides } from "./html-dom-CzewEdE1.js";
7
6
  //#region src/runtime/browser.ts
8
7
  function createBrowserRuntime() {
9
8
  return {
@@ -106,6 +105,6 @@ var TsPptx = class extends PresentationCore {
106
105
  }
107
106
  };
108
107
  //#endregion
109
- export { ANGLE_UNITS_PER_DEGREE, AlignH, AlignV, BulletType, CONNECTOR_PRESETS, ChartType, DEFAULT_PX_PER_INCH, EMU_PER_INCH, EMU_PER_POINT, FIXED_PCT_PER_PERCENT, HUNDREDTHS_PER_POINT, InternalError, InvalidOptionError, MediaError, OutputType, PERCENT_SCALE, POINTS_PER_INCH, PackageReadError, PlaceholderType, STANDARD_LAYOUTS, SchemeColor, ShapeType, SlideObjectType, TableStyle, TextAnchor, TsPptx, TsPptx as default, TsPptxError, UnsupportedFeatureError, VALID_SHAPE_PRESETS, asChartType, clipPath, connectorPresetFor, coordToEmu, emuToInches, emuToPixels, emuToPoints, inchesToEmu, isChartExType, percentToEmu, pixelsToEmu, pointsToEmu, ptToHundredths, setDiagnosticHandler, textRun, textRuns };
108
+ export { ANGLE_UNITS_PER_DEGREE, AlignH, AlignV, BulletType, CONNECTOR_PRESETS, ChartType, DEFAULT_PX_PER_INCH, EMU_PER_INCH, EMU_PER_POINT, FIXED_PCT_PER_PERCENT, HUNDREDTHS_PER_POINT, InternalError, InvalidOptionError, MediaError, OutputType, PERCENT_SCALE, POINTS_PER_INCH, PackageReadError, PlaceholderType, STANDARD_LAYOUTS, SchemeColor, ShapeType, SlideObjectType, TableStyle, TextAnchor, TsPptx, TsPptx as default, TsPptxError, UnsupportedFeatureError, VALID_SHAPE_PRESETS, asChartType, clipPath, connectorPresetFor, coordToEmu, emuToInches, emuToPixels, emuToPoints, inchesToEmu, isChartExType, isChartType, percentToEmu, pixelsToEmu, pointsToEmu, ptToHundredths, setDiagnosticHandler, textRun, textRuns };
110
109
 
111
110
  //# sourceMappingURL=browser.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"browser.js","names":[],"sources":["../src/runtime/browser.ts","../src/browser.ts"],"sourcesContent":["import { IMG_SVG_PLACEHOLDER } from '../constants-internal.js'\nimport { MediaError } from '../errors.js'\nimport type { SlideRelMedia } from '../types/internal.js'\nimport type { RuntimeAdapter } from './types.js'\n\nexport function createBrowserRuntime(): RuntimeAdapter {\n\treturn {\n\t\twriteFileOutputType: null,\n\t\tloadMedia,\n\t\tcreateSvgPngPreview,\n\t\twriteFile,\n\t\tloadFontData,\n\t}\n}\n\nasync function loadFontData(source: string): Promise<Uint8Array> {\n\tconst response = await fetch(source)\n\tif (!response.ok) throw new MediaError('font/fetch-failed', `Unable to load font (fetch): ${source}`)\n\treturn new Uint8Array(await response.arrayBuffer())\n}\n\nasync function loadMedia(rel: SlideRelMedia & { path: string }): Promise<string> {\n\tconst response = await fetch(rel.path)\n\tif (!response.ok) throw new MediaError('media/fetch-failed', `Unable to load image (fetch): ${rel.path}`)\n\tconst blob = await response.blob()\n\n\treturn await new Promise<string>((resolve, reject) => {\n\t\tconst reader = new FileReader()\n\t\treader.onloadend = () => resolve(reader.result as string)\n\t\treader.onerror = () =>\n\t\t\treject(new MediaError('media/decode-failed', `Unable to load image (FileReader): ${rel.path}`))\n\t\treader.readAsDataURL(blob)\n\t})\n}\n\nasync function createSvgPngPreview(rel: SlideRelMedia): Promise<string> {\n\treturn await new Promise((resolve, reject) => {\n\t\tconst image = new Image()\n\t\tconst fail = (reason?: unknown) => {\n\t\t\trel.data = IMG_SVG_PLACEHOLDER\n\t\t\treject(\n\t\t\t\tnew MediaError(\n\t\t\t\t\t'media/svg-preview-failed',\n\t\t\t\t\t`Unable to load image (image.onerror): ${rel.path}${reason ? ` - ${String(reason)}` : ''}`\n\t\t\t\t)\n\t\t\t)\n\t\t}\n\n\t\timage.onload = () => {\n\t\t\tif (image.width + image.height === 0) {\n\t\t\t\tfail('h/w=0')\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst canvas = document.createElement('CANVAS') as HTMLCanvasElement\n\t\t\tconst ctx = canvas.getContext('2d')\n\t\t\tif (!ctx) {\n\t\t\t\tfail('canvas 2d context unavailable')\n\t\t\t\treturn\n\t\t\t}\n\t\t\tcanvas.width = image.width\n\t\t\tcanvas.height = image.height\n\t\t\tctx.drawImage(image, 0, 0)\n\t\t\ttry {\n\t\t\t\trel.data = canvas.toDataURL(rel.type)\n\t\t\t\tresolve('done')\n\t\t\t} catch (ex) {\n\t\t\t\tfail(ex)\n\t\t\t}\n\t\t}\n\t\timage.onerror = () => fail()\n\t\timage.src = typeof rel.data === 'string' ? rel.data : IMG_SVG_PLACEHOLDER\n\t})\n}\n\nasync function writeFile(fileName: string, data: string | ArrayBuffer | Blob | Uint8Array): Promise<string> {\n\tconst eleLink = document.createElement('a')\n\teleLink.setAttribute('style', 'display:none;')\n\teleLink.dataset['interception'] = 'off'\n\tdocument.body.appendChild(eleLink)\n\n\tconst url = window.URL.createObjectURL(\n\t\tnew Blob([data as Blob], { type: 'application/vnd.openxmlformats-officedocument.presentationml.presentation' })\n\t)\n\teleLink.href = url\n\teleLink.download = fileName\n\teleLink.click()\n\n\tsetTimeout(() => {\n\t\twindow.URL.revokeObjectURL(url)\n\t\tdocument.body.removeChild(eleLink)\n\t}, 100)\n\n\treturn fileName\n}\n","import PresentationCore from './presentation.js'\nimport { createBrowserRuntime } from './runtime/browser.js'\nimport { genTableToSlides } from './gen/table/html-dom.js'\nimport type { TableToSlidesProps } from './types/index.js'\n\n/**\n * The browser entry, reached through the `browser` export condition — a bundler resolving the\n * bare `@shbernal/ts-pptx` specifier for the web lands here without naming this subpath.\n *\n * Same authoring API as every other entry (see `entry-surface.ts`), plus one method that only\n * makes sense with a live DOM: {@link TsPptx.tableToSlides}. `writeFile` triggers a download\n * rather than touching a filesystem.\n */\nexport class TsPptx extends PresentationCore {\n\tconstructor() {\n\t\tsuper(createBrowserRuntime())\n\t}\n\n\t/**\n\t * Reproduces a rendered HTML `<table>` as a PowerPoint table — including column widths,\n\t * style, etc. — creating one or more slides as needed. Resolves `eleId` against the global\n\t * `document`, so it exists only on the browser/standalone build; the same conversion is\n\t * available anywhere there is a DOM as the free `tableToSlides` on `ts-pptx/html`, which\n\t * also takes the element directly. The in-memory `slide.addTable(rows, opts)` path remains\n\t * the platform-agnostic way to build a table from data you already hold.\n\t * @param {string} eleId - table HTML element ID\n\t * @param {TableToSlidesProps} options - generation options\n\t */\n\ttableToSlides(eleId: string, options: TableToSlidesProps = {}): void {\n\t\t// @note `options.verbose` (a documented dev-only flag on TableToSlidesProps) is read\n\t\t// inside genTableToSlides to trace the auto-paging layout process.\n\t\tgenTableToSlides(this, eleId, options)\n\t}\n}\n\nexport { TsPptx as default }\nexport * from './entry-surface.js'\n"],"mappings":";;;;;;;AAKA,SAAgB,uBAAuC;CACtD,OAAO;EACN,qBAAqB;EACrB;EACA;EACA;EACA;CACD;AACD;AAEA,eAAe,aAAa,QAAqC;CAChE,MAAM,WAAW,MAAM,MAAM,MAAM;CACnC,IAAI,CAAC,SAAS,IAAI,MAAM,IAAI,WAAW,qBAAqB,gCAAgC,QAAQ;CACpG,OAAO,IAAI,WAAW,MAAM,SAAS,YAAY,CAAC;AACnD;AAEA,eAAe,UAAU,KAAwD;CAChF,MAAM,WAAW,MAAM,MAAM,IAAI,IAAI;CACrC,IAAI,CAAC,SAAS,IAAI,MAAM,IAAI,WAAW,sBAAsB,iCAAiC,IAAI,MAAM;CACxG,MAAM,OAAO,MAAM,SAAS,KAAK;CAEjC,OAAO,MAAM,IAAI,SAAiB,SAAS,WAAW;EACrD,MAAM,SAAS,IAAI,WAAW;EAC9B,OAAO,kBAAkB,QAAQ,OAAO,MAAgB;EACxD,OAAO,gBACN,OAAO,IAAI,WAAW,uBAAuB,sCAAsC,IAAI,MAAM,CAAC;EAC/F,OAAO,cAAc,IAAI;CAC1B,CAAC;AACF;AAEA,eAAe,oBAAoB,KAAqC;CACvE,OAAO,MAAM,IAAI,SAAS,SAAS,WAAW;EAC7C,MAAM,QAAQ,IAAI,MAAM;EACxB,MAAM,QAAQ,WAAqB;GAClC,IAAI,OAAO;GACX,OACC,IAAI,WACH,4BACA,yCAAyC,IAAI,OAAO,SAAS,MAAM,OAAO,MAAM,MAAM,IACvF,CACD;EACD;EAEA,MAAM,eAAe;GACpB,IAAI,MAAM,QAAQ,MAAM,WAAW,GAAG;IACrC,KAAK,OAAO;IACZ;GACD;GACA,MAAM,SAAS,SAAS,cAAc,QAAQ;GAC9C,MAAM,MAAM,OAAO,WAAW,IAAI;GAClC,IAAI,CAAC,KAAK;IACT,KAAK,+BAA+B;IACpC;GACD;GACA,OAAO,QAAQ,MAAM;GACrB,OAAO,SAAS,MAAM;GACtB,IAAI,UAAU,OAAO,GAAG,CAAC;GACzB,IAAI;IACH,IAAI,OAAO,OAAO,UAAU,IAAI,IAAI;IACpC,QAAQ,MAAM;GACf,SAAS,IAAI;IACZ,KAAK,EAAE;GACR;EACD;EACA,MAAM,gBAAgB,KAAK;EAC3B,MAAM,MAAM,OAAO,IAAI,SAAS,WAAW,IAAI,OAAO;CACvD,CAAC;AACF;AAEA,eAAe,UAAU,UAAkB,MAAiE;CAC3G,MAAM,UAAU,SAAS,cAAc,GAAG;CAC1C,QAAQ,aAAa,SAAS,eAAe;CAC7C,QAAQ,QAAQ,kBAAkB;CAClC,SAAS,KAAK,YAAY,OAAO;CAEjC,MAAM,MAAM,OAAO,IAAI,gBACtB,IAAI,KAAK,CAAC,IAAY,GAAG,EAAE,MAAM,4EAA4E,CAAC,CAC/G;CACA,QAAQ,OAAO;CACf,QAAQ,WAAW;CACnB,QAAQ,MAAM;CAEd,iBAAiB;EAChB,OAAO,IAAI,gBAAgB,GAAG;EAC9B,SAAS,KAAK,YAAY,OAAO;CAClC,GAAG,GAAG;CAEN,OAAO;AACR;;;;;;;;;;;AChFA,IAAa,SAAb,cAA4B,iBAAiB;CAC5C,cAAc;EACb,MAAM,qBAAqB,CAAC;CAC7B;;;;;;;;;;;CAYA,cAAc,OAAe,UAA8B,CAAC,GAAS;EAGpE,iBAAiB,MAAM,OAAO,OAAO;CACtC;AACD"}
1
+ {"version":3,"file":"browser.js","names":[],"sources":["../src/runtime/browser.ts","../src/browser.ts"],"sourcesContent":["import { IMG_SVG_PLACEHOLDER } from '../constants-internal.js'\nimport { MediaError } from '../errors.js'\nimport type { SlideRelMedia } from '../types/internal.js'\nimport type { RuntimeAdapter } from './types.js'\n\nexport function createBrowserRuntime(): RuntimeAdapter {\n\treturn {\n\t\twriteFileOutputType: null,\n\t\tloadMedia,\n\t\tcreateSvgPngPreview,\n\t\twriteFile,\n\t\tloadFontData,\n\t}\n}\n\nasync function loadFontData(source: string): Promise<Uint8Array> {\n\tconst response = await fetch(source)\n\tif (!response.ok) throw new MediaError('font/fetch-failed', `Unable to load font (fetch): ${source}`)\n\treturn new Uint8Array(await response.arrayBuffer())\n}\n\nasync function loadMedia(rel: SlideRelMedia & { path: string }): Promise<string> {\n\tconst response = await fetch(rel.path)\n\tif (!response.ok) throw new MediaError('media/fetch-failed', `Unable to load image (fetch): ${rel.path}`)\n\tconst blob = await response.blob()\n\n\treturn await new Promise<string>((resolve, reject) => {\n\t\tconst reader = new FileReader()\n\t\treader.onloadend = () => resolve(reader.result as string)\n\t\treader.onerror = () =>\n\t\t\treject(new MediaError('media/decode-failed', `Unable to load image (FileReader): ${rel.path}`))\n\t\treader.readAsDataURL(blob)\n\t})\n}\n\nasync function createSvgPngPreview(rel: SlideRelMedia): Promise<string> {\n\treturn await new Promise((resolve, reject) => {\n\t\tconst image = new Image()\n\t\tconst fail = (reason?: unknown) => {\n\t\t\trel.data = IMG_SVG_PLACEHOLDER\n\t\t\treject(\n\t\t\t\tnew MediaError(\n\t\t\t\t\t'media/svg-preview-failed',\n\t\t\t\t\t`Unable to load image (image.onerror): ${rel.path}${reason ? ` - ${String(reason)}` : ''}`\n\t\t\t\t)\n\t\t\t)\n\t\t}\n\n\t\timage.onload = () => {\n\t\t\tif (image.width + image.height === 0) {\n\t\t\t\tfail('h/w=0')\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst canvas = document.createElement('CANVAS') as HTMLCanvasElement\n\t\t\tconst ctx = canvas.getContext('2d')\n\t\t\tif (!ctx) {\n\t\t\t\tfail('canvas 2d context unavailable')\n\t\t\t\treturn\n\t\t\t}\n\t\t\tcanvas.width = image.width\n\t\t\tcanvas.height = image.height\n\t\t\tctx.drawImage(image, 0, 0)\n\t\t\ttry {\n\t\t\t\trel.data = canvas.toDataURL(rel.type)\n\t\t\t\tresolve('done')\n\t\t\t} catch (ex) {\n\t\t\t\tfail(ex)\n\t\t\t}\n\t\t}\n\t\timage.onerror = () => fail()\n\t\timage.src = typeof rel.data === 'string' ? rel.data : IMG_SVG_PLACEHOLDER\n\t})\n}\n\nasync function writeFile(fileName: string, data: string | ArrayBuffer | Blob | Uint8Array): Promise<string> {\n\tconst eleLink = document.createElement('a')\n\teleLink.setAttribute('style', 'display:none;')\n\teleLink.dataset['interception'] = 'off'\n\tdocument.body.appendChild(eleLink)\n\n\tconst url = window.URL.createObjectURL(\n\t\tnew Blob([data as Blob], { type: 'application/vnd.openxmlformats-officedocument.presentationml.presentation' })\n\t)\n\teleLink.href = url\n\teleLink.download = fileName\n\teleLink.click()\n\n\tsetTimeout(() => {\n\t\twindow.URL.revokeObjectURL(url)\n\t\tdocument.body.removeChild(eleLink)\n\t}, 100)\n\n\treturn fileName\n}\n","import PresentationCore from './presentation.js'\nimport { createBrowserRuntime } from './runtime/browser.js'\nimport { genTableToSlides } from './gen/table/html-dom.js'\nimport type { TableToSlidesProps } from './types/index.js'\n\n/**\n * The browser entry, reached through the `browser` export condition — a bundler resolving the\n * bare `@shbernal/ts-pptx` specifier for the web lands here without naming this subpath.\n *\n * Same authoring API as every other entry (see `entry-surface.ts`), plus one method that only\n * makes sense with a live DOM: {@link TsPptx.tableToSlides}. `writeFile` triggers a download\n * rather than touching a filesystem.\n */\nexport class TsPptx extends PresentationCore {\n\tconstructor() {\n\t\tsuper(createBrowserRuntime())\n\t}\n\n\t/**\n\t * Reproduces a rendered HTML `<table>` as a PowerPoint table — including column widths,\n\t * style, etc. — creating one or more slides as needed. Resolves `eleId` against the global\n\t * `document`, so it exists only on the browser/standalone build; the same conversion is\n\t * available anywhere there is a DOM as the free `tableToSlides` on `ts-pptx/html`, which\n\t * also takes the element directly. The in-memory `slide.addTable(rows, opts)` path remains\n\t * the platform-agnostic way to build a table from data you already hold.\n\t * @param {string} eleId - table HTML element ID\n\t * @param {TableToSlidesProps} options - generation options\n\t */\n\ttableToSlides(eleId: string, options: TableToSlidesProps = {}): void {\n\t\t// @note `options.verbose` (a documented dev-only flag on TableToSlidesProps) is read\n\t\t// inside genTableToSlides to trace the auto-paging layout process.\n\t\tgenTableToSlides(this, eleId, options)\n\t}\n}\n\nexport { TsPptx as default }\nexport * from './entry-surface.js'\n"],"mappings":";;;;;;AAKA,SAAgB,uBAAuC;CACtD,OAAO;EACN,qBAAqB;EACrB;EACA;EACA;EACA;CACD;AACD;AAEA,eAAe,aAAa,QAAqC;CAChE,MAAM,WAAW,MAAM,MAAM,MAAM;CACnC,IAAI,CAAC,SAAS,IAAI,MAAM,IAAI,WAAW,qBAAqB,gCAAgC,QAAQ;CACpG,OAAO,IAAI,WAAW,MAAM,SAAS,YAAY,CAAC;AACnD;AAEA,eAAe,UAAU,KAAwD;CAChF,MAAM,WAAW,MAAM,MAAM,IAAI,IAAI;CACrC,IAAI,CAAC,SAAS,IAAI,MAAM,IAAI,WAAW,sBAAsB,iCAAiC,IAAI,MAAM;CACxG,MAAM,OAAO,MAAM,SAAS,KAAK;CAEjC,OAAO,MAAM,IAAI,SAAiB,SAAS,WAAW;EACrD,MAAM,SAAS,IAAI,WAAW;EAC9B,OAAO,kBAAkB,QAAQ,OAAO,MAAgB;EACxD,OAAO,gBACN,OAAO,IAAI,WAAW,uBAAuB,sCAAsC,IAAI,MAAM,CAAC;EAC/F,OAAO,cAAc,IAAI;CAC1B,CAAC;AACF;AAEA,eAAe,oBAAoB,KAAqC;CACvE,OAAO,MAAM,IAAI,SAAS,SAAS,WAAW;EAC7C,MAAM,QAAQ,IAAI,MAAM;EACxB,MAAM,QAAQ,WAAqB;GAClC,IAAI,OAAO;GACX,OACC,IAAI,WACH,4BACA,yCAAyC,IAAI,OAAO,SAAS,MAAM,OAAO,MAAM,MAAM,IACvF,CACD;EACD;EAEA,MAAM,eAAe;GACpB,IAAI,MAAM,QAAQ,MAAM,WAAW,GAAG;IACrC,KAAK,OAAO;IACZ;GACD;GACA,MAAM,SAAS,SAAS,cAAc,QAAQ;GAC9C,MAAM,MAAM,OAAO,WAAW,IAAI;GAClC,IAAI,CAAC,KAAK;IACT,KAAK,+BAA+B;IACpC;GACD;GACA,OAAO,QAAQ,MAAM;GACrB,OAAO,SAAS,MAAM;GACtB,IAAI,UAAU,OAAO,GAAG,CAAC;GACzB,IAAI;IACH,IAAI,OAAO,OAAO,UAAU,IAAI,IAAI;IACpC,QAAQ,MAAM;GACf,SAAS,IAAI;IACZ,KAAK,EAAE;GACR;EACD;EACA,MAAM,gBAAgB,KAAK;EAC3B,MAAM,MAAM,OAAO,IAAI,SAAS,WAAW,IAAI,OAAO;CACvD,CAAC;AACF;AAEA,eAAe,UAAU,UAAkB,MAAiE;CAC3G,MAAM,UAAU,SAAS,cAAc,GAAG;CAC1C,QAAQ,aAAa,SAAS,eAAe;CAC7C,QAAQ,QAAQ,kBAAkB;CAClC,SAAS,KAAK,YAAY,OAAO;CAEjC,MAAM,MAAM,OAAO,IAAI,gBACtB,IAAI,KAAK,CAAC,IAAY,GAAG,EAAE,MAAM,4EAA4E,CAAC,CAC/G;CACA,QAAQ,OAAO;CACf,QAAQ,WAAW;CACnB,QAAQ,MAAM;CAEd,iBAAiB;EAChB,OAAO,IAAI,gBAAgB,GAAG;EAC9B,SAAS,KAAK,YAAY,OAAO;CAClC,GAAG,GAAG;CAEN,OAAO;AACR;;;;;;;;;;;AChFA,IAAa,SAAb,cAA4B,iBAAiB;CAC5C,cAAc;EACb,MAAM,qBAAqB,CAAC;CAC7B;;;;;;;;;;;CAYA,cAAc,OAAe,UAA8B,CAAC,GAAS;EAGpE,iBAAiB,MAAM,OAAO,OAAO;CACtC;AACD"}
@@ -1,8 +1,8 @@
1
- import { f as SHAPE_NAME, h as SlideObjectType, i as CHART_NAME, s as ChartType, y as WRITE_OUTPUT_TYPE } from "./enums-CoXnxiCI.js";
2
- import { C as TableCell, D as TableProps, F as MediaProps, G as BackgroundProps, I as MediaType, Mt as ChartOpts, O as TableRow, X as GeometryPoint, a as Slide, f as MasterTextStyleProps, fn as SlideComment, g as SlideNumberProps, h as SlideMasterProps, ht as HyperlinkProps, i as ObjectOptions, jt as ChartMulti, mn as TableLayoutResult, o as SlideLayout, ot as PositionProps, rt as Margin, sn as MeasureTextOptions, t as AddSlideProps, tn as OptsChartData, un as OverflowBoxOptions, vn as TextMeasurement, yn as TextProps } from "./slide-BTfn1Pyp.js";
3
- import { c as WriteFileProps, d as ThemeProps, i as PresLayout, l as WriteProps, n as PackagePart, o as SectionProps, r as PartsProps, s as WriteBaseProps, t as CustomPropertyValue } from "./pres-C-EU3SkN.js";
4
- import { a as ExtractedSlides, m as EmbeddedFontSlot } from "./presentation-types-Dj4riuDs.js";
5
- import { c as DiagnosticCode } from "./errors-BVLCFr-t.js";
1
+ import { f as SHAPE_NAME, h as SlideObjectType, i as CHART_NAME, s as ChartType, y as WRITE_OUTPUT_TYPE } from "./enums-CvRYniUA.js";
2
+ import { C as TableCell, D as TableProps, F as MediaProps, G as BackgroundProps, I as MediaType, Mt as ChartOpts, O as TableRow, X as GeometryPoint, a as Slide, f as MasterTextStyleProps, fn as SlideComment, g as SlideNumberProps, h as SlideMasterProps, ht as HyperlinkProps, i as ObjectOptions, jt as ChartMulti, mn as TableLayoutResult, o as SlideLayout, ot as PositionProps, rt as Margin, sn as MeasureTextOptions, t as AddSlideProps, tn as OptsChartData, un as OverflowBoxOptions, vn as TextMeasurement, yn as TextProps } from "./slide-DWw9UoI6.js";
3
+ import { c as WriteFileProps, d as ThemeProps, i as PresLayout, l as WriteProps, n as PackagePart, o as SectionProps, r as PartsProps, s as WriteBaseProps, t as CustomPropertyValue } from "./pres-Cb-1xDne.js";
4
+ import { a as ExtractedSlides, cn as EmbeddedFontSlot } from "./presentation-types-B50aOUFI.js";
5
+ import { c as DiagnosticCode } from "./errors-fB1KDJKQ.js";
6
6
  //#region src/types/zoom.d.ts
7
7
  /** Options shared by all three zoom kinds. */
8
8
  interface ZoomBaseProps extends PositionProps {
@@ -527,15 +527,29 @@ declare class PresentationCore {
527
527
  * Without registered metrics, `fit:'shrink'` keeps its current behavior (a bare
528
528
  * `<a:normAutofit/>` that only PowerPoint recomputes on edit). Register the same
529
529
  * face once per weight/style you use; bold/italic advances differ.
530
+ *
531
+ * **Font collections** (`.ttc`/`.otc`, how MS Gothic, Yu Gothic, SimSun, Microsoft
532
+ * YaHei and Cambria ship on Windows) hold several fonts in one file, so one has to be
533
+ * chosen. With no `font` option, `face` is used as the selector, which is usually what
534
+ * you meant; a `face` that names no font in the collection throws rather than falling
535
+ * back to the first, since measuring the wrong member is invisible downstream. Pass
536
+ * `font` when the deck-side name differs from the name inside the file, and use
537
+ * `listFontFaces` from `ts-pptx/measure` to see what a file holds.
530
538
  * @param {string} face - font family name as used in `fontFace` (e.g. 'Aptos')
531
- * @param {string | Uint8Array | ArrayBuffer} source - font file path/URL (Node/web) or raw TTF/OTF bytes
532
- * @param {object} [opts] - variant flags; advances differ per weight/style
539
+ * @param {string | Uint8Array | ArrayBuffer} source - font file path/URL (Node/web) or raw TTF/OTF/TTC bytes
540
+ * @param {object} [opts] - variant flags (advances differ per weight/style) and collection selection
541
+ * @param {boolean} [opts.bold] - these are the bold advances
542
+ * @param {boolean} [opts.italic] - these are the italic advances
543
+ * @param {number | string} [opts.font] - which font inside a collection: 0-based index, or a name
533
544
  * @example await pptx.registerFontMetrics('Aptos', '/usr/share/fonts/Aptos.ttf')
534
545
  * @example await pptx.registerFontMetrics('Aptos', aptosBoldBytes, { bold: true })
546
+ * @example await pptx.registerFontMetrics('MS PGothic', 'C:/Windows/Fonts/msgothic.ttc')
547
+ * @example await pptx.registerFontMetrics('Cambria Math', 'C:/Windows/Fonts/cambria.ttc', { font: 1 })
535
548
  */
536
549
  registerFontMetrics(face: string, source: string | Uint8Array | ArrayBuffer, opts?: {
537
550
  bold?: boolean;
538
551
  italic?: boolean;
552
+ font?: number | string;
539
553
  }): Promise<void>;
540
554
  /**
541
555
  * Embed a font face so the deck renders with it even on machines that do not
@@ -569,7 +583,7 @@ declare class PresentationCore {
569
583
  * Measure how tall text wraps at a given width, using the **same** calibrated wrap
570
584
  * model the export-time autofit bake uses — so a layout-time prediction matches the
571
585
  * value `fit:'shrink'`/`'resize'` would bake. Synchronous: register the face's metrics
572
- * first with {@link PresentationCore.registerFontMetrics} (lookup is sync).
586
+ * first with {@link TsPptx.registerFontMetrics} (lookup is sync).
573
587
  *
574
588
  * Lets a consumer size its own geometry before export — grow a card to fit its text,
575
589
  * reflow a grid, or detect overflow at layout time. Heights err **tall** (conservative),
@@ -598,8 +612,8 @@ declare class PresentationCore {
598
612
  * cells. Column widths (cell `x`/`w`) are exact, derived from the same logic the
599
613
  * writer uses. Row heights (`y`/`h`) are exact when pinned by `rowH` (array or
600
614
  * scalar) or table `h`; an auto-height row is estimated with the same conservative
601
- * (tall) text model as {@link PresentationCore.measureText} and flagged `heightExact:false`
602
- * (register the cell font via {@link PresentationCore.registerFontMetrics} for an exact
615
+ * (tall) text model as {@link TsPptx.measureText} and flagged `heightExact:false`
616
+ * (register the cell font via {@link TsPptx.registerFontMetrics} for an exact
603
617
  * estimate). Geometry is for a single, un-paginated table — `autoPage` paging is
604
618
  * not modeled.
605
619
  * @param {TableRow[]} rows - the same `rows` passed to `slide.addTable`
@@ -612,11 +626,14 @@ declare class PresentationCore {
612
626
  */
613
627
  tableLayout(rows: TableRow[], opts: TableProps): TableLayoutResult;
614
628
  /**
615
- * Export the current Presentation to stream
629
+ * Export the current presentation as portable ZIP bytes. Unlike the former
630
+ * `stream()` method, this does not imply incremental output or convert the
631
+ * archive to a Node `Buffer`: package assembly is synchronous and the returned
632
+ * `Uint8Array` works unchanged in Node, browsers, and workers.
616
633
  * @param {WriteBaseProps} props - output properties
617
- * @returns {Promise<string | ArrayBuffer | Blob | Uint8Array>} file stream
634
+ * @returns {Promise<Uint8Array>} complete `.pptx` archive bytes
618
635
  */
619
- stream(props?: WriteBaseProps): Promise<string | ArrayBuffer | Blob | Uint8Array>;
636
+ toBytes(props?: WriteBaseProps): Promise<Uint8Array>;
620
637
  /**
621
638
  * Export the current Presentation as ZIP content with the selected type
622
639
  * @param {WriteProps} props output properties
@@ -762,4 +779,4 @@ type DiagnosticHandler = (diagnostic: Diagnostic) => void;
762
779
  declare function setDiagnosticHandler(next: DiagnosticHandler | null): void;
763
780
  //#endregion
764
781
  export { SectionZoomProps as A, emuToPixels as C, pixelsToEmu as D, percentToEmu as E, SummaryZoomProps as M, ZoomBaseProps as N, pointsToEmu as O, emuToInches as S, inchesToEmu as T, POINTS_PER_INCH as _, FlatSide as a, StandardLayoutName as b, PresentationCore as c, EMU_PER_INCH as d, EMU_PER_POINT as f, PERCENT_SCALE as g, HUNDREDTHS_PER_POINT as h, ClipShape as i, SlideZoomProps as j, ptToHundredths as k, ANGLE_UNITS_PER_DEGREE as l, FIXED_PCT_PER_PERCENT as m, DiagnosticHandler as n, HalfDiscPreset as o, Emu as p, setDiagnosticHandler as r, clipPath as s, Diagnostic as t, DEFAULT_PX_PER_INCH as u, STANDARD_LAYOUTS as v, emuToPoints as w, coordToEmu as x, StandardLayout as y };
765
- //# sourceMappingURL=diagnostics-Chjz_4_Q.d.ts.map
782
+ //# sourceMappingURL=diagnostics-B2yWpcjB.d.ts.map