ooxml.js 2.4.0 → 2.5.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/README.md +40 -2
- package/dist/codec.cjs +28 -0
- package/dist/codec.d.cts +72 -0
- package/dist/codec.d.ts +72 -0
- package/dist/codec.js +24 -0
- package/dist/compact.cjs +162 -0
- package/dist/compact.d.cts +70 -0
- package/dist/compact.d.ts +70 -0
- package/dist/compact.js +152 -0
- package/dist/image/sniff.cjs +28 -0
- package/dist/image/sniff.d.cts +5 -0
- package/dist/image/sniff.d.ts +5 -0
- package/dist/image/sniff.js +27 -0
- package/dist/index.cjs +83 -3025
- package/dist/index.d.cts +22 -527
- package/dist/index.d.ts +22 -527
- package/dist/index.js +22 -2964
- package/dist/model/node.cjs +67 -0
- package/dist/model/node.d.cts +2 -0
- package/dist/model/node.d.ts +2 -0
- package/dist/model/node.js +58 -0
- package/dist/model/package.cjs +19 -0
- package/dist/model/package.d.cts +2 -0
- package/dist/model/package.d.ts +2 -0
- package/dist/model/package.js +15 -0
- package/dist/node-CkBWRjNR.d.cts +83 -0
- package/dist/node-CkBWRjNR.d.ts +83 -0
- package/dist/package-BUojjTXf.d.ts +114 -0
- package/dist/package-L24lkba-.d.cts +114 -0
- package/dist/package-io/read.cjs +33 -0
- package/dist/package-io/read.d.cts +5 -0
- package/dist/package-io/read.d.ts +5 -0
- package/dist/package-io/read.js +32 -0
- package/dist/package-io/write.cjs +18 -0
- package/dist/package-io/write.d.cts +5 -0
- package/dist/package-io/write.d.ts +5 -0
- package/dist/package-io/write.js +17 -0
- package/dist/typed/docx/read.cjs +332 -0
- package/dist/typed/docx/read.d.cts +52 -0
- package/dist/typed/docx/read.d.ts +52 -0
- package/dist/typed/docx/read.js +328 -0
- package/dist/typed/docx/styles.cjs +148 -0
- package/dist/typed/docx/styles.d.cts +29 -0
- package/dist/typed/docx/styles.d.ts +29 -0
- package/dist/typed/docx/styles.js +146 -0
- package/dist/typed/pptx/inherit.cjs +96 -0
- package/dist/typed/pptx/inherit.d.cts +30 -0
- package/dist/typed/pptx/inherit.d.ts +30 -0
- package/dist/typed/pptx/inherit.js +90 -0
- package/dist/typed/pptx/read.cjs +364 -0
- package/dist/typed/pptx/read.d.cts +44 -0
- package/dist/typed/pptx/read.d.ts +44 -0
- package/dist/typed/pptx/read.js +362 -0
- package/dist/typed/shared/color.cjs +85 -0
- package/dist/typed/shared/color.d.cts +9 -0
- package/dist/typed/shared/color.d.ts +9 -0
- package/dist/typed/shared/color.js +84 -0
- package/dist/typed/shared/drawingml.cjs +191 -0
- package/dist/typed/shared/drawingml.d.cts +40 -0
- package/dist/typed/shared/drawingml.d.ts +40 -0
- package/dist/typed/shared/drawingml.js +180 -0
- package/dist/typed/shared/metadata.cjs +44 -0
- package/dist/typed/shared/metadata.d.cts +16 -0
- package/dist/typed/shared/metadata.d.ts +16 -0
- package/dist/typed/shared/metadata.js +42 -0
- package/dist/typed/shared/source-path.cjs +18 -0
- package/dist/typed/shared/source-path.d.cts +5 -0
- package/dist/typed/shared/source-path.d.ts +5 -0
- package/dist/typed/shared/source-path.js +17 -0
- package/dist/typed/shared/units.cjs +55 -0
- package/dist/typed/shared/units.d.cts +20 -0
- package/dist/typed/shared/units.d.ts +20 -0
- package/dist/typed/shared/units.js +38 -0
- package/dist/typed/util.cjs +85 -0
- package/dist/typed/util.d.cts +18 -0
- package/dist/typed/util.d.ts +18 -0
- package/dist/typed/util.js +77 -0
- package/dist/typed/xlsx/a1.cjs +64 -0
- package/dist/typed/xlsx/a1.d.cts +19 -0
- package/dist/typed/xlsx/a1.d.ts +19 -0
- package/dist/typed/xlsx/a1.js +58 -0
- package/dist/typed/xlsx/build.cjs +456 -0
- package/dist/typed/xlsx/build.d.cts +6 -0
- package/dist/typed/xlsx/build.d.ts +6 -0
- package/dist/typed/xlsx/build.js +455 -0
- package/dist/typed/xlsx/content.cjs +257 -0
- package/dist/typed/xlsx/content.d.cts +6 -0
- package/dist/typed/xlsx/content.d.ts +6 -0
- package/dist/typed/xlsx/content.js +256 -0
- package/dist/typed/xlsx/defined-names.cjs +90 -0
- package/dist/typed/xlsx/defined-names.d.cts +20 -0
- package/dist/typed/xlsx/defined-names.d.ts +20 -0
- package/dist/typed/xlsx/defined-names.js +83 -0
- package/dist/typed/xlsx/print-settings.cjs +116 -0
- package/dist/typed/xlsx/print-settings.d.cts +8 -0
- package/dist/typed/xlsx/print-settings.d.ts +8 -0
- package/dist/typed/xlsx/print-settings.js +114 -0
- package/dist/typed/xlsx/shared-strings.cjs +35 -0
- package/dist/typed/xlsx/shared-strings.d.cts +12 -0
- package/dist/typed/xlsx/shared-strings.d.ts +12 -0
- package/dist/typed/xlsx/shared-strings.js +33 -0
- package/dist/typed/xlsx/units.cjs +21 -0
- package/dist/typed/xlsx/units.d.cts +8 -0
- package/dist/typed/xlsx/units.d.ts +8 -0
- package/dist/typed/xlsx/units.js +16 -0
- package/dist/typed/xlsx/util.cjs +53 -0
- package/dist/typed/xlsx/util.d.cts +10 -0
- package/dist/typed/xlsx/util.d.ts +10 -0
- package/dist/typed/xlsx/util.js +47 -0
- package/dist/typed/xlsx.cjs +140 -0
- package/dist/typed/xlsx.d.cts +43 -0
- package/dist/typed/xlsx.d.ts +43 -0
- package/dist/typed/xlsx.js +135 -0
- package/dist/util/base64.cjs +48 -0
- package/dist/util/base64.d.cts +5 -0
- package/dist/util/base64.d.ts +5 -0
- package/dist/util/base64.js +46 -0
- package/dist/xml/build.cjs +46 -0
- package/dist/xml/build.d.cts +5 -0
- package/dist/xml/build.d.ts +5 -0
- package/dist/xml/build.js +46 -0
- package/dist/xml/entities.cjs +7 -0
- package/dist/xml/entities.d.cts +4 -0
- package/dist/xml/entities.d.ts +4 -0
- package/dist/xml/entities.js +6 -0
- package/dist/xml/fragment.cjs +22 -0
- package/dist/xml/fragment.d.cts +6 -0
- package/dist/xml/fragment.d.ts +6 -0
- package/dist/xml/fragment.js +20 -0
- package/dist/xml/parse.cjs +88 -0
- package/dist/xml/parse.d.cts +5 -0
- package/dist/xml/parse.d.ts +5 -0
- package/dist/xml/parse.js +88 -0
- package/dist/zip.cjs +12 -0
- package/dist/zip.d.cts +5 -0
- package/dist/zip.d.ts +5 -0
- package/dist/zip.js +10 -0
- package/package.json +9 -1
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
import { base64ToBytes } from "../../util/base64.js";
|
|
2
|
+
import { attr, childrenWithTag, elementsWithTag, resolveRelationships, rootElement, textContent } from "../util.js";
|
|
3
|
+
import { DocumentMetadataSchema, readCoreProperties } from "../shared/metadata.js";
|
|
4
|
+
import { sniffImageFormat } from "../../image/sniff.js";
|
|
5
|
+
import { drawingMlFontSizeToPt, emuToPt } from "../shared/units.js";
|
|
6
|
+
import { applyGroupTransform, readGroupXfrm, readSolidFillColor, readXfrm } from "../shared/drawingml.js";
|
|
7
|
+
import { assignSourcePaths } from "../shared/source-path.js";
|
|
8
|
+
import { readPlaceholderKey, readRunPropertiesFromElement, resolveDefaultRunProperties, resolvePlaceholderXfrm, resolveSlideInheritance } from "./inherit.js";
|
|
9
|
+
import { z } from "zod";
|
|
10
|
+
import { ContentSlideSchema, SLIDE_SIZE_WIDESCREEN } from "document-schema.js";
|
|
11
|
+
//#region src/typed/pptx/read.ts
|
|
12
|
+
const PptxDocumentSchema = z.object({
|
|
13
|
+
metadata: DocumentMetadataSchema,
|
|
14
|
+
slides: z.array(ContentSlideSchema)
|
|
15
|
+
});
|
|
16
|
+
const PRESENTATION_PATH = "ppt/presentation.xml";
|
|
17
|
+
const TABLE_GRAPHIC_URI = "http://schemas.openxmlformats.org/drawingml/2006/table";
|
|
18
|
+
function readSlideSize(presentationRoot) {
|
|
19
|
+
const sldSz = presentationRoot === void 0 ? void 0 : childrenWithTag(presentationRoot, "p:sldSz")[0];
|
|
20
|
+
const cx = sldSz === void 0 ? void 0 : attr(sldSz, "cx");
|
|
21
|
+
const cy = sldSz === void 0 ? void 0 : attr(sldSz, "cy");
|
|
22
|
+
return cx === void 0 || cy === void 0 ? SLIDE_SIZE_WIDESCREEN : {
|
|
23
|
+
widthPt: emuToPt(Number(cx)),
|
|
24
|
+
heightPt: emuToPt(Number(cy))
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function readSlidePathsInOrder(pkg, presentationRoot) {
|
|
28
|
+
if (presentationRoot === void 0) return [];
|
|
29
|
+
const sldIdLst = childrenWithTag(presentationRoot, "p:sldIdLst")[0];
|
|
30
|
+
if (sldIdLst === void 0) return [];
|
|
31
|
+
const presentationRels = resolveRelationships(pkg, PRESENTATION_PATH);
|
|
32
|
+
const paths = [];
|
|
33
|
+
for (const sldId of childrenWithTag(sldIdLst, "p:sldId")) {
|
|
34
|
+
const rId = attr(sldId, "r:id");
|
|
35
|
+
const rel = rId === void 0 ? void 0 : presentationRels.get(rId);
|
|
36
|
+
if (rel !== void 0) paths.push(rel.target);
|
|
37
|
+
}
|
|
38
|
+
return paths;
|
|
39
|
+
}
|
|
40
|
+
function shapeName(shape) {
|
|
41
|
+
const cNvPr = elementsWithTag([shape], "p:cNvPr")[0];
|
|
42
|
+
return cNvPr === void 0 ? void 0 : attr(cNvPr, "name");
|
|
43
|
+
}
|
|
44
|
+
function mergeRunProperties(base, override) {
|
|
45
|
+
return {
|
|
46
|
+
fontFamily: override.fontFamily ?? base.fontFamily,
|
|
47
|
+
sizePt: override.sizePt ?? base.sizePt,
|
|
48
|
+
bold: override.bold ?? base.bold,
|
|
49
|
+
italic: override.italic ?? base.italic,
|
|
50
|
+
color: override.color ?? base.color
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
function isUnderlined(rPr) {
|
|
54
|
+
if (rPr === void 0) return;
|
|
55
|
+
const u = attr(rPr, "u");
|
|
56
|
+
return u === void 0 ? void 0 : u !== "none";
|
|
57
|
+
}
|
|
58
|
+
function isStrikethrough(rPr) {
|
|
59
|
+
if (rPr === void 0) return;
|
|
60
|
+
const strike = attr(rPr, "strike");
|
|
61
|
+
return strike === void 0 ? void 0 : strike !== "noStrike";
|
|
62
|
+
}
|
|
63
|
+
function readHyperlink(rPr, slideRels) {
|
|
64
|
+
if (rPr === void 0) return;
|
|
65
|
+
const hlink = childrenWithTag(rPr, "a:hlinkClick")[0];
|
|
66
|
+
const rId = hlink === void 0 ? void 0 : attr(hlink, "r:id");
|
|
67
|
+
const rel = rId === void 0 ? void 0 : slideRels.get(rId);
|
|
68
|
+
return rel?.targetMode === "External" ? rel.target : void 0;
|
|
69
|
+
}
|
|
70
|
+
function readRun(runEl, cascadeBase, context, slideRels) {
|
|
71
|
+
const rPr = childrenWithTag(runEl, "a:rPr")[0];
|
|
72
|
+
const merged = mergeRunProperties(cascadeBase, rPr === void 0 ? {} : readRunPropertiesFromElement(rPr, context));
|
|
73
|
+
const tEl = childrenWithTag(runEl, "a:t")[0];
|
|
74
|
+
return {
|
|
75
|
+
text: tEl === void 0 ? "" : textContent(tEl),
|
|
76
|
+
bold: merged.bold,
|
|
77
|
+
italic: merged.italic,
|
|
78
|
+
underline: isUnderlined(rPr),
|
|
79
|
+
strike: isStrikethrough(rPr),
|
|
80
|
+
fontFamily: merged.fontFamily,
|
|
81
|
+
sizePt: merged.sizePt,
|
|
82
|
+
color: merged.color,
|
|
83
|
+
hyperlink: readHyperlink(rPr, slideRels)
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
function readAlignment(algn) {
|
|
87
|
+
if (algn === "l") return "left";
|
|
88
|
+
if (algn === "ctr") return "center";
|
|
89
|
+
if (algn === "r") return "right";
|
|
90
|
+
if (algn === "just" || algn === "justLow") return "justify";
|
|
91
|
+
}
|
|
92
|
+
function readAbsoluteSpacingPt(spc) {
|
|
93
|
+
if (spc === void 0) return;
|
|
94
|
+
const pts = childrenWithTag(spc, "a:spcPts")[0];
|
|
95
|
+
const val = pts === void 0 ? void 0 : attr(pts, "val");
|
|
96
|
+
return val === void 0 ? void 0 : drawingMlFontSizeToPt(Number(val));
|
|
97
|
+
}
|
|
98
|
+
function readLineSpacingMultiplier(pPr) {
|
|
99
|
+
const lnSpc = pPr === void 0 ? void 0 : childrenWithTag(pPr, "a:lnSpc")[0];
|
|
100
|
+
const pct = lnSpc === void 0 ? void 0 : childrenWithTag(lnSpc, "a:spcPct")[0];
|
|
101
|
+
const val = pct === void 0 ? void 0 : attr(pct, "val");
|
|
102
|
+
return val === void 0 ? void 0 : Number(val) / 1e5;
|
|
103
|
+
}
|
|
104
|
+
function readParagraph(pEl, placeholderType, context, slideRels) {
|
|
105
|
+
const pPr = childrenWithTag(pEl, "a:pPr")[0];
|
|
106
|
+
const masterDefaults = resolveDefaultRunProperties(placeholderType, pPr === void 0 ? 0 : Number(attr(pPr, "lvl") ?? "0"), context);
|
|
107
|
+
const pPrDefRPr = pPr === void 0 ? void 0 : childrenWithTag(pPr, "a:defRPr")[0];
|
|
108
|
+
const paragraphDefaults = pPrDefRPr === void 0 ? masterDefaults : mergeRunProperties(masterDefaults, readRunPropertiesFromElement(pPrDefRPr, context));
|
|
109
|
+
const runs = [];
|
|
110
|
+
for (const child of pEl.children) {
|
|
111
|
+
if (child.type !== "element") continue;
|
|
112
|
+
if (child.tag === "a:r" || child.tag === "a:fld") runs.push(readRun(child, paragraphDefaults, context, slideRels));
|
|
113
|
+
else if (child.tag === "a:br") runs.push({ text: "\n" });
|
|
114
|
+
}
|
|
115
|
+
const marL = pPr === void 0 ? void 0 : attr(pPr, "marL");
|
|
116
|
+
const indent = pPr === void 0 ? void 0 : attr(pPr, "indent");
|
|
117
|
+
return {
|
|
118
|
+
kind: "paragraph",
|
|
119
|
+
runs,
|
|
120
|
+
alignment: pPr === void 0 ? void 0 : readAlignment(attr(pPr, "algn")),
|
|
121
|
+
spacingBeforePt: readAbsoluteSpacingPt(pPr === void 0 ? void 0 : childrenWithTag(pPr, "a:spcBef")[0]),
|
|
122
|
+
spacingAfterPt: readAbsoluteSpacingPt(pPr === void 0 ? void 0 : childrenWithTag(pPr, "a:spcAft")[0]),
|
|
123
|
+
lineSpacing: readLineSpacingMultiplier(pPr),
|
|
124
|
+
indentLeftPt: marL === void 0 ? void 0 : emuToPt(Number(marL)),
|
|
125
|
+
indentFirstLinePt: indent === void 0 ? void 0 : emuToPt(Number(indent))
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
function textBodyParagraphs(txBody, placeholderType, context, slideRels) {
|
|
129
|
+
return txBody === void 0 ? [] : childrenWithTag(txBody, "a:p").map((p) => readParagraph(p, placeholderType, context, slideRels));
|
|
130
|
+
}
|
|
131
|
+
const DEFAULT_INSET_LEFT_RIGHT_EMU = 91440;
|
|
132
|
+
const DEFAULT_INSET_TOP_BOTTOM_EMU = 45720;
|
|
133
|
+
const NO_TEXT_BODY_EXTRAS = {
|
|
134
|
+
insetLeftPt: 0,
|
|
135
|
+
insetTopPt: 0,
|
|
136
|
+
insetRightPt: 0,
|
|
137
|
+
insetBottomPt: 0,
|
|
138
|
+
fontScale: void 0,
|
|
139
|
+
lineSpacingReduction: void 0
|
|
140
|
+
};
|
|
141
|
+
function readShapeTextExtras(txBody) {
|
|
142
|
+
if (txBody === void 0) return NO_TEXT_BODY_EXTRAS;
|
|
143
|
+
const bodyPr = childrenWithTag(txBody, "a:bodyPr")[0];
|
|
144
|
+
const lIns = bodyPr === void 0 ? void 0 : attr(bodyPr, "lIns");
|
|
145
|
+
const tIns = bodyPr === void 0 ? void 0 : attr(bodyPr, "tIns");
|
|
146
|
+
const rIns = bodyPr === void 0 ? void 0 : attr(bodyPr, "rIns");
|
|
147
|
+
const bIns = bodyPr === void 0 ? void 0 : attr(bodyPr, "bIns");
|
|
148
|
+
const normAutofit = bodyPr === void 0 ? void 0 : childrenWithTag(bodyPr, "a:normAutofit")[0];
|
|
149
|
+
const fontScale = normAutofit === void 0 ? void 0 : attr(normAutofit, "fontScale");
|
|
150
|
+
const lnSpcReduction = normAutofit === void 0 ? void 0 : attr(normAutofit, "lnSpcReduction");
|
|
151
|
+
return {
|
|
152
|
+
insetLeftPt: emuToPt(lIns === void 0 ? DEFAULT_INSET_LEFT_RIGHT_EMU : Number(lIns)),
|
|
153
|
+
insetTopPt: emuToPt(tIns === void 0 ? DEFAULT_INSET_TOP_BOTTOM_EMU : Number(tIns)),
|
|
154
|
+
insetRightPt: emuToPt(rIns === void 0 ? DEFAULT_INSET_LEFT_RIGHT_EMU : Number(rIns)),
|
|
155
|
+
insetBottomPt: emuToPt(bIns === void 0 ? DEFAULT_INSET_TOP_BOTTOM_EMU : Number(bIns)),
|
|
156
|
+
fontScale: fontScale === void 0 ? void 0 : Number(fontScale) / 1e5,
|
|
157
|
+
lineSpacingReduction: lnSpcReduction === void 0 ? void 0 : Number(lnSpcReduction) / 1e5
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
function resolveShapeFrame(shape, context, parentTransform) {
|
|
161
|
+
const key = readPlaceholderKey(shape);
|
|
162
|
+
const spPr = childrenWithTag(shape, "p:spPr")[0];
|
|
163
|
+
const xfrm = (spPr === void 0 ? void 0 : readXfrm(childrenWithTag(spPr, "a:xfrm")[0])) ?? (key === void 0 ? void 0 : resolvePlaceholderXfrm(key, context));
|
|
164
|
+
if (xfrm === void 0) return;
|
|
165
|
+
const localFrame = {
|
|
166
|
+
xPt: xfrm.xPt,
|
|
167
|
+
yPt: xfrm.yPt,
|
|
168
|
+
widthPt: xfrm.widthPt,
|
|
169
|
+
heightPt: xfrm.heightPt
|
|
170
|
+
};
|
|
171
|
+
return {
|
|
172
|
+
frame: parentTransform === void 0 ? localFrame : applyGroupTransform(parentTransform, localFrame),
|
|
173
|
+
rotationDeg: xfrm.rotationDeg === 0 ? void 0 : xfrm.rotationDeg
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
function readSpShape(sp, context, slideRels, parentTransform) {
|
|
177
|
+
const resolved = resolveShapeFrame(sp, context, parentTransform);
|
|
178
|
+
if (resolved === void 0) return;
|
|
179
|
+
const key = readPlaceholderKey(sp);
|
|
180
|
+
const txBody = childrenWithTag(sp, "p:txBody")[0];
|
|
181
|
+
const blocks = textBodyParagraphs(txBody, key?.type, context, slideRels);
|
|
182
|
+
const extras = readShapeTextExtras(txBody);
|
|
183
|
+
return {
|
|
184
|
+
name: shapeName(sp),
|
|
185
|
+
frame: resolved.frame,
|
|
186
|
+
rotationDeg: resolved.rotationDeg,
|
|
187
|
+
...extras,
|
|
188
|
+
blocks
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
function readPicShape(pic, context, slideRels, pkg, parentTransform) {
|
|
192
|
+
const resolved = resolveShapeFrame(pic, context, parentTransform);
|
|
193
|
+
if (resolved === void 0) return;
|
|
194
|
+
const blipFill = childrenWithTag(pic, "p:blipFill")[0];
|
|
195
|
+
const blip = blipFill === void 0 ? void 0 : childrenWithTag(blipFill, "a:blip")[0];
|
|
196
|
+
const rId = blip === void 0 ? void 0 : attr(blip, "r:embed");
|
|
197
|
+
const rel = rId === void 0 ? void 0 : slideRels.get(rId);
|
|
198
|
+
const mediaPart = rel === void 0 ? void 0 : pkg.parts[rel.target];
|
|
199
|
+
const blocks = [];
|
|
200
|
+
if (mediaPart?.kind === "binary") {
|
|
201
|
+
const format = sniffImageFormat(base64ToBytes(mediaPart.base64));
|
|
202
|
+
if (format !== void 0) {
|
|
203
|
+
const image = {
|
|
204
|
+
kind: "image",
|
|
205
|
+
format,
|
|
206
|
+
base64: mediaPart.base64,
|
|
207
|
+
widthPt: resolved.frame.widthPt,
|
|
208
|
+
heightPt: resolved.frame.heightPt
|
|
209
|
+
};
|
|
210
|
+
blocks.push(image);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return {
|
|
214
|
+
name: shapeName(pic),
|
|
215
|
+
frame: resolved.frame,
|
|
216
|
+
rotationDeg: resolved.rotationDeg,
|
|
217
|
+
...NO_TEXT_BODY_EXTRAS,
|
|
218
|
+
blocks
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
function readTableCell(tc, context, slideRels) {
|
|
222
|
+
const hMerge = attr(tc, "hMerge");
|
|
223
|
+
const vMerge = attr(tc, "vMerge");
|
|
224
|
+
if (hMerge === "1" || vMerge === "1") return { blocks: [] };
|
|
225
|
+
const tcPr = childrenWithTag(tc, "a:tcPr")[0];
|
|
226
|
+
const background = readSolidFillColor(tcPr === void 0 ? void 0 : childrenWithTag(tcPr, "a:solidFill")[0], context.colorMap, context.theme);
|
|
227
|
+
const txBody = childrenWithTag(tc, "a:txBody")[0];
|
|
228
|
+
const gridSpan = attr(tc, "gridSpan");
|
|
229
|
+
const rowSpan = attr(tc, "rowSpan");
|
|
230
|
+
return {
|
|
231
|
+
blocks: textBodyParagraphs(txBody, void 0, context, slideRels),
|
|
232
|
+
colSpan: gridSpan === void 0 ? void 0 : Number(gridSpan),
|
|
233
|
+
rowSpan: rowSpan === void 0 ? void 0 : Number(rowSpan),
|
|
234
|
+
background
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
function readTable(tbl, context, slideRels) {
|
|
238
|
+
const tblGrid = childrenWithTag(tbl, "a:tblGrid")[0];
|
|
239
|
+
const columnWidthsPt = tblGrid === void 0 ? [] : childrenWithTag(tblGrid, "a:gridCol").map((col) => emuToPt(Number(attr(col, "w") ?? "0")));
|
|
240
|
+
return {
|
|
241
|
+
kind: "table",
|
|
242
|
+
rows: childrenWithTag(tbl, "a:tr").map((tr) => {
|
|
243
|
+
const h = attr(tr, "h");
|
|
244
|
+
return {
|
|
245
|
+
cells: childrenWithTag(tr, "a:tc").map((tc) => readTableCell(tc, context, slideRels)),
|
|
246
|
+
heightPt: h === void 0 ? void 0 : emuToPt(Number(h))
|
|
247
|
+
};
|
|
248
|
+
}),
|
|
249
|
+
columnWidthsPt
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
function readGraphicFrameShape(gf, context, slideRels, parentTransform) {
|
|
253
|
+
const xfrm = readXfrm(childrenWithTag(gf, "p:xfrm")[0]);
|
|
254
|
+
if (xfrm === void 0) return;
|
|
255
|
+
const localFrame = {
|
|
256
|
+
xPt: xfrm.xPt,
|
|
257
|
+
yPt: xfrm.yPt,
|
|
258
|
+
widthPt: xfrm.widthPt,
|
|
259
|
+
heightPt: xfrm.heightPt
|
|
260
|
+
};
|
|
261
|
+
const frame = parentTransform === void 0 ? localFrame : applyGroupTransform(parentTransform, localFrame);
|
|
262
|
+
const rotationDeg = xfrm.rotationDeg === 0 ? void 0 : xfrm.rotationDeg;
|
|
263
|
+
const graphic = childrenWithTag(gf, "a:graphic")[0];
|
|
264
|
+
const graphicData = graphic === void 0 ? void 0 : childrenWithTag(graphic, "a:graphicData")[0];
|
|
265
|
+
const tbl = (graphicData === void 0 ? void 0 : attr(graphicData, "uri")) === TABLE_GRAPHIC_URI && graphicData !== void 0 ? childrenWithTag(graphicData, "a:tbl")[0] : void 0;
|
|
266
|
+
const blocks = tbl === void 0 ? [] : [readTable(tbl, context, slideRels)];
|
|
267
|
+
return {
|
|
268
|
+
name: shapeName(gf),
|
|
269
|
+
frame,
|
|
270
|
+
rotationDeg,
|
|
271
|
+
...NO_TEXT_BODY_EXTRAS,
|
|
272
|
+
blocks
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
function walkShapeTreeChildren(children, parentTransform, context, slideRels, pkg, out) {
|
|
276
|
+
for (const node of children) {
|
|
277
|
+
if (node.type !== "element") continue;
|
|
278
|
+
if (node.tag === "p:sp") {
|
|
279
|
+
const shape = readSpShape(node, context, slideRels, parentTransform);
|
|
280
|
+
if (shape !== void 0) out.push(shape);
|
|
281
|
+
} else if (node.tag === "p:pic") {
|
|
282
|
+
const shape = readPicShape(node, context, slideRels, pkg, parentTransform);
|
|
283
|
+
if (shape !== void 0) out.push(shape);
|
|
284
|
+
} else if (node.tag === "p:graphicFrame") {
|
|
285
|
+
const shape = readGraphicFrameShape(node, context, slideRels, parentTransform);
|
|
286
|
+
if (shape !== void 0) out.push(shape);
|
|
287
|
+
} else if (node.tag === "p:grpSp") {
|
|
288
|
+
const grpSpPr = childrenWithTag(node, "p:grpSpPr")[0];
|
|
289
|
+
const composed = composeGroupTransform(readGroupXfrm(grpSpPr === void 0 ? void 0 : childrenWithTag(grpSpPr, "a:xfrm")[0]), parentTransform);
|
|
290
|
+
walkShapeTreeChildren(node.children, composed, context, slideRels, pkg, out);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
function composeGroupTransform(own, parent) {
|
|
295
|
+
if (own === void 0) return;
|
|
296
|
+
if (parent === void 0) return own;
|
|
297
|
+
const absolute = applyGroupTransform(parent, {
|
|
298
|
+
xPt: own.offXPt,
|
|
299
|
+
yPt: own.offYPt,
|
|
300
|
+
widthPt: own.extWidthPt,
|
|
301
|
+
heightPt: own.extHeightPt
|
|
302
|
+
});
|
|
303
|
+
return {
|
|
304
|
+
...own,
|
|
305
|
+
offXPt: absolute.xPt,
|
|
306
|
+
offYPt: absolute.yPt,
|
|
307
|
+
extWidthPt: absolute.widthPt,
|
|
308
|
+
extHeightPt: absolute.heightPt
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
const NOTES_SLIDE_REL_SUFFIX = "/notesSlide";
|
|
312
|
+
function readNotes(pkg, slidePath) {
|
|
313
|
+
let notesPath;
|
|
314
|
+
for (const rel of resolveRelationships(pkg, slidePath).values()) if (rel.type.endsWith(NOTES_SLIDE_REL_SUFFIX)) {
|
|
315
|
+
notesPath = rel.target;
|
|
316
|
+
break;
|
|
317
|
+
}
|
|
318
|
+
if (notesPath === void 0) return "";
|
|
319
|
+
const notesRoot = rootElement(pkg.parts[notesPath]);
|
|
320
|
+
if (notesRoot === void 0) return "";
|
|
321
|
+
const bodyShape = elementsWithTag([notesRoot], "p:sp").find((shape) => {
|
|
322
|
+
const key = readPlaceholderKey(shape);
|
|
323
|
+
return key !== void 0 && (key.type === void 0 || key.type === "body");
|
|
324
|
+
});
|
|
325
|
+
if (bodyShape !== void 0) {
|
|
326
|
+
const txBody = childrenWithTag(bodyShape, "p:txBody")[0];
|
|
327
|
+
if (txBody !== void 0) return elementsWithTag(txBody.children, "a:t").map(textContent).join("");
|
|
328
|
+
}
|
|
329
|
+
return elementsWithTag([notesRoot], "a:t").map(textContent).join("");
|
|
330
|
+
}
|
|
331
|
+
function readSlide(pkg, slidePath, size) {
|
|
332
|
+
const slideRoot = rootElement(pkg.parts[slidePath]);
|
|
333
|
+
const context = resolveSlideInheritance(pkg, slidePath);
|
|
334
|
+
const slideRels = resolveRelationships(pkg, slidePath);
|
|
335
|
+
const cSld = slideRoot === void 0 ? void 0 : childrenWithTag(slideRoot, "p:cSld")[0];
|
|
336
|
+
const spTree = cSld === void 0 ? void 0 : childrenWithTag(cSld, "p:spTree")[0];
|
|
337
|
+
const shapes = [];
|
|
338
|
+
if (spTree !== void 0) walkShapeTreeChildren(spTree.children, void 0, context, slideRels, pkg, shapes);
|
|
339
|
+
return {
|
|
340
|
+
size,
|
|
341
|
+
shapes,
|
|
342
|
+
notes: readNotes(pkg, slidePath)
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
function readPptx(pkg) {
|
|
346
|
+
const presentationRoot = rootElement(pkg.parts[PRESENTATION_PATH]);
|
|
347
|
+
const size = readSlideSize(presentationRoot);
|
|
348
|
+
const slides = readSlidePathsInOrder(pkg, presentationRoot).map((slidePath) => readSlide(pkg, slidePath, size));
|
|
349
|
+
slides.forEach((slide, slideIndex) => {
|
|
350
|
+
slide.shapes.forEach((shape, shapeIndex) => {
|
|
351
|
+
const shapePath = `slides[${slideIndex}].shapes[${shapeIndex}]`;
|
|
352
|
+
shape.sourcePath = shapePath;
|
|
353
|
+
assignSourcePaths(shape.blocks, shapePath);
|
|
354
|
+
});
|
|
355
|
+
});
|
|
356
|
+
return {
|
|
357
|
+
metadata: readCoreProperties(pkg),
|
|
358
|
+
slides
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
//#endregion
|
|
362
|
+
export { PptxDocumentSchema, readPptx };
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
//#region src/typed/shared/color.ts
|
|
3
|
+
const OOXML_PERCENT_SCALE = 1e5;
|
|
4
|
+
function clamp01(x) {
|
|
5
|
+
return Math.max(0, Math.min(1, x));
|
|
6
|
+
}
|
|
7
|
+
function srgbToLinear(c) {
|
|
8
|
+
return c <= .04045 ? c / 12.92 : ((c + .055) / 1.055) ** 2.4;
|
|
9
|
+
}
|
|
10
|
+
function linearToSrgb(c) {
|
|
11
|
+
return c <= .0031308 ? c * 12.92 : 1.055 * c ** (1 / 2.4) - .055;
|
|
12
|
+
}
|
|
13
|
+
function applyShadeOrTint(color, kind, value) {
|
|
14
|
+
const pct = value / OOXML_PERCENT_SCALE;
|
|
15
|
+
const transform = kind === "shade" ? (linear) => linear * pct : (linear) => 1 - (1 - linear) * pct;
|
|
16
|
+
return {
|
|
17
|
+
r: clamp01(linearToSrgb(transform(srgbToLinear(color.r)))),
|
|
18
|
+
g: clamp01(linearToSrgb(transform(srgbToLinear(color.g)))),
|
|
19
|
+
b: clamp01(linearToSrgb(transform(srgbToLinear(color.b))))
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function rgbToHsl(color) {
|
|
23
|
+
const { r, g, b } = color;
|
|
24
|
+
const max = Math.max(r, g, b);
|
|
25
|
+
const min = Math.min(r, g, b);
|
|
26
|
+
const l = (max + min) / 2;
|
|
27
|
+
if (max === min) return {
|
|
28
|
+
h: 0,
|
|
29
|
+
s: 0,
|
|
30
|
+
l
|
|
31
|
+
};
|
|
32
|
+
const d = max - min;
|
|
33
|
+
const s = l > .5 ? d / (2 - max - min) : d / (max + min);
|
|
34
|
+
let h;
|
|
35
|
+
if (max === r) h = (g - b) / d + (g < b ? 6 : 0);
|
|
36
|
+
else if (max === g) h = (b - r) / d + 2;
|
|
37
|
+
else h = (r - g) / d + 4;
|
|
38
|
+
return {
|
|
39
|
+
h: h * 60,
|
|
40
|
+
s,
|
|
41
|
+
l
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function hueToRgbComponent(p, q, hue) {
|
|
45
|
+
let t = hue;
|
|
46
|
+
if (t < 0) t += 1;
|
|
47
|
+
if (t > 1) t -= 1;
|
|
48
|
+
if (t < 1 / 6) return p + (q - p) * 6 * t;
|
|
49
|
+
if (t < 1 / 2) return q;
|
|
50
|
+
if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;
|
|
51
|
+
return p;
|
|
52
|
+
}
|
|
53
|
+
function hslToRgb(hsl) {
|
|
54
|
+
const { h, s, l } = hsl;
|
|
55
|
+
if (s === 0) return {
|
|
56
|
+
r: l,
|
|
57
|
+
g: l,
|
|
58
|
+
b: l
|
|
59
|
+
};
|
|
60
|
+
const q = l < .5 ? l * (1 + s) : l + s - l * s;
|
|
61
|
+
const p = 2 * l - q;
|
|
62
|
+
const hk = h / 360;
|
|
63
|
+
return {
|
|
64
|
+
r: clamp01(hueToRgbComponent(p, q, hk + 1 / 3)),
|
|
65
|
+
g: clamp01(hueToRgbComponent(p, q, hk)),
|
|
66
|
+
b: clamp01(hueToRgbComponent(p, q, hk - 1 / 3))
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
function applyLumModOrOff(color, kind, value) {
|
|
70
|
+
const hsl = rgbToHsl(color);
|
|
71
|
+
const pct = value / OOXML_PERCENT_SCALE;
|
|
72
|
+
const l = clamp01(kind === "lumMod" ? hsl.l * pct : hsl.l + pct);
|
|
73
|
+
return hslToRgb({
|
|
74
|
+
...hsl,
|
|
75
|
+
l
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
function applyColorTransforms(base, transforms) {
|
|
79
|
+
let color = base;
|
|
80
|
+
for (const t of transforms) if (t.kind === "shade" || t.kind === "tint") color = applyShadeOrTint(color, t.kind, t.value);
|
|
81
|
+
for (const t of transforms) if (t.kind === "lumMod" || t.kind === "lumOff") color = applyLumModOrOff(color, t.kind, t.value);
|
|
82
|
+
return color;
|
|
83
|
+
}
|
|
84
|
+
//#endregion
|
|
85
|
+
exports.applyColorTransforms = applyColorTransforms;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Color } from "document-schema.js";
|
|
2
|
+
//#region src/typed/shared/color.d.ts
|
|
3
|
+
interface ColorTransform {
|
|
4
|
+
readonly kind: 'shade' | 'tint' | 'lumMod' | 'lumOff';
|
|
5
|
+
readonly value: number;
|
|
6
|
+
}
|
|
7
|
+
declare function applyColorTransforms(base: Color, transforms: readonly ColorTransform[]): Color;
|
|
8
|
+
//#endregion
|
|
9
|
+
export { ColorTransform, applyColorTransforms };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Color } from "document-schema.js";
|
|
2
|
+
//#region src/typed/shared/color.d.ts
|
|
3
|
+
interface ColorTransform {
|
|
4
|
+
readonly kind: 'shade' | 'tint' | 'lumMod' | 'lumOff';
|
|
5
|
+
readonly value: number;
|
|
6
|
+
}
|
|
7
|
+
declare function applyColorTransforms(base: Color, transforms: readonly ColorTransform[]): Color;
|
|
8
|
+
//#endregion
|
|
9
|
+
export { ColorTransform, applyColorTransforms };
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
//#region src/typed/shared/color.ts
|
|
2
|
+
const OOXML_PERCENT_SCALE = 1e5;
|
|
3
|
+
function clamp01(x) {
|
|
4
|
+
return Math.max(0, Math.min(1, x));
|
|
5
|
+
}
|
|
6
|
+
function srgbToLinear(c) {
|
|
7
|
+
return c <= .04045 ? c / 12.92 : ((c + .055) / 1.055) ** 2.4;
|
|
8
|
+
}
|
|
9
|
+
function linearToSrgb(c) {
|
|
10
|
+
return c <= .0031308 ? c * 12.92 : 1.055 * c ** (1 / 2.4) - .055;
|
|
11
|
+
}
|
|
12
|
+
function applyShadeOrTint(color, kind, value) {
|
|
13
|
+
const pct = value / OOXML_PERCENT_SCALE;
|
|
14
|
+
const transform = kind === "shade" ? (linear) => linear * pct : (linear) => 1 - (1 - linear) * pct;
|
|
15
|
+
return {
|
|
16
|
+
r: clamp01(linearToSrgb(transform(srgbToLinear(color.r)))),
|
|
17
|
+
g: clamp01(linearToSrgb(transform(srgbToLinear(color.g)))),
|
|
18
|
+
b: clamp01(linearToSrgb(transform(srgbToLinear(color.b))))
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
function rgbToHsl(color) {
|
|
22
|
+
const { r, g, b } = color;
|
|
23
|
+
const max = Math.max(r, g, b);
|
|
24
|
+
const min = Math.min(r, g, b);
|
|
25
|
+
const l = (max + min) / 2;
|
|
26
|
+
if (max === min) return {
|
|
27
|
+
h: 0,
|
|
28
|
+
s: 0,
|
|
29
|
+
l
|
|
30
|
+
};
|
|
31
|
+
const d = max - min;
|
|
32
|
+
const s = l > .5 ? d / (2 - max - min) : d / (max + min);
|
|
33
|
+
let h;
|
|
34
|
+
if (max === r) h = (g - b) / d + (g < b ? 6 : 0);
|
|
35
|
+
else if (max === g) h = (b - r) / d + 2;
|
|
36
|
+
else h = (r - g) / d + 4;
|
|
37
|
+
return {
|
|
38
|
+
h: h * 60,
|
|
39
|
+
s,
|
|
40
|
+
l
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function hueToRgbComponent(p, q, hue) {
|
|
44
|
+
let t = hue;
|
|
45
|
+
if (t < 0) t += 1;
|
|
46
|
+
if (t > 1) t -= 1;
|
|
47
|
+
if (t < 1 / 6) return p + (q - p) * 6 * t;
|
|
48
|
+
if (t < 1 / 2) return q;
|
|
49
|
+
if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;
|
|
50
|
+
return p;
|
|
51
|
+
}
|
|
52
|
+
function hslToRgb(hsl) {
|
|
53
|
+
const { h, s, l } = hsl;
|
|
54
|
+
if (s === 0) return {
|
|
55
|
+
r: l,
|
|
56
|
+
g: l,
|
|
57
|
+
b: l
|
|
58
|
+
};
|
|
59
|
+
const q = l < .5 ? l * (1 + s) : l + s - l * s;
|
|
60
|
+
const p = 2 * l - q;
|
|
61
|
+
const hk = h / 360;
|
|
62
|
+
return {
|
|
63
|
+
r: clamp01(hueToRgbComponent(p, q, hk + 1 / 3)),
|
|
64
|
+
g: clamp01(hueToRgbComponent(p, q, hk)),
|
|
65
|
+
b: clamp01(hueToRgbComponent(p, q, hk - 1 / 3))
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
function applyLumModOrOff(color, kind, value) {
|
|
69
|
+
const hsl = rgbToHsl(color);
|
|
70
|
+
const pct = value / OOXML_PERCENT_SCALE;
|
|
71
|
+
const l = clamp01(kind === "lumMod" ? hsl.l * pct : hsl.l + pct);
|
|
72
|
+
return hslToRgb({
|
|
73
|
+
...hsl,
|
|
74
|
+
l
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
function applyColorTransforms(base, transforms) {
|
|
78
|
+
let color = base;
|
|
79
|
+
for (const t of transforms) if (t.kind === "shade" || t.kind === "tint") color = applyShadeOrTint(color, t.kind, t.value);
|
|
80
|
+
for (const t of transforms) if (t.kind === "lumMod" || t.kind === "lumOff") color = applyLumModOrOff(color, t.kind, t.value);
|
|
81
|
+
return color;
|
|
82
|
+
}
|
|
83
|
+
//#endregion
|
|
84
|
+
export { applyColorTransforms };
|