Skip to content

Commit 4a7f910

Browse files
committed
chore(pres): add re-import test case; add toDo
1 parent 84038fa commit 4a7f910

File tree

6 files changed

+100
-24
lines changed

6 files changed

+100
-24
lines changed

src/dev.ts

Lines changed: 73 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,96 @@
11
import Automizer, { modify } from './index';
22
import { vd } from './helper/general-helper';
3+
import * as fs from 'fs';
34

45
const run = async () => {
56
const outputDir = `${__dirname}/../__tests__/pptx-output`;
67
const templateDir = `${__dirname}/../__tests__/pptx-templates`;
78

8-
const automizer = new Automizer({
9+
// Step 1: Create a pptx with images and a chart inside.
10+
// The chart is modified by pptx-automizer
11+
12+
const writer = new Automizer({
913
templateDir,
10-
outputDir
14+
outputDir,
15+
verbosity: 0,
16+
removeExistingSlides: true
1117
});
1218

13-
const pres = automizer
19+
const pres = writer
1420
.loadRoot(`RootTemplate.pptx`)
21+
.load(`EmptySlide.pptx`, 'empty')
22+
.load(`SlideWithImages.pptx`, 'images')
1523
.load(`ChartBarsStacked.pptx`, 'charts');
1624

1725
const dataSmaller = {
18-
series: [
19-
{ label: 'series s1' },
20-
{ label: 'series s2' }
21-
],
26+
series: [{ label: 'series s1' }, { label: 'series s2' }],
2227
categories: [
23-
{ label: 'item test r1', values: [ 10, null ] },
24-
{ label: 'item test r2', values: [ 12, 18 ] },
28+
{ label: 'item test r1', values: [10, null] },
29+
{ label: 'item test r2', values: [12, 18] },
2530
],
26-
}
31+
};
2732

28-
const result = await pres
33+
await pres
34+
.addSlide('empty', 1, (slide) => {
35+
slide.addElement('images', 1, 'Grafik 5');
36+
})
2937
.addSlide('charts', 1, (slide) => {
30-
slide.modifyElement('BarsStacked', [
31-
modify.setChartData(dataSmaller),
32-
]);
38+
slide.modifyElement('BarsStacked', [modify.setChartData(dataSmaller)]);
3339
})
34-
.write(`modify-chart-stacked-bars.test.pptx`)
40+
.write(`modify-automizer-generated-file.tmp.test.pptx`);
41+
42+
// Step 2: Create a copy of the generated file in templateDir
43+
// and load it as a normal template
44+
45+
await fs.promises.copyFile(
46+
`${outputDir}/modify-automizer-generated-file.tmp.test.pptx`,
47+
`${templateDir}/PptxAutomizerGeneratedFile.pptx`,
48+
);
49+
50+
const reader = new Automizer({
51+
templateDir,
52+
outputDir,
53+
// This will display all log() output
54+
verbosity: 2
55+
});
56+
57+
58+
const dataSmallerMod = {
59+
series: [{ label: 'series s3' }, { label: 'series s4' }],
60+
categories: [
61+
{ label: 'item test r3', values: [22, 45] },
62+
{ label: 'item test r4', values: [23, 46] },
63+
{ label: 'item test r5', values: [24, 47] },
64+
],
65+
};
66+
67+
const pres2 = reader
68+
.loadRoot(`RootTemplate.pptx`)
69+
.load(`EmptySlide.pptx`, 'empty')
70+
.load(`SlideWithImages.pptx`, 'images')
71+
.load(`PptxAutomizerGeneratedFile.pptx`, 'generated')
72+
73+
const presInfo = await pres2.getInfo();
74+
const slides = presInfo
75+
.slidesByTemplate(`generated`)
76+
77+
console.log(`The re-imported file PptxAutomizerGeneratedFile.pptx seems to have ${slides.length} slides`)
78+
// But only 2 slides were expected with removeExistingSlides: true
79+
80+
const result2 = await pres2
81+
.addSlide('empty', 1, (slide) => {
82+
slide.addElement('images', 1, 'Grafik 5');
83+
})
84+
.addSlide('generated', 2, (slide) => {
85+
slide.addElement('images', 1, 'Grafik 5');
86+
})
87+
.addSlide('generated', 3, (slide) => {
88+
slide.modifyElement('BarsStacked', [modify.setChartData(dataSmallerMod)]);
89+
})
90+
.write(`modify-automizer-generated-file.test.pptx`);
91+
92+
vd(result2)
3593

36-
vd(result)
3794
};
3895

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

src/helper/general-helper.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ export interface Logger {
3131
verbosity: 0 | 1 | 2;
3232
target: 'console' | 'file';
3333
log: (
34-
message: string,
34+
message: string | number | object,
3535
verbosity: Logger['verbosity'],
3636
showStack?: boolean,
3737
target?: Logger['target'],
@@ -58,7 +58,7 @@ export const Logger = <Logger>{
5858
},
5959
};
6060

61-
export const log = (message: string, verbosity: Logger['verbosity']) => {
61+
export const log = (message: string | number | object, verbosity: Logger['verbosity']) => {
6262
Logger.log(message, verbosity);
6363
};
6464

src/helper/modify-xml-helper.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,10 @@ export default class ModifyXmlHelper {
151151
throw 'Unable to set value @index: ' + index;
152152
}
153153

154+
if(!valueElement[0].firstChild) {
155+
return
156+
}
157+
154158
valueElement[0].firstChild.textContent = String(value);
155159
if (index !== undefined) {
156160
element.setAttribute('idx', String(index));

src/helper/xml-slide-helper.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import HasShapes from '../classes/has-shapes';
99
import { FindElementSelector, ShapeModificationCallback } from '../types/types';
1010
import ModifyTableHelper from './modify-table-helper';
1111
import { TableData, TableInfo } from '../types/table-types';
12+
import { vd } from './general-helper';
1213

1314
export const nsMain =
1415
'http://schemas.openxmlformats.org/presentationml/2006/main';
@@ -152,9 +153,11 @@ export class XmlSlideHelper {
152153
static parseTextFragments(shapeNode: XmlElement): string[] {
153154
const txBody = XmlSlideHelper.getTextBody(shapeNode);
154155
const textFragments: string[] = [];
155-
const texts = txBody.getElementsByTagName('a:t');
156-
for (let t = 0; t < texts.length; t++) {
157-
textFragments.push(texts.item(t).textContent);
156+
if (txBody) {
157+
const texts = txBody.getElementsByTagName('a:t');
158+
for (let t = 0; t < texts.length; t++) {
159+
textFragments.push(texts.item(t).textContent);
160+
}
158161
}
159162
return textFragments;
160163
}

src/helper/xml-template-helper.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,14 @@ export class XmlTemplateHelper {
3838
this.relType,
3939
);
4040

41+
// ToDo: The slide list is based on the relations from this.path
42+
// which contains non-visible slides, too.
43+
// Should be either:
44+
// a.) remove unused slides on generation
45+
// b.) use slides list from 'p:sldIdLst' in `ppt/presentation.xml`
46+
vd(this.relType)
47+
vd(this.path)
48+
4149
const creationIds: SlideInfo[] = [];
4250
for (const slideRel of relationships) {
4351
try {

src/shapes/chart.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import { RootPresTemplate } from '../interfaces/root-pres-template';
2020
import { contentTracker } from '../helper/content-tracker';
2121
import IArchive from '../interfaces/iarchive';
2222
import { ContentTypeExtension } from '../enums/content-type-map';
23-
import { log } from '../helper/general-helper';
23+
import { log, vd } from '../helper/general-helper';
2424

2525
export class Chart extends Shape implements IChart {
2626
sourceWorksheet: number | string;
@@ -471,13 +471,17 @@ export class Chart extends Shape implements IChart {
471471
}
472472

473473
async copyWorksheetFile(): Promise<void> {
474+
const sourceFile = `ppt/embeddings/${this.worksheetFilePrefix}${this.sourceWorksheet}${this.wbExtension}`;
474475
const targetFile = `ppt/embeddings/${this.worksheetFilePrefix}${this.targetWorksheet}${this.wbExtension}`;
476+
475477
await FileHelper.zipCopy(
476478
this.sourceArchive,
477-
`ppt/embeddings/${this.worksheetFilePrefix}${this.sourceWorksheet}${this.wbExtension}`,
479+
sourceFile,
478480
this.targetArchive,
479481
targetFile,
480-
);
482+
).catch((e) => {
483+
log(e, 2);
484+
});
481485
}
482486

483487
appendChartExtensionToContentType(): Promise<XmlElement | boolean> {

0 commit comments

Comments
 (0)