AnkiNoteTemplate/antp/importer.py

74 lines
2.4 KiB
Python
Raw Normal View History

2021-04-20 10:32:25 +00:00
# Importer imports note types from ../templates/ to Anki.
2021-11-27 11:54:42 +00:00
# Copyright: Ren Tatsumoto <tatsu at autistici.org>
# License: GNU GPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
2021-04-20 10:32:25 +00:00
2021-04-20 10:20:20 +00:00
import json
2021-11-27 11:54:42 +00:00
from typing import Any
2021-04-20 10:20:20 +00:00
2021-11-27 11:54:42 +00:00
from .ankiconnect import invoke
from .common import select, get_used_fonts, NoteType, CardTemplate
from .consts import *
2021-04-20 10:20:20 +00:00
2021-11-27 11:54:42 +00:00
def read_css(model_name: str) -> str:
with open(os.path.join(NOTE_TYPES_DIR, model_name, CSS_FILENAME)) as f:
return f.read()
2021-04-20 10:20:20 +00:00
2021-11-27 11:54:42 +00:00
def read_card_templates(model_name, template_names: list[str]) -> list[CardTemplate]:
templates = []
for template_name in template_names:
dir_path = os.path.join(NOTE_TYPES_DIR, model_name, template_name)
with open(os.path.join(dir_path, FRONT_FILENAME)) as front, open(os.path.join(dir_path, BACK_FILENAME)) as back:
templates.append(CardTemplate(template_name, front.read(), back.read()))
return templates
def read_model(model_dict: dict[str, Any]) -> NoteType:
return NoteType(
name=model_dict['modelName'],
fields=model_dict['inOrderFields'],
css=read_css(model_dict['modelName']),
templates=read_card_templates(model_dict['modelName'], model_dict['cardTemplates']),
)
def format_import(model: NoteType) -> dict[str, Any]:
return {
"modelName": model.name,
"inOrderFields": model.fields,
"css": model.css,
"cardTemplates": [
{
"Name": template.name,
"Front": template.front,
"Back": template.back,
}
for template in model.templates
]
}
def send_note_type(model: NoteType):
2021-04-20 10:55:41 +00:00
models = invoke('modelNames')
2021-11-27 11:54:42 +00:00
template_json = format_import(model)
2021-04-20 10:55:41 +00:00
while template_json["modelName"] in models:
template_json["modelName"] = input("Model with this name already exists. Enter new name: ")
2021-04-20 10:20:20 +00:00
invoke("createModel", **template_json)
2021-04-20 13:23:50 +00:00
def store_fonts(fonts: list[str]):
2021-11-27 11:54:42 +00:00
for file in os.listdir(FONTS_DIR):
2021-04-20 13:23:50 +00:00
if file in fonts:
2021-11-27 11:54:42 +00:00
invoke("storeMediaFile", filename=file, path=os.path.join(FONTS_DIR, file))
2021-04-20 13:23:50 +00:00
2021-04-20 10:20:20 +00:00
def import_note_type():
2021-11-27 11:54:42 +00:00
if model_name := select(os.listdir(NOTE_TYPES_DIR)):
print(f"Selected model: {model_name}")
with open(os.path.join(NOTE_TYPES_DIR, model_name, JSON_FILENAME), 'r') as f:
model = read_model(json.load(f))
store_fonts(get_used_fonts(model.css))
send_note_type(model)
print("Done.")