blob: 71a2b264409b85f06f934625fb6d1ffff22df267 [file] [log] [blame]
Guido van Rossumd2112201995-03-02 14:05:29 +00001#
2# Variable substitution. Variables are $delimited$
3#
4import string
Jack Jansen9aaee932001-12-27 23:35:43 +00005import re
Guido van Rossumd2112201995-03-02 14:05:29 +00006
7error = 'varsubst.error'
8
9class Varsubst:
10 def __init__(self, dict):
Guido van Rossuma16a5091998-04-10 19:15:27 +000011 self.dict = dict
Jack Jansen9aaee932001-12-27 23:35:43 +000012 self.prog = re.compile('\$([a-zA-Z0-9_]*)\$')
Guido van Rossuma16a5091998-04-10 19:15:27 +000013 self.do_useindent = 0
Guido van Rossumd2112201995-03-02 14:05:29 +000014
15 def useindent(self, onoff):
Guido van Rossuma16a5091998-04-10 19:15:27 +000016 self.do_useindent = onoff
17
Jack Jansen9aaee932001-12-27 23:35:43 +000018 def subst(self, s):
Guido van Rossuma16a5091998-04-10 19:15:27 +000019 rv = ''
20 while 1:
Jack Jansen9aaee932001-12-27 23:35:43 +000021 m = self.prog.search(s)
22 if not m:
23 return rv + s
24 rv = rv + s[:m.start()]
25 s = s[m.end():]
26 if m.end() - m.start() == 2:
Guido van Rossuma16a5091998-04-10 19:15:27 +000027 # Escaped dollar
28 rv = rv + '$'
Jack Jansen9aaee932001-12-27 23:35:43 +000029 s = s[2:]
Guido van Rossuma16a5091998-04-10 19:15:27 +000030 continue
Jack Jansen9aaee932001-12-27 23:35:43 +000031 name = m.group(1)
Guido van Rossuma16a5091998-04-10 19:15:27 +000032 if not self.dict.has_key(name):
33 raise error, 'No such variable: '+name
34 value = self.dict[name]
35 if self.do_useindent and '\n' in value:
36 value = self._modindent(value, rv)
37 rv = rv + value
Guido van Rossumd2112201995-03-02 14:05:29 +000038
39 def _modindent(self, value, old):
Guido van Rossuma16a5091998-04-10 19:15:27 +000040 lastnl = string.rfind(old, '\n', 0) + 1
41 lastnl = len(old) - lastnl
42 sub = '\n' + (' '*lastnl)
Jack Jansen9aaee932001-12-27 23:35:43 +000043 return re.sub('\n', sub, value)
Guido van Rossumd2112201995-03-02 14:05:29 +000044
45def _test():
46 import sys
47 import os
48
49 sys.stderr.write('-- Copying stdin to stdout with environment map --\n')
50 c = Varsubst(os.environ)
51 c.useindent(1)
52 d = sys.stdin.read()
53 sys.stdout.write(c.subst(d))
54 sys.exit(1)
55
56if __name__ == '__main__':
57 _test()