| 
									
										
										
										
											1995-03-02 14:05:29 +00:00
										 |  |  | # | 
					
						
							|  |  |  | # Variable substitution. Variables are $delimited$ | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | import string | 
					
						
							|  |  |  | import regex | 
					
						
							|  |  |  | import regsub | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | error = 'varsubst.error' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Varsubst: | 
					
						
							|  |  |  |     def __init__(self, dict): | 
					
						
							| 
									
										
										
										
											1998-04-10 19:15:27 +00:00
										 |  |  |         self.dict = dict | 
					
						
							|  |  |  |         self.prog = regex.compile('\$[a-zA-Z0-9_]*\$') | 
					
						
							|  |  |  |         self.do_useindent = 0 | 
					
						
							| 
									
										
										
										
											1995-03-02 14:05:29 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def useindent(self, onoff): | 
					
						
							| 
									
										
										
										
											1998-04-10 19:15:27 +00:00
										 |  |  |         self.do_useindent = onoff | 
					
						
							|  |  |  |          | 
					
						
							| 
									
										
										
										
											1995-03-02 14:05:29 +00:00
										 |  |  |     def subst(self, str): | 
					
						
							| 
									
										
										
										
											1998-04-10 19:15:27 +00:00
										 |  |  |         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 | 
					
						
							| 
									
										
										
										
											1995-03-02 14:05:29 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def _modindent(self, value, old): | 
					
						
							| 
									
										
										
										
											1998-04-10 19:15:27 +00:00
										 |  |  |         lastnl = string.rfind(old, '\n', 0) + 1 | 
					
						
							|  |  |  |         lastnl = len(old) - lastnl | 
					
						
							|  |  |  |         sub = '\n' + (' '*lastnl) | 
					
						
							|  |  |  |         return regsub.gsub('\n', sub, value) | 
					
						
							| 
									
										
										
										
											1995-03-02 14:05:29 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 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() |