varsubst.py 1.55 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11
#
# Variable substitution. Variables are $delimited$
#
import string
import regex
import regsub

error = 'varsubst.error'

class Varsubst:
    def __init__(self, dict):
Guido van Rossum's avatar
Guido van Rossum committed
12 13 14
        self.dict = dict
        self.prog = regex.compile('\$[a-zA-Z0-9_]*\$')
        self.do_useindent = 0
15 16

    def useindent(self, onoff):
Guido van Rossum's avatar
Guido van Rossum committed
17 18
        self.do_useindent = onoff
        
19
    def subst(self, str):
Guido van Rossum's avatar
Guido van Rossum committed
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
        rv = ''
        while 1:
            pos = self.prog.search(str)
            if pos < 0:
                return rv + str
            if pos:
                rv = rv + str[:pos]
                str = str[pos:]
            len = self.prog.match(str)
            if len == 2:
                # Escaped dollar
                rv = rv + '$'
                str = str[2:]
                continue
            name = str[1:len-1]
            str = str[len:]
            if not self.dict.has_key(name):
                raise error, 'No such variable: '+name
            value = self.dict[name]
            if self.do_useindent and '\n' in value:
                value = self._modindent(value, rv)
            rv = rv + value
42 43

    def _modindent(self, value, old):
Guido van Rossum's avatar
Guido van Rossum committed
44 45 46 47
        lastnl = string.rfind(old, '\n', 0) + 1
        lastnl = len(old) - lastnl
        sub = '\n' + (' '*lastnl)
        return regsub.gsub('\n', sub, value)
48 49 50 51 52 53 54 55 56 57 58 59 60 61

def _test():
    import sys
    import os

    sys.stderr.write('-- Copying stdin to stdout with environment map --\n')
    c = Varsubst(os.environ)
    c.useindent(1)
    d = sys.stdin.read()
    sys.stdout.write(c.subst(d))
    sys.exit(1)

if __name__ == '__main__':
    _test()