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