411 lines
39 KiB
JavaScript
411 lines
39 KiB
JavaScript
|
|
'use strict';
|
||
|
|
|
||
|
|
var SINGLE_QUOTE = 39;
|
||
|
|
var DOUBLE_QUOTE = 34;
|
||
|
|
var BACKSLASH = 92;
|
||
|
|
var SLASH = 47;
|
||
|
|
var NEWLINE = 10;
|
||
|
|
var SPACE = 32;
|
||
|
|
var FEED = 12;
|
||
|
|
var TAB = 9;
|
||
|
|
var CR = 13;
|
||
|
|
var OPEN_SQUARE = 91;
|
||
|
|
var CLOSE_SQUARE = 93;
|
||
|
|
var OPEN_PARENTHESES = 40;
|
||
|
|
var CLOSE_PARENTHESES = 41;
|
||
|
|
var OPEN_CURLY = 123;
|
||
|
|
var CLOSE_CURLY = 125;
|
||
|
|
var SEMICOLON = 59;
|
||
|
|
var ASTERISK = 42;
|
||
|
|
var COLON = 58;
|
||
|
|
var AT = 64;
|
||
|
|
|
||
|
|
// SCSS PATCH {
|
||
|
|
var COMMA = 44;
|
||
|
|
var HASH = 35;
|
||
|
|
// } SCSS PATCH
|
||
|
|
|
||
|
|
var RE_AT_END = /[ \n\t\r\f{}()'"\\;/[\]#]/g;
|
||
|
|
var RE_WORD_END = /[ \n\t\r\f(){}:;@!'"\\\][#]|\/(?=\*)/g;
|
||
|
|
var RE_BAD_BRACKET = /.[\\/("'\n]/;
|
||
|
|
var RE_HEX_ESCAPE = /[a-f0-9]/i;
|
||
|
|
|
||
|
|
var RE_NEW_LINE = /[\r\f\n]/g; // SCSS PATCH
|
||
|
|
|
||
|
|
// SCSS PATCH function name was changed
|
||
|
|
module.exports = function scssTokenize(input) {
|
||
|
|
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
||
|
|
|
||
|
|
var css = input.css.valueOf();
|
||
|
|
var ignore = options.ignoreErrors;
|
||
|
|
|
||
|
|
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,
|
||
|
|
prev = void 0,
|
||
|
|
n = void 0,
|
||
|
|
currentToken = void 0;
|
||
|
|
|
||
|
|
var brackets = void 0; // SCSS PATCH
|
||
|
|
|
||
|
|
var length = css.length;
|
||
|
|
var offset = -1;
|
||
|
|
var line = 1;
|
||
|
|
var pos = 0;
|
||
|
|
var buffer = [];
|
||
|
|
var returned = [];
|
||
|
|
|
||
|
|
function unclosed(what) {
|
||
|
|
throw input.error('Unclosed ' + what, line, pos - offset);
|
||
|
|
}
|
||
|
|
|
||
|
|
function endOfFile() {
|
||
|
|
return returned.length === 0 && pos >= length;
|
||
|
|
}
|
||
|
|
|
||
|
|
// SCSS PATCH {
|
||
|
|
function interpolation() {
|
||
|
|
var deep = 1;
|
||
|
|
var stringQuote = false;
|
||
|
|
var stringEscaped = false;
|
||
|
|
while (deep > 0) {
|
||
|
|
next += 1;
|
||
|
|
if (css.length <= next) unclosed('interpolation');
|
||
|
|
|
||
|
|
code = css.charCodeAt(next);
|
||
|
|
n = css.charCodeAt(next + 1);
|
||
|
|
|
||
|
|
if (stringQuote) {
|
||
|
|
if (!stringEscaped && code === stringQuote) {
|
||
|
|
stringQuote = false;
|
||
|
|
stringEscaped = false;
|
||
|
|
} else if (code === BACKSLASH) {
|
||
|
|
stringEscaped = !escaped;
|
||
|
|
} else if (stringEscaped) {
|
||
|
|
stringEscaped = false;
|
||
|
|
}
|
||
|
|
} else if (code === SINGLE_QUOTE || code === DOUBLE_QUOTE) {
|
||
|
|
stringQuote = code;
|
||
|
|
} else if (code === CLOSE_CURLY) {
|
||
|
|
deep -= 1;
|
||
|
|
} else if (code === HASH && n === OPEN_CURLY) {
|
||
|
|
deep += 1;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
// } SCSS PATCH
|
||
|
|
|
||
|
|
function nextToken() {
|
||
|
|
if (returned.length) return returned.pop();
|
||
|
|
if (pos >= length) return;
|
||
|
|
|
||
|
|
code = css.charCodeAt(pos);
|
||
|
|
if (code === NEWLINE || code === FEED || code === CR && css.charCodeAt(pos + 1) !== NEWLINE) {
|
||
|
|
offset = pos;
|
||
|
|
line += 1;
|
||
|
|
}
|
||
|
|
|
||
|
|
switch (code) {
|
||
|
|
case NEWLINE:
|
||
|
|
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 === NEWLINE || code === TAB || code === CR || code === FEED);
|
||
|
|
|
||
|
|
currentToken = ['space', css.slice(pos, next)];
|
||
|
|
pos = next - 1;
|
||
|
|
break;
|
||
|
|
|
||
|
|
case OPEN_SQUARE:
|
||
|
|
currentToken = ['[', '[', line, pos - offset];
|
||
|
|
break;
|
||
|
|
|
||
|
|
case CLOSE_SQUARE:
|
||
|
|
currentToken = [']', ']', line, pos - offset];
|
||
|
|
break;
|
||
|
|
|
||
|
|
case OPEN_CURLY:
|
||
|
|
currentToken = ['{', '{', line, pos - offset];
|
||
|
|
break;
|
||
|
|
|
||
|
|
case CLOSE_CURLY:
|
||
|
|
currentToken = ['}', '}', line, pos - offset];
|
||
|
|
break;
|
||
|
|
|
||
|
|
// SCSS PATCH {
|
||
|
|
case COMMA:
|
||
|
|
currentToken = ['word', ',', line, pos - offset, line, pos - offset + 1];
|
||
|
|
break;
|
||
|
|
// } SCSS PATCH
|
||
|
|
|
||
|
|
case COLON:
|
||
|
|
currentToken = [':', ':', line, pos - offset];
|
||
|
|
break;
|
||
|
|
|
||
|
|
case SEMICOLON:
|
||
|
|
currentToken = [';', ';', line, pos - offset];
|
||
|
|
break;
|
||
|
|
|
||
|
|
case OPEN_PARENTHESES:
|
||
|
|
prev = buffer.length ? buffer.pop()[1] : '';
|
||
|
|
n = css.charCodeAt(pos + 1);
|
||
|
|
|
||
|
|
// SCSS PATCH {
|
||
|
|
if (prev === 'url' && n !== SINGLE_QUOTE && n !== DOUBLE_QUOTE) {
|
||
|
|
brackets = 1;
|
||
|
|
escaped = false;
|
||
|
|
next = pos + 1;
|
||
|
|
while (next <= css.length - 1) {
|
||
|
|
n = css.charCodeAt(next);
|
||
|
|
if (n === BACKSLASH) {
|
||
|
|
escaped = !escaped;
|
||
|
|
} else if (n === OPEN_PARENTHESES) {
|
||
|
|
brackets += 1;
|
||
|
|
} else if (n === CLOSE_PARENTHESES) {
|
||
|
|
brackets -= 1;
|
||
|
|
if (brackets === 0) break;
|
||
|
|
}
|
||
|
|
next += 1;
|
||
|
|
}
|
||
|
|
|
||
|
|
content = css.slice(pos, next + 1);
|
||
|
|
lines = content.split('\n');
|
||
|
|
last = lines.length - 1;
|
||
|
|
|
||
|
|
if (last > 0) {
|
||
|
|
nextLine = line + last;
|
||
|
|
nextOffset = next - lines[last].length;
|
||
|
|
} else {
|
||
|
|
nextLine = line;
|
||
|
|
nextOffset = offset;
|
||
|
|
}
|
||
|
|
|
||
|
|
currentToken = ['brackets', content, line, pos - offset, nextLine, next - nextOffset];
|
||
|
|
|
||
|
|
offset = nextOffset;
|
||
|
|
line = nextLine;
|
||
|
|
pos = next;
|
||
|
|
// } SCSS PATCH
|
||
|
|
} else {
|
||
|
|
next = css.indexOf(')', pos + 1);
|
||
|
|
content = css.slice(pos, next + 1);
|
||
|
|
|
||
|
|
if (next === -1 || RE_BAD_BRACKET.test(content)) {
|
||
|
|
currentToken = ['(', '(', line, pos - offset];
|
||
|
|
} else {
|
||
|
|
currentToken = ['brackets', content, line, pos - offset, line, next - offset];
|
||
|
|
pos = next;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
break;
|
||
|
|
|
||
|
|
case CLOSE_PARENTHESES:
|
||
|
|
currentToken = [')', ')', line, pos - offset];
|
||
|
|
break;
|
||
|
|
|
||
|
|
case SINGLE_QUOTE:
|
||
|
|
case DOUBLE_QUOTE:
|
||
|
|
// SCSS PATCH {
|
||
|
|
quote = code;
|
||
|
|
next = pos;
|
||
|
|
|
||
|
|
escaped = false;
|
||
|
|
while (next < length) {
|
||
|
|
next++;
|
||
|
|
if (next === length) unclosed('string');
|
||
|
|
|
||
|
|
code = css.charCodeAt(next);
|
||
|
|
n = css.charCodeAt(next + 1);
|
||
|
|
|
||
|
|
if (!escaped && code === quote) {
|
||
|
|
break;
|
||
|
|
} else if (code === BACKSLASH) {
|
||
|
|
escaped = !escaped;
|
||
|
|
} else if (escaped) {
|
||
|
|
escaped = false;
|
||
|
|
} else if (code === HASH && n === OPEN_CURLY) {
|
||
|
|
interpolation();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
// } SCSS PATCH
|
||
|
|
|
||
|
|
content = css.slice(pos, next + 1);
|
||
|
|
lines = content.split('\n');
|
||
|
|
last = lines.length - 1;
|
||
|
|
|
||
|
|
if (last > 0) {
|
||
|
|
nextLine = line + last;
|
||
|
|
nextOffset = next - lines[last].length;
|
||
|
|
} else {
|
||
|
|
nextLine = line;
|
||
|
|
nextOffset = offset;
|
||
|
|
}
|
||
|
|
|
||
|
|
currentToken = ['string', css.slice(pos, next + 1), line, pos - offset, nextLine, next - nextOffset];
|
||
|
|
|
||
|
|
offset = nextOffset;
|
||
|
|
line = nextLine;
|
||
|
|
pos = next;
|
||
|
|
break;
|
||
|
|
|
||
|
|
case AT:
|
||
|
|
RE_AT_END.lastIndex = pos + 1;
|
||
|
|
RE_AT_END.test(css);
|
||
|
|
if (RE_AT_END.lastIndex === 0) {
|
||
|
|
next = css.length - 1;
|
||
|
|
} else {
|
||
|
|
next = RE_AT_END.lastIndex - 2;
|
||
|
|
}
|
||
|
|
|
||
|
|
currentToken = ['at-word', css.slice(pos, next + 1), line, pos - offset, line, next - offset];
|
||
|
|
|
||
|
|
pos = next;
|
||
|
|
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 !== SLASH && code !== SPACE && code !== NEWLINE && code !== TAB && code !== CR && code !== FEED) {
|
||
|
|
next += 1;
|
||
|
|
if (RE_HEX_ESCAPE.test(css.charAt(next))) {
|
||
|
|
while (RE_HEX_ESCAPE.test(css.charAt(next + 1))) {
|
||
|
|
next += 1;
|
||
|
|
}
|
||
|
|
if (css.charCodeAt(next + 1) === SPACE) {
|
||
|
|
next += 1;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
currentToken = ['word', css.slice(pos, next + 1), line, pos - offset, line, next - offset];
|
||
|
|
|
||
|
|
pos = next;
|
||
|
|
break;
|
||
|
|
|
||
|
|
default:
|
||
|
|
// SCSS PATCH {
|
||
|
|
n = css.charCodeAt(pos + 1);
|
||
|
|
|
||
|
|
if (code === HASH && n === OPEN_CURLY) {
|
||
|
|
next = pos;
|
||
|
|
interpolation();
|
||
|
|
|
||
|
|
content = css.slice(pos, next + 1);
|
||
|
|
lines = content.split('\n');
|
||
|
|
last = lines.length - 1;
|
||
|
|
|
||
|
|
if (last > 0) {
|
||
|
|
nextLine = line + last;
|
||
|
|
nextOffset = next - lines[last].length;
|
||
|
|
} else {
|
||
|
|
nextLine = line;
|
||
|
|
nextOffset = offset;
|
||
|
|
}
|
||
|
|
|
||
|
|
currentToken = ['word', content, line, pos - offset, nextLine, next - nextOffset];
|
||
|
|
|
||
|
|
offset = nextOffset;
|
||
|
|
line = nextLine;
|
||
|
|
pos = next;
|
||
|
|
} else if (code === SLASH && n === ASTERISK) {
|
||
|
|
// } SCSS PATCH
|
||
|
|
next = css.indexOf('*/', pos + 2) + 1;
|
||
|
|
if (next === 0) {
|
||
|
|
if (ignore) {
|
||
|
|
next = css.length;
|
||
|
|
} else {
|
||
|
|
unclosed('comment');
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
content = css.slice(pos, next + 1);
|
||
|
|
lines = content.split('\n');
|
||
|
|
last = lines.length - 1;
|
||
|
|
|
||
|
|
if (last > 0) {
|
||
|
|
nextLine = line + last;
|
||
|
|
nextOffset = next - lines[last].length;
|
||
|
|
} else {
|
||
|
|
nextLine = line;
|
||
|
|
nextOffset = offset;
|
||
|
|
}
|
||
|
|
|
||
|
|
currentToken = ['comment', content, line, pos - offset, nextLine, next - nextOffset];
|
||
|
|
|
||
|
|
offset = nextOffset;
|
||
|
|
line = nextLine;
|
||
|
|
pos = next;
|
||
|
|
|
||
|
|
// SCSS PATCH {
|
||
|
|
} else if (code === SLASH && n === SLASH) {
|
||
|
|
RE_NEW_LINE.lastIndex = pos + 1;
|
||
|
|
RE_NEW_LINE.test(css);
|
||
|
|
if (RE_NEW_LINE.lastIndex === 0) {
|
||
|
|
next = css.length - 1;
|
||
|
|
} else {
|
||
|
|
next = RE_NEW_LINE.lastIndex - 2;
|
||
|
|
}
|
||
|
|
|
||
|
|
content = css.slice(pos, next + 1);
|
||
|
|
|
||
|
|
currentToken = ['comment', content, line, pos - offset, line, next - offset, 'inline'];
|
||
|
|
|
||
|
|
pos = next;
|
||
|
|
// } SCSS PATCH
|
||
|
|
} else {
|
||
|
|
RE_WORD_END.lastIndex = pos + 1;
|
||
|
|
RE_WORD_END.test(css);
|
||
|
|
if (RE_WORD_END.lastIndex === 0) {
|
||
|
|
next = css.length - 1;
|
||
|
|
} else {
|
||
|
|
next = RE_WORD_END.lastIndex - 2;
|
||
|
|
}
|
||
|
|
|
||
|
|
currentToken = ['word', css.slice(pos, next + 1), line, pos - offset, line, next - offset];
|
||
|
|
|
||
|
|
buffer.push(currentToken);
|
||
|
|
|
||
|
|
pos = next;
|
||
|
|
}
|
||
|
|
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
|
||
|
|
pos++;
|
||
|
|
return currentToken;
|
||
|
|
}
|
||
|
|
|
||
|
|
function back(token) {
|
||
|
|
returned.push(token);
|
||
|
|
}
|
||
|
|
|
||
|
|
return {
|
||
|
|
back: back,
|
||
|
|
nextToken: nextToken,
|
||
|
|
endOfFile: endOfFile
|
||
|
|
};
|
||
|
|
};
|
||
|
|
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNjc3MtdG9rZW5pemUuZXM2Il0sIm5hbWVzIjpbIlNJTkdMRV9RVU9URSIsIkRPVUJMRV9RVU9URSIsIkJBQ0tTTEFTSCIsIlNMQVNIIiwiTkVXTElORSIsIlNQQUNFIiwiRkVFRCIsIlRBQiIsIkNSIiwiT1BFTl9TUVVBUkUiLCJDTE9TRV9TUVVBUkUiLCJPUEVOX1BBUkVOVEhFU0VTIiwiQ0xPU0VfUEFSRU5USEVTRVMiLCJPUEVOX0NVUkxZIiwiQ0xPU0VfQ1VSTFkiLCJTRU1JQ09MT04iLCJBU1RFUklTSyIsIkNPTE9OIiwiQVQiLCJDT01NQSIsIkhBU0giLCJSRV9BVF9FTkQiLCJSRV9XT1JEX0VORCIsIlJFX0JBRF9CUkFDS0VUIiwiUkVfSEVYX0VTQ0FQRSIsIlJFX05FV19MSU5FIiwibW9kdWxlIiwiZXhwb3J0cyIsInNjc3NUb2tlbml6ZSIsImlucHV0Iiwib3B0aW9ucyIsImNzcyIsInZhbHVlT2YiLCJpZ25vcmUiLCJpZ25vcmVFcnJvcnMiLCJjb2RlIiwibmV4dCIsInF1b3RlIiwibGluZXMiLCJsYXN0IiwiY29udGVudCIsImVzY2FwZSIsIm5leHRMaW5lIiwibmV4dE9mZnNldCIsImVzY2FwZWQiLCJwcmV2IiwibiIsImN1cnJlbnRUb2tlbiIsImJyYWNrZXRzIiwibGVuZ3RoIiwib2Zmc2V0IiwibGluZSIsInBvcyIsImJ1ZmZlciIsInJldHVybmVkIiwidW5jbG9zZWQiLCJ3aGF0IiwiZXJyb3IiLCJlbmRPZkZpbGUiLCJpbnRlcnBvbGF0aW9uIiwiZGVlcCIsInN0cmluZ1F1b3RlIiwic3RyaW5nRXNjYXBlZCIsImNoYXJDb2RlQXQiLCJuZXh0VG9rZW4iLCJwb3AiLCJzbGljZSIsInNwbGl0IiwiaW5kZXhPZiIsInRlc3QiLCJsYXN0SW5kZXgiLCJjaGFyQXQiLCJwdXNoIiwiYmFjayIsInRva2VuIl0sIm1hcHBpbmdzIjoiOztBQUFBLElBQU1BLGlCQUFOO0FBQ0EsSUFBTUMsaUJBQU47QUFDQSxJQUFNQyxjQUFOO0FBQ0EsSUFB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
|