123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- #!/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:
- ## print("DEBUG pfp: ", pruefungsFilePath);
- ## debug:
- ##tmp_pruefungsFile = open(pruefungsFilePath, "rt", encoding='utf8', errors='ignore');
- tmp_pruefungsFile = open(pruefungsFilePath, "rt");
- for line in tmp_pruefungsFile.readlines():
- ## print("DEBUG", line)
- if line.startswith("\\input{"):
- 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.')
|