From a3ddd1cf08b7bb42eea9965d49fd3be122908696 Mon Sep 17 00:00:00 2001 From: Pishoy Girgis Date: Tue, 3 Sep 2024 11:29:17 +0200 Subject: [PATCH] [#225,#108][Crum/HTML] Populate `next`, `prev`, and `search` Attributes. Rumor has it that this can attract search engine traffic. --- flashcards/constants.py | 13 +++++++++++++ flashcards/deck.py | 29 +++++++++++++++++++++++++++-- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/flashcards/constants.py b/flashcards/constants.py index 39e9de30ef..c947518998 100644 --- a/flashcards/constants.py +++ b/flashcards/constants.py @@ -382,6 +382,19 @@ def _explanatory_alt(path: str) -> str: ), ), title=roots_col("word-title"), + prev=field.fmt( + f"{CRUM_ROOT}/{{key_prev}}.html", + {"key_prev": roots_col("key-prev", force=False)}, + force=False, + aon=True, + ), + next=field.fmt( + f"{CRUM_ROOT}/{{key_next}}.html", + {"key_next": roots_col("key-next", force=False)}, + force=False, + aon=True, + ), + search=f"{CRUM_ROOT}/", force_front=force_front, ) diff --git a/flashcards/deck.py b/flashcards/deck.py index ac04ad7e9d..75394480cc 100644 --- a/flashcards/deck.py +++ b/flashcards/deck.py @@ -1,6 +1,7 @@ import os import pathlib import shutil +import typing import field import genanki # type: ignore[import-untyped] @@ -15,6 +16,7 @@ {{title}} + {{links}}
@@ -81,6 +83,9 @@ def __init__( front: field.field, back: field.field, title: field.field, + prev: typing.Optional[field.field] = None, + next: typing.Optional[field.field] = None, + search: str = "", force_key: bool = True, force_no_duplicate_keys: bool = True, force_front: bool = True, @@ -139,6 +144,9 @@ def __init__( self.fronts: list[str] = [] self.backs: list[str] = [] self.titles: list[str] = [] + self.prevs: list[str] = [] + self.nexts: list[str] = [] + self.search: str = search self.length: int = field.num_entries(key, front, back) assert self.length != field.NO_LENGTH @@ -149,6 +157,8 @@ def __init__( f = front.next() b = back.next() t = title.next() + p = prev.next() if prev else "" + n = next.next() if next else "" assert k or not force_key assert k not in seen_keys or not force_no_duplicate_keys @@ -187,12 +197,16 @@ def __init__( assert isinstance(f, str) assert isinstance(b, str) assert isinstance(t, str) + assert isinstance(n, str) + assert isinstance(p, str) self.keys.append(f"{deck_name} - {k}") + self.raw_keys.append(k) self.fronts.append(f) self.backs.append(b) self.titles.append(t) + self.nexts.append(n) + self.prevs.append(p) ss._exported_notes += 1 - self.raw_keys.append(k) utils.info("Deck:", deck_name) ss.print() @@ -207,13 +221,23 @@ def clean_dir(self, dir: str) -> None: def write_web(self, dir: str) -> None: self.clean_dir(dir) - for rk, front, back, title in zip( + for rk, front, back, title, prev, next in zip( self.raw_keys, self.fronts, self.backs, self.titles, + self.prevs, + self.nexts, ): with open(os.path.join(dir, rk + ".html"), "w") as f: + links: list[str] = [] + if prev: + links.append(f'') + if next: + links.append(f'') + if self.search: + links.append(f'') + f.write( HTML_FMT.format( css=self.css, @@ -221,6 +245,7 @@ def write_web(self, dir: str) -> None: title=title, front=front, back=back, + links="\n".join(links), ), ) with open(os.path.join(dir, JS_BASENAME), "w") as f: