From a58568faa698f88ed23e5acbdfd4844e16a0cba7 Mon Sep 17 00:00:00 2001 From: Krzysztof kuhy Rudnicki Date: Sun, 18 Jan 2026 14:35:41 +0100 Subject: [PATCH] feat: some improvemnets to http cat anki --- python_pkg/download_cats/http_status_anki.py | 128 ++++++++++++------- 1 file changed, 83 insertions(+), 45 deletions(-) diff --git a/python_pkg/download_cats/http_status_anki.py b/python_pkg/download_cats/http_status_anki.py index 11e6f14..07a27b5 100755 --- a/python_pkg/download_cats/http_status_anki.py +++ b/python_pkg/download_cats/http_status_anki.py @@ -8,6 +8,7 @@ and creates an Anki deck with bidirectional flashcards for memorization. from __future__ import annotations import argparse +from dataclasses import dataclass, field import hashlib import logging from pathlib import Path @@ -215,6 +216,8 @@ def generate_anki_package( text-align: center; color: #333; background-color: #fff; + margin: 0; + padding: 0; } .card.night_mode { color: #eee; @@ -250,9 +253,26 @@ def generate_anki_package( object-fit: contain; border-radius: 10px; } +.fullscreen-image { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + display: flex; + justify-content: center; + align-items: center; + margin: 0; + padding: 0; +} +.fullscreen-image img { + width: 100%; + height: 100%; + object-fit: contain; +} """ - # Model 1: Status Code -> Image + Description + # Model 1: Status Code -> Image (full screen, description is in the image) model_code_to_desc = genanki.Model( model_id_code_to_desc, "HTTP Status Code to Description", @@ -265,16 +285,13 @@ def generate_anki_package( { "name": "Code to Description", "qfmt": '
{{StatusCode}}
', - "afmt": '
{{StatusCode}}
' - '
' - '
{{Description}}
' - '
{{Image}}
', + "afmt": '
{{Image}}
', }, ], css=card_css, ) - # Model 2: Description -> Status Code + # Model 2: Description -> Status Code (show text, then reveal cat image) model_desc_to_code = genanki.Model( model_id_desc_to_code, "HTTP Status Description to Code", @@ -286,12 +303,8 @@ def generate_anki_package( templates=[ { "name": "Description to Code", - "qfmt": '
{{Description}}
' - '
{{Image}}
', - "afmt": '
{{Description}}
' - '
{{Image}}
' - '
' - '
{{StatusCode}}
', + "qfmt": '
{{Description}}
', + "afmt": '
{{Image}}
', }, ], css=card_css, @@ -301,47 +314,72 @@ def generate_anki_package( deck_id_hash = hashlib.md5(deck_name.encode(), usedforsecurity=False) deck_id = int(deck_id_hash.hexdigest()[:8], 16) - my_deck = genanki.Deck(deck_id, deck_name) - media_files = [] + builder = _DeckBuilder( + deck=genanki.Deck(deck_id, deck_name), + model_code_to_desc=model_code_to_desc, + model_desc_to_code=model_desc_to_code, + use_cache=use_cache, + ) for status_code, description in status_codes.items(): + builder.add_status_code_cards(status_code, description) + + package = genanki.Package(builder.deck) + package.media_files = builder.media_files + return package + + +@dataclass +class _DeckBuilder: + """Helper class to build Anki deck with HTTP status code cards.""" + + deck: genanki.Deck + model_code_to_desc: genanki.Model + model_desc_to_code: genanki.Model + use_cache: bool + media_files: list[str] = field(default_factory=list) + + def add_status_code_cards(self, status_code: int, description: str) -> None: + """Add flashcards for a single HTTP status code. + + Args: + status_code: HTTP status code. + description: Description of the status code. + """ try: - image_data = get_or_download_image(status_code, use_cache=use_cache) - filename = f"http_cat_{status_code}.jpg" - - # Save to temp directory for genanki - temp_path = Path(f"/tmp/{filename}") # noqa: S108 - temp_path.write_bytes(image_data) - media_files.append(str(temp_path)) - - image_html = f'' - - # Add card: Code -> Description + Image - note_code_to_desc = genanki.Note( - model=model_code_to_desc, - fields=[str(status_code), description, image_html], - tags=["http", "status-codes", "programming"], - ) - my_deck.add_note(note_code_to_desc) - - # Add card: Description + Image -> Code - note_desc_to_code = genanki.Note( - model=model_desc_to_code, - fields=[str(status_code), description, image_html], - tags=["http", "status-codes", "programming"], - ) - my_deck.add_note(note_desc_to_code) - - _logger.info("Added cards for status code %d", status_code) - + image_data = get_or_download_image(status_code, use_cache=self.use_cache) except requests.exceptions.RequestException: _logger.exception( "Failed to download image for status code %d", status_code ) + return - package = genanki.Package(my_deck) - package.media_files = media_files - return package + filename = f"http_cat_{status_code}.jpg" + + # Save to temp directory for genanki + temp_path = Path(f"/tmp/{filename}") # noqa: S108 + temp_path.write_bytes(image_data) + self.media_files.append(str(temp_path)) + + image_html = f'' + + # Add card: Code -> Description + Image + note_code_to_desc = genanki.Note( + model=self.model_code_to_desc, + fields=[str(status_code), description, image_html], + tags=["http", "status-codes", "programming"], + ) + self.deck.add_note(note_code_to_desc) + + # Add card: Description + Image -> Code + note_desc_to_code = genanki.Note( + model=self.model_desc_to_code, + fields=[str(status_code), description, image_html], + tags=["http", "status-codes", "programming"], + ) + self.deck.add_note(note_desc_to_code) + + _logger.info("Added cards for status code %d", status_code) def main(argv: Sequence[str] | None = None) -> int: