home *** CD-ROM | disk | FTP | other *** search
- #
- # 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()
-