From 22796c1676decbda4f2785f1cb10667ebaf941c7 Mon Sep 17 00:00:00 2001
From: Jez Ng
Date: Sun, 28 Oct 2012 02:08:34 -0400
Subject: Make the numbers used in the filtered link hints configurable.
Closes #380.
---
background_scripts/settings.coffee | 1 +
content_scripts/link_hints.coffee | 56 ++++-----
content_scripts/vimium_frontend.coffee | 6 +-
options/options.coffee | 28 +++--
options/options.html | 216 ++++++++++++++++++---------------
tests/dom_tests/dom_tests.coffee | 1 +
6 files changed, 166 insertions(+), 142 deletions(-)
diff --git a/background_scripts/settings.coffee b/background_scripts/settings.coffee
index aed509e4..fc78d48f 100644
--- a/background_scripts/settings.coffee
+++ b/background_scripts/settings.coffee
@@ -23,6 +23,7 @@ root.Settings = Settings =
defaults:
scrollStepSize: "60"
linkHintCharacters: "sadfjklewcmpgh"
+ linkHintNumbers: "0123456789"
filterLinkHints: false
hideHud: false
userDefinedLinkHintCss:
diff --git a/content_scripts/link_hints.coffee b/content_scripts/link_hints.coffee
index 5c7f6510..9b381a9c 100644
--- a/content_scripts/link_hints.coffee
+++ b/content_scripts/link_hints.coffee
@@ -281,11 +281,11 @@ alphabetHints =
if (digitsNeeded > 1)
for i in [0...shortHintCount]
- hintStrings.push(@numberToHintString(i, digitsNeeded - 1, linkHintCharacters))
+ hintStrings.push(numberToHintString(i, linkHintCharacters, digitsNeeded - 1))
start = shortHintCount * linkHintCharacters.length
for i in [start...(start + longHintCount)]
- hintStrings.push(@numberToHintString(i, digitsNeeded, linkHintCharacters))
+ hintStrings.push(numberToHintString(i, linkHintCharacters, digitsNeeded))
@shuffleHints(hintStrings, linkHintCharacters.length)
@@ -302,29 +302,6 @@ alphabetHints =
result = result.concat(bucket)
result
- #
- # 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.
- #
- numberToHintString: (number, numHintDigits, characterSet) ->
- base = characterSet.length
- hintString = []
- remainder = 0
- loop
- remainder = number % base
- hintString.unshift(characterSet[remainder])
- number -= remainder
- number /= Math.floor(base)
- break unless number > 0
-
- # Pad the hint string we're returning so that it matches numHintDigits.
- # Note: the loop body changes hintString.length, so the original length must be cached!
- hintStringLength = hintString.length
- for i in [0...(numHintDigits - hintStringLength)] by 1
- hintString.unshift(characterSet[0])
-
- hintString.join("")
-
matchHintsByKey: (hintMarkers, event) ->
# If a shifted-character is typed, treat it as lowerase for the purposes of matching hints.
keyChar = KeyboardUtils.getKeyChar(event).toLowerCase()
@@ -360,7 +337,8 @@ filterHints =
labelText = labelText.substr(0, labelText.length-1)
@labelMap[forElement] = labelText
- generateHintString: (linkHintNumber) -> (linkHintNumber + 1).toString()
+ generateHintString: (linkHintNumber) ->
+ (numberToHintString linkHintNumber + 1, settings.get "linkHintNumbers").toUpperCase()
generateLinkText: (element) ->
linkText = ""
@@ -416,7 +394,7 @@ filterHints =
if (!@hintKeystrokeQueue.pop() && !@linkTextKeystrokeQueue.pop())
return { linksMatched: [] }
else if (keyChar)
- if (/[0-9]/.test(keyChar))
+ if (settings.get("linkHintNumbers").indexOf(keyChar) >= 0)
@hintKeystrokeQueue.push(keyChar)
else
# since we might renumber the hints, the current hintKeyStrokeQueue
@@ -476,5 +454,29 @@ spanWrap = (hintString) ->
innerHTML.push("" + char + "")
innerHTML.join("")
+#
+# 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 >= numHintDigits.
+#
+numberToHintString = (number, characterSet, numHintDigits = 0) ->
+ base = characterSet.length
+ hintString = []
+ remainder = 0
+ loop
+ remainder = number % base
+ hintString.unshift(characterSet[remainder])
+ number -= remainder
+ number /= Math.floor(base)
+ break unless number > 0
+
+ # Pad the hint string we're returning so that it matches numHintDigits.
+ # Note: the loop body changes hintString.length, so the original length must be cached!
+ hintStringLength = hintString.length
+ for i in [0...(numHintDigits - hintStringLength)] by 1
+ hintString.unshift(characterSet[0])
+
+ hintString.join("")
+
+
root = exports ? window
root.LinkHints = LinkHints
diff --git a/content_scripts/vimium_frontend.coffee b/content_scripts/vimium_frontend.coffee
index 044b0a49..e7ced988 100644
--- a/content_scripts/vimium_frontend.coffee
+++ b/content_scripts/vimium_frontend.coffee
@@ -42,9 +42,9 @@ settings =
port: null
values: {}
loadedValues: 0
- valuesToLoad: ["scrollStepSize", "linkHintCharacters", "filterLinkHints", "hideHud", "previousPatterns",
- "nextPatterns", "findModeRawQuery", "regexFindMode", "userDefinedLinkHintCss",
- "helpDialog_showAdvancedCommands"]
+ valuesToLoad: ["scrollStepSize", "linkHintCharacters", "linkHintNumbers", "filterLinkHints", "hideHud",
+ "previousPatterns", "nextPatterns", "findModeRawQuery", "regexFindMode", "userDefinedLinkHintCss",
+ "helpDialog_showAdvancedCommands"]
isLoaded: false
eventListeners: {}
diff --git a/options/options.coffee b/options/options.coffee
index 640b6632..6dc2c8dd 100644
--- a/options/options.coffee
+++ b/options/options.coffee
@@ -2,7 +2,7 @@ $ = (id) -> document.getElementById id
bgSettings = chrome.extension.getBackgroundPage().Settings
-editableFields = [ "scrollStepSize", "excludedUrls", "linkHintCharacters",
+editableFields = [ "scrollStepSize", "excludedUrls", "linkHintCharacters", "linkHintNumbers",
"userDefinedLinkHintCss", "keyMappings", "filterLinkHints", "previousPatterns",
"nextPatterns", "hideHud", "regexFindMode", "searchUrl"]
@@ -22,7 +22,7 @@ document.addEventListener "DOMContentLoaded", ->
$(field).addEventListener "change", enableSaveButton, false
$(field).addEventListener "change", onDataLoaded, false
- $("advancedOptions").addEventListener "click", openAdvancedOptions, false
+ $("advancedOptionsLink").addEventListener "click", toggleAdvancedOptions, false
$("showCommands").addEventListener "click", (->
showHelpDialog chrome.extension.getBackgroundPage().helpDialogHtml(true, true, "Command Listing"), frameId
), false
@@ -37,7 +37,14 @@ onOptionKeyup = (event) ->
enableSaveButton()
onDataLoaded = ->
- $("linkHintCharacters").readOnly = $("filterLinkHints").checked
+ hide = (el) -> el.parentNode.parentNode.style.display = "none"
+ show = (el) -> el.parentNode.parentNode.style.display = "table-row"
+ if $("filterLinkHints").checked
+ hide $("linkHintCharacters")
+ show $("linkHintNumbers")
+ else
+ show $("linkHintCharacters")
+ hide $("linkHintNumbers")
enableSaveButton = ->
$("saveOptions").removeAttribute "disabled"
@@ -88,13 +95,12 @@ setFieldValue = (field, value) ->
else
field.checked = value
-openAdvancedOptions = (event) ->
- elements = document.getElementsByClassName("advancedOption")
- for element in elements
- element.style.display = (if (element.style.display is "table-row") then "none" else "table-row")
- showOrHideLink = $("advancedOptions")
- if showOrHideLink.innerHTML.match(/^Show/)?
- showOrHideLink.innerHTML = "Hide advanced options…"
+toggleAdvancedOptions = do (advancedMode=false) -> (event) ->
+ if advancedMode
+ $("advancedOptions").style.display = "table-row-group"
+ $("advancedOptionsLink").innerHTML = "Show advanced options…"
else
- showOrHideLink.innerHTML = "Show advanced options…"
+ $("advancedOptions").style.display = "table-row-group"
+ $("advancedOptionsLink").innerHTML = "Hide advanced options"
+ advancedMode = !advancedMode
event.preventDefault()
diff --git a/options/options.html b/options/options.html
index 0d85ca70..d5f836e7 100644
--- a/options/options.html
+++ b/options/options.html
@@ -8,6 +8,7 @@
+