Blame lib/dbtexmf/core/txtparser.py

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