dotfiles/talon/community/community-cursorless-0.4.0/code/homophones.py
2024-11-16 20:27:38 -07:00

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