ppt-codec 1.0.2 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/README.md +142 -38
  2. package/dist/content-write.cjs +114 -0
  3. package/dist/content-write.d.cts +11 -0
  4. package/dist/content-write.d.ts +11 -0
  5. package/dist/content-write.js +112 -0
  6. package/dist/content.cjs +22 -2
  7. package/dist/content.js +22 -2
  8. package/dist/document/color-scheme-write.cjs +57 -0
  9. package/dist/document/color-scheme-write.d.cts +4 -0
  10. package/dist/document/color-scheme-write.d.ts +4 -0
  11. package/dist/document/color-scheme-write.js +56 -0
  12. package/dist/document/document-atom-write.cjs +12 -0
  13. package/dist/document/document-atom-write.d.cts +5 -0
  14. package/dist/document/document-atom-write.d.ts +5 -0
  15. package/dist/document/document-atom-write.js +11 -0
  16. package/dist/document/fonts-write.cjs +17 -0
  17. package/dist/document/fonts-write.d.cts +4 -0
  18. package/dist/document/fonts-write.d.ts +4 -0
  19. package/dist/document/fonts-write.js +16 -0
  20. package/dist/document/master-write.cjs +128 -0
  21. package/dist/document/master-write.d.cts +15 -0
  22. package/dist/document/master-write.d.ts +15 -0
  23. package/dist/document/master-write.js +123 -0
  24. package/dist/document/notes-list-write.cjs +12 -0
  25. package/dist/document/notes-list-write.d.cts +5 -0
  26. package/dist/document/notes-list-write.d.ts +5 -0
  27. package/dist/document/notes-list-write.js +11 -0
  28. package/dist/document/notes-list.cjs +22 -0
  29. package/dist/document/notes-list.d.cts +9 -0
  30. package/dist/document/notes-list.d.ts +9 -0
  31. package/dist/document/notes-list.js +21 -0
  32. package/dist/document/notes-write.cjs +43 -0
  33. package/dist/document/notes-write.d.cts +6 -0
  34. package/dist/document/notes-write.d.ts +6 -0
  35. package/dist/document/notes-write.js +41 -0
  36. package/dist/document/notes.cjs +41 -0
  37. package/dist/document/notes.d.cts +12 -0
  38. package/dist/document/notes.d.ts +12 -0
  39. package/dist/document/notes.js +37 -0
  40. package/dist/document/slide-list-write.cjs +12 -0
  41. package/dist/document/slide-list-write.d.cts +8 -0
  42. package/dist/document/slide-list-write.d.ts +8 -0
  43. package/dist/document/slide-list-write.js +11 -0
  44. package/dist/drawing/shapes-write.cjs +60 -0
  45. package/dist/drawing/shapes-write.d.cts +10 -0
  46. package/dist/drawing/shapes-write.d.ts +10 -0
  47. package/dist/drawing/shapes-write.js +58 -0
  48. package/dist/errors.cjs +7 -0
  49. package/dist/errors.d.cts +4 -1
  50. package/dist/errors.d.ts +4 -1
  51. package/dist/errors.js +7 -1
  52. package/dist/index.cjs +112 -3
  53. package/dist/index.d.cts +24 -7
  54. package/dist/index.d.ts +24 -7
  55. package/dist/index.js +25 -8
  56. package/dist/metadata.cjs +14 -0
  57. package/dist/metadata.d.cts +6 -0
  58. package/dist/metadata.d.ts +6 -0
  59. package/dist/metadata.js +13 -0
  60. package/dist/read.cjs +33 -8
  61. package/dist/read.d.cts +5 -1
  62. package/dist/read.d.ts +5 -1
  63. package/dist/read.js +32 -10
  64. package/dist/record/types.cjs +8 -0
  65. package/dist/record/types.d.cts +5 -1
  66. package/dist/record/types.d.ts +5 -1
  67. package/dist/record/types.js +5 -1
  68. package/dist/record/write.cjs +75 -0
  69. package/dist/record/write.d.cts +17 -0
  70. package/dist/record/write.d.ts +17 -0
  71. package/dist/record/write.js +65 -0
  72. package/dist/stream/current-user-write.cjs +13 -0
  73. package/dist/stream/current-user-write.d.cts +4 -0
  74. package/dist/stream/current-user-write.d.ts +4 -0
  75. package/dist/stream/current-user-write.js +12 -0
  76. package/dist/stream/current-user.cjs +7 -5
  77. package/dist/stream/current-user.d.cts +3 -1
  78. package/dist/stream/current-user.d.ts +3 -1
  79. package/dist/stream/current-user.js +6 -6
  80. package/dist/stream/persist-write.cjs +14 -0
  81. package/dist/stream/persist-write.d.cts +16 -0
  82. package/dist/stream/persist-write.d.ts +16 -0
  83. package/dist/stream/persist-write.js +12 -0
  84. package/dist/text/style-write.cjs +79 -0
  85. package/dist/text/style-write.d.cts +5 -0
  86. package/dist/text/style-write.d.ts +5 -0
  87. package/dist/text/style-write.js +78 -0
  88. package/dist/text/style.cjs +85 -30
  89. package/dist/text/style.d.cts +50 -1
  90. package/dist/text/style.d.ts +50 -1
  91. package/dist/text/style.js +44 -31
  92. package/dist/units.cjs +4 -0
  93. package/dist/units.d.cts +2 -1
  94. package/dist/units.d.ts +2 -1
  95. package/dist/units.js +4 -1
  96. package/dist/write.cjs +145 -0
  97. package/dist/write.d.cts +11 -0
  98. package/dist/write.d.ts +11 -0
  99. package/dist/write.js +142 -0
  100. package/package.json +4 -4
@@ -0,0 +1,9 @@
1
+ import { t as PptRecord } from "../tree-PMcPNgd-.js";
2
+ //#region src/document/notes-list.d.ts
3
+ interface NotesPersist {
4
+ readonly persistIdRef: number;
5
+ readonly notesId: number;
6
+ }
7
+ declare function readNotesListWithText(listContainer: PptRecord): NotesPersist[];
8
+ //#endregion
9
+ export { NotesPersist, readNotesListWithText };
@@ -0,0 +1,21 @@
1
+ import { PptFormatError } from "../errors.js";
2
+ import { childRecords } from "../record/tree.js";
3
+ import { RT_SlideListWithText } from "../record/types.js";
4
+ //#region src/document/notes-list.ts
5
+ const NOTES_PERSIST_ATOM_LEN = 20;
6
+ function readNotesListWithText(listContainer) {
7
+ if (listContainer.header.recType !== 4080) throw new PptFormatError(`expected RT_SlideListWithText (0x${RT_SlideListWithText.toString(16)}), found record type 0x${listContainer.header.recType.toString(16)}`);
8
+ const persists = [];
9
+ for (const record of childRecords(listContainer)) {
10
+ if (record.header.recType !== 1011) continue;
11
+ if (record.data.length < NOTES_PERSIST_ATOM_LEN) throw new PptFormatError(`NotesPersistAtom at offset ${record.offset} carries ${record.data.length} bytes, fewer than the mandated 0x${NOTES_PERSIST_ATOM_LEN.toString(16)}`);
12
+ const view = new DataView(record.data.buffer, record.data.byteOffset, record.data.byteLength);
13
+ persists.push({
14
+ persistIdRef: view.getUint32(0, true),
15
+ notesId: view.getUint32(12, true)
16
+ });
17
+ }
18
+ return persists;
19
+ }
20
+ //#endregion
21
+ export { readNotesListWithText };
@@ -0,0 +1,43 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_record_types = require("../record/types.cjs");
3
+ const require_record_write = require("../record/write.cjs");
4
+ const require_document_color_scheme_write = require("./color-scheme-write.cjs");
5
+ const require_drawing_shapes_write = require("../drawing/shapes-write.cjs");
6
+ const require_read = require("../read.cjs");
7
+ //#region src/document/notes-write.ts
8
+ const NOTES_BODY_TOP_FRACTION = .5;
9
+ const NOTES_BODY_MARGIN_FRACTION = .05;
10
+ function notesBodyShape(notes, notesPageSize) {
11
+ const marginXPt = notesPageSize.widthPt * NOTES_BODY_MARGIN_FRACTION;
12
+ const marginYPt = notesPageSize.heightPt * NOTES_BODY_MARGIN_FRACTION;
13
+ const topPt = notesPageSize.heightPt * NOTES_BODY_TOP_FRACTION;
14
+ return {
15
+ frame: {
16
+ xPt: marginXPt,
17
+ yPt: topPt,
18
+ widthPt: notesPageSize.widthPt - marginXPt * 2,
19
+ heightPt: notesPageSize.heightPt - topPt - marginYPt
20
+ },
21
+ insetLeftPt: require_read.DEFAULT_INSET_LEFT_RIGHT_PT,
22
+ insetTopPt: require_read.DEFAULT_INSET_TOP_BOTTOM_PT,
23
+ insetRightPt: require_read.DEFAULT_INSET_LEFT_RIGHT_PT,
24
+ insetBottomPt: require_read.DEFAULT_INSET_TOP_BOTTOM_PT,
25
+ blocks: notes.split("\n").map((line) => ({
26
+ kind: "paragraph",
27
+ runs: [{ text: line }]
28
+ }))
29
+ };
30
+ }
31
+ function writeNotesAtom(slideIdRef) {
32
+ return require_record_write.writeAtom(require_record_types.RT_NotesAtom, require_record_write.concatBytes(require_record_write.u32le(slideIdRef), require_record_write.u16le(0), require_record_write.u16le(0)), { recVer: 1 });
33
+ }
34
+ function writeNotesContainer(slideIdRef, notes, notesPageSize, fontIndexOf) {
35
+ return require_record_write.writeContainer(require_record_types.RT_Notes, [
36
+ writeNotesAtom(slideIdRef),
37
+ require_drawing_shapes_write.writeSlideDrawing([notesBodyShape(notes, notesPageSize)], fontIndexOf),
38
+ require_document_color_scheme_write.writeSlideSchemeColorSchemeAtom()
39
+ ]);
40
+ }
41
+ //#endregion
42
+ exports.writeNotesAtom = writeNotesAtom;
43
+ exports.writeNotesContainer = writeNotesContainer;
@@ -0,0 +1,6 @@
1
+ import { PageSize } from "document-schema.js";
2
+ //#region src/document/notes-write.d.ts
3
+ declare function writeNotesAtom(slideIdRef: number): Uint8Array<ArrayBuffer>;
4
+ declare function writeNotesContainer(slideIdRef: number, notes: string, notesPageSize: PageSize, fontIndexOf: (family: string) => number): Uint8Array<ArrayBuffer>;
5
+ //#endregion
6
+ export { writeNotesAtom, writeNotesContainer };
@@ -0,0 +1,6 @@
1
+ import { PageSize } from "document-schema.js";
2
+ //#region src/document/notes-write.d.ts
3
+ declare function writeNotesAtom(slideIdRef: number): Uint8Array<ArrayBuffer>;
4
+ declare function writeNotesContainer(slideIdRef: number, notes: string, notesPageSize: PageSize, fontIndexOf: (family: string) => number): Uint8Array<ArrayBuffer>;
5
+ //#endregion
6
+ export { writeNotesAtom, writeNotesContainer };
@@ -0,0 +1,41 @@
1
+ import { RT_Notes, RT_NotesAtom } from "../record/types.js";
2
+ import { concatBytes, u16le, u32le, writeAtom, writeContainer } from "../record/write.js";
3
+ import { writeSlideSchemeColorSchemeAtom } from "./color-scheme-write.js";
4
+ import { writeSlideDrawing } from "../drawing/shapes-write.js";
5
+ import { DEFAULT_INSET_LEFT_RIGHT_PT, DEFAULT_INSET_TOP_BOTTOM_PT } from "../read.js";
6
+ //#region src/document/notes-write.ts
7
+ const NOTES_BODY_TOP_FRACTION = .5;
8
+ const NOTES_BODY_MARGIN_FRACTION = .05;
9
+ function notesBodyShape(notes, notesPageSize) {
10
+ const marginXPt = notesPageSize.widthPt * NOTES_BODY_MARGIN_FRACTION;
11
+ const marginYPt = notesPageSize.heightPt * NOTES_BODY_MARGIN_FRACTION;
12
+ const topPt = notesPageSize.heightPt * NOTES_BODY_TOP_FRACTION;
13
+ return {
14
+ frame: {
15
+ xPt: marginXPt,
16
+ yPt: topPt,
17
+ widthPt: notesPageSize.widthPt - marginXPt * 2,
18
+ heightPt: notesPageSize.heightPt - topPt - marginYPt
19
+ },
20
+ insetLeftPt: DEFAULT_INSET_LEFT_RIGHT_PT,
21
+ insetTopPt: DEFAULT_INSET_TOP_BOTTOM_PT,
22
+ insetRightPt: DEFAULT_INSET_LEFT_RIGHT_PT,
23
+ insetBottomPt: DEFAULT_INSET_TOP_BOTTOM_PT,
24
+ blocks: notes.split("\n").map((line) => ({
25
+ kind: "paragraph",
26
+ runs: [{ text: line }]
27
+ }))
28
+ };
29
+ }
30
+ function writeNotesAtom(slideIdRef) {
31
+ return writeAtom(RT_NotesAtom, concatBytes(u32le(slideIdRef), u16le(0), u16le(0)), { recVer: 1 });
32
+ }
33
+ function writeNotesContainer(slideIdRef, notes, notesPageSize, fontIndexOf) {
34
+ return writeContainer(RT_Notes, [
35
+ writeNotesAtom(slideIdRef),
36
+ writeSlideDrawing([notesBodyShape(notes, notesPageSize)], fontIndexOf),
37
+ writeSlideSchemeColorSchemeAtom()
38
+ ]);
39
+ }
40
+ //#endregion
41
+ export { writeNotesAtom, writeNotesContainer };
@@ -0,0 +1,41 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_errors = require("../errors.cjs");
3
+ const require_record_tree = require("../record/tree.cjs");
4
+ const require_record_types = require("../record/types.cjs");
5
+ const require_text_atoms = require("../text/atoms.cjs");
6
+ const require_drawing_shapes = require("../drawing/shapes.cjs");
7
+ //#region src/document/notes.ts
8
+ const NOTES_ATOM_LEN = 8;
9
+ const NOTES_MASTER_SLIDE_ID_REF = 0;
10
+ function readNotesAtom(record) {
11
+ if (record.header.recType !== 1009) throw new require_errors.PptFormatError(`expected RT_NotesAtom (0x${require_record_types.RT_NotesAtom.toString(16)}), found record type 0x${record.header.recType.toString(16)}`);
12
+ if (record.data.length < NOTES_ATOM_LEN) throw new require_errors.PptFormatError(`NotesAtom carries ${record.data.length} bytes, fewer than the mandated 0x${NOTES_ATOM_LEN.toString(16)}`);
13
+ const view = new DataView(record.data.buffer, record.data.byteOffset, record.data.byteLength);
14
+ return {
15
+ slideIdRef: view.getUint32(0, true),
16
+ slideFlags: view.getUint16(4, true)
17
+ };
18
+ }
19
+ function readNotesContainerAtom(notesContainer) {
20
+ if (notesContainer.header.recType !== 1008) throw new require_errors.PptFormatError(`expected RT_Notes (0x${require_record_types.RT_Notes.toString(16)}), found record type 0x${notesContainer.header.recType.toString(16)}`);
21
+ const atom = require_record_tree.findChild(require_record_tree.childRecords(notesContainer), require_record_types.RT_NotesAtom);
22
+ if (atom === void 0) throw new require_errors.PptFormatError(`the NotesContainer at offset ${notesContainer.offset} has no NotesAtom, so the presentation slide its notes belong to is unstated`);
23
+ return readNotesAtom(atom);
24
+ }
25
+ function readNotesText(notesContainer) {
26
+ const drawing = require_record_tree.findChild(require_record_tree.childRecords(notesContainer), require_record_types.RT_Drawing);
27
+ if (drawing === void 0) return "";
28
+ const bodies = [];
29
+ for (const shape of require_drawing_shapes.readDrawingShapes(drawing)) {
30
+ if (shape.clientTextbox === void 0) continue;
31
+ const text = require_text_atoms.readTextBody(require_record_tree.childRecords(shape.clientTextbox));
32
+ if (text === void 0 || text.length === 0) continue;
33
+ bodies.push(require_text_atoms.splitParagraphs(text).map((paragraph) => paragraph.text).join("\n"));
34
+ }
35
+ return bodies.join("\n");
36
+ }
37
+ //#endregion
38
+ exports.NOTES_MASTER_SLIDE_ID_REF = NOTES_MASTER_SLIDE_ID_REF;
39
+ exports.readNotesAtom = readNotesAtom;
40
+ exports.readNotesContainerAtom = readNotesContainerAtom;
41
+ exports.readNotesText = readNotesText;
@@ -0,0 +1,12 @@
1
+ import { t as PptRecord } from "../tree-Du_LXAF0.cjs";
2
+ //#region src/document/notes.d.ts
3
+ declare const NOTES_MASTER_SLIDE_ID_REF = 0;
4
+ interface NotesAtom {
5
+ readonly slideIdRef: number;
6
+ readonly slideFlags: number;
7
+ }
8
+ declare function readNotesAtom(record: PptRecord): NotesAtom;
9
+ declare function readNotesContainerAtom(notesContainer: PptRecord): NotesAtom;
10
+ declare function readNotesText(notesContainer: PptRecord): string;
11
+ //#endregion
12
+ export { NOTES_MASTER_SLIDE_ID_REF, NotesAtom, readNotesAtom, readNotesContainerAtom, readNotesText };
@@ -0,0 +1,12 @@
1
+ import { t as PptRecord } from "../tree-PMcPNgd-.js";
2
+ //#region src/document/notes.d.ts
3
+ declare const NOTES_MASTER_SLIDE_ID_REF = 0;
4
+ interface NotesAtom {
5
+ readonly slideIdRef: number;
6
+ readonly slideFlags: number;
7
+ }
8
+ declare function readNotesAtom(record: PptRecord): NotesAtom;
9
+ declare function readNotesContainerAtom(notesContainer: PptRecord): NotesAtom;
10
+ declare function readNotesText(notesContainer: PptRecord): string;
11
+ //#endregion
12
+ export { NOTES_MASTER_SLIDE_ID_REF, NotesAtom, readNotesAtom, readNotesContainerAtom, readNotesText };
@@ -0,0 +1,37 @@
1
+ import { PptFormatError } from "../errors.js";
2
+ import { childRecords, findChild } from "../record/tree.js";
3
+ import { RT_Drawing, RT_Notes, RT_NotesAtom } from "../record/types.js";
4
+ import { readTextBody, splitParagraphs } from "../text/atoms.js";
5
+ import { readDrawingShapes } from "../drawing/shapes.js";
6
+ //#region src/document/notes.ts
7
+ const NOTES_ATOM_LEN = 8;
8
+ const NOTES_MASTER_SLIDE_ID_REF = 0;
9
+ function readNotesAtom(record) {
10
+ if (record.header.recType !== 1009) throw new PptFormatError(`expected RT_NotesAtom (0x${RT_NotesAtom.toString(16)}), found record type 0x${record.header.recType.toString(16)}`);
11
+ if (record.data.length < NOTES_ATOM_LEN) throw new PptFormatError(`NotesAtom carries ${record.data.length} bytes, fewer than the mandated 0x${NOTES_ATOM_LEN.toString(16)}`);
12
+ const view = new DataView(record.data.buffer, record.data.byteOffset, record.data.byteLength);
13
+ return {
14
+ slideIdRef: view.getUint32(0, true),
15
+ slideFlags: view.getUint16(4, true)
16
+ };
17
+ }
18
+ function readNotesContainerAtom(notesContainer) {
19
+ if (notesContainer.header.recType !== 1008) throw new PptFormatError(`expected RT_Notes (0x${RT_Notes.toString(16)}), found record type 0x${notesContainer.header.recType.toString(16)}`);
20
+ const atom = findChild(childRecords(notesContainer), RT_NotesAtom);
21
+ if (atom === void 0) throw new PptFormatError(`the NotesContainer at offset ${notesContainer.offset} has no NotesAtom, so the presentation slide its notes belong to is unstated`);
22
+ return readNotesAtom(atom);
23
+ }
24
+ function readNotesText(notesContainer) {
25
+ const drawing = findChild(childRecords(notesContainer), RT_Drawing);
26
+ if (drawing === void 0) return "";
27
+ const bodies = [];
28
+ for (const shape of readDrawingShapes(drawing)) {
29
+ if (shape.clientTextbox === void 0) continue;
30
+ const text = readTextBody(childRecords(shape.clientTextbox));
31
+ if (text === void 0 || text.length === 0) continue;
32
+ bodies.push(splitParagraphs(text).map((paragraph) => paragraph.text).join("\n"));
33
+ }
34
+ return bodies.join("\n");
35
+ }
36
+ //#endregion
37
+ export { NOTES_MASTER_SLIDE_ID_REF, readNotesAtom, readNotesContainerAtom, readNotesText };
@@ -0,0 +1,12 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_record_types = require("../record/types.cjs");
3
+ const require_record_write = require("../record/write.cjs");
4
+ //#region src/document/slide-list-write.ts
5
+ function writeSlidePersistAtom(ref) {
6
+ return require_record_write.writeAtom(require_record_types.RT_SlidePersistAtom, require_record_write.concatBytes(require_record_write.u32le(ref.persistIdRef), require_record_write.u32le(0), require_record_write.i32le(0), require_record_write.u32le(ref.slideId), require_record_write.u32le(0)));
7
+ }
8
+ function writeSlideListWithText(slides) {
9
+ return require_record_write.writeContainer(require_record_types.RT_SlideListWithText, slides.map(writeSlidePersistAtom), { recInstance: 0 });
10
+ }
11
+ //#endregion
12
+ exports.writeSlideListWithText = writeSlideListWithText;
@@ -0,0 +1,8 @@
1
+ //#region src/document/slide-list-write.d.ts
2
+ interface SlidePersistRef {
3
+ readonly persistIdRef: number;
4
+ readonly slideId: number;
5
+ }
6
+ declare function writeSlideListWithText(slides: readonly SlidePersistRef[]): Uint8Array<ArrayBuffer>;
7
+ //#endregion
8
+ export { SlidePersistRef, writeSlideListWithText };
@@ -0,0 +1,8 @@
1
+ //#region src/document/slide-list-write.d.ts
2
+ interface SlidePersistRef {
3
+ readonly persistIdRef: number;
4
+ readonly slideId: number;
5
+ }
6
+ declare function writeSlideListWithText(slides: readonly SlidePersistRef[]): Uint8Array<ArrayBuffer>;
7
+ //#endregion
8
+ export { SlidePersistRef, writeSlideListWithText };
@@ -0,0 +1,11 @@
1
+ import { RT_SlideListWithText, RT_SlidePersistAtom } from "../record/types.js";
2
+ import { concatBytes, i32le, u32le, writeAtom, writeContainer } from "../record/write.js";
3
+ //#region src/document/slide-list-write.ts
4
+ function writeSlidePersistAtom(ref) {
5
+ return writeAtom(RT_SlidePersistAtom, concatBytes(u32le(ref.persistIdRef), u32le(0), i32le(0), u32le(ref.slideId), u32le(0)));
6
+ }
7
+ function writeSlideListWithText(slides) {
8
+ return writeContainer(RT_SlideListWithText, slides.map(writeSlidePersistAtom), { recInstance: 0 });
9
+ }
10
+ //#endregion
11
+ export { writeSlideListWithText };
@@ -0,0 +1,60 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_record_types = require("../record/types.cjs");
3
+ const require_text_atoms = require("../text/atoms.cjs");
4
+ const require_units = require("../units.cjs");
5
+ const require_content_write = require("../content-write.cjs");
6
+ const require_record_write = require("../record/write.cjs");
7
+ const require_text_style_write = require("../text/style-write.cjs");
8
+ //#region src/drawing/shapes-write.ts
9
+ const PATRIARCH_SPID = 1;
10
+ const FIRST_CONTENT_SPID = 2;
11
+ function writeFsp(spid, flags) {
12
+ return require_record_write.writeAtom(require_record_types.OfficeArtFSP, require_record_write.concatBytes(require_record_write.u32le(spid), require_record_write.u32le(flags)), { recVer: 2 });
13
+ }
14
+ function writeClientAnchor(xPt, yPt, widthPt, heightPt) {
15
+ const left = require_units.pointsToMasterUnits(xPt);
16
+ const top = require_units.pointsToMasterUnits(yPt);
17
+ const right = require_units.pointsToMasterUnits(xPt + widthPt);
18
+ const bottom = require_units.pointsToMasterUnits(yPt + heightPt);
19
+ return require_record_write.writeAtom(require_record_types.OfficeArtClientAnchor, require_record_write.concatBytes(require_record_write.i32le(top), require_record_write.i32le(left), require_record_write.i32le(right), require_record_write.i32le(bottom)));
20
+ }
21
+ function writeTextCharsAtom(text) {
22
+ return require_record_write.writeAtom(require_record_types.RT_TextCharsAtom, require_record_write.utf16le(text));
23
+ }
24
+ function writeClientTextbox(shape, fontIndexOf) {
25
+ if (!shape.blocks.some((block) => block.kind === "paragraph")) return;
26
+ const { text, style } = require_content_write.buildTextBody(shape.blocks, fontIndexOf);
27
+ const totalParagraphCount = style.paragraphRuns.reduce((sum, run) => sum + run.count, 0);
28
+ if (totalParagraphCount !== require_text_atoms.characterCountOf(text)) throw new Error(`internal error: built ${totalParagraphCount} characters of paragraph runs for a ${require_text_atoms.characterCountOf(text)}-character text body`);
29
+ return require_record_write.writeContainer(require_record_types.OfficeArtClientTextbox, [
30
+ require_record_write.writeAtom(require_record_types.RT_TextHeaderAtom, require_record_write.u32le(4)),
31
+ writeTextCharsAtom(text),
32
+ require_text_style_write.writeStyleTextPropAtom(style)
33
+ ]);
34
+ }
35
+ function writeShape(spid, shape, fontIndexOf, clientData) {
36
+ const clientTextbox = writeClientTextbox(shape, fontIndexOf);
37
+ const children = [writeFsp(spid, 0), writeClientAnchor(shape.frame.xPt, shape.frame.yPt, shape.frame.widthPt, shape.frame.heightPt)];
38
+ if (clientData !== void 0) children.push(clientData);
39
+ if (clientTextbox !== void 0) children.push(clientTextbox);
40
+ return require_record_write.writeContainer(require_record_types.OfficeArtSpContainer, children);
41
+ }
42
+ function writePatriarch() {
43
+ return require_record_write.writeContainer(require_record_types.OfficeArtSpContainer, [require_record_write.writeAtom(require_record_types.OfficeArtFSPGR, /* @__PURE__ */ new Uint8Array(16), { recVer: 1 }), writeFsp(PATRIARCH_SPID, 5)]);
44
+ }
45
+ function writeDrawing(shapes, fontIndexOf) {
46
+ const shapeContainers = shapes.map((entry, index) => writeShape(FIRST_CONTENT_SPID + index, entry.shape, fontIndexOf, entry.clientData));
47
+ return require_record_write.writeContainer(require_record_types.RT_Drawing, [require_record_write.writeContainer(require_record_types.OfficeArtDgContainer, [require_record_write.writeContainer(require_record_types.OfficeArtSpgrContainer, [writePatriarch(), ...shapeContainers])])]);
48
+ }
49
+ function writeSlideDrawing(shapes, fontIndexOf) {
50
+ return writeDrawing(shapes.map((shape) => ({
51
+ shape,
52
+ clientData: void 0
53
+ })), fontIndexOf);
54
+ }
55
+ function writeDrawingWithClientData(shapes, fontIndexOf) {
56
+ return writeDrawing(shapes, fontIndexOf);
57
+ }
58
+ //#endregion
59
+ exports.writeDrawingWithClientData = writeDrawingWithClientData;
60
+ exports.writeSlideDrawing = writeSlideDrawing;
@@ -0,0 +1,10 @@
1
+ import { ContentShape } from "document-schema.js";
2
+ //#region src/drawing/shapes-write.d.ts
3
+ interface DrawingShape {
4
+ readonly shape: ContentShape;
5
+ readonly clientData: Uint8Array<ArrayBuffer> | undefined;
6
+ }
7
+ declare function writeSlideDrawing(shapes: readonly ContentShape[], fontIndexOf: (family: string) => number): Uint8Array<ArrayBuffer>;
8
+ declare function writeDrawingWithClientData(shapes: readonly DrawingShape[], fontIndexOf: (family: string) => number): Uint8Array<ArrayBuffer>;
9
+ //#endregion
10
+ export { DrawingShape, writeDrawingWithClientData, writeSlideDrawing };
@@ -0,0 +1,10 @@
1
+ import { ContentShape } from "document-schema.js";
2
+ //#region src/drawing/shapes-write.d.ts
3
+ interface DrawingShape {
4
+ readonly shape: ContentShape;
5
+ readonly clientData: Uint8Array<ArrayBuffer> | undefined;
6
+ }
7
+ declare function writeSlideDrawing(shapes: readonly ContentShape[], fontIndexOf: (family: string) => number): Uint8Array<ArrayBuffer>;
8
+ declare function writeDrawingWithClientData(shapes: readonly DrawingShape[], fontIndexOf: (family: string) => number): Uint8Array<ArrayBuffer>;
9
+ //#endregion
10
+ export { DrawingShape, writeDrawingWithClientData, writeSlideDrawing };
@@ -0,0 +1,58 @@
1
+ import { OfficeArtClientAnchor, OfficeArtClientTextbox, OfficeArtDgContainer, OfficeArtFSP, OfficeArtFSPGR, OfficeArtSpContainer, OfficeArtSpgrContainer, RT_Drawing, RT_TextCharsAtom, RT_TextHeaderAtom } from "../record/types.js";
2
+ import { characterCountOf } from "../text/atoms.js";
3
+ import { pointsToMasterUnits } from "../units.js";
4
+ import { buildTextBody } from "../content-write.js";
5
+ import { concatBytes, i32le, u32le, utf16le, writeAtom, writeContainer } from "../record/write.js";
6
+ import { writeStyleTextPropAtom } from "../text/style-write.js";
7
+ //#region src/drawing/shapes-write.ts
8
+ const PATRIARCH_SPID = 1;
9
+ const FIRST_CONTENT_SPID = 2;
10
+ function writeFsp(spid, flags) {
11
+ return writeAtom(OfficeArtFSP, concatBytes(u32le(spid), u32le(flags)), { recVer: 2 });
12
+ }
13
+ function writeClientAnchor(xPt, yPt, widthPt, heightPt) {
14
+ const left = pointsToMasterUnits(xPt);
15
+ const top = pointsToMasterUnits(yPt);
16
+ const right = pointsToMasterUnits(xPt + widthPt);
17
+ const bottom = pointsToMasterUnits(yPt + heightPt);
18
+ return writeAtom(OfficeArtClientAnchor, concatBytes(i32le(top), i32le(left), i32le(right), i32le(bottom)));
19
+ }
20
+ function writeTextCharsAtom(text) {
21
+ return writeAtom(RT_TextCharsAtom, utf16le(text));
22
+ }
23
+ function writeClientTextbox(shape, fontIndexOf) {
24
+ if (!shape.blocks.some((block) => block.kind === "paragraph")) return;
25
+ const { text, style } = buildTextBody(shape.blocks, fontIndexOf);
26
+ const totalParagraphCount = style.paragraphRuns.reduce((sum, run) => sum + run.count, 0);
27
+ if (totalParagraphCount !== characterCountOf(text)) throw new Error(`internal error: built ${totalParagraphCount} characters of paragraph runs for a ${characterCountOf(text)}-character text body`);
28
+ return writeContainer(OfficeArtClientTextbox, [
29
+ writeAtom(RT_TextHeaderAtom, u32le(4)),
30
+ writeTextCharsAtom(text),
31
+ writeStyleTextPropAtom(style)
32
+ ]);
33
+ }
34
+ function writeShape(spid, shape, fontIndexOf, clientData) {
35
+ const clientTextbox = writeClientTextbox(shape, fontIndexOf);
36
+ const children = [writeFsp(spid, 0), writeClientAnchor(shape.frame.xPt, shape.frame.yPt, shape.frame.widthPt, shape.frame.heightPt)];
37
+ if (clientData !== void 0) children.push(clientData);
38
+ if (clientTextbox !== void 0) children.push(clientTextbox);
39
+ return writeContainer(OfficeArtSpContainer, children);
40
+ }
41
+ function writePatriarch() {
42
+ return writeContainer(OfficeArtSpContainer, [writeAtom(OfficeArtFSPGR, /* @__PURE__ */ new Uint8Array(16), { recVer: 1 }), writeFsp(PATRIARCH_SPID, 5)]);
43
+ }
44
+ function writeDrawing(shapes, fontIndexOf) {
45
+ const shapeContainers = shapes.map((entry, index) => writeShape(FIRST_CONTENT_SPID + index, entry.shape, fontIndexOf, entry.clientData));
46
+ return writeContainer(RT_Drawing, [writeContainer(OfficeArtDgContainer, [writeContainer(OfficeArtSpgrContainer, [writePatriarch(), ...shapeContainers])])]);
47
+ }
48
+ function writeSlideDrawing(shapes, fontIndexOf) {
49
+ return writeDrawing(shapes.map((shape) => ({
50
+ shape,
51
+ clientData: void 0
52
+ })), fontIndexOf);
53
+ }
54
+ function writeDrawingWithClientData(shapes, fontIndexOf) {
55
+ return writeDrawing(shapes, fontIndexOf);
56
+ }
57
+ //#endregion
58
+ export { writeDrawingWithClientData, writeSlideDrawing };
package/dist/errors.cjs CHANGED
@@ -12,6 +12,13 @@ var PptEncryptedError = class extends Error {
12
12
  this.name = "PptEncryptedError";
13
13
  }
14
14
  };
15
+ var PptUnsupportedContentError = class extends Error {
16
+ constructor(message) {
17
+ super(message);
18
+ this.name = "PptUnsupportedContentError";
19
+ }
20
+ };
15
21
  //#endregion
16
22
  exports.PptEncryptedError = PptEncryptedError;
17
23
  exports.PptFormatError = PptFormatError;
24
+ exports.PptUnsupportedContentError = PptUnsupportedContentError;
package/dist/errors.d.cts CHANGED
@@ -5,5 +5,8 @@ declare class PptFormatError extends Error {
5
5
  declare class PptEncryptedError extends Error {
6
6
  constructor(message: string);
7
7
  }
8
+ declare class PptUnsupportedContentError extends Error {
9
+ constructor(message: string);
10
+ }
8
11
  //#endregion
9
- export { PptEncryptedError, PptFormatError };
12
+ export { PptEncryptedError, PptFormatError, PptUnsupportedContentError };
package/dist/errors.d.ts CHANGED
@@ -5,5 +5,8 @@ declare class PptFormatError extends Error {
5
5
  declare class PptEncryptedError extends Error {
6
6
  constructor(message: string);
7
7
  }
8
+ declare class PptUnsupportedContentError extends Error {
9
+ constructor(message: string);
10
+ }
8
11
  //#endregion
9
- export { PptEncryptedError, PptFormatError };
12
+ export { PptEncryptedError, PptFormatError, PptUnsupportedContentError };
package/dist/errors.js CHANGED
@@ -11,5 +11,11 @@ var PptEncryptedError = class extends Error {
11
11
  this.name = "PptEncryptedError";
12
12
  }
13
13
  };
14
+ var PptUnsupportedContentError = class extends Error {
15
+ constructor(message) {
16
+ super(message);
17
+ this.name = "PptUnsupportedContentError";
18
+ }
19
+ };
14
20
  //#endregion
15
- export { PptEncryptedError, PptFormatError };
21
+ export { PptEncryptedError, PptFormatError, PptUnsupportedContentError };