[ Index ] |
PHP Cross Reference of phpBB-3.2.11-deutsch |
[Summary view] [Print] [Text view]
1 <?php 2 3 /* 4 * @package s9e\TextFormatter 5 * @copyright Copyright (c) 2010-2019 The s9e Authors 6 * @license http://www.opensource.org/licenses/mit-license.php The MIT License 7 */ 8 namespace s9e\TextFormatter\Configurator\TemplateNormalizations; 9 use DOMElement; 10 use DOMNode; 11 use s9e\TextFormatter\Configurator\Helpers\XPathHelper; 12 class MergeIdenticalConditionalBranches extends AbstractNormalization 13 { 14 protected $queries = ['//xsl:choose']; 15 protected function collectCompatibleBranches(DOMNode $node) 16 { 17 $nodes = []; 18 $key = \null; 19 $values = []; 20 while ($node && $this->isXsl($node, 'when')) 21 { 22 $branch = XPathHelper::parseEqualityExpr($node->getAttribute('test')); 23 if ($branch === \false || \count($branch) !== 1) 24 break; 25 if (isset($key) && \key($branch) !== $key) 26 break; 27 if (\array_intersect($values, \end($branch))) 28 break; 29 $key = \key($branch); 30 $values = \array_merge($values, \end($branch)); 31 $nodes[] = $node; 32 $node = $node->nextSibling; 33 } 34 return $nodes; 35 } 36 protected function mergeBranches(array $nodes) 37 { 38 $sortedNodes = []; 39 foreach ($nodes as $node) 40 { 41 $outerXML = $node->ownerDocument->saveXML($node); 42 $innerXML = \preg_replace('([^>]+>(.*)<[^<]+)s', '$1', $outerXML); 43 $sortedNodes[$innerXML][] = $node; 44 } 45 foreach ($sortedNodes as $identicalNodes) 46 { 47 if (\count($identicalNodes) < 2) 48 continue; 49 $expr = []; 50 foreach ($identicalNodes as $i => $node) 51 { 52 $expr[] = $node->getAttribute('test'); 53 if ($i > 0) 54 $node->parentNode->removeChild($node); 55 } 56 $identicalNodes[0]->setAttribute('test', \implode(' or ', $expr)); 57 } 58 } 59 protected function mergeCompatibleBranches(DOMElement $choose) 60 { 61 $node = $choose->firstChild; 62 while ($node) 63 { 64 $nodes = $this->collectCompatibleBranches($node); 65 if (\count($nodes) > 1) 66 { 67 $node = \end($nodes)->nextSibling; 68 $this->mergeBranches($nodes); 69 } 70 else 71 $node = $node->nextSibling; 72 } 73 } 74 protected function mergeConsecutiveBranches(DOMElement $choose) 75 { 76 $nodes = []; 77 foreach ($choose->childNodes as $node) 78 if ($this->isXsl($node, 'when')) 79 $nodes[] = $node; 80 $i = \count($nodes); 81 while (--$i > 0) 82 $this->mergeBranches([$nodes[$i - 1], $nodes[$i]]); 83 } 84 protected function normalizeElement(DOMElement $element) 85 { 86 $this->mergeCompatibleBranches($element); 87 $this->mergeConsecutiveBranches($element); 88 } 89 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Wed Nov 11 20:33:01 2020 | Cross-referenced by PHPXref 0.7.1 |