|
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 |
|