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