You are here

public function Twig_Node_Macro::compile in Zircon Profile 8

Same name and namespace in other branches
  1. 8.0 vendor/twig/twig/lib/Twig/Node/Macro.php \Twig_Node_Macro::compile()

Compiles the node to PHP.

Parameters

Twig_Compiler $compiler A Twig_Compiler instance:

Overrides Twig_Node::compile

File

vendor/twig/twig/lib/Twig/Node/Macro.php, line 32

Class

Twig_Node_Macro
Represents a macro node.

Code

public function compile(Twig_Compiler $compiler) {
  $compiler
    ->addDebugInfo($this)
    ->write(sprintf('public function get%s(', $this
    ->getAttribute('name')));
  $count = count($this
    ->getNode('arguments'));
  $pos = 0;
  foreach ($this
    ->getNode('arguments') as $name => $default) {
    $compiler
      ->raw('$__' . $name . '__ = ')
      ->subcompile($default);
    if (++$pos < $count) {
      $compiler
        ->raw(', ');
    }
  }
  if (PHP_VERSION_ID >= 50600) {
    if ($count) {
      $compiler
        ->raw(', ');
    }
    $compiler
      ->raw('...$__varargs__');
  }
  $compiler
    ->raw(")\n")
    ->write("{\n")
    ->indent();
  $compiler
    ->write("\$context = \$this->env->mergeGlobals(array(\n")
    ->indent();
  foreach ($this
    ->getNode('arguments') as $name => $default) {
    $compiler
      ->addIndentation()
      ->string($name)
      ->raw(' => $__' . $name . '__')
      ->raw(",\n");
  }
  $compiler
    ->addIndentation()
    ->string(self::VARARGS_NAME)
    ->raw(' => ');
  if (PHP_VERSION_ID >= 50600) {
    $compiler
      ->raw("\$__varargs__,\n");
  }
  else {
    $compiler
      ->raw('func_num_args() > ')
      ->repr($count)
      ->raw(' ? array_slice(func_get_args(), ')
      ->repr($count)
      ->raw(") : array(),\n");
  }
  $compiler
    ->outdent()
    ->write("));\n\n")
    ->write("\$blocks = array();\n\n")
    ->write("ob_start();\n")
    ->write("try {\n")
    ->indent()
    ->subcompile($this
    ->getNode('body'))
    ->outdent()
    ->write("} catch (Exception \$e) {\n")
    ->indent()
    ->write("ob_end_clean();\n\n")
    ->write("throw \$e;\n")
    ->outdent()
    ->write("}\n\n")
    ->write("return ('' === \$tmp = ob_get_clean()) ? '' : new Twig_Markup(\$tmp, \$this->env->getCharset());\n")
    ->outdent()
    ->write("}\n\n");
}