60 lines
2 KiB
Python
60 lines
2 KiB
Python
import csv
|
|
import os
|
|
from pathlib import Path
|
|
from typing import Dict, List, Tuple
|
|
from talon import resource
|
|
|
|
# NOTE: This method requires this module to be one folder below the top-level
|
|
# knausj folder.
|
|
SETTINGS_DIR = Path(__file__).parents[1] / "settings"
|
|
|
|
if not SETTINGS_DIR.is_dir():
|
|
os.mkdir(SETTINGS_DIR)
|
|
|
|
|
|
def get_list_from_csv(
|
|
filename: str, headers: Tuple[str, str], default: Dict[str, str] = {}
|
|
):
|
|
"""Retrieves list from CSV"""
|
|
path = SETTINGS_DIR / filename
|
|
assert filename.endswith(".csv")
|
|
|
|
if not path.is_file():
|
|
with open(path, "w", encoding="utf-8") as file:
|
|
writer = csv.writer(file)
|
|
writer.writerow(headers)
|
|
for key, value in default.items():
|
|
writer.writerow([key] if key == value else [value, key])
|
|
|
|
# Now read via resource to take advantage of talon's
|
|
# ability to reload this script for us when the resource changes
|
|
with resource.open(str(path), "r") as f:
|
|
rows = list(csv.reader(f))
|
|
|
|
# print(str(rows))
|
|
mapping = {}
|
|
if len(rows) >= 2:
|
|
actual_headers = rows[0]
|
|
if not actual_headers == list(headers):
|
|
print(
|
|
f'"{filename}": Malformed headers - {actual_headers}.'
|
|
+ f" Should be {list(headers)}. Ignoring row."
|
|
)
|
|
for row in rows[1:]:
|
|
if len(row) == 0:
|
|
# Windows newlines are sometimes read as empty rows. :champagne:
|
|
continue
|
|
if len(row) == 1:
|
|
output = spoken_form = row[0]
|
|
else:
|
|
output, spoken_form = row[:2]
|
|
if len(row) > 2:
|
|
print(
|
|
f'"{filename}": More than two values in row: {row}.'
|
|
+ " Ignoring the extras."
|
|
)
|
|
# Leading/trailing whitespace in spoken form can prevent recognition.
|
|
spoken_form = spoken_form.strip()
|
|
mapping[spoken_form] = output
|
|
|
|
return mapping
|