Skip to content

Commit 214cab3

Browse files
committed
Performance optimizations.
1 parent 8e6c72a commit 214cab3

File tree

2 files changed

+22
-6
lines changed

2 files changed

+22
-6
lines changed

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
],
1414
"require": {
1515
"php": ">=7.0.0",
16-
"ivopetkov/html5-dom-document-php": "0.3.*|0.4.*|0.5.*"
16+
"ivopetkov/html5-dom-document-php": ">=0.5.5"
1717
},
1818
"require-dev": {
1919
"phpunit/phpunit": "^4.8"

src/HTMLServerComponentsCompiler.php

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

Comments
 (0)