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', '
') 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()