const charCodeDef = require('./char-code-definitions'); function fillCodeTypes(array, check, type) { for (var i = 0; i < array.length; i++) { if (check(i)) { array[i] = type; } } } // CSS Syntax Module Level 3 // https://www.w3.org/TR/css-syntax-3/ var TYPE = { Ident: 1, // Function: 2, // AtKeyword: 3, // Hash: 4, // String: 5, // BadString: 6, // Url: 7, // BadUrl: 8, // Delim: 9, // Number: 10, // Percentage: 11, // Dimension: 12, // WhiteSpace: 13, // CDO: 14, // CDC: 15, // Colon: 16, // : Semicolon: 17, // ; Comma: 18, // , LeftSquareBracket: 19, // <[-token> RightSquareBracket: 20, // <]-token> LeftParenthesis: 21, // <(-token> RightParenthesis: 22, // <)-token> LeftCurlyBracket: 23, // <{-token> RightCurlyBracket: 24, // <}-token> Comment: 25 }; var NAME = Object.keys(TYPE).reduce(function(result, key) { result[TYPE[key]] = key; return result; }, {}); var CHARCODE = { Tab: 9, // \t LineFeed: 10, // \n FormFeed: 12, // \f CarriageReturn: 13, // \r Space: 32, ExclamationMark: 33, // ! QuotationMark: 34, // " NumberSign: 35, // # DollarSign: 36, // $ PercentSign: 37, // % Ampersand: 38, // & Apostrophe: 39, // ' LeftParenthesis: 40, // ( RightParenthesis: 41, // ) Asterisk: 42, // * PlusSign: 43, // + Comma: 44, // , HyphenMinus: 45, // - FullStop: 46, // . Solidus: 47, // / Colon: 58, // : Semicolon: 59, // ; LessThanSign: 60, // < EqualsSign: 61, // = GreaterThanSign: 62, // > QuestionMark: 63, // ? CommercialAt: 64, // @ LeftSquareBracket: 91, // [ Backslash: 92, // \ RightSquareBracket: 93, // ] CircumflexAccent: 94, // ^ LowLine: 95, // _ GraveAccent: 96, // ` LeftCurlyBracket: 123, // { VerticalLine: 124, // | RightCurlyBracket: 125, // } Tilde: 126 // ~ }; var INPUT_STREAM_CODE_TYPE = { Eof: 0x80, Delim: 0x81, WhiteSpace: 0x82, Digit: 0x83, NameStart: 0x84, NonPrintable: 0x85, Newline: 0x86 }; // https://drafts.csswg.org/css-syntax/#tokenizer-definitions // > non-ASCII code point // > A code point with a value equal to or greater than U+0080 // > name-start code point // > A letter, a non-ASCII code point, or U+005F LOW LINE (_). // > name code point // > A name-start code point, a digit, or U+002D HYPHEN-MINUS (-) // That means only ASCII code points has a special meaning and we define a maps for 0..127 codes only var SafeUint32Array = typeof Uint32Array !== 'undefined' ? Uint32Array : Array; // fallback on Array when TypedArray is not supported var INPUT_STREAM_CODE = new SafeUint32Array(0x80); var INPUT_STREAM_CODE_STRING = new SafeUint32Array(0x80); var INPUT_STREAM_CODE_URL = new SafeUint32Array(0x80); for (var i = 0; i < INPUT_STREAM_CODE.length; i++) { INPUT_STREAM_CODE_STRING[i] = INPUT_STREAM_CODE_URL[i] = INPUT_STREAM_CODE[i] = i || INPUT_STREAM_CODE_TYPE.Eof; } fillCodeTypes(INPUT_STREAM_CODE, charCodeDef.isWhiteSpace, INPUT_STREAM_CODE_TYPE.WhiteSpace); fillCodeTypes(INPUT_STREAM_CODE, charCodeDef.isDigit, INPUT_STREAM_CODE_TYPE.Digit); fillCodeTypes(INPUT_STREAM_CODE, charCodeDef.isNameStart, INPUT_STREAM_CODE_TYPE.NameStart); fillCodeTypes(INPUT_STREAM_CODE_STRING, charCodeDef.isNewline, INPUT_STREAM_CODE_TYPE.Newline); fillCodeTypes(INPUT_STREAM_CODE_URL, charCodeDef.isWhiteSpace, INPUT_STREAM_CODE_TYPE.WhiteSpace); fillCodeTypes(INPUT_STREAM_CODE_URL, charCodeDef.isNonPrintable, INPUT_STREAM_CODE_TYPE.NonPrintable); module.exports = { TYPE: TYPE, NAME: NAME, CHARCODE: CHARCODE, INPUT_STREAM_CODE: INPUT_STREAM_CODE, INPUT_STREAM_CODE_STRING: INPUT_STREAM_CODE_STRING, INPUT_STREAM_CODE_URL: INPUT_STREAM_CODE_URL, INPUT_STREAM_CODE_TYPE: INPUT_STREAM_CODE_TYPE };