Blame lib/dbtexmf/dblatex/grubber/texbuilder.py

Packit 0f19cf
# This file is part of Rubber and thus covered by the GPL
Packit 0f19cf
# (c) Emmanuel Beffara, 2002--2006
Packit 0f19cf
"""
Packit 0f19cf
LaTeX document building system for Grubber.
Packit 0f19cf
Packit 0f19cf
This module is specific to Grubber and provides a class that encapsulates some
Packit 0f19cf
of the rubber internals.
Packit 0f19cf
"""
Packit 0f19cf
import subprocess
Packit 0f19cf
import os
Packit 0f19cf
import shlex
Packit 0f19cf
from msg import _, msg
Packit 0f19cf
from maker import Maker
Packit 0f19cf
from latex import Latex
Packit 0f19cf
Packit 0f19cf
Packit 0f19cf
class IndexBuilder:
Packit 0f19cf
    """
Packit 0f19cf
    Index configuration data to set the index tool maker to use
Packit 0f19cf
    """
Packit 0f19cf
    def __init__(self):
Packit 0f19cf
        self.style = ""
Packit 0f19cf
        self.tool = ""
Packit 0f19cf
        self.lang = ""
Packit 0f19cf
Packit 0f19cf
class LatexBuilder:
Packit 0f19cf
    """
Packit 0f19cf
    Main (g)rubber wrapper hiding all the internals and compiling the
Packit 0f19cf
    required tex file.
Packit 0f19cf
    """
Packit 0f19cf
    def __init__(self):
Packit 0f19cf
        # The actual workers
Packit 0f19cf
        self.maker = Maker()
Packit 0f19cf
        self.tex = Latex(self.maker)
Packit 0f19cf
        self.maker.dep_append(self.tex)
Packit 0f19cf
Packit 0f19cf
        # What to do
Packit 0f19cf
        self.backend = "pdftex"
Packit 0f19cf
        self.format = "pdf"
Packit 0f19cf
        self.index_style = ""
Packit 0f19cf
        self.batch = 1
Packit 0f19cf
        self.encoding = "latin-1"
Packit 0f19cf
        self.texpost = ""
Packit 0f19cf
        self.options = ""
Packit 0f19cf
        self.lang = ""
Packit 0f19cf
        self.index = IndexBuilder()
Packit 0f19cf
Packit 0f19cf
    def set_format(self, format):
Packit 0f19cf
        # Just record it
Packit 0f19cf
        self.format = format
Packit 0f19cf
Packit 0f19cf
    def set_backend(self, backend):
Packit 0f19cf
        self.backend = backend
Packit 0f19cf
Packit 0f19cf
#    def set_index_style(self, index_style):
Packit 0f19cf
#        self.index_style = index_style
Packit 0f19cf
Packit 0f19cf
    def _texpost_call(self, source, msg):
Packit 0f19cf
        if isinstance(self.texpost, str):
Packit 0f19cf
            # Expect an external script
Packit 0f19cf
            cmd = [self.texpost, source]
Packit 0f19cf
            msg.log(" ".join(cmd))
Packit 0f19cf
            rc = subprocess.call(cmd, stdout=msg.stdout)
Packit 0f19cf
        else:
Packit 0f19cf
            # Expect a loaded python module
Packit 0f19cf
            rc = self.texpost.main(source, msg.stdout)
Packit 0f19cf
        return rc
Packit 0f19cf
Packit 0f19cf
    def compile(self, source):
Packit 0f19cf
        self.tex.batch = self.batch
Packit 0f19cf
        self.tex.encoding = self.encoding
Packit 0f19cf
        self.tex.lang = self.lang
Packit 0f19cf
        self.tex.set_source(source)
Packit 0f19cf
        if self.options:
Packit 0f19cf
            self.tex.opts += shlex.split(self.options)
Packit 0f19cf
Packit 0f19cf
        # Load the modules needed to produce the expected output format
Packit 0f19cf
        if (self.format == "pdf"):
Packit 0f19cf
            if (self.backend == "pdftex"):
Packit 0f19cf
                self.tex.modules.register("pdftex")
Packit 0f19cf
            elif (self.backend == "xetex"):
Packit 0f19cf
                self.tex.modules.register("xetex")
Packit 0f19cf
            else:
Packit 0f19cf
                self.tex.modules.register("dvips")
Packit 0f19cf
                self.tex.modules.register("ps2pdf")
Packit 0f19cf
        elif (self.format == "ps"):
Packit 0f19cf
            self.tex.modules.register("dvips")
Packit 0f19cf
Packit 0f19cf
        # Now load other the modules required to compile this file
Packit 0f19cf
        self.tex.prepare()
Packit 0f19cf
Packit 0f19cf
        # Set the index configuration
Packit 0f19cf
        if self.tex.modules.has_key("makeidx"):
Packit 0f19cf
            idx = self.tex.modules["makeidx"]
Packit 0f19cf
            if self.index.style: idx.do_style(self.index.style)
Packit 0f19cf
            if self.index.tool: idx.do_tool(self.index.tool)
Packit 0f19cf
            if self.index.lang: idx.do_language(self.index.lang)
Packit 0f19cf
Packit 0f19cf
        # Let's go...
Packit 0f19cf
        rc = self.maker.make()
Packit 0f19cf
        if rc != 0:
Packit 0f19cf
            raise OSError("%s compilation failed" % self.tex.program)
Packit 0f19cf
Packit 0f19cf
        # Post process script to call?
Packit 0f19cf
        if not(self.texpost):
Packit 0f19cf
            return
Packit 0f19cf
Packit 0f19cf
        os.environ["LATEX"] = self.tex.program
Packit 0f19cf
        rc = self._texpost_call(source, msg)
Packit 0f19cf
        if rc == 1:
Packit 0f19cf
            return
Packit 0f19cf
        if rc != 0:
Packit 0f19cf
            raise OSError("%s texpost failed" % self.texpost)
Packit 0f19cf
Packit 0f19cf
        rc = self.maker.make(force=1)
Packit 0f19cf
        if rc != 0:
Packit 0f19cf
            raise OSError("%s post compilation failed" % self.tex.program)
Packit 0f19cf
Packit 0f19cf
    def clean(self):
Packit 0f19cf
        self.tex.clean()
Packit 0f19cf
        self.reinit()
Packit 0f19cf
Packit 0f19cf
    def reinit(self):
Packit 0f19cf
        self.tex.reinit()
Packit 0f19cf
        self.maker.reinit()
Packit 0f19cf
        self.maker.dep_append(self.tex)
Packit 0f19cf
Packit 0f19cf
    def print_errors(self):
Packit 0f19cf
        msg.display_all(self.tex.get_errors(), writer=msg.write_stderr)
Packit 0f19cf
Packit 0f19cf
    def print_misschars(self):
Packit 0f19cf
        # Show the characters not handled by fonts
Packit 0f19cf
        self.tex.print_misschars()
Packit 0f19cf