| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302 | 'use strict';exports.__esModule = true;exports.default = tokenize;var _input = require('./input');var _input2 = _interopRequireDefault(_input);var _tokenizeString2 = require('./tokenize-string');var _tokenizeString3 = _interopRequireDefault(_tokenizeString2);var _tokenizeComment2 = require('./tokenize-comment');var _tokenizeComment3 = _interopRequireDefault(_tokenizeComment2);var _tokenizeInterpolant2 = require('./tokenize-interpolant');var _tokenizeInterpolant3 = _interopRequireDefault(_tokenizeInterpolant2);function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }var singleQuote = "'".charCodeAt(0),    doubleQuote = '"'.charCodeAt(0),    dollar = '$'.charCodeAt(0),    hash = '#'.charCodeAt(0),    backslash = '\\'.charCodeAt(0),    slash = '/'.charCodeAt(0),    newline = '\n'.charCodeAt(0),    space = ' '.charCodeAt(0),    feed = '\f'.charCodeAt(0),    tab = '\t'.charCodeAt(0),    cr = '\r'.charCodeAt(0),    openBracket = '('.charCodeAt(0),    closeBracket = ')'.charCodeAt(0),    openCurly = '{'.charCodeAt(0),    closeCurly = '}'.charCodeAt(0),    semicolon = ';'.charCodeAt(0),    asterisk = '*'.charCodeAt(0),    colon = ':'.charCodeAt(0),    at = '@'.charCodeAt(0),    comma = ','.charCodeAt(0),    plus = '+'.charCodeAt(0),    minus = '-'.charCodeAt(0),    decComb = '>'.charCodeAt(0),    adjComb = '~'.charCodeAt(0),    number = /[+-]?(\d+(\.\d+)?|\.\d+)|(e[+-]\d+)/gi,    sQuoteEnd = /(.*?)[^\\](?=((#{)|'))/gm,    dQuoteEnd = /(.*?)[^\\](?=((#{)|"))/gm,    wordEnd = /[ \n\t\r\(\)\{\},:;@!'"\\]|\/(?=\*)|#(?={)/g,    ident = /-?([a-z_]|\\[^\\])([a-z-_0-9]|\\[^\\])*/gi;function tokenize(input, l, p) {    var tokens = [];    var css = input.css.valueOf();    var code = void 0,        next = void 0,        quote = void 0,        lines = void 0,        last = void 0,        content = void 0,        escape = void 0,        nextLine = void 0,        nextOffset = void 0,        escaped = void 0,        escapePos = void 0,        inInterpolant = void 0,        inComment = void 0,        inString = void 0;    var length = css.length;    var offset = -1;    var line = l || 1;    var pos = p || 0;    while (pos < length) {        code = css.charCodeAt(pos);        if (code === newline) {            offset = pos;            line += 1;        }        switch (code) {            case space:            case tab:            case cr:            case feed:                next = pos;                do {                    next += 1;                    code = css.charCodeAt(next);                    if (code === newline) {                        offset = next;                        line += 1;                    }                } while (code === space || code === tab || code === cr || code === feed);                tokens.push(['space', css.slice(pos, next)]);                pos = next - 1;                break;            case newline:                tokens.push(['newline', '\n', line, pos - offset]);                break;            case plus:                tokens.push(['+', '+', line, pos - offset]);                break;            case minus:                tokens.push(['-', '-', line, pos - offset]);                break;            case decComb:                tokens.push(['>', '>', line, pos - offset]);                break;            case adjComb:                tokens.push(['~', '~', line, pos - offset]);                break;            case openCurly:                tokens.push(['{', '{', line, pos - offset]);                break;            case closeCurly:                if (inInterpolant) {                    inInterpolant = false;                    tokens.push(['endInterpolant', '}', line, pos - offset]);                } else {                    tokens.push(['}', '}', line, pos - offset]);                }                break;            case comma:                tokens.push([',', ',', line, pos - offset]);                break;            case dollar:                tokens.push(['$', '$', line, pos - offset]);                break;            case colon:                tokens.push([':', ':', line, pos - offset]);                break;            case semicolon:                tokens.push([';', ';', line, pos - offset]);                break;            case openBracket:                tokens.push(['(', '(', line, pos - offset]);                break;            case closeBracket:                tokens.push([')', ')', line, pos - offset]);                break;            case singleQuote:            case doubleQuote:                quote = code === singleQuote ? "'" : '"';                tokens.push([quote, quote, line, pos - offset]);                next = pos + 1;                var _tokenizeString = (0, _tokenizeString3.default)(input, line, next, quote),                    t = _tokenizeString.tokens,                    _p = _tokenizeString.pos;                tokens = tokens.concat(t);                next = _p;                pos = next;                break;            case at:                tokens.push(['@', '@', line, pos - offset]);                break;            case backslash:                next = pos;                escape = true;                while (css.charCodeAt(next + 1) === backslash) {                    next += 1;                    escape = !escape;                }                code = css.charCodeAt(next + 1);                if (escape && code !== space && code !== newline && code !== tab && code !== cr && code !== feed) {                    next += 1;                }                tokens.push(['word', css.slice(pos, next + 1), line, pos - offset, line, next - offset]);                pos = next;                break;            default:                ident.lastIndex = pos;                number.lastIndex = pos;                wordEnd.lastIndex = pos;                if (code === slash && css.charCodeAt(pos + 1) === asterisk) {                    inComment = true;                    tokens.push(['startComment', '/*', line, pos + 1 - offset]);                    next = pos + 1;                    var _tokenizeComment = (0, _tokenizeComment3.default)(input, line, next + 1),                        _t = _tokenizeComment.tokens,                        _l = _tokenizeComment.line,                        _p2 = _tokenizeComment.pos,                        o = _tokenizeComment.offset;                    tokens = tokens.concat(_t);                    next = _p2;                    line = _l;                    offset = o;                    pos = next;                    break;                }                if (code === asterisk && css.charCodeAt(pos + 1) !== slash) {                    tokens.push(['*', '*', line, pos - offset]);                    break;                }                if (inComment && code === asterisk && css.charCodeAt(pos + 1) === slash) {                    inComment = false;                    tokens.push(['endComment', '*/', line, pos + 1 - offset]);                    pos += 2;                    break;                }                if (code === slash && css.charCodeAt(pos + 1) !== slash) {                    tokens.push(['/', '/', line, pos - offset]);                    break;                }                if (code === hash && css.charCodeAt(pos + 1) === openCurly) {                    inInterpolant = true;                    tokens.push(['startInterpolant', '#{', line, pos + 1 - offset]);                    next = pos + 1;                    var _tokenizeInterpolant = (0, _tokenizeInterpolant3.default)(input, line, next + 1),                        _t2 = _tokenizeInterpolant.tokens,                        _p3 = _tokenizeInterpolant.pos;                    tokens = tokens.concat(_t2);                    next = _p3;                    pos = next;                    break;                }                if (code === slash && css.charCodeAt(pos + 1) === slash) {                    next = css.indexOf('\n', pos + 2);                    next = (next > 0 ? next : css.length) - 1;                    tokens.push(['scssComment', css.slice(pos, next + 1), line, pos - offset, line, next - offset]);                    pos = next;                    break;                }                if (ident.test(css) && (ident.lastIndex = pos || 1) && ident.exec(css).index === pos) {                    next = ident.lastIndex - 1;                    tokens.push(['ident', css.slice(pos, next + 1), line, pos - offset, line, next - offset]);                    pos = next;                    break;                }                if (number.test(css) && (number.lastIndex = pos || 1) && number.exec(css).index === pos) {                    next = number.lastIndex - 1;                    tokens.push(['number', css.slice(pos, next + 1), line, pos - offset, line, next - offset]);                    pos = next;                    break;                }                wordEnd.lastIndex = pos + 1;                wordEnd.test(css);                if (wordEnd.lastIndex === 0) {                    next = css.length - 1;                } else {                    next = wordEnd.lastIndex - 2;                }                tokens.push(['word', css.slice(pos, next + 1), line, pos - offset, line, next - offset]);                pos = next;                break;        }        pos++;    }    return tokens;}
 |