Compare commits
1 commit
master
...
state_at_c
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9381ea171c |
2 changed files with 73 additions and 2 deletions
|
|
@ -222,10 +222,15 @@ var BackgroundTokenizer = function(tokenizer, editor) {
|
||||||
*
|
*
|
||||||
* @param {Number} row The row to get state at
|
* @param {Number} row The row to get state at
|
||||||
**/
|
**/
|
||||||
this.getState = function(row) {
|
this.getState = function(row, column) {
|
||||||
if (this.currentLine == row)
|
if (this.currentLine == row)
|
||||||
this.$tokenizeRow(row);
|
this.$tokenizeRow(row);
|
||||||
return this.states[row] || "start";
|
if (typeof column != "number")
|
||||||
|
return this.states[row] || "start";
|
||||||
|
|
||||||
|
var line = this.doc.getLine(row);
|
||||||
|
var state = this.states[row - 1];
|
||||||
|
return this.tokenizer.getStateAt(line, column, state, row);
|
||||||
};
|
};
|
||||||
|
|
||||||
this.$tokenizeRow = function(row) {
|
this.$tokenizeRow = function(row) {
|
||||||
|
|
|
||||||
|
|
@ -325,6 +325,72 @@ var Tokenizer = function(rules) {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
this.getStateAt = function(line, column, startState) {
|
||||||
|
if (startState && typeof startState != "string") {
|
||||||
|
var stack = startState.slice(0);
|
||||||
|
startState = stack[0];
|
||||||
|
} else
|
||||||
|
var stack = [];
|
||||||
|
|
||||||
|
column = Math.min(column, line.length);
|
||||||
|
var tokenCount = MAX_TOKEN_COUNT;
|
||||||
|
|
||||||
|
var currentState = startState || "start";
|
||||||
|
var state = this.states[currentState];
|
||||||
|
var mapping = this.matchMappings[currentState];
|
||||||
|
var re = this.regExps[currentState];
|
||||||
|
re.lastIndex = 0;
|
||||||
|
|
||||||
|
var match, tokens = [];
|
||||||
|
var lastIndex = 0;
|
||||||
|
|
||||||
|
while (match = re.exec(line)) {
|
||||||
|
var type = mapping.defaultToken;
|
||||||
|
var rule = null;
|
||||||
|
var value = match[0];
|
||||||
|
var index = re.lastIndex;
|
||||||
|
|
||||||
|
for (var i = 0; i < match.length-2; i++) {
|
||||||
|
if (match[i + 1] === undefined)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
rule = state[mapping[i]];
|
||||||
|
|
||||||
|
if (rule.onMatch)
|
||||||
|
rule.onMatch(value, currentState, stack);
|
||||||
|
|
||||||
|
if (rule.next) {
|
||||||
|
if (typeof rule.next == "string")
|
||||||
|
currentState = rule.next;
|
||||||
|
else
|
||||||
|
currentState = rule.next(currentState, stack);
|
||||||
|
|
||||||
|
state = this.states[currentState];
|
||||||
|
if (!state) {
|
||||||
|
window.console && console.error && console.error(currentState, "doesn't exist");
|
||||||
|
currentState = "start";
|
||||||
|
state = this.states[currentState];
|
||||||
|
}
|
||||||
|
mapping = this.matchMappings[currentState];
|
||||||
|
lastIndex = index;
|
||||||
|
re = this.regExps[currentState];
|
||||||
|
re.lastIndex = index;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lastIndex >= column)
|
||||||
|
break;
|
||||||
|
|
||||||
|
lastIndex = index;
|
||||||
|
|
||||||
|
if (!tokenCount--) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return stack.length ? stack : currentState;
|
||||||
|
};
|
||||||
|
|
||||||
}).call(Tokenizer.prototype);
|
}).call(Tokenizer.prototype);
|
||||||
|
|
||||||
exports.Tokenizer = Tokenizer;
|
exports.Tokenizer = Tokenizer;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue