2 namespace TYPO3\CMS\Fluid\Core\Parser\SyntaxTree;
28 protected static $comparators = array(
'==',
'!=',
'%',
'>=',
'>',
'<=',
'<');
37 ^ # Start with first input symbol
39 COMPARATORS # We allow all comparators
40 |\s* # Arbitary spaces
41 |-? # Numbers, possibly with the "minus" symbol in front.
43 (?: # and optionally a dot, followed by some more digits
47 |\'[^\'\\\\]* # single quoted string literals with possibly escaped single quotes
49 \\\\. # escaped character
50 [^\'\\\\]* # unrolled loop following Jeffrey E.F. Friedl
52 |"[^"\\\\]* # double quoted string literals with possibly escaped double quotes
54 \\\\. # escaped character
55 [^"\\\\]* # unrolled loop following Jeffrey E.F. Friedl
102 throw new \TYPO3\CMS\Fluid\Core\Parser\Exception(
'A boolean expression has more than tree parts.', 1244201848);
109 $this->leftSide = new \TYPO3\CMS\Fluid\Core\Parser\SyntaxTree\RootNode();
110 $this->rightSide = new \TYPO3\CMS\Fluid\Core\Parser\SyntaxTree\RootNode();
111 $this->comparator = null;
113 if ($childNode instanceof \TYPO3\CMS\
Fluid\Core\Parser\SyntaxTree\
TextNode && !preg_match(str_replace(
'COMPARATORS', implode(
'|', self::$comparators), self::$booleanExpressionTextNodeCheckerRegularExpression), $childNode->getText())) {
115 $this->comparator = null;
120 if ($this->comparator !== null) {
122 $this->rightSide->addChildNode($childNode);
126 $explodedString = explode($this->comparator, $childNode->getText());
127 if (isset($explodedString[0]) && trim($explodedString[0]) !==
'') {
128 $value = trim($explodedString[0]);
129 if (is_numeric($value)) {
130 $this->leftSide->addChildNode(
new \TYPO3\CMS\
Fluid\Core\Parser\SyntaxTree\
NumericNode($value));
132 $this->leftSide->addChildNode(
new \TYPO3\CMS\
Fluid\Core\Parser\SyntaxTree\
TextNode(preg_replace(
'/(^[\'"]|[\'"]$)/',
'', $value)));
135 if (isset($explodedString[1]) && trim($explodedString[1]) !==
'') {
136 $value = trim($explodedString[1]);
137 if (is_numeric($value)) {
138 $this->rightSide->addChildNode(
new \TYPO3\CMS\
Fluid\Core\Parser\SyntaxTree\
NumericNode($value));
140 $this->rightSide->addChildNode(
new \TYPO3\CMS\
Fluid\Core\Parser\SyntaxTree\
TextNode(preg_replace(
'/(^[\'"]|[\'"]$)/',
'', $value)));
145 $this->leftSide->addChildNode($childNode);
149 if ($this->comparator === null) {
195 public function evaluate(\TYPO3\CMS\
Fluid\Core\Rendering\RenderingContextInterface $renderingContext)
197 if ($this->comparator !== null) {
198 return self::evaluateComparator($this->comparator, $this->leftSide->evaluate($renderingContext), $this->rightSide->evaluate($renderingContext));
200 $value = $this->syntaxTreeNode->evaluate($renderingContext);
201 return self::convertToBoolean($value);
229 if (is_object($evaluatedLeftSide) || is_object($evaluatedRightSide)) {
230 return ($evaluatedLeftSide === $evaluatedRightSide);
232 return ($evaluatedLeftSide == $evaluatedRightSide);
235 if (is_object($evaluatedLeftSide) || is_object($evaluatedRightSide)) {
236 return ($evaluatedLeftSide !== $evaluatedRightSide);
238 return ($evaluatedLeftSide != $evaluatedRightSide);
241 if (!self::isComparable($evaluatedLeftSide, $evaluatedRightSide)) {
244 return (
bool)((int)$evaluatedLeftSide % (
int)$evaluatedRightSide);
246 if (!self::isComparable($evaluatedLeftSide, $evaluatedRightSide)) {
249 return $evaluatedLeftSide > $evaluatedRightSide;
251 if (!self::isComparable($evaluatedLeftSide, $evaluatedRightSide)) {
254 return $evaluatedLeftSide >= $evaluatedRightSide;
256 if (!self::isComparable($evaluatedLeftSide, $evaluatedRightSide)) {
259 return $evaluatedLeftSide < $evaluatedRightSide;
261 if (!self::isComparable($evaluatedLeftSide, $evaluatedRightSide)) {
264 return $evaluatedLeftSide <= $evaluatedRightSide;
266 throw new \TYPO3\CMS\Fluid\Core\Parser\Exception(
'Comparator "' .
$comparator .
'" is not implemented.', 1244234398);
280 protected static function isComparable($evaluatedLeftSide, $evaluatedRightSide)
282 if ((is_null($evaluatedLeftSide) || is_string($evaluatedLeftSide))
283 && is_string($evaluatedRightSide)) {
286 if (is_bool($evaluatedLeftSide) || is_null($evaluatedLeftSide)) {
289 if (is_object($evaluatedLeftSide) && is_object($evaluatedRightSide)) {
292 if ((is_string($evaluatedLeftSide) || is_resource($evaluatedLeftSide) || is_numeric($evaluatedLeftSide))
293 && (is_string($evaluatedRightSide) || is_resource($evaluatedRightSide) || is_numeric($evaluatedRightSide))) {
296 if (is_array($evaluatedLeftSide) && is_array($evaluatedRightSide)) {
311 if (strpos($string, $comparator) !==
false) {
328 if (is_bool($value)) {
332 if (is_integer($value) || is_float($value)) {
333 return !empty($value);
336 if (is_numeric($value)) {
337 return ($value != 0);
340 if (is_string($value)) {
341 return (!empty($value) && strtolower($value) !==
'false');
343 if (is_array($value) || (is_object($value) && $value instanceof \Countable)) {
344 return (
bool)count($value);
346 if (is_object($value)) {