116 lines
3.7 KiB
Python
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.csv"
|
|
|
|
|
|
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 "Instudering" in filename 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::Johan D - Instuderingsfrågor::{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() |