TYPO3 v15 dev-main snapshot ()

This commit is contained in:
2026-08-10 22:31:09 +02:00
commit af8cc155b5
6818 changed files with 642608 additions and 0 deletions
@@ -0,0 +1,68 @@
<?php
declare(strict_types=1);
/*
* This file is part of the TYPO3 CMS project.
*
* It is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, either version 2
* of the License, or any later version.
*
* For the full copyright and license information, please read the
* LICENSE.txt file that was distributed with this source code.
*
* The TYPO3 project - inspiring people to share!
*/
namespace TYPO3\CMS\Core\TypoScript\IncludeTree\Traverser;
use TYPO3\CMS\Core\TypoScript\IncludeTree\IncludeNode\IncludeConditionInterface;
use TYPO3\CMS\Core\TypoScript\IncludeTree\IncludeNode\IncludeInterface;
use TYPO3\CMS\Core\TypoScript\IncludeTree\IncludeNode\RootInclude;
use TYPO3\CMS\Core\TypoScript\IncludeTree\Visitor\IncludeTreeVisitorInterface;
/**
* An optimized traverser that does not traverse children when a node is
* a condition node that evaluate false.
*
* This is pretty clever: When adding the ConditionMatcherVisitor as first visitor, it
* sets the condition verdict of a ConditionInterface node in visitBeforeChildren().
* Adding the AstBuilderVisitor as second visitor, the AstBuilderVisitor will not be
* called for ConditionInterface children that did not evaluate to true.
* This way, we can both evaluate conditions and build the AST in only one traversing round.
*
* @internal: Internal tree structure.
*/
final class ConditionVerdictAwareIncludeTreeTraverser implements IncludeTreeTraverserInterface
{
public function traverse(RootInclude $rootInclude, array $visitors): void
{
foreach ($visitors as $visitor) {
if (!$visitor instanceof IncludeTreeVisitorInterface) {
throw new \RuntimeException(
'Visitors must implement IncludeTreeVisitorInterface',
1689244840
);
}
}
$this->traverseRecursive($rootInclude, $visitors, 0);
}
private function traverseRecursive(IncludeInterface $include, array $visitors, int $currentDepth): void
{
foreach ($visitors as $visitor) {
$visitor->visitBeforeChildren($include, $currentDepth);
}
if ($include instanceof IncludeConditionInterface && !$include->getConditionVerdict()) {
// Don't traverse children if condition did not match.
return;
}
foreach ($include->getNextChild() as $child) {
$this->traverseRecursive($child, $visitors, $currentDepth + 1);
foreach ($visitors as $visitor) {
$visitor->visit($child, $currentDepth);
}
}
}
}
@@ -0,0 +1,56 @@
<?php
declare(strict_types=1);
/*
* This file is part of the TYPO3 CMS project.
*
* It is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, either version 2
* of the License, or any later version.
*
* For the full copyright and license information, please read the
* LICENSE.txt file that was distributed with this source code.
*
* The TYPO3 project - inspiring people to share!
*/
namespace TYPO3\CMS\Core\TypoScript\IncludeTree\Traverser;
use TYPO3\CMS\Core\TypoScript\IncludeTree\IncludeNode\IncludeInterface;
use TYPO3\CMS\Core\TypoScript\IncludeTree\IncludeNode\RootInclude;
use TYPO3\CMS\Core\TypoScript\IncludeTree\Visitor\IncludeTreeVisitorInterface;
/**
* Traverse all nodes of a RootInclude. Used mostly in backend "Template" module.
*
* @internal: Internal tree structure.
*/
final class IncludeTreeTraverser implements IncludeTreeTraverserInterface
{
public function traverse(RootInclude $rootInclude, array $visitors): void
{
foreach ($visitors as $visitor) {
if (!$visitor instanceof IncludeTreeVisitorInterface) {
throw new \RuntimeException(
'Visitors must implement IncludeTreeVisitorInterface',
1689244841
);
}
}
$this->traverseRecursive($rootInclude, $visitors, 0);
}
private function traverseRecursive(IncludeInterface $include, array $visitors, int $currentDepth): void
{
foreach ($visitors as $visitor) {
$visitor->visitBeforeChildren($include, $currentDepth);
}
foreach ($include->getNextChild() as $child) {
$this->traverseRecursive($child, $visitors, $currentDepth + 1);
foreach ($visitors as $visitor) {
$visitor->visit($child, $currentDepth);
}
}
}
}
@@ -0,0 +1,36 @@
<?php
declare(strict_types=1);
/*
* This file is part of the TYPO3 CMS project.
*
* It is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, either version 2
* of the License, or any later version.
*
* For the full copyright and license information, please read the
* LICENSE.txt file that was distributed with this source code.
*
* The TYPO3 project - inspiring people to share!
*/
namespace TYPO3\CMS\Core\TypoScript\IncludeTree\Traverser;
use TYPO3\CMS\Core\TypoScript\IncludeTree\IncludeNode\RootInclude;
use TYPO3\CMS\Core\TypoScript\IncludeTree\Visitor\IncludeTreeVisitorInterface;
/**
* Interface implemented by include tree traversers.
*
* Visitors can be attached and are called for each traversed node.
*
* @internal: Internal tree structure.
*/
interface IncludeTreeTraverserInterface
{
/**
* @param IncludeTreeVisitorInterface[] $visitors
*/
public function traverse(RootInclude $rootInclude, array $visitors): void;
}