public function AsseticTokenParser::parse

File

drupal/core/vendor/kriswallsmith/assetic/src/Assetic/Extension/Twig/AsseticTokenParser.php, line 46

Class

AsseticTokenParser

Namespace

Assetic\Extension\Twig

Code

public function parse(\Twig_Token $token) {
  $inputs = array();
  $filters = array();
  $name = null;
  $attributes = array(
    'output' => $this->output,
    'var_name' => 'asset_url',
    'vars' => array(),
  );
  $stream = $this->parser
    ->getStream();
  while (!$stream
    ->test(\Twig_Token::BLOCK_END_TYPE)) {
    if ($stream
      ->test(\Twig_Token::STRING_TYPE)) {

      // '@jquery', 'js/src/core/*', 'js/src/extra.js'
      $inputs[] = $stream
        ->next()
        ->getValue();
    }
    elseif ($stream
      ->test(\Twig_Token::NAME_TYPE, 'filter')) {

      // filter='yui_js'
      $stream
        ->next();
      $stream
        ->expect(\Twig_Token::OPERATOR_TYPE, '=');
      $filters = array_merge($filters, array_filter(array_map('trim', explode(',', $stream
        ->expect(\Twig_Token::STRING_TYPE)
        ->getValue()))));
    }
    elseif ($stream
      ->test(\Twig_Token::NAME_TYPE, 'output')) {

      // output='js/packed/*.js' OR output='js/core.js'
      $stream
        ->next();
      $stream
        ->expect(\Twig_Token::OPERATOR_TYPE, '=');
      $attributes['output'] = $stream
        ->expect(\Twig_Token::STRING_TYPE)
        ->getValue();
    }
    elseif ($stream
      ->test(\Twig_Token::NAME_TYPE, 'name')) {

      // name='core_js'
      $stream
        ->next();
      $stream
        ->expect(\Twig_Token::OPERATOR_TYPE, '=');
      $name = $stream
        ->expect(\Twig_Token::STRING_TYPE)
        ->getValue();
    }
    elseif ($stream
      ->test(\Twig_Token::NAME_TYPE, 'as')) {

      // as='the_url'
      $stream
        ->next();
      $stream
        ->expect(\Twig_Token::OPERATOR_TYPE, '=');
      $attributes['var_name'] = $stream
        ->expect(\Twig_Token::STRING_TYPE)
        ->getValue();
    }
    elseif ($stream
      ->test(\Twig_Token::NAME_TYPE, 'debug')) {

      // debug=true
      $stream
        ->next();
      $stream
        ->expect(\Twig_Token::OPERATOR_TYPE, '=');
      $attributes['debug'] = 'true' == $stream
        ->expect(\Twig_Token::NAME_TYPE, array(
        'true',
        'false',
      ))
        ->getValue();
    }
    elseif ($stream
      ->test(\Twig_Token::NAME_TYPE, 'combine')) {

      // combine=true
      $stream
        ->next();
      $stream
        ->expect(\Twig_Token::OPERATOR_TYPE, '=');
      $attributes['combine'] = 'true' == $stream
        ->expect(\Twig_Token::NAME_TYPE, array(
        'true',
        'false',
      ))
        ->getValue();
    }
    elseif ($stream
      ->test(\Twig_Token::NAME_TYPE, 'vars')) {

      // vars=['locale','browser']
      $stream
        ->next();
      $stream
        ->expect(\Twig_Token::OPERATOR_TYPE, '=');
      $stream
        ->expect(\Twig_Token::PUNCTUATION_TYPE, '[');
      while ($stream
        ->test(\Twig_Token::STRING_TYPE)) {
        $attributes['vars'][] = $stream
          ->expect(\Twig_Token::STRING_TYPE)
          ->getValue();
        if (!$stream
          ->test(\Twig_Token::PUNCTUATION_TYPE, ',')) {
          break;
        }
        $stream
          ->next();
      }
      $stream
        ->expect(\Twig_Token::PUNCTUATION_TYPE, ']');
    }
    elseif ($stream
      ->test(\Twig_Token::NAME_TYPE, $this->extensions)) {

      // an arbitrary configured attribute
      $key = $stream
        ->next()
        ->getValue();
      $stream
        ->expect(\Twig_Token::OPERATOR_TYPE, '=');
      $attributes[$key] = $stream
        ->expect(\Twig_Token::STRING_TYPE)
        ->getValue();
    }
    else {
      $token = $stream
        ->getCurrent();
      throw new \Twig_Error_Syntax(sprintf('Unexpected token "%s" of value "%s"', \Twig_Token::typeToEnglish($token
        ->getType(), $token
        ->getLine()), $token
        ->getValue()), $token
        ->getLine());
    }
  }
  $stream
    ->expect(\Twig_Token::BLOCK_END_TYPE);
  $body = $this->parser
    ->subparse(array(
    $this,
    'testEndTag',
  ), true);
  $stream
    ->expect(\Twig_Token::BLOCK_END_TYPE);
  if ($this->single && 1 < count($inputs)) {
    $inputs = array_slice($inputs, -1);
  }
  if (!$name) {
    $name = $this->factory
      ->generateAssetName($inputs, $filters, $attributes);
  }
  $asset = $this->factory
    ->createAsset($inputs, $filters, $attributes + array(
    'name' => $name,
  ));
  return $this
    ->createNode($asset, $body, $inputs, $filters, $name, $attributes, $token
    ->getLine(), $this
    ->getTag());
}