@ganttloom/gantt-export 0.2.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.
- package/LICENSE +21 -0
- package/README.md +109 -0
- package/dist/chunk-JB7HLLAI.js +113 -0
- package/dist/chunk-JB7HLLAI.js.map +1 -0
- package/dist/chunk-PXURNZ6Y.js +272 -0
- package/dist/chunk-PXURNZ6Y.js.map +1 -0
- package/dist/chunk-QPE3ABUG.js +229 -0
- package/dist/chunk-QPE3ABUG.js.map +1 -0
- package/dist/chunk-TYNGUB4V.js +434 -0
- package/dist/chunk-TYNGUB4V.js.map +1 -0
- package/dist/chunk-X5RULSWH.js +125 -0
- package/dist/chunk-X5RULSWH.js.map +1 -0
- package/dist/index.cjs +1167 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +5 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/paginate-Z2RycLzz.d.cts +73 -0
- package/dist/paginate-Z2RycLzz.d.ts +73 -0
- package/dist/pdf.cjs +671 -0
- package/dist/pdf.cjs.map +1 -0
- package/dist/pdf.d.cts +13 -0
- package/dist/pdf.d.ts +13 -0
- package/dist/pdf.js +11 -0
- package/dist/pdf.js.map +1 -0
- package/dist/pptx.cjs +827 -0
- package/dist/pptx.cjs.map +1 -0
- package/dist/pptx.d.cts +15 -0
- package/dist/pptx.d.ts +15 -0
- package/dist/pptx.js +12 -0
- package/dist/pptx.js.map +1 -0
- package/dist/xlsx.cjs +256 -0
- package/dist/xlsx.cjs.map +1 -0
- package/dist/xlsx.d.cts +22 -0
- package/dist/xlsx.d.ts +22 -0
- package/dist/xlsx.js +8 -0
- package/dist/xlsx.js.map +1 -0
- package/package.json +69 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Santhoshkumar Hariharan
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# @ganttloom/gantt-export
|
|
2
|
+
|
|
3
|
+
Export a [`@ganttloom/gantt-core`](../gantt-core) chart to native PDF, PPTX,
|
|
4
|
+
and XLSX files — generated from scratch (a hand-rolled PDF object writer, and
|
|
5
|
+
a hand-rolled ZIP + OOXML writer shared by the PPTX and XLSX exporters). No
|
|
6
|
+
external PDF/OOXML/ZIP library.
|
|
7
|
+
|
|
8
|
+
## Install
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
npm install @ganttloom/gantt-export
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## Usage
|
|
15
|
+
|
|
16
|
+
Both exporters take a `GanttRenderModel` (from `chart.getRenderModel()`) and
|
|
17
|
+
the current `tasks` array, and return a `Uint8Array` you write to a file or
|
|
18
|
+
turn into a downloadable `Blob`:
|
|
19
|
+
|
|
20
|
+
```ts
|
|
21
|
+
import { renderToPDF, renderToPPTX } from "@ganttloom/gantt-export";
|
|
22
|
+
|
|
23
|
+
const model = chart.getRenderModel();
|
|
24
|
+
const tasks = chart.getTasks();
|
|
25
|
+
|
|
26
|
+
const pdfBytes = renderToPDF(model, tasks, {
|
|
27
|
+
pageSize: { name: "A4", orientation: "landscape" },
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
const pptxBytes = renderToPPTX(model, tasks, {});
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
In the browser:
|
|
34
|
+
|
|
35
|
+
```ts
|
|
36
|
+
function download(bytes: Uint8Array, filename: string, mime: string) {
|
|
37
|
+
const blob = new Blob([bytes as BlobPart], { type: mime });
|
|
38
|
+
const url = URL.createObjectURL(blob);
|
|
39
|
+
const a = document.createElement("a");
|
|
40
|
+
a.href = url;
|
|
41
|
+
a.download = filename;
|
|
42
|
+
a.click();
|
|
43
|
+
URL.revokeObjectURL(url);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
download(pdfBytes, "gantt.pdf", "application/pdf");
|
|
47
|
+
download(pptxBytes, "gantt.pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation");
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
In Node, write directly: `fs.writeFileSync("gantt.pdf", pdfBytes)`.
|
|
51
|
+
|
|
52
|
+
## Pagination
|
|
53
|
+
|
|
54
|
+
A chart can be far taller (many rows) and wider (long date range) than one
|
|
55
|
+
printed page/slide, so both exporters tile the render model into a grid of
|
|
56
|
+
pages via shared `computePagination` logic: the grid panel (task list
|
|
57
|
+
columns) repeats on every page, and the timeline is sliced into
|
|
58
|
+
rows-bands/columns-bands so nothing is dropped or duplicated.
|
|
59
|
+
|
|
60
|
+
`PdfExportOptions` / `PptxExportOptions` are both just `PaginationOptions`:
|
|
61
|
+
|
|
62
|
+
| Option | Default | Notes |
|
|
63
|
+
|---|---|---|
|
|
64
|
+
| `pageSize.name` | `"A4"` | `"A4" \| "Letter" \| "A3"` |
|
|
65
|
+
| `pageSize.orientation` | `"landscape"` | `"portrait" \| "landscape"` |
|
|
66
|
+
| `pageSize.custom` | — | `{ widthPt, heightPt }`, overrides `name`/`orientation` |
|
|
67
|
+
| `margins` | 36pt all sides | `Partial<{ top, right, bottom, left }>`, in points |
|
|
68
|
+
| `scale` | `0.75` | px → pt scale factor (96 CSS px/in → 72pt/in) |
|
|
69
|
+
| `gridPanelWidthPx` | sum of column widths | override the auto-computed grid panel width |
|
|
70
|
+
|
|
71
|
+
Call `computePagination(model, options)` yourself if you want the page
|
|
72
|
+
layout (page count, row/column bands) before generating the file — e.g. to
|
|
73
|
+
show "this will export as 3 pages" in your UI.
|
|
74
|
+
|
|
75
|
+
## Excel (.xlsx) export
|
|
76
|
+
|
|
77
|
+
Unlike `renderToPDF`/`renderToPPTX`, this exports the plain **task data**
|
|
78
|
+
(not the rendered chart geometry — a spreadsheet has no use for bar/link
|
|
79
|
+
coordinates), so it takes `tasks` directly rather than a render model:
|
|
80
|
+
|
|
81
|
+
```ts
|
|
82
|
+
import { renderToXLSX } from "@ganttloom/gantt-export";
|
|
83
|
+
|
|
84
|
+
const bytes = renderToXLSX(tasks); // default columns: Name, Start, End, Progress %
|
|
85
|
+
|
|
86
|
+
// Or supply your own columns (same accessor pattern as the grid panel):
|
|
87
|
+
const bytes2 = renderToXLSX(tasks, {
|
|
88
|
+
sheetName: "Q1 Plan",
|
|
89
|
+
columns: [
|
|
90
|
+
{ id: "name", title: "Task" },
|
|
91
|
+
{ id: "assignee", title: "Owner", accessor: (t) => t.assignees?.[0]?.name ?? "" },
|
|
92
|
+
],
|
|
93
|
+
});
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
Dates are written as `"YYYY-MM-DD"` text, not Excel's serial date numbers —
|
|
97
|
+
a deliberate simplification to avoid needing number-format/date-system
|
|
98
|
+
bookkeeping in a from-scratch writer.
|
|
99
|
+
|
|
100
|
+
## Scoped entry points
|
|
101
|
+
|
|
102
|
+
If you only need one format, import it directly to avoid pulling in the
|
|
103
|
+
others' code:
|
|
104
|
+
|
|
105
|
+
```ts
|
|
106
|
+
import { renderToPDF } from "@ganttloom/gantt-export/pdf";
|
|
107
|
+
import { renderToPPTX } from "@ganttloom/gantt-export/pptx";
|
|
108
|
+
import { renderToXLSX } from "@ganttloom/gantt-export/xlsx";
|
|
109
|
+
```
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
// src/zip.ts
|
|
2
|
+
var encoder = new TextEncoder();
|
|
3
|
+
var CRC_TABLE = (() => {
|
|
4
|
+
const table = new Uint32Array(256);
|
|
5
|
+
for (let n = 0; n < 256; n++) {
|
|
6
|
+
let c = n;
|
|
7
|
+
for (let k = 0; k < 8; k++) {
|
|
8
|
+
c = c & 1 ? (3988292384 ^ c >>> 1) >>> 0 : c >>> 1;
|
|
9
|
+
}
|
|
10
|
+
table[n] = c >>> 0;
|
|
11
|
+
}
|
|
12
|
+
return table;
|
|
13
|
+
})();
|
|
14
|
+
function crc32(data) {
|
|
15
|
+
let crc = 4294967295;
|
|
16
|
+
for (let i = 0; i < data.length; i++) {
|
|
17
|
+
crc = (CRC_TABLE[(crc ^ data[i]) & 255] ^ crc >>> 8) >>> 0;
|
|
18
|
+
}
|
|
19
|
+
return (crc ^ 4294967295) >>> 0;
|
|
20
|
+
}
|
|
21
|
+
var ByteWriter = class {
|
|
22
|
+
constructor() {
|
|
23
|
+
this.chunks = [];
|
|
24
|
+
this.len = 0;
|
|
25
|
+
}
|
|
26
|
+
get length() {
|
|
27
|
+
return this.len;
|
|
28
|
+
}
|
|
29
|
+
push(bytes) {
|
|
30
|
+
this.chunks.push(bytes);
|
|
31
|
+
this.len += bytes.length;
|
|
32
|
+
}
|
|
33
|
+
pushU16(v) {
|
|
34
|
+
this.push(new Uint8Array([v & 255, v >>> 8 & 255]));
|
|
35
|
+
}
|
|
36
|
+
pushU32(v) {
|
|
37
|
+
this.push(new Uint8Array([v & 255, v >>> 8 & 255, v >>> 16 & 255, v >>> 24 & 255]));
|
|
38
|
+
}
|
|
39
|
+
pushStr(s) {
|
|
40
|
+
this.push(encoder.encode(s));
|
|
41
|
+
}
|
|
42
|
+
toUint8Array() {
|
|
43
|
+
const out = new Uint8Array(this.len);
|
|
44
|
+
let o = 0;
|
|
45
|
+
for (const c of this.chunks) {
|
|
46
|
+
out.set(c, o);
|
|
47
|
+
o += c.length;
|
|
48
|
+
}
|
|
49
|
+
return out;
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
var DOS_TIME = 0;
|
|
53
|
+
var DOS_DATE = 1980 - 1980 << 9;
|
|
54
|
+
function buildZip(entries) {
|
|
55
|
+
const w = new ByteWriter();
|
|
56
|
+
const central = [];
|
|
57
|
+
for (const entry of entries) {
|
|
58
|
+
const nameBytes = encoder.encode(entry.name);
|
|
59
|
+
const crc = crc32(entry.data);
|
|
60
|
+
const offset = w.length;
|
|
61
|
+
w.pushU32(67324752);
|
|
62
|
+
w.pushU16(20);
|
|
63
|
+
w.pushU16(0);
|
|
64
|
+
w.pushU16(0);
|
|
65
|
+
w.pushU16(DOS_TIME);
|
|
66
|
+
w.pushU16(DOS_DATE);
|
|
67
|
+
w.pushU32(crc);
|
|
68
|
+
w.pushU32(entry.data.length);
|
|
69
|
+
w.pushU32(entry.data.length);
|
|
70
|
+
w.pushU16(nameBytes.length);
|
|
71
|
+
w.pushU16(0);
|
|
72
|
+
w.push(nameBytes);
|
|
73
|
+
w.push(entry.data);
|
|
74
|
+
central.push({ offset, entry, crc });
|
|
75
|
+
}
|
|
76
|
+
const centralStart = w.length;
|
|
77
|
+
for (const { offset, entry, crc } of central) {
|
|
78
|
+
const nameBytes = encoder.encode(entry.name);
|
|
79
|
+
w.pushU32(33639248);
|
|
80
|
+
w.pushU16(20);
|
|
81
|
+
w.pushU16(20);
|
|
82
|
+
w.pushU16(0);
|
|
83
|
+
w.pushU16(0);
|
|
84
|
+
w.pushU16(DOS_TIME);
|
|
85
|
+
w.pushU16(DOS_DATE);
|
|
86
|
+
w.pushU32(crc);
|
|
87
|
+
w.pushU32(entry.data.length);
|
|
88
|
+
w.pushU32(entry.data.length);
|
|
89
|
+
w.pushU16(nameBytes.length);
|
|
90
|
+
w.pushU16(0);
|
|
91
|
+
w.pushU16(0);
|
|
92
|
+
w.pushU16(0);
|
|
93
|
+
w.pushU16(0);
|
|
94
|
+
w.pushU32(0);
|
|
95
|
+
w.pushU32(offset);
|
|
96
|
+
w.push(nameBytes);
|
|
97
|
+
}
|
|
98
|
+
const centralSize = w.length - centralStart;
|
|
99
|
+
w.pushU32(101010256);
|
|
100
|
+
w.pushU16(0);
|
|
101
|
+
w.pushU16(0);
|
|
102
|
+
w.pushU16(central.length);
|
|
103
|
+
w.pushU16(central.length);
|
|
104
|
+
w.pushU32(centralSize);
|
|
105
|
+
w.pushU32(centralStart);
|
|
106
|
+
w.pushU16(0);
|
|
107
|
+
return w.toUint8Array();
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export {
|
|
111
|
+
buildZip
|
|
112
|
+
};
|
|
113
|
+
//# sourceMappingURL=chunk-JB7HLLAI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/zip.ts"],"sourcesContent":["/**\n * Minimal from-scratch ZIP writer (no external library).\n *\n * Deliberate simplification: all entries are written STORED (compression\n * method 0, i.e. uncompressed) rather than DEFLATE-compressed. Implementing\n * a correct DEFLATE compressor from scratch is a large undertaking for a\n * low payoff here — PPTX consumers (PowerPoint, Google Slides, LibreOffice\n * Impress) all accept uncompressed/stored zip entries without complaint.\n * The only cost is a somewhat larger file, which is an acceptable trade-off\n * for a dependency-free implementation.\n */\n\nconst encoder = new TextEncoder();\n\n// Standard reflected CRC-32 (polynomial 0xEDB88320), table-based.\nconst CRC_TABLE = (() => {\n const table = new Uint32Array(256);\n for (let n = 0; n < 256; n++) {\n let c = n;\n for (let k = 0; k < 8; k++) {\n c = c & 1 ? (0xedb88320 ^ (c >>> 1)) >>> 0 : c >>> 1;\n }\n table[n] = c >>> 0;\n }\n return table;\n})();\n\nexport function crc32(data: Uint8Array): number {\n let crc = 0xffffffff;\n for (let i = 0; i < data.length; i++) {\n crc = (CRC_TABLE[(crc ^ data[i]!) & 0xff]! ^ (crc >>> 8)) >>> 0;\n }\n return (crc ^ 0xffffffff) >>> 0;\n}\n\nexport interface ZipEntryInput {\n name: string;\n data: Uint8Array;\n}\n\nclass ByteWriter {\n private chunks: Uint8Array[] = [];\n private len = 0;\n get length(): number {\n return this.len;\n }\n push(bytes: Uint8Array): void {\n this.chunks.push(bytes);\n this.len += bytes.length;\n }\n pushU16(v: number): void {\n this.push(new Uint8Array([v & 0xff, (v >>> 8) & 0xff]));\n }\n pushU32(v: number): void {\n this.push(new Uint8Array([v & 0xff, (v >>> 8) & 0xff, (v >>> 16) & 0xff, (v >>> 24) & 0xff]));\n }\n pushStr(s: string): void {\n this.push(encoder.encode(s));\n }\n toUint8Array(): Uint8Array {\n const out = new Uint8Array(this.len);\n let o = 0;\n for (const c of this.chunks) {\n out.set(c, o);\n o += c.length;\n }\n return out;\n }\n}\n\nconst DOS_TIME = 0; // 00:00:00\nconst DOS_DATE = (1980 - 1980) << 9; // 1980-01-01, the ZIP epoch\n\nexport function buildZip(entries: ZipEntryInput[]): Uint8Array {\n const w = new ByteWriter();\n const central: { offset: number; entry: ZipEntryInput; crc: number }[] = [];\n\n for (const entry of entries) {\n const nameBytes = encoder.encode(entry.name);\n const crc = crc32(entry.data);\n const offset = w.length;\n\n w.pushU32(0x04034b50); // local file header signature\n w.pushU16(20); // version needed to extract\n w.pushU16(0); // general purpose bit flag\n w.pushU16(0); // compression method: 0 = stored\n w.pushU16(DOS_TIME);\n w.pushU16(DOS_DATE);\n w.pushU32(crc);\n w.pushU32(entry.data.length); // compressed size == uncompressed size (stored)\n w.pushU32(entry.data.length);\n w.pushU16(nameBytes.length);\n w.pushU16(0); // extra field length\n w.push(nameBytes);\n w.push(entry.data);\n\n central.push({ offset, entry, crc });\n }\n\n const centralStart = w.length;\n for (const { offset, entry, crc } of central) {\n const nameBytes = encoder.encode(entry.name);\n w.pushU32(0x02014b50); // central directory file header signature\n w.pushU16(20); // version made by\n w.pushU16(20); // version needed to extract\n w.pushU16(0); // general purpose bit flag\n w.pushU16(0); // compression method: stored\n w.pushU16(DOS_TIME);\n w.pushU16(DOS_DATE);\n w.pushU32(crc);\n w.pushU32(entry.data.length);\n w.pushU32(entry.data.length);\n w.pushU16(nameBytes.length);\n w.pushU16(0); // extra field length\n w.pushU16(0); // file comment length\n w.pushU16(0); // disk number start\n w.pushU16(0); // internal file attributes\n w.pushU32(0); // external file attributes\n w.pushU32(offset); // relative offset of local header\n w.push(nameBytes);\n }\n const centralSize = w.length - centralStart;\n\n // end of central directory record\n w.pushU32(0x06054b50);\n w.pushU16(0); // disk number\n w.pushU16(0); // disk with central directory\n w.pushU16(central.length); // entries on this disk\n w.pushU16(central.length); // total entries\n w.pushU32(centralSize);\n w.pushU32(centralStart);\n w.pushU16(0); // comment length\n\n return w.toUint8Array();\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
import {
|
|
2
|
+
buildPageContent,
|
|
3
|
+
computePagination,
|
|
4
|
+
toHexRRGGBB
|
|
5
|
+
} from "./chunk-TYNGUB4V.js";
|
|
6
|
+
import {
|
|
7
|
+
buildZip
|
|
8
|
+
} from "./chunk-JB7HLLAI.js";
|
|
9
|
+
|
|
10
|
+
// src/pptx/xml.ts
|
|
11
|
+
function xmlEscape(input) {
|
|
12
|
+
return input.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// src/pptx/shapes.ts
|
|
16
|
+
var EMU_PER_PT = 12700;
|
|
17
|
+
var ptToEmu = (pt) => Math.round(pt * EMU_PER_PT);
|
|
18
|
+
function alignAttr(align) {
|
|
19
|
+
if (align === "center") return ' algn="ctr"';
|
|
20
|
+
if (align === "right") return ' algn="r"';
|
|
21
|
+
return "";
|
|
22
|
+
}
|
|
23
|
+
function rectShape(id, cmd) {
|
|
24
|
+
const x = ptToEmu(cmd.x);
|
|
25
|
+
const y = ptToEmu(cmd.y);
|
|
26
|
+
const cx = Math.max(ptToEmu(cmd.w), 1);
|
|
27
|
+
const cy = Math.max(ptToEmu(cmd.h), 1);
|
|
28
|
+
const fill = cmd.fill ? `<a:solidFill><a:srgbClr val="${toHexRRGGBB(cmd.fill)}"/></a:solidFill>` : `<a:noFill/>`;
|
|
29
|
+
const line = cmd.stroke ? `<a:ln w="3175"><a:solidFill><a:srgbClr val="${toHexRRGGBB(cmd.stroke)}"/></a:solidFill></a:ln>` : `<a:ln><a:noFill/></a:ln>`;
|
|
30
|
+
return `<p:sp><p:nvSpPr><p:cNvPr id="${id}" name="Rect${id}"/><p:cNvSpPr/><p:nvPr/></p:nvSpPr><p:spPr><a:xfrm><a:off x="${x}" y="${y}"/><a:ext cx="${cx}" cy="${cy}"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom>${fill}${line}</p:spPr></p:sp>`;
|
|
31
|
+
}
|
|
32
|
+
function diamondShape(id, cmd) {
|
|
33
|
+
const x = ptToEmu(cmd.cx - cmd.r);
|
|
34
|
+
const y = ptToEmu(cmd.cy - cmd.r);
|
|
35
|
+
const size = Math.max(ptToEmu(cmd.r * 2), 1);
|
|
36
|
+
const fill = cmd.fill ? `<a:solidFill><a:srgbClr val="${toHexRRGGBB(cmd.fill)}"/></a:solidFill>` : `<a:noFill/>`;
|
|
37
|
+
const line = cmd.stroke ? `<a:ln w="3175"><a:solidFill><a:srgbClr val="${toHexRRGGBB(cmd.stroke)}"/></a:solidFill></a:ln>` : `<a:ln><a:noFill/></a:ln>`;
|
|
38
|
+
return `<p:sp><p:nvSpPr><p:cNvPr id="${id}" name="Milestone${id}"/><p:cNvSpPr/><p:nvPr/></p:nvSpPr><p:spPr><a:xfrm><a:off x="${x}" y="${y}"/><a:ext cx="${size}" cy="${size}"/></a:xfrm><a:prstGeom prst="diamond"><a:avLst/></a:prstGeom>${fill}${line}</p:spPr></p:sp>`;
|
|
39
|
+
}
|
|
40
|
+
function textShape(id, cmd) {
|
|
41
|
+
const x = ptToEmu(cmd.x);
|
|
42
|
+
const y = ptToEmu(Math.max(cmd.y - 2, 0));
|
|
43
|
+
const cx = Math.max(ptToEmu(cmd.w ?? 300), 1);
|
|
44
|
+
const cy = Math.max(ptToEmu(cmd.size * 1.6), 1);
|
|
45
|
+
const sizeHundredths = Math.round(cmd.size * 100);
|
|
46
|
+
const color = toHexRRGGBB(cmd.color);
|
|
47
|
+
const bold = cmd.bold ? ' b="1"' : "";
|
|
48
|
+
return `<p:sp><p:nvSpPr><p:cNvPr id="${id}" name="Text${id}"/><p:cNvSpPr txBox="1"/><p:nvPr/></p:nvSpPr><p:spPr><a:xfrm><a:off x="${x}" y="${y}"/><a:ext cx="${cx}" cy="${cy}"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom><a:noFill/></p:spPr><p:txBody><a:bodyPr wrap="none" lIns="0" tIns="0" rIns="0" bIns="0" anchor="t"/><a:lstStyle/><a:p><a:pPr${alignAttr(cmd.align)}/><a:r><a:rPr lang="en-US" sz="${sizeHundredths}"${bold} dirty="0"><a:solidFill><a:srgbClr val="${color}"/></a:solidFill></a:rPr><a:t>${xmlEscape(cmd.text)}</a:t></a:r></a:p></p:txBody></p:sp>`;
|
|
49
|
+
}
|
|
50
|
+
function lineShape(id, cmd) {
|
|
51
|
+
if (cmd.points.length < 2) return null;
|
|
52
|
+
const xs = cmd.points.map((p) => ptToEmu(p.x));
|
|
53
|
+
const ys = cmd.points.map((p) => ptToEmu(p.y));
|
|
54
|
+
const minX = Math.min(...xs);
|
|
55
|
+
const minY = Math.min(...ys);
|
|
56
|
+
const w = Math.max(Math.max(...xs) - minX, 1);
|
|
57
|
+
const h = Math.max(Math.max(...ys) - minY, 1);
|
|
58
|
+
const pathPts = cmd.points.map((p, i) => {
|
|
59
|
+
const px = ptToEmu(p.x) - minX;
|
|
60
|
+
const py = ptToEmu(p.y) - minY;
|
|
61
|
+
return i === 0 ? `<a:moveTo><a:pt x="${px}" y="${py}"/></a:moveTo>` : `<a:lnTo><a:pt x="${px}" y="${py}"/></a:lnTo>`;
|
|
62
|
+
}).join("");
|
|
63
|
+
const color = toHexRRGGBB(cmd.stroke);
|
|
64
|
+
return `<p:sp><p:nvSpPr><p:cNvPr id="${id}" name="Link${id}"/><p:cNvSpPr/><p:nvPr/></p:nvSpPr><p:spPr><a:xfrm><a:off x="${minX}" y="${minY}"/><a:ext cx="${w}" cy="${h}"/></a:xfrm><a:custGeom><a:avLst/><a:gdLst/><a:ahLst/><a:cxnLst/><a:rect l="0" t="0" r="0" b="0"/><a:pathLst><a:path w="${w}" h="${h}">${pathPts}</a:path></a:pathLst></a:custGeom><a:noFill/><a:ln w="9525"><a:solidFill><a:srgbClr val="${color}"/></a:solidFill></a:ln></p:spPr></p:sp>`;
|
|
65
|
+
}
|
|
66
|
+
function buildSlideShapesXml(commands) {
|
|
67
|
+
let id = 2;
|
|
68
|
+
const shapes = [];
|
|
69
|
+
for (const cmd of commands) {
|
|
70
|
+
if (cmd.kind === "rect") shapes.push(rectShape(id++, cmd));
|
|
71
|
+
else if (cmd.kind === "diamond") shapes.push(diamondShape(id++, cmd));
|
|
72
|
+
else if (cmd.kind === "text") shapes.push(textShape(id++, cmd));
|
|
73
|
+
else if (cmd.kind === "line") {
|
|
74
|
+
const s = lineShape(id++, cmd);
|
|
75
|
+
if (s) shapes.push(s);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return shapes.join("");
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// src/pptx/render.ts
|
|
82
|
+
function buildSlideXml(commands) {
|
|
83
|
+
const shapesXml = buildSlideShapesXml(commands);
|
|
84
|
+
return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
85
|
+
<p:sld xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main">
|
|
86
|
+
<p:cSld>
|
|
87
|
+
<p:spTree>
|
|
88
|
+
<p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr>
|
|
89
|
+
<p:grpSpPr/>
|
|
90
|
+
${shapesXml}
|
|
91
|
+
</p:spTree>
|
|
92
|
+
</p:cSld>
|
|
93
|
+
<p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr>
|
|
94
|
+
</p:sld>`;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// src/pptx/parts.ts
|
|
98
|
+
function contentTypesXml(slideCount) {
|
|
99
|
+
const slideOverrides = Array.from(
|
|
100
|
+
{ length: slideCount },
|
|
101
|
+
(_, i) => `<Override PartName="/ppt/slides/slide${i + 1}.xml" ContentType="application/vnd.openxmlformats-officedocument.presentationml.slide+xml"/>`
|
|
102
|
+
).join("");
|
|
103
|
+
return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
104
|
+
<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
|
|
105
|
+
<Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/>
|
|
106
|
+
<Default Extension="xml" ContentType="application/xml"/>
|
|
107
|
+
<Override PartName="/ppt/presentation.xml" ContentType="application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml"/>
|
|
108
|
+
<Override PartName="/ppt/slideMasters/slideMaster1.xml" ContentType="application/vnd.openxmlformats-officedocument.presentationml.slideMaster+xml"/>
|
|
109
|
+
<Override PartName="/ppt/slideLayouts/slideLayout1.xml" ContentType="application/vnd.openxmlformats-officedocument.presentationml.slideLayout+xml"/>
|
|
110
|
+
<Override PartName="/ppt/theme/theme1.xml" ContentType="application/vnd.openxmlformats-officedocument.theme+xml"/>
|
|
111
|
+
${slideOverrides}
|
|
112
|
+
</Types>`;
|
|
113
|
+
}
|
|
114
|
+
function rootRelsXml() {
|
|
115
|
+
return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
116
|
+
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
|
|
117
|
+
<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="ppt/presentation.xml"/>
|
|
118
|
+
</Relationships>`;
|
|
119
|
+
}
|
|
120
|
+
function presentationXml(slideCount, widthEmu, heightEmu) {
|
|
121
|
+
const sldIds = Array.from(
|
|
122
|
+
{ length: slideCount },
|
|
123
|
+
(_, i) => `<p:sldId id="${256 + i}" r:id="rId${i + 2}"/>`
|
|
124
|
+
).join("");
|
|
125
|
+
return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
126
|
+
<p:presentation xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main">
|
|
127
|
+
<p:sldMasterIdLst><p:sldMasterId id="2147483648" r:id="rId1"/></p:sldMasterIdLst>
|
|
128
|
+
<p:sldIdLst>${sldIds}</p:sldIdLst>
|
|
129
|
+
<p:sldSz cx="${Math.round(widthEmu)}" cy="${Math.round(heightEmu)}"/>
|
|
130
|
+
<p:notesSz cx="${Math.round(heightEmu)}" cy="${Math.round(widthEmu)}"/>
|
|
131
|
+
</p:presentation>`;
|
|
132
|
+
}
|
|
133
|
+
function presentationRelsXml(slideCount) {
|
|
134
|
+
const slideRels = Array.from(
|
|
135
|
+
{ length: slideCount },
|
|
136
|
+
(_, i) => `<Relationship Id="rId${i + 2}" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide" Target="slides/slide${i + 1}.xml"/>`
|
|
137
|
+
).join("");
|
|
138
|
+
return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
139
|
+
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
|
|
140
|
+
<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideMaster" Target="slideMasters/slideMaster1.xml"/>
|
|
141
|
+
${slideRels}
|
|
142
|
+
</Relationships>`;
|
|
143
|
+
}
|
|
144
|
+
function slideMasterXml() {
|
|
145
|
+
return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
146
|
+
<p:sldMaster xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main">
|
|
147
|
+
<p:cSld>
|
|
148
|
+
<p:bg><p:bgRef idx="1001"><a:schemeClr val="bg1"/></p:bgRef></p:bg>
|
|
149
|
+
<p:spTree>
|
|
150
|
+
<p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr>
|
|
151
|
+
<p:grpSpPr/>
|
|
152
|
+
</p:spTree>
|
|
153
|
+
</p:cSld>
|
|
154
|
+
<p:clrMap bg1="lt1" tx1="dk1" bg2="lt2" tx2="dk2" accent1="accent1" accent2="accent2" accent3="accent3" accent4="accent4" accent5="accent5" accent6="accent6" hlink="hlink" folHlink="folHlink"/>
|
|
155
|
+
<p:sldLayoutIdLst><p:sldLayoutId id="2147483649" r:id="rId1"/></p:sldLayoutIdLst>
|
|
156
|
+
</p:sldMaster>`;
|
|
157
|
+
}
|
|
158
|
+
function slideMasterRelsXml() {
|
|
159
|
+
return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
160
|
+
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
|
|
161
|
+
<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout" Target="../slideLayouts/slideLayout1.xml"/>
|
|
162
|
+
<Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" Target="../theme/theme1.xml"/>
|
|
163
|
+
</Relationships>`;
|
|
164
|
+
}
|
|
165
|
+
function slideLayoutXml() {
|
|
166
|
+
return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
167
|
+
<p:sldLayout xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main" type="blank" preserve="1">
|
|
168
|
+
<p:cSld name="Blank">
|
|
169
|
+
<p:spTree>
|
|
170
|
+
<p:nvGrpSpPr><p:cNvPr id="1" name=""/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr>
|
|
171
|
+
<p:grpSpPr/>
|
|
172
|
+
</p:spTree>
|
|
173
|
+
</p:cSld>
|
|
174
|
+
<p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr>
|
|
175
|
+
</p:sldLayout>`;
|
|
176
|
+
}
|
|
177
|
+
function slideLayoutRelsXml() {
|
|
178
|
+
return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
179
|
+
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
|
|
180
|
+
<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideMaster" Target="../slideMasters/slideMaster1.xml"/>
|
|
181
|
+
</Relationships>`;
|
|
182
|
+
}
|
|
183
|
+
function themeXml() {
|
|
184
|
+
return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
185
|
+
<a:theme xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" name="GanttloomExportTheme">
|
|
186
|
+
<a:themeElements>
|
|
187
|
+
<a:clrScheme name="Gantt">
|
|
188
|
+
<a:dk1><a:sysClr val="windowText" lastClr="000000"/></a:dk1>
|
|
189
|
+
<a:lt1><a:sysClr val="window" lastClr="FFFFFF"/></a:lt1>
|
|
190
|
+
<a:dk2><a:srgbClr val="44546A"/></a:dk2>
|
|
191
|
+
<a:lt2><a:srgbClr val="E7E6E6"/></a:lt2>
|
|
192
|
+
<a:accent1><a:srgbClr val="4472C4"/></a:accent1>
|
|
193
|
+
<a:accent2><a:srgbClr val="ED7D31"/></a:accent2>
|
|
194
|
+
<a:accent3><a:srgbClr val="A5A5A5"/></a:accent3>
|
|
195
|
+
<a:accent4><a:srgbClr val="FFC000"/></a:accent4>
|
|
196
|
+
<a:accent5><a:srgbClr val="5B9BD5"/></a:accent5>
|
|
197
|
+
<a:accent6><a:srgbClr val="70AD47"/></a:accent6>
|
|
198
|
+
<a:hlink><a:srgbClr val="0563C1"/></a:hlink>
|
|
199
|
+
<a:folHlink><a:srgbClr val="954F72"/></a:folHlink>
|
|
200
|
+
</a:clrScheme>
|
|
201
|
+
<a:fontScheme name="Gantt">
|
|
202
|
+
<a:majorFont><a:latin typeface="Calibri"/><a:ea typeface=""/><a:cs typeface=""/></a:majorFont>
|
|
203
|
+
<a:minorFont><a:latin typeface="Calibri"/><a:ea typeface=""/><a:cs typeface=""/></a:minorFont>
|
|
204
|
+
</a:fontScheme>
|
|
205
|
+
<a:fmtScheme name="Gantt">
|
|
206
|
+
<a:fillStyleLst>
|
|
207
|
+
<a:solidFill><a:schemeClr val="phClr"/></a:solidFill>
|
|
208
|
+
<a:solidFill><a:schemeClr val="phClr"/></a:solidFill>
|
|
209
|
+
<a:solidFill><a:schemeClr val="phClr"/></a:solidFill>
|
|
210
|
+
</a:fillStyleLst>
|
|
211
|
+
<a:lnStyleLst>
|
|
212
|
+
<a:ln w="6350"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill></a:ln>
|
|
213
|
+
<a:ln w="12700"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill></a:ln>
|
|
214
|
+
<a:ln w="19050"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill></a:ln>
|
|
215
|
+
</a:lnStyleLst>
|
|
216
|
+
<a:effectStyleLst>
|
|
217
|
+
<a:effectStyle><a:effectLst/></a:effectStyle>
|
|
218
|
+
<a:effectStyle><a:effectLst/></a:effectStyle>
|
|
219
|
+
<a:effectStyle><a:effectLst/></a:effectStyle>
|
|
220
|
+
</a:effectStyleLst>
|
|
221
|
+
<a:bgFillStyleLst>
|
|
222
|
+
<a:solidFill><a:schemeClr val="phClr"/></a:solidFill>
|
|
223
|
+
<a:solidFill><a:schemeClr val="phClr"/></a:solidFill>
|
|
224
|
+
<a:solidFill><a:schemeClr val="phClr"/></a:solidFill>
|
|
225
|
+
</a:bgFillStyleLst>
|
|
226
|
+
</a:fmtScheme>
|
|
227
|
+
</a:themeElements>
|
|
228
|
+
</a:theme>`;
|
|
229
|
+
}
|
|
230
|
+
function slideRelsXml() {
|
|
231
|
+
return `<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
232
|
+
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
|
|
233
|
+
<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout" Target="../slideLayouts/slideLayout1.xml"/>
|
|
234
|
+
</Relationships>`;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// src/pptx/index.ts
|
|
238
|
+
var EMU_PER_PT2 = 12700;
|
|
239
|
+
var encoder = new TextEncoder();
|
|
240
|
+
function textEntry(name, xml) {
|
|
241
|
+
return { name, data: encoder.encode(xml) };
|
|
242
|
+
}
|
|
243
|
+
function renderToPPTX(model, tasks, options = {}) {
|
|
244
|
+
const layout = computePagination(model, options);
|
|
245
|
+
const widthEmu = layout.pageWidthPt * EMU_PER_PT2;
|
|
246
|
+
const heightEmu = layout.pageHeightPt * EMU_PER_PT2;
|
|
247
|
+
const slideXmls = layout.pages.map((page) => {
|
|
248
|
+
const content = buildPageContent(model, tasks, layout, page);
|
|
249
|
+
return buildSlideXml(content.commands);
|
|
250
|
+
});
|
|
251
|
+
const entries = [
|
|
252
|
+
textEntry("[Content_Types].xml", contentTypesXml(slideXmls.length)),
|
|
253
|
+
textEntry("_rels/.rels", rootRelsXml()),
|
|
254
|
+
textEntry("ppt/presentation.xml", presentationXml(slideXmls.length, widthEmu, heightEmu)),
|
|
255
|
+
textEntry("ppt/_rels/presentation.xml.rels", presentationRelsXml(slideXmls.length)),
|
|
256
|
+
textEntry("ppt/slideMasters/slideMaster1.xml", slideMasterXml()),
|
|
257
|
+
textEntry("ppt/slideMasters/_rels/slideMaster1.xml.rels", slideMasterRelsXml()),
|
|
258
|
+
textEntry("ppt/slideLayouts/slideLayout1.xml", slideLayoutXml()),
|
|
259
|
+
textEntry("ppt/slideLayouts/_rels/slideLayout1.xml.rels", slideLayoutRelsXml()),
|
|
260
|
+
textEntry("ppt/theme/theme1.xml", themeXml())
|
|
261
|
+
];
|
|
262
|
+
slideXmls.forEach((xml, i) => {
|
|
263
|
+
entries.push(textEntry(`ppt/slides/slide${i + 1}.xml`, xml));
|
|
264
|
+
entries.push(textEntry(`ppt/slides/_rels/slide${i + 1}.xml.rels`, slideRelsXml()));
|
|
265
|
+
});
|
|
266
|
+
return buildZip(entries);
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
export {
|
|
270
|
+
renderToPPTX
|
|
271
|
+
};
|
|
272
|
+
//# sourceMappingURL=chunk-PXURNZ6Y.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/pptx/xml.ts","../src/pptx/shapes.ts","../src/pptx/render.ts","../src/pptx/parts.ts","../src/pptx/index.ts"],"sourcesContent":["/** Escape text for safe inclusion inside XML element content. */\nexport function xmlEscape(input: string): string {\n return input\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n","import type { DrawCommand, DrawDiamond, DrawLine, DrawRect, DrawText } from \"../layout.js\";\nimport { toHexRRGGBB } from \"../color.js\";\nimport { xmlEscape } from \"./xml.js\";\n\n/** EMU (English Metric Units): 914400 per inch, 12700 per point. */\nconst EMU_PER_PT = 12700;\nconst ptToEmu = (pt: number): number => Math.round(pt * EMU_PER_PT);\n\nfunction alignAttr(align?: \"left\" | \"center\" | \"right\"): string {\n if (align === \"center\") return ' algn=\"ctr\"';\n if (align === \"right\") return ' algn=\"r\"';\n return \"\";\n}\n\nfunction rectShape(id: number, cmd: DrawRect): string {\n const x = ptToEmu(cmd.x);\n const y = ptToEmu(cmd.y);\n const cx = Math.max(ptToEmu(cmd.w), 1);\n const cy = Math.max(ptToEmu(cmd.h), 1);\n const fill = cmd.fill ? `<a:solidFill><a:srgbClr val=\"${toHexRRGGBB(cmd.fill)}\"/></a:solidFill>` : `<a:noFill/>`;\n const line = cmd.stroke\n ? `<a:ln w=\"3175\"><a:solidFill><a:srgbClr val=\"${toHexRRGGBB(cmd.stroke)}\"/></a:solidFill></a:ln>`\n : `<a:ln><a:noFill/></a:ln>`;\n return (\n `<p:sp><p:nvSpPr><p:cNvPr id=\"${id}\" name=\"Rect${id}\"/><p:cNvSpPr/><p:nvPr/></p:nvSpPr>` +\n `<p:spPr><a:xfrm><a:off x=\"${x}\" y=\"${y}\"/><a:ext cx=\"${cx}\" cy=\"${cy}\"/></a:xfrm>` +\n `<a:prstGeom prst=\"rect\"><a:avLst/></a:prstGeom>${fill}${line}</p:spPr></p:sp>`\n );\n}\n\nfunction diamondShape(id: number, cmd: DrawDiamond): string {\n const x = ptToEmu(cmd.cx - cmd.r);\n const y = ptToEmu(cmd.cy - cmd.r);\n const size = Math.max(ptToEmu(cmd.r * 2), 1);\n const fill = cmd.fill ? `<a:solidFill><a:srgbClr val=\"${toHexRRGGBB(cmd.fill)}\"/></a:solidFill>` : `<a:noFill/>`;\n const line = cmd.stroke\n ? `<a:ln w=\"3175\"><a:solidFill><a:srgbClr val=\"${toHexRRGGBB(cmd.stroke)}\"/></a:solidFill></a:ln>`\n : `<a:ln><a:noFill/></a:ln>`;\n return (\n `<p:sp><p:nvSpPr><p:cNvPr id=\"${id}\" name=\"Milestone${id}\"/><p:cNvSpPr/><p:nvPr/></p:nvSpPr>` +\n `<p:spPr><a:xfrm><a:off x=\"${x}\" y=\"${y}\"/><a:ext cx=\"${size}\" cy=\"${size}\"/></a:xfrm>` +\n `<a:prstGeom prst=\"diamond\"><a:avLst/></a:prstGeom>${fill}${line}</p:spPr></p:sp>`\n );\n}\n\nfunction textShape(id: number, cmd: DrawText): string {\n const x = ptToEmu(cmd.x);\n const y = ptToEmu(Math.max(cmd.y - 2, 0));\n const cx = Math.max(ptToEmu(cmd.w ?? 300), 1);\n const cy = Math.max(ptToEmu(cmd.size * 1.6), 1);\n const sizeHundredths = Math.round(cmd.size * 100);\n const color = toHexRRGGBB(cmd.color);\n const bold = cmd.bold ? ' b=\"1\"' : \"\";\n return (\n `<p:sp><p:nvSpPr><p:cNvPr id=\"${id}\" name=\"Text${id}\"/><p:cNvSpPr txBox=\"1\"/><p:nvPr/></p:nvSpPr>` +\n `<p:spPr><a:xfrm><a:off x=\"${x}\" y=\"${y}\"/><a:ext cx=\"${cx}\" cy=\"${cy}\"/></a:xfrm>` +\n `<a:prstGeom prst=\"rect\"><a:avLst/></a:prstGeom><a:noFill/></p:spPr>` +\n `<p:txBody><a:bodyPr wrap=\"none\" lIns=\"0\" tIns=\"0\" rIns=\"0\" bIns=\"0\" anchor=\"t\"/><a:lstStyle/>` +\n `<a:p><a:pPr${alignAttr(cmd.align)}/><a:r><a:rPr lang=\"en-US\" sz=\"${sizeHundredths}\"${bold} dirty=\"0\">` +\n `<a:solidFill><a:srgbClr val=\"${color}\"/></a:solidFill></a:rPr><a:t>${xmlEscape(cmd.text)}</a:t></a:r></a:p>` +\n `</p:txBody></p:sp>`\n );\n}\n\nfunction lineShape(id: number, cmd: DrawLine): string | null {\n if (cmd.points.length < 2) return null;\n const xs = cmd.points.map((p) => ptToEmu(p.x));\n const ys = cmd.points.map((p) => ptToEmu(p.y));\n const minX = Math.min(...xs);\n const minY = Math.min(...ys);\n const w = Math.max(Math.max(...xs) - minX, 1);\n const h = Math.max(Math.max(...ys) - minY, 1);\n const pathPts = cmd.points\n .map((p, i) => {\n const px = ptToEmu(p.x) - minX;\n const py = ptToEmu(p.y) - minY;\n return i === 0 ? `<a:moveTo><a:pt x=\"${px}\" y=\"${py}\"/></a:moveTo>` : `<a:lnTo><a:pt x=\"${px}\" y=\"${py}\"/></a:lnTo>`;\n })\n .join(\"\");\n const color = toHexRRGGBB(cmd.stroke);\n return (\n `<p:sp><p:nvSpPr><p:cNvPr id=\"${id}\" name=\"Link${id}\"/><p:cNvSpPr/><p:nvPr/></p:nvSpPr>` +\n `<p:spPr><a:xfrm><a:off x=\"${minX}\" y=\"${minY}\"/><a:ext cx=\"${w}\" cy=\"${h}\"/></a:xfrm>` +\n `<a:custGeom><a:avLst/><a:gdLst/><a:ahLst/><a:cxnLst/><a:rect l=\"0\" t=\"0\" r=\"0\" b=\"0\"/>` +\n `<a:pathLst><a:path w=\"${w}\" h=\"${h}\">${pathPts}</a:path></a:pathLst></a:custGeom>` +\n `<a:noFill/><a:ln w=\"9525\"><a:solidFill><a:srgbClr val=\"${color}\"/></a:solidFill></a:ln></p:spPr></p:sp>`\n );\n}\n\n/** Build the `<p:spTree>` shape XML for one slide's draw commands. */\nexport function buildSlideShapesXml(commands: DrawCommand[]): string {\n let id = 2; // id 1 is reserved for the group shape properties element\n const shapes: string[] = [];\n for (const cmd of commands) {\n if (cmd.kind === \"rect\") shapes.push(rectShape(id++, cmd));\n else if (cmd.kind === \"diamond\") shapes.push(diamondShape(id++, cmd));\n else if (cmd.kind === \"text\") shapes.push(textShape(id++, cmd));\n else if (cmd.kind === \"line\") {\n const s = lineShape(id++, cmd);\n if (s) shapes.push(s);\n }\n }\n return shapes.join(\"\");\n}\n","import type { DrawCommand } from \"../layout.js\";\nimport { buildSlideShapesXml } from \"./shapes.js\";\n\nexport function buildSlideXml(commands: DrawCommand[]): string {\n const shapesXml = buildSlideShapesXml(commands);\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<p:sld xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:p=\"http://schemas.openxmlformats.org/presentationml/2006/main\">\n<p:cSld>\n<p:spTree>\n<p:nvGrpSpPr><p:cNvPr id=\"1\" name=\"\"/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr>\n<p:grpSpPr/>\n${shapesXml}\n</p:spTree>\n</p:cSld>\n<p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr>\n</p:sld>`;\n}\n","/**\n * Minimal, hand-written OOXML parts needed for a valid .pptx: content types,\n * package relationships, presentation.xml + its rels, one slide master, one\n * slide layout, a minimal theme, and per-slide XML + rels. Kept as small as\n * PowerPoint/Google Slides/LibreOffice Impress will tolerate — getting the\n * relationship ids and content-type declarations exactly right here is what\n * keeps the file from triggering a \"repair\" prompt.\n */\n\nexport function contentTypesXml(slideCount: number): string {\n const slideOverrides = Array.from(\n { length: slideCount },\n (_, i) =>\n `<Override PartName=\"/ppt/slides/slide${i + 1}.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.presentationml.slide+xml\"/>`,\n ).join(\"\");\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">\n<Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/>\n<Default Extension=\"xml\" ContentType=\"application/xml\"/>\n<Override PartName=\"/ppt/presentation.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml\"/>\n<Override PartName=\"/ppt/slideMasters/slideMaster1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.presentationml.slideMaster+xml\"/>\n<Override PartName=\"/ppt/slideLayouts/slideLayout1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.presentationml.slideLayout+xml\"/>\n<Override PartName=\"/ppt/theme/theme1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.theme+xml\"/>\n${slideOverrides}\n</Types>`;\n}\n\nexport function rootRelsXml(): string {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\n<Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"ppt/presentation.xml\"/>\n</Relationships>`;\n}\n\nexport function presentationXml(slideCount: number, widthEmu: number, heightEmu: number): string {\n const sldIds = Array.from(\n { length: slideCount },\n (_, i) => `<p:sldId id=\"${256 + i}\" r:id=\"rId${i + 2}\"/>`,\n ).join(\"\");\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<p:presentation xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:p=\"http://schemas.openxmlformats.org/presentationml/2006/main\">\n<p:sldMasterIdLst><p:sldMasterId id=\"2147483648\" r:id=\"rId1\"/></p:sldMasterIdLst>\n<p:sldIdLst>${sldIds}</p:sldIdLst>\n<p:sldSz cx=\"${Math.round(widthEmu)}\" cy=\"${Math.round(heightEmu)}\"/>\n<p:notesSz cx=\"${Math.round(heightEmu)}\" cy=\"${Math.round(widthEmu)}\"/>\n</p:presentation>`;\n}\n\nexport function presentationRelsXml(slideCount: number): string {\n const slideRels = Array.from(\n { length: slideCount },\n (_, i) =>\n `<Relationship Id=\"rId${i + 2}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide\" Target=\"slides/slide${i + 1}.xml\"/>`,\n ).join(\"\");\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\n<Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideMaster\" Target=\"slideMasters/slideMaster1.xml\"/>\n${slideRels}\n</Relationships>`;\n}\n\nexport function slideMasterXml(): string {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<p:sldMaster xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:p=\"http://schemas.openxmlformats.org/presentationml/2006/main\">\n<p:cSld>\n<p:bg><p:bgRef idx=\"1001\"><a:schemeClr val=\"bg1\"/></p:bgRef></p:bg>\n<p:spTree>\n<p:nvGrpSpPr><p:cNvPr id=\"1\" name=\"\"/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr>\n<p:grpSpPr/>\n</p:spTree>\n</p:cSld>\n<p:clrMap bg1=\"lt1\" tx1=\"dk1\" bg2=\"lt2\" tx2=\"dk2\" accent1=\"accent1\" accent2=\"accent2\" accent3=\"accent3\" accent4=\"accent4\" accent5=\"accent5\" accent6=\"accent6\" hlink=\"hlink\" folHlink=\"folHlink\"/>\n<p:sldLayoutIdLst><p:sldLayoutId id=\"2147483649\" r:id=\"rId1\"/></p:sldLayoutIdLst>\n</p:sldMaster>`;\n}\n\nexport function slideMasterRelsXml(): string {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\n<Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout\" Target=\"../slideLayouts/slideLayout1.xml\"/>\n<Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme\" Target=\"../theme/theme1.xml\"/>\n</Relationships>`;\n}\n\nexport function slideLayoutXml(): string {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<p:sldLayout xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:p=\"http://schemas.openxmlformats.org/presentationml/2006/main\" type=\"blank\" preserve=\"1\">\n<p:cSld name=\"Blank\">\n<p:spTree>\n<p:nvGrpSpPr><p:cNvPr id=\"1\" name=\"\"/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr>\n<p:grpSpPr/>\n</p:spTree>\n</p:cSld>\n<p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr>\n</p:sldLayout>`;\n}\n\nexport function slideLayoutRelsXml(): string {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\n<Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideMaster\" Target=\"../slideMasters/slideMaster1.xml\"/>\n</Relationships>`;\n}\n\nexport function themeXml(): string {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<a:theme xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" name=\"GanttloomExportTheme\">\n<a:themeElements>\n<a:clrScheme name=\"Gantt\">\n<a:dk1><a:sysClr val=\"windowText\" lastClr=\"000000\"/></a:dk1>\n<a:lt1><a:sysClr val=\"window\" lastClr=\"FFFFFF\"/></a:lt1>\n<a:dk2><a:srgbClr val=\"44546A\"/></a:dk2>\n<a:lt2><a:srgbClr val=\"E7E6E6\"/></a:lt2>\n<a:accent1><a:srgbClr val=\"4472C4\"/></a:accent1>\n<a:accent2><a:srgbClr val=\"ED7D31\"/></a:accent2>\n<a:accent3><a:srgbClr val=\"A5A5A5\"/></a:accent3>\n<a:accent4><a:srgbClr val=\"FFC000\"/></a:accent4>\n<a:accent5><a:srgbClr val=\"5B9BD5\"/></a:accent5>\n<a:accent6><a:srgbClr val=\"70AD47\"/></a:accent6>\n<a:hlink><a:srgbClr val=\"0563C1\"/></a:hlink>\n<a:folHlink><a:srgbClr val=\"954F72\"/></a:folHlink>\n</a:clrScheme>\n<a:fontScheme name=\"Gantt\">\n<a:majorFont><a:latin typeface=\"Calibri\"/><a:ea typeface=\"\"/><a:cs typeface=\"\"/></a:majorFont>\n<a:minorFont><a:latin typeface=\"Calibri\"/><a:ea typeface=\"\"/><a:cs typeface=\"\"/></a:minorFont>\n</a:fontScheme>\n<a:fmtScheme name=\"Gantt\">\n<a:fillStyleLst>\n<a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill>\n<a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill>\n<a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill>\n</a:fillStyleLst>\n<a:lnStyleLst>\n<a:ln w=\"6350\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill></a:ln>\n<a:ln w=\"12700\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill></a:ln>\n<a:ln w=\"19050\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill></a:ln>\n</a:lnStyleLst>\n<a:effectStyleLst>\n<a:effectStyle><a:effectLst/></a:effectStyle>\n<a:effectStyle><a:effectLst/></a:effectStyle>\n<a:effectStyle><a:effectLst/></a:effectStyle>\n</a:effectStyleLst>\n<a:bgFillStyleLst>\n<a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill>\n<a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill>\n<a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill>\n</a:bgFillStyleLst>\n</a:fmtScheme>\n</a:themeElements>\n</a:theme>`;\n}\n\nexport function slideRelsXml(): string {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\n<Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout\" Target=\"../slideLayouts/slideLayout1.xml\"/>\n</Relationships>`;\n}\n","import type { GanttRenderModel, GanttTask } from \"@ganttloom/gantt-core\";\nimport { computePagination, type PaginationOptions } from \"../paginate.js\";\nimport { buildPageContent } from \"../layout.js\";\nimport { buildZip, type ZipEntryInput } from \"../zip.js\";\nimport { buildSlideXml } from \"./render.js\";\nimport {\n contentTypesXml,\n presentationRelsXml,\n presentationXml,\n rootRelsXml,\n slideLayoutRelsXml,\n slideLayoutXml,\n slideMasterRelsXml,\n slideMasterXml,\n slideRelsXml,\n themeXml,\n} from \"./parts.js\";\n\nexport type PptxExportOptions = PaginationOptions;\n\nconst EMU_PER_PT = 12700;\n\nconst encoder = new TextEncoder();\nfunction textEntry(name: string, xml: string): ZipEntryInput {\n return { name, data: encoder.encode(xml) };\n}\n\n/**\n * Render a GanttRenderModel to a native PPTX (PowerPoint) file, built from\n * scratch: a hand-rolled ZIP container (see ./zip.ts) around hand-written\n * OOXML parts (see ./parts.ts, ./shapes.ts) — no external PPTX/OOXML/zip\n * library. Automatically paginates large charts across multiple slides per\n * `computePagination`.\n */\nexport function renderToPPTX(\n model: GanttRenderModel,\n tasks: GanttTask[],\n options: PptxExportOptions = {},\n): Uint8Array {\n const layout = computePagination(model, options);\n const widthEmu = layout.pageWidthPt * EMU_PER_PT;\n const heightEmu = layout.pageHeightPt * EMU_PER_PT;\n\n const slideXmls = layout.pages.map((page) => {\n const content = buildPageContent(model, tasks, layout, page);\n return buildSlideXml(content.commands);\n });\n\n const entries: ZipEntryInput[] = [\n textEntry(\"[Content_Types].xml\", contentTypesXml(slideXmls.length)),\n textEntry(\"_rels/.rels\", rootRelsXml()),\n textEntry(\"ppt/presentation.xml\", presentationXml(slideXmls.length, widthEmu, heightEmu)),\n textEntry(\"ppt/_rels/presentation.xml.rels\", presentationRelsXml(slideXmls.length)),\n textEntry(\"ppt/slideMasters/slideMaster1.xml\", slideMasterXml()),\n textEntry(\"ppt/slideMasters/_rels/slideMaster1.xml.rels\", slideMasterRelsXml()),\n textEntry(\"ppt/slideLayouts/slideLayout1.xml\", slideLayoutXml()),\n textEntry(\"ppt/slideLayouts/_rels/slideLayout1.xml.rels\", slideLayoutRelsXml()),\n textEntry(\"ppt/theme/theme1.xml\", themeXml()),\n ];\n\n slideXmls.forEach((xml, i) => {\n entries.push(textEntry(`ppt/slides/slide${i + 1}.xml`, xml));\n entries.push(textEntry(`ppt/slides/_rels/slide${i + 1}.xml.rels`, slideRelsXml()));\n });\n\n return buildZip(entries);\n}\n\nexport { computePagination } from \"../paginate.js\";\nexport type { PaginationLayout, PageBand, PageSizeName, Orientation, Margins } from \"../paginate.js\";\n"],"mappings":"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","names":["EMU_PER_PT"]}
|