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; // | ) 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(')'); } };