Rework the api using native methods. This is 🐎

editor.300-line-file.gutter-api.getLineNumberElementsForClass.DOM: 3 / 20000 = 0.00015ms
editor.300-line-file.gutter-api.getLineNumberElement.DOM: 8 / 20000 = 0.0004ms
editor.300-line-file.gutter-api.toggle-class: 17 / 2000 = 0.0085ms
editor.300-line-file.gutter-api.find-then-unset.single-class: 3 / 200 = 0.015ms
editor.300-line-file.gutter-api.find-then-unset.multiple-class: 9 / 200 = 0.045ms
This commit is contained in:
Ben Ogle
2013-10-07 14:57:45 -07:00
parent 2cee400547
commit 9c6353977f
2 changed files with 35 additions and 21 deletions

View File

@@ -1894,24 +1894,24 @@ describe "Editor", ->
it "can get a single line number element", ->
element = editor.gutter.getLineNumberElement(3)
expect(element).toBeTruthy()
expect($(element)).toHaveClass('line-number')
expect($(element)).toHaveClass('line-number-3')
it "returns falsy when there is no line element", ->
expect(editor.gutter.getLineNumberElement(42).length).toBeFalsy()
expect(editor.gutter.getLineNumberElement(42)).toHaveLength 0
it "can add and remove classes to all the line numbers", ->
elements = editor.gutter.addClassToAllLines('heyok')
wasAdded = editor.gutter.addClassToAllLines('heyok')
expect(wasAdded).toBe true
elements = editor.gutter.getLineNumberElementsForClass('heyok')
expect($(elements)).toHaveClass('heyok')
elements = editor.gutter.removeClassFromAllLines('heyok')
expect($(elements)).not.toHaveClass('heyok')
editor.gutter.removeClassFromAllLines('heyok')
expect($(editor.gutter.getLineNumberElements())).not.toHaveClass('heyok')
it "can add and remove classes from a single line number", ->
element = editor.gutter.addClassToLine(3, 'heyok')
expect($(element)).toHaveClass('heyok')
wasAdded = editor.gutter.addClassToLine(3, 'heyok')
expect(wasAdded).toBe true
element = editor.gutter.getLineNumberElement(2)
expect($(element)).not.toHaveClass('heyok')

View File

@@ -78,7 +78,8 @@ class Gutter extends View
#
# * bufferRow: 0 based line number
#
# Returns a list of {HTMLElement}s that correspond to the bufferRow
# Returns a list of {HTMLElement}s that correspond to the bufferRow. More than
# one in the list indicates a wrapped line.
getLineNumberElement: (bufferRow) ->
@getLineNumberElementsForClass("line-number-#{bufferRow}")
@@ -86,37 +87,50 @@ class Gutter extends View
#
# * klass: string class name
#
# Returns a list of {HTMLElement}s.
# Returns true if the class was added to any lines
addClassToAllLines: (klass)->
$.fn.addClass.call(@getLineNumberElements(), klass)
elements = @getLineNumberElements()
el.classList.add(klass) for el in elements
!!elements.length
# Remove a class from all line-number divs.
#
# * klass: string class name
# * klass: string class name. Can only be one class name. i.e. 'my-class'
#
# Returns a list of {HTMLElement}s.
# Returns true if the class was removed from any lines
removeClassFromAllLines: (klass)->
$.fn.removeClass.call(@getLineNumberElements(), klass)
# This is faster than calling $.removeClass on all lines, and faster than
# making a new array and iterating through it.
elements = @getLineNumberElementsForClass(klass)
willRemoveClasses = !!elements.length
elements[0].classList.remove(klass) while elements.length > 0
willRemoveClasses
# Add a class to a single line-number div
#
# * bufferRow: 0 based line number
# * klass: string class name
#
# Returns the {HTMLElement} on which the class was set. undefined if the line was not found
# Returns true if there were lines the class was added to
addClassToLine: (bufferRow, klass)->
line = @getLineNumberElement(bufferRow)
$.fn.addClass.call(line, klass) if line and line.length
elements = @getLineNumberElement(bufferRow)
el.classList.add(klass) for el in elements
!!elements.length
# Remove a class from a single line-number div
#
# * bufferRow: 0 based line number
# * klass: string class name
#
# Returns the {HTMLElement} on which the class was set. undefined if the line was not found
# Returns true if there were lines the class was removed from
removeClassFromLine: (bufferRow, klass)->
line = @getLineNumberElement(bufferRow)
$.fn.removeClass.call(line, klass) if line and line.length
classesRemoved = false
elements = @getLineNumberElement(bufferRow)
for el in elements
hasClass = el.classList.contains(klass)
classesRemoved |= hasClass
el.classList.remove(klass) if hasClass
classesRemoved
### Internal ###