You are here

protected function TwigNodeTrans::compileString in Zircon Profile 8

Same name and namespace in other branches
  1. 8.0 core/lib/Drupal/Core/Template/TwigNodeTrans.php \Drupal\Core\Template\TwigNodeTrans::compileString()

Extracts the text and tokens for the "trans" tag.

Parameters

\Twig_Node $body: The node to compile.

Return value

array Returns an array containing the two following parameters:

1 call to TwigNodeTrans::compileString()
TwigNodeTrans::compile in core/lib/Drupal/Core/Template/TwigNodeTrans.php

File

core/lib/Drupal/Core/Template/TwigNodeTrans.php, line 101
Contains \Drupal\Core\Template\TwigNodeTrans.

Class

TwigNodeTrans
A class that defines the Twig 'trans' tag for Drupal.

Namespace

Drupal\Core\Template

Code

protected function compileString(\Twig_Node $body) {
  if ($body instanceof \Twig_Node_Expression_Name || $body instanceof \Twig_Node_Expression_Constant || $body instanceof \Twig_Node_Expression_TempName) {
    return array(
      $body,
      array(),
    );
  }
  $tokens = array();
  if (count($body)) {
    $text = '';
    foreach ($body as $node) {
      if (get_class($node) === 'Twig_Node' && $node
        ->getNode(0) instanceof \Twig_Node_SetTemp) {
        $node = $node
          ->getNode(1);
      }
      if ($node instanceof \Twig_Node_Print) {
        $n = $node
          ->getNode('expr');
        while ($n instanceof \Twig_Node_Expression_Filter) {
          $n = $n
            ->getNode('node');
        }
        $args = $n;

        // Support TwigExtension->renderVar() function in chain.
        if ($args instanceof \Twig_Node_Expression_Function) {
          $args = $n
            ->getNode('arguments')
            ->getNode(0);
        }

        // Detect if a token implements one of the filters reserved for
        // modifying the prefix of a token. The default prefix used for
        // translations is "@". This escapes the printed token and makes them
        // safe for templates.
        // @see TwigExtension::getFilters()
        $argPrefix = '@';
        while ($args instanceof \Twig_Node_Expression_Filter) {
          switch ($args
            ->getNode('filter')
            ->getAttribute('value')) {
            case 'placeholder':
              $argPrefix = '%';
              break;
          }
          $args = $args
            ->getNode('node');
        }
        if ($args instanceof \Twig_Node_Expression_GetAttr) {
          $argName = array();

          // Reuse the incoming expression.
          $expr = $args;

          // Assemble a valid argument name by walking through the expression.
          $argName[] = $args
            ->getNode('attribute')
            ->getAttribute('value');
          while ($args
            ->hasNode('node')) {
            $args = $args
              ->getNode('node');
            if ($args instanceof \Twig_Node_Expression_Name) {
              $argName[] = $args
                ->getAttribute('name');
            }
            else {
              $argName[] = $args
                ->getNode('attribute')
                ->getAttribute('value');
            }
          }
          $argName = array_reverse($argName);
          $argName = implode('.', $argName);
        }
        else {
          $argName = $n
            ->getAttribute('name');
          if (!is_null($args)) {
            $argName = $args
              ->getAttribute('name');
          }
          $expr = new \Twig_Node_Expression_Name($argName, $n
            ->getLine());
        }
        $placeholder = sprintf('%s%s', $argPrefix, $argName);
        $text .= $placeholder;
        $expr
          ->setAttribute('placeholder', $placeholder);
        $tokens[] = $expr;
      }
      else {
        $text .= $node
          ->getAttribute('data');
      }
    }
  }
  else {
    $text = $body
      ->getAttribute('data');
  }
  return array(
    new \Twig_Node(array(
      new \Twig_Node_Expression_Constant(trim($text), $body
        ->getLine()),
    )),
    $tokens,
  );
}