Verzeichnisstruktur phpBB-3.2.0
- Veröffentlicht
- 06.01.2017
So funktioniert es
|
Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück |
Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis. |
|
(Beispiel Datei-Icons)
|
Auf das Icon klicken um den Quellcode anzuzeigen |
MergeIdenticalConditionalBranches.php
01 <?php
02
03 /*
04 * @package s9e\TextFormatter
05 * @copyright Copyright (c) 2010-2016 The s9e Authors
06 * @license http://www.opensource.org/licenses/mit-license.php The MIT License
07 */
08 namespace s9e\TextFormatter\Configurator\TemplateNormalizations;
09 use DOMElement;
10 use DOMNode;
11 use s9e\TextFormatter\Configurator\Helpers\TemplateParser;
12 use s9e\TextFormatter\Configurator\TemplateNormalization;
13 class MergeIdenticalConditionalBranches extends TemplateNormalization
14 {
15 public function normalize(DOMElement $template)
16 {
17 foreach ($template->getElementsByTagNameNS(self::XMLNS_XSL, 'choose') as $choose)
18 {
19 self::mergeCompatibleBranches($choose);
20 self::mergeConsecutiveBranches($choose);
21 }
22 }
23 protected static function mergeCompatibleBranches(DOMElement $choose)
24 {
25 $node = $choose->firstChild;
26 while ($node)
27 {
28 $nodes = self::collectCompatibleBranches($node);
29 if (\count($nodes) > 1)
30 {
31 $node = \end($nodes)->nextSibling;
32 self::mergeBranches($nodes);
33 }
34 else
35 $node = $node->nextSibling;
36 }
37 }
38 protected static function mergeConsecutiveBranches(DOMElement $choose)
39 {
40 $nodes = array();
41 foreach ($choose->childNodes as $node)
42 if (self::isXslWhen($node))
43 $nodes[] = $node;
44 $i = \count($nodes);
45 while (--$i > 0)
46 self::mergeBranches(array($nodes[$i - 1], $nodes[$i]));
47 }
48 protected static function collectCompatibleBranches(DOMNode $node)
49 {
50 $nodes = array();
51 $key = \null;
52 $values = array();
53 while ($node && self::isXslWhen($node))
54 {
55 $branch = TemplateParser::parseEqualityExpr($node->getAttribute('test'));
56 if ($branch === \false || \count($branch) !== 1)
57 break;
58 if (isset($key) && \key($branch) !== $key)
59 break;
60 if (\array_intersect($values, \end($branch)))
61 break;
62 $key = \key($branch);
63 $values = \array_merge($values, \end($branch));
64 $nodes[] = $node;
65 $node = $node->nextSibling;
66 }
67 return $nodes;
68 }
69 protected static function mergeBranches(array $nodes)
70 {
71 $sortedNodes = array();
72 foreach ($nodes as $node)
73 {
74 $outerXML = $node->ownerDocument->saveXML($node);
75 $innerXML = \preg_replace('([^>]+>(.*)<[^<]+)s', '$1', $outerXML);
76 $sortedNodes[$innerXML][] = $node;
77 }
78 foreach ($sortedNodes as $identicalNodes)
79 {
80 if (\count($identicalNodes) < 2)
81 continue;
82 $expr = array();
83 foreach ($identicalNodes as $i => $node)
84 {
85 $expr[] = $node->getAttribute('test');
86 if ($i > 0)
87 $node->parentNode->removeChild($node);
88 }
89 $identicalNodes[0]->setAttribute('test', \implode(' or ', $expr));
90 }
91 }
92 protected static function isXslWhen(DOMNode $node)
93 {
94 return ($node->namespaceURI === self::XMLNS_XSL && $node->localName === 'when');
95 }
96 }