Seditio Source
Root |
./othercms/phpBB3/vendor/s9e/text-formatter/src/Configurator/TemplateNormalizations/InlineXPathLiterals.php
<?php

/**
* @package   s9e\TextFormatter
* @copyright Copyright (c) 2010-2021 The s9e authors
* @license   http://www.opensource.org/licenses/mit-license.php The MIT License
*/
namespace s9e\TextFormatter\Configurator\TemplateNormalizations;

use
DOMAttr;
use
DOMElement;
use
s9e\TextFormatter\Configurator\Helpers\AVTHelper;

class
InlineXPathLiterals extends AbstractNormalization
{
   
/**
    * {@inheritdoc}
    */
   
protected $queries = [
       
'//xsl:value-of',
       
'//*[namespace-uri() != $XSL]/@*[contains(., "{")]'
   
];

   
/**
    * Return the textContent value of an XPath expression
    *
    * @param  string      $expr XPath expression
    * @return string|bool       Text value, or FALSE if not a literal
    */
   
protected function getTextContent($expr)
    {
       
$regexp = '(^(?|\'([^\']*)\'|"([^"]*)"|0*([0-9]+(?:\\.[0-9]+)?)|(false|true)\\s*\\(\\s*\\))$)';
        if (
preg_match($regexp, trim($expr), $m))
        {
            return
$m[1];
        }

        return
false;
    }

   
/**
    * {@inheritdoc}
    */
   
protected function normalizeAttribute(DOMAttr $attribute)
    {
       
AVTHelper::replace(
           
$attribute,
            function (
$token)
            {
                if (
$token[0] === 'expression')
                {
                   
$textContent = $this->getTextContent($token[1]);
                    if (
$textContent !== false)
                    {
                       
// Turn this token into a literal
                       
$token = ['literal', $textContent];
                    }
                }

                return
$token;
            }
        );
    }

   
/**
    * {@inheritdoc}
    */
   
protected function normalizeElement(DOMElement $element)
    {
       
$textContent = $this->getTextContent($element->getAttribute('select'));
        if (
$textContent !== false)
        {
           
$element->parentNode->replaceChild($this->createText($textContent), $element);
        }
    }
}