diff --git a/README.md b/README.md index 78b328bf999ad9cd51a7a9fc34dd999f43a6ecf5..57dcdd892e165b3de85f02e4f6bb17ec87908323 100644 --- a/README.md +++ b/README.md @@ -25,3 +25,5 @@ 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`) diff --git a/XML_Moodle.py b/XML_Moodle.py index b77d20bb04220ee50a322b7155167f0e90fc5546..e348267676122e259a041041c9b7dff4758ca06b 100755 --- a/XML_Moodle.py +++ b/XML_Moodle.py @@ -56,7 +56,7 @@ class Quizz: class Question: def __init__(self,xmlQ,c,n,f): self.folder = f - self.q = mlang_2_multiling(strip_tags(xmlQ.find("questiontext/text").text, self.folder)) + self.q = strip_tags(mlang_2_multiling(xmlQ.find("questiontext/text").text), self.folder) self.category = c self.id = f"{c[c.rfind(':')+1:]}_{n}" self.env = "todo:"+xmlQ.attrib["type"] @@ -66,15 +66,13 @@ class Question: def parseImages(self, file_elements): for i in file_elements: name = i.attrib["name"] - print(name) im = Image.open(BytesIO(base64.b64decode(i.text))) ext = name[name.rfind('.')+1:].upper() im.save(self.folder+"/"+name, ext) def __str__(self): - return """\\element{"""+self.category+"""}{ - \\begin{"""+self.env+"""}{"""+self.id+"""}\\nbpoints{"""+score_2_str(self.max)+"""} - """+self.q+"\\end{"+self.env+"}\n" + #return "\\element{" + self.category + "}{\n\t\\begin{" + self.env + "}{" + self.id + "}\\nbpoints{" + score_2_str(self.max) + "}\n\t\t" + self.q + "\\end{" + self.env + "}\n" + return "" class Answer: def __init__(self,t,b,max,fb): @@ -116,8 +114,8 @@ class MCQ(Question): for a in xmlQ.findall("answer"): fb = a.find("feedback/text").text if fb != None: - fb = mlang_2_multiling(strip_tags(fb, self.folder)) - self.choices.append(Answer(mlang_2_multiling(strip_tags(a.find("text").text, self.folder)), a.attrib['fraction'], self.max, fb)) + fb = strip_tags(mlang_2_multiling(fb), self.folder) + self.choices.append(Answer(strip_tags(mlang_2_multiling(a.find("text").text), self.folder), a.attrib['fraction'], self.max, fb)) def get_choice_env(self): if self.choice_type == MCQ.VERTICAL: @@ -134,7 +132,7 @@ class MCQ(Question): res += "\n" for c in self.choices: res += str(c) - res += "\n\t\t\\end{"+self.get_choice_env()+"}\n\t\\end{"+self.env+"}\n}\n\n" + res += "\t\t\\end{"+self.get_choice_env()+"}\n\t\\end{"+self.env+"}\n}\n\n" return res class TF(MCQ): @@ -143,14 +141,14 @@ class TF(MCQ): self.choices = [] self.env = "question" self.shuffle = False - if self.__class__.__name__ == "MCQ": + if self.__class__.__name__ == "TF": self.__parseAnswers(xmlQ) def __parseAnswers(self, xmlQ): for a in xmlQ.findall("answer"): fb = a.find("feedback/text").text if fb != None: - fb = mlang_2_multiling(strip_tags(fb, self.folder)) + fb = strip_tags(mlang_2_multiling(fb), self.folder) if a.find("text").text == "true": self.choices.append(Answer("\\multiling{vrai}{true}", a.attrib['fraction'], self.max, fb)) else: diff --git a/utils.py b/utils.py index 22b2e54d4e2030f09c4a9cdb65c8156c7d8f0ee3..37561b97747192145eec23bff251c1a63e886962 100644 --- a/utils.py +++ b/utils.py @@ -3,6 +3,8 @@ from re import compile,sub,escape from html import unescape from urllib.parse import unquote +unsafe = True + def html_2_tex(text): #https://code.activestate.com/recipes/81330-single-pass-multiple-replace/ # dict = {' ': '~', '>':'>', '<': '<'} @@ -17,19 +19,23 @@ def html_2_tex(text): def remove_moodle_cdata(txt, folder): - return sub(r'<img src="[^/]*/([^"]*)" (alt="([^"]*)")?[^>]*>', r"""\\begin{figure}[h!] + global unsafe + res = sub(r'<img src="[^/]*/([^"]*)" (alt="([^"]*)")?[^>]*>', r"""\\begin{figure}[h!] \\begin{center} \\includegraphics[width=0.8\\linewidth]{$$$$folder$$$$/\1} \\end{center} \\caption{\3} \\end{figure} -""",txt).replace("<![CDATA[","").replace("]]>","").replace("$$$$folder$$$$", folder) +""",txt).replace("<![CDATA[","").replace("]]>","").replace("$$$$folder$$$$", folder).replace("<strong>","\\emph{").replace("</strong>","}").replace("<pre>","\\begin{lstlisting}[language=Python]\n").replace("</pre>","\\end{lstlisting}\n") + if unsafe: + res = res.replace('<span style="font:monospace">',"\lstinline[language=python]|").replace('<span style="font-family:monospace">',"\lstinline[language=python]|").replace("</span>","|") + return res def strip_tags(txt, folder): return html_2_tex(sub(compile('<.*?>'), '',remove_moodle_cdata(unquote(txt), folder))) def mlang_2_multiling(txt): - return sub(r"\{mlang en\}(.*?)\{mlang\}((\{mlang other\})|(\{mlang fr\}))(.*?)\{mlang\}", r"\\multiling{\5}{\1}",txt) + return sub(r"\{mlang\s*en\}([^\{]*?)\{mlang\}\s*((\{mlang\s*other\})|(\{mlang\s*fr\})|(\{mlang\}))([^\{]*)\{mlang\}", r"\\multiling{\6}{\1}",txt) def score_2_str(v): if int(v)==float(v):