PluginProbe
WP-Optimize – Cache, Compress images, Minify & Clean database to boost page speed & performance / 3.2.3
WP-Optimize – Cache, Compress images, Minify & Clean database to boost page speed & performance v3.2.3
4.7.0 4.6.1 4.6.0 4.5.5 4.5.4 4.5.3 4.5.2 3.2.20 3.2.21 3.2.22 3.2.3 3.2.5 3.2.6 3.2.7 3.2.9 3.3.0 3.3.1 3.3.2 3.4.0 3.4.1 3.4.2 3.5.0 3.6.0 3.7.0 3.7.1 All 111 releases
wp-optimize / vendor / kriswallsmith / assetic / src / Assetic / Extension / Twig / AsseticTokenParser.php

AsseticTokenParser.php in WP-Optimize – Cache, Compress images, Minify & Clean database to boost page speed & performance 3.2.3, at vendor/kriswallsmith/assetic/src/Assetic/Extension/Twig/AsseticTokenParser.php

199 lines 8.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /*
4 * This file is part of the Assetic package, an OpenSky project.
5 *
6 * (c) 2010-2014 OpenSky Project Inc
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11
12 namespace Assetic\Extension\Twig;
13
14 use Assetic\Asset\AssetInterface;
15 use Assetic\Factory\AssetFactory;
16
17 class AsseticTokenParser extends \Twig_TokenParser
18 {
19 private $factory;
20 private $tag;
21 private $output;
22 private $single;
23 private $extensions;
24
25 /**
26 * Constructor.
27 *
28 * Attributes can be added to the tag by passing names as the options
29 * array. These values, if found, will be passed to the factory and node.
30 *
31 * @param AssetFactory $factory The asset factory
32 * @param string $tag The tag name
33 * @param string $output The default output string
34 * @param Boolean $single Whether to force a single asset
35 * @param array $extensions Additional attribute names to look for
36 */
37 public function __construct(AssetFactory $factory, $tag, $output, $single = false, array $extensions = array())
38 {
39 $this->factory = $factory;
40 $this->tag = $tag;
41 $this->output = $output;
42 $this->single = $single;
43 $this->extensions = $extensions;
44 }
45
46 public function parse(\Twig_Token $token)
47 {
48 $inputs = array();
49 $filters = array();
50 $name = null;
51 $attributes = array(
52 'output' => $this->output,
53 'var_name' => 'asset_url',
54 'vars' => array(),
55 );
56
57 $stream = $this->parser->getStream();
58 while (!$stream->test(\Twig_Token::BLOCK_END_TYPE)) {
59 if ($stream->test(\Twig_Token::STRING_TYPE)) {
60 // '@jquery', 'js/src/core/*', 'js/src/extra.js'
61 $inputs[] = $stream->next()->getValue();
62 } elseif ($stream->test(\Twig_Token::NAME_TYPE, 'filter')) {
63 // filter='yui_js'
64 $stream->next();
65 $stream->expect(\Twig_Token::OPERATOR_TYPE, '=');
66 $filters = array_merge($filters, array_filter(array_map('trim', explode(',', $stream->expect(\Twig_Token::STRING_TYPE)->getValue()))));
67 } elseif ($stream->test(\Twig_Token::NAME_TYPE, 'output')) {
68 // output='js/packed/*.js' OR output='js/core.js'
69 $stream->next();
70 $stream->expect(\Twig_Token::OPERATOR_TYPE, '=');
71 $attributes['output'] = $stream->expect(\Twig_Token::STRING_TYPE)->getValue();
72 } elseif ($stream->test(\Twig_Token::NAME_TYPE, 'name')) {
73 // name='core_js'
74 $stream->next();
75 $stream->expect(\Twig_Token::OPERATOR_TYPE, '=');
76 $name = $stream->expect(\Twig_Token::STRING_TYPE)->getValue();
77 } elseif ($stream->test(\Twig_Token::NAME_TYPE, 'as')) {
78 // as='the_url'
79 $stream->next();
80 $stream->expect(\Twig_Token::OPERATOR_TYPE, '=');
81 $attributes['var_name'] = $stream->expect(\Twig_Token::STRING_TYPE)->getValue();
82 } elseif ($stream->test(\Twig_Token::NAME_TYPE, 'debug')) {
83 // debug=true
84 $stream->next();
85 $stream->expect(\Twig_Token::OPERATOR_TYPE, '=');
86 $attributes['debug'] = 'true' == $stream->expect(\Twig_Token::NAME_TYPE, array('true', 'false'))->getValue();
87 } elseif ($stream->test(\Twig_Token::NAME_TYPE, 'combine')) {
88 // combine=true
89 $stream->next();
90 $stream->expect(\Twig_Token::OPERATOR_TYPE, '=');
91 $attributes['combine'] = 'true' == $stream->expect(\Twig_Token::NAME_TYPE, array('true', 'false'))->getValue();
92 } elseif ($stream->test(\Twig_Token::NAME_TYPE, 'vars')) {
93 // vars=['locale','browser']
94 $stream->next();
95 $stream->expect(\Twig_Token::OPERATOR_TYPE, '=');
96 $stream->expect(\Twig_Token::PUNCTUATION_TYPE, '[');
97
98 while ($stream->test(\Twig_Token::STRING_TYPE)) {
99 $attributes['vars'][] = $stream->expect(\Twig_Token::STRING_TYPE)->getValue();
100
101 if (!$stream->test(\Twig_Token::PUNCTUATION_TYPE, ',')) {
102 break;
103 }
104
105 $stream->next();
106 }
107
108 $stream->expect(\Twig_Token::PUNCTUATION_TYPE, ']');
109 } elseif ($stream->test(\Twig_Token::NAME_TYPE, $this->extensions)) {
110 // an arbitrary configured attribute
111 $key = $stream->next()->getValue();
112 $stream->expect(\Twig_Token::OPERATOR_TYPE, '=');
113 $attributes[$key] = $stream->expect(\Twig_Token::STRING_TYPE)->getValue();
114 } else {
115 $token = $stream->getCurrent();
116 throw new \Twig_Error_Syntax(sprintf('Unexpected token "%s" of value "%s"', \Twig_Token::typeToEnglish($token->getType()), $token->getValue()), $token->getLine(), $stream->getFilename());
117 }
118 }
119
120 $stream->expect(\Twig_Token::BLOCK_END_TYPE);
121
122 $body = $this->parser->subparse(array($this, 'testEndTag'), true);
123
124 $stream->expect(\Twig_Token::BLOCK_END_TYPE);
125
126 if ($this->single && 1 < count($inputs)) {
127 $inputs = array_slice($inputs, -1);
128 }
129
130 if (!$name) {
131 $name = $this->factory->generateAssetName($inputs, $filters, $attributes);
132 }
133
134 $asset = $this->factory->createAsset($inputs, $filters, $attributes + array('name' => $name));
135
136 return $this->createBodyNode($asset, $body, $inputs, $filters, $name, $attributes, $token->getLine(), $this->getTag());
137 }
138
139 public function getTag()
140 {
141 return $this->tag;
142 }
143
144 public function testEndTag(\Twig_Token $token)
145 {
146 return $token->test(array('end'.$this->getTag()));
147 }
148
149 /**
150 * @param AssetInterface $asset
151 * @param \Twig_Node $body
152 * @param array $inputs
153 * @param array $filters
154 * @param string $name
155 * @param array $attributes
156 * @param int $lineno
157 * @param string $tag
158 *
159 * @return \Twig_Node
160 */
161 protected function createBodyNode(AssetInterface $asset, \Twig_Node $body, array $inputs, array $filters, $name, array $attributes = array(), $lineno = 0, $tag = null)
162 {
163 $reflector = new \ReflectionMethod($this, 'createNode');
164
165 if (__CLASS__ !== $reflector->getDeclaringClass()->name) {
166 @trigger_error(sprintf('Overwriting %s::createNode is deprecated since 1.3. Overwrite %s instead.', __CLASS__, __METHOD__), E_USER_DEPRECATED);
167
168 return $this->createNode($asset, $body, $inputs, $filters, $name, $attributes, $lineno, $tag);
169 }
170
171 return new AsseticNode($asset, $body, $inputs, $filters, $name, $attributes, $lineno, $tag);
172 }
173
174 /**
175 * @param AssetInterface $asset
176 * @param \Twig_NodeInterface $body
177 * @param array $inputs
178 * @param array $filters
179 * @param string $name
180 * @param array $attributes
181 * @param int $lineno
182 * @param string $tag
183 *
184 * @return \Twig_Node
185 *
186 * @deprecated since 1.3.0, to be removed in 2.0. Use createBodyNode instead.
187 */
188 protected function createNode(AssetInterface $asset, \Twig_NodeInterface $body, array $inputs, array $filters, $name, array $attributes = array(), $lineno = 0, $tag = null)
189 {
190 @trigger_error(sprintf('The %s method is deprecated since 1.3 and will be removed in 2.0. Use createBodyNode instead.', __METHOD__), E_USER_DEPRECATED);
191
192 if (!$body instanceof \Twig_Node) {
193 throw new \InvalidArgumentException('The body must be a Twig_Node. Custom implementations of Twig_NodeInterface are not supported.');
194 }
195
196 return new AsseticNode($asset, $body, $inputs, $filters, $name, $attributes, $lineno, $tag);
197 }
198 }
199