|
|
@@ -97,133 +97,137 @@ this.parseCss = this.parseCss || (() => {
|
|
|
if (whitespace(code)) {
|
|
|
while (whitespace(next())) code = consume();
|
|
|
return new Token(WHITESPACE_TOKEN_TYPE);
|
|
|
- }
|
|
|
- else if (code == 0x22) return consumeAStringToken(consume, next, eof, reconsume, parseerror, donothing, code);
|
|
|
- else if (code == 0x23) {
|
|
|
- if (namechar(next()) || areAValidEscape(next(1), next(2))) {
|
|
|
- const token = new Token(HASH_TOKEN_TYPE);
|
|
|
- if (wouldStartAnIdentifier(next(1), next(2), next(3))) token.type = "id";
|
|
|
- token.value = consumeAName(consume, next, eof, reconsume);
|
|
|
- return token;
|
|
|
- } else {
|
|
|
- return new Token(DELIM_TOKEN_TYPE, stringFromCode(code));
|
|
|
- }
|
|
|
- }
|
|
|
- else if (code == 0x24) {
|
|
|
- if (next() == 0x3d) {
|
|
|
- code = consume();
|
|
|
- return new Token(SUFFIX_MATCH_TOKEN_TYPE);
|
|
|
- } else {
|
|
|
- return new Token(DELIM_TOKEN_TYPE, stringFromCode(code));
|
|
|
- }
|
|
|
- }
|
|
|
- else if (code == 0x27) return consumeAStringToken(consume, next, eof, reconsume, parseerror, donothing, code);
|
|
|
- else if (code == 0x28) return new Token(OPEN_PAREN_TOKEN_TYPE);
|
|
|
- else if (code == 0x29) return new Token(CLOSE_PAREN_TOKEN_TYPE);
|
|
|
- else if (code == 0x2a) {
|
|
|
- if (next() == 0x3d) {
|
|
|
- code = consume();
|
|
|
- return new Token(SUBSTRING_MATCH_TOKEN_TYPE);
|
|
|
- } else {
|
|
|
- return new Token(DELIM_TOKEN_TYPE, stringFromCode(code));
|
|
|
- }
|
|
|
- }
|
|
|
- else if (code == 0x2b) {
|
|
|
- if (startsWithANumber(next, code)) {
|
|
|
- reconsume();
|
|
|
- return consumeANumericToken(consume, next, eof, reconsume);
|
|
|
- } else {
|
|
|
- return new Token(DELIM_TOKEN_TYPE, stringFromCode(code));
|
|
|
- }
|
|
|
- }
|
|
|
- else if (code == 0x2c) return new Token(COMMA_TOKEN_TYPE);
|
|
|
- else if (code == 0x2d) {
|
|
|
- if (startsWithANumber(next, code)) {
|
|
|
- reconsume();
|
|
|
- return consumeANumericToken(consume, next, eof, reconsume);
|
|
|
- } else if (next(1) == 0x2d && next(2) == 0x3e) {
|
|
|
- consume(2);
|
|
|
- return new Token(CDC_TOKEN_TYPE);
|
|
|
- } else if (wouldStartAnIdentifier(code, next(1), next(2))) {
|
|
|
- reconsume();
|
|
|
- return consumeAnIdentlikeToken(consume, next, eof, reconsume, parseerror, donothing);
|
|
|
- } else {
|
|
|
- return new Token(DELIM_TOKEN_TYPE, stringFromCode(code));
|
|
|
- }
|
|
|
- }
|
|
|
- else if (code == 0x2e) {
|
|
|
- if (startsWithANumber(next, code)) {
|
|
|
- reconsume();
|
|
|
- return consumeANumericToken(consume, next, eof, reconsume);
|
|
|
- } else {
|
|
|
- return new Token(DELIM_TOKEN_TYPE, stringFromCode(code));
|
|
|
- }
|
|
|
- }
|
|
|
- else if (code == 0x3a) return new Token(COLON_TOKEN_TYPE);
|
|
|
- else if (code == 0x3b) return new Token(SEMICOLON_TOKEN_TYPE);
|
|
|
- else if (code == 0x3c) {
|
|
|
- if (next(1) == 0x21 && next(2) == 0x2d && next(3) == 0x2d) {
|
|
|
- consume(3);
|
|
|
- return new Token(CDO_TOKEN_TYPE);
|
|
|
- } else {
|
|
|
- return new Token(DELIM_TOKEN_TYPE, stringFromCode(code));
|
|
|
- }
|
|
|
- }
|
|
|
- else if (code == 0x40) {
|
|
|
- return new Token(DELIM_TOKEN_TYPE, stringFromCode(code));
|
|
|
- }
|
|
|
- else if (code == 0x5b) new Token(OPEN_SQUARE_TOKEN_TYPE);
|
|
|
- else if (code == 0x5c) {
|
|
|
- if (startsWithAValidEscape(next, code)) {
|
|
|
- reconsume();
|
|
|
- return consumeAnIdentlikeToken(consume, next, eof, reconsume, parseerror, donothing);
|
|
|
- } else {
|
|
|
- parseerror();
|
|
|
- return new Token(DELIM_TOKEN_TYPE, stringFromCode(code));
|
|
|
- }
|
|
|
- }
|
|
|
- else if (code == 0x5d) new Token(CLOSE_SQUARE_TOKEN_TYPE);
|
|
|
- else if (code == 0x5e) {
|
|
|
- if (next() == 0x3d) {
|
|
|
- code = consume();
|
|
|
- return new Token(PREFIX_MATCH_TOKEN_TYPE);
|
|
|
- } else {
|
|
|
- return new Token(DELIM_TOKEN_TYPE, stringFromCode(code));
|
|
|
- }
|
|
|
- }
|
|
|
- else if (code == 0x7b) return new Token(OPEN_CURLY_TOKEN_TYPE);
|
|
|
- else if (code == 0x7c) {
|
|
|
- if (next() == 0x3d) {
|
|
|
- code = consume();
|
|
|
- return new Token(DASH_MATCH_TOKEN_TYPE);
|
|
|
- } else if (next() == 0x7c) {
|
|
|
- code = consume();
|
|
|
- return new Token(COLUMN_TOKEN_TYPE);
|
|
|
- } else {
|
|
|
- return new Token(DELIM_TOKEN_TYPE, stringFromCode(code));
|
|
|
- }
|
|
|
- }
|
|
|
- else if (code == 0x7d) return new Token(CLOSE_CURLY_TOKEN_TYPE);
|
|
|
- else if (code == 0x7e) {
|
|
|
- if (next() == 0x3d) {
|
|
|
- code = consume();
|
|
|
- return new Token(INCLUDE_MATCH_TOKEN_TYPE);
|
|
|
- } else {
|
|
|
- return new Token(DELIM_TOKEN_TYPE, stringFromCode(code));
|
|
|
+ } else {
|
|
|
+ switch (code) {
|
|
|
+ case 0x22:
|
|
|
+ return consumeAStringToken(consume, next, eof, reconsume, parseerror, donothing, code);
|
|
|
+ case 0x23:
|
|
|
+ if (namechar(next()) || areAValidEscape(next(1), next(2))) {
|
|
|
+ const token = new Token(HASH_TOKEN_TYPE);
|
|
|
+ if (wouldStartAnIdentifier(next(1), next(2), next(3))) token.type = "id";
|
|
|
+ token.value = consumeAName(consume, next, eof, reconsume);
|
|
|
+ return token;
|
|
|
+ } else {
|
|
|
+ return new Token(DELIM_TOKEN_TYPE, stringFromCode(code));
|
|
|
+ }
|
|
|
+ case 0x24:
|
|
|
+ if (next() == 0x3d) {
|
|
|
+ code = consume();
|
|
|
+ return new Token(SUFFIX_MATCH_TOKEN_TYPE);
|
|
|
+ } else {
|
|
|
+ return new Token(DELIM_TOKEN_TYPE, stringFromCode(code));
|
|
|
+ }
|
|
|
+ case 0x27:
|
|
|
+ return consumeAStringToken(consume, next, eof, reconsume, parseerror, donothing, code);
|
|
|
+ case 0x28:
|
|
|
+ return new Token(OPEN_PAREN_TOKEN_TYPE);
|
|
|
+ case 0x29:
|
|
|
+ return new Token(CLOSE_PAREN_TOKEN_TYPE);
|
|
|
+ case 0x2a:
|
|
|
+ if (next() == 0x3d) {
|
|
|
+ code = consume();
|
|
|
+ return new Token(SUBSTRING_MATCH_TOKEN_TYPE);
|
|
|
+ } else {
|
|
|
+ return new Token(DELIM_TOKEN_TYPE, stringFromCode(code));
|
|
|
+ }
|
|
|
+ case 0x2b:
|
|
|
+ if (startsWithANumber(next, code)) {
|
|
|
+ reconsume();
|
|
|
+ return consumeANumericToken(consume, next, eof, reconsume);
|
|
|
+ } else {
|
|
|
+ return new Token(DELIM_TOKEN_TYPE, stringFromCode(code));
|
|
|
+ }
|
|
|
+ case 0x2c:
|
|
|
+ return new Token(COMMA_TOKEN_TYPE);
|
|
|
+ case 0x2d:
|
|
|
+ if (startsWithANumber(next, code)) {
|
|
|
+ reconsume();
|
|
|
+ return consumeANumericToken(consume, next, eof, reconsume);
|
|
|
+ } else if (next(1) == 0x2d && next(2) == 0x3e) {
|
|
|
+ consume(2);
|
|
|
+ return new Token(CDC_TOKEN_TYPE);
|
|
|
+ } else if (wouldStartAnIdentifier(code, next(1), next(2))) {
|
|
|
+ reconsume();
|
|
|
+ return consumeAnIdentlikeToken(consume, next, eof, reconsume, parseerror, donothing);
|
|
|
+ } else {
|
|
|
+ return new Token(DELIM_TOKEN_TYPE, stringFromCode(code));
|
|
|
+ }
|
|
|
+ case 0x2e:
|
|
|
+ if (startsWithANumber(next, code)) {
|
|
|
+ reconsume();
|
|
|
+ return consumeANumericToken(consume, next, eof, reconsume);
|
|
|
+ } else {
|
|
|
+ return new Token(DELIM_TOKEN_TYPE, stringFromCode(code));
|
|
|
+ }
|
|
|
+ case 0x3a:
|
|
|
+ return new Token(COLON_TOKEN_TYPE);
|
|
|
+ case 0x3b:
|
|
|
+ return new Token(SEMICOLON_TOKEN_TYPE);
|
|
|
+ case 0x3c:
|
|
|
+ if (next(1) == 0x21 && next(2) == 0x2d && next(3) == 0x2d) {
|
|
|
+ consume(3);
|
|
|
+ return new Token(CDO_TOKEN_TYPE);
|
|
|
+ } else {
|
|
|
+ return new Token(DELIM_TOKEN_TYPE, stringFromCode(code));
|
|
|
+ }
|
|
|
+ case 0x40:
|
|
|
+ return new Token(DELIM_TOKEN_TYPE, stringFromCode(code));
|
|
|
+ case 0x5b:
|
|
|
+ return new Token(OPEN_SQUARE_TOKEN_TYPE);
|
|
|
+ case 0x5c:
|
|
|
+ if (startsWithAValidEscape(next, code)) {
|
|
|
+ reconsume();
|
|
|
+ return consumeAnIdentlikeToken(consume, next, eof, reconsume, parseerror, donothing);
|
|
|
+ } else {
|
|
|
+ parseerror();
|
|
|
+ return new Token(DELIM_TOKEN_TYPE, stringFromCode(code));
|
|
|
+ }
|
|
|
+ case 0x5d:
|
|
|
+ return new Token(CLOSE_SQUARE_TOKEN_TYPE);
|
|
|
+ case 0x5e:
|
|
|
+ if (next() == 0x3d) {
|
|
|
+ code = consume();
|
|
|
+ return new Token(PREFIX_MATCH_TOKEN_TYPE);
|
|
|
+ } else {
|
|
|
+ return new Token(DELIM_TOKEN_TYPE, stringFromCode(code));
|
|
|
+ }
|
|
|
+ case 0x7b:
|
|
|
+ return new Token(OPEN_CURLY_TOKEN_TYPE);
|
|
|
+ case 0x7c:
|
|
|
+ if (next() == 0x3d) {
|
|
|
+ code = consume();
|
|
|
+ return new Token(DASH_MATCH_TOKEN_TYPE);
|
|
|
+ } else if (next() == 0x7c) {
|
|
|
+ code = consume();
|
|
|
+ return new Token(COLUMN_TOKEN_TYPE);
|
|
|
+ } else {
|
|
|
+ return new Token(DELIM_TOKEN_TYPE, stringFromCode(code));
|
|
|
+ }
|
|
|
+ case 0x7d:
|
|
|
+ return new Token(CLOSE_CURLY_TOKEN_TYPE);
|
|
|
+ case 0x7e:
|
|
|
+ if (next() == 0x3d) {
|
|
|
+ code = consume();
|
|
|
+ return new Token(INCLUDE_MATCH_TOKEN_TYPE);
|
|
|
+ } else {
|
|
|
+ return new Token(DELIM_TOKEN_TYPE, stringFromCode(code));
|
|
|
+ }
|
|
|
+ default:
|
|
|
+ if (digit(code)) {
|
|
|
+ reconsume();
|
|
|
+ return consumeANumericToken(consume, next, eof, reconsume);
|
|
|
+ }
|
|
|
+ else if (namestartchar(code)) {
|
|
|
+ reconsume();
|
|
|
+ return consumeAnIdentlikeToken(consume, next, eof, reconsume, parseerror, donothing);
|
|
|
+ }
|
|
|
+ else if (eof()) return new Token(EOF_TOKEN_TYPE);
|
|
|
+ else return new Token(DELIM_TOKEN_TYPE, stringFromCode(code));
|
|
|
}
|
|
|
}
|
|
|
- else if (digit(code)) {
|
|
|
- reconsume();
|
|
|
- return consumeANumericToken(consume, next, eof, reconsume);
|
|
|
- }
|
|
|
- else if (namestartchar(code)) {
|
|
|
- reconsume();
|
|
|
- return consumeAnIdentlikeToken(consume, next, eof, reconsume, parseerror, donothing);
|
|
|
- }
|
|
|
- else if (eof()) return new Token(EOF_TOKEN_TYPE);
|
|
|
- else return new Token(DELIM_TOKEN_TYPE, stringFromCode(code));
|
|
|
}
|
|
|
|
|
|
+
|
|
|
function consumeComments(consume, next, eof, parseerror) {
|
|
|
while (next(1) == 0x2f && next(2) == 0x2a) {
|
|
|
consume(2);
|