| "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 |