| '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 }; |
| } |