Files
typstar/src/anki/flashcard.py
2025-01-25 16:10:13 +01:00

89 lines
2.4 KiB
Python

import tree_sitter
from .file_handler import FileHandler
class Flashcard:
note_id: int
front: str
back: str
deck: str
id_updated: bool
preamble: str | None
file_handler: FileHandler
note_id_node: tree_sitter.Node
front_node: tree_sitter.Node
back_node: tree_sitter.Node
svg_front: bytes
svg_back: bytes
def __init__(
self,
front: str,
back: str,
deck: str | None,
note_id: int,
preamble: str | None,
file_handler: FileHandler,
):
if deck is None:
deck = "Default"
if not note_id:
note_id = 0
self.front = front
self.back = back
self.deck = deck
self.note_id = note_id
self.preamble = preamble
self.file_handler = file_handler
self.id_updated = False
def __str__(self):
return f"Flashcard(id={self.note_id}, front={self.front})"
def as_typst(self, front: bool) -> str:
return f"#flashcard({self.note_id})[{self.front if front else ''}][{self.back if not front else ''}]"
def as_html(self, front: bool) -> str:
prefix = f"<p hidden>{self.front}: {self.back}{' ' * 10}</p>" # indexable via anki search
image = f'<img src="{self.svg_filename(front)}" />'
return prefix + image
def as_anki_model(self, tmp: bool = False) -> dict:
model = {
"modelName": "Basic",
"fields": {
"Front": f"tmp typst: {self.front}" if tmp else self.as_html(True),
"Back": f"tmp typst: {self.back}" if tmp else self.as_html(False),
},
"tags": ["typst"],
}
if not self.is_new():
model["id"] = self.note_id
return model
def svg_filename(self, front: bool) -> str:
return f"typst_{self.note_id}_{'front' if front else 'back'}.svg"
def is_new(self) -> bool:
return self.note_id == 0 or self.note_id is None
def set_ts_nodes(
self, front: tree_sitter.Node, back: tree_sitter.Node, note_id: tree_sitter.Node
):
self.front_node = front
self.back_node = back
self.note_id_node = note_id
def update_id(self, value: int):
if self.note_id != value:
self.note_id = value
self.id_updated = True
def set_svgs(self, front, back):
self.svg_front = front
self.svg_back = back