Highlighter updates when the buffer is changed

This commit is contained in:
Nathan Sobo
2012-02-01 17:38:16 -07:00
parent e669d4ca9e
commit 23bcc68ac5
3 changed files with 87 additions and 11 deletions

View File

@@ -91,7 +91,7 @@ class Editor extends Template
@focus()
buildLineElement: (row) ->
tokens = @highlighter.tokensForLine(row)
tokens = @highlighter.tokensForRow(row)
$$.pre class: 'line', ->
if tokens.length
for token in tokens

View File

@@ -2,24 +2,29 @@ module.exports =
class Highlighter
buffer: null
tokenizer: null
lineTokens: []
tokensByRow: []
constructor: (@buffer) ->
@buildTokenizer()
@tokenizeLines()
@tokensByRow = @tokenizeRows('start', 0, @buffer.lastRow())
@buffer.on 'change', (e) =>
{ preRange, postRange } = e
postRangeTokens = @tokenizeRows('start', postRange.start.row, postRange.end.row)
@tokensByRow[preRange.start.row..preRange.end.row] = postRangeTokens
buildTokenizer: ->
Mode = require("ace/mode/#{@buffer.modeName()}").Mode
@tokenizer = (new Mode).getTokenizer()
tokenizeLines: ->
@lineTokens = []
tokenizeRows: (state, start, end) ->
for row in [start..end]
{ state, tokens } = @tokenizeRow(state, row)
tokens
state = "start"
for line in @buffer.getLines()
{ state, tokens } = @tokenizer.getLineTokens(line, state)
@lineTokens.push tokens
tokenizeRow: (state, row) ->
@tokenizer.getLineTokens(@buffer.getLine(row), state)
tokensForLine: (row) ->
@lineTokens[row]
tokensForRow: (row) ->
@tokensByRow[row]