TextEditorHighlighter.js [plain text]
WebInspector.TextEditorHighlighter = function(textModel, damageCallback)
{
this._textModel = textModel;
this._tokenizer = WebInspector.SourceTokenizer.Registry.getInstance().getTokenizer("text/html");
this._damageCallback = damageCallback;
this.reset();
}
WebInspector.TextEditorHighlighter.prototype = {
set mimeType(mimeType)
{
var tokenizer = WebInspector.SourceTokenizer.Registry.getInstance().getTokenizer(mimeType);
if (tokenizer) {
this._tokenizer = tokenizer;
this._tokenizerCondition = this._tokenizer.initialCondition;
}
},
reset: function()
{
this._lastHighlightedLine = 0;
this._lastHighlightedColumn = 0;
this._tokenizerCondition = this._tokenizer.initialCondition;
},
highlight: function(endLine)
{
if (endLine <= this._lastHighlightedLine)
return;
this._requestedEndLine = endLine;
if (this._highlightTimer) {
return;
}
this._highlightInChunks(endLine);
if (this._lastHighlightedLine < endLine)
this._highlightTimer = setTimeout(this._highlightInChunks.bind(this, endLine), 100);
},
_highlightInChunks: function(endLine)
{
delete this._highlightTimer;
if (this._requestedEndLine <= this._lastHighlightedLine)
return;
if (this._requestedEndLine !== endLine) {
this._highlightTimer = setTimeout(this._highlightInChunks.bind(this, this._requestedEndLine), 100);
return;
}
this._highlightLines(this._requestedEndLine);
if (this._lastHighlightedLine < this._requestedEndLine)
this._highlightTimer = setTimeout(this._highlightInChunks.bind(this, this._requestedEndLine), 10);
},
_highlightLines: function(endLine)
{
this._tokenizer.condition = this._tokenizerCondition;
var tokensCount = 0;
for (var lineNumber = this._lastHighlightedLine; lineNumber < endLine; ++lineNumber) {
var line = this._textModel.line(lineNumber);
this._tokenizer.line = line;
var attributes = this._textModel.getAttribute(lineNumber, "highlight") || {};
do {
var newColumn = this._tokenizer.nextToken(this._lastHighlightedColumn);
var tokenType = this._tokenizer.tokenType;
if (tokenType)
attributes[this._lastHighlightedColumn] = { length: newColumn - this._lastHighlightedColumn, tokenType: tokenType, subTokenizer: this._tokenizer.subTokenizer };
this._lastHighlightedColumn = newColumn;
if (++tokensCount > 1000)
break;
} while (this._lastHighlightedColumn < line.length)
this._textModel.setAttribute(lineNumber, "highlight", attributes);
if (this._lastHighlightedColumn < line.length) {
break;
} else
this._lastHighlightedColumn = 0;
}
this._damageCallback(this._lastHighlightedLine, lineNumber);
this._tokenizerCondition = this._tokenizer.condition;
this._lastHighlightedLine = lineNumber;
}
}