109 lines
3.4 KiB
Python
109 lines
3.4 KiB
Python
import sys
|
|
|
|
sys.path.append("/home/zen/.local/lib/python2.7/site-packages/")
|
|
|
|
import os
|
|
from os.path import join
|
|
import time
|
|
import codecs
|
|
from ulauncher.search.SortedList import SortedList
|
|
|
|
from ulauncher.api.client.Extension import Extension
|
|
from ulauncher.api.client.EventListener import EventListener
|
|
from ulauncher.api.shared.event import KeywordQueryEvent, ItemEnterEvent
|
|
from ulauncher.api.shared.item.ExtensionResultItem import ExtensionResultItem
|
|
from ulauncher.api.shared.action.RenderResultListAction import RenderResultListAction
|
|
from ulauncher.api.shared.action.CopyToClipboardAction import CopyToClipboardAction
|
|
from ulauncher.api.shared.action.HideWindowAction import HideWindowAction
|
|
|
|
if sys.version_info[0] >= 3:
|
|
unichr = chr
|
|
|
|
FILE_PATH = os.path.dirname(sys.argv[0])
|
|
|
|
class UnicodeChar:
|
|
def __init__(self, name, block, code):
|
|
self.name = name
|
|
self.block = block
|
|
self.code = code
|
|
self.character = unichr(int(code, 16))
|
|
|
|
def get_search_name(self):
|
|
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.subscribe(KeywordQueryEvent, KeywordQueryEventListener())
|
|
|
|
|
|
class KeywordQueryEventListener(EventListener):
|
|
def __init__(self):
|
|
self._load_character_table()
|
|
|
|
def _load_character_table(self):
|
|
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')
|
|
character = UnicodeChar(name, block, code)
|
|
self.character_list.append(character)
|
|
|
|
|
|
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)
|
|
items.append(
|
|
ExtensionResultItem(
|
|
icon=image_path,
|
|
name=char.name + " - " + char.character,
|
|
description=char.block + " - " + char.code,
|
|
on_enter=CopyToClipboardAction(char.character),
|
|
)
|
|
)
|
|
|
|
return RenderResultListAction(items)
|
|
|
|
def _get_character_icon(self, code):
|
|
path = sys.argv[0] + "images/cache/icon_%s.svg" % code
|
|
if os.path.isfile(path):
|
|
return path
|
|
return create_character_icon(code)
|
|
|
|
|
|
def load_icon_template():
|
|
with open(os.path.join(FILE_PATH, "images/unicode2.svg"), "r") as i:
|
|
return i.read()
|
|
|
|
|
|
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 = load_icon_template()
|
|
icon = template.replace("{symbol}", unichr(int(code, 16))).replace('{font}', font)
|
|
with codecs.open(
|
|
os.path.join(FILE_PATH, "images/cache/icon_%s.svg" % code), "w", "utf-8"
|
|
) as target:
|
|
target.write(icon)
|
|
return os.path.join(FILE_PATH, "images/cache/icon_%s.svg" % code)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
UnicodeCharExtension().run()
|