howl.BufferMarkers
local buffer, markers names = (ms) -> n = [m.name for m in *ms] table.sort n n before_each -> buffer = Buffer {} markers = buffer.markers
add(markers)
raises an error if <.name> is missing
assert.raises 'name', -> markers\add { {start_offset: 1, end_offset: 2} }
raises an error if <.start_offset> is missing
buffer.text = '12' assert.raises 'start_offset', -> markers\add { {name: 'test', end_offset: 2} }
raises an error if <.end_offset> is missing
buffer.text = '12' assert.raises 'end_offset', -> markers\add { {name: 'test', start_offset: 2} }
raises an error if <.start_offset> is out of bounds
buffer.text = '12' assert.raises 'offset', -> markers\add { {name: 'test', start_offset: 4, end_offset: 4} } assert.raises 'offset', -> markers\add { {name: 'test', start_offset: 0, end_offset: 2} }
raises an error if <.end_offset> is out of bounds
buffer.text = '12' assert.raises 'offset', -> markers\add { {name: 'test', start_offset: 1, end_offset: 4} } assert.raises 'offset', -> markers\add { {name: 'test', start_offset: 1, end_offset: 0} }
adds the specified marker for the designated span
buffer.text = 'åäöx' mks = { {name: 'test', start_offset: 2, end_offset: 4} } markers\add mks assert.same {}, markers\at(1) assert.same mks, markers\at(2) assert.same mks, markers\at(3) assert.same {}, markers\at(4)
allows specifying bytes offsets using byte_{start,end}_offset
buffer.text = 'åäöx' mks = { {name: 'test', byte_start_offset: 3, byte_end_offset: 5} } adjusted = { {name: 'test', start_offset: 2, end_offset: 3} } markers\add mks assert.same {}, markers\at(1) assert.same adjusted, markers\at(2) assert.same {}, markers\at(3)
for_range(start_offset, end_offset)
returns all markers that intersects with the specified span
buffer.text = 'åäö€ᛖ' markers\add { {name: 'test1', start_offset: 2, end_offset: 5} } markers\add { {name: 'test2', start_offset: 4, end_offset: 6} } assert.same {'test1'}, names(markers\for_range(1, 4)) assert.same {'test1', 'test2'}, names(markers\for_range(1, 5)) assert.same {'test1', 'test2'}, names(markers\for_range(4, 5)) assert.same {'test2'}, names(markers\for_range(5, 5)) assert.same {'test2'}, names(markers\for_range(5, 10)) assert.same {'test1', 'test2'}, names(markers\for_range(1, 6))
find(selector)
finds all markers matching the selector
buffer.text = 'åäö€ᛖ' markers\add { {name: 'test1', start_offset: 1, end_offset: 2} } markers\add { {name: 'test2', start_offset: 3, end_offset: 5} } assert.same { {name: 'test1', start_offset: 1, end_offset: 2} }, markers\find name: 'test1' assert.same { {name: 'test2', start_offset: 3, end_offset: 5} }, markers\find name: 'test2' assert.same {}, markers\find foo: 'bar'
remove(selector)
removes all markers matching the selector
buffer.text = 'åäö€ᛖ' markers\add { {name: 'test1', start_offset: 2, end_offset: 3, foo: 'bar'} } markers\add { {name: 'test2', start_offset: 5, end_offset: 6, foo: 'frob'} } markers\remove foo: 'frob' assert.same {'test1'}, names(markers\for_range(1, 7)) markers\remove! assert.same {}, markers\for_range(1, 7)
remove_for_range(start_offset, end_offset, selector)
removes all markers within the range
buffer.text = 'åäö€ᛖ' markers\add { {name: 'test1', start_offset: 2, end_offset: 3} } markers\add { {name: 'test2', start_offset: 5, end_offset: 6} } markers\remove_for_range 1, 4 assert.same {}, markers\at(2) markers\remove_for_range 4, 10 assert.same {}, markers\at(5)
when <selector> is specified
only removes markers matching the selector
buffer.text = 'åäö€ᛖ' markers\add { {name: 'test1', start_offset: 2, end_offset: 3, foo: 'bar'} } markers\add { {name: 'test2', start_offset: 5, end_offset: 6, foo: 'frob'} } markers\remove_for_range 1, 6, foo: 'frob' assert.same {'test1'}, names(markers\for_range(1, 7))
upon buffer modifications
markers move with inserts
buffer.text = 'åäö€ᛖ' markers\add { {name: 'test1', start_offset: 2, end_offset: 3} } buffer\insert '∀', 1 assert.same { { name: 'test1', start_offset: 3, end_offset: 4 } }, markers.all
markers expand with inserts
buffer.text = 'åäö€ᛖ' markers\add { {name: 'test1', start_offset: 2, end_offset: 4} } buffer\insert '∀', 3 assert.same { { name: 'test1', start_offset: 2, end_offset: 5 } }, markers.all
markers move with deletes
buffer.text = 'åäö€ᛖ' markers\add { {name: 'test1', start_offset: 3, end_offset: 5} } buffer\delete 2, 2 assert.same { { name: 'test1', start_offset: 2, end_offset: 4 } }, markers.all
markers shrink with deletes
buffer.text = 'åäö€ᛖ' markers\add { {name: 'test1', start_offset: 2, end_offset: 5} } buffer\delete 3, 3 assert.same { { name: 'test1', start_offset: 2, end_offset: 4 } }, markers.all
