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