# # Variable substitution. Variables are $delimited$ # import string import regex import regsub error = 'varsubst.error' class Varsubst: def __init__(self, dict): self.dict = dict self.prog = regex.compile('\$[a-zA-Z0-9_]*\$') self.do_useindent = 0 def useindent(self, onoff): self.do_useindent = onoff def subst(self, str): 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 def _modindent(self, value, old): lastnl = string.rfind(old, '\n', 0) + 1 lastnl = len(old) - lastnl sub = '\n' + (' '*lastnl) return regsub.gsub('\n', sub, value) 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()