ppt-codec 0.0.0 → 1.0.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/LICENSE +21 -0
  2. package/README.md +174 -0
  3. package/dist/content.cjs +72 -0
  4. package/dist/content.d.cts +6 -0
  5. package/dist/content.d.ts +6 -0
  6. package/dist/content.js +71 -0
  7. package/dist/document/document-atom.cjs +27 -0
  8. package/dist/document/document-atom.d.cts +17 -0
  9. package/dist/document/document-atom.d.ts +17 -0
  10. package/dist/document/document-atom.js +26 -0
  11. package/dist/document/fonts.cjs +29 -0
  12. package/dist/document/fonts.d.cts +5 -0
  13. package/dist/document/fonts.d.ts +5 -0
  14. package/dist/document/fonts.js +28 -0
  15. package/dist/document/slide-list.cjs +40 -0
  16. package/dist/document/slide-list.d.cts +14 -0
  17. package/dist/document/slide-list.d.ts +14 -0
  18. package/dist/document/slide-list.js +39 -0
  19. package/dist/drawing/shapes.cjs +109 -0
  20. package/dist/drawing/shapes.d.cts +16 -0
  21. package/dist/drawing/shapes.d.ts +16 -0
  22. package/dist/drawing/shapes.js +108 -0
  23. package/dist/errors.cjs +17 -0
  24. package/dist/errors.d.cts +9 -0
  25. package/dist/errors.d.ts +9 -0
  26. package/dist/errors.js +15 -0
  27. package/dist/header-C5eAd16_.d.cts +13 -0
  28. package/dist/header-C5eAd16_.d.ts +13 -0
  29. package/dist/index.cjs +112 -0
  30. package/dist/index.d.cts +16 -0
  31. package/dist/index.d.ts +16 -0
  32. package/dist/index.js +16 -0
  33. package/dist/read.cjs +119 -0
  34. package/dist/read.d.cts +13 -0
  35. package/dist/read.d.ts +13 -0
  36. package/dist/read.js +114 -0
  37. package/dist/record/header.cjs +25 -0
  38. package/dist/record/header.d.cts +2 -0
  39. package/dist/record/header.d.ts +2 -0
  40. package/dist/record/header.js +21 -0
  41. package/dist/record/tree.cjs +55 -0
  42. package/dist/record/tree.d.cts +2 -0
  43. package/dist/record/tree.d.ts +2 -0
  44. package/dist/record/tree.js +49 -0
  45. package/dist/record/types.cjs +87 -0
  46. package/dist/record/types.d.cts +45 -0
  47. package/dist/record/types.d.ts +45 -0
  48. package/dist/record/types.js +45 -0
  49. package/dist/stream/current-user.cjs +49 -0
  50. package/dist/stream/current-user.d.cts +11 -0
  51. package/dist/stream/current-user.d.ts +11 -0
  52. package/dist/stream/current-user.js +46 -0
  53. package/dist/stream/persist.cjs +71 -0
  54. package/dist/stream/persist.d.cts +20 -0
  55. package/dist/stream/persist.d.ts +20 -0
  56. package/dist/stream/persist.js +67 -0
  57. package/dist/text/atoms.cjs +70 -0
  58. package/dist/text/atoms.d.cts +22 -0
  59. package/dist/text/atoms.d.ts +22 -0
  60. package/dist/text/atoms.js +56 -0
  61. package/dist/text/style.cjs +173 -0
  62. package/dist/text/style.d.cts +39 -0
  63. package/dist/text/style.d.ts +39 -0
  64. package/dist/text/style.js +165 -0
  65. package/dist/tree-Du_LXAF0.d.cts +17 -0
  66. package/dist/tree-PMcPNgd-.d.ts +17 -0
  67. package/dist/units.cjs +12 -0
  68. package/dist/units.d.cts +6 -0
  69. package/dist/units.d.ts +6 -0
  70. package/dist/units.js +9 -0
  71. package/package.json +93 -2
package/dist/read.cjs ADDED
@@ -0,0 +1,119 @@
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_text_style = require("./text/style.cjs");
7
+ const require_content = require("./content.cjs");
8
+ const require_document_document_atom = require("./document/document-atom.cjs");
9
+ const require_document_fonts = require("./document/fonts.cjs");
10
+ const require_document_slide_list = require("./document/slide-list.cjs");
11
+ const require_drawing_shapes = require("./drawing/shapes.cjs");
12
+ const require_stream_current_user = require("./stream/current-user.cjs");
13
+ const require_stream_persist = require("./stream/persist.cjs");
14
+ const require_units = require("./units.cjs");
15
+ let archive_codec = require("archive-codec");
16
+ let document_schema_js = require("document-schema.js");
17
+ //#region src/read.ts
18
+ const CURRENT_USER_STREAM = "Current User";
19
+ const POWERPOINT_DOCUMENT_STREAM = "PowerPoint Document";
20
+ const DEFAULT_INSET_LEFT_RIGHT_PT = 7.2;
21
+ const DEFAULT_INSET_TOP_BOTTOM_PT = 3.6;
22
+ const NO_STYLE = {
23
+ paragraphRuns: [],
24
+ characterRuns: []
25
+ };
26
+ function requireStream(streams, name) {
27
+ const stream = streams.find((candidate) => candidate.path === name);
28
+ if (stream === void 0) throw new require_errors.PptFormatError(`compound file has no "${name}" stream, which [MS-PPT] requires of every PowerPoint binary document`);
29
+ return stream.bytes;
30
+ }
31
+ function textRecordsFor(clientTextbox, persist) {
32
+ const children = require_record_tree.childRecords(clientTextbox);
33
+ const outlineRef = require_record_tree.findChild(children, require_record_types.RT_OutlineTextRefAtom);
34
+ if (outlineRef === void 0) return children;
35
+ if (outlineRef.data.length < 4) throw new require_errors.PptFormatError(`OutlineTextRefAtom at offset ${outlineRef.offset} carries ${outlineRef.data.length} bytes, fewer than the 4 its index field needs`);
36
+ const index = new DataView(outlineRef.data.buffer, outlineRef.data.byteOffset, outlineRef.data.byteLength).getInt32(0, true);
37
+ const outlineText = persist.texts[index];
38
+ if (outlineText === void 0) throw new require_errors.PptFormatError(`OutlineTextRefAtom references text ${index} of slide ${persist.slideId}, which has only ${persist.texts.length} texts in the slide list`);
39
+ return outlineText.records;
40
+ }
41
+ function blocksFor(clientTextbox, persist, fontNames) {
42
+ if (clientTextbox === void 0) return [];
43
+ const records = textRecordsFor(clientTextbox, persist);
44
+ const text = require_text_atoms.readTextBody(records);
45
+ if (text === void 0) return [];
46
+ const styleRecord = require_record_tree.findChild(records, require_record_types.RT_StyleTextPropAtom);
47
+ const style = styleRecord === void 0 ? NO_STYLE : require_text_style.readStyleTextPropAtom(styleRecord, require_text_atoms.characterCountOf(text));
48
+ return require_content.buildParagraphs(text, style, fontNames);
49
+ }
50
+ function readSlide(streamBytes, directory, persist, size, fontNames) {
51
+ const slideContainer = require_stream_persist.resolvePersistObject(streamBytes, directory, persist.persistIdRef, `SlidePersistAtom for slide ${persist.slideId}`);
52
+ if (slideContainer.header.recType !== 1006) throw new require_errors.PptFormatError(`persist object ${persist.persistIdRef} is record type 0x${slideContainer.header.recType.toString(16)}, not the RT_Slide (0x${require_record_types.RT_Slide.toString(16)}) its SlidePersistAtom promised`);
53
+ const drawing = require_record_tree.findChild(require_record_tree.childRecords(slideContainer), require_record_types.RT_Drawing);
54
+ const shapes = [];
55
+ for (const shape of drawing === void 0 ? [] : require_drawing_shapes.readDrawingShapes(drawing)) {
56
+ if (shape.anchor === void 0) continue;
57
+ const left = require_units.masterUnitsToPoints(shape.anchor.left);
58
+ const top = require_units.masterUnitsToPoints(shape.anchor.top);
59
+ shapes.push({
60
+ frame: {
61
+ xPt: left,
62
+ yPt: top,
63
+ widthPt: Math.max(0, require_units.masterUnitsToPoints(shape.anchor.right) - left),
64
+ heightPt: Math.max(0, require_units.masterUnitsToPoints(shape.anchor.bottom) - top)
65
+ },
66
+ insetLeftPt: DEFAULT_INSET_LEFT_RIGHT_PT,
67
+ insetTopPt: DEFAULT_INSET_TOP_BOTTOM_PT,
68
+ insetRightPt: DEFAULT_INSET_LEFT_RIGHT_PT,
69
+ insetBottomPt: DEFAULT_INSET_TOP_BOTTOM_PT,
70
+ blocks: blocksFor(shape.clientTextbox, persist, fontNames)
71
+ });
72
+ }
73
+ return {
74
+ size,
75
+ shapes,
76
+ notes: ""
77
+ };
78
+ }
79
+ function readPptStreams(currentUserStream, powerPointDocumentStream) {
80
+ const currentUser = require_stream_current_user.readCurrentUserAtom(currentUserStream);
81
+ if (currentUser.encrypted) throw new require_errors.PptEncryptedError("the CurrentUserAtom's headerToken marks this document as encrypted, and this package does not implement [MS-PPT]'s encryption");
82
+ const { directory, currentEdit } = require_stream_persist.buildPersistDirectory(powerPointDocumentStream, currentUser.offsetToCurrentEdit);
83
+ const documentContainer = require_stream_persist.resolvePersistObject(powerPointDocumentStream, directory, currentEdit.docPersistIdRef, "UserEditAtom.docPersistIdRef");
84
+ if (documentContainer.header.recType !== 1e3) throw new require_errors.PptFormatError(`the document persist object is record type 0x${documentContainer.header.recType.toString(16)}, not RT_Document (0x${require_record_types.RT_Document.toString(16)})`);
85
+ const children = require_record_tree.childRecords(documentContainer);
86
+ const documentAtomRecord = require_record_tree.findChild(children, require_record_types.RT_DocumentAtom);
87
+ if (documentAtomRecord === void 0) throw new require_errors.PptFormatError("the DocumentContainer has no DocumentAtom, so the presentation's slide size is unknown");
88
+ const documentAtom = require_document_document_atom.readDocumentAtom(documentAtomRecord);
89
+ const size = {
90
+ widthPt: require_units.masterUnitsToPoints(documentAtom.slideSize.x),
91
+ heightPt: require_units.masterUnitsToPoints(documentAtom.slideSize.y)
92
+ };
93
+ const environment = require_record_tree.findChild(children, require_record_types.RT_Environment);
94
+ const fontNames = environment === void 0 ? [] : require_document_fonts.readFontNames(environment);
95
+ const slideList = children.find((record) => record.header.recType === 4080 && record.header.recInstance === 0);
96
+ return {
97
+ metadata: {},
98
+ slides: (slideList === void 0 ? [] : require_document_slide_list.readSlideListWithText(slideList)).map((persist) => readSlide(powerPointDocumentStream, directory, persist, size, fontNames))
99
+ };
100
+ }
101
+ function readPptContent(bytes) {
102
+ const streams = (0, archive_codec.readCompoundFile)(bytes);
103
+ return readPptStreams(requireStream(streams, CURRENT_USER_STREAM), requireStream(streams, POWERPOINT_DOCUMENT_STREAM));
104
+ }
105
+ function readPpt(bytes) {
106
+ const { metadata, slides } = readPptContent(bytes);
107
+ const document = {
108
+ kind: "presentation",
109
+ metadata,
110
+ slides: [...slides]
111
+ };
112
+ return (0, document_schema_js.assembleTree)(document);
113
+ }
114
+ //#endregion
115
+ exports.CURRENT_USER_STREAM = CURRENT_USER_STREAM;
116
+ exports.POWERPOINT_DOCUMENT_STREAM = POWERPOINT_DOCUMENT_STREAM;
117
+ exports.readPpt = readPpt;
118
+ exports.readPptContent = readPptContent;
119
+ exports.readPptStreams = readPptStreams;
@@ -0,0 +1,13 @@
1
+ import { ContentSlide, DocumentTree, LayoutMetadata } from "document-schema.js";
2
+ //#region src/read.d.ts
3
+ declare const CURRENT_USER_STREAM = "Current User";
4
+ declare const POWERPOINT_DOCUMENT_STREAM = "PowerPoint Document";
5
+ interface PptDocument {
6
+ readonly metadata: LayoutMetadata;
7
+ readonly slides: readonly ContentSlide[];
8
+ }
9
+ declare function readPptStreams(currentUserStream: Uint8Array<ArrayBuffer>, powerPointDocumentStream: Uint8Array<ArrayBuffer>): PptDocument;
10
+ declare function readPptContent(bytes: Uint8Array<ArrayBuffer>): PptDocument;
11
+ declare function readPpt(bytes: Uint8Array<ArrayBuffer>): DocumentTree;
12
+ //#endregion
13
+ export { CURRENT_USER_STREAM, POWERPOINT_DOCUMENT_STREAM, PptDocument, readPpt, readPptContent, readPptStreams };
package/dist/read.d.ts ADDED
@@ -0,0 +1,13 @@
1
+ import { ContentSlide, DocumentTree, LayoutMetadata } from "document-schema.js";
2
+ //#region src/read.d.ts
3
+ declare const CURRENT_USER_STREAM = "Current User";
4
+ declare const POWERPOINT_DOCUMENT_STREAM = "PowerPoint Document";
5
+ interface PptDocument {
6
+ readonly metadata: LayoutMetadata;
7
+ readonly slides: readonly ContentSlide[];
8
+ }
9
+ declare function readPptStreams(currentUserStream: Uint8Array<ArrayBuffer>, powerPointDocumentStream: Uint8Array<ArrayBuffer>): PptDocument;
10
+ declare function readPptContent(bytes: Uint8Array<ArrayBuffer>): PptDocument;
11
+ declare function readPpt(bytes: Uint8Array<ArrayBuffer>): DocumentTree;
12
+ //#endregion
13
+ export { CURRENT_USER_STREAM, POWERPOINT_DOCUMENT_STREAM, PptDocument, readPpt, readPptContent, readPptStreams };
package/dist/read.js ADDED
@@ -0,0 +1,114 @@
1
+ import { PptEncryptedError, PptFormatError } from "./errors.js";
2
+ import { childRecords, findChild } from "./record/tree.js";
3
+ import { RT_Document, RT_DocumentAtom, RT_Drawing, RT_Environment, RT_OutlineTextRefAtom, RT_Slide, RT_StyleTextPropAtom } from "./record/types.js";
4
+ import { characterCountOf, readTextBody } from "./text/atoms.js";
5
+ import { readStyleTextPropAtom } from "./text/style.js";
6
+ import { buildParagraphs } from "./content.js";
7
+ import { readDocumentAtom } from "./document/document-atom.js";
8
+ import { readFontNames } from "./document/fonts.js";
9
+ import { readSlideListWithText } from "./document/slide-list.js";
10
+ import { readDrawingShapes } from "./drawing/shapes.js";
11
+ import { readCurrentUserAtom } from "./stream/current-user.js";
12
+ import { buildPersistDirectory, resolvePersistObject } from "./stream/persist.js";
13
+ import { masterUnitsToPoints } from "./units.js";
14
+ import { readCompoundFile } from "archive-codec";
15
+ import { assembleTree } from "document-schema.js";
16
+ //#region src/read.ts
17
+ const CURRENT_USER_STREAM = "Current User";
18
+ const POWERPOINT_DOCUMENT_STREAM = "PowerPoint Document";
19
+ const DEFAULT_INSET_LEFT_RIGHT_PT = 7.2;
20
+ const DEFAULT_INSET_TOP_BOTTOM_PT = 3.6;
21
+ const NO_STYLE = {
22
+ paragraphRuns: [],
23
+ characterRuns: []
24
+ };
25
+ function requireStream(streams, name) {
26
+ const stream = streams.find((candidate) => candidate.path === name);
27
+ if (stream === void 0) throw new PptFormatError(`compound file has no "${name}" stream, which [MS-PPT] requires of every PowerPoint binary document`);
28
+ return stream.bytes;
29
+ }
30
+ function textRecordsFor(clientTextbox, persist) {
31
+ const children = childRecords(clientTextbox);
32
+ const outlineRef = findChild(children, RT_OutlineTextRefAtom);
33
+ if (outlineRef === void 0) return children;
34
+ if (outlineRef.data.length < 4) throw new PptFormatError(`OutlineTextRefAtom at offset ${outlineRef.offset} carries ${outlineRef.data.length} bytes, fewer than the 4 its index field needs`);
35
+ const index = new DataView(outlineRef.data.buffer, outlineRef.data.byteOffset, outlineRef.data.byteLength).getInt32(0, true);
36
+ const outlineText = persist.texts[index];
37
+ if (outlineText === void 0) throw new PptFormatError(`OutlineTextRefAtom references text ${index} of slide ${persist.slideId}, which has only ${persist.texts.length} texts in the slide list`);
38
+ return outlineText.records;
39
+ }
40
+ function blocksFor(clientTextbox, persist, fontNames) {
41
+ if (clientTextbox === void 0) return [];
42
+ const records = textRecordsFor(clientTextbox, persist);
43
+ const text = readTextBody(records);
44
+ if (text === void 0) return [];
45
+ const styleRecord = findChild(records, RT_StyleTextPropAtom);
46
+ const style = styleRecord === void 0 ? NO_STYLE : readStyleTextPropAtom(styleRecord, characterCountOf(text));
47
+ return buildParagraphs(text, style, fontNames);
48
+ }
49
+ function readSlide(streamBytes, directory, persist, size, fontNames) {
50
+ const slideContainer = resolvePersistObject(streamBytes, directory, persist.persistIdRef, `SlidePersistAtom for slide ${persist.slideId}`);
51
+ if (slideContainer.header.recType !== 1006) throw new PptFormatError(`persist object ${persist.persistIdRef} is record type 0x${slideContainer.header.recType.toString(16)}, not the RT_Slide (0x${RT_Slide.toString(16)}) its SlidePersistAtom promised`);
52
+ const drawing = findChild(childRecords(slideContainer), RT_Drawing);
53
+ const shapes = [];
54
+ for (const shape of drawing === void 0 ? [] : readDrawingShapes(drawing)) {
55
+ if (shape.anchor === void 0) continue;
56
+ const left = masterUnitsToPoints(shape.anchor.left);
57
+ const top = masterUnitsToPoints(shape.anchor.top);
58
+ shapes.push({
59
+ frame: {
60
+ xPt: left,
61
+ yPt: top,
62
+ widthPt: Math.max(0, masterUnitsToPoints(shape.anchor.right) - left),
63
+ heightPt: Math.max(0, masterUnitsToPoints(shape.anchor.bottom) - top)
64
+ },
65
+ insetLeftPt: DEFAULT_INSET_LEFT_RIGHT_PT,
66
+ insetTopPt: DEFAULT_INSET_TOP_BOTTOM_PT,
67
+ insetRightPt: DEFAULT_INSET_LEFT_RIGHT_PT,
68
+ insetBottomPt: DEFAULT_INSET_TOP_BOTTOM_PT,
69
+ blocks: blocksFor(shape.clientTextbox, persist, fontNames)
70
+ });
71
+ }
72
+ return {
73
+ size,
74
+ shapes,
75
+ notes: ""
76
+ };
77
+ }
78
+ function readPptStreams(currentUserStream, powerPointDocumentStream) {
79
+ const currentUser = readCurrentUserAtom(currentUserStream);
80
+ if (currentUser.encrypted) throw new PptEncryptedError("the CurrentUserAtom's headerToken marks this document as encrypted, and this package does not implement [MS-PPT]'s encryption");
81
+ const { directory, currentEdit } = buildPersistDirectory(powerPointDocumentStream, currentUser.offsetToCurrentEdit);
82
+ const documentContainer = resolvePersistObject(powerPointDocumentStream, directory, currentEdit.docPersistIdRef, "UserEditAtom.docPersistIdRef");
83
+ if (documentContainer.header.recType !== 1e3) throw new PptFormatError(`the document persist object is record type 0x${documentContainer.header.recType.toString(16)}, not RT_Document (0x${RT_Document.toString(16)})`);
84
+ const children = childRecords(documentContainer);
85
+ const documentAtomRecord = findChild(children, RT_DocumentAtom);
86
+ if (documentAtomRecord === void 0) throw new PptFormatError("the DocumentContainer has no DocumentAtom, so the presentation's slide size is unknown");
87
+ const documentAtom = readDocumentAtom(documentAtomRecord);
88
+ const size = {
89
+ widthPt: masterUnitsToPoints(documentAtom.slideSize.x),
90
+ heightPt: masterUnitsToPoints(documentAtom.slideSize.y)
91
+ };
92
+ const environment = findChild(children, RT_Environment);
93
+ const fontNames = environment === void 0 ? [] : readFontNames(environment);
94
+ const slideList = children.find((record) => record.header.recType === 4080 && record.header.recInstance === 0);
95
+ return {
96
+ metadata: {},
97
+ slides: (slideList === void 0 ? [] : readSlideListWithText(slideList)).map((persist) => readSlide(powerPointDocumentStream, directory, persist, size, fontNames))
98
+ };
99
+ }
100
+ function readPptContent(bytes) {
101
+ const streams = readCompoundFile(bytes);
102
+ return readPptStreams(requireStream(streams, CURRENT_USER_STREAM), requireStream(streams, POWERPOINT_DOCUMENT_STREAM));
103
+ }
104
+ function readPpt(bytes) {
105
+ const { metadata, slides } = readPptContent(bytes);
106
+ const document = {
107
+ kind: "presentation",
108
+ metadata,
109
+ slides: [...slides]
110
+ };
111
+ return assembleTree(document);
112
+ }
113
+ //#endregion
114
+ export { CURRENT_USER_STREAM, POWERPOINT_DOCUMENT_STREAM, readPpt, readPptContent, readPptStreams };
@@ -0,0 +1,25 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_errors = require("../errors.cjs");
3
+ //#region src/record/header.ts
4
+ const RECORD_HEADER_SIZE = 8;
5
+ const CONTAINER_REC_VER = 15;
6
+ function readRecordHeader(bytes, offset) {
7
+ if (offset < 0) throw new require_errors.PptFormatError(`record header offset ${offset} is negative; a record cannot begin before the start of its stream`);
8
+ if (offset + 8 > bytes.length) throw new require_errors.PptFormatError(`record header at offset ${offset} needs 8 bytes but only ${bytes.length - offset} remain`);
9
+ const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
10
+ const versionAndInstance = view.getUint16(offset, true);
11
+ return {
12
+ recVer: versionAndInstance & 15,
13
+ recInstance: versionAndInstance >> 4 & 4095,
14
+ recType: view.getUint16(offset + 2, true),
15
+ recLen: view.getUint32(offset + 4, true)
16
+ };
17
+ }
18
+ function isContainerRecord(header) {
19
+ return header.recVer === 15;
20
+ }
21
+ //#endregion
22
+ exports.CONTAINER_REC_VER = CONTAINER_REC_VER;
23
+ exports.RECORD_HEADER_SIZE = RECORD_HEADER_SIZE;
24
+ exports.isContainerRecord = isContainerRecord;
25
+ exports.readRecordHeader = readRecordHeader;
@@ -0,0 +1,2 @@
1
+ import { a as readRecordHeader, i as isContainerRecord, n as RECORD_HEADER_SIZE, r as RecordHeader, t as CONTAINER_REC_VER } from "../header-C5eAd16_.cjs";
2
+ export { CONTAINER_REC_VER, RECORD_HEADER_SIZE, RecordHeader, isContainerRecord, readRecordHeader };
@@ -0,0 +1,2 @@
1
+ import { a as readRecordHeader, i as isContainerRecord, n as RECORD_HEADER_SIZE, r as RecordHeader, t as CONTAINER_REC_VER } from "../header-C5eAd16_.js";
2
+ export { CONTAINER_REC_VER, RECORD_HEADER_SIZE, RecordHeader, isContainerRecord, readRecordHeader };
@@ -0,0 +1,21 @@
1
+ import { PptFormatError } from "../errors.js";
2
+ //#region src/record/header.ts
3
+ const RECORD_HEADER_SIZE = 8;
4
+ const CONTAINER_REC_VER = 15;
5
+ function readRecordHeader(bytes, offset) {
6
+ if (offset < 0) throw new PptFormatError(`record header offset ${offset} is negative; a record cannot begin before the start of its stream`);
7
+ if (offset + 8 > bytes.length) throw new PptFormatError(`record header at offset ${offset} needs 8 bytes but only ${bytes.length - offset} remain`);
8
+ const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
9
+ const versionAndInstance = view.getUint16(offset, true);
10
+ return {
11
+ recVer: versionAndInstance & 15,
12
+ recInstance: versionAndInstance >> 4 & 4095,
13
+ recType: view.getUint16(offset + 2, true),
14
+ recLen: view.getUint32(offset + 4, true)
15
+ };
16
+ }
17
+ function isContainerRecord(header) {
18
+ return header.recVer === 15;
19
+ }
20
+ //#endregion
21
+ export { CONTAINER_REC_VER, RECORD_HEADER_SIZE, isContainerRecord, readRecordHeader };
@@ -0,0 +1,55 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_errors = require("../errors.cjs");
3
+ const require_record_header = require("./header.cjs");
4
+ //#region src/record/tree.ts
5
+ function readRecordAt(bytes, offset) {
6
+ const header = require_record_header.readRecordHeader(bytes, offset);
7
+ const dataOffset = offset + 8;
8
+ const end = dataOffset + header.recLen;
9
+ if (end > bytes.length) throw new require_errors.PptFormatError(`record 0x${header.recType.toString(16)} at offset ${offset} declares ${header.recLen} bytes of data but only ${bytes.length - dataOffset} remain in the stream`);
10
+ return {
11
+ header,
12
+ offset,
13
+ dataOffset,
14
+ data: bytes.subarray(dataOffset, end),
15
+ stream: bytes
16
+ };
17
+ }
18
+ function readRecordSequence(bytes, start, end) {
19
+ const records = [];
20
+ let at = start;
21
+ while (at < end) {
22
+ if (at + 8 > end) throw new require_errors.PptFormatError(`record sequence ending at ${end} has a trailing ${end - at}-byte fragment, too short for the 8-byte record header`);
23
+ const record = readRecordAt(bytes, at);
24
+ const recordEnd = record.dataOffset + record.header.recLen;
25
+ if (recordEnd > end) throw new require_errors.PptFormatError(`record 0x${record.header.recType.toString(16)} at offset ${at} ends at ${recordEnd}, past the ${end} its container allows`);
26
+ records.push(record);
27
+ at = recordEnd;
28
+ }
29
+ return records;
30
+ }
31
+ function childRecords(record) {
32
+ if (!require_record_header.isContainerRecord(record.header)) return [];
33
+ return readRecordSequence(record.stream, record.dataOffset, record.dataOffset + record.header.recLen);
34
+ }
35
+ function findChild(records, recType) {
36
+ return records.find((record) => record.header.recType === recType);
37
+ }
38
+ function findChildren(records, recType) {
39
+ return records.filter((record) => record.header.recType === recType);
40
+ }
41
+ function findDescendants(root, recType) {
42
+ const found = [];
43
+ for (const child of childRecords(root)) {
44
+ if (child.header.recType === recType) found.push(child);
45
+ found.push(...findDescendants(child, recType));
46
+ }
47
+ return found;
48
+ }
49
+ //#endregion
50
+ exports.childRecords = childRecords;
51
+ exports.findChild = findChild;
52
+ exports.findChildren = findChildren;
53
+ exports.findDescendants = findDescendants;
54
+ exports.readRecordAt = readRecordAt;
55
+ exports.readRecordSequence = readRecordSequence;
@@ -0,0 +1,2 @@
1
+ import { a as findDescendants, i as findChildren, n as childRecords, o as readRecordAt, r as findChild, s as readRecordSequence, t as PptRecord } from "../tree-Du_LXAF0.cjs";
2
+ export { PptRecord, childRecords, findChild, findChildren, findDescendants, readRecordAt, readRecordSequence };
@@ -0,0 +1,2 @@
1
+ import { a as findDescendants, i as findChildren, n as childRecords, o as readRecordAt, r as findChild, s as readRecordSequence, t as PptRecord } from "../tree-PMcPNgd-.js";
2
+ export { PptRecord, childRecords, findChild, findChildren, findDescendants, readRecordAt, readRecordSequence };
@@ -0,0 +1,49 @@
1
+ import { PptFormatError } from "../errors.js";
2
+ import { isContainerRecord, readRecordHeader } from "./header.js";
3
+ //#region src/record/tree.ts
4
+ function readRecordAt(bytes, offset) {
5
+ const header = readRecordHeader(bytes, offset);
6
+ const dataOffset = offset + 8;
7
+ const end = dataOffset + header.recLen;
8
+ if (end > bytes.length) throw new PptFormatError(`record 0x${header.recType.toString(16)} at offset ${offset} declares ${header.recLen} bytes of data but only ${bytes.length - dataOffset} remain in the stream`);
9
+ return {
10
+ header,
11
+ offset,
12
+ dataOffset,
13
+ data: bytes.subarray(dataOffset, end),
14
+ stream: bytes
15
+ };
16
+ }
17
+ function readRecordSequence(bytes, start, end) {
18
+ const records = [];
19
+ let at = start;
20
+ while (at < end) {
21
+ if (at + 8 > end) throw new PptFormatError(`record sequence ending at ${end} has a trailing ${end - at}-byte fragment, too short for the 8-byte record header`);
22
+ const record = readRecordAt(bytes, at);
23
+ const recordEnd = record.dataOffset + record.header.recLen;
24
+ if (recordEnd > end) throw new PptFormatError(`record 0x${record.header.recType.toString(16)} at offset ${at} ends at ${recordEnd}, past the ${end} its container allows`);
25
+ records.push(record);
26
+ at = recordEnd;
27
+ }
28
+ return records;
29
+ }
30
+ function childRecords(record) {
31
+ if (!isContainerRecord(record.header)) return [];
32
+ return readRecordSequence(record.stream, record.dataOffset, record.dataOffset + record.header.recLen);
33
+ }
34
+ function findChild(records, recType) {
35
+ return records.find((record) => record.header.recType === recType);
36
+ }
37
+ function findChildren(records, recType) {
38
+ return records.filter((record) => record.header.recType === recType);
39
+ }
40
+ function findDescendants(root, recType) {
41
+ const found = [];
42
+ for (const child of childRecords(root)) {
43
+ if (child.header.recType === recType) found.push(child);
44
+ found.push(...findDescendants(child, recType));
45
+ }
46
+ return found;
47
+ }
48
+ //#endregion
49
+ export { childRecords, findChild, findChildren, findDescendants, readRecordAt, readRecordSequence };
@@ -0,0 +1,87 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ //#region src/record/types.ts
3
+ const RT_Document = 1e3;
4
+ const RT_DocumentAtom = 1001;
5
+ const RT_Slide = 1006;
6
+ const RT_SlideAtom = 1007;
7
+ const RT_Notes = 1008;
8
+ const RT_Environment = 1010;
9
+ const RT_SlidePersistAtom = 1011;
10
+ const RT_MainMaster = 1016;
11
+ const RT_ExternalObjectList = 1033;
12
+ const RT_DrawingGroup = 1035;
13
+ const RT_Drawing = 1036;
14
+ const RT_List = 2e3;
15
+ const RT_FontCollection = 2005;
16
+ const RT_OutlineTextRefAtom = 3998;
17
+ const RT_TextHeaderAtom = 3999;
18
+ const RT_TextCharsAtom = 4e3;
19
+ const RT_StyleTextPropAtom = 4001;
20
+ const RT_MasterTextPropAtom = 4002;
21
+ const RT_TextMasterStyleAtom = 4003;
22
+ const RT_TextRulerAtom = 4006;
23
+ const RT_TextBytesAtom = 4008;
24
+ const RT_TextSpecialInfoDefaultAtom = 4009;
25
+ const RT_TextSpecialInfoAtom = 4010;
26
+ const RT_FontEntityAtom = 4023;
27
+ const RT_CString = 4026;
28
+ const RT_SlideListWithText = 4080;
29
+ const RT_UserEditAtom = 4085;
30
+ const RT_CurrentUserAtom = 4086;
31
+ const RT_PersistDirectoryAtom = 6002;
32
+ const RT_CryptSession10Container = 12052;
33
+ const SLIDE_LIST_INSTANCE_SLIDES = 0;
34
+ const SLIDE_LIST_INSTANCE_MASTERS = 1;
35
+ const SLIDE_LIST_INSTANCE_NOTES = 2;
36
+ const OfficeArtDgContainer = 61442;
37
+ const OfficeArtSpgrContainer = 61443;
38
+ const OfficeArtSpContainer = 61444;
39
+ const OfficeArtFSPGR = 61449;
40
+ const OfficeArtFSP = 61450;
41
+ const OfficeArtFOPT = 61451;
42
+ const OfficeArtClientTextbox = 61453;
43
+ const OfficeArtChildAnchor = 61455;
44
+ const OfficeArtClientAnchor = 61456;
45
+ //#endregion
46
+ exports.OfficeArtChildAnchor = OfficeArtChildAnchor;
47
+ exports.OfficeArtClientAnchor = OfficeArtClientAnchor;
48
+ exports.OfficeArtClientTextbox = OfficeArtClientTextbox;
49
+ exports.OfficeArtDgContainer = OfficeArtDgContainer;
50
+ exports.OfficeArtFOPT = OfficeArtFOPT;
51
+ exports.OfficeArtFSP = OfficeArtFSP;
52
+ exports.OfficeArtFSPGR = OfficeArtFSPGR;
53
+ exports.OfficeArtSpContainer = OfficeArtSpContainer;
54
+ exports.OfficeArtSpgrContainer = OfficeArtSpgrContainer;
55
+ exports.RT_CString = RT_CString;
56
+ exports.RT_CryptSession10Container = RT_CryptSession10Container;
57
+ exports.RT_CurrentUserAtom = RT_CurrentUserAtom;
58
+ exports.RT_Document = RT_Document;
59
+ exports.RT_DocumentAtom = RT_DocumentAtom;
60
+ exports.RT_Drawing = RT_Drawing;
61
+ exports.RT_DrawingGroup = RT_DrawingGroup;
62
+ exports.RT_Environment = RT_Environment;
63
+ exports.RT_ExternalObjectList = RT_ExternalObjectList;
64
+ exports.RT_FontCollection = RT_FontCollection;
65
+ exports.RT_FontEntityAtom = RT_FontEntityAtom;
66
+ exports.RT_List = RT_List;
67
+ exports.RT_MainMaster = RT_MainMaster;
68
+ exports.RT_MasterTextPropAtom = RT_MasterTextPropAtom;
69
+ exports.RT_Notes = RT_Notes;
70
+ exports.RT_OutlineTextRefAtom = RT_OutlineTextRefAtom;
71
+ exports.RT_PersistDirectoryAtom = RT_PersistDirectoryAtom;
72
+ exports.RT_Slide = RT_Slide;
73
+ exports.RT_SlideAtom = RT_SlideAtom;
74
+ exports.RT_SlideListWithText = RT_SlideListWithText;
75
+ exports.RT_SlidePersistAtom = RT_SlidePersistAtom;
76
+ exports.RT_StyleTextPropAtom = RT_StyleTextPropAtom;
77
+ exports.RT_TextBytesAtom = RT_TextBytesAtom;
78
+ exports.RT_TextCharsAtom = RT_TextCharsAtom;
79
+ exports.RT_TextHeaderAtom = RT_TextHeaderAtom;
80
+ exports.RT_TextMasterStyleAtom = RT_TextMasterStyleAtom;
81
+ exports.RT_TextRulerAtom = RT_TextRulerAtom;
82
+ exports.RT_TextSpecialInfoAtom = RT_TextSpecialInfoAtom;
83
+ exports.RT_TextSpecialInfoDefaultAtom = RT_TextSpecialInfoDefaultAtom;
84
+ exports.RT_UserEditAtom = RT_UserEditAtom;
85
+ exports.SLIDE_LIST_INSTANCE_MASTERS = SLIDE_LIST_INSTANCE_MASTERS;
86
+ exports.SLIDE_LIST_INSTANCE_NOTES = SLIDE_LIST_INSTANCE_NOTES;
87
+ exports.SLIDE_LIST_INSTANCE_SLIDES = SLIDE_LIST_INSTANCE_SLIDES;
@@ -0,0 +1,45 @@
1
+ //#region src/record/types.d.ts
2
+ declare const RT_Document = 1000;
3
+ declare const RT_DocumentAtom = 1001;
4
+ declare const RT_Slide = 1006;
5
+ declare const RT_SlideAtom = 1007;
6
+ declare const RT_Notes = 1008;
7
+ declare const RT_Environment = 1010;
8
+ declare const RT_SlidePersistAtom = 1011;
9
+ declare const RT_MainMaster = 1016;
10
+ declare const RT_ExternalObjectList = 1033;
11
+ declare const RT_DrawingGroup = 1035;
12
+ declare const RT_Drawing = 1036;
13
+ declare const RT_List = 2000;
14
+ declare const RT_FontCollection = 2005;
15
+ declare const RT_OutlineTextRefAtom = 3998;
16
+ declare const RT_TextHeaderAtom = 3999;
17
+ declare const RT_TextCharsAtom = 4000;
18
+ declare const RT_StyleTextPropAtom = 4001;
19
+ declare const RT_MasterTextPropAtom = 4002;
20
+ declare const RT_TextMasterStyleAtom = 4003;
21
+ declare const RT_TextRulerAtom = 4006;
22
+ declare const RT_TextBytesAtom = 4008;
23
+ declare const RT_TextSpecialInfoDefaultAtom = 4009;
24
+ declare const RT_TextSpecialInfoAtom = 4010;
25
+ declare const RT_FontEntityAtom = 4023;
26
+ declare const RT_CString = 4026;
27
+ declare const RT_SlideListWithText = 4080;
28
+ declare const RT_UserEditAtom = 4085;
29
+ declare const RT_CurrentUserAtom = 4086;
30
+ declare const RT_PersistDirectoryAtom = 6002;
31
+ declare const RT_CryptSession10Container = 12052;
32
+ declare const SLIDE_LIST_INSTANCE_SLIDES = 0;
33
+ declare const SLIDE_LIST_INSTANCE_MASTERS = 1;
34
+ declare const SLIDE_LIST_INSTANCE_NOTES = 2;
35
+ declare const OfficeArtDgContainer = 61442;
36
+ declare const OfficeArtSpgrContainer = 61443;
37
+ declare const OfficeArtSpContainer = 61444;
38
+ declare const OfficeArtFSPGR = 61449;
39
+ declare const OfficeArtFSP = 61450;
40
+ declare const OfficeArtFOPT = 61451;
41
+ declare const OfficeArtClientTextbox = 61453;
42
+ declare const OfficeArtChildAnchor = 61455;
43
+ declare const OfficeArtClientAnchor = 61456;
44
+ //#endregion
45
+ export { OfficeArtChildAnchor, OfficeArtClientAnchor, OfficeArtClientTextbox, OfficeArtDgContainer, OfficeArtFOPT, OfficeArtFSP, OfficeArtFSPGR, OfficeArtSpContainer, OfficeArtSpgrContainer, RT_CString, RT_CryptSession10Container, RT_CurrentUserAtom, RT_Document, RT_DocumentAtom, RT_Drawing, RT_DrawingGroup, RT_Environment, RT_ExternalObjectList, RT_FontCollection, RT_FontEntityAtom, RT_List, RT_MainMaster, RT_MasterTextPropAtom, RT_Notes, RT_OutlineTextRefAtom, RT_PersistDirectoryAtom, RT_Slide, RT_SlideAtom, RT_SlideListWithText, RT_SlidePersistAtom, RT_StyleTextPropAtom, RT_TextBytesAtom, RT_TextCharsAtom, RT_TextHeaderAtom, RT_TextMasterStyleAtom, RT_TextRulerAtom, RT_TextSpecialInfoAtom, RT_TextSpecialInfoDefaultAtom, RT_UserEditAtom, SLIDE_LIST_INSTANCE_MASTERS, SLIDE_LIST_INSTANCE_NOTES, SLIDE_LIST_INSTANCE_SLIDES };
@@ -0,0 +1,45 @@
1
+ //#region src/record/types.d.ts
2
+ declare const RT_Document = 1000;
3
+ declare const RT_DocumentAtom = 1001;
4
+ declare const RT_Slide = 1006;
5
+ declare const RT_SlideAtom = 1007;
6
+ declare const RT_Notes = 1008;
7
+ declare const RT_Environment = 1010;
8
+ declare const RT_SlidePersistAtom = 1011;
9
+ declare const RT_MainMaster = 1016;
10
+ declare const RT_ExternalObjectList = 1033;
11
+ declare const RT_DrawingGroup = 1035;
12
+ declare const RT_Drawing = 1036;
13
+ declare const RT_List = 2000;
14
+ declare const RT_FontCollection = 2005;
15
+ declare const RT_OutlineTextRefAtom = 3998;
16
+ declare const RT_TextHeaderAtom = 3999;
17
+ declare const RT_TextCharsAtom = 4000;
18
+ declare const RT_StyleTextPropAtom = 4001;
19
+ declare const RT_MasterTextPropAtom = 4002;
20
+ declare const RT_TextMasterStyleAtom = 4003;
21
+ declare const RT_TextRulerAtom = 4006;
22
+ declare const RT_TextBytesAtom = 4008;
23
+ declare const RT_TextSpecialInfoDefaultAtom = 4009;
24
+ declare const RT_TextSpecialInfoAtom = 4010;
25
+ declare const RT_FontEntityAtom = 4023;
26
+ declare const RT_CString = 4026;
27
+ declare const RT_SlideListWithText = 4080;
28
+ declare const RT_UserEditAtom = 4085;
29
+ declare const RT_CurrentUserAtom = 4086;
30
+ declare const RT_PersistDirectoryAtom = 6002;
31
+ declare const RT_CryptSession10Container = 12052;
32
+ declare const SLIDE_LIST_INSTANCE_SLIDES = 0;
33
+ declare const SLIDE_LIST_INSTANCE_MASTERS = 1;
34
+ declare const SLIDE_LIST_INSTANCE_NOTES = 2;
35
+ declare const OfficeArtDgContainer = 61442;
36
+ declare const OfficeArtSpgrContainer = 61443;
37
+ declare const OfficeArtSpContainer = 61444;
38
+ declare const OfficeArtFSPGR = 61449;
39
+ declare const OfficeArtFSP = 61450;
40
+ declare const OfficeArtFOPT = 61451;
41
+ declare const OfficeArtClientTextbox = 61453;
42
+ declare const OfficeArtChildAnchor = 61455;
43
+ declare const OfficeArtClientAnchor = 61456;
44
+ //#endregion
45
+ export { OfficeArtChildAnchor, OfficeArtClientAnchor, OfficeArtClientTextbox, OfficeArtDgContainer, OfficeArtFOPT, OfficeArtFSP, OfficeArtFSPGR, OfficeArtSpContainer, OfficeArtSpgrContainer, RT_CString, RT_CryptSession10Container, RT_CurrentUserAtom, RT_Document, RT_DocumentAtom, RT_Drawing, RT_DrawingGroup, RT_Environment, RT_ExternalObjectList, RT_FontCollection, RT_FontEntityAtom, RT_List, RT_MainMaster, RT_MasterTextPropAtom, RT_Notes, RT_OutlineTextRefAtom, RT_PersistDirectoryAtom, RT_Slide, RT_SlideAtom, RT_SlideListWithText, RT_SlidePersistAtom, RT_StyleTextPropAtom, RT_TextBytesAtom, RT_TextCharsAtom, RT_TextHeaderAtom, RT_TextMasterStyleAtom, RT_TextRulerAtom, RT_TextSpecialInfoAtom, RT_TextSpecialInfoDefaultAtom, RT_UserEditAtom, SLIDE_LIST_INSTANCE_MASTERS, SLIDE_LIST_INSTANCE_NOTES, SLIDE_LIST_INSTANCE_SLIDES };
@@ -0,0 +1,45 @@
1
+ //#region src/record/types.ts
2
+ const RT_Document = 1e3;
3
+ const RT_DocumentAtom = 1001;
4
+ const RT_Slide = 1006;
5
+ const RT_SlideAtom = 1007;
6
+ const RT_Notes = 1008;
7
+ const RT_Environment = 1010;
8
+ const RT_SlidePersistAtom = 1011;
9
+ const RT_MainMaster = 1016;
10
+ const RT_ExternalObjectList = 1033;
11
+ const RT_DrawingGroup = 1035;
12
+ const RT_Drawing = 1036;
13
+ const RT_List = 2e3;
14
+ const RT_FontCollection = 2005;
15
+ const RT_OutlineTextRefAtom = 3998;
16
+ const RT_TextHeaderAtom = 3999;
17
+ const RT_TextCharsAtom = 4e3;
18
+ const RT_StyleTextPropAtom = 4001;
19
+ const RT_MasterTextPropAtom = 4002;
20
+ const RT_TextMasterStyleAtom = 4003;
21
+ const RT_TextRulerAtom = 4006;
22
+ const RT_TextBytesAtom = 4008;
23
+ const RT_TextSpecialInfoDefaultAtom = 4009;
24
+ const RT_TextSpecialInfoAtom = 4010;
25
+ const RT_FontEntityAtom = 4023;
26
+ const RT_CString = 4026;
27
+ const RT_SlideListWithText = 4080;
28
+ const RT_UserEditAtom = 4085;
29
+ const RT_CurrentUserAtom = 4086;
30
+ const RT_PersistDirectoryAtom = 6002;
31
+ const RT_CryptSession10Container = 12052;
32
+ const SLIDE_LIST_INSTANCE_SLIDES = 0;
33
+ const SLIDE_LIST_INSTANCE_MASTERS = 1;
34
+ const SLIDE_LIST_INSTANCE_NOTES = 2;
35
+ const OfficeArtDgContainer = 61442;
36
+ const OfficeArtSpgrContainer = 61443;
37
+ const OfficeArtSpContainer = 61444;
38
+ const OfficeArtFSPGR = 61449;
39
+ const OfficeArtFSP = 61450;
40
+ const OfficeArtFOPT = 61451;
41
+ const OfficeArtClientTextbox = 61453;
42
+ const OfficeArtChildAnchor = 61455;
43
+ const OfficeArtClientAnchor = 61456;
44
+ //#endregion
45
+ export { OfficeArtChildAnchor, OfficeArtClientAnchor, OfficeArtClientTextbox, OfficeArtDgContainer, OfficeArtFOPT, OfficeArtFSP, OfficeArtFSPGR, OfficeArtSpContainer, OfficeArtSpgrContainer, RT_CString, RT_CryptSession10Container, RT_CurrentUserAtom, RT_Document, RT_DocumentAtom, RT_Drawing, RT_DrawingGroup, RT_Environment, RT_ExternalObjectList, RT_FontCollection, RT_FontEntityAtom, RT_List, RT_MainMaster, RT_MasterTextPropAtom, RT_Notes, RT_OutlineTextRefAtom, RT_PersistDirectoryAtom, RT_Slide, RT_SlideAtom, RT_SlideListWithText, RT_SlidePersistAtom, RT_StyleTextPropAtom, RT_TextBytesAtom, RT_TextCharsAtom, RT_TextHeaderAtom, RT_TextMasterStyleAtom, RT_TextRulerAtom, RT_TextSpecialInfoAtom, RT_TextSpecialInfoDefaultAtom, RT_UserEditAtom, SLIDE_LIST_INSTANCE_MASTERS, SLIDE_LIST_INSTANCE_NOTES, SLIDE_LIST_INSTANCE_SLIDES };