diff options
Diffstat (limited to 'content_scripts/link_hints.coffee')
| -rw-r--r-- | content_scripts/link_hints.coffee | 73 | 
1 files changed, 15 insertions, 58 deletions
| diff --git a/content_scripts/link_hints.coffee b/content_scripts/link_hints.coffee index 3b08dcd9..0b1bb20e 100644 --- a/content_scripts/link_hints.coffee +++ b/content_scripts/link_hints.coffee @@ -415,8 +415,6 @@ class LinkHintsMode  # Use characters for hints, and do not filter links by their text.  class AlphabetHints -  logXOfBase: (x, base) -> Math.log(x) / Math.log(base) -    constructor: ->      @linkHintCharacters = Settings.get "linkHintCharacters"      # We use the keyChar from keydown if the link-hint characters are all "a-z0-9".  This is the default @@ -439,39 +437,16 @@ class AlphabetHints    # may be of different lengths.    #    hintStrings: (linkCount) -> -    # Determine how many digits the link hints will require in the worst case. Usually we do not need -    # all of these digits for every link single hint, so we can show shorter hints for a few of the links. -    digitsNeeded = Math.ceil(@logXOfBase(linkCount, @linkHintCharacters.length)) -    # Short hints are the number of hints we can possibly show which are (digitsNeeded - 1) digits in length. -    shortHintCount = Math.floor( -      (Math.pow(@linkHintCharacters.length, digitsNeeded) - linkCount) / -      @linkHintCharacters.length) -    longHintCount = linkCount - shortHintCount - -    hintStrings = [] - -    if (digitsNeeded > 1) -      for i in [0...shortHintCount] -        hintStrings.push(numberToHintString(i, @linkHintCharacters, digitsNeeded - 1)) - -    start = shortHintCount * @linkHintCharacters.length -    for i in [start...(start + longHintCount)] -      hintStrings.push(numberToHintString(i, @linkHintCharacters, digitsNeeded)) - -    @shuffleHints(hintStrings, @linkHintCharacters.length) +    hints = [""] +    offset = 0 +    while hints.length - offset < linkCount or hints.length == 1 +      hint = hints[offset++] +      hints.push ch + hint for ch in @linkHintCharacters +    hints = hints[offset...offset+linkCount] -  # -  # This shuffles the given set of hints so that they're scattered -- hints starting with the same character -  # will be spread evenly throughout the array. -  # -  shuffleHints: (hints, characterSetLength) -> -    buckets = ([] for i in [0...characterSetLength] by 1) -    for hint, i in hints -      buckets[i % buckets.length].push(hint) -    result = [] -    for bucket in buckets -      result = result.concat(bucket) -    result +    # Shuffle the hints so that they're scattered; hints starting with the same character and short hints are +    # spread evenly throughout the array. +    return hints.sort().map (str) -> str.reverse()    getMatchingHints: (hintMarkers) ->      matchString = @hintKeystrokeQueue.join "" @@ -505,7 +480,12 @@ class FilterHints          @labelMap[forElement] = labelText    generateHintString: (linkHintNumber) -> -    numberToHintString linkHintNumber, @linkHintNumbers.toUpperCase() +    base = @linkHintNumbers.length +    hint = [] +    while 0 < linkHintNumber +      hint.push @linkHintNumbers[Math.floor linkHintNumber % base] +      linkHintNumber = Math.floor linkHintNumber / base +    hint.reverse().join ""    generateLinkText: (element) ->      linkText = "" @@ -637,29 +617,6 @@ spanWrap = (hintString) ->      innerHTML.push("<span class='vimiumReset'>" + char + "</span>")    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("") -  # Suppress all keyboard events until the user stops typing for sufficiently long.  class TypingProtector extends Mode    constructor: (delay, callback) -> | 
