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.
|
|
var TYPE = require('../../tokenizer').TYPE; var rawMode = require('./Raw').mode;
var WHITESPACE = TYPE.WhiteSpace; var COMMENT = TYPE.Comment; var SEMICOLON = TYPE.Semicolon; var ATKEYWORD = TYPE.AtKeyword; var LEFTCURLYBRACKET = TYPE.LeftCurlyBracket; var RIGHTCURLYBRACKET = TYPE.RightCurlyBracket;
function consumeRaw(startToken) { return this.Raw(startToken, null, true); } function consumeRule() { return this.parseWithFallback(this.Rule, consumeRaw); } function consumeRawDeclaration(startToken) { return this.Raw(startToken, rawMode.semicolonIncluded, true); } function consumeDeclaration() { if (this.scanner.tokenType === SEMICOLON) { return consumeRawDeclaration.call(this, this.scanner.tokenIndex); }
var node = this.parseWithFallback(this.Declaration, consumeRawDeclaration);
if (this.scanner.tokenType === SEMICOLON) { this.scanner.next(); }
return node; }
module.exports = { name: 'Block', structure: { children: [[ 'Atrule', 'Rule', 'Declaration' ]] }, parse: function(isDeclaration) { var consumer = isDeclaration ? consumeDeclaration : consumeRule;
var start = this.scanner.tokenStart; var children = this.createList();
this.eat(LEFTCURLYBRACKET);
scan: while (!this.scanner.eof) { switch (this.scanner.tokenType) { case RIGHTCURLYBRACKET: break scan;
case WHITESPACE: case COMMENT: this.scanner.next(); break;
case ATKEYWORD: children.push(this.parseWithFallback(this.Atrule, consumeRaw)); break;
default: children.push(consumer.call(this)); } }
if (!this.scanner.eof) { this.eat(RIGHTCURLYBRACKET); }
return { type: 'Block', loc: this.getLocation(start, this.scanner.tokenStart), children: children }; }, generate: function(node) { this.chunk('{'); this.children(node, function(prev) { if (prev.type === 'Declaration') { this.chunk(';'); } }); this.chunk('}'); }, walkContext: 'block' };
|