diff options
Diffstat (limited to 'content_scripts/link_hints.coffee')
| -rw-r--r-- | content_scripts/link_hints.coffee | 49 |
1 files changed, 16 insertions, 33 deletions
diff --git a/content_scripts/link_hints.coffee b/content_scripts/link_hints.coffee index 8fc1446b..68cbb915 100644 --- a/content_scripts/link_hints.coffee +++ b/content_scripts/link_hints.coffee @@ -440,39 +440,22 @@ 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) - - # - # 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 + return [] if linkCount == 0 + + # In the following: + # - at no point is any hint in hints a prefix of any other hint + # - the shorter hints are always at the start of the list + hints = [""] + offset = 0 + while hints.length - offset < linkCount or hints.length == 1 + hint = hints[offset++] + hints.push hint + ch for ch in @linkHintCharacters + hints = hints[offset...offset+linkCount] + + # This shuffles the hints so that they're scattered; hints starting with the same character are spread + # evenly throughout the array. We reverse each hint, then sort them then reverse again. + hints = (hint.split("").reverse().join "" for hint in hints).sort() + return (hint.split("").reverse().join "" for hint in hints[...linkCount]) getMatchingHints: (hintMarkers) -> matchString = @hintKeystrokeQueue.join "" |
