11import { FileHelper } from '../helper/file-helper' ;
2- import { ShapeTargetType , SourceIdentifier } from '../types/types' ;
2+ import {
3+ ShapeModificationCallback ,
4+ ShapeTargetType ,
5+ SourceIdentifier ,
6+ } from '../types/types' ;
37import { ISlide } from '../interfaces/islide' ;
48import { IPresentationProps } from '../interfaces/ipresentation-props' ;
59import { PresTemplate } from '../interfaces/pres-template' ;
610import { RootPresTemplate } from '../interfaces/root-pres-template' ;
7- import { last , vd } from '../helper/general-helper' ;
11+ import { GeneralHelper , last , vd } from '../helper/general-helper' ;
812import { XmlRelationshipHelper } from '../helper/xml-relationship-helper' ;
913import { IMaster } from '../interfaces/imaster' ;
1014import HasShapes from './has-shapes' ;
1115import { Master } from './master' ;
1216import 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' ;
1423import XmlPlaceholderHelper from '../helper/xml-placeholder-helper' ;
15- import { XmlHelper } from '../helper/xml-helper' ;
1624
1725export 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
0 commit comments