Properly serialize CSS combinators according to position in selector · gorhill/uBlock@fbc7a0e (original) (raw)
`@@ -3364,7 +3364,7 @@ class ExtSelectorCompiler {
`
3364
3364
`` out.push(.${data.name});
``
3365
3365
`break;
`
3366
3366
`case 'Combinator':
`
3367
``
`` -
out.push(data.name === ' ' ? ' ' : ${data.name});
``
``
3367
`+
out.push(data.name);
`
3368
3368
`break;
`
3369
3369
`case 'Identifier':
`
3370
3370
`if ( this.reInvalidIdentifier.test(data.name) ) { return; }
`
`@@ -3436,14 +3436,35 @@ class ExtSelectorCompiler {
`
3436
3436
`return out.join('');
`
3437
3437
`}
`
3438
3438
``
``
3439
`+
astAppendPart(part, out) {
`
``
3440
`+
const { data } = part;
`
``
3441
`+
switch ( data.type ) {
`
``
3442
`+
case 'Combinator': {
`
``
3443
`+
const s = this.astSerializePart(part);
`
``
3444
`+
if ( s === undefined ) { return false; }
`
``
3445
`+
if ( out.length === 0 ) {
`
``
3446
`+
if ( s !== ' ' ) {
`
``
3447
`+
out.push(s, ' ');
`
``
3448
`+
}
`
``
3449
`+
} else {
`
``
3450
`+
out.push(' ');
`
``
3451
`+
if ( s !== ' ' ) {
`
``
3452
`+
out.push(s, ' ');
`
``
3453
`+
}
`
``
3454
`+
}
`
``
3455
`+
break;
`
``
3456
`+
}
`
``
3457
`+
}
`
``
3458
`+
return true;
`
``
3459
`+
}
`
``
3460
+
3439
3461
`astSerialize(parts, plainCSS = true) {
`
3440
3462
`const out = [];
`
3441
3463
`for ( const part of parts ) {
`
3442
3464
`const { data } = part;
`
3443
3465
`switch ( data.type ) {
`
3444
3466
`case 'AttributeSelector':
`
3445
3467
`case 'ClassSelector':
`
3446
``
`-
case 'Combinator':
`
3447
3468
`case 'Identifier':
`
3448
3469
`case 'IdSelector':
`
3449
3470
`case 'Nth':
`
`@@ -3455,6 +3476,9 @@ class ExtSelectorCompiler {
`
3455
3476
`out.push(s);
`
3456
3477
`break;
`
3457
3478
`}
`
``
3479
`+
case 'Combinator':
`
``
3480
`+
if ( this.astAppendPart(part, out) === false ) { return; }
`
``
3481
`+
break;
`
3458
3482
`case 'Raw':
`
3459
3483
`if ( plainCSS ) { return; }
`
3460
3484
`out.push(this.astSerializePart(part));
`
`@@ -3499,7 +3523,6 @@ class ExtSelectorCompiler {
`
3499
3523
`}
`
3500
3524
`case 'AttributeSelector':
`
3501
3525
`case 'ClassSelector':
`
3502
``
`-
case 'Combinator':
`
3503
3526
`case 'IdSelector':
`
3504
3527
`case 'PseudoClassSelector':
`
3505
3528
`case 'PseudoElementSelector':
`
`@@ -3509,6 +3532,10 @@ class ExtSelectorCompiler {
`
3509
3532
`prelude.push(component);
`
3510
3533
`break;
`
3511
3534
`}
`
``
3535
`+
case 'Combinator': {
`
``
3536
`+
if ( this.astAppendPart(part, prelude) === false ) { return; }
`
``
3537
`+
break;
`
``
3538
`+
}
`
3512
3539
`case 'ProceduralSelector': {
`
3513
3540
`if ( prelude.length !== 0 ) {
`
3514
3541
`let spath = prelude.join('');
`