You are here

protected function TwigNodeTrans::compileString in Drupal 8

Same name and namespace in other branches
  1. 9 core/lib/Drupal/Core/Template/TwigNodeTrans.php \Drupal\Core\Template\TwigNodeTrans::compileString()
  2. 10 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:

  • string $text The extracted text.
  • array $tokens The extracted tokens as new \Twig_Node_Expression_Name instances.
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

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 [
      $body,
      [],
    ];
  }
  $tokens = [];
  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');
        }
        if ($n instanceof CheckToStringNode) {
          $n = $n
            ->getNode('expr');
        }
        $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 CheckToStringNode) {
          $args = $args
            ->getNode('expr');
        }
        if ($args instanceof \Twig_Node_Expression_GetAttr) {
          $argName = [];

          // 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
            ->getTemplateLine());
        }
        $placeholder = sprintf('%s%s', $argPrefix, $argName);
        $text .= $placeholder;
        $expr
          ->setAttribute('placeholder', $placeholder);
        $tokens[] = $expr;
      }
      else {
        $text .= $node
          ->getAttribute('data');
      }
    }
  }
  elseif (!$body
    ->hasAttribute('data')) {
    throw new \Twig_Error_Syntax('{% trans %} tag cannot be empty');
  }
  else {
    $text = $body
      ->getAttribute('data');
  }
  return [
    new \Twig_Node([
      new \Twig_Node_Expression_Constant(trim($text), $body
        ->getTemplateLine()),
    ]),
    $tokens,
  ];
}