Skip to content

Commit f6bcf68

Browse files
committed
chore(generate): use custom pptxGenJS instance; expose IPptxGenJSSlide;
1 parent 875a285 commit f6bcf68

File tree

9 files changed

+162
-123
lines changed

9 files changed

+162
-123
lines changed

src/automizer.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,16 @@ import path from 'path';
1919
import * as fs from 'fs';
2020
import { XmlHelper } from './helper/xml-helper';
2121
import ModifyPresentationHelper from './helper/modify-presentation-helper';
22-
import { contentTracker as Tracker, ContentTracker } from './helper/content-tracker';
22+
import {
23+
contentTracker as Tracker,
24+
ContentTracker,
25+
} from './helper/content-tracker';
2326
import JSZip from 'jszip';
2427
import { ISlide } from './interfaces/islide';
2528
import { IMaster } from './interfaces/imaster';
2629
import { ContentTypeExtension } from './enums/content-type-map';
2730
import slugify from 'slugify';
31+
import PptxGenJS from 'pptxgenjs';
2832

2933
/**
3034
* Automizer
@@ -489,11 +493,11 @@ export default class Automizer implements IPresentationProps {
489493
await this.rootTemplate.countExistingSlides();
490494
this.status.max = this.rootTemplate.slides.length;
491495

492-
await this.rootTemplate.runExternalGenerators();
496+
await this.rootTemplate.runExternalGenerator();
493497
for (const slide of this.rootTemplate.slides) {
494498
await this.rootTemplate.appendSlide(slide);
495499
}
496-
await this.rootTemplate.cleanupExternalGenerators();
500+
await this.rootTemplate.cleanupExternalGenerator();
497501

498502
if (this.params.removeExistingSlides) {
499503
await this.rootTemplate.truncate();

src/classes/has-shapes.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -265,9 +265,6 @@ export default class HasShapes {
265265
return this;
266266
}
267267

268-
/**
269-
*
270-
*/
271268
generate(generate: GenerateOnSlideCallback, objectName?: string): this {
272269
this.generateElements.push({
273270
objectName,

src/classes/template.ts

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ export class Template implements ITemplate {
6969
mediaFiles: MediaFile[] = [];
7070

7171
automizer: Automizer;
72-
generators: IGenerator[] = [];
72+
generator: IGenerator;
7373

7474
constructor(file: AutomizerFile, params: ArchiveParams) {
7575
this.file = file;
@@ -241,19 +241,12 @@ export class Template implements ITemplate {
241241
return CountHelper.count(name, this.counter);
242242
}
243243

244-
async runExternalGenerators() {
245-
this.generators.push(
246-
new GeneratePptxGenJs(this.automizer, this.slides).create(),
247-
);
248-
249-
for (const generator of this.generators) {
250-
await generator.generateSlides();
251-
}
244+
async runExternalGenerator() {
245+
this.generator = new GeneratePptxGenJs(this.automizer, this.slides);
246+
await this.generator.generateSlides();
252247
}
253248

254-
async cleanupExternalGenerators() {
255-
for (const generator of this.generators) {
256-
await generator.cleanup();
257-
}
249+
async cleanupExternalGenerator() {
250+
await this.generator.cleanup();
258251
}
259252
}

src/helper/generate/generate-pptxgenjs.ts

Lines changed: 59 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
import { randomUUID } from 'crypto';
22
import PptxGenJS from 'pptxgenjs';
3-
import fs from 'fs';
43
import { ISlide } from '../../interfaces/islide';
54
import Automizer from '../../automizer';
6-
import { GenerateElements, SupportedPptxGenJSSlide } from '../../types/types';
5+
import { GenerateElements } from '../../types/types';
76
import { IGenerator } from '../../interfaces/igenerator';
7+
import { IPptxGenJSSlide } from '../../interfaces/ipptxgenjs-slide';
8+
import { vd } from '../general-helper';
89

10+
/**
11+
* Using pptxGenJs on an automizer ISlide will create a temporary pptx template
12+
* and auto-import the generated shapes to the right place on the output slides.
13+
*/
914
export default class GeneratePptxGenJs implements IGenerator {
1015
tmpFile: string;
1116
slides: ISlide[];
@@ -16,11 +21,17 @@ export default class GeneratePptxGenJs implements IGenerator {
1621
constructor(automizer: Automizer, slides: ISlide[]) {
1722
this.automizer = automizer;
1823
this.slides = slides;
24+
this.create();
1925
}
2026

21-
create(): this {
22-
this.generator = new PptxGenJS();
23-
return this;
27+
create() {
28+
if (this.automizer.params.pptxGenJs) {
29+
// Use a customized pptxGenJs instance
30+
this.generator = this.automizer.params.pptxGenJs;
31+
} else {
32+
// Or the installed version
33+
this.generator = new PptxGenJS();
34+
}
2435
}
2536

2637
async generateSlides(): Promise<void> {
@@ -29,7 +40,8 @@ export default class GeneratePptxGenJs implements IGenerator {
2940
const generate = slide.getGeneratedElements();
3041
if (generate.length) {
3142
this.countSlides++;
32-
this.addElements(generate, this.appendPptxGenSlide(), slide);
43+
await this.generateElements(generate, this.appendPptxGenSlide());
44+
this.addElements(generate, slide);
3345
}
3446
}
3547

@@ -41,72 +53,79 @@ export default class GeneratePptxGenJs implements IGenerator {
4153
}
4254
}
4355

44-
addElements(
56+
async generateElements(
4557
generate: GenerateElements[],
4658
pgenSlide: PptxGenJS.Slide,
47-
slide: ISlide,
48-
) {
49-
generate.forEach((generateElement) => {
59+
): Promise<void> {
60+
for (const generateElement of generate) {
5061
generateElement.tmpSlideNumber = this.countSlides;
51-
5262
const addedObjects = <string[]>[];
53-
54-
generateElement.callback(
55-
this.supportedSlideItems(pgenSlide, generateElement, addedObjects),
63+
await generateElement.callback(
64+
this.addSlideItems(pgenSlide, generateElement, addedObjects),
5665
this.generator,
5766
);
67+
generateElement.addedObjects = [...addedObjects];
68+
}
69+
}
5870

59-
addedObjects.forEach((addedObjectName) => {
71+
addElements(generate: GenerateElements[], slide: ISlide) {
72+
generate.forEach((generateElement) => {
73+
generateElement.addedObjects.forEach((addedObjectName) => {
6074
slide.addElement(this.tmpFile, this.countSlides, addedObjectName);
6175
});
6276
});
6377
}
6478

65-
supportedSlideItems = (
79+
/**
80+
* This is a wrapper around supported pptxGenJS slide item types.
81+
* It is required to create a unique objectName and find the generated
82+
* shapes by object name later.
83+
*
84+
* @param pgenSlide
85+
* @param generateElement
86+
* @param addedObjects
87+
*/
88+
addSlideItems = (
6689
pgenSlide: PptxGenJS.Slide,
6790
generateElement: GenerateElements,
6891
addedObjects: string[],
69-
): SupportedPptxGenJSSlide => {
92+
): IPptxGenJSSlide => {
93+
const getObjectName = () => {
94+
return this.generateObjectName(generateElement, addedObjects);
95+
};
7096
return {
7197
addChart: (type, data, options) => {
72-
const objectName = this.generateObjectName(
73-
generateElement,
74-
addedObjects,
98+
pgenSlide.addChart(
99+
type,
100+
data,
101+
this.getOptions(options, getObjectName()),
75102
);
76-
pgenSlide.addChart(type, data, this.getOptions(options, objectName));
77103
},
78104
addImage: (options) => {
79-
const objectName = this.generateObjectName(
80-
generateElement,
81-
addedObjects,
82-
);
83-
pgenSlide.addImage(this.getOptions(options, objectName));
105+
pgenSlide.addImage(this.getOptions(options, getObjectName()));
84106
},
85107
addShape: (shapeName, options?) => {
86-
const objectName = this.generateObjectName(
87-
generateElement,
88-
addedObjects,
108+
pgenSlide.addShape(
109+
shapeName,
110+
this.getOptions(options, getObjectName()),
89111
);
90-
pgenSlide.addShape(shapeName, this.getOptions(options, objectName));
91112
},
92113
addTable: (tableRows, options?) => {
93-
const objectName = this.generateObjectName(
94-
generateElement,
95-
addedObjects,
114+
pgenSlide.addTable(
115+
tableRows,
116+
this.getOptions(options, getObjectName()),
96117
);
97-
pgenSlide.addTable(tableRows, this.getOptions(options, objectName));
98118
},
99119
addText: (text, options?) => {
100-
const objectName = this.generateObjectName(
101-
generateElement,
102-
addedObjects,
103-
);
104-
pgenSlide.addText(text, this.getOptions(options, objectName));
120+
pgenSlide.addText(text, this.getOptions(options, getObjectName()));
105121
},
106122
};
107123
};
108124

109-
generateObjectName(generateElement, addedObjects: string[]): string {
125+
generateObjectName(
126+
generateElement: GenerateElements,
127+
addedObjects: string[],
128+
): string {
110129
const objectName =
111130
(generateElement.objectName ? generateElement.objectName + '-' : '') +
112131
randomUUID();

src/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import ModifyColorHelper from './helper/modify-color-helper';
3939
import { ITemplate } from './interfaces/itemplate';
4040
import { IMaster } from './interfaces/imaster';
4141
import { ISlide } from './interfaces/islide';
42+
import { IPptxGenJSSlide } from './interfaces/ipptxgenjs-slide';
4243
import ModifyImageHelper from './helper/modify-image-helper';
4344
import { LabelPosition } from './enums/chart-type';
4445

@@ -162,5 +163,5 @@ export type {
162163
XmlElement,
163164
XmlDocument,
164165
};
165-
export { ITemplate, IMaster, ISlide };
166+
export { ITemplate, IMaster, ISlide, IPptxGenJSSlide };
166167
export default Automizer;

src/interfaces/igenerator.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
export interface IGenerator {
2-
create(): IGenerator;
32
generateSlides(): Promise<void>;
3+
44
cleanup(): Promise<void>;
55
}

src/interfaces/ipptxgenjs-slide.ts

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import PptxGenJS from 'pptxgenjs';
2+
3+
/**
4+
* Usage of pptxGenJs insinde pptx-automizer is restricted to supported
5+
* shape types.
6+
*/
7+
export interface IPptxGenJSSlide {
8+
/**
9+
* Add chart to Slide
10+
* @param {CHART_NAME|IChartMulti[]} type - chart type
11+
* @param {object[]} data - data object
12+
* @param {IChartOpts} options - chart options
13+
* @return {Slide} this Slide
14+
* @type {Function}
15+
*/
16+
addChart(
17+
type: PptxGenJS.CHART_NAME | PptxGenJS.IChartMulti[],
18+
data: any[],
19+
options?: PptxGenJS.IChartOpts,
20+
): void;
21+
22+
/**
23+
* Add image to Slide
24+
* @param {ImageProps} options - image options
25+
* @return {Slide} this Slide
26+
*/
27+
addImage(options: PptxGenJS.ImageProps): void;
28+
29+
/**
30+
* Add shape to Slide
31+
* @param {SHAPE_NAME} shapeName - shape name
32+
* @param {ShapeProps} options - shape options
33+
* @return {Slide} this Slide
34+
*/
35+
addShape(
36+
shapeName: PptxGenJS.SHAPE_NAME,
37+
options?: PptxGenJS.ShapeProps,
38+
): void;
39+
40+
/**
41+
* Add table to Slide
42+
* @param {TableRow[]} tableRows - table rows
43+
* @param {TableProps} options - table options
44+
* @return {Slide} this Slide
45+
*/
46+
addTable(
47+
tableRows: PptxGenJS.TableRow[],
48+
options?: PptxGenJS.TableProps,
49+
): void;
50+
51+
/**
52+
* Add text to Slide
53+
* @param {string|TextProps[]} text - text string or complex object
54+
* @param {TextPropsOptions} options - text options
55+
* @return {Slide} this Slide
56+
*/
57+
addText(
58+
text: string | PptxGenJS.TextProps[],
59+
options?: PptxGenJS.TextPropsOptions,
60+
): void;
61+
}

src/interfaces/root-pres-template.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,25 @@ export interface RootPresTemplate extends ITemplate {
2121
) => void;
2222
getMappedContent: (type: string, key: string, sourceId: number) => any;
2323
getNamedMappedContent: (type: string, name: string) => any;
24+
2425
count(name: string): number;
26+
2527
incrementCounter(name: string): number;
28+
2629
appendSlide(slide: ISlide): Promise<void>;
30+
2731
appendMasterSlide(slideMaster: IMaster): Promise<void>;
32+
2833
appendLayout(slideLayout: ILayout): Promise<void>;
29-
runExternalGenerators?(): Promise<void>;
30-
cleanupExternalGenerators?(): Promise<void>;
34+
35+
runExternalGenerator?(): Promise<void>;
36+
37+
cleanupExternalGenerator?(): Promise<void>;
38+
3139
countExistingSlides(): Promise<void>;
40+
3241
truncate(): Promise<void>;
42+
3343
content?: ContentTracker;
3444
automizer?: Automizer;
3545
}

0 commit comments

Comments
 (0)