Mercurial > hg > isophonics-drupal-site
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 } |