Skip to content

Commit 7983d5b

Browse files
committed
chore(templates): load templates in constructor
1 parent 6a0e088 commit 7983d5b

File tree

6 files changed

+55
-12
lines changed

6 files changed

+55
-12
lines changed

__tests__/modify-by-creation-id.test.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,12 @@ test('create presentation, add and modify an existing table by creation id.', as
2525
slide.modifyElement(
2626
'{EFC74B4C-D832-409B-9CF4-73C1EFF132D8}',
2727
[modify.setTableData(data1)]);
28+
29+
slide.addElement(
30+
'tables',
31+
1950777067,
32+
'{EFC74B4C-D832-409B-9CF4-73C1EFF132D8}',
33+
[modify.setTableData(data1)]);
2834
})
2935
.write(`modify-existing-table.test.pptx`);
3036

src/automizer.ts

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,37 @@ export default class Automizer implements IPresentationProps {
3333
* Creates an instance of `pptx-automizer`.
3434
* @param [params]
3535
*/
36-
constructor(params?: AutomizerParams) {
36+
constructor(params: AutomizerParams) {
3737
this.templates = [];
3838
this.params = params;
3939

4040
this.templateDir = params?.templateDir ? params.templateDir + '/' : '';
4141
this.outputDir = params?.outputDir ? params.outputDir + '/' : '';
4242

4343
this.timer = Date.now();
44+
45+
if(params.rootTemplate) {
46+
const location = this.getLocation(params.rootTemplate, 'template');
47+
this.rootTemplate = Template.import(location) as RootPresTemplate;
48+
}
49+
50+
if(params.presTemplates) {
51+
this.params.presTemplates.forEach(file => {
52+
const location = this.getLocation(file, 'template');
53+
const newTemplate = Template.import(location, file) as PresTemplate;
54+
this.templates.push(newTemplate);
55+
})
56+
}
57+
}
58+
59+
/**
60+
61+
*/
62+
public async presentation(): Promise<this> {
63+
if(this.params?.useCreationIds === true) {
64+
await this.setCreationIds()
65+
}
66+
return this;
4467
}
4568

4669
/**
@@ -131,12 +154,6 @@ export default class Automizer implements IPresentationProps {
131154

132155
const template = this.getTemplate(name);
133156

134-
if(template.creationIds !== undefined) {
135-
slideNumber = template.creationIds
136-
.find(slideInfo => slideInfo.id === slideNumber)
137-
.number
138-
}
139-
140157
const newSlide = new Slide({
141158
presentation: this,
142159
template,

src/classes/slide.ts

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -103,13 +103,24 @@ export class Slide implements ISlide {
103103
}) {
104104
this.sourceTemplate = params.template;
105105
this.sourceNumber = params.slideNumber;
106+
this.sourceNumber = this.getSlideNumber(params.template, params.slideNumber);
107+
106108
this.sourcePath = `ppt/slides/slide${this.sourceNumber}.xml`;
107109
this.relsPath = `ppt/slides/_rels/slide${this.sourceNumber}.xml.rels`;
108110

109111
this.modifications = [];
110112
this.importElements = [];
111113
}
112114

115+
getSlideNumber(template, slideNumber) {
116+
if(template.creationIds !== undefined) {
117+
return template.creationIds
118+
.find(slideInfo => slideInfo.id === slideNumber)
119+
.number
120+
}
121+
return slideNumber
122+
}
123+
113124
/**
114125
* Appends slide
115126
* @internal
@@ -283,7 +294,12 @@ export class Slide implements ISlide {
283294
*/
284295
async getElementInfo(importElement: ImportElement): Promise<ImportedElement> {
285296
const template = this.root.getTemplate(importElement.presName);
286-
const sourcePath = `ppt/slides/slide${importElement.slideNumber}.xml`;
297+
298+
const slideNumber = (importElement.mode === 'append')
299+
? this.getSlideNumber(template, importElement.slideNumber) : importElement.slideNumber
300+
301+
const sourcePath = `ppt/slides/slide${slideNumber}.xml`;
302+
287303
const sourceArchive = await template.archive;
288304
const hasCreationId = (template.creationIds !== undefined)
289305
const method = (hasCreationId)
@@ -298,22 +314,22 @@ export class Slide implements ISlide {
298314

299315
if (!sourceElement) {
300316
throw new Error(
301-
`Can't find ${importElement.selector} on slide ${importElement.slideNumber} in ${importElement.presName}`,
317+
`Can't find ${importElement.selector} on slide ${slideNumber} in ${importElement.presName}`,
302318
);
303319
}
304320

305321
const appendElementParams = await this.analyzeElement(
306322
sourceElement,
307323
sourceArchive,
308-
importElement.slideNumber,
324+
slideNumber,
309325
);
310326

311327
return {
312328
mode: importElement.mode,
313329
name: importElement.selector,
314330
hasCreationId: hasCreationId,
315331
sourceArchive,
316-
sourceSlideNumber: importElement.slideNumber,
332+
sourceSlideNumber: slideNumber,
317333
sourceElement,
318334
callback: importElement.callback,
319335
target: appendElementParams.target,

src/helper/file-helper.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ export class FileHelper {
2323
}
2424

2525
if (archive.files[file] === undefined) {
26+
console.trace()
2627
throw new Error('Archived file not found: ' + file);
2728
}
2829
return archive.files[file].async(type || 'string');

src/shapes/chart.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@ export class Chart extends Shape implements IChart {
315315
}
316316
});
317317

318-
XmlHelper.writeXmlToArchive(this.targetArchive, targetRelFile, relXml);
318+
await XmlHelper.writeXmlToArchive(this.targetArchive, targetRelFile, relXml);
319319
}
320320

321321
async copyWorksheetFile(): Promise<void> {

src/types/types.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ export type AutomizerParams = {
2323
* You can set a path here.
2424
*/
2525
outputDir?: string;
26+
rootTemplate?: string;
27+
presTemplates?: string[];
28+
useCreationIds?: boolean;
2629
};
2730
export type AutomizerSummary = {
2831
status: string;

0 commit comments

Comments
 (0)