123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 |
- 'use strict';
- exports.__esModule = true;
- exports.default = tokenize;
- var singleQuote = 39,
- doubleQuote = 34,
- backslash = 92,
- slash = 47,
- newline = 10,
- space = 32,
- feed = 12,
- tab = 9,
- cr = 13,
- plus = 43,
- gt = 62,
- tilde = 126,
- pipe = 124,
- comma = 44,
- openBracket = 40,
- closeBracket = 41,
- openSq = 91,
- closeSq = 93,
- semicolon = 59,
- asterisk = 42,
- colon = 58,
- ampersand = 38,
- at = 64,
- atEnd = /[ \n\t\r\{\(\)'"\\;/]/g,
- wordEnd = /[ \n\t\r\(\)\*:;@!&'"\+\|~>,\[\]\\]|\/(?=\*)/g;
- function tokenize(input) {
- 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;
- var length = css.length;
- var offset = -1;
- var line = 1;
- var pos = 0;
- var unclosed = function unclosed(what, end) {
- if (input.safe) {
- css += end;
- next = css.length - 1;
- } else {
- throw input.error('Unclosed ' + what, line, pos - offset, pos);
- }
- };
- while (pos < length) {
- code = css.charCodeAt(pos);
- if (code === 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);
- tokens.push(['space', css.slice(pos, next), line, pos - offset, pos]);
- pos = next - 1;
- break;
- case plus:
- case gt:
- case tilde:
- case pipe:
- next = pos;
- do {
- next += 1;
- code = css.charCodeAt(next);
- } while (code === plus || code === gt || code === tilde || code === pipe);
- tokens.push(['combinator', css.slice(pos, next), line, pos - offset, pos]);
- pos = next - 1;
- break;
- case asterisk:
- tokens.push(['*', '*', line, pos - offset, pos]);
- break;
- case ampersand:
- tokens.push(['&', '&', line, pos - offset, pos]);
- break;
- case comma:
- tokens.push([',', ',', line, pos - offset, pos]);
- break;
- case openSq:
- tokens.push(['[', '[', line, pos - offset, pos]);
- break;
- case closeSq:
- tokens.push([']', ']', line, pos - offset, pos]);
- break;
- case colon:
- tokens.push([':', ':', line, pos - offset, pos]);
- break;
- case semicolon:
- tokens.push([';', ';', line, pos - offset, pos]);
- break;
- case openBracket:
- tokens.push(['(', '(', line, pos - offset, pos]);
- break;
- case closeBracket:
- tokens.push([')', ')', line, pos - offset, pos]);
- break;
- case singleQuote:
- case doubleQuote:
- quote = code === singleQuote ? "'" : '"';
- next = pos;
- do {
- escaped = false;
- next = css.indexOf(quote, next + 1);
- if (next === -1) {
- unclosed('quote', quote);
- }
- escapePos = next;
- while (css.charCodeAt(escapePos - 1) === backslash) {
- escapePos -= 1;
- escaped = !escaped;
- }
- } while (escaped);
- tokens.push(['string', css.slice(pos, next + 1), line, pos - offset, line, next - offset, pos]);
- pos = next;
- break;
- case at:
- atEnd.lastIndex = pos + 1;
- atEnd.test(css);
- if (atEnd.lastIndex === 0) {
- next = css.length - 1;
- } else {
- next = atEnd.lastIndex - 2;
- }
- tokens.push(['at-word', css.slice(pos, next + 1), line, pos - offset, line, next - offset, pos]);
- 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;
- }
- tokens.push(['word', css.slice(pos, next + 1), line, pos - offset, line, next - offset, pos]);
- pos = next;
- break;
- default:
- if (code === slash && css.charCodeAt(pos + 1) === asterisk) {
- next = css.indexOf('*/', pos + 2) + 1;
- if (next === 0) {
- 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;
- }
- tokens.push(['comment', content, line, pos - offset, nextLine, next - nextOffset, pos]);
- offset = nextOffset;
- line = nextLine;
- pos = next;
- } else {
- 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]);
- pos = next;
- }
- break;
- }
- pos++;
- }
- return tokens;
- }
- module.exports = exports['default'];
|