Skip to content

Commit 22b07ea

Browse files
committed
feat(shape): add rotate to modify-shape-helper
1 parent 4099384 commit 22b07ea

File tree

4 files changed

+52
-40
lines changed

4 files changed

+52
-40
lines changed
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import Automizer, { modify } from '../src/index';
2+
3+
test('Add and rotate a shape.', 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(`SlideWithShapes.pptx`, 'shapes');
12+
13+
const result = await pres
14+
.addSlide('shapes', 2, (slide) => {
15+
slide.modifyElement('Drum', [modify.rotateShape(45)]);
16+
slide.modifyElement('Cloud', [modify.rotateShape(-45)]);
17+
slide.modifyElement('Arrow', [modify.rotateShape(180)]);
18+
})
19+
.write(`modify-shapes-rotate.test.pptx`);
20+
21+
expect(result.slides).toBe(2);
22+
});

src/dev.ts

Lines changed: 10 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,4 @@
1-
import { vd } from './helper/general-helper';
2-
import Automizer, { modify, ModifyTextHelper, XmlHelper } from './index';
3-
import { XmlElement } from './types/xml-types';
4-
5-
// const automizer = (outputName) =>
6-
// new Automizer({
7-
// templateDir: `${__dirname}/../__tests__/pptx-templates`,
8-
// outputDir: `${__dirname}/../__tests__/pptx-output`,
9-
// // You can enable 'archiveType' and set mode: 'fs'
10-
// // This will extract all templates and output to disk.
11-
// // It will not improve performance, but it can help debugging:
12-
// // You don't have to manually extract pptx contents, which can
13-
// // be annoying if you need to look inside your files.
14-
// archiveType: {
15-
// mode: 'fs',
16-
// baseDir: `${__dirname}/../__tests__/pptx-cache`,
17-
// workDir: outputName,
18-
// // cleanupWorkDir: true,
19-
// },
20-
// rootTemplate: 'RootTemplate.pptx',
21-
// presTemplates: [`SlidesWithAdditionalMaster.pptx`],
22-
// removeExistingSlides: true,
23-
// autoImportSlideMasters: true,
24-
// cleanup: false,
25-
// compression: 0,
26-
// });
1+
import Automizer, { modify } from './index';
272

283
const run = async () => {
294
const automizer = new Automizer({
@@ -33,24 +8,19 @@ const run = async () => {
338
showIntegrityInfo: true,
349
assertRelatedContents: true,
3510
useCreationIds: true,
36-
// archiveType: {
37-
// mode: 'fs',
38-
// baseDir: `${__dirname}/../__tests__/pptx-cache`,
39-
// workDir: `add-slide-master-auto-import.test.pptx`,
40-
// // cleanupWorkDir: true,
41-
// },
4211
});
4312

44-
const pres = await automizer
45-
.loadRoot(`EmptyTemplate.pptx`)
46-
.load('SlideMasters.pptx')
47-
.load('SlidesWithAdditionalMaster.pptx')
13+
const pres = automizer
14+
.loadRoot(`RootTemplate.pptx`)
15+
.load(`SlideWithShapes.pptx`, 'shapes');
4816

49-
.addSlide('SlidesWithAdditionalMaster.pptx', 1, (slide) => {
50-
slide.useSlideLayout('Leer');
17+
const result = await pres
18+
.addSlide('shapes', 2, (slide) => {
19+
slide.modifyElement('Drum', [modify.rotateShape(45)]);
20+
slide.modifyElement('Cloud', [modify.rotateShape(-45)]);
21+
slide.modifyElement('Arrow', [modify.rotateShape(180)]);
5122
})
52-
53-
.write(`add-slide-master-auto-import.test.pptx`);
23+
.write(`modify-shapes-rotate.test.pptx`);
5424
};
5525

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

src/helper/modify-shape-helper.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { GeneralHelper } from './general-helper';
44
import TextReplaceHelper from './text-replace-helper';
55
import ModifyTextHelper from './modify-text-helper';
66
import { XmlDocument, XmlElement } from '../types/xml-types';
7+
import { XmlHelper } from './xml-helper';
78

89
const map = {
910
x: { tag: 'a:off', attribute: 'x' },
@@ -101,4 +102,21 @@ export default class ModifyShapeHelper {
101102
.setAttribute(map[key].attribute, value);
102103
});
103104
};
105+
106+
/**
107+
* Rotate a shape by a given value. Use e.g. 180 to flip a shape.
108+
* A negative value will rotate counter clockwise.
109+
* @param degrees Rotate by °
110+
*/
111+
static rotate =
112+
(degrees: number) =>
113+
(element: XmlDocument | XmlElement): void => {
114+
const spPr = element.getElementsByTagName('p:spPr');
115+
116+
if (spPr) {
117+
const xfrm = spPr.item(0).getElementsByTagName('a:xfrm').item(0);
118+
degrees = degrees < 0 ? 360 + degrees : degrees;
119+
xfrm.setAttribute('rot', String(Math.round(degrees * 60000)));
120+
}
121+
};
104122
}

src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ const setText = ModifyShapeHelper.setText;
4242
const replaceText = ModifyShapeHelper.replaceText;
4343
const setPosition = ModifyShapeHelper.setPosition;
4444
const updatePosition = ModifyShapeHelper.updatePosition;
45+
const rotateShape = ModifyShapeHelper.rotate;
4546

4647
const setTableData = ModifyTableHelper.setTableData;
4748
const adjustHeight = ModifyTableHelper.adjustHeight;
@@ -98,6 +99,7 @@ export const modify = {
9899
replaceText,
99100
setPosition,
100101
updatePosition,
102+
rotateShape,
101103
setTableData,
102104
adjustHeight,
103105
adjustWidth,

0 commit comments

Comments
 (0)