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