tokenize-comment.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  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 newline = '\n'.charCodeAt(0),
  14. space = ' '.charCodeAt(0),
  15. feed = '\f'.charCodeAt(0),
  16. tab = '\t'.charCodeAt(0),
  17. cr = '\r'.charCodeAt(0),
  18. hash = '#'.charCodeAt(0),
  19. backslash = '\\'.charCodeAt(0),
  20. slash = '/'.charCodeAt(0),
  21. openCurly = '{'.charCodeAt(0),
  22. closeCurly = '}'.charCodeAt(0),
  23. asterisk = '*'.charCodeAt(0),
  24. wordEnd = /[ \n\t\r\(\)\{\},:;@!'"\\]|\*(?=\/)|#(?={)/g;
  25. function tokenize(input, l, p, o) {
  26. var tokens = [];
  27. var css = input.css.valueOf();
  28. var code = void 0,
  29. next = void 0,
  30. lines = void 0,
  31. last = void 0,
  32. content = void 0,
  33. escape = void 0,
  34. nextLine = void 0,
  35. nextOffset = void 0,
  36. escaped = void 0,
  37. escapePos = void 0,
  38. inInterpolant = void 0,
  39. inComment = void 0,
  40. inString = void 0;
  41. var length = css.length;
  42. var offset = o || -1;
  43. var line = l || 1;
  44. var pos = p || 0;
  45. loop: while (pos < length) {
  46. code = css.charCodeAt(pos);
  47. if (code === newline) {
  48. offset = pos;
  49. line += 1;
  50. }
  51. switch (code) {
  52. case space:
  53. case tab:
  54. case cr:
  55. case feed:
  56. next = pos;
  57. do {
  58. next += 1;
  59. code = css.charCodeAt(next);
  60. if (code === newline) {
  61. offset = next;
  62. line += 1;
  63. }
  64. } while (code === space || code === tab || code === cr || code === feed);
  65. tokens.push(['space', css.slice(pos, next)]);
  66. pos = next - 1;
  67. break;
  68. case newline:
  69. tokens.push(['newline', '\n', line, pos - offset]);
  70. break;
  71. case closeCurly:
  72. tokens.push(['endInterpolant', '}', line, pos - offset]);
  73. break;
  74. case backslash:
  75. next = pos;
  76. escape = true;
  77. while (css.charCodeAt(next + 1) === backslash) {
  78. next += 1;
  79. escape = !escape;
  80. }
  81. code = css.charCodeAt(next + 1);
  82. if (escape && code !== slash && code !== space && code !== newline && code !== tab && code !== cr && code !== feed) {
  83. next += 1;
  84. }
  85. tokens.push(['word', css.slice(pos, next + 1), line, pos - offset, line, next - offset]);
  86. pos = next;
  87. break;
  88. default:
  89. if (code === asterisk && css.charCodeAt(pos + 1) === slash) {
  90. next = pos;
  91. pos = next - 1;
  92. break loop;
  93. }
  94. if (code === hash && css.charCodeAt(pos + 1) === openCurly) {
  95. tokens.push(['startInterpolant', '#{', line, pos + 1 - offset]);
  96. next = pos + 1;
  97. var _tokenizeInterpolant = (0, _tokenizeInterpolant3.default)(input, line, next + 1, offset),
  98. t = _tokenizeInterpolant.tokens,
  99. _l = _tokenizeInterpolant.line,
  100. _p = _tokenizeInterpolant.pos,
  101. _o = _tokenizeInterpolant.offset;
  102. tokens = tokens.concat(t);
  103. next = _p;
  104. line = _l;
  105. offset = _o;
  106. pos = next;
  107. break;
  108. }
  109. wordEnd.lastIndex = pos + 1;
  110. wordEnd.test(css);
  111. if (wordEnd.lastIndex === 0) {
  112. next = css.length - 1;
  113. } else {
  114. next = wordEnd.lastIndex - 2;
  115. }
  116. tokens.push(['word', css.slice(pos, next + 1), line, pos - offset, line, next - offset]);
  117. pos = next;
  118. break;
  119. }
  120. pos++;
  121. }
  122. return { tokens: tokens, line: line, pos: pos, offset: offset };
  123. }