|
Packit Service |
76cb02 |
#
|
|
Packit Service |
76cb02 |
# DbTex configuration parser. Maybe we could use or extend ConfigParser.
|
|
Packit Service |
76cb02 |
#
|
|
Packit Service |
76cb02 |
import os
|
|
Packit Service |
76cb02 |
import re
|
|
Packit Service |
76cb02 |
|
|
Packit Service |
76cb02 |
#
|
|
Packit Service |
76cb02 |
# Functions used by the config parsers and by the dbtex command parser
|
|
Packit Service |
76cb02 |
#
|
|
Packit Service |
76cb02 |
def texinputs_parse(strpath, basedir=None):
|
|
Packit Service |
76cb02 |
"""
|
|
Packit Service |
76cb02 |
Transform the TEXINPUTS string to absolute normalized paths,
|
|
Packit Service |
76cb02 |
but keep intact the '//' suffix if any. The absolute paths are
|
|
Packit Service |
76cb02 |
computed from current one or from <basedir> when specified.
|
|
Packit Service |
76cb02 |
"""
|
|
Packit Service |
76cb02 |
paths = []
|
|
Packit Service |
76cb02 |
for p in strpath.split(os.pathsep):
|
|
Packit Service |
76cb02 |
if not(os.path.isabs(p)):
|
|
Packit Service |
76cb02 |
if not(basedir):
|
|
Packit Service |
76cb02 |
d = os.path.realpath(p)
|
|
Packit Service |
76cb02 |
else:
|
|
Packit Service |
76cb02 |
d = os.path.normpath(os.path.join(basedir, p))
|
|
Packit Service |
76cb02 |
else:
|
|
Packit Service |
76cb02 |
d = os.path.normpath(p)
|
|
Packit Service |
76cb02 |
if p.endswith("//"):
|
|
Packit Service |
76cb02 |
d += "//"
|
|
Packit Service |
76cb02 |
paths.append(d)
|
|
Packit Service |
76cb02 |
return paths
|
|
Packit Service |
76cb02 |
|
|
Packit Service |
76cb02 |
def texstyle_parse(texstyle):
|
|
Packit Service |
76cb02 |
sty = os.path.basename(texstyle)
|
|
Packit Service |
76cb02 |
dir = os.path.dirname(texstyle)
|
|
Packit Service |
76cb02 |
if sty.endswith(".sty"):
|
|
Packit Service |
76cb02 |
path = os.path.realpath(dir)
|
|
Packit Service |
76cb02 |
sty = sty[:-4]
|
|
Packit Service |
76cb02 |
if not(os.path.isfile(texstyle)):
|
|
Packit Service |
76cb02 |
raise ValueError("Latex style '%s' not found" % texstyle)
|
|
Packit Service |
76cb02 |
elif (dir):
|
|
Packit Service |
76cb02 |
raise ValueError("Invalid latex style path: missing .sty")
|
|
Packit Service |
76cb02 |
else:
|
|
Packit Service |
76cb02 |
path = ""
|
|
Packit Service |
76cb02 |
return ("latex.style=%s" % sty, path)
|
|
Packit Service |
76cb02 |
|
|
Packit Service |
76cb02 |
|
|
Packit Service |
76cb02 |
|
|
Packit Service |
76cb02 |
class OptMap:
|
|
Packit Service |
76cb02 |
def __init__(self, option):
|
|
Packit Service |
76cb02 |
self.option = option
|
|
Packit Service |
76cb02 |
|
|
Packit Service |
76cb02 |
def format(self, dir, value):
|
|
Packit Service |
76cb02 |
return ["%s=%s" % (self.option, value)]
|
|
Packit Service |
76cb02 |
|
|
Packit Service |
76cb02 |
class PathMap(OptMap):
|
|
Packit Service |
76cb02 |
def format(self, dir, value):
|
|
Packit Service |
76cb02 |
if not(os.path.isabs(value)):
|
|
Packit Service |
76cb02 |
value = os.path.normpath(os.path.join(dir, value))
|
|
Packit Service |
76cb02 |
return OptMap.format(self, dir, value)
|
|
Packit Service |
76cb02 |
|
|
Packit Service |
76cb02 |
class TexMap(OptMap):
|
|
Packit Service |
76cb02 |
def format(self, dir, value):
|
|
Packit Service |
76cb02 |
paths = texinputs_parse(value, basedir=dir)
|
|
Packit Service |
76cb02 |
return OptMap.format(self, dir, ":".join(paths))
|
|
Packit Service |
76cb02 |
|
|
Packit Service |
76cb02 |
class NoneMap(OptMap):
|
|
Packit Service |
76cb02 |
def format(self, dir, value):
|
|
Packit Service |
76cb02 |
return value.split()
|
|
Packit Service |
76cb02 |
|
|
Packit Service |
76cb02 |
|
|
Packit Service |
76cb02 |
class TextConfig:
|
|
Packit Service |
76cb02 |
conf_mapping = {
|
|
Packit Service |
76cb02 |
'TexInputs' : TexMap('--texinputs'),
|
|
Packit Service |
76cb02 |
#'PdfInputs' : OptMap('--pdfinputs'),
|
|
Packit Service |
76cb02 |
'TexPost' : PathMap('--texpost'),
|
|
Packit Service |
76cb02 |
'FigPath' : PathMap('--fig-path'),
|
|
Packit Service |
76cb02 |
'XslParam' : PathMap('--xsl-user'),
|
|
Packit Service |
76cb02 |
'TexStyle' : OptMap('--texstyle'),
|
|
Packit Service |
76cb02 |
'Options' : NoneMap('')
|
|
Packit Service |
76cb02 |
}
|
|
Packit Service |
76cb02 |
|
|
Packit Service |
76cb02 |
def __init__(self):
|
|
Packit Service |
76cb02 |
self._options = []
|
|
Packit Service |
76cb02 |
self.reparam = re.compile("^\s*([^:=\s]+)\s*:\s*(.*)")
|
|
Packit Service |
76cb02 |
|
|
Packit Service |
76cb02 |
def options(self):
|
|
Packit Service |
76cb02 |
return self._options
|
|
Packit Service |
76cb02 |
|
|
Packit Service |
76cb02 |
def fromfile(self, file):
|
|
Packit Service |
76cb02 |
dir = os.path.dirname(os.path.realpath(file))
|
|
Packit Service |
76cb02 |
f = open(file)
|
|
Packit Service |
76cb02 |
|
|
Packit Service |
76cb02 |
for line in f:
|
|
Packit Service |
76cb02 |
# Remove the comment
|
|
Packit Service |
76cb02 |
line = line.split("#")[0]
|
|
Packit Service |
76cb02 |
m = self.reparam.match(line)
|
|
Packit Service |
76cb02 |
if not(m):
|
|
Packit Service |
76cb02 |
continue
|
|
Packit Service |
76cb02 |
key = m.group(1)
|
|
Packit Service |
76cb02 |
value = m.group(2).strip()
|
|
Packit Service |
76cb02 |
if not self.conf_mapping.has_key(key):
|
|
Packit Service |
76cb02 |
continue
|
|
Packit Service |
76cb02 |
o = self.conf_mapping[key]
|
|
Packit Service |
76cb02 |
|
|
Packit Service |
76cb02 |
# The paths can be relative to the config file
|
|
Packit Service |
76cb02 |
self._options += o.format(dir, value)
|
|
Packit Service |
76cb02 |
|
|
Packit Service |
76cb02 |
f.close()
|
|
Packit Service |
76cb02 |
|