tokenize-interpolant.js 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. 'use strict';
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = tokenize;
  6. var _input = require('./input');
  7. var _input2 = _interopRequireDefault(_input);
  8. var _tokenizeString2 = require('./tokenize-string');
  9. var _tokenizeString3 = _interopRequireDefault(_tokenizeString2);
  10. var _tokenizeComment2 = require('./tokenize-comment');
  11. var _tokenizeComment3 = _interopRequireDefault(_tokenizeComment2);
  12. var _tokenizeInterpolant2 = require('./tokenize-interpolant');
  13. var _tokenizeInterpolant3 = _interopRequireDefault(_tokenizeInterpolant2);
  14. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  15. var singleQuote = "'".charCodeAt(0),
  16. doubleQuote = '"'.charCodeAt(0),
  17. dollar = '$'.charCodeAt(0),
  18. hash = '#'.charCodeAt(0),
  19. backslash = '\\'.charCodeAt(0),
  20. slash = '/'.charCodeAt(0),
  21. newline = '\n'.charCodeAt(0),
  22. space = ' '.charCodeAt(0),
  23. feed = '\f'.charCodeAt(0),
  24. tab = '\t'.charCodeAt(0),
  25. cr = '\r'.charCodeAt(0),
  26. openBracket = '('.charCodeAt(0),
  27. closeBracket = ')'.charCodeAt(0),
  28. openCurly = '{'.charCodeAt(0),
  29. closeCurly = '}'.charCodeAt(0),
  30. semicolon = ';'.charCodeAt(0),
  31. asterisk = '*'.charCodeAt(0),
  32. colon = ':'.charCodeAt(0),
  33. at = '@'.charCodeAt(0),
  34. comma = ','.charCodeAt(0),
  35. plus = '+'.charCodeAt(0),
  36. minus = '-'.charCodeAt(0),
  37. decComb = '>'.charCodeAt(0),
  38. adjComb = '~'.charCodeAt(0),
  39. number = /[+-]?(\d+(\.\d+)?|\.\d+)|(e[+-]\d+)/gi,
  40. sQuoteEnd = /(.*?)[^\\](?=((#{)|'))/gm,
  41. dQuoteEnd = /(.*?)[^\\](?=((#{)|"))/gm,
  42. wordEnd = /[ \n\t\r\(\)\{\},:;@!'"\\]|\/(?=\*)|#(?={)/g,
  43. ident = /-?([a-z_]|\\[^\\])([a-z-_0-9]|\\[^\\])*/gi;
  44. function tokenize(input, l, p, o) {
  45. var tokens = [];
  46. var css = input.css.valueOf();
  47. var code = void 0,
  48. next = void 0,
  49. quote = void 0,
  50. lines = void 0,
  51. last = void 0,
  52. content = void 0,
  53. escape = void 0,
  54. nextLine = void 0,
  55. nextOffset = void 0,
  56. escaped = void 0,
  57. escapePos = void 0,
  58. inInterpolant = void 0,
  59. inComment = void 0,
  60. inString = void 0;
  61. var length = css.length;
  62. var offset = o || -1;
  63. var line = l || 1;
  64. var pos = p || 0;
  65. loop: while (pos < length) {
  66. code = css.charCodeAt(pos);
  67. if (code === newline) {
  68. offset = pos;
  69. line += 1;
  70. }
  71. switch (code) {
  72. case space:
  73. case tab:
  74. case cr:
  75. case feed:
  76. next = pos;
  77. do {
  78. next += 1;
  79. code = css.charCodeAt(next);
  80. if (code === newline) {
  81. offset = next;
  82. line += 1;
  83. }
  84. } while (code === space || code === tab || code === cr || code === feed);
  85. tokens.push(['space', css.slice(pos, next)]);
  86. pos = next - 1;
  87. break;
  88. case newline:
  89. tokens.push(['newline', '\n', line, pos - offset]);
  90. break;
  91. case plus:
  92. tokens.push(['+', '+', line, pos - offset]);
  93. break;
  94. case minus:
  95. tokens.push(['-', '-', line, pos - offset]);
  96. break;
  97. case decComb:
  98. tokens.push(['>', '>', line, pos - offset]);
  99. break;
  100. case adjComb:
  101. tokens.push(['~', '~', line, pos - offset]);
  102. break;
  103. case openCurly:
  104. tokens.push(['{', '{', line, pos - offset]);
  105. break;
  106. case closeCurly:
  107. tokens.push(['endInterpolant', '}', line, pos - offset]);
  108. break loop;
  109. case comma:
  110. tokens.push([',', ',', line, pos - offset]);
  111. break;
  112. case dollar:
  113. tokens.push(['$', '$', line, pos - offset]);
  114. break;
  115. case colon:
  116. tokens.push([':', ':', line, pos - offset]);
  117. break;
  118. case semicolon:
  119. tokens.push([';', ';', line, pos - offset]);
  120. break;
  121. case openBracket:
  122. tokens.push(['(', '(', line, pos - offset]);
  123. break;
  124. case closeBracket:
  125. tokens.push([')', ')', line, pos - offset]);
  126. break;
  127. case singleQuote:
  128. case doubleQuote:
  129. quote = code === singleQuote ? "'" : '"';
  130. tokens.push([quote, quote, line, pos - offset]);
  131. next = pos + 1;
  132. var _tokenizeString = (0, _tokenizeString3.default)(input, line, next, offset, quote),
  133. t = _tokenizeString.tokens,
  134. _l = _tokenizeString.line,
  135. _p = _tokenizeString.pos,
  136. _o = _tokenizeString.offset;
  137. tokens = tokens.concat(t);
  138. next = _p;
  139. line = _l;
  140. offset = _o;
  141. pos = next;
  142. break;
  143. case at:
  144. tokens.push(['@', '@', line, pos - offset]);
  145. break;
  146. case backslash:
  147. next = pos;
  148. escape = true;
  149. while (css.charCodeAt(next + 1) === backslash) {
  150. next += 1;
  151. escape = !escape;
  152. }
  153. code = css.charCodeAt(next + 1);
  154. if (escape && code !== space && code !== newline && code !== tab && code !== cr && code !== feed) {
  155. next += 1;
  156. }
  157. tokens.push(['word', css.slice(pos, next + 1), line, pos - offset, line, next - offset]);
  158. pos = next;
  159. break;
  160. default:
  161. ident.lastIndex = pos;
  162. number.lastIndex = pos;
  163. wordEnd.lastIndex = pos;
  164. if (code === slash && css.charCodeAt(pos + 1) === asterisk) {
  165. inComment = true;
  166. tokens.push(['startComment', '/*', line, pos + 1 - offset]);
  167. next = pos + 1;
  168. var _tokenizeComment = (0, _tokenizeComment3.default)(input, line, next + 1, offset),
  169. _t = _tokenizeComment.tokens,
  170. _l2 = _tokenizeComment.line,
  171. _p2 = _tokenizeComment.pos,
  172. _o2 = _tokenizeComment.offset;
  173. tokens = tokens.concat(_t);
  174. next = _p2;
  175. line = _l2;
  176. offset = _o2;
  177. pos = next;
  178. break;
  179. }
  180. if (code === asterisk && css.charCodeAt(pos + 1) !== slash) {
  181. tokens.push(['*', '*', line, pos - offset]);
  182. break;
  183. }
  184. if (inComment && code === asterisk && css.charCodeAt(pos + 1) === slash) {
  185. inComment = false;
  186. tokens.push(['endComment', '*/', line, pos + 1 - offset]);
  187. pos += 2;
  188. break;
  189. }
  190. if (code === slash && css.charCodeAt(pos + 1) !== slash) {
  191. tokens.push(['/', '/', line, pos - offset]);
  192. pos += 2;
  193. break;
  194. }
  195. if (code === hash && css.charCodeAt(pos + 1) === openCurly) {
  196. inInterpolant = true;
  197. tokens.push(['startInterpolant', '#{', line, pos + 1 - offset]);
  198. next = pos + 1;
  199. var _tokenizeInterpolant = (0, _tokenizeInterpolant3.default)(input, line, next + 1),
  200. _t2 = _tokenizeInterpolant.tokens,
  201. _p3 = _tokenizeInterpolant.pos;
  202. tokens = tokens.concat(_t2);
  203. next = _p3;
  204. pos = next;
  205. break;
  206. }
  207. if (code === slash && css.charCodeAt(pos + 1) === slash) {
  208. next = css.indexOf('\n\n', pos + 2);
  209. next = next > 0 ? next : css.length;
  210. tokens.push(['scssComment', css.slice(pos, next), line, pos - offset, line, next - offset]);
  211. pos = next;
  212. break;
  213. }
  214. if (ident.test(css) && (ident.lastIndex = pos || 1) && ident.exec(css).index === pos) {
  215. next = ident.lastIndex - 1;
  216. tokens.push(['ident', css.slice(pos, next + 1), line, pos - offset, line, next - offset]);
  217. pos = next;
  218. break;
  219. }
  220. if (number.test(css) && (number.lastIndex = pos || 1) && number.exec(css).index === pos) {
  221. next = number.lastIndex - 1;
  222. tokens.push(['number', css.slice(pos, next + 1), line, pos - offset, line, next - offset]);
  223. pos = next;
  224. break;
  225. }
  226. wordEnd.lastIndex = pos + 1;
  227. wordEnd.test(css);
  228. if (wordEnd.lastIndex === 0) {
  229. next = css.length - 1;
  230. } else {
  231. next = wordEnd.lastIndex - 2;
  232. }
  233. tokens.push(['word', css.slice(pos, next + 1), line, pos - offset, line, next - offset]);
  234. pos = next;
  235. break;
  236. }
  237. pos++;
  238. }
  239. return { tokens: tokens, line: line, pos: pos, offset: offset };
  240. }