@@ -109,42 +109,53 @@ public function process($content, $options = [])
109109 throw new \Exception ('Component src attribute is missing at ' . (string ) $ component . '! ' );
110110 };
111111
112+ $ disableLevelProcessing = false ;
112113 $ domDocument = new \IvoPetkov \HTML5DOMDocument ();
113- $ domDocument ->loadHTML ($ content instanceof \IvoPetkov \HTMLServerComponent ? $ getComponentResultHTML ($ content ) : $ content );
114- for ($ level = 0 ; $ level < 1000 ; $ level ++) {
115- $ componentElements = $ domDocument ->getElementsByTagName ('component ' );
116- $ componentElementsCount = $ componentElements ->length ;
117- if ($ componentElementsCount === 0 ) {
118- break ;
114+ if ($ content instanceof \IvoPetkov \HTMLServerComponent) {
115+ $ domDocument ->loadHTML ($ getComponentResultHTML ($ content ));
116+ if (isset ($ options ['recursive ' ]) && $ options ['recursive ' ] === false ) {
117+ $ disableLevelProcessing = true ;
119118 }
120- for ($ i = 0 ; $ i < $ componentElementsCount ; $ i ++) {
121- $ componentElement = $ componentElements ->item ($ i );
122- if ($ componentElement === null ) { // component in component innerHTML case
123- continue ;
119+ } else {
120+ $ domDocument ->loadHTML ($ content );
121+ }
122+ if (!$ disableLevelProcessing ) {
123+ for ($ level = 0 ; $ level < 1000 ; $ level ++) {
124+ $ componentElements = $ domDocument ->getElementsByTagName ('component ' );
125+ $ componentElementsCount = $ componentElements ->length ;
126+ if ($ componentElementsCount === 0 ) {
127+ break ;
124128 }
125- $ component = $ this ->constructComponent ($ componentElement ->getAttributes (), $ componentElement ->innerHTML );
126- $ componentResultHTML = $ getComponentResultHTML ($ component );
127- $ isInBodyTag = false ;
128- $ parentNode = $ componentElement ->parentNode ;
129- while ($ parentNode !== null && isset ($ parentNode ->tagName )) {
130- if ($ parentNode ->tagName === 'body ' ) {
131- $ isInBodyTag = true ;
132- break ;
129+ for ($ i = 0 ; $ i < $ componentElementsCount ; $ i ++) {
130+ $ componentElement = $ componentElements ->item ($ i );
131+ if ($ componentElement === null ) { // component in component innerHTML case
132+ continue ;
133+ }
134+ $ component = $ this ->constructComponent ($ componentElement ->getAttributes (), $ componentElement ->innerHTML );
135+ $ componentResultHTML = $ getComponentResultHTML ($ component );
136+ $ isInBodyTag = false ;
137+ $ parentNode = $ componentElement ->parentNode ;
138+ while ($ parentNode !== null && isset ($ parentNode ->tagName )) {
139+ if ($ parentNode ->tagName === 'body ' ) {
140+ $ isInBodyTag = true ;
141+ break ;
142+ }
143+ $ parentNode = $ parentNode ->parentNode ;
144+ }
145+ if ($ isInBodyTag ) {
146+ $ insertTargetName = 'html-server-components-compiler-insert-target ' ;
147+ $ componentElement ->parentNode ->insertBefore ($ domDocument ->createInsertTarget ($ insertTargetName ), $ componentElement );
148+ $ componentElement ->parentNode ->removeChild ($ componentElement ); // must be before insertHTML because a duplicate elements IDs can occur.
149+ $ domDocument ->insertHTML ($ componentResultHTML , $ insertTargetName );
150+ } else {
151+ $ componentElement ->parentNode ->removeChild ($ componentElement );
152+ $ domDocument ->insertHTML ($ componentResultHTML );
133153 }
134- $ parentNode = $ parentNode ->parentNode ;
135154 }
136- if ($ isInBodyTag ) {
137- $ insertTargetName = 'html-server-components-compiler-insert-target ' ;
138- $ componentElement ->parentNode ->replaceChild ($ domDocument ->createInsertTarget ($ insertTargetName ), $ componentElement );
139- $ domDocument ->insertHTML ($ componentResultHTML , $ insertTargetName );
140- } else {
141- $ componentElement ->parentNode ->removeChild ($ componentElement );
142- $ domDocument ->insertHTML ($ componentResultHTML );
155+ if (isset ($ options ['recursive ' ]) && $ options ['recursive ' ] === false ) {
156+ break ;
143157 }
144158 }
145- if (isset ($ options ['recursive ' ]) && $ options ['recursive ' ] === false ) {
146- break ;
147- }
148159 }
149160
150161 return $ domDocument ->saveHTML ();
0 commit comments