aboutsummaryrefslogtreecommitdiffstats
path: root/linkHints.js
diff options
context:
space:
mode:
authorjez2011-02-02 07:25:04 +0800
committerjez2011-02-02 23:17:17 +0800
commit7b576bce7562e99dd46647201b43924439f7e412 (patch)
tree909a8fe26e653b7e295c7ea48f3ebdac0ac9db13 /linkHints.js
parent77f13f33558123afc8f3b8ad4df0b30979cd396f (diff)
downloadvimium-7b576bce7562e99dd46647201b43924439f7e412.tar.bz2
Refactor hint marker production
Diffstat (limited to 'linkHints.js')
-rw-r--r--linkHints.js83
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;
}
};