88 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
var tokenizer = require('../../tokenizer');
 | 
						|
var TYPE = tokenizer.TYPE;
 | 
						|
 | 
						|
var WhiteSpace = TYPE.WhiteSpace;
 | 
						|
var Semicolon = TYPE.Semicolon;
 | 
						|
var LeftCurlyBracket = TYPE.LeftCurlyBracket;
 | 
						|
var Delim = TYPE.Delim;
 | 
						|
var EXCLAMATIONMARK = 0x0021; // U+0021 EXCLAMATION MARK (!)
 | 
						|
 | 
						|
function getOffsetExcludeWS() {
 | 
						|
    if (this.scanner.tokenIndex > 0) {
 | 
						|
        if (this.scanner.lookupType(-1) === WhiteSpace) {
 | 
						|
            return this.scanner.tokenIndex > 1
 | 
						|
                ? this.scanner.getTokenStart(this.scanner.tokenIndex - 1)
 | 
						|
                : this.scanner.firstCharOffset;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    return this.scanner.tokenStart;
 | 
						|
}
 | 
						|
 | 
						|
// 0, 0, false
 | 
						|
function balanceEnd() {
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 | 
						|
// LEFTCURLYBRACKET, 0, false
 | 
						|
function leftCurlyBracket(tokenType) {
 | 
						|
    return tokenType === LeftCurlyBracket ? 1 : 0;
 | 
						|
}
 | 
						|
 | 
						|
// LEFTCURLYBRACKET, SEMICOLON, false
 | 
						|
function leftCurlyBracketOrSemicolon(tokenType) {
 | 
						|
    return tokenType === LeftCurlyBracket || tokenType === Semicolon ? 1 : 0;
 | 
						|
}
 | 
						|
 | 
						|
// EXCLAMATIONMARK, SEMICOLON, false
 | 
						|
function exclamationMarkOrSemicolon(tokenType, source, offset) {
 | 
						|
    if (tokenType === Delim && source.charCodeAt(offset) === EXCLAMATIONMARK) {
 | 
						|
        return 1;
 | 
						|
    }
 | 
						|
 | 
						|
    return tokenType === Semicolon ? 1 : 0;
 | 
						|
}
 | 
						|
 | 
						|
// 0, SEMICOLON, true
 | 
						|
function semicolonIncluded(tokenType) {
 | 
						|
    return tokenType === Semicolon ? 2 : 0;
 | 
						|
}
 | 
						|
 | 
						|
module.exports = {
 | 
						|
    name: 'Raw',
 | 
						|
    structure: {
 | 
						|
        value: String
 | 
						|
    },
 | 
						|
    parse: function(startToken, mode, excludeWhiteSpace) {
 | 
						|
        var startOffset = this.scanner.getTokenStart(startToken);
 | 
						|
        var endOffset;
 | 
						|
 | 
						|
        this.scanner.skip(
 | 
						|
            this.scanner.getRawLength(startToken, mode || balanceEnd)
 | 
						|
        );
 | 
						|
 | 
						|
        if (excludeWhiteSpace && this.scanner.tokenStart > startOffset) {
 | 
						|
            endOffset = getOffsetExcludeWS.call(this);
 | 
						|
        } else {
 | 
						|
            endOffset = this.scanner.tokenStart;
 | 
						|
        }
 | 
						|
 | 
						|
        return {
 | 
						|
            type: 'Raw',
 | 
						|
            loc: this.getLocation(startOffset, endOffset),
 | 
						|
            value: this.scanner.source.substring(startOffset, endOffset)
 | 
						|
        };
 | 
						|
    },
 | 
						|
    generate: function(node) {
 | 
						|
        this.chunk(node.value);
 | 
						|
    },
 | 
						|
 | 
						|
    mode: {
 | 
						|
        default: balanceEnd,
 | 
						|
        leftCurlyBracket: leftCurlyBracket,
 | 
						|
        leftCurlyBracketOrSemicolon: leftCurlyBracketOrSemicolon,
 | 
						|
        exclamationMarkOrSemicolon: exclamationMarkOrSemicolon,
 | 
						|
        semicolonIncluded: semicolonIncluded
 | 
						|
    }
 | 
						|
};
 |