diff options
Diffstat (limited to '.ai/scripts/drill-to-anki.py')
| -rwxr-xr-x | .ai/scripts/drill-to-anki.py | 38 |
1 files changed, 13 insertions, 25 deletions
diff --git a/.ai/scripts/drill-to-anki.py b/.ai/scripts/drill-to-anki.py index 543ccd8..1050021 100755 --- a/.ai/scripts/drill-to-anki.py +++ b/.ai/scripts/drill-to-anki.py @@ -13,15 +13,13 @@ Parses org-drill structure: text (sans :drill: tag). Back = entry body with newlines converted to <br>. -Deck name defaults to the org file's #+TITLE if present, otherwise the -input basename. Deck and model IDs are derived from the deck name via -stable hash so re-importing the same deck updates existing cards -instead of duplicating them. +Deck name defaults to the input basename, case preserved. Deck and model +IDs are derived from the deck name via stable hash so re-importing the +same deck updates existing cards instead of duplicating them. -Output defaults to ~/sync/org/drill/<input-basename>.apkg (matches -Craig's project convention where org source lives in the project and -symlinks into ~/sync/org/drill/, with the .apkg writing directly into -~/sync/org/drill/ as a build artifact). +Output defaults to ~/sync/phone/anki/<input-basename>.apkg. The .apkg is +a mobile-Anki artifact the phone picks up from its sync dir, so it lands +there rather than next to the org source. Usage: drill-to-anki.py <input.org> @@ -91,15 +89,6 @@ def escape_html(s: str) -> str: ) -def title_from_org(org_text: str) -> str | None: - """Return the #+TITLE: value if the org file declares one.""" - for line in org_text.splitlines()[:20]: - m = re.match(r"^#\+TITLE:\s*(.+?)\s*$", line, re.IGNORECASE) - if m: - return m.group(1).strip() - return None - - def strip_org_metadata(body_lines: list[str]) -> list[str]: """Drop :PROPERTIES: drawers and SCHEDULED/DEADLINE/CLOSED planning lines. @@ -185,13 +174,13 @@ def build(cards: list[tuple[str, str, str]], deck_name: str) -> genanki.Deck: return deck -def default_deck_name(input_path: Path, org_text: str) -> str: - return title_from_org(org_text) or input_path.stem.replace("-", " ").title() +def default_deck_name(input_path: Path) -> str: + return input_path.stem def default_output_path(input_path: Path) -> Path: - drill_dir = Path.home() / "sync" / "org" / "drill" - return drill_dir / f"{input_path.stem}.apkg" + anki_dir = Path.home() / "sync" / "phone" / "anki" + return anki_dir / f"{input_path.stem}.apkg" def main() -> int: @@ -205,14 +194,13 @@ def main() -> int: ) parser.add_argument( "--deck", - help="Deck name. Defaults to the org file's #+TITLE, or the " - "input basename if no title is set.", + help="Deck name. Defaults to the input basename.", ) parser.add_argument( "--output", type=Path, help="Output .apkg path. Defaults to " - "~/sync/org/drill/<input-basename>.apkg.", + "~/sync/phone/anki/<input-basename>.apkg.", ) args = parser.parse_args() @@ -222,7 +210,7 @@ def main() -> int: return 1 org_text = input_path.read_text(encoding="utf-8") - deck_name = args.deck or default_deck_name(input_path, org_text) + deck_name = args.deck or default_deck_name(input_path) output_path: Path = (args.output or default_output_path(input_path)).expanduser().resolve() output_path.parent.mkdir(parents=True, exist_ok=True) |
