mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			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()
 | 
