blob: 5516be2addfa8d69e12126960552b8d78b6daca4 [file] [log] [blame]
Guido van Rossumd2112201995-03-02 14:05:29 +00001#
2# Variable substitution. Variables are $delimited$
3#
Jack Jansen9aaee932001-12-27 23:35:43 +00004import re
Guido van Rossumd2112201995-03-02 14:05:29 +00005
6error = 'varsubst.error'
7
8class Varsubst:
9 def __init__(self, dict):
Guido van Rossuma16a5091998-04-10 19:15:27 +000010 self.dict = dict
Jack Jansen9aaee932001-12-27 23:35:43 +000011 self.prog = re.compile('\$([a-zA-Z0-9_]*)\$')
Guido van Rossuma16a5091998-04-10 19:15:27 +000012 self.do_useindent = 0
Guido van Rossumd2112201995-03-02 14:05:29 +000013
14 def useindent(self, onoff):
Guido van Rossuma16a5091998-04-10 19:15:27 +000015 self.do_useindent = onoff
16
Jack Jansen9aaee932001-12-27 23:35:43 +000017 def subst(self, s):
Guido van Rossuma16a5091998-04-10 19:15:27 +000018 rv = ''
19 while 1:
Jack Jansen9aaee932001-12-27 23:35:43 +000020 m = self.prog.search(s)
21 if not m:
22 return rv + s
23 rv = rv + s[:m.start()]
24 s = s[m.end():]
25 if m.end() - m.start() == 2:
Guido van Rossuma16a5091998-04-10 19:15:27 +000026 # Escaped dollar
27 rv = rv + '$'
Jack Jansen9aaee932001-12-27 23:35:43 +000028 s = s[2:]
Guido van Rossuma16a5091998-04-10 19:15:27 +000029 continue
Jack Jansen9aaee932001-12-27 23:35:43 +000030 name = m.group(1)
Guido van Rossuma16a5091998-04-10 19:15:27 +000031 if not self.dict.has_key(name):
32 raise error, 'No such variable: '+name
33 value = self.dict[name]
34 if self.do_useindent and '\n' in value:
35 value = self._modindent(value, rv)
36 rv = rv + value
Guido van Rossumd2112201995-03-02 14:05:29 +000037
38 def _modindent(self, value, old):
Walter Dörwaldaaab30e2002-09-11 20:36:02 +000039 lastnl = old.rfind('\n', 0) + 1
Guido van Rossuma16a5091998-04-10 19:15:27 +000040 lastnl = len(old) - lastnl
41 sub = '\n' + (' '*lastnl)
Jack Jansen9aaee932001-12-27 23:35:43 +000042 return re.sub('\n', sub, value)
Guido van Rossumd2112201995-03-02 14:05:29 +000043
44def _test():
45 import sys
46 import os
47
48 sys.stderr.write('-- Copying stdin to stdout with environment map --\n')
49 c = Varsubst(os.environ)
50 c.useindent(1)
51 d = sys.stdin.read()
52 sys.stdout.write(c.subst(d))
53 sys.exit(1)
54
55if __name__ == '__main__':
56 _test()