Skip to content

Commit 754af40

Browse files
authored
Merge pull request #119
Add ability to set Bullet Text content from array
2 parents 41b31bf + 0d5c402 commit 754af40

File tree

6 files changed

+145
-3
lines changed

6 files changed

+145
-3
lines changed

README.md

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -665,7 +665,30 @@ pres
665665
});
666666
```
667667

668-
# Tipps and Tricks
668+
## Add Bulleted List
669+
670+
You can add a bulleted list to a shape.
671+
672+
```ts
673+
// Remove existing charts, images or shapes from added slide.
674+
const bulletPoints = ['first line', 'second line', 'third line'];
675+
const indentedBulletPoints = ['first line', [ 'indent 1-1', 'indent 1-2', [ 'indent 2-1', 'indent 2-2', ] ], 'second line', 'third line'];
676+
677+
pres.addSlide('general', 2, (slide) => {
678+
slide.modifyElement(
679+
'replaceText', //shape selector
680+
modify.setBulletList(bulletPoints),
681+
);
682+
})
683+
.addSlide('general', 2, (slide) => {
684+
slide.modifyElement(
685+
'replaceText', //shape selector
686+
modify.setBulletList(indentedBulletPoints),
687+
);
688+
});
689+
```
690+
691+
# Tips and Tricks
669692

670693
## Loop through the slides of a presentation
671694

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import Automizer, { modify } from '../src/index';
2+
3+
const bulletPoints = ['first line', 'second line', 'third line'];
4+
const multiLevelBullet = [
5+
'top line 1',
6+
[
7+
'indent 1-1',
8+
'indent 1-2',
9+
[
10+
'indent 2-1',
11+
'indent 2-2',
12+
],
13+
],
14+
'top line 2',
15+
];
16+
17+
test('create presentation, replace bullet list text.', async () => {
18+
const automizer = new Automizer({
19+
templateDir: `${__dirname}/pptx-templates`,
20+
outputDir: `${__dirname}/pptx-output`,
21+
});
22+
23+
const pres = automizer.loadRoot(`RootTemplate.pptx`).load(`TextReplace.pptx`);
24+
25+
const result = await pres
26+
27+
.addSlide('TextReplace.pptx', 2, (slide) => {
28+
slide.modifyElement(
29+
'replaceTextBullet1',
30+
modify.setBulletList(bulletPoints),
31+
);
32+
}).addSlide('TextReplace.pptx', 2, (slide) => {
33+
slide.modifyElement(
34+
'replaceTextBullet1',
35+
modify.setBulletList(multiLevelBullet),
36+
);
37+
})
38+
.write(`replace-bullet-text.test.pptx`);
39+
40+
expect(result.slides).toBe(3);
41+
});

src/helper/modify-shape-helper.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,15 @@ export default class ModifyShapeHelper {
4040
ModifyTextHelper.setText(text)(element as XmlElement);
4141
};
4242

43+
/**
44+
* Set content to bulleted list of modified shape
45+
*/
46+
static setBulletList =
47+
(list) =>
48+
(element: XmlElement): void => {
49+
ModifyTextHelper.setBulletList(list)(element as XmlElement);
50+
};
51+
4352
/**
4453
* Replace tagged text content within modified shape
4554
*/

src/helper/modify-text-helper.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import ModifyColorHelper from './modify-color-helper';
33
import ModifyXmlHelper from './modify-xml-helper';
44
import { XmlElement } from '../types/xml-types';
55
import { vd } from './general-helper';
6+
import XmlElements from './xml-elements';
67

78
export default class ModifyTextHelper {
89
/**
@@ -33,6 +34,12 @@ export default class ModifyTextHelper {
3334
}
3435
};
3536

37+
static setBulletList =
38+
(list) => (element: XmlElement): void => {
39+
const xmlElements = new XmlElements(element);
40+
xmlElements.addBulletList(list);
41+
};
42+
3643
static content =
3744
(label: number | string | undefined) =>
3845
(element: XmlElement): void => {
@@ -42,7 +49,7 @@ export default class ModifyTextHelper {
4249
};
4350

4451
/**
45-
* Set text style insinde an <a:rPr> element
52+
* Set text style inside an <a:rPr> element
4653
*/
4754
static style =
4855
(style: TextStyle) =>
@@ -72,7 +79,7 @@ export default class ModifyTextHelper {
7279
};
7380

7481
/**
75-
* Set size of text insinde an <a:rPr> element
82+
* Set size of text inside an <a:rPr> element
7683
*/
7784
static setSize =
7885
(size: number) =>

src/helper/xml-elements.ts

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,66 @@ export default class XmlElements {
4242
return this;
4343
}
4444

45+
createTextBody(): XmlElement {
46+
let txBody = this.element.getElementsByTagName('p:txBody')[0];
47+
if (!txBody) {
48+
txBody = this.document.createElement('p:txBody');
49+
this.element.appendChild(txBody);
50+
} else {
51+
while (txBody.firstChild) {
52+
txBody.removeChild(txBody.firstChild);
53+
}
54+
}
55+
return txBody;
56+
}
57+
58+
createBodyProperties(txBody: XmlElement): XmlElement {
59+
const bodyPr = this.document.createElement('a:bodyPr');
60+
txBody.appendChild(bodyPr);
61+
return bodyPr;
62+
}
63+
64+
addBulletList(list: []): void {
65+
const txBody = this.createTextBody();
66+
this.createBodyProperties(txBody);
67+
this.processList(txBody, list, 0);
68+
}
69+
70+
processList(txBody: XmlElement, items: [], level: number): void {
71+
items.forEach((item) => {
72+
if (Array.isArray(item)) {
73+
this.processList(txBody, item, level + 1);
74+
} else {
75+
const p = this.createParagraph(level);
76+
const r = this.createTextRun(String(item));
77+
p.appendChild(r);
78+
txBody.appendChild(p);
79+
}
80+
});
81+
}
82+
83+
createParagraph(level: number): XmlElement {
84+
const p = this.document.createElement('a:p');
85+
const pPr = this.document.createElement('a:pPr');
86+
if (level > 0) {
87+
pPr.setAttribute('lvl', String(level));
88+
}
89+
p.appendChild(pPr);
90+
return p;
91+
}
92+
93+
createTextRun(text: string): XmlElement {
94+
const r = this.document.createElement('a:r');
95+
const rPr = this.document.createElement('a:rPr');
96+
r.appendChild(rPr);
97+
98+
const t = this.document.createElement('a:t');
99+
t.textContent = String(text);
100+
101+
r.appendChild(t);
102+
return r;
103+
}
104+
45105
paragraphProps() {
46106
const p = this.element.getElementsByTagName('a:p').item(0);
47107
p.appendChild(this.document.createElement('a:pPr'));

src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ const setAttribute = ModifyHelper.setAttribute;
4848

4949
const setSolidFill = ModifyShapeHelper.setSolidFill;
5050
const setText = ModifyShapeHelper.setText;
51+
const setBulletList = ModifyShapeHelper.setBulletList;
5152
const replaceText = ModifyShapeHelper.replaceText;
5253
const setPosition = ModifyShapeHelper.setPosition;
5354
const updatePosition = ModifyShapeHelper.updatePosition;
@@ -119,6 +120,7 @@ export const modify = {
119120
setAttribute,
120121
setSolidFill,
121122
setText,
123+
setBulletList,
122124
replaceText,
123125
setPosition,
124126
updatePosition,

0 commit comments

Comments
 (0)