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