diff options
| author | jez | 2011-02-02 07:25:04 +0800 |
|---|---|---|
| committer | jez | 2011-02-02 23:17:17 +0800 |
| commit | 7b576bce7562e99dd46647201b43924439f7e412 (patch) | |
| tree | 909a8fe26e653b7e295c7ea48f3ebdac0ac9db13 /linkHints.js | |
| parent | 77f13f33558123afc8f3b8ad4df0b30979cd396f (diff) | |
| download | vimium-7b576bce7562e99dd46647201b43924439f7e412.tar.bz2 | |
Refactor hint marker production
Diffstat (limited to 'linkHints.js')
| -rw-r--r-- | linkHints.js | 83 |
1 files changed, 45 insertions, 38 deletions
diff --git a/linkHints.js b/linkHints.js index 0eb024b4..dcc5f9ad 100644 --- a/linkHints.js +++ b/linkHints.js @@ -84,10 +84,7 @@ var linkHints = { */ buildLinkHints: function() { var visibleElements = this.getVisibleClickableElements(); - - this.markerMatcher.initSetMarkerAttributes(visibleElements); - for (var i = 0; i < visibleElements.length; i++) - this.hintMarkers.push(this.createMarkerFor(visibleElements[i], i)); + this.hintMarkers = this.markerMatcher.getHintMarkers(visibleElements); // Note(philc): Append these markers as top level children instead of as child nodes to the link itself, // because some clickable elements cannot contain children, e.g. submit buttons. This has the caveat @@ -311,48 +308,29 @@ var linkHints = { } }, - /* - * Creates a link marker for the given link. - */ - createMarkerFor: function(link, linkHintNumber) { - var marker = document.createElement("div"); - marker.className = "internalVimiumHintMarker vimiumHintMarker"; - marker.clickableItem = link.element; - this.markerMatcher.setMarkerAttributes(marker, linkHintNumber); - - var clientRect = link.rect; - // The coordinates given by the window do not have the zoom factor included since the zoom is set only on - // the document node. - var zoomFactor = currentZoomLevel / 100.0; - marker.style.left = clientRect.left + window.scrollX / zoomFactor + "px"; - marker.style.top = clientRect.top + window.scrollY / zoomFactor + "px"; - - return marker; - }, - }; var alphabetHints = { hintKeystrokeQueue: [], - digitsNeeded: 1, logXOfBase: function(x, base) { return Math.log(x) / Math.log(base); }, - /* - * Initialize the number used to generate the character hints to be as many digits as we need to highlight - * all the links on the page; we don't want some link hints to have more chars than others. - */ - initSetMarkerAttributes: function(visibleElements) { - this.digitsNeeded = Math.ceil(this.logXOfBase( + getHintMarkers: function(visibleElements) { + //Initialize the number used to generate the character hints to be as many digits as we need to highlight + //all the links on the page; we don't want some link hints to have more chars than others. + var digitsNeeded = Math.ceil(this.logXOfBase( visibleElements.length, settings.get('linkHintCharacters').length)); - }, + var hintMarkers = []; + + for (var i = 0; i < visibleElements.length; i++) { + var hintString = this.numberToHintString(i, digitsNeeded); + var marker = hintUtils.createMarkerFor(visibleElements[i]); + marker.innerHTML = hintUtils.spanWrap(hintString); + marker.setAttribute("hintString", hintString); + hintMarkers.push(marker); + } - setMarkerAttributes: function(marker, linkHintNumber) { - var hintString = this.numberToHintString(linkHintNumber, this.digitsNeeded); - marker.innerHTML = hintUtils.spanWrap(hintString); - marker.setAttribute("hintString", hintString); - return marker; + return hintMarkers; }, - /* * Converts a number like "8" into a hint string like "JK". This is used to sequentially generate all of * the hint text. The hint string will be "padded with zeroes" to ensure its length is equal to numHintDigits. @@ -415,7 +393,7 @@ var filterHints = { /* * Generate a map of input element => label */ - initSetMarkerAttributes: function() { + generateLabelMap: function() { var labels = document.querySelectorAll("label"); for (var i = 0; i < labels.length; i++) { var forElement = labels[i].getAttribute("for"); @@ -461,6 +439,17 @@ var filterHints = { marker.setAttribute("linkText", linkText); }, + getHintMarkers: function(visibleElements) { + this.generateLabelMap(); + var hintMarkers = []; + for (var i = 0; i < visibleElements.length; i++) { + var marker = hintUtils.createMarkerFor(visibleElements[i]); + this.setMarkerAttributes(marker, i); + hintMarkers.push(marker); + } + return hintMarkers; + }, + matchHintsByKey: function(event, hintMarkers) { var linksMatched = hintMarkers; var delay = 0; @@ -549,5 +538,23 @@ var hintUtils = { for (var i = 0; i < hintString.length; i++) innerHTML.push("<span>" + hintString[i].toUpperCase() + "</span>"); return innerHTML.join(""); + }, + + /* + * Creates a link marker for the given link. + */ + createMarkerFor: function(link) { + var marker = document.createElement("div"); + marker.className = "internalVimiumHintMarker vimiumHintMarker"; + marker.clickableItem = link.element; + + var clientRect = link.rect; + // The coordinates given by the window do not have the zoom factor included since the zoom is set only on + // the document node. + var zoomFactor = currentZoomLevel / 100.0; + marker.style.left = clientRect.left + window.scrollX / zoomFactor + "px"; + marker.style.top = clientRect.top + window.scrollY / zoomFactor + "px"; + + return marker; } }; |
