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 @@ +