Blame lib/dbtexmf/dblatex/runtex.py

Packit Service 76cb02
#
Packit Service 76cb02
# Basic module compiling a file with LaTeX
Packit Service 76cb02
#
Packit Service 76cb02
import os
Packit Service 76cb02
import re
Packit Service 76cb02
import shutil
Packit Service cd7d79
from io import open
Packit Service 76cb02
Packit Service cd7d79
from dbtexmf.dblatex.grubber.texbuilder import LatexBuilder
Packit Service 76cb02
Packit Service 76cb02
Packit Service 76cb02
class RunLatex:
Packit Service 76cb02
    def __init__(self):
Packit Service 76cb02
        self.fig_paths = []
Packit Service 76cb02
        self.index_style = ""
Packit Service 76cb02
        self.backend = "pdftex"
Packit Service 76cb02
        self.texpost = ""
Packit Service 76cb02
        self.texer = LatexBuilder()
Packit Service 76cb02
Packit Service 76cb02
    def set_fig_paths(self, paths):
Packit Service 76cb02
        # Assume the paths are already absolute
Packit Service 76cb02
        if not(paths):
Packit Service 76cb02
            return
Packit Service 76cb02
Packit Service 76cb02
        # Use TEXINPUTS to handle paths containing spaces
Packit Service 76cb02
        paths_blank = []
Packit Service 76cb02
        paths_input = []
Packit Service 76cb02
        for p in paths:
Packit Service 76cb02
            if p.find(" ") != -1:
Packit Service 76cb02
                paths_blank.append(p + "//")
Packit Service 76cb02
            else:
Packit Service 76cb02
                paths_input.append(p)
Packit Service 76cb02
Packit Service 76cb02
        if paths_blank:
Packit Service 76cb02
            texinputs = os.pathsep.join(paths_blank)
Packit Service 76cb02
            os.environ["TEXINPUTS"] = os.getenv("TEXINPUTS") + os.pathsep + \
Packit Service 76cb02
                                      texinputs
Packit Service 76cb02
Packit Service 76cb02
        paths = paths_input
Packit Service 76cb02
Packit Service 76cb02
        # Unixify the paths when under Windows
Packit Service 76cb02
        if os.sep != "/":
Packit Service 76cb02
            paths = [p.replace(os.sep, "/") for p in paths]
Packit Service 76cb02
Packit Service 76cb02
        # Protect from tilde active char (maybe others?)
Packit Service 76cb02
        self.fig_paths = [p.replace("~", r"\string~") for p in paths]
Packit Service 76cb02
Packit Service 76cb02
    def set_bib_paths(self, bibpaths, bstpaths=None):
Packit Service 76cb02
        # Just set BIBINPUTS and/or BSTINPUTS
Packit Service 76cb02
        if bibpaths:
Packit Service 76cb02
            os.environ["BIBINPUTS"] = os.pathsep.join(bibpaths +
Packit Service 76cb02
                                                   [os.getenv("BIBINPUTS", "")])
Packit Service 76cb02
        if bstpaths:
Packit Service 76cb02
            os.environ["BSTINPUTS"] = os.pathsep.join(bstpaths +
Packit Service 76cb02
                                                   [os.getenv("BSTINPUTS", "")])
Packit Service 76cb02
Packit Service 76cb02
    def set_backend(self, backend):
Packit Service 76cb02
        if not(backend in ("dvips", "pdftex", "xetex")):
Packit Service 76cb02
            raise ValueError("'%s': invalid backend" % backend)
Packit Service 76cb02
        self.backend = backend
Packit Service 76cb02
Packit Service 76cb02
    def get_backend(self):
Packit Service 76cb02
        return self.backend
Packit Service 76cb02
Packit Service 76cb02
    def _clear_params(self):
Packit Service 76cb02
        self._param_started = 0
Packit Service 76cb02
        self._param_ended = 0
Packit Service 76cb02
        self._params = {}
Packit Service 76cb02
Packit Service 76cb02
    def _set_params(self, line):
Packit Service 76cb02
        # FIXME
Packit Service 76cb02
        if self._param_ended:
Packit Service 76cb02
            return
Packit Service 76cb02
        if not(self._param_started):
Packit Service 76cb02
            if line.startswith("%%<params>"): self._param_started = 1
Packit Service 76cb02
            return
Packit Service 76cb02
        if line.startswith("%%</params>"):
Packit Service 76cb02
            self._param_ended = 1
Packit Service 76cb02
            return
Packit Service 76cb02
        # Expected format is: '%% <param_name> <param_string>\n'
Packit Service 76cb02
        p = line.split(" ", 2)
Packit Service 76cb02
        self._params[p[1]] = p[2].strip()
Packit Service 76cb02
Packit Service 76cb02
    def compile(self, texfile, binfile, format, batch=1):
Packit Service 76cb02
        root = os.path.splitext(texfile)[0]
Packit Service 76cb02
        tmptex = root + "_tmp" + ".tex"
Packit Service 76cb02
        texout = root + "." + format
Packit Service 76cb02
Packit Service 76cb02
        # The temporary file contains the extra paths
Packit Service cd7d79
        f = open(tmptex, "wt", encoding="latin-1")
Packit Service 76cb02
        if self.fig_paths:
Packit Service 76cb02
            paths = "{" + "//}{".join(self.fig_paths) + "//}"
Packit Service cd7d79
            f.write(u"\\makeatletter\n")
Packit Service cd7d79
            f.write(u"\\def\\input@path{%s}\n" % paths)
Packit Service cd7d79
            f.write(u"\\makeatother\n")
Packit Service 76cb02
Packit Service 76cb02
        # Copy the original file and collect parameters embedded in the tex file
Packit Service 76cb02
        self._clear_params()
Packit Service cd7d79
        input = open(texfile, "rt", encoding="latin-1")
Packit Service 76cb02
        for line in input:
Packit Service 76cb02
            self._set_params(line)
Packit Service 76cb02
            f.write(line)
Packit Service 76cb02
        f.close()
Packit Service 76cb02
        input.close()
Packit Service 76cb02
Packit Service 76cb02
        # Replace the original file with the new one
Packit Service 76cb02
        shutil.move(tmptex, texfile)
Packit Service 76cb02
Packit Service 76cb02
        # Build the output file
Packit Service 76cb02
        try:
Packit Service 76cb02
            self.texer.batch = batch
Packit Service 76cb02
            self.texer.texpost = self.texpost
Packit Service 76cb02
            self.texer.encoding = self._params.get("latex.encoding", "latin-1")
Packit Service 76cb02
            self.texer.options = self._params.get("latex.engine.options")
Packit Service 76cb02
            self.texer.lang = self._params.get("document.language")
Packit Service 76cb02
            self.texer.set_format(format)
Packit Service 76cb02
            self.texer.set_backend(self.backend)
Packit Service 76cb02
            if self.index_style:
Packit Service 76cb02
                self.texer.index.style = self.index_style
Packit Service 76cb02
            self.texer.index.tool = self._params.get("latex.index.tool")
Packit Service 76cb02
            self.texer.index.lang = self._params.get("latex.index.language")
Packit Service 76cb02
            self.texer.compile(texfile)
Packit Service 76cb02
            self.texer.print_misschars()
Packit Service 76cb02
        except:
Packit Service 76cb02
            # On error, dump the log errors and raise again
Packit Service 76cb02
            self.texer.print_errors()
Packit Service 76cb02
            raise
Packit Service 76cb02
Packit Service 76cb02
        if texout != binfile:
Packit Service 76cb02
            shutil.move(texout, binfile)
Packit Service 76cb02
Packit Service 76cb02
    def clean(self):
Packit Service 76cb02
        self.texer.clean()
Packit Service 76cb02
Packit Service 76cb02
    def reinit(self):
Packit Service 76cb02
        self.texer.reinit()
Packit Service 76cb02