forked from zhurui/management
303 lines
9.4 KiB
JavaScript
303 lines
9.4 KiB
JavaScript
|
'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 };
|
||
|
}
|