default.js 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. var cmpChar = require('../../tokenizer').cmpChar;
  2. var cmpStr = require('../../tokenizer').cmpStr;
  3. var TYPE = require('../../tokenizer').TYPE;
  4. var CHARCODE = require('../../tokenizer').CHARCODE;
  5. var IDENT = TYPE.Ident;
  6. var STRING = TYPE.String;
  7. var NUMBER = TYPE.Number;
  8. var FUNCTION = TYPE.Function;
  9. var URL = TYPE.Url;
  10. var HASH = TYPE.Hash;
  11. var DIMENSION = TYPE.Dimension;
  12. var PERCENTAGE = TYPE.Percentage;
  13. var LEFTPARENTHESIS = TYPE.LeftParenthesis;
  14. var LEFTSQUAREBRACKET = TYPE.LeftSquareBracket;
  15. var COMMA = TYPE.Comma;
  16. var DELIM = TYPE.Delim;
  17. var PLUSSIGN = CHARCODE.PlusSign;
  18. var HYPHENMINUS = CHARCODE.HyphenMinus;
  19. var SOLIDUS = CHARCODE.Solidus;
  20. var ASTERISK = CHARCODE.Asterisk;
  21. var NUMBERSIGN = CHARCODE.NumberSign;
  22. var U = 117; // 'u'.charCodeAt(0)
  23. module.exports = function defaultRecognizer(context) {
  24. switch (this.scanner.tokenType) {
  25. case HASH:
  26. return this.HexColor();
  27. case COMMA:
  28. context.space = null;
  29. context.ignoreWSAfter = true;
  30. return this.Operator();
  31. case LEFTPARENTHESIS:
  32. return this.Parentheses(this.readSequence, context.recognizer);
  33. case LEFTSQUAREBRACKET:
  34. return this.Brackets(this.readSequence, context.recognizer);
  35. case STRING:
  36. return this.String();
  37. case DIMENSION:
  38. return this.Dimension();
  39. case PERCENTAGE:
  40. return this.Percentage();
  41. case NUMBER:
  42. return this.Number();
  43. case FUNCTION:
  44. return cmpStr(this.scanner.source, this.scanner.tokenStart, this.scanner.tokenEnd, 'url(')
  45. ? this.Url()
  46. : this.Function(this.readSequence, context.recognizer);
  47. case URL:
  48. return this.Url();
  49. case IDENT:
  50. // check for unicode range, it should start with u+ or U+
  51. if (cmpChar(this.scanner.source, this.scanner.tokenStart, U) &&
  52. cmpChar(this.scanner.source, this.scanner.tokenStart + 1, PLUSSIGN)) {
  53. return this.UnicodeRange();
  54. } else {
  55. return this.Identifier();
  56. }
  57. case DELIM:
  58. var code = this.scanner.source.charCodeAt(this.scanner.tokenStart);
  59. if (code === SOLIDUS ||
  60. code === ASTERISK ||
  61. code === PLUSSIGN ||
  62. code === HYPHENMINUS) {
  63. return this.Operator(); // TODO: replace with Delim
  64. }
  65. // TODO: produce a node with Delim node type
  66. if (code === NUMBERSIGN) {
  67. this.error('Hex or identifier is expected', this.scanner.tokenStart + 1);
  68. }
  69. break;
  70. }
  71. };