@@ -117,11 +117,26 @@ public function process(string $content, array $options = [])
117117 if (!$ disableLevelProcessing ) {
118118 for ($ level = 0 ; $ level < 1000 ; $ level ++) {
119119 $ componentElements = $ domDocument ->getElementsByTagName ('component ' );
120- $ componentElementsCount = $ componentElements ->length ;
121- if ($ componentElementsCount === 0 ) {
120+ if ($ componentElements ->length === 0 ) {
122121 break ;
123122 }
123+ $ insertHTMLSources = [];
124+ $ list = []; // Save the elements into an array because removeChild() messes up the NodeList
124125 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 ) {
125140 $ component = $ this ->constructComponent ($ componentElement ->getAttributes (), $ componentElement ->innerHTML );
126141 $ componentResultHTML = $ getComponentResultHTML ($ component );
127142 $ isInBodyTag = false ;
@@ -134,15 +149,16 @@ public function process(string $content, array $options = [])
134149 $ parentNode = $ parentNode ->parentNode ;
135150 }
136151 if ($ isInBodyTag ) {
137- $ insertTargetName = 'html-server-components-compiler-insert-target ' ;
152+ $ insertTargetName = 'html-server-components-compiler-insert-target- ' . uniqid () ;
138153 $ componentElement ->parentNode ->insertBefore ($ domDocument ->createInsertTarget ($ insertTargetName ), $ componentElement );
139154 $ 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] ;
141156 } else {
142157 $ componentElement ->parentNode ->removeChild ($ componentElement );
143- $ domDocument -> insertHTML ( $ componentResultHTML) ;
158+ $ insertHTMLSources [] = [ ' source ' => $ componentResultHTML] ;
144159 }
145160 }
161+ $ domDocument ->insertHTMLMulti ($ insertHTMLSources );
146162 if (isset ($ options ['recursive ' ]) && $ options ['recursive ' ] === false ) {
147163 break ;
148164 }
0 commit comments