mirror of
https://github.com/python/cpython.git
synced 2025-07-22 10:45:22 +00:00

(with one small bugfix in bgen/bgen/scantools.py) This replaces string module functions with string methods for the stuff in the Tools directory. Several uses of string.letters etc. are still remaining.
56 lines
1.4 KiB
Python
56 lines
1.4 KiB
Python
#
|
|
# 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()
|