import json
import os
import glob
import genanki
class Word:
group_index = {}
def __init__(self, group, hanzi, definition):
self.group = group
self.hanzi = hanzi
self.definition = definition
self.index = self.group_index[group] = self.group_index.get(group, -1) + 1
def hint_filename(self):
return f"hints/{self.group}-{self.index:02d}-{self.hanzi}.json"
def image_filename(self):
return f"images/{self.group}-{self.index:02d}-{self.hanzi}.png"
with open("all-words.tsv") as file:
all_words = [Word(*line.rstrip().split("\t")) for line in file]
uniqueid1 = 1778988700
uniqueid2 = 1450502968
hanzi_writer = """
"""
model = genanki.Model(
model_id=uniqueid1,
name="Basic (type in the answer) (Jim)",
fields=[{"name": "Chinese"}, {"name": "ChineseBlank"}, {"name": "English"}, {"name": "Definition"}, {"name": "Picture"}, {"name": "Answer"}],
templates=[
{
"name": "Card 1",
"qfmt": """{{ChineseBlank}}
{{Picture}}
“{{English}}”
{{Definition}}
{{type:Answer}}
""",
"afmt": """{{Chinese}}
""" + hanzi_writer + """
{{Picture}}
“{{English}}”
{{Definition}}
{{type:Answer}}
""",
}
],
css="""
.card {
font-family: arial;
font-size: 20px;
text-align: center;
color: black;
background-color: white;
}
.card.nightMode {
font-family: arial;
font-size: 20px;
text-align: center;
color: black;
background-color: white;
}
""",
model_type=0,
)
model_learn = genanki.Model(
model_id=uniqueid1 + 1,
name="Basic (type in the answer) (Jim; Learn)",
fields=model.fields,
templates=[
{
"name": model.templates[0]["name"],
"qfmt": """{{ChineseBlank}}
""" + hanzi_writer + """
{{Picture}}
“{{English}}”
{{Definition}}
{{type:Answer}}
""",
"afmt": model.templates[0]["afmt"]
}
],
css=model.css,
)
focus_format = (
hanzi_writer
.replace("width: 100", "width: 200")
.replace("height: 100", "height: 200")
.replace("float: right;", "margin-left: auto; margin-right: auto;")
+ """
{{Definition}}
{{type:Answer}}
""")
model_focus = genanki.Model(
model_id=uniqueid1 + 2,
name="Basic (type in the answer) (Jim; Focus)",
fields=model.fields,
templates=[
{
"name": model.templates[0]["name"],
"qfmt": focus_format,
"afmt": focus_format + """
""",
}
],
css=model.css,
)
decks = {}
image_filenames = []
for word in all_words:
# FIXME: this is partial
if word.group == "HSK1_027":
continue
if os.path.exists(word.hint_filename()) and os.path.exists(word.image_filename()):
if word.group not in decks:
decks[word.group] = genanki.Deck(uniqueid2 + len(decks), "quiz::" + word.group.replace("_", "::"))
decks[word.group + "_learn"] = genanki.Deck(uniqueid2 + len(decks), "learn::" + word.group.replace("_", "::"))
decks[word.group + "_focus"] = genanki.Deck(uniqueid2 + len(decks), "focus::" + word.group.replace("_", "::"))
deck = decks[word.group]
deck_learn = decks[word.group + "_learn"]
deck_focus = decks[word.group + "_focus"]
with open(word.hint_filename()) as file:
response = json.load(file)
content = json.loads(response["choices"][0]["message"]["content"])
image = f"
"
chinese = content["sentence"].replace(word.hanzi, f"{word.hanzi}")
chinese_blank = content["sentence"].replace(word.hanzi, " ")
english = content["sentence_translation"]
definition = content["better_definition"]
image_filenames.append(word.image_filename())
deck.add_note(
genanki.Note(model, [chinese, chinese_blank, english, definition, image, word.hanzi])
)
deck_learn.add_note(
genanki.Note(model_learn, [chinese, chinese_blank, english, definition, image, word.hanzi])
)
deck_focus.add_note(
genanki.Note(model_focus, [chinese, chinese_blank, english, definition, image, word.hanzi])
)
package = genanki.Package([deck for name, deck in sorted(decks.items())])
package.media_files = image_filenames
package.write_to_file("hsk1.apkg")