ILIAS  release_5-2 Revision v5.2.25-18-g3f80b82851
AsseticTokenParser.php
Go to the documentation of this file.
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 
16 
18 {
19  private $factory;
20  private $tag;
21  private $output;
22  private $single;
23  private $extensions;
24 
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 
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 
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 }
createNode(AssetInterface $asset, \Twig_NodeInterface $body, array $inputs, array $filters, $name, array $attributes=array(), $lineno=0, $tag=null)
__construct(AssetFactory $factory, $tag, $output, $single=false, array $extensions=array())
Constructor.
createBodyNode(AssetInterface $asset, \Twig_Node $body, array $inputs, array $filters, $name, array $attributes=array(), $lineno=0, $tag=null)
An asset has a mutable URL and content and can be loaded and dumped.
Create styles array
The data for the language used.
The asset factory creates asset objects.