mirror of
https://github.com/pulsar-edit/pulsar.git
synced 2024-09-21 07:58:04 +03:00
LineFolder renders a placeholder in place of a folded region.
This commit is contained in:
parent
0b5f6c3af0
commit
3782119a0a
@ -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));'
|
||||
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user