168 lines
4.3 KiB
Python
168 lines
4.3 KiB
Python
from talon import Context, Module, app, clip, cron, imgui, actions, ui, fs
|
|
import os
|
|
|
|
########################################################################
|
|
# global settings
|
|
########################################################################
|
|
|
|
# a list of homophones where each line is a comma separated list
|
|
# e.g. where,wear,ware
|
|
# a suitable one can be found here:
|
|
# https://github.com/pimentel/homophones
|
|
cwd = os.path.dirname(os.path.realpath(__file__))
|
|
homophones_file = os.path.join(cwd, "homophones.csv")
|
|
# if quick_replace, then when a word is selected and only one homophone exists,
|
|
# replace it without bringing up the options
|
|
quick_replace = True
|
|
show_help = False
|
|
########################################################################
|
|
|
|
ctx = Context()
|
|
mod = Module()
|
|
mod.mode("homophones")
|
|
mod.list("homophones_canonicals", desc="list of words ")
|
|
|
|
|
|
main_screen = ui.main_screen()
|
|
|
|
|
|
def update_homophones(name, flags):
|
|
if name != homophones_file:
|
|
return
|
|
|
|
phones = {}
|
|
canonical_list = []
|
|
with open(homophones_file, "r") as f:
|
|
for line in f:
|
|
words = line.rstrip().split(",")
|
|
canonical_list.append(words[0])
|
|
for word in words:
|
|
word = word.lower()
|
|
old_words = phones.get(word, [])
|
|
phones[word] = sorted(set(old_words + words))
|
|
|
|
global all_homophones
|
|
all_homophones = phones
|
|
ctx.lists["self.homophones_canonicals"] = canonical_list
|
|
|
|
|
|
update_homophones(homophones_file, None)
|
|
fs.watch(cwd, update_homophones)
|
|
active_word_list = None
|
|
is_selection = False
|
|
|
|
|
|
def close_homophones():
|
|
gui.hide()
|
|
actions.mode.disable("user.homophones")
|
|
|
|
|
|
def raise_homophones(word, forced=False, selection=False):
|
|
global quick_replace
|
|
global active_word_list
|
|
global show_help
|
|
global force_raise
|
|
global is_selection
|
|
|
|
force_raise = forced
|
|
is_selection = selection
|
|
|
|
if is_selection:
|
|
word = word.strip()
|
|
|
|
is_capitalized = word == word.capitalize()
|
|
is_upper = word.isupper()
|
|
|
|
word = word.lower()
|
|
|
|
if word not in all_homophones:
|
|
app.notify("homophones.py", '"%s" not in homophones list' % word)
|
|
return
|
|
|
|
active_word_list = all_homophones[word]
|
|
if (
|
|
is_selection
|
|
and len(active_word_list) == 2
|
|
and quick_replace
|
|
and not force_raise
|
|
):
|
|
if word == active_word_list[0].lower():
|
|
new = active_word_list[1]
|
|
else:
|
|
new = active_word_list[0]
|
|
|
|
if is_capitalized:
|
|
new = new.capitalize()
|
|
elif is_upper:
|
|
new = new.upper()
|
|
|
|
clip.set(new)
|
|
actions.edit.paste()
|
|
|
|
return
|
|
|
|
actions.mode.enable("user.homophones")
|
|
show_help = False
|
|
gui.show()
|
|
|
|
|
|
@imgui.open(x=main_screen.x + main_screen.width / 2.6, y=main_screen.y)
|
|
def gui(gui: imgui.GUI):
|
|
global active_word_list
|
|
if show_help:
|
|
gui.text("Homephone help - todo")
|
|
else:
|
|
gui.text("Select a homophone")
|
|
gui.line()
|
|
index = 1
|
|
for word in active_word_list:
|
|
gui.text("Choose {}: {} ".format(index, word))
|
|
index = index + 1
|
|
|
|
|
|
def show_help_gui():
|
|
global show_help
|
|
show_help = True
|
|
gui.show()
|
|
|
|
|
|
@mod.capture(rule="{self.homophones_canonicals}")
|
|
def homophones_canonical(m) -> str:
|
|
"Returns a single string"
|
|
return m.homophones_canonicals
|
|
|
|
|
|
@mod.action_class
|
|
class Actions:
|
|
def homophones_hide():
|
|
"""Hides the homophones display"""
|
|
close_homophones()
|
|
|
|
def homophones_show(m: str):
|
|
"""Sentence formatter"""
|
|
print(m)
|
|
raise_homophones(m, False, False)
|
|
|
|
def homophones_show_selection():
|
|
"""Sentence formatter"""
|
|
raise_homophones(actions.edit.selected_text(), False, True)
|
|
|
|
def homophones_force_show(m: str):
|
|
"""Sentence formatter"""
|
|
raise_homophones(m, True, False)
|
|
|
|
def homophones_force_show_selection():
|
|
"""Sentence formatter"""
|
|
raise_homophones(actions.edit.selected_text(), True, True)
|
|
|
|
def homophones_select(number: int) -> str:
|
|
"""selects the homophone by number"""
|
|
if number <= len(active_word_list) and number > 0:
|
|
return active_word_list[number - 1]
|
|
|
|
error = "homophones.py index {} is out of range (1-{})".format(
|
|
number, len(active_word_list)
|
|
)
|
|
app.notify(error)
|
|
raise error
|
|
|