summaryrefslogtreecommitdiffstats
path: root/attain_vocab_to_anki_py
diff options
context:
space:
mode:
Diffstat (limited to 'attain_vocab_to_anki_py')
-rw-r--r--attain_vocab_to_anki_py/__init__.py26
-rw-r--r--attain_vocab_to_anki_py/io.py38
-rw-r--r--attain_vocab_to_anki_py/jisho_client.py35
3 files changed, 99 insertions, 0 deletions
diff --git a/attain_vocab_to_anki_py/__init__.py b/attain_vocab_to_anki_py/__init__.py
new file mode 100644
index 0000000..dee97d6
--- /dev/null
+++ b/attain_vocab_to_anki_py/__init__.py
@@ -0,0 +1,26 @@
+import argparse
+import attain_vocab_to_anki_py.io
+import attain_vocab_to_anki_py.jisho_client
+
+__version__ = '0.1.0'
+
+def main():
+ parser = argparse.ArgumentParser(description='Convert course vocab into Anki deck')
+ parser.add_argument('file', metavar='file', type=str,
+ help='vocabulary file path')
+
+ args = parser.parse_args()
+ file_path = args.file
+
+ # read entries from file
+ print(f"[STATUS] Reading file {file_path}")
+ entries = io.read_from_file(file_path)
+
+ # fetch kanji meanings from Jisho
+ print(f"[STATUS] Fetching kanji data from Jisho")
+ entries_with_meanings = jisho_client.inject_kanji_meanings(entries)
+
+ # write entries to file
+ out_file_name = f"{file_path}.out"
+ print(f"[STATUS] Writing result to file {out_file_name}")
+ io.write_to_file(out_file_name, entries_with_meanings)
diff --git a/attain_vocab_to_anki_py/io.py b/attain_vocab_to_anki_py/io.py
new file mode 100644
index 0000000..4288e06
--- /dev/null
+++ b/attain_vocab_to_anki_py/io.py
@@ -0,0 +1,38 @@
+from os import path
+from dataclasses import dataclass
+
+@dataclass
+class Entry:
+ kanji: str
+ hiragana: str
+ english: str
+ meanings: str
+
+def read_from_file(path_str: str) -> list:
+ p = path.join(path_str)
+ lines = []
+
+ with open(p, "r") as f:
+ lines = f.readlines()
+
+ entries = []
+ for line in lines:
+ kanji, hiragana, english = line.split(",", 2)
+ entries.append(Entry(kanji=kanji.strip(),
+ hiragana=hiragana.strip(),
+ english=english.strip(),
+ meanings=""))
+
+ return entries
+
+def _entry_to_row(entry: Entry, delimiter: str = ";") -> str:
+ s = delimiter.join([entry.kanji, entry.hiragana, entry.english, entry.meanings])
+ return f"{s}\n"
+
+def write_to_file(path_str: str, entries: list):
+ p = path.join(path_str)
+
+ lines = map(_entry_to_row, entries)
+
+ with open(p, "w") as f:
+ f.writelines(lines)
diff --git a/attain_vocab_to_anki_py/jisho_client.py b/attain_vocab_to_anki_py/jisho_client.py
new file mode 100644
index 0000000..0ca2147
--- /dev/null
+++ b/attain_vocab_to_anki_py/jisho_client.py
@@ -0,0 +1,35 @@
+from bs4 import BeautifulSoup
+import requests
+import urllib.parse
+
+JISHO_BASE_URL = "https://jisho.org/search"
+
+def inject_kanji_meanings(entries: list) -> list:
+ entries_with_meanings = []
+
+ for index, entry in enumerate(entries):
+ kanji = entry.kanji
+ print(f"Fetching data for #{index}: {kanji}")
+
+ resource_part = urllib.parse.quote_plus(f"{kanji}#kanji")
+ url = f"{JISHO_BASE_URL}/{resource_part}"
+ resp = requests.get(url)
+ resp.raise_for_status()
+
+ soup = BeautifulSoup(resp.text, "html.parser")
+ container = soup.select_one("div#page_container")
+
+ meanings = container.select(".kanji-details__main-meanings")
+ kanji_meaning_texts = map(lambda e: e.text.strip(), meanings)
+
+ kanji_characters = container.select(".character")
+ kanji_character_texts = map(lambda e: e.text.strip(), kanji_characters)
+
+ result_tuples = zip(kanji_character_texts, kanji_meaning_texts)
+ result_strs = map(lambda t: " ".join(t), result_tuples)
+ result = "<br>".join(result_strs)
+
+ entry.meanings = result
+ entries_with_meanings.append(entry)
+
+ return entries_with_meanings \ No newline at end of file