@hirokisakabe/pom 9.1.0 → 9.1.2
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/dist/buildContext.js +2 -4
- package/dist/buildContext.js.map +1 -1
- package/dist/buildPptx.d.ts.map +1 -1
- package/dist/buildPptx.js +2 -6
- package/dist/buildPptx.js.map +1 -1
- package/dist/extractSlideMastersAsPptx.js +1 -1
- package/dist/renderPptx/glimpseTextBoxes.js +646 -0
- package/dist/renderPptx/glimpseTextBoxes.js.map +1 -0
- package/dist/renderPptx/nodes/flow.js +95 -90
- package/dist/renderPptx/nodes/flow.js.map +1 -1
- package/dist/renderPptx/nodes/icon.js +33 -24
- package/dist/renderPptx/nodes/icon.js.map +1 -1
- package/dist/renderPptx/nodes/image.js +5 -22
- package/dist/renderPptx/nodes/image.js.map +1 -1
- package/dist/renderPptx/nodes/list.js +96 -111
- package/dist/renderPptx/nodes/list.js.map +1 -1
- package/dist/renderPptx/nodes/matrix.js +92 -70
- package/dist/renderPptx/nodes/matrix.js.map +1 -1
- package/dist/renderPptx/nodes/processArrow.js +68 -35
- package/dist/renderPptx/nodes/processArrow.js.map +1 -1
- package/dist/renderPptx/nodes/pyramid.js +34 -16
- package/dist/renderPptx/nodes/pyramid.js.map +1 -1
- package/dist/renderPptx/nodes/shape.js +63 -37
- package/dist/renderPptx/nodes/shape.js.map +1 -1
- package/dist/renderPptx/nodes/svg.js +2 -5
- package/dist/renderPptx/nodes/svg.js.map +1 -1
- package/dist/renderPptx/nodes/text.js +16 -45
- package/dist/renderPptx/nodes/text.js.map +1 -1
- package/dist/renderPptx/nodes/timeline.js +108 -74
- package/dist/renderPptx/nodes/timeline.js.map +1 -1
- package/dist/renderPptx/nodes/tree.js +78 -79
- package/dist/renderPptx/nodes/tree.js.map +1 -1
- package/dist/renderPptx/renderPptx.js +4 -5
- package/dist/renderPptx/renderPptx.js.map +1 -1
- package/dist/renderPptx/utils/backgroundBorder.js +85 -49
- package/dist/renderPptx/utils/backgroundBorder.js.map +1 -1
- package/dist/renderPptx/utils/glimpsePicture.js +130 -0
- package/dist/renderPptx/utils/glimpsePicture.js.map +1 -0
- package/dist/renderPptx/utils/glimpseShape.js +90 -0
- package/dist/renderPptx/utils/glimpseShape.js.map +1 -0
- package/dist/renderPptx/utils/glimpseTextBox.js +126 -0
- package/dist/renderPptx/utils/glimpseTextBox.js.map +1 -0
- package/dist/renderPptx/utils/straightLine.js +29 -14
- package/dist/renderPptx/utils/straightLine.js.map +1 -1
- package/dist/renderPptx/utils/visualStyle.js +1 -24
- package/dist/renderPptx/utils/visualStyle.js.map +1 -1
- package/dist/types.js +1 -1
- package/package.json +4 -4
- package/dist/renderPptx/glowEffects.js +0 -152
- package/dist/renderPptx/glowEffects.js.map +0 -1
- package/dist/renderPptx/gradientFills.js +0 -167
- package/dist/renderPptx/gradientFills.js.map +0 -1
|
@@ -1,167 +0,0 @@
|
|
|
1
|
-
import { parseGradient, parseLinearGradient } from "../shared/gradient.js";
|
|
2
|
-
//#region src/renderPptx/gradientFills.ts
|
|
3
|
-
async function loadJSZip() {
|
|
4
|
-
const mod = await import("jszip");
|
|
5
|
-
return mod.default ?? mod;
|
|
6
|
-
}
|
|
7
|
-
/** マーカー色の探索開始値。reserveColors で予約済みの色はスキップされる */
|
|
8
|
-
const MARKER_BASE = 1014333;
|
|
9
|
-
var GradientFillRegistry = class {
|
|
10
|
-
reserved = /* @__PURE__ */ new Set();
|
|
11
|
-
markerBySpec = /* @__PURE__ */ new Map();
|
|
12
|
-
registered = [];
|
|
13
|
-
nextCandidate = MARKER_BASE;
|
|
14
|
-
/**
|
|
15
|
-
* テキスト中に現れる 6桁 HEX をマーカー候補から除外する。
|
|
16
|
-
* 入力 XML 由来のユーザー指定色とマーカーの衝突を防ぐため、
|
|
17
|
-
* register より前に入力 XML 文字列を渡しておく。
|
|
18
|
-
*/
|
|
19
|
-
reserveColors(text) {
|
|
20
|
-
for (const match of text.matchAll(/[0-9a-fA-F]{6}/g)) this.reserved.add(match[0].toUpperCase());
|
|
21
|
-
}
|
|
22
|
-
/** グラデーションを登録し、対応するマーカー色を返す */
|
|
23
|
-
register(gradient, opacity) {
|
|
24
|
-
const specKey = JSON.stringify({
|
|
25
|
-
gradient,
|
|
26
|
-
opacity
|
|
27
|
-
});
|
|
28
|
-
const existing = this.markerBySpec.get(specKey);
|
|
29
|
-
if (existing) return existing;
|
|
30
|
-
let marker;
|
|
31
|
-
do {
|
|
32
|
-
marker = this.nextCandidate.toString(16).toUpperCase().padStart(6, "0");
|
|
33
|
-
this.nextCandidate = (this.nextCandidate + 1) % 16777216;
|
|
34
|
-
} while (this.reserved.has(marker));
|
|
35
|
-
this.reserved.add(marker);
|
|
36
|
-
this.markerBySpec.set(specKey, marker);
|
|
37
|
-
this.registered.push({
|
|
38
|
-
marker,
|
|
39
|
-
gradient,
|
|
40
|
-
opacity
|
|
41
|
-
});
|
|
42
|
-
return marker;
|
|
43
|
-
}
|
|
44
|
-
get isEmpty() {
|
|
45
|
-
return this.registered.length === 0;
|
|
46
|
-
}
|
|
47
|
-
get entries() {
|
|
48
|
-
return this.registered;
|
|
49
|
-
}
|
|
50
|
-
};
|
|
51
|
-
/**
|
|
52
|
-
* backgroundGradient 属性値をパースしてレジストリに登録し、マーカー色を返す。
|
|
53
|
-
* linear-gradient / radial-gradient の両方に対応。
|
|
54
|
-
* パースできない場合 (スキーマ検証済みのため通常発生しない) は undefined を返す。
|
|
55
|
-
*/
|
|
56
|
-
function registerBackgroundGradient(value, opacity, registry) {
|
|
57
|
-
const gradient = parseGradient(value);
|
|
58
|
-
if (!gradient) return void 0;
|
|
59
|
-
return registry.register(gradient, opacity);
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* textGradient 属性値をパースしてレジストリに登録し、マーカー色を返す。
|
|
63
|
-
* 戻り値のマーカー色を text run の color に渡すと、pptxgenjs が出力する
|
|
64
|
-
* `<a:rPr><a:solidFill><a:srgbClr val="マーカー色"/></a:solidFill></a:rPr>` が
|
|
65
|
-
* 後処理で gradFill に置換され、PowerPoint 上ネイティブの文字グラデーションとして
|
|
66
|
-
* 表示・編集可能になる。
|
|
67
|
-
*
|
|
68
|
-
* textGradient は radial-gradient を受け付けない (linear-gradient のみ)。
|
|
69
|
-
* パースできない場合 (スキーマ検証済みのため通常発生しない) は undefined を返す。
|
|
70
|
-
*/
|
|
71
|
-
function registerTextGradient(value, registry) {
|
|
72
|
-
const linear = parseLinearGradient(value);
|
|
73
|
-
if (!linear) return void 0;
|
|
74
|
-
return registry.register({
|
|
75
|
-
kind: "linear",
|
|
76
|
-
value: linear
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Gradient を DrawingML の `<a:gradFill>` 要素に変換する
|
|
81
|
-
*
|
|
82
|
-
* - カラーストップ位置: % → 1/1000 % (0-100000)
|
|
83
|
-
* - 角度 (linear): CSS 基準 (0deg = 上向き) → DrawingML 基準 (0 = 右向き、1/60000 度)
|
|
84
|
-
* - 中心位置 (radial): CSS 風 % → DrawingML `<a:fillToRect l/t/r/b>` (1/1000 %)。
|
|
85
|
-
* fillToRect は焦点を表す矩形で、中心位置 (cx, cy) に対し
|
|
86
|
-
* l=cx*1000 / t=cy*1000 / r=(100-cx)*1000 / b=(100-cy)*1000 とする。
|
|
87
|
-
* PowerPoint の radial fill は path="circle" 1 種類で、shape (circle / ellipse) や
|
|
88
|
-
* size キーワードを描画上区別しない。要素の縦横比に応じて自動で楕円状になる。
|
|
89
|
-
*/
|
|
90
|
-
function buildGradFillXml(gradient, opacity) {
|
|
91
|
-
const alphaXml = opacity !== void 0 ? `<a:alpha val="${Math.round(opacity * 1e5)}"/>` : "";
|
|
92
|
-
const gsXml = gradient.value.stops.map((stop) => {
|
|
93
|
-
return `<a:gs pos="${Math.round(stop.position * 1e3)}">${alphaXml ? `<a:srgbClr val="${stop.color}">${alphaXml}</a:srgbClr>` : `<a:srgbClr val="${stop.color}"/>`}</a:gs>`;
|
|
94
|
-
}).join("");
|
|
95
|
-
if (gradient.kind === "linear") {
|
|
96
|
-
const dmlAngle = ((gradient.value.angle - 90) % 360 + 360) % 360;
|
|
97
|
-
return `<a:gradFill flip="none" rotWithShape="1"><a:gsLst>${gsXml}</a:gsLst><a:lin ang="${Math.round(dmlAngle * 6e4)}" scaled="0"/></a:gradFill>`;
|
|
98
|
-
}
|
|
99
|
-
const { centerX, centerY } = gradient.value;
|
|
100
|
-
return `<a:gradFill flip="none" rotWithShape="1"><a:gsLst>${gsXml}</a:gsLst><a:path path="circle"><a:fillToRect l="${Math.round(centerX * 1e3)}" t="${Math.round(centerY * 1e3)}" r="${Math.round((100 - centerX) * 1e3)}" b="${Math.round((100 - centerY) * 1e3)}"/></a:path></a:gradFill>`;
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* 出力 zip 内のスライド XML のマーカー solidFill を gradFill に置換する
|
|
104
|
-
*/
|
|
105
|
-
async function applyGradientFills(data, registry) {
|
|
106
|
-
const zip = await (await loadJSZip()).loadAsync(data);
|
|
107
|
-
const slidePaths = Object.keys(zip.files).filter((path) => /^ppt\/slides\/slide\d+\.xml$/.test(path));
|
|
108
|
-
for (const path of slidePaths) {
|
|
109
|
-
const file = zip.file(path);
|
|
110
|
-
if (!file) continue;
|
|
111
|
-
let xml = await file.async("text");
|
|
112
|
-
let replaced = false;
|
|
113
|
-
for (const { marker, gradient, opacity } of registry.entries) {
|
|
114
|
-
const target = `<a:solidFill><a:srgbClr val="${marker}"/></a:solidFill>`;
|
|
115
|
-
if (!xml.includes(target)) continue;
|
|
116
|
-
xml = xml.replaceAll(target, buildGradFillXml(gradient, opacity));
|
|
117
|
-
replaced = true;
|
|
118
|
-
}
|
|
119
|
-
if (replaced) zip.file(path, xml);
|
|
120
|
-
}
|
|
121
|
-
return zip;
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* pptx インスタンスの write / writeFile をラップし、
|
|
125
|
-
* 出力時にグラデーション後処理を適用する。
|
|
126
|
-
*
|
|
127
|
-
* pptxgenjs の write と同じ outputType / compression の挙動を再現する。
|
|
128
|
-
* writeFile は Node 環境のみ後処理対象 (ブラウザでは pptxgenjs がダウンロード
|
|
129
|
-
* 処理を行うため、元の実装にフォールバックする)。
|
|
130
|
-
*/
|
|
131
|
-
function patchPptxWriteForGradientFills(pptx, registry) {
|
|
132
|
-
if (registry.isEmpty) return;
|
|
133
|
-
const originalWrite = pptx.write.bind(pptx);
|
|
134
|
-
const originalWriteFile = pptx.writeFile.bind(pptx);
|
|
135
|
-
const patchedWrite = async (rawProps) => {
|
|
136
|
-
const props = typeof rawProps === "string" ? { outputType: rawProps } : rawProps;
|
|
137
|
-
const zip = await applyGradientFills(await originalWrite({ outputType: "uint8array" }), registry);
|
|
138
|
-
const outputType = props?.outputType;
|
|
139
|
-
if (outputType === "STREAM") return zip.generateAsync({
|
|
140
|
-
type: "nodebuffer",
|
|
141
|
-
compression: props?.compression ? "DEFLATE" : "STORE"
|
|
142
|
-
});
|
|
143
|
-
if (outputType) return zip.generateAsync({ type: outputType });
|
|
144
|
-
return zip.generateAsync({
|
|
145
|
-
type: "blob",
|
|
146
|
-
compression: props?.compression ? "DEFLATE" : "STORE"
|
|
147
|
-
});
|
|
148
|
-
};
|
|
149
|
-
pptx.write = patchedWrite;
|
|
150
|
-
const patchedWriteFile = async (rawProps) => {
|
|
151
|
-
const props = typeof rawProps === "string" ? { fileName: rawProps } : rawProps;
|
|
152
|
-
if (!(typeof process !== "undefined" && Boolean(process.versions?.node))) return originalWriteFile(props);
|
|
153
|
-
const rawName = props?.fileName ?? "Presentation.pptx";
|
|
154
|
-
const fileName = rawName.toLowerCase().endsWith(".pptx") ? rawName : `${rawName}.pptx`;
|
|
155
|
-
const buffer = await patchedWrite({
|
|
156
|
-
outputType: "nodebuffer",
|
|
157
|
-
compression: props?.compression
|
|
158
|
-
});
|
|
159
|
-
await (await import("fs")).promises.writeFile(fileName, buffer);
|
|
160
|
-
return fileName;
|
|
161
|
-
};
|
|
162
|
-
pptx.writeFile = patchedWriteFile;
|
|
163
|
-
}
|
|
164
|
-
//#endregion
|
|
165
|
-
export { GradientFillRegistry, applyGradientFills, patchPptxWriteForGradientFills, registerBackgroundGradient, registerTextGradient };
|
|
166
|
-
|
|
167
|
-
//# sourceMappingURL=gradientFills.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"gradientFills.js","names":[],"sources":["../../src/renderPptx/gradientFills.ts"],"sourcesContent":["/**\n * グラデーション塗りの実現\n *\n * pptxgenjs はグラデーション塗りを未サポート\n * (https://github.com/gitbrent/PptxGenJS/issues/102) のため、以下の方式で実現する:\n *\n * 1. レンダリング時: グラデーション指定のある shape をビルド内で一意なマーカー色の\n * 単色塗り (solidFill) として描画し、レジストリに登録する\n * 2. 出力時: pptx.write() / writeFile() をラップし、出力 zip 内のスライド XML の\n * `<a:solidFill><a:srgbClr val=\"マーカー色\"/></a:solidFill>` を\n * DrawingML ネイティブの `<a:gradFill>` に置換する\n *\n * 置換は pptxgenjs が生成する固定パターンに対する完全一致の文字列置換で行う。\n * スライド XML 全体をパーサーで往復させると無関係な要素の表現が変わり得るため、\n * 意図的に文字列置換を採用している。\n */\nimport type { Gradient } from \"../shared/gradient.ts\";\nimport { parseGradient, parseLinearGradient } from \"../shared/gradient.ts\";\n\ntype PptxGenJSInstance = import(\"pptxgenjs\").default;\ntype WriteProps = NonNullable<Parameters<PptxGenJSInstance[\"write\"]>[0]>;\ntype WriteFileProps = NonNullable<\n Parameters<PptxGenJSInstance[\"writeFile\"]>[0]\n>;\n\n// JSZip は CJS パッケージのため動的 import で読み込む\nasync function loadJSZip(): Promise<typeof import(\"jszip\")> {\n const mod = await import(\"jszip\");\n /* eslint-disable @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-return */\n return (mod as any).default ?? mod;\n /* eslint-enable @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-return */\n}\n\ninterface RegisteredGradientFill {\n /** マーカー色 (6桁大文字 HEX、# なし) */\n marker: string;\n gradient: Gradient;\n /** 0-1。指定時は各カラーストップに alpha として反映する */\n opacity?: number;\n}\n\n/** マーカー色の探索開始値。reserveColors で予約済みの色はスキップされる */\nconst MARKER_BASE = 0x0f7a3d;\n\nexport class GradientFillRegistry {\n private readonly reserved = new Set<string>();\n private readonly markerBySpec = new Map<string, string>();\n private readonly registered: RegisteredGradientFill[] = [];\n private nextCandidate = MARKER_BASE;\n\n /**\n * テキスト中に現れる 6桁 HEX をマーカー候補から除外する。\n * 入力 XML 由来のユーザー指定色とマーカーの衝突を防ぐため、\n * register より前に入力 XML 文字列を渡しておく。\n */\n reserveColors(text: string): void {\n for (const match of text.matchAll(/[0-9a-fA-F]{6}/g)) {\n this.reserved.add(match[0].toUpperCase());\n }\n }\n\n /** グラデーションを登録し、対応するマーカー色を返す */\n register(gradient: Gradient, opacity?: number): string {\n const specKey = JSON.stringify({ gradient, opacity });\n const existing = this.markerBySpec.get(specKey);\n if (existing) return existing;\n\n let marker: string;\n do {\n marker = this.nextCandidate.toString(16).toUpperCase().padStart(6, \"0\");\n this.nextCandidate = (this.nextCandidate + 1) % 0x1000000;\n } while (this.reserved.has(marker));\n this.reserved.add(marker);\n\n this.markerBySpec.set(specKey, marker);\n this.registered.push({ marker, gradient, opacity });\n return marker;\n }\n\n get isEmpty(): boolean {\n return this.registered.length === 0;\n }\n\n get entries(): readonly RegisteredGradientFill[] {\n return this.registered;\n }\n}\n\n/**\n * backgroundGradient 属性値をパースしてレジストリに登録し、マーカー色を返す。\n * linear-gradient / radial-gradient の両方に対応。\n * パースできない場合 (スキーマ検証済みのため通常発生しない) は undefined を返す。\n */\nexport function registerBackgroundGradient(\n value: string,\n opacity: number | undefined,\n registry: GradientFillRegistry,\n): string | undefined {\n const gradient = parseGradient(value);\n if (!gradient) return undefined;\n return registry.register(gradient, opacity);\n}\n\n/**\n * textGradient 属性値をパースしてレジストリに登録し、マーカー色を返す。\n * 戻り値のマーカー色を text run の color に渡すと、pptxgenjs が出力する\n * `<a:rPr><a:solidFill><a:srgbClr val=\"マーカー色\"/></a:solidFill></a:rPr>` が\n * 後処理で gradFill に置換され、PowerPoint 上ネイティブの文字グラデーションとして\n * 表示・編集可能になる。\n *\n * textGradient は radial-gradient を受け付けない (linear-gradient のみ)。\n * パースできない場合 (スキーマ検証済みのため通常発生しない) は undefined を返す。\n */\nexport function registerTextGradient(\n value: string,\n registry: GradientFillRegistry,\n): string | undefined {\n const linear = parseLinearGradient(value);\n if (!linear) return undefined;\n return registry.register({ kind: \"linear\", value: linear });\n}\n\n/**\n * Gradient を DrawingML の `<a:gradFill>` 要素に変換する\n *\n * - カラーストップ位置: % → 1/1000 % (0-100000)\n * - 角度 (linear): CSS 基準 (0deg = 上向き) → DrawingML 基準 (0 = 右向き、1/60000 度)\n * - 中心位置 (radial): CSS 風 % → DrawingML `<a:fillToRect l/t/r/b>` (1/1000 %)。\n * fillToRect は焦点を表す矩形で、中心位置 (cx, cy) に対し\n * l=cx*1000 / t=cy*1000 / r=(100-cx)*1000 / b=(100-cy)*1000 とする。\n * PowerPoint の radial fill は path=\"circle\" 1 種類で、shape (circle / ellipse) や\n * size キーワードを描画上区別しない。要素の縦横比に応じて自動で楕円状になる。\n */\nfunction buildGradFillXml(gradient: Gradient, opacity?: number): string {\n const alphaXml =\n opacity !== undefined\n ? `<a:alpha val=\"${Math.round(opacity * 100000)}\"/>`\n : \"\";\n const gsXml = gradient.value.stops\n .map((stop) => {\n const pos = Math.round(stop.position * 1000);\n const srgbClr = alphaXml\n ? `<a:srgbClr val=\"${stop.color}\">${alphaXml}</a:srgbClr>`\n : `<a:srgbClr val=\"${stop.color}\"/>`;\n return `<a:gs pos=\"${pos}\">${srgbClr}</a:gs>`;\n })\n .join(\"\");\n\n if (gradient.kind === \"linear\") {\n const dmlAngle = (((gradient.value.angle - 90) % 360) + 360) % 360;\n const ang = Math.round(dmlAngle * 60000);\n return `<a:gradFill flip=\"none\" rotWithShape=\"1\"><a:gsLst>${gsXml}</a:gsLst><a:lin ang=\"${ang}\" scaled=\"0\"/></a:gradFill>`;\n }\n\n const { centerX, centerY } = gradient.value;\n const l = Math.round(centerX * 1000);\n const t = Math.round(centerY * 1000);\n const r = Math.round((100 - centerX) * 1000);\n const b = Math.round((100 - centerY) * 1000);\n return `<a:gradFill flip=\"none\" rotWithShape=\"1\"><a:gsLst>${gsXml}</a:gsLst><a:path path=\"circle\"><a:fillToRect l=\"${l}\" t=\"${t}\" r=\"${r}\" b=\"${b}\"/></a:path></a:gradFill>`;\n}\n\n/**\n * 出力 zip 内のスライド XML のマーカー solidFill を gradFill に置換する\n */\nexport async function applyGradientFills(\n data: Uint8Array | ArrayBuffer,\n registry: GradientFillRegistry,\n): Promise<import(\"jszip\")> {\n const JSZip = await loadJSZip();\n const zip = await JSZip.loadAsync(data);\n\n const slidePaths = Object.keys(zip.files).filter((path) =>\n /^ppt\\/slides\\/slide\\d+\\.xml$/.test(path),\n );\n for (const path of slidePaths) {\n const file = zip.file(path);\n if (!file) continue;\n let xml = await file.async(\"text\");\n let replaced = false;\n for (const { marker, gradient, opacity } of registry.entries) {\n const target = `<a:solidFill><a:srgbClr val=\"${marker}\"/></a:solidFill>`;\n if (!xml.includes(target)) continue;\n xml = xml.replaceAll(target, buildGradFillXml(gradient, opacity));\n replaced = true;\n }\n if (replaced) {\n zip.file(path, xml);\n }\n }\n return zip;\n}\n\n/**\n * pptx インスタンスの write / writeFile をラップし、\n * 出力時にグラデーション後処理を適用する。\n *\n * pptxgenjs の write と同じ outputType / compression の挙動を再現する。\n * writeFile は Node 環境のみ後処理対象 (ブラウザでは pptxgenjs がダウンロード\n * 処理を行うため、元の実装にフォールバックする)。\n */\nexport function patchPptxWriteForGradientFills(\n pptx: PptxGenJSInstance,\n registry: GradientFillRegistry,\n): void {\n if (registry.isEmpty) return;\n\n const originalWrite = pptx.write.bind(pptx);\n const originalWriteFile = pptx.writeFile.bind(pptx);\n\n const patchedWrite = async (rawProps?: WriteProps | string) => {\n // DEPRECATED: pptxgenjs は write(outputType) の文字列 overload を\n // ランタイムでは今も受け付けるため、同様に正規化する\n const props: WriteProps | undefined =\n typeof rawProps === \"string\"\n ? ({ outputType: rawProps } as WriteProps)\n : rawProps;\n const data = (await originalWrite({\n outputType: \"uint8array\",\n })) as Uint8Array;\n const zip = await applyGradientFills(data, registry);\n\n const outputType = props?.outputType;\n if (outputType === \"STREAM\") {\n return zip.generateAsync({\n type: \"nodebuffer\",\n compression: props?.compression ? \"DEFLATE\" : \"STORE\",\n });\n }\n if (outputType) {\n return zip.generateAsync({ type: outputType });\n }\n return zip.generateAsync({\n type: \"blob\",\n compression: props?.compression ? \"DEFLATE\" : \"STORE\",\n });\n };\n pptx.write = patchedWrite;\n\n const patchedWriteFile = async (rawProps?: WriteFileProps | string) => {\n // DEPRECATED: pptxgenjs は writeFile(fileName) の文字列 overload を\n // ランタイムでは今も受け付けるため、同様に正規化する\n const props: WriteFileProps | undefined =\n typeof rawProps === \"string\" ? { fileName: rawProps } : rawProps;\n const isNode =\n typeof process !== \"undefined\" && Boolean(process.versions?.node);\n if (!isNode) {\n return originalWriteFile(props);\n }\n const rawName = props?.fileName ?? \"Presentation.pptx\";\n const fileName = rawName.toLowerCase().endsWith(\".pptx\")\n ? rawName\n : `${rawName}.pptx`;\n const buffer = (await patchedWrite({\n outputType: \"nodebuffer\",\n compression: props?.compression,\n })) as Buffer;\n const fs = await import(\"fs\");\n await fs.promises.writeFile(fileName, buffer);\n return fileName;\n };\n pptx.writeFile = patchedWriteFile;\n}\n"],"mappings":"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"}
|