Nav apraksta
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

pruefung.py 5.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. #!/usr/bin/python3
  2. #2020-02 fp@bbw
  3. # Dieses Programm sucht alle Pruefungen und Pruefungsfragen durch
  4. # und erstellt den Index: Welche Pruefungsfrage in welcher Pruefung vorkommt.
  5. # Die Pruefungsfragen werden nach Kapitel sortiert und es wird eine LaTeX-Datei
  6. # erstellt.
  7. import os; # Opreating System
  8. import re; # regex
  9. skriptPath=os.path.dirname(os.path.realpath(__file__));
  10. #pruefungsAufgabenPath='../pruefungen/aufgaben';
  11. pruefungsAufgabenPath='./aufgaben';
  12. tempListe=[];
  13. def print_tex_directory_contents(sPath):
  14. tempListe=[];
  15. return print_tex_directory_contents_recursive(sPath);
  16. def print_tex_directory_contents_recursive(sPath):
  17. for sChild in os.listdir(sPath):
  18. sChildPath = os.path.join(sPath,sChild);
  19. if os.path.isdir(sChildPath):
  20. print_tex_directory_contents_recursive(sChildPath);
  21. else:
  22. if sChildPath.strip().endswith('.tex'):
  23. tempListe.append(sChildPath);
  24. return tempListe;
  25. # Woher werden die Pruefungen geholt?
  26. os.chdir("..");
  27. pruefungsListe = print_tex_directory_contents(".");
  28. tempListe=[];
  29. print ('PruefungsListe...');
  30. prfgDict={}; # Alle Prffungen als Dict
  31. for pruefungsFilePath in pruefungsListe:
  32. ## debug:
  33. ##tmp_pruefungsFile = open(pruefungsFilePath, "rt", encoding='utf8', errors='ignore');
  34. tmp_pruefungsFile = open(pruefungsFilePath, "rt");
  35. for line in tmp_pruefungsFile.readlines():
  36. if line.startswith("\\input{"):
  37. print (pruefungsFilePath, "-->", line);
  38. m = re.search('./(.+?)/Pruefung', pruefungsFilePath)
  39. if m:
  40. found = m.group(1);
  41. n = re.search('\\\\input{(.+?)}.*', line);
  42. if n:
  43. found2 = n.group(1);
  44. if not found in prfgDict.keys():
  45. prfgDict[found] = [];
  46. prfgDict[found].append(found2);
  47. pruefungsFragenListeStriped = [];
  48. ## Woher werden die Pruefungsaufgaben geholt?
  49. os.chdir(pruefungsAufgabenPath);
  50. pruefungsFragenListe = print_tex_directory_contents('.');
  51. for frage in pruefungsFragenListe:
  52. m = re.search('./(.+?)\.tex$', frage); ## $ eingefuegt, denn das .tex gilt nur am Zeilenende
  53. found = m.group(1)
  54. pruefungsFragenListeStriped.append(found);
  55. #skriptPath=os.path.dirname(os.path.realpath(__file__));
  56. os.chdir(skriptPath);
  57. ##
  58. ## Abkuerzungen wie _n1_ in "Niveau 1" ersetzen.
  59. ## Dafuer wird die folgende Erestzungsliste erstellt.
  60. ##
  61. textErsetzungsListe = {};
  62. ersetzFile = open('fileNameReplacements.txt', 'rt');
  63. for line in ersetzFile.readlines():
  64. aaa, bbb = line.split('=', 1);
  65. textErsetzungsListe[aaa] = " " + bbb + " \\\\\n ";
  66. #print textErsetzungsListe;
  67. ##
  68. ## Ersetze _ durch \_ fuer LaTeX
  69. def lesbar(text):
  70. t1 = text.replace('P_ALLG/', '');
  71. t2 = t1.replace('_', '\_');
  72. return t2;
  73. ## Sonderzeichen in Filenamen ersetzen,
  74. ## um Verwechslungen und Probleme im LaTeX zu verhindern:
  75. def ersetzeAlle(text):
  76. for leftText in textErsetzungsListe.keys():
  77. rightText = textErsetzungsListe[leftText];
  78. text = text.replace(leftText, rightText.strip());
  79. text=text.replace('_', ' ');
  80. text=text.replace('/', '');
  81. return text;
  82. def cleanBackslashBegEnd(titel):
  83. if(titel.endswith("\\")):
  84. titel = titel + "_"
  85. if(titel.startswith("_")):
  86. titel = titel[1:len(titel)]
  87. return titel
  88. ## Ist der Titel zu lang (laenger als die A4-Seitenbreite),
  89. ## dann wird in der Mitte ein Stueck herausgebrochen
  90. def kurztitel(titel):
  91. if(len(titel) < 25):
  92. return cleanBackslashBegEnd(titel)
  93. left = titel[0:11] ## Achtung "\_" fuer TeX wird auch gesplittet, also korrigeren!
  94. if(left.endswith("\\")):
  95. left=left + "_"
  96. right = titel[-22:]
  97. if(right.startswith("_")):
  98. right="\\" + right;
  99. return cleanBackslashBegEnd(left + "..." + right)
  100. def sectionName(titel):
  101. if(len(titel) < 25):
  102. return cleanBackslashBegEnd(titel)
  103. left = titel[0:25]
  104. return cleanBackslashBegEnd(left) + "..."
  105. def subsectionName(titel):
  106. return "..." + cleanBackslashBegEnd(titel[-35:])
  107. ## LaTeX generieren
  108. def alleFragenAusgeben():
  109. for prfgFragenID in sorted(pruefungsFragenListeStriped):
  110. ##ausgabe.write("\\section{"+kurztitel(lesbar(prfgFragenID))+"}\n");
  111. ausgabe.write("\\section{"+sectionName(lesbar(prfgFragenID))+"}\n");
  112. ausgabe.write("\\subsection{"+subsectionName(lesbar(prfgFragenID))+"}\n");
  113. ## ausgabe.write("\\textbf{Filename}: \\verb|" + prfgFragenID + ".tex|\n\n");
  114. ausgabe.write("\\textbf{Input}:\\\\\n\n {\small{\\verb|\input{" + prfgFragenID + "}|}}\n\n");
  115. ausgabe.write("\\textbf{Beschreibung}: \\\\\n" + ersetzeAlle(prfgFragenID) + "\n\n");
  116. ausgabe.write("\\input{"+prfgFragenID + ".tex" +"}\n\n");
  117. wroteBeginItemize = 0;
  118. for prfgID in prfgDict.keys():
  119. for usedFrage in prfgDict[prfgID]:
  120. if usedFrage == prfgFragenID:
  121. if 0 == wroteBeginItemize:
  122. ausgabe.write("\\subsection{Verwendung}\n");
  123. ausgabe.write("Diese Frage wurde in folgenden Prfgs. eingesetzt.\n")
  124. ausgabe.write('\\begin{itemize}'+"\n");
  125. wroteBeginItemize = 1;
  126. ausgabe.write("\\item ")
  127. ausgabe.write(lesbar(prfgID) + "/Pruefung.tex\\\\\n");
  128. ausgabe.write(ersetzeAlle(prfgID));
  129. ausgabe.write("\n");
  130. if 1 == wroteBeginItemize:
  131. ausgabe.write('\\end{itemize}'+"\n\n\n");
  132. else:
  133. ausgabe.write("Diese Frage wurde noch nicht verwendet.\n\n");
  134. ausgabe.write('\\newpage\n');
  135. vorlage = open('pruefungsIndexVorlage.tex', 'rt');
  136. ausgabe = open('pruefungsIndex.tex', 'wt');
  137. preambel = 1;
  138. for line in vorlage.readlines():
  139. if '#CONTENT#' in line:
  140. preambel = 0;
  141. alleFragenAusgeben();
  142. else :
  143. ausgabe.write(line);
  144. print('... erstellt.')