Skip to content

Commit b62300f

Browse files
committed
fix(image): slugify external image name to prevent issues with special characters
1 parent 70a9ff2 commit b62300f

File tree

5 files changed

+25
-13
lines changed

5 files changed

+25
-13
lines changed

__tests__/add-external-image.test.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ test('Load external media, add/modify image and set image target', async () => {
1313

1414
const pres = automizer
1515
.loadRoot(`RootTemplate.pptx`)
16-
.loadMedia([`feather.png`, `test.png`])
16+
.loadMedia([`feather.png`, `test.png`, `Dàngerous Dinösaur.png`])
1717
.loadMedia(`test.png`, `${__dirname}/../__tests__/media`, 'pre_')
1818
.load(`SlideWithShapes.pptx`, 'shapes')
1919
.load(`SlideWithImages.pptx`, 'images');
@@ -34,10 +34,16 @@ test('Load external media, add/modify image and set image target', async () => {
3434
]);
3535
});
3636

37+
pres.addSlide('images', 1, (slide) => {
38+
slide.modifyElement('Grafik 5', [
39+
ModifyImageHelper.setRelationTarget('Dàngerous Dinösaur.png'),
40+
]);
41+
});
42+
3743
const result = await pres.write(`add-external-image.test.pptx`);
3844

3945
// expect a 5x3cm light-blue duotone feather instead of imagePNG cord loop on page 1
4046
// expect imagePNG cord loop on page 2 instead of cut tree jpg
4147

42-
expect(result.images).toBe(3);
48+
expect(result.images).toBe(5);
4349
});

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,8 @@
6060
"extract-zip": "^2.0.1",
6161
"jszip": "^3.10.1",
6262
"pptxgenjs": "^3.12.0",
63-
"regexp.escape": "^1.1.0"
63+
"regexp.escape": "^1.1.0",
64+
"slugify": "^1.6.6"
6465
},
6566
"packageManager": "[email protected]+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"
6667
}

src/automizer.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,12 @@ import path from 'path';
1919
import * as fs from 'fs';
2020
import { XmlHelper } from './helper/xml-helper';
2121
import ModifyPresentationHelper from './helper/modify-presentation-helper';
22-
import {
23-
contentTracker as Tracker,
24-
ContentTracker,
25-
} from './helper/content-tracker';
22+
import { contentTracker as Tracker, ContentTracker } from './helper/content-tracker';
2623
import JSZip from 'jszip';
2724
import { ISlide } from './interfaces/islide';
2825
import { IMaster } from './interfaces/imaster';
2926
import { ContentTypeExtension } from './enums/content-type-map';
27+
import slugify from 'slugify';
3028

3129
/**
3230
* Automizer
@@ -502,14 +500,17 @@ export default class Automizer implements IPresentationProps {
502500
* Write all media files to archive.
503501
*/
504502
public async writeMediaFiles(): Promise<void> {
503+
const mediaDir = 'ppt/media/';
505504
for (const file of this.rootTemplate.mediaFiles) {
506505
const data = fs.readFileSync(file.filepath);
507-
let archiveFilename = 'ppt/media/' + file.file;
506+
let archiveFilename = file.file;
508507
if (file.prefix) {
509-
archiveFilename = 'ppt/media/' + file.prefix + file.file;
508+
archiveFilename = file.prefix + file.file;
510509
}
511510

512-
await this.rootTemplate.archive.write(archiveFilename, data);
511+
archiveFilename = slugify(archiveFilename);
512+
513+
await this.rootTemplate.archive.write(mediaDir + archiveFilename, data);
513514
await XmlHelper.appendImageExtensionToContentType(
514515
this.rootTemplate.archive,
515516
file.extension,

src/helper/modify-image-helper.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { XmlElement } from '../types/xml-types';
22
import { ImageStyle } from '../types/modify-types';
3-
import { XmlHelper } from './xml-helper';
4-
import { vd } from './general-helper';
3+
import slugify from 'slugify';
54

65
export default class ModifyImageHelper {
76
/**
@@ -11,7 +10,7 @@ export default class ModifyImageHelper {
1110
*/
1211
static setRelationTarget = (filename: string) => {
1312
return (element: XmlElement, arg1: XmlElement): void => {
14-
arg1.setAttribute('Target', '../media/' + filename);
13+
arg1.setAttribute('Target', '../media/' + slugify(filename));
1514
};
1615
};
1716

yarn.lock

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3388,6 +3388,11 @@ slash@^3.0.0:
33883388
resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
33893389
integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
33903390

3391+
slugify@^1.6.6:
3392+
version "1.6.6"
3393+
resolved "https://registry.yarnpkg.com/slugify/-/slugify-1.6.6.tgz#2d4ac0eacb47add6af9e04d3be79319cbcc7924b"
3394+
integrity sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==
3395+
33913396
33923397
version "0.5.13"
33933398
resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932"

0 commit comments

Comments
 (0)