You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							148 lines
						
					
					
						
							4.3 KiB
						
					
					
				
			
		
		
	
	
							148 lines
						
					
					
						
							4.3 KiB
						
					
					
				| 'use strict';
 | |
| 
 | |
| exports.__esModule = true;
 | |
| exports.default = tokenize;
 | |
| 
 | |
| var _input = require('./input');
 | |
| 
 | |
| var _input2 = _interopRequireDefault(_input);
 | |
| 
 | |
| var _tokenizeString = require('./tokenize-string');
 | |
| 
 | |
| var _tokenizeString2 = _interopRequireDefault(_tokenizeString);
 | |
| 
 | |
| var _tokenizeInterpolant2 = require('./tokenize-interpolant');
 | |
| 
 | |
| var _tokenizeInterpolant3 = _interopRequireDefault(_tokenizeInterpolant2);
 | |
| 
 | |
| function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 | |
| 
 | |
| var newline = '\n'.charCodeAt(0),
 | |
|     space = ' '.charCodeAt(0),
 | |
|     feed = '\f'.charCodeAt(0),
 | |
|     tab = '\t'.charCodeAt(0),
 | |
|     cr = '\r'.charCodeAt(0),
 | |
|     hash = '#'.charCodeAt(0),
 | |
|     backslash = '\\'.charCodeAt(0),
 | |
|     slash = '/'.charCodeAt(0),
 | |
|     openCurly = '{'.charCodeAt(0),
 | |
|     closeCurly = '}'.charCodeAt(0),
 | |
|     asterisk = '*'.charCodeAt(0),
 | |
|     wordEnd = /[ \n\t\r\(\)\{\},:;@!'"\\]|\*(?=\/)|#(?={)/g;
 | |
| 
 | |
| function tokenize(input, l, p) {
 | |
|     var tokens = [];
 | |
|     var css = input.css.valueOf();
 | |
| 
 | |
|     var code = void 0,
 | |
|         next = 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,
 | |
|         inInterpolant = void 0,
 | |
|         inComment = void 0,
 | |
|         inString = void 0;
 | |
| 
 | |
|     var length = css.length;
 | |
|     var offset = -1;
 | |
|     var line = l || 1;
 | |
|     var pos = p || 0;
 | |
| 
 | |
|     loop: while (pos < length) {
 | |
|         code = css.charCodeAt(pos);
 | |
| 
 | |
|         if (code === newline) {
 | |
|             offset = pos;
 | |
|             line += 1;
 | |
|         }
 | |
| 
 | |
|         switch (code) {
 | |
|             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 === tab || code === cr || code === feed);
 | |
| 
 | |
|                 tokens.push(['space', css.slice(pos, next)]);
 | |
|                 pos = next - 1;
 | |
|                 break;
 | |
| 
 | |
|             case newline:
 | |
|                 tokens.push(['newline', '\n', line, pos - offset]);
 | |
|                 break;
 | |
| 
 | |
|             case closeCurly:
 | |
|                 tokens.push(['endInterpolant', '}', line, pos - offset]);
 | |
|                 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 = next;
 | |
|                 break;
 | |
| 
 | |
|             default:
 | |
| 
 | |
|                 if (code === asterisk && css.charCodeAt(pos + 1) === slash) {
 | |
|                     next = pos;
 | |
|                     pos = next - 1;
 | |
|                     break loop;
 | |
|                 }
 | |
| 
 | |
|                 if (code === hash && css.charCodeAt(pos + 1) === openCurly) {
 | |
|                     tokens.push(['startInterpolant', '#{', line, pos + 1 - offset]);
 | |
|                     next = pos + 1;
 | |
| 
 | |
|                     var _tokenizeInterpolant = (0, _tokenizeInterpolant3.default)(input, line, next + 1),
 | |
|                         t = _tokenizeInterpolant.tokens,
 | |
|                         _p = _tokenizeInterpolant.pos;
 | |
| 
 | |
|                     tokens = tokens.concat(t);
 | |
|                     next = _p;
 | |
| 
 | |
|                     pos = next;
 | |
|                     break;
 | |
|                 }
 | |
| 
 | |
|                 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 = next;
 | |
| 
 | |
|                 break;
 | |
|         }
 | |
| 
 | |
|         pos++;
 | |
|     }
 | |
| 
 | |
|     return { tokens: tokens, line: line, pos: pos, offset: offset };
 | |
| } |