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.
87 lines
2.4 KiB
87 lines
2.4 KiB
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 |
|
} |
|
};
|
|
|