Skip to content

Commit 436cf37

Browse files
committed
fix(master): use correct rels path on swapping image on slideMaster
1 parent 1f2265c commit 436cf37

File tree

5 files changed

+56
-16
lines changed

5 files changed

+56
-16
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import Automizer from '../src/automizer';
2+
import { ModifyImageHelper, ModifyShapeHelper } from '../src';
3+
import { CmToDxa } from '../src/helper/modify-helper';
4+
5+
test('Load external media, modify image target on slide master', async () => {
6+
const automizer = new Automizer({
7+
templateDir: `${__dirname}/../__tests__/pptx-templates`,
8+
outputDir: `${__dirname}/../__tests__/pptx-output`,
9+
mediaDir: `${__dirname}/../__tests__/images`,
10+
removeExistingSlides: true,
11+
cleanup: true,
12+
});
13+
14+
const pres = automizer
15+
.loadRoot(`RootTemplateWithImages.pptx`)
16+
.loadMedia([`test.jpg`])
17+
.load(`RootTemplateWithImages.pptx`, 'base');
18+
19+
pres.addMaster('base', 1, (master) => {
20+
master.modifyElement('masterImagePNG', [
21+
ModifyImageHelper.setRelationTarget('test.jpg'),
22+
]);
23+
});
24+
25+
// Expect imported slide master (#2) to have swapped (left top) background image
26+
const result = await pres.write(`modify-master-add-external-image.test.pptx`);
27+
28+
expect(result.images).toBe(8);
29+
});
291 Bytes
Binary file not shown.

src/classes/has-shapes.ts

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import { Image } from '../shapes/image';
3232
import { ElementType } from '../enums/element-type';
3333
import { GenericShape } from '../shapes/generic';
3434
import { XmlSlideHelper } from '../helper/xml-slide-helper';
35+
import { vd } from '../helper/general-helper';
3536

3637
export default class HasShapes {
3738
/**
@@ -387,17 +388,27 @@ export default class HasShapes {
387388
? this.getSlideNumber(template, importElement.slideNumber)
388389
: importElement.slideNumber;
389390

390-
let sourcePath = `ppt/slides/slide${slideNumber}.xml`;
391-
391+
let currentMode = 'slideToSlide';
392392
if (this.targetType === 'slideMaster') {
393-
// It is possible to import shapes from loaded presentations,
394-
// as well as to modify an existing shape on current slideMaster
395-
sourcePath =
396-
importElement.mode === 'append'
397-
? `ppt/slides/slide${slideNumber}.xml`
398-
: `ppt/slideMasters/slideMaster${slideNumber}.xml`;
393+
if (importElement.mode === 'append') {
394+
currentMode = 'slideToMaster';
395+
} else {
396+
currentMode = 'onMaster';
397+
}
399398
}
400399

400+
// It is possible to import shapes from loaded slides to slideMaster,
401+
// as well as to modify an existing shape on current slideMaster
402+
const sourcePath =
403+
currentMode === 'onMaster'
404+
? `ppt/slideMasters/slideMaster${slideNumber}.xml`
405+
: `ppt/slides/slide${slideNumber}.xml`;
406+
407+
const sourceRelPath =
408+
currentMode === 'onMaster'
409+
? `ppt/slideMasters/_rels/slideMaster${slideNumber}.xml.rels`
410+
: `ppt/slides/_rels/slide${slideNumber}.xml.rels`;
411+
401412
const sourceArchive = await template.archive;
402413
const useCreationIds =
403414
template.useCreationIds === true && template.creationIds !== undefined;
@@ -420,7 +431,7 @@ export default class HasShapes {
420431
const appendElementParams = await this.analyzeElement(
421432
sourceElement,
422433
sourceArchive,
423-
slideNumber,
434+
sourceRelPath,
424435
);
425436

426437
return {
@@ -754,13 +765,13 @@ export default class HasShapes {
754765
async analyzeElement(
755766
sourceElement: XmlElement,
756767
sourceArchive: IArchive,
757-
slideNumber: number,
768+
relsPath: string,
758769
): Promise<AnalyzedElementType> {
759770
const isChart = sourceElement.getElementsByTagName('c:chart');
760771
if (isChart.length) {
761772
const target = await XmlHelper.getTargetByRelId(
762773
sourceArchive,
763-
slideNumber,
774+
relsPath,
764775
sourceElement,
765776
'chart',
766777
);
@@ -775,7 +786,7 @@ export default class HasShapes {
775786
if (isChartEx.length) {
776787
const target = await XmlHelper.getTargetByRelId(
777788
sourceArchive,
778-
slideNumber,
789+
relsPath,
779790
sourceElement,
780791
'chartEx',
781792
);
@@ -792,7 +803,7 @@ export default class HasShapes {
792803
type: ElementType.Image,
793804
target: await XmlHelper.getTargetByRelId(
794805
sourceArchive,
795-
slideNumber,
806+
relsPath,
796807
sourceElement,
797808
'image',
798809
),

src/helper/xml-helper.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -331,15 +331,14 @@ export class XmlHelper {
331331

332332
static async getTargetByRelId(
333333
archive: IArchive,
334-
slideNumber: number,
334+
relsPath: string,
335335
element: XmlElement,
336336
type: string,
337337
): Promise<Target> {
338338
const params = TargetByRelIdMap[type];
339339
const sourceRid = element
340340
.getElementsByTagName(params.relRootTag)[0]
341341
.getAttribute(params.relAttribute);
342-
const relsPath = `ppt/slides/_rels/slide${slideNumber}.xml.rels`;
343342
const imageRels = await XmlHelper.getRelationshipTargetsByPrefix(
344343
archive,
345344
relsPath,

src/shapes/image.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,10 @@ export class Image extends Shape implements IImage {
8282
this.applyImageCallbacks();
8383

8484
if (this.hasSvgRelation()) {
85+
const relsPath = `ppt/slides/_rels/slide${this.sourceSlideNumber}.xml.rels`;
8586
const target = await XmlHelper.getTargetByRelId(
8687
this.sourceArchive,
87-
this.sourceSlideNumber,
88+
relsPath,
8889
this.targetElement,
8990
'image:svg',
9091
);

0 commit comments

Comments
 (0)