Skip to content

Commit ad6ee33

Browse files
committed
Fix in non recursive process().
1 parent f65589e commit ad6ee33

File tree

1 file changed

+40
-29
lines changed

1 file changed

+40
-29
lines changed

src/HTMLServerComponentsCompiler.php

Lines changed: 40 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)