include dictionary parsing in first hinting

I though this would be to slow, but it's actually OK
This commit is contained in:
Felix Van der Jeugt 2015-12-10 15:17:26 +01:00
parent f549b4aa1e
commit aaad8588b6
2 changed files with 18 additions and 42 deletions

View File

@ -20,6 +20,7 @@
"""A HintManager to draw hints over links.""" """A HintManager to draw hints over links."""
import os import os
import string
import math import math
import functools import functools
import collections import collections
@ -154,8 +155,17 @@ class HintManager(QObject):
def _get_word_hints(self, words=[]): def _get_word_hints(self, words=[]):
if not words: if not words:
with open(os.path.join(standarddir.config(), "hints")) as hintfile: with open("/usr/share/dict/words") as wordfile:
words.extend(hint.rstrip() for hint in hintfile) alphabet = set(string.ascii_lowercase)
hints = set()
lines = (line.rstrip().lower() for line in wordfile)
for word in lines:
if not set(word) <= alphabet: continue
if not len(word) <= 4: continue
for i in range(len(word)):
hints.discard(word[:i+1])
hints.add(word)
words.extend(hints)
return words return words
def _get_text(self): def _get_text(self):
@ -207,7 +217,12 @@ class HintManager(QObject):
A list of hint strings, in the same order as the elements. A list of hint strings, in the same order as the elements.
""" """
if config.get('hints', 'mode') == 'words': if config.get('hints', 'mode') == 'words':
try:
return self._get_word_hints()[:len(elems)] return self._get_word_hints()[:len(elems)]
except IOError:
message.error(self._win_id, "Word hints require a dictionary" +
" at /usr/share/dict/words.", immediately=True)
# falls back on letter hints
if config.get('hints', 'mode') == 'number': if config.get('hints', 'mode') == 'number':
chars = '0123456789' chars = '0123456789'
else: else:

View File

@ -1,39 +0,0 @@
import sys
import string
def filter_hints(words):
alphabet = set("asdflkjqwerpoiu")
hints = set()
for word in words:
# hints should be lowercase
word = word.lower()
# hints should be alphabetic
if not set(word) <= alphabet:
continue
# hints shouldn't be longer than 5 characters
if len(word) > 5:
continue
# hints should not be prefixes of other hints. we prefer the
# longer ones.
for i in range(len(word)):
hints.discard(word[:i+1])
hints.add(word)
yield from hints
def main():
inlines = (line.rstrip() for line in sys.stdin)
outlines = ("{}\n".format(hint) for hint in filter_hints(inlines))
sys.stdout.writelines(outlines)
if __name__ == "__main__":
main()