#!/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.')
