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