You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							83 lines
						
					
					
						
							2.0 KiB
						
					
					
				
			
		
		
	
	
							83 lines
						
					
					
						
							2.0 KiB
						
					
					
				'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.CDO(); | 
						|
                break; | 
						|
 | 
						|
            case types.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 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;
 | 
						|
 |