#!/usr/bin/python3 #2020-02 fp@bbw # Dieses Programm sucht alle Pruefungen und Pruefungsfragen durch # und erstellt den Index: Welche Pruefungsfrage in welcher Pruefung vorkommt. # Die Pruefungsfragen werden nach Kapitel sortiert und es wird eine LaTeX-Datei # erstellt. import os; # Opreating System import re; # regex skriptPath=os.path.dirname(os.path.realpath(__file__)); #pruefungsAufgabenPath='../pruefungen/aufgaben'; pruefungsAufgabenPath='./aufgaben'; tempListe=[]; def print_tex_directory_contents(sPath): tempListe=[]; return print_tex_directory_contents_recursive(sPath); def print_tex_directory_contents_recursive(sPath): for sChild in os.listdir(sPath): sChildPath = os.path.join(sPath,sChild); if os.path.isdir(sChildPath): print_tex_directory_contents_recursive(sChildPath); else: if sChildPath.strip().endswith('.tex'): tempListe.append(sChildPath); return tempListe; # Woher werden die Pruefungen geholt? os.chdir(".."); pruefungsListe = print_tex_directory_contents("."); tempListe=[]; print ('PruefungsListe...'); prfgDict={}; # Alle Prffungen als Dict for pruefungsFilePath in pruefungsListe: tmp_pruefungsFile = open(pruefungsFilePath, "rt"); for line in tmp_pruefungsFile.readlines(): if line.startswith("\\input{P_"): print (pruefungsFilePath, "-->", line); m = re.search('./(.+?)/Pruefung', pruefungsFilePath) if m: found = m.group(1); n = re.search('\\\\input{(.+?)}.*', line); if n: found2 = n.group(1); if not found in prfgDict.keys(): prfgDict[found] = []; prfgDict[found].append(found2); pruefungsFragenListeStriped = []; ## Woher werden die Pruefungsaufgaben geholt? os.chdir(pruefungsAufgabenPath); pruefungsFragenListe = print_tex_directory_contents('.'); for frage in pruefungsFragenListe: m = re.search('./(.+?)\.tex$', frage); ## $ eingefuegt, denn das .tex gilt nur am Zeilenende found = m.group(1) pruefungsFragenListeStriped.append(found); #skriptPath=os.path.dirname(os.path.realpath(__file__)); os.chdir(skriptPath); ## ## Abkuerzungen wie _n1_ in "Niveau 1" ersetzen. ## Dafuer wird die folgende Erestzungsliste erstellt. ## textErsetzungsListe = {}; ersetzFile = open('fileNameReplacements.txt', 'rt'); for line in ersetzFile.readlines(): aaa, bbb = line.split('=', 1); textErsetzungsListe[aaa] = " " + bbb + " \\\\\n "; #print textErsetzungsListe; ## ## Ersetze _ durch \_ fuer LaTeX def lesbar(text): t1 = text.replace('P_ALLG/', ''); t2 = t1.replace('_', '\_'); return t2; ## Sonderzeichen in Filenamen ersetzen, ## um Verwechslungen und Probleme im LaTeX zu verhindern: def ersetzeAlle(text): for leftText in textErsetzungsListe.keys(): rightText = textErsetzungsListe[leftText]; text = text.replace(leftText, rightText.strip()); text=text.replace('_', ' '); text=text.replace('/', ''); return text; def cleanBackslashBegEnd(titel): if(titel.endswith("\\")): titel = titel + "_" if(titel.startswith("_")): titel = titel[1:len(titel)] return titel ## Ist der Titel zu lang (laenger als die A4-Seitenbreite), ## dann wird in der Mitte ein Stueck herausgebrochen def kurztitel(titel): if(len(titel) < 25): return cleanBackslashBegEnd(titel) left = titel[0:11] ## Achtung "\_" fuer TeX wird auch gesplittet, also korrigeren! if(left.endswith("\\")): left=left + "_" right = titel[-22:] if(right.startswith("_")): right="\\" + right; return cleanBackslashBegEnd(left + "..." + right) def sectionName(titel): if(len(titel) < 25): return cleanBackslashBegEnd(titel) left = titel[0:25] return cleanBackslashBegEnd(left) + "..." def subsectionName(titel): return "..." + cleanBackslashBegEnd(titel[-35:]) ## LaTeX generieren def alleFragenAusgeben(): for prfgFragenID in sorted(pruefungsFragenListeStriped): ##ausgabe.write("\\section{"+kurztitel(lesbar(prfgFragenID))+"}\n"); ausgabe.write("\\section{"+sectionName(lesbar(prfgFragenID))+"}\n"); ausgabe.write("\\subsection{"+subsectionName(lesbar(prfgFragenID))+"}\n"); ## ausgabe.write("\\textbf{Filename}: \\verb|" + prfgFragenID + ".tex|\n\n"); ausgabe.write("\\textbf{Input}:\\\\\n\n {\small{\\verb|\input{" + prfgFragenID + "}|}}\n\n"); ausgabe.write("\\textbf{Beschreibung}: \\\\\n" + ersetzeAlle(prfgFragenID) + "\n\n"); ausgabe.write("\\input{"+prfgFragenID + ".tex" +"}\n\n"); wroteBeginItemize = 0; for prfgID in prfgDict.keys(): for usedFrage in prfgDict[prfgID]: if usedFrage == prfgFragenID: if 0 == wroteBeginItemize: ausgabe.write("\\subsection{Verwendung}\n"); ausgabe.write("Diese Frage wurde in folgenden Prfgs. eingesetzt.\n") ausgabe.write('\\begin{itemize}'+"\n"); wroteBeginItemize = 1; ausgabe.write("\\item ") ausgabe.write(lesbar(prfgID) + "/Pruefung.tex\\\\\n"); ausgabe.write(ersetzeAlle(prfgID)); ausgabe.write("\n"); if 1 == wroteBeginItemize: ausgabe.write('\\end{itemize}'+"\n\n\n"); else: ausgabe.write("Diese Frage wurde noch nicht verwendet.\n\n"); ausgabe.write('\\newpage\n'); vorlage = open('pruefungsIndexVorlage.tex', 'rt'); ausgabe = open('pruefungsIndex.tex', 'wt'); preambel = 1; for line in vorlage.readlines(): if '#CONTENT#' in line: preambel = 0; alleFragenAusgeben(); else : ausgabe.write(line); print('... erstellt.')