public function compile(Compiler $compiler, OperatorNode $node)
 {
     $left = $node->getChild(OperatorNode::OPERAND_LEFT);
     $compiler->add('(');
     if ($this->isPropertyAccessOperator($left)) {
         $root = $left;
         while ($this->isPropertyAccessOperator($root)) {
             $root = $root->getChild(OperatorNode::OPERAND_LEFT);
         }
         if ($root instanceof VariableNode) {
             $compiler->add('isset(')->compileNode($root)->add(') &&');
         }
         $left->addData('mode', 'has');
         $left->compile($compiler);
         $left->addData('mode', 'get');
         $compiler->add(') ? (')->compileNode($left)->add(')');
     } elseif ($left instanceof VariableNode) {
         $compiler->add('isset(')->compileNode($left)->add(')) ? (')->compileNode($left)->add(')');
     } elseif ($left instanceof ArrayIndexNode) {
         $variable = $left->getChild('identifier');
         $keys = [$left->getChild('key')];
         while ($variable instanceof ArrayIndexNode) {
             /** @var $right OperatorNode */
             $keys[] = $variable->getChild('key');
             $variable = $variable->getChild('identifier');
         }
         $arguments = [$variable, array_reverse($keys)];
         $compiler->add('isset(')->compileNode($variable)->add(') && $context->hasProperty')->compileArgumentList($arguments)->add(') ? (')->compileNode($left)->add(')');
     } else {
         $compiler->compileNode($left)->add(') ?');
     }
     $compiler->add(' : (')->compileNode($node->getChild(OperatorNode::OPERAND_RIGHT))->add(')');
 }
Beispiel #2
0
 public function compile(Compiler $compiler, OperatorNode $node)
 {
     //if(sign($left) != sign($right))
     $compiler->add('((')->compileNode($node->getChild(OperatorNode::OPERAND_LEFT))->add(' < 0 && ')->compileNode($node->getChild(OperatorNode::OPERAND_RIGHT))->add(' > 0) || (')->compileNode($node->getChild(OperatorNode::OPERAND_RIGHT))->add(' < 0 && ')->compileNode($node->getChild(OperatorNode::OPERAND_LEFT))->add(' > 0)');
     //then $right + $left % right
     $compiler->add(' ? (')->compileNode($node->getChild(OperatorNode::OPERAND_RIGHT))->add(' + ')->compileNode($node->getChild(OperatorNode::OPERAND_LEFT))->add(' % ')->compileNode($node->getChild(OperatorNode::OPERAND_RIGHT))->add(')');
     //else $left % $right
     $compiler->add(': (')->compileNode($node->getChild(OperatorNode::OPERAND_LEFT))->add(' % ')->compileNode($node->getChild(OperatorNode::OPERAND_RIGHT))->add('))');
 }
Beispiel #3
0
 public function compile(Compiler $compiler)
 {
     $name = $this->getData('name');
     if ($name === '_self') {
         $compiler->add('$this');
     } else {
         $compiler->add('$context->' . $name);
     }
 }
Beispiel #4
0
 public function compile(Compiler $compiler)
 {
     $compiler->add("<?php\n");
     /** @var $childNode ClassNode */
     $childNode = $this->getChild(0);
     if ($childNode->getNameSpace() !== '') {
         $compiler->indented("namespace %s;\n", $childNode->getNameSpace());
     }
     $compiler->indented('use Minty\\Environment;');
     $compiler->indented('use Minty\\Context;');
     $compiler->add("\n");
     parent::compile($compiler);
 }
Beispiel #5
0
 public function compile(Compiler $compiler)
 {
     $compiler->add('[');
     for ($i = 0; $i < $this->itemCount; ++$i) {
         if ($i !== 0) {
             $compiler->add(', ');
         }
         if ($this->hasChild('key_' . $i)) {
             $compiler->compileNode($this->getChild('key_' . $i));
             $compiler->add(' => ');
         }
         $compiler->compileNode($this->getChild('value_' . $i));
     }
     $compiler->add(']');
 }
Beispiel #6
0
 public function compile(Compiler $compiler, TemplateFunction $function, array $arguments)
 {
     if (count($arguments) !== 2) {
         throw new \InvalidArgumentException('Default function needs two arguments.');
     }
     $compiler->add('(isset(')->compileNode($arguments[0])->add(') ? ')->compileNode($arguments[0])->add(' : ')->compileNode($arguments[1])->add(')');
 }
Beispiel #7
0
 public function compile(Compiler $compiler, TagNode $node)
 {
     if ($node->hasChild('else')) {
         //extract data to be traversed
         $compiler->indented('$temp = ')->compileNode($node->getChild('source'))->add(';');
         //generate check and code for the 'else' branch
         $compiler->indented('if(empty($temp)) {')->indent()->compileNode($node->getChild('else'))->outdent()->indented('} else {')->indent();
         $source = new TempVariableNode('temp');
     } else {
         $source = $node->getChild('source');
     }
     $compiler->indented('foreach(')->compileNode($source)->add(' as ');
     if ($node->hasChild('loop_key')) {
         $compiler->compileNode($node->getChild('loop_key'))->add(' => ');
     }
     $variables = $node->getData('variables');
     if ($variables === 1) {
         $compiler->compileNode($node->getChild('loop_variable_0'))->add(') {')->indent();
     } else {
         $arguments = [];
         for ($i = 0; $i < $variables; ++$i) {
             $arguments[] = $node->getChild('loop_variable_' . $i);
         }
         $compiler->add('$loopVariable) {')->indent()->indented('list')->compileArgumentList($arguments)->add(' = $loopVariable;');
     }
     $compiler->compileNode($node->getChild('loop_body'))->outdent()->indented('}');
     if ($node->hasChild('else')) {
         //bracket opened after if-empty check
         $compiler->outdent()->indented('}');
     }
 }
Beispiel #8
0
 public function compile(Compiler $compiler, TagNode $node)
 {
     $first = true;
     $else = null;
     foreach ($node->getChildren() as $branch) {
         if ($first) {
             $compiler->indented('if(');
             $first = false;
         } elseif (!$branch->hasChild('condition')) {
             $else = $branch->getChild('body');
             continue;
         } else {
             $compiler->add(' elseif(');
         }
         $compiler->compileNode($branch->getChild('condition'))->add(') {')->indent()->compileNode($branch->getChild('body'))->outdent()->indented('}');
     }
     if ($else !== null) {
         $compiler->add(' else {')->indent()->compileNode($else)->outdent()->indented('}');
     }
 }
 public function compile(Compiler $compiler, OperatorNode $node)
 {
     $left = $node->getChild(OperatorNode::OPERAND_LEFT);
     $keys = [$node->getChild(OperatorNode::OPERAND_RIGHT)];
     while ($this->isPropertyAccessOperator($left)) {
         /** @var $left OperatorNode */
         $keys[] = $left->getChild(OperatorNode::OPERAND_RIGHT);
         $left = $left->getChild(OperatorNode::OPERAND_LEFT);
     }
     $arguments = [$left, array_reverse($keys)];
     if ($node->hasChild(OperatorNode::OPERAND_MIDDLE)) {
         $arguments[] = $node->getChild(OperatorNode::OPERAND_MIDDLE);
     }
     $compiler->add('$context->' . $this->getMethodName($node))->compileArgumentList($arguments);
 }
Beispiel #10
0
 public function compile(Compiler $compiler, OperatorNode $node)
 {
     $compiler->add('!');
     parent::compile($compiler, $node);
 }
Beispiel #11
0
 public function compile(Compiler $compiler, OperatorNode $node)
 {
     $compiler->add('(--')->compileNode($node->getChild(OperatorNode::OPERAND_RIGHT))->add(')');
 }
Beispiel #12
0
 public function compile(Compiler $compiler, OperatorNode $node)
 {
     $compiler->add('(')->compileNode($node->getChild(OperatorNode::OPERAND_LEFT))->add(' % 2 == 0)');
 }
 public function compile(Compiler $compiler, OperatorNode $node)
 {
     $compiler->add('range(')->compileNode($node->getChild(OperatorNode::OPERAND_LEFT))->add(', ')->compileNode($node->getChild(OperatorNode::OPERAND_RIGHT))->add(' - 1)');
 }
Beispiel #14
0
 public function compile(Compiler $compiler)
 {
     $compiler->add('$' . $this->getData('name'));
 }