From f30f9b9d2bda5ae43459170e0e1b40727d73cf2b Mon Sep 17 00:00:00 2001 From: Alex Yatskov Date: Thu, 21 Apr 2016 22:03:06 -0700 Subject: [PATCH] Work on range --- ext/fg/js/range.js | 60 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 ext/fg/js/range.js diff --git a/ext/fg/js/range.js b/ext/fg/js/range.js new file mode 100644 index 00000000..819bbfd8 --- /dev/null +++ b/ext/fg/js/range.js @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2016 Alex Yatskov + * Author: Alex Yatskov + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + + +class Range { + constructor(range) { + this.range = range; + } + + text() { + return this.range.toString(); + } + + setLength(length) { + const node = this.range.startContainer; + const offset = this.range.startOffset; + + length = Math.min(node.length - offset, length); + if (length === 0) { + return null; + } + + range.setEnd(node, offset + length); + return length; + } + + paddedRect() { + const node = this.range.startContainer; + const startOffset = this.range.startOffset; + const endOffset = this.range.endOffset; + + this.range.setStart(node, Math.max(0, startOffset - 1)); + this.range.setEnd(node, Math.min(node.length, endOffset + 1)); + const rect = range.getBoundingClientRect(); + this.range.setStart(node, startOffset); + this.range.setEnd(node, endOffset); + + return rect; + } + + static fromPoint(point) { + const range = document.caretRangeFromPoint(point.x, point.y); + return range === null ? null : new Range(range); + } +}