diff options
Diffstat (limited to 'attain_vocab_to_anki_py')
| -rw-r--r-- | attain_vocab_to_anki_py/__init__.py | 26 | ||||
| -rw-r--r-- | attain_vocab_to_anki_py/io.py | 38 | ||||
| -rw-r--r-- | attain_vocab_to_anki_py/jisho_client.py | 35 |
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 |
