diff --git a/main.py b/main.py index 24e47be..56eeff5 100644 --- a/main.py +++ b/main.py @@ -16,18 +16,22 @@ from ulauncher.api.shared.action.RenderResultListAction import RenderResultListA from ulauncher.api.shared.action.CopyToClipboardAction import CopyToClipboardAction from ulauncher.api.shared.action.HideWindowAction import HideWindowAction +# Be compatible with both python 2 and 3 if sys.version_info[0] >= 3: unichr = chr FILE_PATH = os.path.dirname(sys.argv[0]) -ICON_TEMPLATE = ''' +ICON_TEMPLATE = """ {symbol} -''' +""" + class UnicodeChar: + """ Container class for unicode characters """ + def __init__(self, name, block, code): self.name = name self.block = block @@ -35,44 +39,35 @@ class UnicodeChar: self.character = unichr(int(code, 16)) def get_search_name(self): + """ Called by `ulauncher.search.SortedList` to get the string that should be used in searches """ return self.name -class SearchableItem: - def __init__(self, name, item): - self._name = name - self._item = item - - def get_search_name(self): - return self._name - class UnicodeCharExtension(Extension): def __init__(self): super(UnicodeCharExtension, self).__init__() + self._load_character_table() self.subscribe(KeywordQueryEvent, KeywordQueryEventListener()) - -class KeywordQueryEventListener(EventListener): - def __init__(self): - self._load_character_table() - def _load_character_table(self): + """ Read the data file and load to memory """ self.character_list = [] with open(join(FILE_PATH, "unicode_list.txt"), "r") as f: for line in f.readlines(): - name, code, block = line.strip().split('\t') + name, code, block = line.strip().split("\t") character = UnicodeChar(name, block, code) self.character_list.append(character) +class KeywordQueryEventListener(EventListener): def on_event(self, event, extension): items = [] arg = event.get_argument() if arg: - m_ = SortedList(arg, min_score=60, limit=10) - m_.extend(self.character_list) - for char in m_: - image_path = self._get_character_icon(char.code) + result_list = SortedList(arg, min_score=60, limit=10) + result_list.extend(extension.character_list) + for char in result_list: + image_path = self._get_character_icon(char) items.append( ExtensionResultItem( icon=image_path, @@ -84,25 +79,30 @@ class KeywordQueryEventListener(EventListener): return RenderResultListAction(items) - def _get_character_icon(self, code): - path = sys.argv[0] + "images/cache/icon_%s.svg" % code + def _get_character_icon(self, char): + path = sys.argv[0] + "images/cache/icon_%s.svg" % char.code if os.path.isfile(path): return path - return create_character_icon(code) + return create_character_icon(char) def is_icon_cached(code): return os.path.isfile(os.path.join(FILE_PATH, "images/cache/icon_%s.svg" % code)) -def create_character_icon(code, font='sans-serif'): - template = ICON_TEMPLATE - icon = template.replace("{symbol}", unichr(int(code, 16))).replace('{font}', font) +def create_character_icon(char, font="sans-serif"): + """ Create an SVG file containing the unicode glyph for char to be used + as a result icon. + + Note: this could be avoided by providing a gtk.PixBuf without creating a file, + but ulauncher pickles the returned results, so it doesn't work currently. + """ + icon = ICON_TEMPLATE.replace("{symbol}", char.character).replace("{font}", font) with codecs.open( - os.path.join(FILE_PATH, "images/cache/icon_%s.svg" % code), "w", "utf-8" + os.path.join(FILE_PATH, "images/cache/icon_%s.svg" % char.code), "w", "utf-8" ) as target: target.write(icon) - return os.path.join(FILE_PATH, "images/cache/icon_%s.svg" % code) + return os.path.join(FILE_PATH, "images/cache/icon_%s.svg" % char.code) if __name__ == "__main__":