Skip to content

Commit a09b976

Browse files
authored
Merge pull request #158 from singerla/main
sync with main
2 parents 13e83ea + a1bb13e commit a09b976

File tree

6 files changed

+71
-3
lines changed

6 files changed

+71
-3
lines changed

__tests__/remove-slides.test.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import Automizer from '../src/automizer';
2+
import ModifyPresentationHelper from '../src/helper/modify-presentation-helper';
3+
4+
test('Remove slides while and after modifying.', async () => {
5+
const automizer = new Automizer({
6+
templateDir: `${__dirname}/pptx-templates`,
7+
outputDir: `${__dirname}/pptx-output`,
8+
});
9+
10+
const pres = automizer
11+
.loadRoot(`RootTemplate.pptx`)
12+
.load(`EmptySlide.pptx`, 'empty')
13+
.load(`SlideWithCharts.pptx`, 'charts')
14+
.load(`SlideWithImages.pptx`, 'images');
15+
16+
pres
17+
.addSlide('charts', 2, (slide) => {})
18+
.addSlide('images', 2, (slide) => {
19+
// Pass the current slide index to remove a slide.
20+
slide.remove(3);
21+
// You can as well remove another slide.
22+
slide.remove(1);
23+
})
24+
.addSlide('empty', 1, (slide) => {})
25+
.addSlide('empty', 1, (slide) => {})
26+
.addSlide('images', 1, (slide) => {
27+
// Calling
28+
slide.remove(1);
29+
});
30+
31+
// Eventually remove some slides.
32+
pres.modify(ModifyPresentationHelper.removeSlides([1, 3]));
33+
34+
const result = await pres.write(`remove-slides.test.pptx`);
35+
36+
// ToDo: decrement counter
37+
expect(result.slides).toBe(6);
38+
});

src/automizer.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ import { ISlide } from './interfaces/islide';
2828
import { IMaster } from './interfaces/imaster';
2929
import { ContentTypeExtension } from './enums/content-type-map';
3030
import slugify from 'slugify';
31-
import PptxGenJS from 'pptxgenjs';
3231

3332
/**
3433
* Automizer

src/classes/slide.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { XmlRelationshipHelper } from '../helper/xml-relationship-helper';
99
import { IMaster } from '../interfaces/imaster';
1010
import HasShapes from './has-shapes';
1111
import { Master } from './master';
12+
import ModifyPresentationHelper from '../helper/modify-presentation-helper';
1213

1314
export class Slide extends HasShapes implements ISlide {
1415
targetType: ShapeTargetType = 'slide';
@@ -232,4 +233,13 @@ export class Slide extends HasShapes implements ISlide {
232233
`ppt/slides/_rels/slide${this.targetNumber}.xml.rels`,
233234
);
234235
}
236+
237+
/**
238+
* Remove a slide from presentation's slide list.
239+
* ToDo: Find the current count for this slide;
240+
* ToDo: this.targetNumber is undefined at this point.
241+
*/
242+
remove(slide: number): void {
243+
this.root.modify(ModifyPresentationHelper.removeSlides([slide]));
244+
}
235245
}

src/helper/modify-presentation-helper.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,20 @@ export default class ModifyPresentationHelper {
2727
XmlHelper.sortCollection(slides, order);
2828
};
2929

30+
/**
31+
* Pass an array of slide numbers to remove from slide sortation.
32+
* @order Array of slide numbers, starting by 1
33+
*/
34+
static removeSlides = (numbers: number[]) => (xml: XmlDocument) => {
35+
const slides = ModifyPresentationHelper.getSlidesCollection(xml);
36+
numbers.map((index, i) => numbers[i]--);
37+
for (let i = 0; i <= slides.length; i++) {
38+
if (numbers.includes(i)) {
39+
XmlHelper.remove(slides[i]);
40+
}
41+
}
42+
};
43+
3044
/**
3145
* Set ids to prevent corrupted pptx.
3246
* Must start with 256 and increment by one.

src/interfaces/ipresentation-props.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import { AutomizerParams, StatusTracker } from '../types/types';
22
import { PresTemplate } from './pres-template';
33
import { RootPresTemplate } from './root-pres-template';
44
import { ContentTracker } from '../helper/content-tracker';
5+
import { ModifyXmlCallback } from '../types/xml-types';
6+
import Automizer from '../automizer';
57

68
export interface IPresentationProps {
79
rootTemplate: RootPresTemplate;
@@ -10,5 +12,8 @@ export interface IPresentationProps {
1012
timer: number;
1113
status?: StatusTracker;
1214
content?: ContentTracker;
15+
1316
getTemplate(name: string): PresTemplate;
17+
18+
modify(cb: ModifyXmlCallback): Automizer;
1419
}

src/interfaces/islide.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,9 @@ export interface ISlide {
7373
getDimensions(): Promise<{ width: number; height: number }>;
7474

7575
/**
76-
* Drop the current slide
76+
* Remove a slide from output. The slide will be calculated, but
77+
* eventually withdrawn from slide list.
78+
* Slide number starts by 1.
7779
*/
78-
drop(): void;
80+
remove(number: number): void;
7981
}

0 commit comments

Comments
 (0)