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