| var cmpChar = require('../../tokenizer').cmpChar; |
| var cmpStr = require('../../tokenizer').cmpStr; |
| var TYPE = require('../../tokenizer').TYPE; |
| |
| var IDENT = TYPE.Ident; |
| var STRING = TYPE.String; |
| var NUMBER = TYPE.Number; |
| var FUNCTION = TYPE.Function; |
| var URL = TYPE.Url; |
| var HASH = TYPE.Hash; |
| var DIMENSION = TYPE.Dimension; |
| var PERCENTAGE = TYPE.Percentage; |
| var LEFTPARENTHESIS = TYPE.LeftParenthesis; |
| var LEFTSQUAREBRACKET = TYPE.LeftSquareBracket; |
| var COMMA = TYPE.Comma; |
| var DELIM = TYPE.Delim; |
| var NUMBERSIGN = 0x0023; // U+0023 NUMBER SIGN (#) |
| var ASTERISK = 0x002A; // U+002A ASTERISK (*) |
| var PLUSSIGN = 0x002B; // U+002B PLUS SIGN (+) |
| var HYPHENMINUS = 0x002D; // U+002D HYPHEN-MINUS (-) |
| var SOLIDUS = 0x002F; // U+002F SOLIDUS (/) |
| var U = 0x0075; // U+0075 LATIN SMALL LETTER U (u) |
| |
| module.exports = function defaultRecognizer(context) { |
| switch (this.scanner.tokenType) { |
| case HASH: |
| return this.Hash(); |
| |
| case COMMA: |
| context.space = null; |
| context.ignoreWSAfter = true; |
| return this.Operator(); |
| |
| case LEFTPARENTHESIS: |
| return this.Parentheses(this.readSequence, context.recognizer); |
| |
| case LEFTSQUAREBRACKET: |
| return this.Brackets(this.readSequence, context.recognizer); |
| |
| case STRING: |
| return this.String(); |
| |
| case DIMENSION: |
| return this.Dimension(); |
| |
| case PERCENTAGE: |
| return this.Percentage(); |
| |
| case NUMBER: |
| return this.Number(); |
| |
| case FUNCTION: |
| return cmpStr(this.scanner.source, this.scanner.tokenStart, this.scanner.tokenEnd, 'url(') |
| ? this.Url() |
| : this.Function(this.readSequence, context.recognizer); |
| |
| case URL: |
| return this.Url(); |
| |
| case IDENT: |
| // check for unicode range, it should start with u+ or U+ |
| if (cmpChar(this.scanner.source, this.scanner.tokenStart, U) && |
| cmpChar(this.scanner.source, this.scanner.tokenStart + 1, PLUSSIGN)) { |
| return this.UnicodeRange(); |
| } else { |
| return this.Identifier(); |
| } |
| |
| case DELIM: |
| var code = this.scanner.source.charCodeAt(this.scanner.tokenStart); |
| |
| if (code === SOLIDUS || |
| code === ASTERISK || |
| code === PLUSSIGN || |
| code === HYPHENMINUS) { |
| return this.Operator(); // TODO: replace with Delim |
| } |
| |
| // TODO: produce a node with Delim node type |
| |
| if (code === NUMBERSIGN) { |
| this.error('Hex or identifier is expected', this.scanner.tokenStart + 1); |
| } |
| |
| break; |
| } |
| }; |