def do_xslt(self, mode): """Fait la transformation XSLT sur self.doc_string, y'a beaucoup de code en commun donc ça change pas. Doit être fait dans le dossier de CoMFoRT. @param mode: ou bien pdf, ou bien html @return: la chaîne résultant de la transformation""" if mode == "pdf": xsl_file = os.path.join('templates','xsl','fo','docbook.xsl') elif mode == "xhtml": xsl_file = os.path.join('templates','xsl','xhtml','docbook.xsl') #définition de la fonction de la transformation xslt xsl_doc = etree.parse(xsl_file) ac = etree.XSLTAccessControl(read_file=True) transform = etree.XSLT(xsl_doc, access_control=ac) if mode == "pdf": opts = {} elif mode == "xhtml": opts = {'html.stylesheet' : "'"+confstatic.get_style_url(self.pagename["page_style"])+"'", 'generate.toc' : "'article nop'"} try: doc_tree = etree.fromstring(self.doc_string) except etree.XMLSyntaxError, e: utils.error_page(""" Erreur erreur ! Un module a généré du mauvais DocBook. Le DocBook était le suivant, merci de nous envoyer un rapport de bug assorti du DocBook ci-dessous et de l'exception. Exception: %s DocBook %s """ % (e, utils.htmlentities(self.doc_string.decode("utf-8")).encode("latin1"))) sys.exit(0)
def generate_pdf(self, redir=True): """Génération format PDF.""" utils.mkdirp(confstatic.generate_path) self.generate_header() self.generate_body("pdf") if conf_general.pdfmode == "fop": fo_string = self.do_xslt("pdf") (fd, fname) = tempfile.mkstemp(suffix=".xml", text=True) f = os.fdopen(fd, "w") f.write(fo_string) f.close() args2 = self.args.copy() args2["pdf"] = "1" p = subprocess.Popen([confstatic.fop_path, "-fo", fname, "-pdf", os.path.join(confstatic.generate_path, confstatic.build_url(args2))], stdout=subprocess.PIPE, stderr=subprocess.PIPE) r = p.wait() if r: utils.error_page(_("""Impossible de lancer FOP. Code de retour d'erreur : %d. Voici la sortie standard : %s Voici la sortie d'erreur : %s Le fichier xml %s a été gardé (à joindre à tout rapport de bug) """ % (r, p.stdout.read(), p.stderr.read(), fname))) if not r: os.remove(fname) elif conf_general.pdfmode == "latex": (fd, fname) = tempfile.mkstemp(suffix=".xml", text=True) f = os.fdopen(fd, "w") f.write(self.doc_string) f.close() args2 = self.args.copy() args2["pdf"] = "1" if os.name == "nt": dblpath = confstatic.nt_python_path+"python.exe" else: dblpath = confstatic.dblatex_path() p = subprocess.Popen([dblpath, "--pdf", "-s", "db2latex", "-o", os.path.join(confstatic.generate_path, confstatic.build_url(args2)), fname], stdout=subprocess.PIPE, stderr=subprocess.PIPE) r = p.wait() if r: utils.error_page(_("""Erreur au lancement de DBLatex. Les raisons possibles sont : - utilisation d'un GIF animé (déconseillé) ; - oubli d'un sous-titre. - mauvais droits (supprimez /tmp/comfortlog (ou c:\\Windows\\TEMP\\comfortlog), rechargez la page, et regardez le contenu du fichier Si vous ne pouvez pas faire autrement, utilisez FOP (à changer dans la configuration). Code de retour d'erreur : %d. Sortie standard : %s Sortie d'erreur : %s Le fichier XML cité ci-dessus a été conservé, donnez-le nous pour tout rapport de bug""" % (r, p.stdout.read(), p.stderr.read()))) if not r: os.remove(fname) if redir and not r: utils.redir("%s/%s" % (confstatic.generate_url,confstatic.build_url(args2)))