Seditio Source
Root |
./othercms/phpBB3/vendor/s9e/text-formatter/src/Configurator/RendererGenerators/PHP/XPathConvertor/Convertors/Math.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\RendererGenerators\PHP\XPathConvertor\Convertors;

class
Math extends AbstractConvertor
{
   
/**
    * {@inheritdoc}
    */
   
public function getMatchers(): array
    {
       
$number = '((?&Attribute)|(?&BooleanFunction)|(?&BooleanSubExpr)|(?&MathSubExpr)|(?&Number)|(?&Parameter))';
       
$math   = '((?&Math)|' . substr($number, 1);

        return [
           
'Math:Addition'       => $number . ' \\+ ' . $math,
           
'Math:Division'       => $number . ' div ' . $math,
           
'Math:MathSubExpr'    => '\\( ((?&Math)) \\)',
           
'Math:Multiplication' => $number . ' \\* ' . $math,
           
'Math:Substraction'   => $number . ' - ' . $math
       
];
    }

   
/**
    * Convert an addition
    *
    * @param  string $expr1
    * @param  string $expr2
    * @return string
    */
   
public function parseAddition($expr1, $expr2)
    {
        return
$this->convertOperation($expr1, '+', $expr2);
    }

   
/**
    * Convert a division
    *
    * @param  string $expr1
    * @param  string $expr2
    * @return string
    */
   
public function parseDivision($expr1, $expr2)
    {
        return
$this->convertOperation($expr1, '/', $expr2);
    }

   
/**
    * Convert a math subexpression
    *
    * @param  string $expr
    * @return string
    */
   
public function parseMathSubExpr($expr)
    {
        return
'(' . $this->recurse($expr) . ')';
    }

   
/**
    * Convert a multiplication
    *
    * @param  string $expr1
    * @param  string $expr2
    * @return string
    */
   
public function parseMultiplication($expr1, $expr2)
    {
        return
$this->convertOperation($expr1, '*', $expr2);
    }

   
/**
    * Convert a substraction
    *
    * @param  string $expr1
    * @param  string $expr2
    * @return string
    */
   
public function parseSubstraction($expr1, $expr2)
    {
        return
$this->convertOperation($expr1, '-', $expr2);
    }

   
/**
    * Convert an operation
    *
    * @param  string $expr1
    * @param  string $operator
    * @param  string $expr2
    * @return string
    */
   
protected function convertOperation($expr1, $operator, $expr2)
    {
       
$expr1 = $this->recurse($expr1);
       
$expr2 = $this->recurse($expr2);

       
// Prevent two consecutive minus signs to be interpreted as a post-decrement operator
       
if ($operator === '-' && $expr2[0] === '-')
        {
           
$operator .= ' ';
        }

        return
$expr1 . $operator . $expr2;
    }
}