from jinja2 import Environment, FileSystemLoader from sys import argv from textwrap import dedent from re import search # regular expressions def pretty(line,indent): line = dedent(line) if search('^#', line): # check if line is a preprocessor directive print line else: print (3*indent)*' ' + line env=Environment(loader=FileSystemLoader('.')) tpl=env.get_template(argv[1]) source = tpl.render() source = [line for line in source.split('\n') if line.strip() != ''] # regular expressions matching Fortran keywords # \b detects word boundaries # $ and ( must be escaped : \$, \( # THIS|THAT means THIS or THAT # raw Python strings r'blabla' avoid doubling '\' noop = r'!\$OMP' increase = r'\bTHEN\b|\bDO\b|\bSELECT CASE\b' inter = r'\bELSE\b|\bCASE\(|\bCASE DEFAULT\b' decrease = r'\bEND IF\b|\bENDIF\b|\bEND DO\b|\bENDDO\b|\bEND SELECT\b' indent=1 for line in source : if search(noop, line) : pretty(line,indent) elif search(decrease, line) : indent = indent-1 pretty(line,indent) elif search(increase,line): pretty(line,indent) indent = indent+1 elif search(inter,line): pretty(line,indent-1) else: pretty(line,indent)