[ Index ]

PHP Cross Reference of phpBB-3.2.11-deutsch

title

Body

[close]

/vendor/s9e/text-formatter/src/Configurator/Helpers/ -> TemplateModifier.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\Helpers;
   9  use DOMAttr;
  10  use DOMDocument;
  11  use DOMText;
  12  use DOMXPath;
  13  abstract class TemplateModifier
  14  {
  15      const XMLNS_XSL = 'http://www.w3.org/1999/XSL/Transform';
  16  	public static function replaceTokens($template, $regexp, $fn)
  17      {
  18          $dom   = TemplateLoader::load($template);
  19          $xpath = new DOMXPath($dom);
  20          foreach ($xpath->query('//@*') as $attribute)
  21              self::replaceTokensInAttribute($attribute, $regexp, $fn);
  22          foreach ($xpath->query('//text()') as $node)
  23              self::replaceTokensInText($node, $regexp, $fn);
  24          return TemplateLoader::save($dom);
  25      }
  26  	protected static function createReplacementNode(DOMDocument $dom, array $replacement)
  27      {
  28          if ($replacement[0] === 'expression')
  29          {
  30              $newNode = $dom->createElementNS(self::XMLNS_XSL, 'xsl:value-of');
  31              $newNode->setAttribute('select', $replacement[1]);
  32          }
  33          elseif ($replacement[0] === 'passthrough')
  34          {
  35              $newNode = $dom->createElementNS(self::XMLNS_XSL, 'xsl:apply-templates');
  36              if (isset($replacement[1]))
  37                  $newNode->setAttribute('select', $replacement[1]);
  38          }
  39          else
  40              $newNode = $dom->createTextNode($replacement[1]);
  41          return $newNode;
  42      }
  43  	protected static function replaceTokensInAttribute(DOMAttr $attribute, $regexp, $fn)
  44      {
  45          $attrValue = \preg_replace_callback(
  46              $regexp,
  47              function ($m) use ($fn, $attribute)
  48              {
  49                  $replacement = $fn($m, $attribute);
  50                  if ($replacement[0] === 'expression' || $replacement[0] === 'passthrough')
  51                  {
  52                      $replacement[] = '.';
  53                      return '{' . $replacement[1] . '}';
  54                  }
  55                  else
  56                      return $replacement[1];
  57              },
  58              $attribute->value
  59          );
  60          $attribute->value = \htmlspecialchars($attrValue, \ENT_COMPAT, 'UTF-8');
  61      }
  62  	protected static function replaceTokensInText(DOMText $node, $regexp, $fn)
  63      {
  64          $parentNode = $node->parentNode;
  65          $dom        = $node->ownerDocument;
  66          \preg_match_all($regexp, $node->textContent, $matches, \PREG_SET_ORDER | \PREG_OFFSET_CAPTURE);
  67          $lastPos = 0;
  68          foreach ($matches as $m)
  69          {
  70              $pos = $m[0][1];
  71              $text = \substr($node->textContent, $lastPos, $pos - $lastPos);
  72              $parentNode->insertBefore($dom->createTextNode($text), $node);
  73              $lastPos = $pos + \strlen($m[0][0]);
  74              $_m=[];foreach($m as $v)$_m[]=$v[0];$replacement = $fn($_m, $node);
  75              $newNode     = self::createReplacementNode($dom, $replacement);
  76              $parentNode->insertBefore($newNode, $node);
  77          }
  78          $text = \substr($node->textContent, $lastPos);
  79          $parentNode->insertBefore($dom->createTextNode($text), $node);
  80          $parentNode->removeChild($node);
  81      }
  82  }


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