Skip to content

Commit 3d9f82d

Browse files
committed
feature(slide): Remove existing charts, images or shapes from added slide
1 parent f6a5a7a commit 3d9f82d

File tree

8 files changed

+119
-17
lines changed

8 files changed

+119
-17
lines changed

README.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,17 @@ pres.addSlide('charts', 2, (slide) => {
114114
])
115115
})
116116

117+
// Remove existing charts, images or shapes from added slide.
118+
pres
119+
.addSlide('charts', 2, (slide) => {
120+
slide.removeElement('ColumnChart');
121+
})
122+
.addSlide('images', 2, (slide) => {
123+
slide.removeElement('imageJPG');
124+
slide.removeElement('Textfeld 5');
125+
slide.addElement('images', 2, 'imageJPG');
126+
})
127+
117128
// Finally, we want to write the output file.
118129
pres.write(`myPresentation.pptx`).then(summary => {
119130
console.log(summary)
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import Automizer from '../src/automizer';
2+
3+
test('create presentation, add slides, remove elements and add one.', async () => {
4+
const automizer = new Automizer({
5+
templateDir: `${__dirname}/pptx-templates`,
6+
outputDir: `${__dirname}/pptx-output`,
7+
});
8+
9+
const pres = automizer
10+
.loadRoot(`RootTemplate.pptx`)
11+
.load(`SlideWithCharts.pptx`, 'charts')
12+
.load(`SlideWithImages.pptx`, 'images');
13+
14+
const result = await pres
15+
.addSlide('charts', 2, (slide) => {
16+
slide.removeElement('ColumnChart');
17+
})
18+
.addSlide('images', 2, (slide) => {
19+
slide.removeElement('imageJPG');
20+
slide.removeElement('Textfeld 5');
21+
slide.addElement('images', 2, 'imageJPG');
22+
})
23+
.write(`remove-existing-elements.test.pptx`);
24+
25+
expect(result.slides).toBe(3);
26+
});

src/classes/shape.ts

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -94,9 +94,20 @@ export class Shape {
9494
}
9595

9696
async replaceIntoSlideTree(): Promise<void> {
97+
await this.modifySlideTree(true);
98+
}
99+
100+
async removeFromSlideTree(): Promise<void> {
101+
await this.modifySlideTree(false);
102+
}
103+
104+
async modifySlideTree(insertBefore?: boolean): Promise<void> {
105+
const archive = this.targetArchive;
106+
const slideFile = this.targetSlideFile;
107+
97108
const targetSlideXml = await XmlHelper.getXmlFromArchive(
98-
this.targetArchive,
99-
this.targetSlideFile,
109+
archive,
110+
slideFile,
100111
);
101112

102113
const findMethod = this.hasCreationId ? 'findByCreationId' : 'findByName';
@@ -106,19 +117,18 @@ export class Shape {
106117
this.name,
107118
);
108119

109-
sourceElementOnTargetSlide.parentNode.insertBefore(
110-
this.targetElement,
111-
sourceElementOnTargetSlide,
112-
);
120+
if (insertBefore === true) {
121+
sourceElementOnTargetSlide.parentNode.insertBefore(
122+
this.targetElement,
123+
sourceElementOnTargetSlide,
124+
);
125+
}
126+
113127
sourceElementOnTargetSlide.parentNode.removeChild(
114128
sourceElementOnTargetSlide,
115129
);
116130

117-
await XmlHelper.writeXmlToArchive(
118-
this.targetArchive,
119-
this.targetSlideFile,
120-
targetSlideXml,
121-
);
131+
await XmlHelper.writeXmlToArchive(archive, slideFile, targetSlideXml);
122132
}
123133

124134
async updateElementsRelId(): Promise<void> {

src/classes/slide.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,26 @@ export class Slide implements ISlide {
266266
);
267267
}
268268

269+
/**
270+
* Remove a single element from slide.
271+
* @param {string} presName - Filename or alias name of the template presentation.
272+
* Must have been importet with Automizer.load().
273+
* @param {number} slideNumber - Slide number within the specified template to search for the required element.
274+
* @param {ShapeModificationCallback | ShapeModificationCallback[]} callback - One or more callback functions to apply.
275+
* Depending on the shape type (e.g. chart or table), different arguments will be passed to the callback.
276+
*/
277+
removeElement(selector: string): this {
278+
const presName = this.sourceTemplate.name;
279+
const slideNumber = this.sourceNumber;
280+
281+
return this.addElementToModificationsList(
282+
presName,
283+
slideNumber,
284+
selector,
285+
'remove',
286+
);
287+
}
288+
269289
/**
270290
* Adds element to modifications list
271291
* @internal

src/dev.ts

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,20 @@ const automizer = new Automizer({
99

1010
const run = async () => {
1111
const pres = automizer
12-
.loadRoot(`bug/RootTemplate.pptx`)
13-
.load(`bug/Slides.pptx`, 'slides')
14-
.load(`bug/Library - Icons.pptx`, 'image');
12+
.loadRoot(`RootTemplate.pptx`)
13+
.load(`SlideWithCharts.pptx`, 'charts')
14+
.load(`SlideWithImages.pptx`, 'images');
1515

1616
const result = await pres
17-
.addSlide('slides', 6, (slide) => {
18-
slide.addElement('image', 1, 'Tschechien');
17+
.addSlide('charts', 2, (slide) => {
18+
slide.removeElement('ColumnChart');
1919
})
20-
.write(`add-image-bug.test.pptx`);
20+
.addSlide('images', 2, (slide) => {
21+
slide.removeElement('imageJPG');
22+
slide.removeElement('Textfeld 5');
23+
slide.addElement('images', 2, 'imageJPG');
24+
})
25+
.write(`remove-element.test.pptx`);
2126
};
2227

2328
run().catch((error) => {

src/shapes/chart.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,16 @@ export class Chart extends Shape implements IChart {
6565
return this;
6666
}
6767

68+
async remove(
69+
targetTemplate: RootPresTemplate,
70+
targetSlideNumber: number,
71+
): Promise<Chart> {
72+
await this.prepare(targetTemplate, targetSlideNumber);
73+
await this.removeFromSlideTree();
74+
75+
return this;
76+
}
77+
6878
async modifyOnAddedSlide(
6979
targetTemplate: RootPresTemplate,
7080
targetSlideNumber: number,

src/shapes/generic.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,16 @@ export class GenericShape extends Shape {
2727
return this;
2828
}
2929

30+
async remove(
31+
targetTemplate: RootPresTemplate,
32+
targetSlideNumber: number,
33+
): Promise<GenericShape> {
34+
await this.prepare(targetTemplate, targetSlideNumber);
35+
await this.removeFromSlideTree();
36+
37+
return this;
38+
}
39+
3040
async prepare(
3141
targetTemplate: RootPresTemplate,
3242
targetSlideNumber: number,

src/shapes/image.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,16 @@ export class Image extends Shape implements IImage {
8484
return this;
8585
}
8686

87+
async remove(
88+
targetTemplate: RootPresTemplate,
89+
targetSlideNumber: number,
90+
): Promise<Image> {
91+
await this.prepare(targetTemplate, targetSlideNumber);
92+
await this.removeFromSlideTree();
93+
94+
return this;
95+
}
96+
8797
async prepare(
8898
targetTemplate: RootPresTemplate,
8999
targetSlideNumber: number,

0 commit comments

Comments
 (0)