# This file is covered by the GPL as part of Rubber. # (c) Emmanuel Beffara, 2002--2006 """ Conversion of XFig graphics into various formats. """ from rubber import _, msg from rubber import * import string, re class Dep (Depend): """ This class represents dependency nodes from XFig files to standard graphics formats (i.e. not combined ps/latex). """ def __init__ (self, env, target, source): leaf = DependLeaf(env, source) Depend.__init__(self, env, [target], {source: leaf}) self.env = env self.source = source # Here we assume the target has an extension of a standard form, i.e. # its requested type can be deduced from the part of its name after # the last dot. We also assume that this extension is the name of the # appropriate language (it works fine in the cases where the module is # used, that is for eps, pdf and png). lang = target[string.rfind(target, ".")+1:] self.lang = string.upper(lang) self.cmd = ["fig2dev", "-L", lang, source, target] def run (self): msg.progress(_("converting %s to %s") % (self.source, self.lang)) if self.env.execute(self.cmd): msg.error(_("converstion of %s to %s failed") % (self.source, self.lang)) return 1 return 0 re_pstname = re.compile("(?P.*)\\.(?Peps|pstex|pdf|pdftex)_t") pst_lang = { "eps": ("pstex", "EPS"), "pstex": ("pstex", "EPS"), "pdf": ("pdftex", "PDF"), "pdftex": ("pdftex", "PDF") } class PSTDep (Depend): """ This class represents dependency nodes for combined EPS/LaTeX figures from XFig. They produce both a LaTeX source that contains an \\includegraphics and an EPS file. """ def __init__ (self, env, tex, fig, vars, loc={}): """ The arguments of the constructor are, respectively, the compilation environment, the LaTeX source produced, the source file name, and the parameters of the conversion rule.. """ leaf = DependLeaf(env, fig, loc=loc) self.env = env m = re_pstname.match(tex) base = m.group("base") type = m.group("type") figref = None doc_vars = vars["doc"].vars if type in ("eps", "pdf") and doc_vars.has_key("graphics"): suffixes = doc_vars["graphics"] for suff in ("eps", "pdf"): if "." + suff in suffixes: figref = base type = suff break figname = base + "." + type if figref is None: figref = figname lang, self.langname = pst_lang[type] Depend.__init__(self, env, prods=[tex, figname], sources={fig: leaf}, loc=loc) self.fig = fig self.cmd_t = ["fig2dev", "-L", lang + "_t", "-p", figref, fig, tex ] self.cmd_p = ["fig2dev", "-L", lang, fig, figname ] def run (self): msg.progress(_("converting %s into %s/LaTeX") % (self.fig, self.langname)) if self.env.execute(self.cmd_t): return 1 return self.env.execute(self.cmd_p) def check (vars, env): if not prog_available("fig2dev"): return None target = vars["target"] i = target.rfind(".") if i > 0 and target[i+1:] in ["eps_t", "pstex_t", "pdf_t", "pdftex_t"]: vars["mode"] = "pstex" else: vars["mode"] = "normal" return vars def convert (vars, env): if vars["mode"] == "pstex": return PSTDep(env, vars["target"], vars["source"], vars) else: return Dep(env, vars["target"], vars["source"])