@@ -264,7 +264,10 @@ export function createParser(
264
264
return result ;
265
265
}
266
266
267
- function parseIdentifier ( ) : string {
267
+ function parseIdentifier ( ) : string | null {
268
+ if ( ! isIdentStart ( chr ) ) {
269
+ return null ;
270
+ }
268
271
let result = '' ;
269
272
while ( pos < l ) {
270
273
if ( isIdent ( chr ) ) {
@@ -334,23 +337,28 @@ export function createParser(
334
337
if ( is ( '|' ) ) {
335
338
assert ( namespaceEnabled , 'Namespaces are not enabled.' ) ;
336
339
next ( ) ;
340
+ const name = parseIdentifier ( ) ;
341
+ assert ( name , 'Expected attribute name.' ) ;
337
342
attr = {
338
343
type : 'Attribute' ,
339
- name : parseIdentifier ( ) ,
344
+ name : name ,
340
345
namespace : { type : 'NoNamespace' }
341
346
} ;
342
347
} else if ( is ( '*' ) ) {
343
348
assert ( namespaceEnabled , 'Namespaces are not enabled.' ) ;
344
349
assert ( namespaceWildcardEnabled , 'Wildcard namespace is not enabled.' ) ;
345
350
next ( ) ;
346
351
pass ( '|' ) ;
352
+ const name = parseIdentifier ( ) ;
353
+ assert ( name , 'Expected attribute name.' ) ;
347
354
attr = {
348
355
type : 'Attribute' ,
349
- name : parseIdentifier ( ) ,
356
+ name,
350
357
namespace : { type : 'WildcardNamespace' }
351
358
} ;
352
359
} else {
353
360
const identifier = parseIdentifier ( ) ;
361
+ assert ( identifier , 'Expected attribute name.' ) ;
354
362
attr = {
355
363
type : 'Attribute' ,
356
364
name : identifier
@@ -360,9 +368,11 @@ export function createParser(
360
368
next ( ) ;
361
369
if ( isIdentStart ( chr ) ) {
362
370
assert ( namespaceEnabled , 'Namespaces are not enabled.' ) ;
371
+ const name = parseIdentifier ( ) ;
372
+ assert ( name , 'Expected attribute name.' ) ;
363
373
attr = {
364
374
type : 'Attribute' ,
365
- name : parseIdentifier ( ) ,
375
+ name,
366
376
namespace : { type : 'NamespaceName' , name : identifier }
367
377
} ;
368
378
} else {
@@ -389,25 +399,28 @@ export function createParser(
389
399
} ;
390
400
} else if ( substitutesEnabled && is ( '$' ) ) {
391
401
next ( ) ;
402
+ const name = parseIdentifier ( ) ;
403
+ assert ( name , 'Expected substitute name.' ) ;
392
404
attr . value = {
393
405
type : 'Substitution' ,
394
- name : parseIdentifier ( )
406
+ name
395
407
} ;
396
- assert ( attr . value . name , 'Expected substitute name.' ) ;
397
408
} else {
409
+ const value = parseIdentifier ( ) ;
410
+ assert ( value , 'Expected attribute value.' ) ;
398
411
attr . value = {
399
412
type : 'String' ,
400
- value : parseIdentifier ( )
413
+ value
401
414
} ;
402
- assert ( attr . value . value , 'Expected attribute value.' ) ;
403
415
}
404
416
skipWhitespace ( ) ;
405
417
if ( isEof ( ) && ! strict ) {
406
418
return attr ;
407
419
}
408
420
if ( ! is ( ']' ) ) {
409
- attr . caseSensitivityModifier = parseIdentifier ( ) ;
410
- assert ( attr . caseSensitivityModifier , 'Expected end of attribute selector.' ) ;
421
+ const caseSensitivityModifier = parseIdentifier ( ) ;
422
+ assert ( caseSensitivityModifier , 'Expected end of attribute selector.' ) ;
423
+ attr . caseSensitivityModifier = caseSensitivityModifier ;
411
424
assert (
412
425
attributesCaseSensitivityModifiersEnabled ,
413
426
'Attribute case sensitivity modifiers are not enabled.'
@@ -505,11 +518,12 @@ export function createParser(
505
518
skipWhitespace ( ) ;
506
519
if ( substitutesEnabled && is ( '$' ) ) {
507
520
next ( ) ;
521
+ const name = parseIdentifier ( ) ;
522
+ assert ( name , 'Expected substitute name.' ) ;
508
523
argument = {
509
524
type : 'Substitution' ,
510
- name : parseIdentifier ( )
525
+ name
511
526
} ;
512
- assert ( argument . name , 'Expected substitute name.' ) ;
513
527
} else if ( signature . type === 'String' ) {
514
528
argument = {
515
529
type : 'String' ,
@@ -560,9 +574,11 @@ export function createParser(
560
574
return { type : 'WildcardTag' } ;
561
575
} else if ( isIdentStart ( chr ) ) {
562
576
assert ( tagNameEnabled , 'Tag names are not enabled.' ) ;
577
+ const name = parseIdentifier ( ) ;
578
+ assert ( name , 'Expected tag name.' ) ;
563
579
return {
564
580
type : 'TagName' ,
565
- name : parseIdentifier ( )
581
+ name
566
582
} ;
567
583
} else {
568
584
return fail ( 'Expected tag name.' ) ;
@@ -595,6 +611,7 @@ export function createParser(
595
611
return tagName ;
596
612
} else if ( isIdentStart ( chr ) ) {
597
613
const identifier = parseIdentifier ( ) ;
614
+ assert ( identifier , 'Expected tag name.' ) ;
598
615
if ( ! is ( '|' ) ) {
599
616
assert ( tagNameEnabled , 'Tag names are not enabled.' ) ;
600
617
return {
@@ -677,6 +694,7 @@ export function createParser(
677
694
678
695
assert ( isDoubleColon || pseudoName , 'Expected pseudo-class name.' ) ;
679
696
assert ( ! isDoubleColon || pseudoName , 'Expected pseudo-element name.' ) ;
697
+ assert ( pseudoName , 'Expected pseudo-class name.' ) ;
680
698
assert (
681
699
! isDoubleColon ||
682
700
pseudoElementsAcceptUnknown ||
0 commit comments