cc038a7372
NPM Installation / build (16.x, ubuntu-latest) (push) Has been cancelled
NPM Installation / build (16.x, windows-latest) (push) Has been cancelled
NPM Installation / build (17.x, ubuntu-latest) (push) Has been cancelled
NPM Installation / build (17.x, windows-latest) (push) Has been cancelled
NPM Installation / build (18.x, ubuntu-latest) (push) Has been cancelled
NPM Installation / build (18.x, windows-latest) (push) Has been cancelled
301 lines
9.5 KiB
JavaScript
301 lines
9.5 KiB
JavaScript
"use strict";
|
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
if (k2 === undefined) k2 = k;
|
|
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
}
|
|
Object.defineProperty(o, k2, desc);
|
|
}) : (function(o, m, k, k2) {
|
|
if (k2 === undefined) k2 = k;
|
|
o[k2] = m[k];
|
|
}));
|
|
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
}) : function(o, v) {
|
|
o["default"] = v;
|
|
});
|
|
var __importStar = (this && this.__importStar) || (function () {
|
|
var ownKeys = function(o) {
|
|
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
var ar = [];
|
|
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
return ar;
|
|
};
|
|
return ownKeys(o);
|
|
};
|
|
return function (mod) {
|
|
if (mod && mod.__esModule) return mod;
|
|
var result = {};
|
|
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
__setModuleDefault(result, mod);
|
|
return result;
|
|
};
|
|
})();
|
|
var _a, _b;
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.FIELDS = void 0;
|
|
exports.default = tokenize;
|
|
var t = __importStar(require("./tokenTypes"));
|
|
var unescapable = (_a = {},
|
|
_a[t.tab] = true,
|
|
_a[t.newline] = true,
|
|
_a[t.cr] = true,
|
|
_a[t.feed] = true,
|
|
_a);
|
|
var wordDelimiters = (_b = {},
|
|
_b[t.space] = true,
|
|
_b[t.tab] = true,
|
|
_b[t.newline] = true,
|
|
_b[t.cr] = true,
|
|
_b[t.feed] = true,
|
|
_b[t.ampersand] = true,
|
|
_b[t.asterisk] = true,
|
|
_b[t.bang] = true,
|
|
_b[t.comma] = true,
|
|
_b[t.colon] = true,
|
|
_b[t.semicolon] = true,
|
|
_b[t.openParenthesis] = true,
|
|
_b[t.closeParenthesis] = true,
|
|
_b[t.openSquare] = true,
|
|
_b[t.closeSquare] = true,
|
|
_b[t.singleQuote] = true,
|
|
_b[t.doubleQuote] = true,
|
|
_b[t.plus] = true,
|
|
_b[t.pipe] = true,
|
|
_b[t.tilde] = true,
|
|
_b[t.greaterThan] = true,
|
|
_b[t.equals] = true,
|
|
_b[t.dollar] = true,
|
|
_b[t.caret] = true,
|
|
_b[t.slash] = true,
|
|
_b);
|
|
var hex = {};
|
|
var hexChars = "0123456789abcdefABCDEF";
|
|
for (var i = 0; i < hexChars.length; i++) {
|
|
hex[hexChars.charCodeAt(i)] = true;
|
|
}
|
|
/**
|
|
* Returns the last index of the bar css word
|
|
* @param {string} css The string in which the word begins
|
|
* @param {number} start The index into the string where word's first letter occurs
|
|
*/
|
|
function consumeWord(css, start) {
|
|
var next = start;
|
|
var code;
|
|
do {
|
|
code = css.charCodeAt(next);
|
|
if (wordDelimiters[code]) {
|
|
return next - 1;
|
|
}
|
|
else if (code === t.backslash) {
|
|
next = consumeEscape(css, next) + 1;
|
|
}
|
|
else {
|
|
// All other characters are part of the word
|
|
next++;
|
|
}
|
|
} while (next < css.length);
|
|
return next - 1;
|
|
}
|
|
/**
|
|
* Returns the last index of the escape sequence
|
|
* @param {string} css The string in which the sequence begins
|
|
* @param {number} start The index into the string where escape character (`\`) occurs.
|
|
*/
|
|
function consumeEscape(css, start) {
|
|
var next = start;
|
|
var code = css.charCodeAt(next + 1);
|
|
if (unescapable[code]) {
|
|
// just consume the escape char
|
|
}
|
|
else if (hex[code]) {
|
|
var hexDigits = 0;
|
|
// consume up to 6 hex chars
|
|
do {
|
|
next++;
|
|
hexDigits++;
|
|
code = css.charCodeAt(next + 1);
|
|
} while (hex[code] && hexDigits < 6);
|
|
// if fewer than 6 hex chars, a trailing space ends the escape
|
|
if (hexDigits < 6 && code === t.space) {
|
|
next++;
|
|
}
|
|
}
|
|
else {
|
|
// the next char is part of the current word
|
|
next++;
|
|
}
|
|
return next;
|
|
}
|
|
exports.FIELDS = {
|
|
TYPE: 0,
|
|
START_LINE: 1,
|
|
START_COL: 2,
|
|
END_LINE: 3,
|
|
END_COL: 4,
|
|
START_POS: 5,
|
|
END_POS: 6,
|
|
};
|
|
function tokenize(input) {
|
|
var tokens = [];
|
|
var css = input.css.valueOf();
|
|
var length = css.length;
|
|
var offset = -1;
|
|
var line = 1;
|
|
var start = 0;
|
|
var end = 0;
|
|
var code, content, endColumn, endLine, escaped, escapePos, last, lines, next, nextLine, nextOffset, quote, tokenType;
|
|
function unclosed(what, fix) {
|
|
if (input.safe) {
|
|
// fyi: this is never set to true.
|
|
css += fix;
|
|
next = css.length - 1;
|
|
}
|
|
else {
|
|
throw input.error("Unclosed " + what, line, start - offset, start);
|
|
}
|
|
}
|
|
while (start < length) {
|
|
code = css.charCodeAt(start);
|
|
if (code === t.newline) {
|
|
offset = start;
|
|
line += 1;
|
|
}
|
|
switch (code) {
|
|
case t.space:
|
|
case t.tab:
|
|
case t.newline:
|
|
case t.cr:
|
|
case t.feed:
|
|
next = start;
|
|
do {
|
|
next += 1;
|
|
code = css.charCodeAt(next);
|
|
if (code === t.newline) {
|
|
offset = next;
|
|
line += 1;
|
|
}
|
|
} while (code === t.space ||
|
|
code === t.newline ||
|
|
code === t.tab ||
|
|
code === t.cr ||
|
|
code === t.feed);
|
|
tokenType = t.space;
|
|
endLine = line;
|
|
endColumn = next - offset - 1;
|
|
end = next;
|
|
break;
|
|
case t.plus:
|
|
case t.greaterThan:
|
|
case t.tilde:
|
|
case t.pipe:
|
|
next = start;
|
|
do {
|
|
next += 1;
|
|
code = css.charCodeAt(next);
|
|
} while (code === t.plus || code === t.greaterThan || code === t.tilde || code === t.pipe);
|
|
tokenType = t.combinator;
|
|
endLine = line;
|
|
endColumn = start - offset;
|
|
end = next;
|
|
break;
|
|
// Consume these characters as single tokens.
|
|
case t.asterisk:
|
|
case t.ampersand:
|
|
case t.bang:
|
|
case t.comma:
|
|
case t.equals:
|
|
case t.dollar:
|
|
case t.caret:
|
|
case t.openSquare:
|
|
case t.closeSquare:
|
|
case t.colon:
|
|
case t.semicolon:
|
|
case t.openParenthesis:
|
|
case t.closeParenthesis:
|
|
next = start;
|
|
tokenType = code;
|
|
endLine = line;
|
|
endColumn = start - offset;
|
|
end = next + 1;
|
|
break;
|
|
case t.singleQuote:
|
|
case t.doubleQuote:
|
|
quote = code === t.singleQuote ? "'" : '"';
|
|
next = start;
|
|
do {
|
|
escaped = false;
|
|
next = css.indexOf(quote, next + 1);
|
|
if (next === -1) {
|
|
unclosed("quote", quote);
|
|
}
|
|
escapePos = next;
|
|
while (css.charCodeAt(escapePos - 1) === t.backslash) {
|
|
escapePos -= 1;
|
|
escaped = !escaped;
|
|
}
|
|
} while (escaped);
|
|
tokenType = t.str;
|
|
endLine = line;
|
|
endColumn = start - offset;
|
|
end = next + 1;
|
|
break;
|
|
default:
|
|
if (code === t.slash && css.charCodeAt(start + 1) === t.asterisk) {
|
|
next = css.indexOf("*/", start + 2) + 1;
|
|
if (next === 0) {
|
|
unclosed("comment", "*/");
|
|
}
|
|
content = css.slice(start, 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;
|
|
}
|
|
tokenType = t.comment;
|
|
line = nextLine;
|
|
endLine = nextLine;
|
|
endColumn = next - nextOffset;
|
|
}
|
|
else if (code === t.slash) {
|
|
next = start;
|
|
tokenType = code;
|
|
endLine = line;
|
|
endColumn = start - offset;
|
|
end = next + 1;
|
|
}
|
|
else {
|
|
next = consumeWord(css, start);
|
|
tokenType = t.word;
|
|
endLine = line;
|
|
endColumn = next - offset;
|
|
}
|
|
end = next + 1;
|
|
break;
|
|
}
|
|
// Ensure that the token structure remains consistent
|
|
tokens.push([
|
|
tokenType, // [0] Token type
|
|
line, // [1] Starting line
|
|
start - offset, // [2] Starting column
|
|
endLine, // [3] Ending line
|
|
endColumn, // [4] Ending column
|
|
start, // [5] Start position / Source index
|
|
end, // [6] End position
|
|
]);
|
|
// Reset offset for the next token
|
|
if (nextOffset) {
|
|
offset = nextOffset;
|
|
nextOffset = null;
|
|
}
|
|
start = end;
|
|
}
|
|
return tokens;
|
|
}
|
|
//# sourceMappingURL=tokenize.js.map
|