[ Index ]

PHP Cross Reference of phpBB-3.2.11-deutsch

title

Body

[close]

/vendor/s9e/text-formatter/src/Configurator/TemplateNormalizations/ -> MergeIdenticalConditionalBranches.php (source)

   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  }


Generated: Wed Nov 11 20:33:01 2020 Cross-referenced by PHPXref 0.7.1