| # | 
 | # Variable substitution. Variables are $delimited$ | 
 | # | 
 | import re | 
 |  | 
 | error = 'varsubst.error' | 
 |  | 
 | class Varsubst: | 
 |     def __init__(self, dict): | 
 |         self.dict = dict | 
 |         self.prog = re.compile('\$([a-zA-Z0-9_]*)\$') | 
 |         self.do_useindent = 0 | 
 |  | 
 |     def useindent(self, onoff): | 
 |         self.do_useindent = onoff | 
 |          | 
 |     def subst(self, s): | 
 |         rv = '' | 
 |         while 1: | 
 |             m = self.prog.search(s) | 
 |             if not m: | 
 |                 return rv + s | 
 |             rv = rv + s[:m.start()] | 
 |             s = s[m.end():] | 
 |             if m.end() - m.start() == 2: | 
 |                 # Escaped dollar | 
 |                 rv = rv + '$' | 
 |                 s = s[2:] | 
 |                 continue | 
 |             name = m.group(1) | 
 |             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 = old.rfind('\n', 0) + 1 | 
 |         lastnl = len(old) - lastnl | 
 |         sub = '\n' + (' '*lastnl) | 
 |         return re.sub('\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() |