LineFolder renders a placeholder in place of a folded region.

This commit is contained in:
Corey Johnson & Nathan Sobo 2012-02-15 15:20:27 -07:00
parent 0b5f6c3af0
commit 3782119a0a
2 changed files with 26 additions and 16 deletions

View File

@ -3,7 +3,7 @@ Higlighter = require 'highlighter'
LineFolder = require 'line-folder'
Range = require 'range'
fdescribe "LineFolder", ->
describe "LineFolder", ->
[buffer, folder] = []
beforeEach ->
@ -11,13 +11,10 @@ fdescribe "LineFolder", ->
highlighter = new Higlighter(buffer)
folder = new LineFolder(highlighter)
describe ".screenLineForRow(row)", ->
beforeEach ->
folder.createFold(new Range([4, 29], [7, 4]))
describe ".screenLinesForRows(startRow, endRow)", ->
it "renders a placeholder on the first line of a fold, and skips subsequent lines", ->
line4 = folder.screenLineForRow(4)
line5 = folder.screenLineForRow(5)
folder.createFold(new Range([4, 29], [7, 4]))
[line4, line5] = folder.screenLinesForRows(4, 5)
expect(line4.text).toBe ' while(items.length > 0) {...}'
expect(line5.text).toBe ' return sort(left).concat(pivot).concat(sort(right));'

View File

@ -1,22 +1,35 @@
LineIndex = require 'line-index'
SpanIndex = require 'span-index'
module.exports =
class LineFolder
constructor: (@highlighter) ->
@activeFolds = {}
@lineIndex = new LineIndex
@lineIndex.insertLines(0, 1, @highlighter.allScreenLines())
@buildIndex()
buildIndex: ->
@index = new SpanIndex
@index.insert 0, 1, @highlighter.screenLines
createFold: (range) ->
new Fold(this, range)
@activeFolds[range.start.row] = { range }
screenLineForRow: (screenRow) ->
screenLinesForRows: (startRow, endRow) ->
@index.sliceBySpan(startRow, endRow).values
collapseRows: (startRow, endRow) ->
@lineIndex.updateSpansForRows(startRow, endRow, 0)
foldRows: (startRow, endRow) ->
@index.replace(startRow, 1, @buildScreenLineForBufferRow(startRow))
@index.updateSpans(startRow + 1, endRow, 0)
buildScreenLineForBufferRow: (bufferRow) ->
if fold = @activeFolds[bufferRow]
{ start, end } = fold.range
endRow = fold.range.end.row
prefix = @highlighter.screenLineForRow(start.row).splitAt(start.column)[0]
suffix = @highlighter.screenLineForRow(end.row).splitAt(end.column)[1]
prefix.pushToken(type: 'placeholder', value: '...')
prefix.concat(suffix)
class Fold
constructor: (@lineFolder, @range) ->
@lineFolder.collapseRows(@range.start.row, @range.end.row)
@lineFolder.activeFolds[@range.start.row] = this
@lineFolder.foldRows(@range.start.row, @range.end.row)