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