Skip to content

Commit 935c39a

Browse files
committed
feat(core): ensure CSS parser tracks start/end values and understands complex pseudo selectors
1 parent e0c1c13 commit 935c39a

File tree

6 files changed

+744
-277
lines changed

6 files changed

+744
-277
lines changed

modules/@angular/compiler/src/css/lexer.ts

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
import {$$, $0, $9, $A, $AMPERSAND, $AT, $BACKSLASH, $BANG, $CARET, $COLON, $COMMA, $CR, $DQ, $EOF, $EQ, $FF, $GT, $HASH, $LBRACE, $LBRACKET, $LF, $LPAREN, $MINUS, $PERCENT, $PERIOD, $PIPE, $PLUS, $QUESTION, $RBRACE, $RBRACKET, $RPAREN, $SEMICOLON, $SLASH, $SQ, $STAR, $TILDA, $VTAB, $Z, $_, $a, $z, isWhitespace} from '@angular/compiler/src/chars';
1+
import {$$, $0, $9, $A, $AMPERSAND, $AT, $BACKSLASH, $BANG, $CARET, $COLON, $COMMA, $CR, $DQ, $EOF, $EQ, $FF, $GT, $HASH, $LBRACE, $LBRACKET, $LF, $LPAREN, $MINUS, $PERCENT, $PERIOD, $PIPE, $PLUS, $QUESTION, $RBRACE, $RBRACKET, $RPAREN, $SEMICOLON, $SLASH, $SQ, $STAR, $TILDA, $VTAB, $Z, $_, $a, $z, isWhitespace} from '../chars';
22

33
import {BaseException} from '../facade/exceptions';
4-
import {NumberWrapper, StringWrapper, isPresent, resolveEnumToken} from '../facade/lang';
4+
import {StringWrapper, isPresent, resolveEnumToken} from '../facade/lang';
55

6-
export {$AT, $COLON, $COMMA, $EOF, $LBRACE, $LBRACKET, $LPAREN, $RBRACE, $RBRACKET, $RPAREN, $SEMICOLON, isWhitespace} from '@angular/compiler/src/chars';
6+
export {$AT, $COLON, $COMMA, $EOF, $GT, $LBRACE, $LBRACKET, $LPAREN, $PLUS, $RBRACE, $RBRACKET, $RPAREN, $SEMICOLON, $SLASH, $SPACE, $TAB, $TILDA, isWhitespace} from '../chars';
77

88
export enum CssTokenType {
99
EOF,
@@ -23,6 +23,7 @@ export enum CssLexerMode {
2323
ALL_TRACK_WS,
2424
SELECTOR,
2525
PSEUDO_SELECTOR,
26+
PSEUDO_SELECTOR_WITH_ARGUMENTS,
2627
ATTRIBUTE_SELECTOR,
2728
AT_RULE_QUERY,
2829
MEDIA_QUERY,
@@ -94,6 +95,7 @@ export class CssScannerError extends BaseException {
9495
function _trackWhitespace(mode: CssLexerMode) {
9596
switch (mode) {
9697
case CssLexerMode.SELECTOR:
98+
case CssLexerMode.PSEUDO_SELECTOR:
9799
case CssLexerMode.ALL_TRACK_WS:
98100
case CssLexerMode.STYLE_VALUE:
99101
return true;
@@ -126,7 +128,7 @@ export class CssScanner {
126128

127129
setMode(mode: CssLexerMode) {
128130
if (this._currentMode != mode) {
129-
if (_trackWhitespace(this._currentMode)) {
131+
if (_trackWhitespace(this._currentMode) && !_trackWhitespace(mode)) {
130132
this.consumeWhitespace();
131133
}
132134
this._currentMode = mode;
@@ -178,21 +180,25 @@ export class CssScanner {
178180

179181
consume(type: CssTokenType, value: string = null): LexedCssResult {
180182
var mode = this._currentMode;
181-
this.setMode(CssLexerMode.ALL);
183+
184+
this.setMode(_trackWhitespace(mode) ? CssLexerMode.ALL_TRACK_WS : CssLexerMode.ALL);
182185

183186
var previousIndex = this.index;
184187
var previousLine = this.line;
185188
var previousColumn = this.column;
186189

190+
var next: CssToken;
187191
var output = this.scan();
192+
if (isPresent(output)) {
193+
// just incase the inner scan method returned an error
194+
if (isPresent(output.error)) {
195+
this.setMode(mode);
196+
return output;
197+
}
188198

189-
// just incase the inner scan method returned an error
190-
if (isPresent(output.error)) {
191-
this.setMode(mode);
192-
return output;
199+
next = output.token;
193200
}
194201

195-
var next = output.token;
196202
if (!isPresent(next)) {
197203
next = new CssToken(0, 0, 0, CssTokenType.EOF, 'end of file');
198204
}
@@ -563,6 +569,8 @@ function isValidSelectorCharacter(code: number): boolean {
563569
case $COLON:
564570
case $PIPE:
565571
case $COMMA:
572+
case $LBRACKET:
573+
case $RBRACKET:
566574
return true;
567575
default:
568576
return false;
@@ -658,7 +666,7 @@ function isValidCssCharacter(code: number, mode: CssLexerMode): boolean {
658666
case CssLexerMode.SELECTOR:
659667
return isValidSelectorCharacter(code);
660668

661-
case CssLexerMode.PSEUDO_SELECTOR:
669+
case CssLexerMode.PSEUDO_SELECTOR_WITH_ARGUMENTS:
662670
return isValidPseudoSelectorCharacter(code);
663671

664672
case CssLexerMode.ATTRIBUTE_SELECTOR:

0 commit comments

Comments
 (0)