Skip to content

Commit 2889674

Browse files
committed
Internal optimizations.
1 parent e6c7361 commit 2889674

File tree

1 file changed

+33
-38
lines changed

1 file changed

+33
-38
lines changed

src/HTMLServerComponentsCompiler.php

Lines changed: 33 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,6 @@ public function process($content, $options = [])
6565
if (is_string($content) && strpos($content, '<component') === false) {
6666
return $content;
6767
}
68-
if (isset($options['_internal_process_components']) && $options['_internal_process_components'] === false) {
69-
return $content;
70-
}
7168

7269
$getComponentFileContent = static function($file, $component, $variables) {
7370
if (is_file($file)) {
@@ -95,18 +92,15 @@ public function process($content, $options = [])
9592
} else {
9693
$sourceParts = explode(':', $srcAttributeValue, 2);
9794
}
98-
if (sizeof($sourceParts) === 2) {
95+
if (isset($sourceParts[0], $sourceParts[1])) {
9996
$scheme = $sourceParts[0];
100-
if (isset($options['recursive']) && $options['recursive'] === false) {
101-
$componentOptions = array_merge($options, ['_internal_process_components' => false]);
102-
}
10397
if ($scheme === 'data') {
10498
if (substr($sourceParts[1], 0, 7) === 'base64,') {
105-
return $this->process(base64_decode(substr($sourceParts[1], 7)), isset($componentOptions) ? $componentOptions : $options);
99+
return base64_decode(substr($sourceParts[1], 7)); //$this->process(, isset($componentOptions) ? $componentOptions : $options);
106100
}
107101
throw new \Exception('Components data URI scheme only supports base64 (data:base64,ABCD...)!');
108102
} elseif ($scheme === 'file') {
109-
return $this->process($getComponentFileContent(urldecode($sourceParts[1]), $component, isset($options['variables']) && is_array($options['variables']) ? $options['variables'] : []), isset($componentOptions) ? $componentOptions : $options);
103+
return $getComponentFileContent(urldecode($sourceParts[1]), $component, isset($options['variables']) && is_array($options['variables']) ? $options['variables'] : []); //$this->process(isset($componentOptions) ? $componentOptions : $options);
110104
}
111105
throw new \Exception('Components URI scheme not valid! It must be \'file:\', \'data:\' or an alias.');
112106
}
@@ -116,40 +110,41 @@ public function process($content, $options = [])
116110
};
117111

118112
$domDocument = new \IvoPetkov\HTML5DOMDocument();
119-
if ($content instanceof \IvoPetkov\HTMLServerComponent) {
120-
$domDocument->loadHTML($getComponentResultHTML($content));
121-
} else {
122-
$domDocument->loadHTML($content);
113+
$domDocument->loadHTML($content instanceof \IvoPetkov\HTMLServerComponent ? $getComponentResultHTML($content) : $content);
114+
for ($level = 0; $level < 1000; $level++) {
123115
$componentElements = $domDocument->getElementsByTagName('component');
124116
$componentElementsCount = $componentElements->length;
125-
if ($componentElementsCount > 0) {
126-
for ($i = 0; $i < $componentElementsCount; $i++) {
127-
$componentElement = $componentElements->item(0);
128-
if ($componentElement === null) { // component in component innerHTML case
117+
if ($componentElementsCount === 0) {
118+
break;
119+
}
120+
for ($i = 0; $i < $componentElementsCount; $i++) {
121+
$componentElement = $componentElements->item($i);
122+
if ($componentElement === null) { // component in component innerHTML case
123+
continue;
124+
}
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;
129132
break;
130133
}
131-
$component = $this->constructComponent($componentElement->getAttributes(), $componentElement->innerHTML);
132-
$componentResultHTML = $getComponentResultHTML($component);
133-
134-
$isInBodyTag = false;
135-
$parentNode = $componentElement->parentNode;
136-
while ($parentNode !== null && isset($parentNode->tagName)) {
137-
if ($parentNode->tagName === 'body') {
138-
$isInBodyTag = true;
139-
break;
140-
}
141-
$parentNode = $parentNode->parentNode;
142-
}
143-
if ($isInBodyTag) {
144-
$insertTargetName = 'html-server-components-compiler-target-' . uniqid();
145-
$componentElement->parentNode->insertBefore($domDocument->createInsertTarget($insertTargetName), $componentElement);
146-
$componentElement->parentNode->removeChild($componentElement); // must be before insertHTML because a duplicate elements IDs can occur.
147-
$domDocument->insertHTML($componentResultHTML, $insertTargetName);
148-
} else {
149-
$componentElement->parentNode->removeChild($componentElement);
150-
$domDocument->insertHTML($componentResultHTML);
151-
}
134+
$parentNode = $parentNode->parentNode;
152135
}
136+
if ($isInBodyTag) {
137+
$insertTargetName = 'html-server-components-compiler-insert-target';
138+
$componentElement->parentNode->insertBefore($domDocument->createInsertTarget($insertTargetName), $componentElement);
139+
$componentElement->parentNode->removeChild($componentElement); // must be before insertHTML because a duplicate elements IDs can occur.
140+
$domDocument->insertHTML($componentResultHTML, $insertTargetName);
141+
} else {
142+
$componentElement->parentNode->removeChild($componentElement);
143+
$domDocument->insertHTML($componentResultHTML);
144+
}
145+
}
146+
if (isset($options['recursive']) && $options['recursive'] === false) {
147+
break;
153148
}
154149
}
155150

0 commit comments

Comments
 (0)