a sample template system which recognize {@xxx} pattern and take appropriate actions
it is similar to the mechanism bitbake deploys to deal with .bb files
tools
regular expression (match and substitute)
dictionary and scope
eval and exec
code
#!/usr/bin/env python
# a template system: recognize {@XXX} pattern and execute it or evaluate it
import re
import fileinput
# Matches fields enclosed in braces
pattern = re.compile(r'{@(.+?)}')
# Collect variables in this
scope = {}
# This is used in re.sub, match is a match object
def replacement(match):
code = match.group(1)
try:
# if the field can be evaluated, return it
return str(eval(code, scope))
except SyntaxError:
# otherwise excuete the statement in the same scope
exec code in scope
return ''
def main():
lines = []
for line in fileinput.input():
lines.append(line)
text = ''.join(lines)
#substitue all the occurrences of the field pattern
print pattern.sub(replacement, text)
if __name__ == '__main__':
main()
input
{@name = 'James.C'}
{@email = 'james.c.2012.c.james@gmail.com'}
{@language = 'python'}
{@import time}
Dear {@name},
I would like to learn how to program. I hear you use the {@language} language a lot -- is it something I should consider?
And by the way, is {@email} your correct email address?
Qi, {@time.asctime()}
output
chenqi@chenqi-OptiPlex-760:~/mypro/python$ ./templates.py def.txt mail.txt
Dear James.C,
I would like to learn how to program. I hear you use the python language a lot -- is it something I should consider?
And by the way, is james.c.2012.c.james@gmail.com your correct email address?
Qi, Fri Aug 24 12:37:34 2012
chenqi@chenqi-OptiPlex-760:~/mypro/python$