diff --git a/README.md b/README.md index 57dcdd892e165b3de85f02e4f6bb17ec87908323..add98d3e4e21aa0c3c0249a202e8bcb3d05e6c71 100644 --- a/README.md +++ b/README.md @@ -27,3 +27,25 @@ Ce module marche pour MA feuille de style AMC, qui contient : et où ``{mlang en}`` et ``{mlang other}`` sont utilisés dans moodle. Mettre ``unsafe`` à ``False`` pour ne pas remplacer les ``<span>`` (`utils.py`) + +On peut fournir un un modèle LaTeX de sujet contenant ```%%%Exam content%%%``` à l'endroit où mettre le contenu de l'exam + +```bash +usage: mood2amc.py [-h] [-m MOODLEDB] [-u] [-d DESTINATION] [-s SUB_DIR] + +Convertir un export de base de questions moodle en sujet AMC +ex : +‣./mood2amc.py -m base-de-questions_moodle.xml +‣./mood2amc.py -u -m data/base-de-questions_moodle.xml -d data -s images +‣./mood2amc.py -m bdm.xml -d /home/user/Documents/Exams/mon_super_exam + +optional arguments: + -h, --help show this help message and exit + -m MOODLEDB, --moodledb MOODLEDB + la base de questions moodle xml à convertir + -u, --unsafe convertir les <span> monospace en listings (dangereux) + -d DESTINATION, --destination DESTINATION + dossier de destination + -s SUB_DIR, --sub_dir SUB_DIR + Dossier où mettre les images et listings (sous-dossier de destination) +``` diff --git a/XML_Moodle.py b/XML_Moodle.py index fc86b8c517712fda5bdfd08768e17c26735ba4ed..adedbe38d7f0fc66747ea19d1f93794a2b8e36a4 100755 --- a/XML_Moodle.py +++ b/XML_Moodle.py @@ -3,6 +3,7 @@ import xml.etree.ElementTree as ET from unidecode import unidecode from utils import strip_tags, mlang_2_multiling, score_2_str import base64 +from sys import path from PIL import Image from io import BytesIO from re import findall,DOTALL @@ -52,21 +53,46 @@ class Quizz: def __str__(self): res = "" - digest ="%%%Exemple d'examen\n\t\t%\\cleargroup{exam}\n" + count = 0 for c,c_q in self.questions.items(): - tmp = "\t\t%\\shufflegroup{"+self.categories[c]+"}%("+c+"):" - count = 0 for q in c_q: res += str(q) count += 1 + print(count, "questions processed.") + return res + + def get_exam(self, output_path, model=None): + digest ="%%%Exemple d'examen\n\t\t\\cleargroup{exam}\n" + totalq = 0 + totalpoints = 0 + for c,c_q in self.questions.items(): + tmp = "\t\t\\shufflegroup{"+self.categories[c]+"}%("+c+"): " + count = 0 + score = 0 + for q in c_q: + count += 1 + score += q.max + totalq += 1 + totalpoints += q.max if count > 0: - digest += f"{tmp}{count} questions\n\t\t%\\copygroup[{int(count / 2)}]" + "{" + self.categories[c] + "}" + "{exam}\n" - return digest+"\t\t%\shufflegroup{exam}\n\t\t%\insertgroup{exam}\n\n"+res + digest += f"{tmp}{count} questions for {score} points\n\t\t%\\copygroup[{count}]" + "{" + self.categories[c] + "}" + "{exam}\n" + digest += "\t\t\shufflegroup{exam}\n\t\t\insertgroup{exam}\n" + digest += f"%{totalq} questions for a total of {totalpoints} points\n" + if model==None: + model = path[0]+"/model.tex" + f = open(model, "r") + model = f.read() + f.close() + output_f = open(output_path[:-7]+".tex", "w") + output_f.write(model.replace("\\begin{document}","\\begin{document}\n\\input{"+output_path+"}").replace("%%%Exam content%%%", digest)) + output_f.close() def save(self): name = self.file_name[self.file_name.rfind('/')+1:self.file_name.rfind('.')] - output = open(self.folder+"/"+name+".tex", "w") + output = open(self.folder+name+".db.tex", "w") output.write(self.__str__()) + output.close() + self.get_exam(self.folder+name+".db.tex") class Question: def __init__(self,xmlQ,c,n,f,x,r=False): diff --git a/model.tex b/model.tex new file mode 100644 index 0000000000000000000000000000000000000000..a7339f4d9d65fc2d465e9e461b823bcd200f2bfb --- /dev/null +++ b/model.tex @@ -0,0 +1,29 @@ +\documentclass{Exam-QCM} %perso +\usepackage[utf8x]{inputenc} +\usepackage[T1]{fontenc} +\usepackage[lang=EN,box,completemulti]{automultiplechoice}%multiple choice +\usepackage[french,english]{babel} +\PrerenderUnicode{°—}%pour les en-têtes +\usepackage{commandesPerso} %perso contains \multiling +\title{TODO} +\subtitle{TODO} +\author{TODO} +\public{TODO} +\institution{TODO} +\date{TODO} +\docs{Tous documents papier autorisés.} +\noteMax{20} +%\xtraComment{} +\qrm +\id +\duree{90} +\begin{document} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Composition de l'examen % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + \begin{examcopy}[1] + \maketitle %en-têtes + %%%Exam content%%% + \AMCcleardoublepage%Pour l'impression recto-verso + \end{examcopy} +\end{document}