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