vendor/assetic/src/Assetic/Extension/Twig/AsseticTokenParser.php
author cavaliet
Mon, 07 Jul 2014 17:23:47 +0200
changeset 122 d672f7dd74dc
parent 0 7f95f8617b0b
permissions -rwxr-xr-x
Added tag V00.17 for changeset ada5f3d8b5b4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
<?php
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
/*
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
 * This file is part of the Assetic package, an OpenSky project.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
 *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
 * (c) 2010-2011 OpenSky Project Inc
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
 *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
 * For the full copyright and license information, please view the LICENSE
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
 * file that was distributed with this source code.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
 */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
namespace Assetic\Extension\Twig;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
use Assetic\Asset\AssetInterface;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
use Assetic\Factory\AssetFactory;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
class AsseticTokenParser extends \Twig_TokenParser
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
{
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
    private $factory;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
    private $tag;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
    private $output;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
    private $single;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
    private $extensions;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
     * Constructor.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
     * Attributes can be added to the tag by passing names as the options
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
     * array. These values, if found, will be passed to the factory and node.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
     * @param AssetFactory $factory    The asset factory
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
     * @param string       $tag        The tag name
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
     * @param string       $output     The default output string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
     * @param Boolean      $single     Whether to force a single asset
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
     * @param array        $extensions Additional attribute names to look for
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
    public function __construct(AssetFactory $factory, $tag, $output, $single = false, array $extensions = array())
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
        $this->factory    = $factory;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
        $this->tag        = $tag;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
        $this->output     = $output;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
        $this->single     = $single;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
        $this->extensions = $extensions;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
    public function parse(\Twig_Token $token)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
        $inputs = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
        $filters = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
        $name = null;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
        $attributes = array(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
            'output'   => $this->output,
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
            'var_name' => 'asset_url',
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
        );
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
        $stream = $this->parser->getStream();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
        while (!$stream->test(\Twig_Token::BLOCK_END_TYPE)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
            if ($stream->test(\Twig_Token::STRING_TYPE)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
                // '@jquery', 'js/src/core/*', 'js/src/extra.js'
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
                $inputs[] = $stream->next()->getValue();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
            } elseif ($stream->test(\Twig_Token::NAME_TYPE, 'filter')) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
                // filter='yui_js'
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
                $stream->next();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
                $stream->expect(\Twig_Token::OPERATOR_TYPE, '=');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
                $filters = array_merge($filters, array_filter(array_map('trim', explode(',', $stream->expect(\Twig_Token::STRING_TYPE)->getValue()))));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
            } elseif ($stream->test(\Twig_Token::NAME_TYPE, 'output')) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
                // output='js/packed/*.js' OR output='js/core.js'
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
                $stream->next();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
                $stream->expect(\Twig_Token::OPERATOR_TYPE, '=');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
                $attributes['output'] = $stream->expect(\Twig_Token::STRING_TYPE)->getValue();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
            } elseif ($stream->test(\Twig_Token::NAME_TYPE, 'name')) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
                // name='core_js'
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
                $stream->next();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
                $stream->expect(\Twig_Token::OPERATOR_TYPE, '=');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
                $name = $stream->expect(\Twig_Token::STRING_TYPE)->getValue();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
            } elseif ($stream->test(\Twig_Token::NAME_TYPE, 'as')) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
                // as='the_url'
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
                $stream->next();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
                $stream->expect(\Twig_Token::OPERATOR_TYPE, '=');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
                $attributes['var_name'] = $stream->expect(\Twig_Token::STRING_TYPE)->getValue();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
            } elseif ($stream->test(\Twig_Token::NAME_TYPE, 'debug')) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
                // debug=true
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
                $stream->next();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
                $stream->expect(\Twig_Token::OPERATOR_TYPE, '=');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
                $attributes['debug'] = 'true' == $stream->expect(\Twig_Token::NAME_TYPE, array('true', 'false'))->getValue();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
            } elseif ($stream->test(\Twig_Token::NAME_TYPE, 'combine')) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
                // combine=true
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
                $stream->next();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
                $stream->expect(\Twig_Token::OPERATOR_TYPE, '=');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
                $attributes['combine'] = 'true' == $stream->expect(\Twig_Token::NAME_TYPE, array('true', 'false'))->getValue();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
            } elseif ($stream->test(\Twig_Token::NAME_TYPE, $this->extensions)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
                // an arbitrary configured attribute
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
                $key = $stream->next()->getValue();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
                $stream->expect(\Twig_Token::OPERATOR_TYPE, '=');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
                $attributes[$key] = $stream->expect(\Twig_Token::STRING_TYPE)->getValue();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
            } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
                $token = $stream->getCurrent();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
                throw new \Twig_Error_Syntax(sprintf('Unexpected token "%s" of value "%s"', \Twig_Token::typeToEnglish($token->getType(), $token->getLine()), $token->getValue()), $token->getLine());
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
        $stream->expect(\Twig_Token::BLOCK_END_TYPE);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
        $endtag = 'end'.$this->getTag();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
        $test = function(\Twig_Token $token) use($endtag) { return $token->test($endtag); };
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
        $body = $this->parser->subparse($test, true);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
        $stream->expect(\Twig_Token::BLOCK_END_TYPE);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
        if ($this->single && 1 < count($inputs)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
            $inputs = array_slice($inputs, -1);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
        if (!$name) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
            $name = $this->factory->generateAssetName($inputs, $filters, $attributes);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
        $asset = $this->factory->createAsset($inputs, $filters, $attributes + array('name' => $name));
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
        return $this->createNode($asset, $body, $inputs, $filters, $name, $attributes, $token->getLine(), $this->getTag());
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
    public function getTag()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
        return $this->tag;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
    protected function createNode(AssetInterface $asset, \Twig_NodeInterface $body, array $inputs, array $filters, $name, array $attributes = array(), $lineno = 0, $tag = null)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
        return new AsseticNode($asset, $body, $inputs, $filters, $name, $attributes, $lineno, $tag);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
}