Beispiel #1
0
  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)
Beispiel #2
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)))