70 lines
2.0 KiB
JavaScript
70 lines
2.0 KiB
JavaScript
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(')');
|
|
}
|
|
};
|