1
0
Files
medical-notes/wip/extract-instuderings.py
Johan Dahlin 9871babdd5
All checks were successful
Deploy Quartz site to GitHub Pages / build (push) Successful in 1m13s
vault backup: 2025-12-14 22:45:45
2025-12-14 22:45:45 +01:00

116 lines
3.7 KiB
Python

import os
import re
# Inställningar
ROOT_DIR = "." # Scriptet körs i den mapp där undermapparna ligger
OUTPUT_FILE = "anki_import.txt"
def clean_text(text):
"""Tar bort onödiga radbrytningar och gör om till HTML för Anki"""
text = text.strip()
text = text.replace('"', "'") # Säkra citattecken för CSV
text = text.replace(';', ",") # Ersätt semikolon i texten så importen inte går sönder
text = text.replace('\n', '<br>')
return text
def clean_deck_name(name):
"""
Tar bort emojis och specialtecken från mappnamnet.
Behåller: Bokstäver (inkl åäö), siffror, mellanslag, bindestreck och understreck.
"""
# Regex som matchar allt som INTE är ord-tecken (\w), whitespace (\s) eller bindestreck
# \w i Python 3 inkluderar svenska tecken som åäö.
cleaned = re.sub(r'[^\w\s\-]', '', name)
return cleaned.strip()
def parse_markdown_file(filepath, deck_name):
cards = []
with open(filepath, 'r', encoding='utf-8') as f:
lines = f.readlines()
current_question = None
current_answer_lines = []
in_spoiler = False
# Regex för rubriker (### eller ####)
header_pattern = re.compile(r'^#{3,4}\s*(\d+\.\s*)?(.*)')
for line in lines:
line = line.strip()
# 1. Hitta fråga (Rubrik)
header_match = header_pattern.match(line)
if header_match:
# Spara föregående kort om det finns
if current_question and current_answer_lines:
answer_text = clean_text(" ".join(current_answer_lines))
# Format: FRÅGA;SVAR;KORTLEK
cards.append(f"{current_question};{answer_text};{deck_name}")
current_answer_lines = []
current_question = header_match.group(2).strip()
in_spoiler = False
continue
# 2. Hantera spoiler-block
if line.startswith("```spoiler-block:"):
in_spoiler = True
continue
if line == "```" and in_spoiler:
in_spoiler = False
continue
# 3. Samla text
if in_spoiler:
current_answer_lines.append(line)
# Spara sista kortet
if current_question and current_answer_lines:
answer_text = clean_text(" ".join(current_answer_lines))
cards.append(f"{current_question};{answer_text};{deck_name}")
return cards
def main():
all_cards = []
# Header för Anki så att kolumn 3 blir kortlek
all_cards.append("#deck column:3")
print(f"Letar efter filer som matchar 'Instudering*.md'...")
# Gå igenom alla mappar
for root, dirs, files in os.walk(ROOT_DIR):
for filename in files:
# Matchar alla filer som börjar på Instudering och slutar på .md
if filename.startswith("Instudering") and filename.endswith(".md"):
# Hämta mappnamnet (t.ex. '🧬 Lipider')
raw_folder_name = os.path.basename(root)
# Tvätta namnet (blir 'Lipider')
clean_category = clean_deck_name(raw_folder_name)
# Skapa hela kortleksnamnet (Biokemi::Lipider)
# Vi antar att scriptet ligger i huvudmappen (Biokemi)
full_deck_name = f"Biokemi::{clean_category}"
full_path = os.path.join(root, filename)
print(f"Bearbetar: {filename} i mappen '{raw_folder_name}' -> Kortlek: {full_deck_name}")
cards = parse_markdown_file(full_path, full_deck_name)
all_cards.extend(cards)
# Skriv till fil
with open(OUTPUT_FILE, 'w', encoding='utf-8') as f:
f.write('\n'.join(all_cards))
print(f"\nKlart! {len(all_cards) - 1} kort sparade till '{OUTPUT_FILE}'.")
if __name__ == "__main__":
main()