Blame lib/dbtexmf/xslt/xsltproc.py

Packit Service 76cb02
#
Packit Service 76cb02
# Basic wrapper for xsltproc. Maybe we should directly use the lixslt Python
Packit Service 76cb02
# API.
Packit Service 76cb02
#
Packit Service cd7d79
import sys
Packit Service 76cb02
import os
Packit Service 76cb02
import logging
Packit Service 76cb02
import re
Packit Service 76cb02
from subprocess import call, Popen, PIPE
Packit Service 76cb02
Packit Service 76cb02
class XsltProc:
Packit Service 76cb02
    def __init__(self):
Packit Service 76cb02
        self.catalogs = os.getenv("SGML_CATALOG_FILES")
Packit Service 76cb02
        self.use_catalogs = 1
Packit Service 76cb02
        self.log = logging.getLogger("dblatex")
Packit Service 76cb02
        self.run_opts = ["--xinclude"]
Packit Service 76cb02
        # If --xincludestyle is supported we *must* use it to support external
Packit Service 76cb02
        # listings (see mklistings.xsl and pals)
Packit Service 76cb02
        if self._has_xincludestyle():
Packit Service 76cb02
            self.run_opts.append("--xincludestyle")
Packit Service 76cb02
Packit Service 76cb02
    def get_deplist(self):
Packit Service 76cb02
        return ["xsltproc"]
Packit Service 76cb02
Packit Service 76cb02
    def run(self, xslfile, xmlfile, outfile, opts=None, params=None):
Packit Service 76cb02
        cmd = ["xsltproc", "-o", os.path.basename(outfile)] + self.run_opts
Packit Service 76cb02
        if self.use_catalogs and self.catalogs:
Packit Service 76cb02
            cmd.append("--catalogs")
Packit Service 76cb02
        if params:
Packit Service 76cb02
            for param, value in params.items():
Packit Service 76cb02
                cmd += ["--param", param, "'%s'" % value]
Packit Service 76cb02
        if opts:
Packit Service 76cb02
            cmd += opts
Packit Service 76cb02
        cmd += [xslfile, xmlfile]
Packit Service 76cb02
        self.system(cmd)
Packit Service 76cb02
Packit Service 76cb02
    def system(self, cmd):
Packit Service 76cb02
        self.log.debug(" ".join(cmd))
Packit Service 76cb02
        rc = call(cmd)
Packit Service 76cb02
        if rc != 0:
Packit Service 76cb02
            raise ValueError("xsltproc failed")
Packit Service 76cb02
Packit Service 76cb02
    def _has_xincludestyle(self):
Packit Service 76cb02
        # check that with help output the option is there
Packit Service 76cb02
        p = Popen(["xsltproc"], stdout=PIPE)
Packit Service 76cb02
        data = p.communicate()[0]
Packit Service cd7d79
        if isinstance(data, bytes):
Packit Service cd7d79
            data = data.decode(sys.getdefaultencoding())
Packit Service 76cb02
        m = re.search("--xincludestyle", data, re.M)
Packit Service 76cb02
        if not(m):
Packit Service 76cb02
            return False
Packit Service 76cb02
        else:
Packit Service 76cb02
            return True
Packit Service 76cb02
Packit Service 76cb02
Packit Service 76cb02
class Xslt(XsltProc):
Packit Service 76cb02
    "Plugin Class to load"