From 216d561c795378679a3be63d6cb511b63f272435 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Wed, 16 Apr 2014 14:51:39 -0600 Subject: [PATCH] Delay creating range and node iterator until we actually need to measure --- src/lines-component.coffee | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/lines-component.coffee b/src/lines-component.coffee index 56457c7e1..9e3423cd2 100644 --- a/src/lines-component.coffee +++ b/src/lines-component.coffee @@ -64,14 +64,21 @@ LinesComponent = React.createClass measureCharactersInLine: (tokenizedLine, lineNode) -> {editor} = @props - iterator = document.createNodeIterator(lineNode, NodeFilter.SHOW_TEXT, AcceptFilter) - rangeForMeasurement = document.createRange() + rangeForMeasurement = null + iterator = null + iteratorIndex = -1 - for {value, scopes} in tokenizedLine.tokens - textNode = iterator.nextNode() + for {value, scopes}, tokenIndex in tokenizedLine.tokens charWidths = editor.getScopedCharWidths(scopes) for char, i in value unless charWidths[char]? + rangeForMeasurement ?= document.createRange() + iterator ?= document.createNodeIterator(lineNode, NodeFilter.SHOW_TEXT, AcceptFilter) + + while iteratorIndex < tokenIndex + textNode = iterator.nextNode() + iteratorIndex++ + rangeForMeasurement.setStart(textNode, i) rangeForMeasurement.setEnd(textNode, i + 1) charWidth = rangeForMeasurement.getBoundingClientRect().width