// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

part of csslib.parser;

// TODO(terry): Need to be consistent with tokens either they're ASCII tokens
//              e.g., ASTERISK or they're CSS e.g., PSEUDO, COMBINATOR_*.
class TokenKind {
  // Common shared tokens used in TokenizerBase.
  static const int UNUSED = 0; // Unused place holder...
  static const int END_OF_FILE = 1; // EOF
  static const int LPAREN = 2; // (
  static const int RPAREN = 3; // )
  static const int LBRACK = 4; // [
  static const int RBRACK = 5; // ]
  static const int LBRACE = 6; // {
  static const int RBRACE = 7; // }
  static const int DOT = 8; // .
  static const int SEMICOLON = 9; // ;

  // Unique tokens for CSS.
  static const int AT = 10; // @
  static const int HASH = 11; // #
  static const int PLUS = 12; // +
  static const int GREATER = 13; // >
  static const int TILDE = 14; // ~
  static const int ASTERISK = 15; // *
  static const int NAMESPACE = 16; // |
  static const int COLON = 17; // :
  static const int PRIVATE_NAME = 18; // _ prefix private class or id
  static const int COMMA = 19; // ,
  static const int SPACE = 20;
  static const int TAB = 21; // /t
  static const int NEWLINE = 22; // /n
  static const int RETURN = 23; // /r
  static const int PERCENT = 24; // %
  static const int SINGLE_QUOTE = 25; // '
  static const int DOUBLE_QUOTE = 26; // "
  static const int SLASH = 27; // /
  static const int EQUALS = 28; // =
  static const int CARET = 30; // ^
  static const int DOLLAR = 31; // $
  static const int LESS = 32; // <
  static const int BANG = 33; // !
  static const int MINUS = 34; // -
  static const int BACKSLASH = 35; // \
  static const int AMPERSAND = 36; // &

  // WARNING: Tokens from this point and above must have the corresponding ASCII
  //          character in the TokenChar list at the bottom of this file.  The
  //          order of the above tokens should be the same order as TokenChar.

  /** [TokenKind] representing integer tokens. */
  static const int INTEGER = 60;

  /** [TokenKind] representing hex integer tokens. */
  static const int HEX_INTEGER = 61;

  /** [TokenKind] representing double tokens. */
  static const int DOUBLE = 62;

  /** [TokenKind] representing whitespace tokens. */
  static const int WHITESPACE = 63;

  /** [TokenKind] representing comment tokens. */
  static const int COMMENT = 64;

  /** [TokenKind] representing error tokens. */
  static const int ERROR = 65;

  /** [TokenKind] representing incomplete string tokens. */
  static const int INCOMPLETE_STRING = 66;

  /** [TokenKind] representing incomplete comment tokens. */
  static const int INCOMPLETE_COMMENT = 67;

  static const int VAR_DEFINITION = 400; // var-NNN-NNN
  static const int VAR_USAGE = 401; // var(NNN-NNN [,default])

  // Synthesized Tokens (no character associated with TOKEN).
  static const int STRING = 500;
  static const int STRING_PART = 501;
  static const int NUMBER = 502;
  static const int HEX_NUMBER = 503;
  static const int HTML_COMMENT = 504; // <!--
  static const int IMPORTANT = 505; // !important
  static const int CDATA_START = 506; // <![CDATA[
  static const int CDATA_END = 507; // ]]>
  // U+uNumber[-U+uNumber]
  // uNumber = 0..10FFFF | ?[?]*
  static const int UNICODE_RANGE = 508;
  static const int HEX_RANGE = 509; // ? in the hex range
  static const int IDENTIFIER = 511;

  // Uniquely synthesized tokens for CSS.
  static const int SELECTOR_EXPRESSION = 512;
  static const int COMBINATOR_NONE = 513;
  static const int COMBINATOR_DESCENDANT = 514; // Space combinator
  static const int COMBINATOR_PLUS = 515; // + combinator
  static const int COMBINATOR_GREATER = 516; // > combinator
  static const int COMBINATOR_TILDE = 517; // ~ combinator
  static const int COMBINATOR_SHADOW_PIERCING_DESCENDANT = 518; // >>>
  static const int COMBINATOR_DEEP = 519; // /deep/ (aliases >>>)

  static const int UNARY_OP_NONE = 520; // No unary operator present.

  // Attribute match types:
  static const int INCLUDES = 530; // '~='
  static const int DASH_MATCH = 531; // '|='
  static const int PREFIX_MATCH = 532; // '^='
  static const int SUFFIX_MATCH = 533; // '$='
  static const int SUBSTRING_MATCH = 534; // '*='
  static const int NO_MATCH = 535; // No operator.

  // Unit types:
  static const int UNIT_EM = 600;
  static const int UNIT_EX = 601;
  static const int UNIT_LENGTH_PX = 602;
  static const int UNIT_LENGTH_CM = 603;
  static const int UNIT_LENGTH_MM = 604;
  static const int UNIT_LENGTH_IN = 605;
  static const int UNIT_LENGTH_PT = 606;
  static const int UNIT_LENGTH_PC = 607;
  static const int UNIT_ANGLE_DEG = 608;
  static const int UNIT_ANGLE_RAD = 609;
  static const int UNIT_ANGLE_GRAD = 610;
  static const int UNIT_ANGLE_TURN = 611;
  static const int UNIT_TIME_MS = 612;
  static const int UNIT_TIME_S = 613;
  static const int UNIT_FREQ_HZ = 614;
  static const int UNIT_FREQ_KHZ = 615;
  static const int UNIT_PERCENT = 616;
  static const int UNIT_FRACTION = 617;
  static const int UNIT_RESOLUTION_DPI = 618;
  static const int UNIT_RESOLUTION_DPCM = 619;
  static const int UNIT_RESOLUTION_DPPX = 620;
  static const int UNIT_CH = 621; // Measure of "0" U+0030 glyph.
  static const int UNIT_REM = 622; // computed value ‘font-size’ on root elem.
  static const int UNIT_VIEWPORT_VW = 623;
  static const int UNIT_VIEWPORT_VH = 624;
  static const int UNIT_VIEWPORT_VMIN = 625;
  static const int UNIT_VIEWPORT_VMAX = 626;

  // Directives (@nnnn)
  static const int DIRECTIVE_NONE = 640;
  static const int DIRECTIVE_IMPORT = 641;
  static const int DIRECTIVE_MEDIA = 642;
  static const int DIRECTIVE_PAGE = 643;
  static const int DIRECTIVE_CHARSET = 644;
  static const int DIRECTIVE_STYLET = 645;
  static const int DIRECTIVE_KEYFRAMES = 646;
  static const int DIRECTIVE_WEB_KIT_KEYFRAMES = 647;
  static const int DIRECTIVE_MOZ_KEYFRAMES = 648;
  static const int DIRECTIVE_MS_KEYFRAMES = 649;
  static const int DIRECTIVE_O_KEYFRAMES = 650;
  static const int DIRECTIVE_FONTFACE = 651;
  static const int DIRECTIVE_NAMESPACE = 652;
  static const int DIRECTIVE_HOST = 653;
  static const int DIRECTIVE_MIXIN = 654;
  static const int DIRECTIVE_INCLUDE = 655;
  static const int DIRECTIVE_CONTENT = 656;
  static const int DIRECTIVE_EXTEND = 657;

  // Media query operators
  static const int MEDIA_OP_ONLY = 665; // Unary.
  static const int MEDIA_OP_NOT = 666; // Unary.
  static const int MEDIA_OP_AND = 667; // Binary.

  // Directives inside of a @page (margin sym).
  static const int MARGIN_DIRECTIVE_TOPLEFTCORNER = 670;
  static const int MARGIN_DIRECTIVE_TOPLEFT = 671;
  static const int MARGIN_DIRECTIVE_TOPCENTER = 672;
  static const int MARGIN_DIRECTIVE_TOPRIGHT = 673;
  static const int MARGIN_DIRECTIVE_TOPRIGHTCORNER = 674;
  static const int MARGIN_DIRECTIVE_BOTTOMLEFTCORNER = 675;
  static const int MARGIN_DIRECTIVE_BOTTOMLEFT = 676;
  static const int MARGIN_DIRECTIVE_BOTTOMCENTER = 677;
  static const int MARGIN_DIRECTIVE_BOTTOMRIGHT = 678;
  static const int MARGIN_DIRECTIVE_BOTTOMRIGHTCORNER = 679;
  static const int MARGIN_DIRECTIVE_LEFTTOP = 680;
  static const int MARGIN_DIRECTIVE_LEFTMIDDLE = 681;
  static const int MARGIN_DIRECTIVE_LEFTBOTTOM = 682;
  static const int MARGIN_DIRECTIVE_RIGHTTOP = 683;
  static const int MARGIN_DIRECTIVE_RIGHTMIDDLE = 684;
  static const int MARGIN_DIRECTIVE_RIGHTBOTTOM = 685;

  // Simple selector type.
  static const int CLASS_NAME = 700; // .class
  static const int ELEMENT_NAME = 701; // tagName
  static const int HASH_NAME = 702; // #elementId
  static const int ATTRIBUTE_NAME = 703; // [attrib]
  static const int PSEUDO_ELEMENT_NAME = 704; // ::pseudoElement
  static const int PSEUDO_CLASS_NAME = 705; // :pseudoClass
  static const int NEGATION = 706; // NOT

  static const List<Map<String, dynamic>> _DIRECTIVES = const [
    const {'type': TokenKind.DIRECTIVE_IMPORT, 'value': 'import'},
    const {'type': TokenKind.DIRECTIVE_MEDIA, 'value': 'media'},
    const {'type': TokenKind.DIRECTIVE_PAGE, 'value': 'page'},
    const {'type': TokenKind.DIRECTIVE_CHARSET, 'value': 'charset'},
    const {'type': TokenKind.DIRECTIVE_STYLET, 'value': 'stylet'},
    const {'type': TokenKind.DIRECTIVE_KEYFRAMES, 'value': 'keyframes'},
    const {
      'type': TokenKind.DIRECTIVE_WEB_KIT_KEYFRAMES,
      'value': '-webkit-keyframes'
    },
    const {
      'type': TokenKind.DIRECTIVE_MOZ_KEYFRAMES,
      'value': '-moz-keyframes'
    },
    const {'type': TokenKind.DIRECTIVE_MS_KEYFRAMES, 'value': '-ms-keyframes'},
    const {'type': TokenKind.DIRECTIVE_O_KEYFRAMES, 'value': '-o-keyframes'},
    const {'type': TokenKind.DIRECTIVE_FONTFACE, 'value': 'font-face'},
    const {'type': TokenKind.DIRECTIVE_NAMESPACE, 'value': 'namespace'},
    const {'type': TokenKind.DIRECTIVE_HOST, 'value': 'host'},
    const {'type': TokenKind.DIRECTIVE_MIXIN, 'value': 'mixin'},
    const {'type': TokenKind.DIRECTIVE_INCLUDE, 'value': 'include'},
    const {'type': TokenKind.DIRECTIVE_CONTENT, 'value': 'content'},
    const {'type': TokenKind.DIRECTIVE_EXTEND, 'value': 'extend'},
  ];

  static const List<Map<String, dynamic>> MEDIA_OPERATORS = const [
    const {'type': TokenKind.MEDIA_OP_ONLY, 'value': 'only'},
    const {'type': TokenKind.MEDIA_OP_NOT, 'value': 'not'},
    const {'type': TokenKind.MEDIA_OP_AND, 'value': 'and'},
  ];

  static const List<Map<String, dynamic>> MARGIN_DIRECTIVES = const [
    const {
      'type': TokenKind.MARGIN_DIRECTIVE_TOPLEFTCORNER,
      'value': 'top-left-corner'
    },
    const {'type': TokenKind.MARGIN_DIRECTIVE_TOPLEFT, 'value': 'top-left'},
    const {'type': TokenKind.MARGIN_DIRECTIVE_TOPCENTER, 'value': 'top-center'},
    const {'type': TokenKind.MARGIN_DIRECTIVE_TOPRIGHT, 'value': 'top-right'},
    const {
      'type': TokenKind.MARGIN_DIRECTIVE_TOPRIGHTCORNER,
      'value': 'top-right-corner'
    },
    const {
      'type': TokenKind.MARGIN_DIRECTIVE_BOTTOMLEFTCORNER,
      'value': 'bottom-left-corner'
    },
    const {
      'type': TokenKind.MARGIN_DIRECTIVE_BOTTOMLEFT,
      'value': 'bottom-left'
    },
    const {
      'type': TokenKind.MARGIN_DIRECTIVE_BOTTOMCENTER,
      'value': 'bottom-center'
    },
    const {
      'type': TokenKind.MARGIN_DIRECTIVE_BOTTOMRIGHT,
      'value': 'bottom-right'
    },
    const {
      'type': TokenKind.MARGIN_DIRECTIVE_BOTTOMRIGHTCORNER,
      'value': 'bottom-right-corner'
    },
    const {'type': TokenKind.MARGIN_DIRECTIVE_LEFTTOP, 'value': 'left-top'},
    const {
      'type': TokenKind.MARGIN_DIRECTIVE_LEFTMIDDLE,
      'value': 'left-middle'
    },
    const {
      'type': TokenKind.MARGIN_DIRECTIVE_LEFTBOTTOM,
      'value': 'right-bottom'
    },
    const {'type': TokenKind.MARGIN_DIRECTIVE_RIGHTTOP, 'value': 'right-top'},
    const {
      'type': TokenKind.MARGIN_DIRECTIVE_RIGHTMIDDLE,
      'value': 'right-middle'
    },
    const {
      'type': TokenKind.MARGIN_DIRECTIVE_RIGHTBOTTOM,
      'value': 'right-bottom'
    },
  ];

  static const List<Map> _UNITS = const [
    const {'unit': TokenKind.UNIT_EM, 'value': 'em'},
    const {'unit': TokenKind.UNIT_EX, 'value': 'ex'},
    const {'unit': TokenKind.UNIT_LENGTH_PX, 'value': 'px'},
    const {'unit': TokenKind.UNIT_LENGTH_CM, 'value': 'cm'},
    const {'unit': TokenKind.UNIT_LENGTH_MM, 'value': 'mm'},
    const {'unit': TokenKind.UNIT_LENGTH_IN, 'value': 'in'},
    const {'unit': TokenKind.UNIT_LENGTH_PT, 'value': 'pt'},
    const {'unit': TokenKind.UNIT_LENGTH_PC, 'value': 'pc'},
    const {'unit': TokenKind.UNIT_ANGLE_DEG, 'value': 'deg'},
    const {'unit': TokenKind.UNIT_ANGLE_RAD, 'value': 'rad'},
    const {'unit': TokenKind.UNIT_ANGLE_GRAD, 'value': 'grad'},
    const {'unit': TokenKind.UNIT_ANGLE_TURN, 'value': 'turn'},
    const {'unit': TokenKind.UNIT_TIME_MS, 'value': 'ms'},
    const {'unit': TokenKind.UNIT_TIME_S, 'value': 's'},
    const {'unit': TokenKind.UNIT_FREQ_HZ, 'value': 'hz'},
    const {'unit': TokenKind.UNIT_FREQ_KHZ, 'value': 'khz'},
    const {'unit': TokenKind.UNIT_FRACTION, 'value': 'fr'},
    const {'unit': TokenKind.UNIT_RESOLUTION_DPI, 'value': 'dpi'},
    const {'unit': TokenKind.UNIT_RESOLUTION_DPCM, 'value': 'dpcm'},
    const {'unit': TokenKind.UNIT_RESOLUTION_DPPX, 'value': 'dppx'},
    const {'unit': TokenKind.UNIT_CH, 'value': 'ch'},
    const {'unit': TokenKind.UNIT_REM, 'value': 'rem'},
    const {'unit': TokenKind.UNIT_VIEWPORT_VW, 'value': 'vw'},
    const {'unit': TokenKind.UNIT_VIEWPORT_VH, 'value': 'vh'},
    const {'unit': TokenKind.UNIT_VIEWPORT_VMIN, 'value': 'vmin'},
    const {'unit': TokenKind.UNIT_VIEWPORT_VMAX, 'value': 'vmax'},
  ];

  // Some more constants:
  static const int ASCII_UPPER_A = 65; // ASCII value for uppercase A
  static const int ASCII_UPPER_Z = 90; // ASCII value for uppercase Z

  // Extended color keywords:
  static const List<Map> _EXTENDED_COLOR_NAMES = const [
    const {'name': 'aliceblue', 'value': 0xF08FF},
    const {'name': 'antiquewhite', 'value': 0xFAEBD7},
    const {'name': 'aqua', 'value': 0x00FFFF},
    const {'name': 'aquamarine', 'value': 0x7FFFD4},
    const {'name': 'azure', 'value': 0xF0FFFF},
    const {'name': 'beige', 'value': 0xF5F5DC},
    const {'name': 'bisque', 'value': 0xFFE4C4},
    const {'name': 'black', 'value': 0x000000},
    const {'name': 'blanchedalmond', 'value': 0xFFEBCD},
    const {'name': 'blue', 'value': 0x0000FF},
    const {'name': 'blueviolet', 'value': 0x8A2BE2},
    const {'name': 'brown', 'value': 0xA52A2A},
    const {'name': 'burlywood', 'value': 0xDEB887},
    const {'name': 'cadetblue', 'value': 0x5F9EA0},
    const {'name': 'chartreuse', 'value': 0x7FFF00},
    const {'name': 'chocolate', 'value': 0xD2691E},
    const {'name': 'coral', 'value': 0xFF7F50},
    const {'name': 'cornflowerblue', 'value': 0x6495ED},
    const {'name': 'cornsilk', 'value': 0xFFF8DC},
    const {'name': 'crimson', 'value': 0xDC143C},
    const {'name': 'cyan', 'value': 0x00FFFF},
    const {'name': 'darkblue', 'value': 0x00008B},
    const {'name': 'darkcyan', 'value': 0x008B8B},
    const {'name': 'darkgoldenrod', 'value': 0xB8860B},
    const {'name': 'darkgray', 'value': 0xA9A9A9},
    const {'name': 'darkgreen', 'value': 0x006400},
    const {'name': 'darkgrey', 'value': 0xA9A9A9},
    const {'name': 'darkkhaki', 'value': 0xBDB76B},
    const {'name': 'darkmagenta', 'value': 0x8B008B},
    const {'name': 'darkolivegreen', 'value': 0x556B2F},
    const {'name': 'darkorange', 'value': 0xFF8C00},
    const {'name': 'darkorchid', 'value': 0x9932CC},
    const {'name': 'darkred', 'value': 0x8B0000},
    const {'name': 'darksalmon', 'value': 0xE9967A},
    const {'name': 'darkseagreen', 'value': 0x8FBC8F},
    const {'name': 'darkslateblue', 'value': 0x483D8B},
    const {'name': 'darkslategray', 'value': 0x2F4F4F},
    const {'name': 'darkslategrey', 'value': 0x2F4F4F},
    const {'name': 'darkturquoise', 'value': 0x00CED1},
    const {'name': 'darkviolet', 'value': 0x9400D3},
    const {'name': 'deeppink', 'value': 0xFF1493},
    const {'name': 'deepskyblue', 'value': 0x00BFFF},
    const {'name': 'dimgray', 'value': 0x696969},
    const {'name': 'dimgrey', 'value': 0x696969},
    const {'name': 'dodgerblue', 'value': 0x1E90FF},
    const {'name': 'firebrick', 'value': 0xB22222},
    const {'name': 'floralwhite', 'value': 0xFFFAF0},
    const {'name': 'forestgreen', 'value': 0x228B22},
    const {'name': 'fuchsia', 'value': 0xFF00FF},
    const {'name': 'gainsboro', 'value': 0xDCDCDC},
    const {'name': 'ghostwhite', 'value': 0xF8F8FF},
    const {'name': 'gold', 'value': 0xFFD700},
    const {'name': 'goldenrod', 'value': 0xDAA520},
    const {'name': 'gray', 'value': 0x808080},
    const {'name': 'green', 'value': 0x008000},
    const {'name': 'greenyellow', 'value': 0xADFF2F},
    const {'name': 'grey', 'value': 0x808080},
    const {'name': 'honeydew', 'value': 0xF0FFF0},
    const {'name': 'hotpink', 'value': 0xFF69B4},
    const {'name': 'indianred', 'value': 0xCD5C5C},
    const {'name': 'indigo', 'value': 0x4B0082},
    const {'name': 'ivory', 'value': 0xFFFFF0},
    const {'name': 'khaki', 'value': 0xF0E68C},
    const {'name': 'lavender', 'value': 0xE6E6FA},
    const {'name': 'lavenderblush', 'value': 0xFFF0F5},
    const {'name': 'lawngreen', 'value': 0x7CFC00},
    const {'name': 'lemonchiffon', 'value': 0xFFFACD},
    const {'name': 'lightblue', 'value': 0xADD8E6},
    const {'name': 'lightcoral', 'value': 0xF08080},
    const {'name': 'lightcyan', 'value': 0xE0FFFF},
    const {'name': 'lightgoldenrodyellow', 'value': 0xFAFAD2},
    const {'name': 'lightgray', 'value': 0xD3D3D3},
    const {'name': 'lightgreen', 'value': 0x90EE90},
    const {'name': 'lightgrey', 'value': 0xD3D3D3},
    const {'name': 'lightpink', 'value': 0xFFB6C1},
    const {'name': 'lightsalmon', 'value': 0xFFA07A},
    const {'name': 'lightseagreen', 'value': 0x20B2AA},
    const {'name': 'lightskyblue', 'value': 0x87CEFA},
    const {'name': 'lightslategray', 'value': 0x778899},
    const {'name': 'lightslategrey', 'value': 0x778899},
    const {'name': 'lightsteelblue', 'value': 0xB0C4DE},
    const {'name': 'lightyellow', 'value': 0xFFFFE0},
    const {'name': 'lime', 'value': 0x00FF00},
    const {'name': 'limegreen', 'value': 0x32CD32},
    const {'name': 'linen', 'value': 0xFAF0E6},
    const {'name': 'magenta', 'value': 0xFF00FF},
    const {'name': 'maroon', 'value': 0x800000},
    const {'name': 'mediumaquamarine', 'value': 0x66CDAA},
    const {'name': 'mediumblue', 'value': 0x0000CD},
    const {'name': 'mediumorchid', 'value': 0xBA55D3},
    const {'name': 'mediumpurple', 'value': 0x9370DB},
    const {'name': 'mediumseagreen', 'value': 0x3CB371},
    const {'name': 'mediumslateblue', 'value': 0x7B68EE},
    const {'name': 'mediumspringgreen', 'value': 0x00FA9A},
    const {'name': 'mediumturquoise', 'value': 0x48D1CC},
    const {'name': 'mediumvioletred', 'value': 0xC71585},
    const {'name': 'midnightblue', 'value': 0x191970},
    const {'name': 'mintcream', 'value': 0xF5FFFA},
    const {'name': 'mistyrose', 'value': 0xFFE4E1},
    const {'name': 'moccasin', 'value': 0xFFE4B5},
    const {'name': 'navajowhite', 'value': 0xFFDEAD},
    const {'name': 'navy', 'value': 0x000080},
    const {'name': 'oldlace', 'value': 0xFDF5E6},
    const {'name': 'olive', 'value': 0x808000},
    const {'name': 'olivedrab', 'value': 0x6B8E23},
    const {'name': 'orange', 'value': 0xFFA500},
    const {'name': 'orangered', 'value': 0xFF4500},
    const {'name': 'orchid', 'value': 0xDA70D6},
    const {'name': 'palegoldenrod', 'value': 0xEEE8AA},
    const {'name': 'palegreen', 'value': 0x98FB98},
    const {'name': 'paleturquoise', 'value': 0xAFEEEE},
    const {'name': 'palevioletred', 'value': 0xDB7093},
    const {'name': 'papayawhip', 'value': 0xFFEFD5},
    const {'name': 'peachpuff', 'value': 0xFFDAB9},
    const {'name': 'peru', 'value': 0xCD853F},
    const {'name': 'pink', 'value': 0xFFC0CB},
    const {'name': 'plum', 'value': 0xDDA0DD},
    const {'name': 'powderblue', 'value': 0xB0E0E6},
    const {'name': 'purple', 'value': 0x800080},
    const {'name': 'red', 'value': 0xFF0000},
    const {'name': 'rosybrown', 'value': 0xBC8F8F},
    const {'name': 'royalblue', 'value': 0x4169E1},
    const {'name': 'saddlebrown', 'value': 0x8B4513},
    const {'name': 'salmon', 'value': 0xFA8072},
    const {'name': 'sandybrown', 'value': 0xF4A460},
    const {'name': 'seagreen', 'value': 0x2E8B57},
    const {'name': 'seashell', 'value': 0xFFF5EE},
    const {'name': 'sienna', 'value': 0xA0522D},
    const {'name': 'silver', 'value': 0xC0C0C0},
    const {'name': 'skyblue', 'value': 0x87CEEB},
    const {'name': 'slateblue', 'value': 0x6A5ACD},
    const {'name': 'slategray', 'value': 0x708090},
    const {'name': 'slategrey', 'value': 0x708090},
    const {'name': 'snow', 'value': 0xFFFAFA},
    const {'name': 'springgreen', 'value': 0x00FF7F},
    const {'name': 'steelblue', 'value': 0x4682B4},
    const {'name': 'tan', 'value': 0xD2B48C},
    const {'name': 'teal', 'value': 0x008080},
    const {'name': 'thistle', 'value': 0xD8BFD8},
    const {'name': 'tomato', 'value': 0xFF6347},
    const {'name': 'turquoise', 'value': 0x40E0D0},
    const {'name': 'violet', 'value': 0xEE82EE},
    const {'name': 'wheat', 'value': 0xF5DEB3},
    const {'name': 'white', 'value': 0xFFFFFF},
    const {'name': 'whitesmoke', 'value': 0xF5F5F5},
    const {'name': 'yellow', 'value': 0xFFFF00},
    const {'name': 'yellowgreen', 'value': 0x9ACD32},
  ];

  // TODO(terry): Should used Dart mirroring for parameter values and types
  //              especially for enumeration (e.g., counter's second parameter
  //              is list-style-type which is an enumerated list for ordering
  //              of a list 'circle', 'decimal', 'lower-roman', 'square', etc.
  //              see http://www.w3schools.com/cssref/pr_list-style-type.asp
  //              for list of possible values.

  /**
   * Check if name is a pre-defined CSS name.  Used by error handler to report
   * if name is unknown or used improperly.
   */
  static bool isPredefinedName(String name) {
    var nameLen = name.length;
    // TODO(terry): Add more pre-defined names (hidden, bolder, inherit, etc.).
    if (matchUnits(name, 0, nameLen) == -1 ||
        matchDirectives(name, 0, nameLen) == -1 ||
        matchMarginDirectives(name, 0, nameLen) == -1 ||
        matchColorName(name) == null) {
      return false;
    }

    return true;
  }

  /** Return the token that matches the unit ident found. */
  static int matchList(
      var identList, String tokenField, String text, int offset, int length) {
    for (final entry in identList) {
      String ident = entry['value'];

      if (length == ident.length) {
        int idx = offset;
        bool match = true;
        for (int i = 0; i < ident.length; i++) {
          int identChar = ident.codeUnitAt(i);
          int char = text.codeUnitAt(idx++);
          // Compare lowercase to lowercase then check if char is uppercase.
          match = match &&
              (char == identChar ||
                  ((char >= ASCII_UPPER_A && char <= ASCII_UPPER_Z) &&
                      (char + 32) == identChar));
          if (!match) {
            break;
          }
        }

        if (match) {
          // Completely matched; return the token for this unit.
          return entry[tokenField];
        }
      }
    }

    return -1; // Not a unit token.
  }

  /** Return the token that matches the unit ident found. */
  static int matchUnits(String text, int offset, int length) {
    return matchList(_UNITS, 'unit', text, offset, length);
  }

  /** Return the token that matches the directive name found. */
  static int matchDirectives(String text, int offset, int length) {
    return matchList(_DIRECTIVES, 'type', text, offset, length);
  }

  /** Return the token that matches the margin directive name found. */
  static int matchMarginDirectives(String text, int offset, int length) {
    return matchList(MARGIN_DIRECTIVES, 'type', text, offset, length);
  }

  /** Return the token that matches the media operator found. */
  static int matchMediaOperator(String text, int offset, int length) {
    return matchList(MEDIA_OPERATORS, 'type', text, offset, length);
  }

  static String idToValue(var identList, int tokenId) {
    for (var entry in identList) {
      if (tokenId == entry['type']) {
        return entry['value'];
      }
    }

    return null;
  }

  /** Return the unit token as its pretty name. */
  static String unitToString(int unitTokenToFind) {
    if (unitTokenToFind == TokenKind.PERCENT) {
      return '%';
    } else {
      for (final entry in _UNITS) {
        int unit = entry['unit'];
        if (unit == unitTokenToFind) {
          return entry['value'];
        }
      }
    }

    return '<BAD UNIT>'; // Not a unit token.
  }

  /**
   * Match color name, case insensitive match and return the associated color
   * entry from _EXTENDED_COLOR_NAMES list, return [:null:] if not found.
   */
  static Map matchColorName(String text) {
    var name = text.toLowerCase();
    return _EXTENDED_COLOR_NAMES.firstWhere((e) => e['name'] == name,
        orElse: () => null);
  }

  /** Return RGB value as [int] from a color entry in _EXTENDED_COLOR_NAMES. */
  static int colorValue(Map entry) {
    assert(entry != null);
    return entry['value'];
  }

  static String hexToColorName(hexValue) {
    for (final entry in _EXTENDED_COLOR_NAMES) {
      if (entry['value'] == hexValue) {
        return entry['name'];
      }
    }

    return null;
  }

  static String decimalToHex(int number, [int minDigits = 1]) {
    final String _HEX_DIGITS = '0123456789abcdef';

    List<String> result = new List<String>();

    int dividend = number >> 4;
    int remain = number % 16;
    result.add(_HEX_DIGITS[remain]);
    while (dividend != 0) {
      remain = dividend % 16;
      dividend >>= 4;
      result.add(_HEX_DIGITS[remain]);
    }

    StringBuffer invertResult = new StringBuffer();
    int paddings = minDigits - result.length;
    while (paddings-- > 0) {
      invertResult.write('0');
    }
    for (int i = result.length - 1; i >= 0; i--) {
      invertResult.write(result[i]);
    }

    return invertResult.toString();
  }

  static String kindToString(int kind) {
    switch (kind) {
      case TokenKind.UNUSED:
        return "ERROR";
      case TokenKind.END_OF_FILE:
        return "end of file";
      case TokenKind.LPAREN:
        return "(";
      case TokenKind.RPAREN:
        return ")";
      case TokenKind.LBRACK:
        return "[";
      case TokenKind.RBRACK:
        return "]";
      case TokenKind.LBRACE:
        return "{";
      case TokenKind.RBRACE:
        return "}";
      case TokenKind.DOT:
        return ".";
      case TokenKind.SEMICOLON:
        return ";";
      case TokenKind.AT:
        return "@";
      case TokenKind.HASH:
        return "#";
      case TokenKind.PLUS:
        return "+";
      case TokenKind.GREATER:
        return ">";
      case TokenKind.TILDE:
        return "~";
      case TokenKind.ASTERISK:
        return "*";
      case TokenKind.NAMESPACE:
        return "|";
      case TokenKind.COLON:
        return ":";
      case TokenKind.PRIVATE_NAME:
        return "_";
      case TokenKind.COMMA:
        return ",";
      case TokenKind.SPACE:
        return " ";
      case TokenKind.TAB:
        return "\t";
      case TokenKind.NEWLINE:
        return "\n";
      case TokenKind.RETURN:
        return "\r";
      case TokenKind.PERCENT:
        return "%";
      case TokenKind.SINGLE_QUOTE:
        return "'";
      case TokenKind.DOUBLE_QUOTE:
        return "\"";
      case TokenKind.SLASH:
        return "/";
      case TokenKind.EQUALS:
        return '=';
      case TokenKind.CARET:
        return '^';
      case TokenKind.DOLLAR:
        return '\$';
      case TokenKind.LESS:
        return '<';
      case TokenKind.BANG:
        return '!';
      case TokenKind.MINUS:
        return '-';
      case TokenKind.BACKSLASH:
        return '\\';
      default:
        throw "Unknown TOKEN";
    }
  }

  static bool isKindIdentifier(int kind) {
    switch (kind) {
      // Synthesized tokens.
      case TokenKind.DIRECTIVE_IMPORT:
      case TokenKind.DIRECTIVE_MEDIA:
      case TokenKind.DIRECTIVE_PAGE:
      case TokenKind.DIRECTIVE_CHARSET:
      case TokenKind.DIRECTIVE_STYLET:
      case TokenKind.DIRECTIVE_KEYFRAMES:
      case TokenKind.DIRECTIVE_WEB_KIT_KEYFRAMES:
      case TokenKind.DIRECTIVE_MOZ_KEYFRAMES:
      case TokenKind.DIRECTIVE_MS_KEYFRAMES:
      case TokenKind.DIRECTIVE_O_KEYFRAMES:
      case TokenKind.DIRECTIVE_FONTFACE:
      case TokenKind.DIRECTIVE_NAMESPACE:
      case TokenKind.DIRECTIVE_HOST:
      case TokenKind.DIRECTIVE_MIXIN:
      case TokenKind.DIRECTIVE_INCLUDE:
      case TokenKind.DIRECTIVE_CONTENT:
      case TokenKind.UNIT_EM:
      case TokenKind.UNIT_EX:
      case TokenKind.UNIT_LENGTH_PX:
      case TokenKind.UNIT_LENGTH_CM:
      case TokenKind.UNIT_LENGTH_MM:
      case TokenKind.UNIT_LENGTH_IN:
      case TokenKind.UNIT_LENGTH_PT:
      case TokenKind.UNIT_LENGTH_PC:
      case TokenKind.UNIT_ANGLE_DEG:
      case TokenKind.UNIT_ANGLE_RAD:
      case TokenKind.UNIT_ANGLE_GRAD:
      case TokenKind.UNIT_TIME_MS:
      case TokenKind.UNIT_TIME_S:
      case TokenKind.UNIT_FREQ_HZ:
      case TokenKind.UNIT_FREQ_KHZ:
      case TokenKind.UNIT_FRACTION:
        return true;
      default:
        return false;
    }
  }

  static bool isIdentifier(int kind) {
    return kind == IDENTIFIER;
  }
}

// Note: these names should match TokenKind names
class TokenChar {
  static const int UNUSED = -1;
  static const int END_OF_FILE = 0;
  static const int LPAREN = 0x28; // "(".codeUnitAt(0)
  static const int RPAREN = 0x29; // ")".codeUnitAt(0)
  static const int LBRACK = 0x5b; // "[".codeUnitAt(0)
  static const int RBRACK = 0x5d; // "]".codeUnitAt(0)
  static const int LBRACE = 0x7b; // "{".codeUnitAt(0)
  static const int RBRACE = 0x7d; // "}".codeUnitAt(0)
  static const int DOT = 0x2e; // ".".codeUnitAt(0)
  static const int SEMICOLON = 0x3b; // ";".codeUnitAt(0)
  static const int AT = 0x40; // "@".codeUnitAt(0)
  static const int HASH = 0x23; // "#".codeUnitAt(0)
  static const int PLUS = 0x2b; // "+".codeUnitAt(0)
  static const int GREATER = 0x3e; // ">".codeUnitAt(0)
  static const int TILDE = 0x7e; // "~".codeUnitAt(0)
  static const int ASTERISK = 0x2a; // "*".codeUnitAt(0)
  static const int NAMESPACE = 0x7c; // "|".codeUnitAt(0)
  static const int COLON = 0x3a; // ":".codeUnitAt(0)
  static const int PRIVATE_NAME = 0x5f; // "_".codeUnitAt(0)
  static const int COMMA = 0x2c; // ",".codeUnitAt(0)
  static const int SPACE = 0x20; // " ".codeUnitAt(0)
  static const int TAB = 0x9; // "\t".codeUnitAt(0)
  static const int NEWLINE = 0xa; // "\n".codeUnitAt(0)
  static const int RETURN = 0xd; // "\r".codeUnitAt(0)
  static const int BACKSPACE = 0x8; // "/b".codeUnitAt(0)
  static const int FF = 0xc; // "/f".codeUnitAt(0)
  static const int VT = 0xb; // "/v".codeUnitAt(0)
  static const int PERCENT = 0x25; // "%".codeUnitAt(0)
  static const int SINGLE_QUOTE = 0x27; // "'".codeUnitAt(0)
  static const int DOUBLE_QUOTE = 0x22; // '"'.codeUnitAt(0)
  static const int SLASH = 0x2f; // "/".codeUnitAt(0)
  static const int EQUALS = 0x3d; // "=".codeUnitAt(0)
  static const int OR = 0x7c; // "|".codeUnitAt(0)
  static const int CARET = 0x5e; // "^".codeUnitAt(0)
  static const int DOLLAR = 0x24; // "\$".codeUnitAt(0)
  static const int LESS = 0x3c; // "<".codeUnitAt(0)
  static const int BANG = 0x21; // "!".codeUnitAt(0)
  static const int MINUS = 0x2d; // "-".codeUnitAt(0)
  static const int BACKSLASH = 0x5c; // "\".codeUnitAt(0)
  static const int AMPERSAND = 0x26; // "&".codeUnitAt(0)
}
