8282__all__ = ['process_str' , 'process_file' ]
8383
8484import os
85- import sys
8685import re
86+ import sys
8787
8888# names for replacement that are already global.
8989global_names = {}
@@ -106,12 +106,12 @@ def parse_structure(astr, level):
106106 at zero. Returns an empty list if no loops found.
107107
108108 """
109- if level == 0 :
109+ if level == 0 :
110110 loopbeg = "/**begin repeat"
111111 loopend = "/**end repeat**/"
112- else :
113- loopbeg = "/**begin repeat%d" % level
114- loopend = "/**end repeat%d **/" % level
112+ else :
113+ loopbeg = f "/**begin repeat{ level } "
114+ loopend = f "/**end repeat{ level } **/"
115115
116116 ind = 0
117117 line = 0
@@ -124,9 +124,9 @@ def parse_structure(astr, level):
124124 start2 = astr .find ("\n " , start2 )
125125 fini1 = astr .find (loopend , start2 )
126126 fini2 = astr .find ("\n " , fini1 )
127- line += astr .count ("\n " , ind , start2 + 1 )
128- spanlist .append ((start , start2 + 1 , fini1 , fini2 + 1 , line ))
129- line += astr .count ("\n " , start2 + 1 , fini2 )
127+ line += astr .count ("\n " , ind , start2 + 1 )
128+ spanlist .append ((start , start2 + 1 , fini1 , fini2 + 1 , line ))
129+ line += astr .count ("\n " , start2 + 1 , fini2 )
130130 ind = fini2
131131 spanlist .sort ()
132132 return spanlist
@@ -135,10 +135,13 @@ def parse_structure(astr, level):
135135def paren_repl (obj ):
136136 torep = obj .group (1 )
137137 numrep = obj .group (2 )
138- return ',' .join ([torep ]* int (numrep ))
138+ return ',' .join ([torep ] * int (numrep ))
139+
139140
140141parenrep = re .compile (r"\(([^)]*)\)\*(\d+)" )
141142plainrep = re .compile (r"([^*]+)\*(\d+)" )
143+
144+
142145def parse_values (astr ):
143146 # replaces all occurrences of '(a,b,c)*4' in astr
144147 # with 'a,b,c,a,b,c,a,b,c,a,b,c'. Empty braces generate
@@ -155,7 +158,7 @@ def parse_values(astr):
155158named_re = re .compile (r"#\s*(\w*)\s*=([^#]*)#" )
156159exclude_vars_re = re .compile (r"(\w*)=(\w*)" )
157160exclude_re = re .compile (":exclude:" )
158- def parse_loop_header (loophead ) :
161+ def parse_loop_header (loophead ):
159162 """Find all named replacements in the header
160163
161164 Returns a list of dictionaries, one for each loop iteration,
@@ -179,14 +182,13 @@ def parse_loop_header(loophead) :
179182 name = rep [0 ]
180183 vals = parse_values (rep [1 ])
181184 size = len (vals )
182- if nsub is None :
185+ if nsub is None :
183186 nsub = size
184- elif nsub != size :
187+ elif nsub != size :
185188 msg = "Mismatch in number of values, %d != %d\n %s = %s"
186189 raise ValueError (msg % (nsub , size , name , vals ))
187190 names .append ((name , vals ))
188191
189-
190192 # Find any exclude variables
191193 excludes = []
192194
@@ -200,30 +202,33 @@ def parse_loop_header(loophead) :
200202
201203 # generate list of dictionaries, one for each template iteration
202204 dlist = []
203- if nsub is None :
205+ if nsub is None :
204206 raise ValueError ("No substitution variables found" )
205207 for i in range (nsub ):
206208 tmp = {name : vals [i ] for name , vals in names }
207209 dlist .append (tmp )
208210 return dlist
209211
212+
210213replace_re = re .compile (r"@(\w+)@" )
211- def parse_string (astr , env , level , line ) :
212- lineno = "#line %d\n " % line
214+
215+
216+ def parse_string (astr , env , level , line ):
217+ lineno = f"#line { line } \n "
213218
214219 # local function for string replacement, uses env
215220 def replace (match ):
216221 name = match .group (1 )
217- try :
222+ try :
218223 val = env [name ]
219224 except KeyError :
220- msg = 'line %d : no definition of key "%s"' % ( line , name )
225+ msg = f 'line { line } : no definition of key "{ name } "'
221226 raise ValueError (msg ) from None
222227 return val
223228
224229 code = [lineno ]
225230 struct = parse_structure (astr , level )
226- if struct :
231+ if struct :
227232 # recurse over inner loops
228233 oldend = 0
229234 newlevel = level + 1
@@ -234,18 +239,18 @@ def replace(match):
234239 oldend = sub [3 ]
235240 newline = line + sub [4 ]
236241 code .append (replace_re .sub (replace , pref ))
237- try :
242+ try :
238243 envlist = parse_loop_header (head )
239244 except ValueError as e :
240- msg = "line %d: %s" % ( newline , e )
245+ msg = f "line { newline } : { e } "
241246 raise ValueError (msg )
242- for newenv in envlist :
247+ for newenv in envlist :
243248 newenv .update (env )
244249 newcode = parse_string (text , newenv , newlevel , newline )
245250 code .extend (newcode )
246251 suff = astr [oldend :]
247252 code .append (replace_re .sub (replace , suff ))
248- else :
253+ else :
249254 # replace keys
250255 code .append (replace_re .sub (replace , astr ))
251256 code .append ('\n ' )
@@ -284,8 +289,8 @@ def process_file(source):
284289 try :
285290 code = process_str ('' .join (lines ))
286291 except ValueError as e :
287- raise ValueError ('In "%s " loop at %s' % ( sourcefile , e ) ) from None
288- return '#line 1 "%s "\n %s' % ( sourcefile , code )
292+ raise ValueError (f 'In "{ sourcefile } " loop at { e } ' ) from None
293+ return f '#line 1 "{ sourcefile } "\n { code } '
289294
290295
291296def unique_key (adict ):
@@ -321,9 +326,10 @@ def main():
321326 try :
322327 writestr = process_str (allstr )
323328 except ValueError as e :
324- raise ValueError ("In %s loop at %s" % ( file , e ) ) from None
329+ raise ValueError (f "In { file } loop at { e } " ) from None
325330
326331 outfile .write (writestr )
327332
333+
328334if __name__ == "__main__" :
329335 main ()
0 commit comments