tokenize-string.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  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 _tokenizeString = require('./tokenize-string');
  9. var _tokenizeString2 = _interopRequireDefault(_tokenizeString);
  10. var _tokenizeInterpolant2 = require('./tokenize-interpolant');
  11. var _tokenizeInterpolant3 = _interopRequireDefault(_tokenizeInterpolant2);
  12. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  13. var singleQuote = "'".charCodeAt(0),
  14. doubleQuote = '"'.charCodeAt(0),
  15. newline = '\n'.charCodeAt(0),
  16. space = ' '.charCodeAt(0),
  17. feed = '\f'.charCodeAt(0),
  18. tab = '\t'.charCodeAt(0),
  19. cr = '\r'.charCodeAt(0),
  20. hash = '#'.charCodeAt(0),
  21. backslash = '\\'.charCodeAt(0),
  22. slash = '/'.charCodeAt(0),
  23. openCurly = '{'.charCodeAt(0),
  24. closeCurly = '}'.charCodeAt(0),
  25. interpolantEnd = /([.\s]*?)[^\\](?=(}))/gm,
  26. sQuoteEnd = /([.\s]*?)[^\\](?=((#{)|'))/gm,
  27. dQuoteEnd = /([.\s]*?)[^\\](?=((#{)|"))/gm;
  28. function tokenize(input, l, p, o, quote) {
  29. var tokens = [];
  30. var css = input.css.valueOf();
  31. var code = void 0,
  32. next = void 0,
  33. lines = void 0,
  34. last = void 0,
  35. content = void 0,
  36. escape = void 0,
  37. nextLine = void 0,
  38. nextOffset = void 0,
  39. escaped = void 0,
  40. escapePos = void 0,
  41. inInterpolant = void 0,
  42. inComment = void 0,
  43. inString = void 0;
  44. var length = css.length;
  45. var offset = o || -1;
  46. var line = l || 1;
  47. var pos = p || 0;
  48. var quoteEnd = quote === "'" ? sQuoteEnd : dQuoteEnd;
  49. var quoteChar = quote.charCodeAt(0);
  50. loop: while (pos < length) {
  51. code = css.charCodeAt(pos);
  52. if (code === newline) {
  53. offset = pos;
  54. line += 1;
  55. }
  56. switch (code) {
  57. case closeCurly:
  58. tokens.push(['endInterpolant', '}', line, pos - offset]);
  59. break;
  60. case quoteChar:
  61. tokens.push([quote, quote, line, pos - offset]);
  62. break loop;
  63. case backslash:
  64. next = pos;
  65. escape = true;
  66. while (css.charCodeAt(next + 1) === backslash) {
  67. next += 1;
  68. escape = !escape;
  69. }
  70. code = css.charCodeAt(next + 1);
  71. if (escape && code !== slash && code !== space && code !== newline && code !== tab && code !== cr && code !== feed) {
  72. next += 1;
  73. }
  74. tokens.push(['string', css.slice(pos, next + 1), line, pos - offset, line, next - offset]);
  75. pos = next;
  76. break;
  77. default:
  78. if (code === hash && css.charCodeAt(pos + 1) === openCurly) {
  79. tokens.push(['startInterpolant', '#{', line, pos + 1 - offset]);
  80. next = pos + 1;
  81. var _tokenizeInterpolant = (0, _tokenizeInterpolant3.default)(input, line, next + 1, offset),
  82. t = _tokenizeInterpolant.tokens,
  83. _l = _tokenizeInterpolant.line,
  84. _p = _tokenizeInterpolant.pos,
  85. _o = _tokenizeInterpolant.offset;
  86. tokens = tokens.concat(t);
  87. next = _p;
  88. line = _l;
  89. offset = _o;
  90. pos = next;
  91. } else {
  92. quoteEnd.lastIndex = pos;
  93. quoteEnd.test(css);
  94. if (quoteEnd.lastIndex === 0) {
  95. next = css.length - 1;
  96. } else {
  97. next = quoteEnd.lastIndex - 1;
  98. }
  99. tokens.push(['string', css.slice(pos, next + 1), line, pos - offset, line, next - offset]);
  100. pos = next;
  101. }
  102. break;
  103. }
  104. pos++;
  105. }
  106. return { tokens: tokens, line: line, pos: pos, offset: offset };
  107. }