'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; loop: 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 { break loop; } 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]); pos += 2; 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\n', pos + 2); next = next > 0 ? next : css.length; tokens.push(['scssComment', css.slice(pos, next), 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: tokens, pos: pos }; }