| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 | var TYPE = require('../../tokenizer').TYPE;var WHITESPACE = TYPE.WhiteSpace;var COMMENT = TYPE.Comment;var ATKEYWORD = TYPE.AtKeyword;var CDO = TYPE.CDO;var CDC = TYPE.CDC;var EXCLAMATIONMARK = 0x0021; // U+0021 EXCLAMATION MARK (!)function consumeRaw(startToken) {    return this.Raw(startToken, null, false);}module.exports = {    name: 'StyleSheet',    structure: {        children: [[            'Comment',            'CDO',            'CDC',            'Atrule',            'Rule',            'Raw'        ]]    },    parse: function() {        var start = this.scanner.tokenStart;        var children = this.createList();        var child;        scan:        while (!this.scanner.eof) {            switch (this.scanner.tokenType) {                case WHITESPACE:                    this.scanner.next();                    continue;                case COMMENT:                    // ignore comments except exclamation comments (i.e. /*! .. */) on top level                    if (this.scanner.source.charCodeAt(this.scanner.tokenStart + 2) !== EXCLAMATIONMARK) {                        this.scanner.next();                        continue;                    }                    child = this.Comment();                    break;                case CDO: // <!--                    child = this.CDO();                    break;                case CDC: // -->                    child = this.CDC();                    break;                // CSS Syntax Module Level 3                // §2.2 Error handling                // At the "top level" of a stylesheet, an <at-keyword-token> starts an at-rule.                case ATKEYWORD:                    child = this.parseWithFallback(this.Atrule, consumeRaw);                    break;                // Anything else starts a qualified rule ...                default:                    child = this.parseWithFallback(this.Rule, consumeRaw);            }            children.push(child);        }        return {            type: 'StyleSheet',            loc: this.getLocation(start, this.scanner.tokenStart),            children: children        };    },    generate: function(node) {        this.children(node);    },    walkContext: 'stylesheet'};
 |