vault backup: 2025-12-14 22:41:11
All checks were successful
Deploy Quartz site to GitHub Pages / build (push) Successful in 1m9s
All checks were successful
Deploy Quartz site to GitHub Pages / build (push) Successful in 1m9s
This commit is contained in:
@@ -0,0 +1,119 @@
|
||||
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}")
|
||||
|
||||
try:
|
||||
cards = parse_markdown_file(full_path, full_deck_name)
|
||||
all_cards.extend(cards)
|
||||
except Exception as e:
|
||||
print(f"!! Fel vid läsning av {full_path}: {e}")
|
||||
|
||||
# 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()
|
||||
Reference in New Issue
Block a user