Skip to content

Commit dda1753

Browse files
committed
feature(chart): add setExtendedChartData and chartEx related modifiers (WIP)
1 parent e813653 commit dda1753

File tree

11 files changed

+276
-53
lines changed

11 files changed

+276
-53
lines changed
157 Bytes
Binary file not shown.

src/classes/slide.ts

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -419,27 +419,33 @@ export class Slide implements ISlide {
419419
sourceArchive: JSZip,
420420
slideNumber: number,
421421
): Promise<AnalyzedElementType> {
422-
vd('analyzeElement');
423422
const isChart = sourceElement.getElementsByTagName('c:chart');
424423
if (isChart.length) {
425-
vd({
424+
const target = await XmlHelper.getTargetByRelId(
425+
sourceArchive,
426+
slideNumber,
427+
sourceElement,
428+
'chart',
429+
);
430+
431+
return {
426432
type: ElementType.Chart,
427-
target: await XmlHelper.getTargetByRelId(
428-
sourceArchive,
429-
slideNumber,
430-
sourceElement,
431-
'chart',
432-
),
433-
});
433+
target: target,
434+
} as AnalyzedElementType;
435+
}
436+
437+
const isChartEx = sourceElement.getElementsByTagName('cx:chart');
438+
if (isChartEx.length) {
439+
const target = await XmlHelper.getTargetByRelId(
440+
sourceArchive,
441+
slideNumber,
442+
sourceElement,
443+
'chartEx',
444+
);
434445

435446
return {
436447
type: ElementType.Chart,
437-
target: await XmlHelper.getTargetByRelId(
438-
sourceArchive,
439-
slideNumber,
440-
sourceElement,
441-
'chart',
442-
),
448+
target: target,
443449
} as AnalyzedElementType;
444450
}
445451

src/constants/constants.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@ export const TargetByRelIdMap = {
66
relAttribute: 'r:id',
77
prefix: '../charts/chart',
88
} as TargetByRelIdMapParam,
9+
chartEx: {
10+
relRootTag: 'cx:chart',
11+
relAttribute: 'r:id',
12+
prefix: '../charts/chartEx',
13+
} as TargetByRelIdMapParam,
914
image: {
1015
relRootTag: 'a:blip',
1116
relAttribute: 'r:embed',

src/dev.ts

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,36 @@ const automizer = new Automizer({
1010
const run = async () => {
1111
const pres = automizer
1212
.loadRoot(`RootTemplate.pptx`)
13-
.load(`ChartWaterfall.pptx`, 'charts');
13+
.load(`EmptySlide.pptx`, 'EmptySlide')
14+
.load(`ChartWaterfall.pptx`, 'ChartWaterfall')
15+
.load(`ChartBarsStacked.pptx`, 'ChartBarsStacked');
1416

1517
const result = await pres
16-
.addSlide('charts', 1, (slide) => {
17-
slide.addElement('charts', 1, 'Waterfall 1', [
18-
modify.setChartData(<ChartData>{
18+
.addSlide('EmptySlide', 1, (slide) => {
19+
// slide.addElement('ChartBarsStacked', 1, 'BarsStacked', [
20+
// modify.setChartData(<ChartData>{
21+
// series: [{ label: 'series 1' }],
22+
// categories: [
23+
// { label: 'cat 2-1', values: [50] },
24+
// { label: 'cat 2-2', values: [14] },
25+
// { label: 'cat 2-3', values: [15] },
26+
// { label: 'cat 2-4', values: [26] },
27+
// ],
28+
// }),
29+
// ]);
30+
31+
slide.addElement('ChartWaterfall', 1, 'Waterfall 1', [
32+
modify.setExtendedChartData(<ChartData>{
1933
series: [{ label: 'series 1' }],
2034
categories: [
2135
{ label: 'cat 2-1', values: [50] },
2236
{ label: 'cat 2-2', values: [14] },
2337
{ label: 'cat 2-3', values: [15] },
2438
{ label: 'cat 2-4', values: [26] },
39+
{ label: 'cat 2-4', values: [26] },
40+
{ label: 'cat 2-4', values: [26] },
41+
{ label: 'cat 2-4', values: [26] },
42+
{ label: 'cat 2-4', values: [26] },
2543
],
2644
}),
2745
]);

src/helper/file-helper.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,15 @@ export class FileHelper {
2929
return archive.files[file].async(type || 'string');
3030
}
3131

32+
static fileExistsInArchive(archive: JSZip, file: string): boolean {
33+
if (archive === undefined || archive.files[file] === undefined) {
34+
return false;
35+
}
36+
}
37+
3238
static extractFileContent(file: Buffer): Promise<JSZip> {
3339
const zip = new JSZip();
34-
return zip.loadAsync((file as unknown) as InputType);
40+
return zip.loadAsync(file as unknown as InputType);
3541
}
3642

3743
static getFileExtension(filename: string): string {

src/helper/modify-chart-helper.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,33 @@ export default class ModifyChartHelper {
206206
// XmlHelper.dump(chart)
207207
};
208208

209+
/**
210+
* Set chart data to modify extended chart types.
211+
* See `__tests__/modify-existing-extended-chart.test.js`
212+
*/
213+
static setExtendedChartData =
214+
(data: ChartData) =>
215+
(
216+
element: XMLDocument | Element,
217+
chart?: Document,
218+
workbook?: Workbook,
219+
): void => {
220+
const slots = [] as ChartSlot[];
221+
data.series.forEach((series: ChartSeries, s: number) => {
222+
slots.push({
223+
index: s,
224+
series: series,
225+
targetCol: s + 1,
226+
type: 'extendedSeries',
227+
});
228+
});
229+
230+
new ModifyChart(chart, workbook, data, slots).modifyExtended();
231+
232+
XmlHelper.dump(chart);
233+
// XmlHelper.dump(workbook.table)
234+
};
235+
209236
static setAxisRange =
210237
(range: ChartAxisRange) =>
211238
(chart: XMLDocument): void => {

src/helper/modify-xml-helper.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,13 +116,23 @@ export default class ModifyXmlHelper {
116116
static value =
117117
(value: number | string, index?: number) =>
118118
(element: Element): void => {
119-
element.getElementsByTagName('c:v')[0].firstChild.textContent =
120-
String(value);
119+
const valueElement = element.getElementsByTagName('c:v');
120+
if (!valueElement.length) {
121+
XmlHelper.dump(element);
122+
throw 'Unable to set value @index: ' + index;
123+
}
124+
125+
valueElement[0].firstChild.textContent = String(value);
121126
if (index !== undefined) {
122127
element.setAttribute('idx', String(index));
123128
}
124129
};
125130

131+
static textContent =
132+
(value: number | string) =>
133+
(element: Element): void => {
134+
element.firstChild.textContent = String(value);
135+
};
126136
static attribute =
127137
(attribute: string, value: string | number) =>
128138
(element: Element): void => {

src/helper/xml-helper.ts

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -123,32 +123,49 @@ export class XmlHelper {
123123
return max;
124124
}
125125

126+
static pushRelTargets(element: Element, prefix: string, targets: Target[]) {
127+
const type = element.getAttribute('Type');
128+
const target = element.getAttribute('Target');
129+
const rId = element.getAttribute('Id');
130+
131+
const subtype = _.last(prefix.split('/'));
132+
const relType = _.last(type.split('/'));
133+
134+
const matchNumber = target.match(/(\d+)/);
135+
const stripNumber =
136+
matchNumber && matchNumber[1] ? Number(matchNumber[1]) : 0;
137+
138+
if (XmlHelper.targetMatchesRelationship(relType, subtype, target, prefix)) {
139+
targets.push({
140+
file: target,
141+
rId: rId,
142+
number: stripNumber,
143+
type: type,
144+
subtype: subtype,
145+
} as Target);
146+
}
147+
}
148+
149+
static targetMatchesRelationship(relType, subtype, target, prefix) {
150+
if (relType === 'package') return true;
151+
152+
return relType === subtype && target.indexOf(prefix) === 0;
153+
}
154+
126155
static async getTargetsFromRelationships(
127156
archive: JSZip,
128157
path: string,
129158
prefix: string | string[],
130159
suffix?: string | RegExp,
131160
): Promise<Target[]> {
132161
const prefixes = typeof prefix === 'string' ? [prefix] : prefix;
162+
133163
return XmlHelper.getRelationships(
134164
archive,
135165
path,
136-
(element: Element, rels: Target[]) => {
137-
const target = element.getAttribute('Target');
166+
(element: Element, targets: Target[]) => {
138167
prefixes.forEach((prefix) => {
139-
const stripNumber = target
140-
.replace(prefix, '')
141-
.replace(suffix || '.xml', '');
142-
143-
// vd(stripNumber);
144-
if (target.indexOf(prefix) === 0) {
145-
rels.push({
146-
file: target,
147-
rId: element.getAttribute('Id'),
148-
number: Number(stripNumber),
149-
subtype: _.last(prefix.split('/')),
150-
} as Target);
151-
}
168+
XmlHelper.pushRelTargets(element, prefix, targets);
152169
});
153170
},
154171
);

src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ const setTable = ModifyTableHelper.setTable;
2020

2121
import ModifyChartHelper from './helper/modify-chart-helper';
2222
const setChartData = ModifyChartHelper.setChartData;
23+
const setExtendedChartData = ModifyChartHelper.setExtendedChartData;
2324
const setChartVerticalLines = ModifyChartHelper.setChartVerticalLines;
2425
const setChartScatter = ModifyChartHelper.setChartScatter;
2526
const setChartBubbles = ModifyChartHelper.setChartBubbles;
@@ -89,6 +90,7 @@ export const modify = {
8990
adjustWidth,
9091
setTable,
9192
setChartData,
93+
setExtendedChartData,
9294
setChartVerticalLines,
9395
setChartScatter,
9496
setChartCombo,

0 commit comments

Comments
 (0)