• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1"use strict";
2
3exports.__esModule = true;
4exports.FIELDS = void 0;
5exports["default"] = tokenize;
6var t = _interopRequireWildcard(require("./tokenTypes"));
7var _unescapable, _wordDelimiters;
8function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
9function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
10var unescapable = (_unescapable = {}, _unescapable[t.tab] = true, _unescapable[t.newline] = true, _unescapable[t.cr] = true, _unescapable[t.feed] = true, _unescapable);
11var wordDelimiters = (_wordDelimiters = {}, _wordDelimiters[t.space] = true, _wordDelimiters[t.tab] = true, _wordDelimiters[t.newline] = true, _wordDelimiters[t.cr] = true, _wordDelimiters[t.feed] = true, _wordDelimiters[t.ampersand] = true, _wordDelimiters[t.asterisk] = true, _wordDelimiters[t.bang] = true, _wordDelimiters[t.comma] = true, _wordDelimiters[t.colon] = true, _wordDelimiters[t.semicolon] = true, _wordDelimiters[t.openParenthesis] = true, _wordDelimiters[t.closeParenthesis] = true, _wordDelimiters[t.openSquare] = true, _wordDelimiters[t.closeSquare] = true, _wordDelimiters[t.singleQuote] = true, _wordDelimiters[t.doubleQuote] = true, _wordDelimiters[t.plus] = true, _wordDelimiters[t.pipe] = true, _wordDelimiters[t.tilde] = true, _wordDelimiters[t.greaterThan] = true, _wordDelimiters[t.equals] = true, _wordDelimiters[t.dollar] = true, _wordDelimiters[t.caret] = true, _wordDelimiters[t.slash] = true, _wordDelimiters);
12var hex = {};
13var hexChars = "0123456789abcdefABCDEF";
14for (var i = 0; i < hexChars.length; i++) {
15  hex[hexChars.charCodeAt(i)] = true;
16}
17
18/**
19 *  Returns the last index of the bar css word
20 * @param {string} css The string in which the word begins
21 * @param {number} start The index into the string where word's first letter occurs
22 */
23function consumeWord(css, start) {
24  var next = start;
25  var code;
26  do {
27    code = css.charCodeAt(next);
28    if (wordDelimiters[code]) {
29      return next - 1;
30    } else if (code === t.backslash) {
31      next = consumeEscape(css, next) + 1;
32    } else {
33      // All other characters are part of the word
34      next++;
35    }
36  } while (next < css.length);
37  return next - 1;
38}
39
40/**
41 *  Returns the last index of the escape sequence
42 * @param {string} css The string in which the sequence begins
43 * @param {number} start The index into the string where escape character (`\`) occurs.
44 */
45function consumeEscape(css, start) {
46  var next = start;
47  var code = css.charCodeAt(next + 1);
48  if (unescapable[code]) {
49    // just consume the escape char
50  } else if (hex[code]) {
51    var hexDigits = 0;
52    // consume up to 6 hex chars
53    do {
54      next++;
55      hexDigits++;
56      code = css.charCodeAt(next + 1);
57    } while (hex[code] && hexDigits < 6);
58    // if fewer than 6 hex chars, a trailing space ends the escape
59    if (hexDigits < 6 && code === t.space) {
60      next++;
61    }
62  } else {
63    // the next char is part of the current word
64    next++;
65  }
66  return next;
67}
68var FIELDS = {
69  TYPE: 0,
70  START_LINE: 1,
71  START_COL: 2,
72  END_LINE: 3,
73  END_COL: 4,
74  START_POS: 5,
75  END_POS: 6
76};
77exports.FIELDS = FIELDS;
78function tokenize(input) {
79  var tokens = [];
80  var css = input.css.valueOf();
81  var _css = css,
82    length = _css.length;
83  var offset = -1;
84  var line = 1;
85  var start = 0;
86  var end = 0;
87  var code, content, endColumn, endLine, escaped, escapePos, last, lines, next, nextLine, nextOffset, quote, tokenType;
88  function unclosed(what, fix) {
89    if (input.safe) {
90      // fyi: this is never set to true.
91      css += fix;
92      next = css.length - 1;
93    } else {
94      throw input.error('Unclosed ' + what, line, start - offset, start);
95    }
96  }
97  while (start < length) {
98    code = css.charCodeAt(start);
99    if (code === t.newline) {
100      offset = start;
101      line += 1;
102    }
103    switch (code) {
104      case t.space:
105      case t.tab:
106      case t.newline:
107      case t.cr:
108      case t.feed:
109        next = start;
110        do {
111          next += 1;
112          code = css.charCodeAt(next);
113          if (code === t.newline) {
114            offset = next;
115            line += 1;
116          }
117        } while (code === t.space || code === t.newline || code === t.tab || code === t.cr || code === t.feed);
118        tokenType = t.space;
119        endLine = line;
120        endColumn = next - offset - 1;
121        end = next;
122        break;
123      case t.plus:
124      case t.greaterThan:
125      case t.tilde:
126      case t.pipe:
127        next = start;
128        do {
129          next += 1;
130          code = css.charCodeAt(next);
131        } while (code === t.plus || code === t.greaterThan || code === t.tilde || code === t.pipe);
132        tokenType = t.combinator;
133        endLine = line;
134        endColumn = start - offset;
135        end = next;
136        break;
137
138      // Consume these characters as single tokens.
139      case t.asterisk:
140      case t.ampersand:
141      case t.bang:
142      case t.comma:
143      case t.equals:
144      case t.dollar:
145      case t.caret:
146      case t.openSquare:
147      case t.closeSquare:
148      case t.colon:
149      case t.semicolon:
150      case t.openParenthesis:
151      case t.closeParenthesis:
152        next = start;
153        tokenType = code;
154        endLine = line;
155        endColumn = start - offset;
156        end = next + 1;
157        break;
158      case t.singleQuote:
159      case t.doubleQuote:
160        quote = code === t.singleQuote ? "'" : '"';
161        next = start;
162        do {
163          escaped = false;
164          next = css.indexOf(quote, next + 1);
165          if (next === -1) {
166            unclosed('quote', quote);
167          }
168          escapePos = next;
169          while (css.charCodeAt(escapePos - 1) === t.backslash) {
170            escapePos -= 1;
171            escaped = !escaped;
172          }
173        } while (escaped);
174        tokenType = t.str;
175        endLine = line;
176        endColumn = start - offset;
177        end = next + 1;
178        break;
179      default:
180        if (code === t.slash && css.charCodeAt(start + 1) === t.asterisk) {
181          next = css.indexOf('*/', start + 2) + 1;
182          if (next === 0) {
183            unclosed('comment', '*/');
184          }
185          content = css.slice(start, next + 1);
186          lines = content.split('\n');
187          last = lines.length - 1;
188          if (last > 0) {
189            nextLine = line + last;
190            nextOffset = next - lines[last].length;
191          } else {
192            nextLine = line;
193            nextOffset = offset;
194          }
195          tokenType = t.comment;
196          line = nextLine;
197          endLine = nextLine;
198          endColumn = next - nextOffset;
199        } else if (code === t.slash) {
200          next = start;
201          tokenType = code;
202          endLine = line;
203          endColumn = start - offset;
204          end = next + 1;
205        } else {
206          next = consumeWord(css, start);
207          tokenType = t.word;
208          endLine = line;
209          endColumn = next - offset;
210        }
211        end = next + 1;
212        break;
213    }
214
215    // Ensure that the token structure remains consistent
216    tokens.push([tokenType,
217    // [0] Token type
218    line,
219    // [1] Starting line
220    start - offset,
221    // [2] Starting column
222    endLine,
223    // [3] Ending line
224    endColumn,
225    // [4] Ending column
226    start,
227    // [5] Start position / Source index
228    end // [6] End position
229    ]);
230
231    // Reset offset for the next token
232    if (nextOffset) {
233      offset = nextOffset;
234      nextOffset = null;
235    }
236    start = end;
237  }
238  return tokens;
239}