Highlighter emits change events.

Changes to the buffer may cause lines beyond the scope of the textual
change to be re-highlighted. If so so, this is reflected in the
pre/post range of Highlighter's change events.
This commit is contained in:
Corey Johnson & Nathan Sobo
2012-02-02 17:45:57 -08:00
parent 803e12a201
commit 84c104b0b9
2 changed files with 82 additions and 4 deletions

View File

@@ -16,7 +16,8 @@ class Highlighter
@tokenizer = (new Mode).getTokenizer()
handleBufferChange: (e) ->
{ preRange, postRange } = e
preRange = e.preRange.copy()
postRange = e.postRange.copy()
previousState = @lines[preRange.end.row].state
newLines = @tokenizeRows('start', postRange.start.row, postRange.end.row)
@@ -28,6 +29,13 @@ class Highlighter
previousState = @lines[nextRow].state
@lines[nextRow] = @tokenizeRow(@lines[row].state, nextRow)
preRange.end.row++
preRange.end.column = @buffer.getLine(nextRow).length
postRange.end.row++
postRange.end.column = @buffer.getLine(nextRow).length
@trigger("change", {preRange, postRange})
tokenizeRows: (startState, startRow, endRow) ->
state = startState
for row in [startRow..endRow]
@@ -41,3 +49,10 @@ class Highlighter
tokensForRow: (row) ->
@lines[row].tokens
on: (eventName, handler) ->
@eventHandlers ?= {}
@eventHandlers[eventName] ?= []
@eventHandlers[eventName].push(handler)
trigger: (eventName, event) ->
@eventHandlers?[eventName]?.forEach (handler) -> handler(event)