Skip to content

Commit acdc722

Browse files
committed
chore(master): first steps for master slide copying (WIP)
1 parent f886b81 commit acdc722

File tree

11 files changed

+230
-52
lines changed

11 files changed

+230
-52
lines changed

src/automizer.ts

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import { PresTemplate } from './interfaces/pres-template';
66
import { RootPresTemplate } from './interfaces/root-pres-template';
77
import { Template } from './classes/template';
88
import { TemplateInfo } from './types/xml-types';
9+
import { vd } from './helper/general-helper';
10+
import {Master} from './classes/master';
911

1012
/**
1113
* Automizer
@@ -96,6 +98,11 @@ export default class Automizer implements IPresentationProps {
9698
private loadTemplate(location: string, name?: string): this {
9799
location = this.getLocation(location, 'template');
98100

101+
const alreadyLoaded = this.templates.find(template => template.name === name)
102+
if(alreadyLoaded) {
103+
return this
104+
}
105+
99106
const newTemplate = Template.import(location, name);
100107

101108
if (!this.isPresTemplate(newTemplate)) {
@@ -116,10 +123,10 @@ export default class Automizer implements IPresentationProps {
116123
public async setCreationIds(): Promise<TemplateInfo[]> {
117124
const templateCreationId = [];
118125
for (const template of this.templates) {
119-
const slideInfo = await template.setCreationIds();
126+
const creationIds = template.creationIds || await template.setCreationIds()
120127
templateCreationId.push({
121128
name: template.name,
122-
slides: slideInfo,
129+
slides: creationIds,
123130
});
124131
}
125132
return templateCreationId;
@@ -170,6 +177,25 @@ export default class Automizer implements IPresentationProps {
170177
return this;
171178
}
172179

180+
public addMaster(
181+
name: string,
182+
masterNumber: number,
183+
callback?: (slide: Slide) => void,
184+
): this {
185+
186+
const template = this.getTemplate(name);
187+
188+
const newMaster = new Master({
189+
presentation: this,
190+
template,
191+
masterNumber,
192+
});
193+
194+
// this.rootTemplate.slides.push(newMaster);
195+
196+
return this;
197+
}
198+
173199
/**
174200
* Searches this.templates to find template by given name.
175201
* @internal

src/classes/master.ts

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
import JSZip from 'jszip';
2+
3+
import { FileHelper } from '../helper/file-helper';
4+
import { XmlHelper } from '../helper/xml-helper';
5+
import {
6+
AnalyzedElementType,
7+
ImportedElement,
8+
ImportElement,
9+
SlideModificationCallback,
10+
ShapeModificationCallback,
11+
} from '../types/types';
12+
import { ISlide } from '../interfaces/islide';
13+
import { IPresentationProps } from '../interfaces/ipresentation-props';
14+
import { PresTemplate } from '../interfaces/pres-template';
15+
import { RootPresTemplate } from '../interfaces/root-pres-template';
16+
import { ElementType } from '../enums/element-type';
17+
import {
18+
RelationshipAttribute,
19+
SlideListAttribute,
20+
HelperElement,
21+
} from '../types/xml-types';
22+
import { Image } from '../shapes/image';
23+
import { Chart } from '../shapes/chart';
24+
import { GenericShape } from '../shapes/generic';
25+
import {GeneralHelper, vd} from '../helper/general-helper';
26+
27+
export class Master {
28+
/**
29+
* Source template of slide
30+
* @internal
31+
*/
32+
sourceTemplate: PresTemplate;
33+
/**
34+
* Target template of slide
35+
* @internal
36+
*/
37+
targetTemplate: RootPresTemplate;
38+
/**
39+
* Target number of slide
40+
* @internal
41+
*/
42+
targetNumber: number;
43+
/**
44+
* Source number of slide
45+
* @internal
46+
*/
47+
sourceNumber: number;
48+
/**
49+
* Target archive of slide
50+
* @internal
51+
*/
52+
targetArchive: JSZip;
53+
/**
54+
* Source archive of slide
55+
* @internal
56+
*/
57+
sourceArchive: JSZip;
58+
/**
59+
* Source path of slide
60+
* @internal
61+
*/
62+
sourcePath: string;
63+
/**
64+
* Target path of slide
65+
* @internal
66+
*/
67+
targetPath: string;
68+
/**
69+
* Modifications of slide
70+
* @internal
71+
*/
72+
modifications: SlideModificationCallback[];
73+
/**
74+
* Import elements of slide
75+
* @internal
76+
*/
77+
importElements: ImportElement[];
78+
/**
79+
* Rels path of slide
80+
* @internal
81+
*/
82+
relsPath: string;
83+
/**
84+
* Root template of slide
85+
* @internal
86+
*/
87+
rootTemplate: RootPresTemplate;
88+
/**
89+
* Root of slide
90+
* @internal
91+
*/
92+
root: IPresentationProps;
93+
/**
94+
* Target rels path of slide
95+
* @internal
96+
*/
97+
targetRelsPath: string;
98+
99+
constructor(params: {
100+
presentation: IPresentationProps;
101+
template: PresTemplate;
102+
masterNumber: number;
103+
}) {
104+
this.sourceTemplate = params.template;
105+
this.sourceNumber = params.masterNumber;
106+
107+
this.sourcePath = `ppt/slides/slide${this.sourceNumber}.xml`;
108+
this.relsPath = `ppt/slides/_rels/slide${this.sourceNumber}.xml.rels`;
109+
}
110+
111+
112+
/**
113+
* Appends slide
114+
* @internal
115+
* @param targetTemplate
116+
* @returns append
117+
*/
118+
async append(targetTemplate: RootPresTemplate): Promise<void> {
119+
this.targetTemplate = targetTemplate;
120+
121+
this.targetArchive = await targetTemplate.archive;
122+
this.targetNumber = targetTemplate.incrementCounter('slides');
123+
this.targetPath = `ppt/slides/slide${this.targetNumber}.xml`;
124+
this.targetRelsPath = `ppt/slides/_rels/slide${this.targetNumber}.xml.rels`;
125+
this.sourceArchive = await this.sourceTemplate.archive;
126+
127+
console.log('Appending slide ' + this.targetNumber)
128+
129+
130+
131+
}
132+
133+
}

src/classes/slide.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import {
2222
import { Image } from '../shapes/image';
2323
import { Chart } from '../shapes/chart';
2424
import { GenericShape } from '../shapes/generic';
25-
import { GeneralHelper } from '../helper/general-helper';
25+
import {GeneralHelper, vd} from '../helper/general-helper';
2626

2727
export class Slide implements ISlide {
2828
/**
@@ -132,13 +132,15 @@ export class Slide implements ISlide {
132132
*/
133133
async append(targetTemplate: RootPresTemplate): Promise<void> {
134134
this.targetTemplate = targetTemplate;
135+
135136
this.targetArchive = await targetTemplate.archive;
136137
this.targetNumber = targetTemplate.incrementCounter('slides');
137138
this.targetPath = `ppt/slides/slide${this.targetNumber}.xml`;
138139
this.targetRelsPath = `ppt/slides/_rels/slide${this.targetNumber}.xml.rels`;
139-
140140
this.sourceArchive = await this.sourceTemplate.archive;
141141

142+
console.log('Appending slide ' + this.targetNumber)
143+
142144
await this.copySlideFiles();
143145
await this.copyRelatedContent();
144146
await this.addSlideToPresentation();
@@ -410,7 +412,6 @@ export class Slide implements ISlide {
410412
/**
411413
* Copys slide files
412414
* @internal
413-
* @returns slide files
414415
*/
415416
async copySlideFiles(): Promise<void> {
416417
await FileHelper.zipCopy(

src/dev.ts

Lines changed: 9 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -8,49 +8,18 @@ const automizer = new Automizer({
88

99
const pres = automizer
1010
.loadRoot(`RootTemplate.pptx`)
11-
.load(`ChartScatter.pptx`, 'charts');
12-
13-
const dataScatter = <ChartData><unknown>{
14-
series: [
15-
{label: 'series s1'},
16-
{label: 'series s2'},
17-
{label: 'series s3'}
18-
],
19-
categories: [
20-
{
21-
label: 'r1', values: [
22-
{x: 10, y: 20}, {x: 9, y: 30}, {x: 19, y: 40}
23-
], styles: [
24-
{
25-
color: {
26-
type: 'srgbClr',
27-
value: 'cccccc'
28-
}
29-
}
30-
]
31-
},
32-
{label: 'r2', values: [{x: 21, y: 11}, {x: 8, y: 31}, {x: 18, y: 41}]},
33-
{label: 'r3', values: [{x: 22, y: 28}, {x: 7, y: 26}, {x: 17, y: 36}]},
34-
{label: 'r4', values: [{x: 13, y: 13}, {x: 16, y: 28}, {x: 26, y: 38}]},
35-
{label: 'r5', values: [{x: 18, y: 24}, {x: 15, y: 24}, {x: 25, y: 34}]},
36-
{label: 'r6', values: [{x: 28, y: 34}, {x: 25, y: 34}, {x: 35, y: 44}]},
37-
// {label: 'r1', values: [{x: 10, y: 20, label: "s1-1"}, {x: 9, y: 30, label: "s2-1"}, {x: 19, y: 40, label: "s3-1"}]},
38-
// {label: 'r2', values: [{x: 21, y: 11, label: "s1-2"}, {x: 8, y: 31, label: "s2-2"}, {x: 18, y: 41, label: "s3-2"}]},
39-
// {label: 'r3', values: [{x: 22, y: 28, label: "s1-3"}, {x: 7, y: 26, label: "s2-3"}, {x: 17, y: 36, label: "s3-3"}]},
40-
// {label: 'r4', values: [{x: 13, y: 13, label: "s1-4"}, {x: 16, y: 28, label: "s2-4"}, {x: 26, y: 38, label: "s3-4"}]},
41-
// {label: 'r5', values: [{x: 18, y: 24, label: "s1-5"}, {x: 15, y: 24, label: "s2-5"}, {x: 25, y: 34, label: "s3-5"}]},
42-
// {label: 'r6', values: [{x: 28, y: 34, label: "s1-6"}, {x: 25, y: 34, label: "s2-6"}, {x: 35, y: 44, label: "s3-6"}]},
43-
],
44-
45-
}
11+
.load(`TemplateWithMaster.pptx`, 'master');
12+
13+
4614
const run = async () => {
4715
await pres
48-
.addSlide('charts', 2, (slide) => {
49-
slide.modifyElement('ScatterPoint', [
50-
modify.setChartScatter(dataScatter),
51-
]);
16+
.addMaster('master', 2, (slide) => {
17+
18+
})
19+
.addSlide('master', 2, (slide) => {
20+
5221
})
53-
.write(`modify-chart-scatter-point.test.pptx`)
22+
.write(`add-master.test.pptx`)
5423

5524
return pres;
5625
};

src/helper/modify-color-helper.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ export default class ModifyColorHelper {
77
/**
88
* Replaces or creates an <a:solidFill> Element
99
*/
10-
static solidFill = (color: Color) => (element: Element): void => {
10+
static solidFill = (color: Color, index?:number|'last') => (element: Element): void => {
1111
const solidFills = element.getElementsByTagName('a:solidFill')
1212

1313
if(!solidFills.length) {
@@ -18,7 +18,13 @@ export default class ModifyColorHelper {
1818
return
1919
}
2020

21-
const solidFill = solidFills[0] as Element
21+
let targetIndex = (!index)
22+
? 0
23+
: ((index === 'last')
24+
? solidFills.length-1
25+
: index)
26+
27+
const solidFill = solidFills[targetIndex] as Element
2228
const colorType = new XmlElements(element, {
2329
color: color
2430
}).colorType()

src/helper/modify-shape-helper.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ export default class ModifyShapeHelper {
6161

6262
Object.keys(pos).forEach((key) => {
6363
const value = Math.round(pos[key]);
64-
if(typeof value !== 'number') return;
64+
if(typeof value !== 'number' || !map[key]) return;
6565

6666
xfrm
6767
.getElementsByTagName(map[key].tag)[0]

src/helper/modify-xml-helper.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,9 @@ export default class ModifyXmlHelper {
115115
case 'c:dPt':
116116
new XmlElements(parent).dataPoint();
117117
return true;
118+
case 'c:spPr':
119+
new XmlElements(parent).shapeProperties();
120+
return true;
118121
}
119122
//
120123
// if(required === true) {

src/helper/xml-elements.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,4 +141,9 @@ export default class XmlElements {
141141
lineEnd.setAttribute('len', 'med')
142142
return lineEnd
143143
}
144+
145+
shapeProperties() {
146+
const spPr = this.spPr();
147+
this.element.appendChild(spPr)
148+
}
144149
}

src/modify/modify-chart.ts

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -180,8 +180,17 @@ export class ModifyChart {
180180
this.data.series.forEach((series, s) => {
181181
this.data.categories.forEach((category, c) => {
182182
this.chart.modify(
183-
this.series(s, this.seriesDataLabel(c, s, category.label))
183+
this.series(s, this.seriesDataLabelsRange(c, s, category.label))
184184
)
185+
// if(category.styles && category.styles[s]) {
186+
// const pointStyle = category.styles[s]
187+
// if(pointStyle.label) {
188+
// vd(this.series(s, this.seriesDataLabel(c, pointStyle.label)))
189+
// // this.chart.modify(
190+
// // this.series(s, this.seriesDataLabel(c, pointStyle.label))
191+
// // )
192+
// }
193+
// }
185194
})
186195
})
187196
}
@@ -344,7 +353,7 @@ export class ModifyChart {
344353
};
345354
};
346355

347-
seriesDataLabel = (r: number, c: number, value: string|number): ModificationTags => {
356+
seriesDataLabelsRange = (r: number, c: number, value: string|number): ModificationTags => {
348357
return {
349358
'c15:datalabelsRange': {
350359
isRequired: false,
@@ -363,6 +372,27 @@ export class ModifyChart {
363372
}
364373
};
365374
};
375+
//
376+
// seriesDataLabel = (c: number, style: ChartValueStyle['label']): ModificationTags => {
377+
// vd(c)
378+
// return {
379+
// 'c:dLbls': {
380+
// children: {
381+
// 'c:dLbl': {
382+
// index: c,
383+
// children: {
384+
// 'c:idx': {
385+
// modify: ModifyXmlHelper.attribute('val', '123')
386+
// },
387+
// 'c:dLblPos': {
388+
// modify: ModifyXmlHelper.attribute('val', 'test')
389+
// },
390+
// }
391+
// }
392+
// }
393+
// }
394+
// };
395+
// };
366396

367397
defaultSeries(
368398
r: number,

0 commit comments

Comments
 (0)