| var isWhiteSpace = require('../../tokenizer').isWhiteSpace; |
| var cmpStr = require('../../tokenizer').cmpStr; |
| var TYPE = require('../../tokenizer').TYPE; |
| |
| var FUNCTION = TYPE.Function; |
| var URL = TYPE.Url; |
| var RIGHTPARENTHESIS = TYPE.RightParenthesis; |
| |
| // <url-token> | <function-token> <string> ) |
| module.exports = { |
| name: 'Url', |
| structure: { |
| value: ['String', 'Raw'] |
| }, |
| parse: function() { |
| var start = this.scanner.tokenStart; |
| var value; |
| |
| switch (this.scanner.tokenType) { |
| case URL: |
| var rawStart = start + 4; |
| var rawEnd = this.scanner.tokenEnd - 1; |
| |
| while (rawStart < rawEnd && isWhiteSpace(this.scanner.source.charCodeAt(rawStart))) { |
| rawStart++; |
| } |
| |
| while (rawStart < rawEnd && isWhiteSpace(this.scanner.source.charCodeAt(rawEnd - 1))) { |
| rawEnd--; |
| } |
| |
| value = { |
| type: 'Raw', |
| loc: this.getLocation(rawStart, rawEnd), |
| value: this.scanner.source.substring(rawStart, rawEnd) |
| }; |
| |
| this.eat(URL); |
| break; |
| |
| case FUNCTION: |
| if (!cmpStr(this.scanner.source, this.scanner.tokenStart, this.scanner.tokenEnd, 'url(')) { |
| this.error('Function name must be `url`'); |
| } |
| |
| this.eat(FUNCTION); |
| this.scanner.skipSC(); |
| value = this.String(); |
| this.scanner.skipSC(); |
| this.eat(RIGHTPARENTHESIS); |
| break; |
| |
| default: |
| this.error('Url or Function is expected'); |
| } |
| |
| return { |
| type: 'Url', |
| loc: this.getLocation(start, this.scanner.tokenStart), |
| value: value |
| }; |
| }, |
| generate: function(node) { |
| this.chunk('url'); |
| this.chunk('('); |
| this.node(node.value); |
| this.chunk(')'); |
| } |
| }; |