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