diff --git a/spec/lines-yardstick-spec.coffee b/spec/lines-yardstick-spec.coffee index 88e56f2df..2eea19da7 100644 --- a/spec/lines-yardstick-spec.coffee +++ b/spec/lines-yardstick-spec.coffee @@ -103,6 +103,23 @@ describe "LinesYardstick", -> expect(linesYardstick.pixelPositionForScreenPosition([2, 6])).toEqual({left: 72, top: 28}) expect(linesYardstick.pixelPositionForScreenPosition([5, 10])).toEqual({left: 120, top: 70}) + it "correctly handles RTL characters", -> + atom.styles.addStyleSheet """ + * { + font-size: 14px; + font-family: monospace; + } + """ + + editor.setText("السلام عليكم") + expect(linesYardstick.pixelPositionForScreenPosition([0, 0]).left).toBe 0 + expect(linesYardstick.pixelPositionForScreenPosition([0, 1]).left).toBe 8 + expect(linesYardstick.pixelPositionForScreenPosition([0, 2]).left).toBe 17 + expect(linesYardstick.pixelPositionForScreenPosition([0, 5]).left).toBe 34 + expect(linesYardstick.pixelPositionForScreenPosition([0, 7]).left).toBe 50 + expect(linesYardstick.pixelPositionForScreenPosition([0, 9]).left).toBe 67 + expect(linesYardstick.pixelPositionForScreenPosition([0, 11]).left).toBe 84 + describe "::screenPositionForPixelPosition(pixelPosition)", -> it "converts pixel positions to screen positions", -> atom.styles.addStyleSheet """ diff --git a/src/lines-yardstick.coffee b/src/lines-yardstick.coffee index 7432bc82e..10ae82b16 100644 --- a/src/lines-yardstick.coffee +++ b/src/lines-yardstick.coffee @@ -161,20 +161,17 @@ class LinesYardstick 0 leftPixelPositionForCharInTextNode: (lineNode, textNode, charIndex) -> + @rangeForMeasurement.setStart(textNode, 0) + @rangeForMeasurement.setEnd(textNode, charIndex) + width = @rangeForMeasurement.getBoundingClientRect().width + + @rangeForMeasurement.setStart(textNode, 0) @rangeForMeasurement.setEnd(textNode, textNode.textContent.length) + left = @rangeForMeasurement.getBoundingClientRect().left - position = - if charIndex is 0 - @rangeForMeasurement.setStart(textNode, 0) - @rangeForMeasurement.getBoundingClientRect().left - else if charIndex is textNode.textContent.length - @rangeForMeasurement.setStart(textNode, 0) - @rangeForMeasurement.getBoundingClientRect().right - else - @rangeForMeasurement.setStart(textNode, charIndex) - @rangeForMeasurement.getBoundingClientRect().left + offset = lineNode.getBoundingClientRect().left - position - lineNode.getBoundingClientRect().left + left + width - offset pixelRectForScreenRange: (screenRange) -> lineHeight = @model.getLineHeightInPixels()