@@ -109,42 +109,53 @@ public function process($content, $options = [])
109
109
throw new \Exception ('Component src attribute is missing at ' . (string ) $ component . '! ' );
110
110
};
111
111
112
+ $ disableLevelProcessing = false ;
112
113
$ 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 ;
119
118
}
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 ;
124
128
}
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 );
133
153
}
134
- $ parentNode = $ parentNode ->parentNode ;
135
154
}
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 ;
143
157
}
144
158
}
145
- if (isset ($ options ['recursive ' ]) && $ options ['recursive ' ] === false ) {
146
- break ;
147
- }
148
159
}
149
160
150
161
return $ domDocument ->saveHTML ();
0 commit comments