@@ -117,11 +117,26 @@ public function process(string $content, array $options = [])
117
117
if (!$ disableLevelProcessing ) {
118
118
for ($ level = 0 ; $ level < 1000 ; $ level ++) {
119
119
$ componentElements = $ domDocument ->getElementsByTagName ('component ' );
120
- $ componentElementsCount = $ componentElements ->length ;
121
- if ($ componentElementsCount === 0 ) {
120
+ if ($ componentElements ->length === 0 ) {
122
121
break ;
123
122
}
123
+ $ insertHTMLSources = [];
124
+ $ list = []; // Save the elements into an array because removeChild() messes up the NodeList
124
125
foreach ($ componentElements as $ componentElement ) {
126
+ $ isInOtherComponentTag = false ;
127
+ $ parentNode = $ componentElement ->parentNode ;
128
+ while ($ parentNode !== null && isset ($ parentNode ->tagName )) {
129
+ if ($ parentNode ->tagName === 'component ' ) {
130
+ $ isInOtherComponentTag = true ;
131
+ break ;
132
+ }
133
+ $ parentNode = $ parentNode ->parentNode ;
134
+ }
135
+ if (!$ isInOtherComponentTag ) {
136
+ $ list [] = $ componentElement ;
137
+ }
138
+ }
139
+ foreach ($ list as $ componentElement ) {
125
140
$ component = $ this ->constructComponent ($ componentElement ->getAttributes (), $ componentElement ->innerHTML );
126
141
$ componentResultHTML = $ getComponentResultHTML ($ component );
127
142
$ isInBodyTag = false ;
@@ -134,15 +149,16 @@ public function process(string $content, array $options = [])
134
149
$ parentNode = $ parentNode ->parentNode ;
135
150
}
136
151
if ($ isInBodyTag ) {
137
- $ insertTargetName = 'html-server-components-compiler-insert-target ' ;
152
+ $ insertTargetName = 'html-server-components-compiler-insert-target- ' . uniqid () ;
138
153
$ componentElement ->parentNode ->insertBefore ($ domDocument ->createInsertTarget ($ insertTargetName ), $ componentElement );
139
154
$ componentElement ->parentNode ->removeChild ($ componentElement ); // must be before insertHTML because a duplicate elements IDs can occur.
140
- $ domDocument -> insertHTML ( $ componentResultHTML , $ insertTargetName) ;
155
+ $ insertHTMLSources [] = [ ' source ' => $ componentResultHTML , ' target ' => $ insertTargetName] ;
141
156
} else {
142
157
$ componentElement ->parentNode ->removeChild ($ componentElement );
143
- $ domDocument -> insertHTML ( $ componentResultHTML) ;
158
+ $ insertHTMLSources [] = [ ' source ' => $ componentResultHTML] ;
144
159
}
145
160
}
161
+ $ domDocument ->insertHTMLMulti ($ insertHTMLSources );
146
162
if (isset ($ options ['recursive ' ]) && $ options ['recursive ' ] === false ) {
147
163
break ;
148
164
}
0 commit comments