Skip to content

Commit 98ee1ca

Browse files
committed
chore(slide): improve placeholder handling
1 parent b601d93 commit 98ee1ca

File tree

2 files changed

+61
-47
lines changed

2 files changed

+61
-47
lines changed

src/classes/slide.ts

Lines changed: 56 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,26 @@
11
import { FileHelper } from '../helper/file-helper';
2-
import { ShapeTargetType, SourceIdentifier } from '../types/types';
2+
import {
3+
ShapeModificationCallback,
4+
ShapeTargetType,
5+
SourceIdentifier,
6+
} from '../types/types';
37
import { ISlide } from '../interfaces/islide';
48
import { IPresentationProps } from '../interfaces/ipresentation-props';
59
import { PresTemplate } from '../interfaces/pres-template';
610
import { RootPresTemplate } from '../interfaces/root-pres-template';
7-
import { last, vd } from '../helper/general-helper';
11+
import { GeneralHelper, last, vd } from '../helper/general-helper';
812
import { XmlRelationshipHelper } from '../helper/xml-relationship-helper';
913
import { IMaster } from '../interfaces/imaster';
1014
import HasShapes from './has-shapes';
1115
import { Master } from './master';
1216
import ModifyPresentationHelper from '../helper/modify-presentation-helper';
13-
import { ElementInfo, PlaceholderInfo, SlideInfo } from '../types/xml-types';
17+
import {
18+
ElementInfo,
19+
PlaceholderInfo,
20+
SlideInfo,
21+
XmlElement,
22+
} from '../types/xml-types';
1423
import XmlPlaceholderHelper from '../helper/xml-placeholder-helper';
15-
import { XmlHelper } from '../helper/xml-helper';
1624

1725
export class Slide extends HasShapes implements ISlide {
1826
targetType: ShapeTargetType = 'slide';
@@ -126,35 +134,31 @@ export class Slide extends HasShapes implements ISlide {
126134
slidesInfo.find((slide) => slide.info.layoutName === targetLayout)?.info
127135
.layoutPlaceholders || [];
128136

129-
vd(layoutPlaceholders)
130-
vd(elements.map(element => element.placeholder))
131-
vd(elements.map(element => element.type))
137+
// vd('sourcePlaceholders: ')
138+
// vd(elements.map(element => element.placeholder))
139+
// vd('targetPlaceholders: ')
140+
// vd(layoutPlaceholders)
132141

133142
const usedPlaceholders: number[] = [];
134143
const unmatchedPhElements: ElementInfo[] = [];
135144
elements.forEach((element: ElementInfo) => {
136-
if (element.placeholder) {
137-
if (element.placeholder.type) {
138-
const matchesPlaceholder = this.applyPlaceholderToElement(
139-
layoutPlaceholders,
140-
element.placeholder.type,
141-
usedPlaceholders,
142-
element,
143-
);
144-
145-
if (!matchesPlaceholder) {
146-
unmatchedPhElements.push(element);
147-
}
148-
} else {
145+
if (element.placeholder?.type) {
146+
const matchesPlaceholder = this.applyPlaceholderToElement(
147+
layoutPlaceholders,
148+
element.placeholder.type,
149+
usedPlaceholders,
150+
element,
151+
);
152+
153+
if (!matchesPlaceholder) {
149154
unmatchedPhElements.push(element);
150155
}
151156
}
152157
});
153158

154159
unmatchedPhElements.forEach((element) => {
155-
const forceType = element.placeholder.type === 'title'
156-
? 'ctrTitle'
157-
: 'subTitle';
160+
const forceType =
161+
element.placeholder.type === 'title' ? 'ctrTitle' : 'subTitle';
158162

159163
const matchesPlaceholder = this.applyPlaceholderToElement(
160164
layoutPlaceholders,
@@ -164,15 +168,10 @@ export class Slide extends HasShapes implements ISlide {
164168
);
165169

166170
if (!matchesPlaceholder) {
167-
this.modifyElement(
168-
{
169-
creationId: element.creationId,
170-
name: element.name,
171-
},
172-
(element) => {
173-
XmlPlaceholderHelper.removePlaceholder(element)
174-
},
175-
);
171+
const callback = (element) => {
172+
XmlPlaceholderHelper.removePlaceholder(element);
173+
};
174+
this.postApplyModification(element, callback);
176175
}
177176
});
178177

@@ -199,24 +198,37 @@ export class Slide extends HasShapes implements ISlide {
199198
matchPlaceholders,
200199
);
201200
usedPlaceholders.push(matchPlaceholder.idx);
201+
const callback = (element: XmlElement) => {
202+
XmlPlaceholderHelper.setPlaceholderDefaults(element, matchPlaceholder);
203+
};
204+
this.postApplyModification(element, callback);
202205

203-
this.modifyElement(
204-
{
205-
creationId: element.creationId,
206-
name: element.name,
207-
},
208-
(element) => {
209-
XmlPlaceholderHelper.resetPlaceholderToDefaults(
210-
element,
211-
matchPlaceholder,
212-
);
213-
},
214-
);
215206
return true;
216207
}
217208
return false;
218209
}
219210

211+
postApplyModification(
212+
element: ElementInfo,
213+
callback: ShapeModificationCallback,
214+
) {
215+
const selector = {
216+
creationId: element.creationId,
217+
nameIdx: element.nameIdx,
218+
name: element.name,
219+
};
220+
221+
const alreadyModified = this.getAlreadyModifiedElement(selector);
222+
if (alreadyModified) {
223+
alreadyModified.callback = GeneralHelper.arrayify(
224+
alreadyModified.callback,
225+
);
226+
alreadyModified.callback.push(callback);
227+
} else {
228+
this.modifyElement(selector, callback);
229+
}
230+
}
231+
220232
/**
221233
* Find another slide layout by name.
222234
* @param targetLayoutName

src/helper/xml-placeholder-helper.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,14 @@ import { XmlHelper } from './xml-helper';
33
import { ShapeCoordinates } from '../types/shape-types';
44

55
export default class XmlPlaceholderHelper {
6-
static resetPlaceholderToDefaults(element: XmlElement, layoutPlaceholder: PlaceholderInfo): void {
6+
static setPlaceholderDefaults(element: XmlElement, layoutPlaceholder: PlaceholderInfo): void {
77
// Get the placeholder element
88
const ph = element.getElementsByTagName('p:ph').item(0);
99

10-
// Set the index to match the layout placeholder
11-
ph.setAttribute('idx', String(layoutPlaceholder.idx));
10+
if(ph) {
11+
// Set the index to match the layout placeholder
12+
ph.setAttribute('idx', String(layoutPlaceholder.idx));
13+
}
1214

1315
// Reset all positioning information
1416
const xfrm = element.getElementsByTagName('a:xfrm').item(0);

0 commit comments

Comments
 (0)