'use strict'; const types = require('../../tokenizer/types.cjs'); const EXCLAMATIONMARK = 0x0021; // U+0021 EXCLAMATION MARK (!) function consumeRaw(startToken) { return this.Raw(startToken, null, false); } const name = 'StyleSheet'; const walkContext = 'stylesheet'; const structure = { children: [[ 'Comment', 'CDO', 'CDC', 'Atrule', 'Rule', 'Raw' ]] }; function parse() { const start = this.tokenStart; const children = this.createList(); let child; while (!this.eof) { switch (this.tokenType) { case types.WhiteSpace: this.next(); continue; case types.Comment: // ignore comments except exclamation comments (i.e. /*! .. */) on top level if (this.charCodeAt(this.tokenStart + 2) !== EXCLAMATIONMARK) { this.next(); continue; } child = this.Comment(); break; case types.CDO: // child = this.CDC(); break; // CSS Syntax Module Level 3 // ยง2.2 Error handling // At the "top level" of a stylesheet, an starts an at-rule. case types.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.tokenStart), children }; } function generate(node) { this.children(node); } exports.generate = generate; exports.name = name; exports.parse = parse; exports.structure = structure; exports.walkContext = walkContext;