Blob Blame History Raw
# This file is part of Rubber and thus covered by the GPL
# (c) Emmanuel Beffara, 2002--2006
"""
pdfLaTeX support for Rubber.

When this module loaded with the otion 'dvi', the document is compiled to DVI
using pdfTeX.

The module optimizes the pdflatex calls by setting -draftmode and apply a last
call to build the final PDF output.
"""
import sys
import os
import re
import subprocess
from subprocess import Popen, PIPE

from dbtexmf.dblatex.grubber.msg import _, msg
from dbtexmf.dblatex.grubber.plugins import TexModule


class Module (TexModule):
    def __init__ (self, doc, dict):
        self.doc = doc
        doc.program = "pdflatex"
        doc.engine = "pdfTeX"
        # FIXME: how to handle opt=dvi with file.tex passed?
        # FIXME: can we add commands after the file?
        doc.set_format("pdf")

        # Check the version to know if -draftmode is supported
        if (self._draft_is_supported()):
            self.doc.draft_support = True
        else:
            self.doc.draft_support = False
        #self.draft_support = False

    def _draft_is_supported(self):
        # FIXME: find a clean method to pass these options
        opts = os.getenv("DBLATEX_PDFTEX_OPTIONS", "")
        if not("-draftmode" in opts):
            return False
        return (self._get_version() == "1.40")

    def pre_compile(self):
        if not(self.doc.draft_support):
            return

        # Add -draftmode to prevent intermediate pdf output
        self.doc.opts.append("-draftmode")

    def last_compile(self):
        # If pdftex has no ability to work in draftmode, or if no final PDF
        # is required, do nothing
        if not(self.doc.draft_support) or self.doc.draft_only:
            return

        # Remove the -draftmode to have the PDF output, and compile again
        self.doc.opts.remove("-draftmode")
        rc = self.doc.compile()
        return rc

    def _get_version(self):
        """
        Parse something like:

          pdfTeX using libpoppler 3.141592-1.40.3-2.2 (Web2C 7.5.6)
          kpathsea version 3.5.6
          Copyright 2007 Peter Breitenlohner (eTeX)/Han The Thanh (pdfTeX).
          Kpathsea is copyright 2007 Karl Berry and Olaf Weber.
          ...
        and return '1.40'
        """
        # Grab the major version number
        p = Popen("pdflatex -version", shell=True, stdout=PIPE)
        data = p.communicate()[0]
        if isinstance(data, bytes):
            data = data.decode(sys.getdefaultencoding())
        m = re.search("pdfTeX.*3.14[^-]*-(\d*.\d*)", data, re.M)
        if not(m):
            return ""
        else:
            return m.group(1)