comparison vendor/symfony/css-selector/Parser/Parser.php @ 17:129ea1e6d783

Update, including to Drupal core 8.6.10
author Chris Cannam
date Thu, 28 Feb 2019 13:21:36 +0000
parents 1fec387a4317
children
comparison
equal deleted inserted replaced
16:c2387f117808 17:129ea1e6d783
74 return (int) $string; 74 return (int) $string;
75 }; 75 };
76 76
77 switch (true) { 77 switch (true) {
78 case 'odd' === $joined: 78 case 'odd' === $joined:
79 return array(2, 1); 79 return [2, 1];
80 case 'even' === $joined: 80 case 'even' === $joined:
81 return array(2, 0); 81 return [2, 0];
82 case 'n' === $joined: 82 case 'n' === $joined:
83 return array(1, 0); 83 return [1, 0];
84 case false === strpos($joined, 'n'): 84 case false === strpos($joined, 'n'):
85 return array(0, $int($joined)); 85 return [0, $int($joined)];
86 } 86 }
87 87
88 $split = explode('n', $joined); 88 $split = explode('n', $joined);
89 $first = isset($split[0]) ? $split[0] : null; 89 $first = isset($split[0]) ? $split[0] : null;
90 90
91 return array( 91 return [
92 $first ? ('-' === $first || '+' === $first ? $int($first.'1') : $int($first)) : 1, 92 $first ? ('-' === $first || '+' === $first ? $int($first.'1') : $int($first)) : 1,
93 isset($split[1]) && $split[1] ? $int($split[1]) : 0, 93 isset($split[1]) && $split[1] ? $int($split[1]) : 0,
94 ); 94 ];
95 } 95 }
96 96
97 /** 97 /**
98 * Parses selector nodes. 98 * Parses selector nodes.
99 * 99 *
100 * @return array 100 * @return array
101 */ 101 */
102 private function parseSelectorList(TokenStream $stream) 102 private function parseSelectorList(TokenStream $stream)
103 { 103 {
104 $stream->skipWhitespace(); 104 $stream->skipWhitespace();
105 $selectors = array(); 105 $selectors = [];
106 106
107 while (true) { 107 while (true) {
108 $selectors[] = $this->parserSelectorNode($stream); 108 $selectors[] = $this->parserSelectorNode($stream);
109 109
110 if ($stream->getPeek()->isDelimiter(array(','))) { 110 if ($stream->getPeek()->isDelimiter([','])) {
111 $stream->getNext(); 111 $stream->getNext();
112 $stream->skipWhitespace(); 112 $stream->skipWhitespace();
113 } else { 113 } else {
114 break; 114 break;
115 } 115 }
131 131
132 while (true) { 132 while (true) {
133 $stream->skipWhitespace(); 133 $stream->skipWhitespace();
134 $peek = $stream->getPeek(); 134 $peek = $stream->getPeek();
135 135
136 if ($peek->isFileEnd() || $peek->isDelimiter(array(','))) { 136 if ($peek->isFileEnd() || $peek->isDelimiter([','])) {
137 break; 137 break;
138 } 138 }
139 139
140 if (null !== $pseudoElement) { 140 if (null !== $pseudoElement) {
141 throw SyntaxErrorException::pseudoElementFound($pseudoElement, 'not at the end of a selector'); 141 throw SyntaxErrorException::pseudoElementFound($pseudoElement, 'not at the end of a selector');
142 } 142 }
143 143
144 if ($peek->isDelimiter(array('+', '>', '~'))) { 144 if ($peek->isDelimiter(['+', '>', '~'])) {
145 $combinator = $stream->getNext()->getValue(); 145 $combinator = $stream->getNext()->getValue();
146 $stream->skipWhitespace(); 146 $stream->skipWhitespace();
147 } else { 147 } else {
148 $combinator = ' '; 148 $combinator = ' ';
149 } 149 }
167 */ 167 */
168 private function parseSimpleSelector(TokenStream $stream, $insideNegation = false) 168 private function parseSimpleSelector(TokenStream $stream, $insideNegation = false)
169 { 169 {
170 $stream->skipWhitespace(); 170 $stream->skipWhitespace();
171 171
172 $selectorStart = count($stream->getUsed()); 172 $selectorStart = \count($stream->getUsed());
173 $result = $this->parseElementNode($stream); 173 $result = $this->parseElementNode($stream);
174 $pseudoElement = null; 174 $pseudoElement = null;
175 175
176 while (true) { 176 while (true) {
177 $peek = $stream->getPeek(); 177 $peek = $stream->getPeek();
178 if ($peek->isWhitespace() 178 if ($peek->isWhitespace()
179 || $peek->isFileEnd() 179 || $peek->isFileEnd()
180 || $peek->isDelimiter(array(',', '+', '>', '~')) 180 || $peek->isDelimiter([',', '+', '>', '~'])
181 || ($insideNegation && $peek->isDelimiter(array(')'))) 181 || ($insideNegation && $peek->isDelimiter([')']))
182 ) { 182 ) {
183 break; 183 break;
184 } 184 }
185 185
186 if (null !== $pseudoElement) { 186 if (null !== $pseudoElement) {
187 throw SyntaxErrorException::pseudoElementFound($pseudoElement, 'not at the end of a selector'); 187 throw SyntaxErrorException::pseudoElementFound($pseudoElement, 'not at the end of a selector');
188 } 188 }
189 189
190 if ($peek->isHash()) { 190 if ($peek->isHash()) {
191 $result = new Node\HashNode($result, $stream->getNext()->getValue()); 191 $result = new Node\HashNode($result, $stream->getNext()->getValue());
192 } elseif ($peek->isDelimiter(array('.'))) { 192 } elseif ($peek->isDelimiter(['.'])) {
193 $stream->getNext(); 193 $stream->getNext();
194 $result = new Node\ClassNode($result, $stream->getNextIdentifier()); 194 $result = new Node\ClassNode($result, $stream->getNextIdentifier());
195 } elseif ($peek->isDelimiter(array('['))) { 195 } elseif ($peek->isDelimiter(['['])) {
196 $stream->getNext(); 196 $stream->getNext();
197 $result = $this->parseAttributeNode($result, $stream); 197 $result = $this->parseAttributeNode($result, $stream);
198 } elseif ($peek->isDelimiter(array(':'))) { 198 } elseif ($peek->isDelimiter([':'])) {
199 $stream->getNext(); 199 $stream->getNext();
200 200
201 if ($stream->getPeek()->isDelimiter(array(':'))) { 201 if ($stream->getPeek()->isDelimiter([':'])) {
202 $stream->getNext(); 202 $stream->getNext();
203 $pseudoElement = $stream->getNextIdentifier(); 203 $pseudoElement = $stream->getNextIdentifier();
204 204
205 continue; 205 continue;
206 } 206 }
207 207
208 $identifier = $stream->getNextIdentifier(); 208 $identifier = $stream->getNextIdentifier();
209 if (in_array(strtolower($identifier), array('first-line', 'first-letter', 'before', 'after'))) { 209 if (\in_array(strtolower($identifier), ['first-line', 'first-letter', 'before', 'after'])) {
210 // Special case: CSS 2.1 pseudo-elements can have a single ':'. 210 // Special case: CSS 2.1 pseudo-elements can have a single ':'.
211 // Any new pseudo-element must have two. 211 // Any new pseudo-element must have two.
212 $pseudoElement = $identifier; 212 $pseudoElement = $identifier;
213 213
214 continue; 214 continue;
215 } 215 }
216 216
217 if (!$stream->getPeek()->isDelimiter(array('('))) { 217 if (!$stream->getPeek()->isDelimiter(['('])) {
218 $result = new Node\PseudoNode($result, $identifier); 218 $result = new Node\PseudoNode($result, $identifier);
219 219
220 continue; 220 continue;
221 } 221 }
222 222
233 233
234 if (null !== $argumentPseudoElement) { 234 if (null !== $argumentPseudoElement) {
235 throw SyntaxErrorException::pseudoElementFound($argumentPseudoElement, 'inside ::not()'); 235 throw SyntaxErrorException::pseudoElementFound($argumentPseudoElement, 'inside ::not()');
236 } 236 }
237 237
238 if (!$next->isDelimiter(array(')'))) { 238 if (!$next->isDelimiter([')'])) {
239 throw SyntaxErrorException::unexpectedToken('")"', $next); 239 throw SyntaxErrorException::unexpectedToken('")"', $next);
240 } 240 }
241 241
242 $result = new Node\NegationNode($result, $argument); 242 $result = new Node\NegationNode($result, $argument);
243 } else { 243 } else {
244 $arguments = array(); 244 $arguments = [];
245 $next = null; 245 $next = null;
246 246
247 while (true) { 247 while (true) {
248 $stream->skipWhitespace(); 248 $stream->skipWhitespace();
249 $next = $stream->getNext(); 249 $next = $stream->getNext();
250 250
251 if ($next->isIdentifier() 251 if ($next->isIdentifier()
252 || $next->isString() 252 || $next->isString()
253 || $next->isNumber() 253 || $next->isNumber()
254 || $next->isDelimiter(array('+', '-')) 254 || $next->isDelimiter(['+', '-'])
255 ) { 255 ) {
256 $arguments[] = $next; 256 $arguments[] = $next;
257 } elseif ($next->isDelimiter(array(')'))) { 257 } elseif ($next->isDelimiter([')'])) {
258 break; 258 break;
259 } else { 259 } else {
260 throw SyntaxErrorException::unexpectedToken('an argument', $next); 260 throw SyntaxErrorException::unexpectedToken('an argument', $next);
261 } 261 }
262 } 262 }
270 } else { 270 } else {
271 throw SyntaxErrorException::unexpectedToken('selector', $peek); 271 throw SyntaxErrorException::unexpectedToken('selector', $peek);
272 } 272 }
273 } 273 }
274 274
275 if (count($stream->getUsed()) === $selectorStart) { 275 if (\count($stream->getUsed()) === $selectorStart) {
276 throw SyntaxErrorException::unexpectedToken('selector', $stream->getPeek()); 276 throw SyntaxErrorException::unexpectedToken('selector', $stream->getPeek());
277 } 277 }
278 278
279 return array($result, $pseudoElement); 279 return [$result, $pseudoElement];
280 } 280 }
281 281
282 /** 282 /**
283 * Parses next element node. 283 * Parses next element node.
284 * 284 *
286 */ 286 */
287 private function parseElementNode(TokenStream $stream) 287 private function parseElementNode(TokenStream $stream)
288 { 288 {
289 $peek = $stream->getPeek(); 289 $peek = $stream->getPeek();
290 290
291 if ($peek->isIdentifier() || $peek->isDelimiter(array('*'))) { 291 if ($peek->isIdentifier() || $peek->isDelimiter(['*'])) {
292 if ($peek->isIdentifier()) { 292 if ($peek->isIdentifier()) {
293 $namespace = $stream->getNext()->getValue(); 293 $namespace = $stream->getNext()->getValue();
294 } else { 294 } else {
295 $stream->getNext(); 295 $stream->getNext();
296 $namespace = null; 296 $namespace = null;
297 } 297 }
298 298
299 if ($stream->getPeek()->isDelimiter(array('|'))) { 299 if ($stream->getPeek()->isDelimiter(['|'])) {
300 $stream->getNext(); 300 $stream->getNext();
301 $element = $stream->getNextIdentifierOrStar(); 301 $element = $stream->getNextIdentifierOrStar();
302 } else { 302 } else {
303 $element = $namespace; 303 $element = $namespace;
304 $namespace = null; 304 $namespace = null;
320 private function parseAttributeNode(Node\NodeInterface $selector, TokenStream $stream) 320 private function parseAttributeNode(Node\NodeInterface $selector, TokenStream $stream)
321 { 321 {
322 $stream->skipWhitespace(); 322 $stream->skipWhitespace();
323 $attribute = $stream->getNextIdentifierOrStar(); 323 $attribute = $stream->getNextIdentifierOrStar();
324 324
325 if (null === $attribute && !$stream->getPeek()->isDelimiter(array('|'))) { 325 if (null === $attribute && !$stream->getPeek()->isDelimiter(['|'])) {
326 throw SyntaxErrorException::unexpectedToken('"|"', $stream->getPeek()); 326 throw SyntaxErrorException::unexpectedToken('"|"', $stream->getPeek());
327 } 327 }
328 328
329 if ($stream->getPeek()->isDelimiter(array('|'))) { 329 if ($stream->getPeek()->isDelimiter(['|'])) {
330 $stream->getNext(); 330 $stream->getNext();
331 331
332 if ($stream->getPeek()->isDelimiter(array('='))) { 332 if ($stream->getPeek()->isDelimiter(['='])) {
333 $namespace = null; 333 $namespace = null;
334 $stream->getNext(); 334 $stream->getNext();
335 $operator = '|='; 335 $operator = '|=';
336 } else { 336 } else {
337 $namespace = $attribute; 337 $namespace = $attribute;
344 344
345 if (null === $operator) { 345 if (null === $operator) {
346 $stream->skipWhitespace(); 346 $stream->skipWhitespace();
347 $next = $stream->getNext(); 347 $next = $stream->getNext();
348 348
349 if ($next->isDelimiter(array(']'))) { 349 if ($next->isDelimiter([']'])) {
350 return new Node\AttributeNode($selector, $namespace, $attribute, 'exists', null); 350 return new Node\AttributeNode($selector, $namespace, $attribute, 'exists', null);
351 } elseif ($next->isDelimiter(array('='))) { 351 } elseif ($next->isDelimiter(['='])) {
352 $operator = '='; 352 $operator = '=';
353 } elseif ($next->isDelimiter(array('^', '$', '*', '~', '|', '!')) 353 } elseif ($next->isDelimiter(['^', '$', '*', '~', '|', '!'])
354 && $stream->getPeek()->isDelimiter(array('=')) 354 && $stream->getPeek()->isDelimiter(['='])
355 ) { 355 ) {
356 $operator = $next->getValue().'='; 356 $operator = $next->getValue().'=';
357 $stream->getNext(); 357 $stream->getNext();
358 } else { 358 } else {
359 throw SyntaxErrorException::unexpectedToken('operator', $next); 359 throw SyntaxErrorException::unexpectedToken('operator', $next);
373 } 373 }
374 374
375 $stream->skipWhitespace(); 375 $stream->skipWhitespace();
376 $next = $stream->getNext(); 376 $next = $stream->getNext();
377 377
378 if (!$next->isDelimiter(array(']'))) { 378 if (!$next->isDelimiter([']'])) {
379 throw SyntaxErrorException::unexpectedToken('"]"', $next); 379 throw SyntaxErrorException::unexpectedToken('"]"', $next);
380 } 380 }
381 381
382 return new Node\AttributeNode($selector, $namespace, $attribute, $operator, $value->getValue()); 382 return new Node\AttributeNode($selector, $namespace, $attribute, $operator, $value->getValue());
383 } 383 }