tmplt2html.py
'''Template to HTML.
(See lib/template for details.)
Developer@Sonnack.com
August 2017
'''
from __future__ import print_function
from sys import argv, exc_info
from traceback import extract_tb
from os import path
from datetime import datetime
from logger import logger, info, debug, trace
from template import HtmlTemplate, template_to_html
Log = logger('Template')
Today = datetime.now()
BasePath = r'C:\CJS\prj\Python\app'
HtmlPath = r'C:\cjs\www\root\tmp'
TemplateFilename = path.join(HtmlPath, 'template-in.html')
OutputFilename = path.join(HtmlPath, 'template-out.html')
DataBagFilename = path.join(BasePath, 'template-data.xml')
StartMarker = '<!--@'
EndMarker = '-->'
SampleData = {
'last-modified':Today.strftime('%a %b %d %H:%M:%S %Y'),
'DCR':Today.strftime('%m-%d-%Y %H:%M'),
'level':0,
'team':'Twins',
'year':'2014',
'css-path':'/pub/bb/twins_stats.css',
'table-class':'Stats',
'total-cols':'15',
'season':{ 'caption':'Season',
'w-l':'70-92', 'wpct':'.432',
'avg':'.254', 'obp':'.324', 'slg':'.389', 'ops':'.712', 'iso':'.136',
'r/g':'4.41', 'h/g':'8.72',
'rdiff':'<span style="color:red;">-62</span>',
'hdiff':'<span style="color:red;">-176</span>'
},
'months':[
{'key':'apr', 'caption':'April', 'w-l':'12-11', 'wpct':'<span style="color:#007f00;">.522</span>', 'avg':'.255', 'ops':'.752'},
{'key':'may', 'caption':'May' , 'w-l':'13-16', 'wpct':'<span style="color:#ff0000;">.448</span>', 'avg':'.230', 'ops':'.639'},
{'key':'jun', 'caption':'June' , 'w-l':'12-16', 'wpct':'<span style="color:#ff0000;">.429</span>', 'avg':'.246', 'ops':'.688'},
{'key':'jul', 'caption':'July' , 'w-l':'11-15', 'wpct':'<span style="color:#ff0000;">.423</span>', 'avg':'.247', 'ops':'.688'},
{'key':'aug', 'caption':'Aug' , 'w-l':'11-18', 'wpct':'<span style="color:#ff0000;">.379</span>', 'avg':'.277', 'ops':'.781'},
{'key':'sep', 'caption':'Sept' , 'w-l':'11-15', 'wpct':'<span style="color:#ff0000;">.423</span>', 'avg':'.267', 'ops':'.734'},
],
'halfs':[
{ 'caption':'1<sup>st</sup> half',
'w-l':'41-40', 'wpct':'<span style="color:#009f00;">.506</span>',
'r/g':'4.53', 'h/g':'8.60',
'rdiff':'<span style="color:#ff0000;">-59</span>',
'avg':'.251', 'obp':'.326', 'slg':'.410', 'ops':'.736', 'iso':'.160',
},
{ 'caption':'2<sup>nd</sup> half',
'w-l':'18-17', 'wpct':'<span style="color:#009f00;">.514</span>',
'r/g':'5.03', 'h/g':'8.86',
'rdiff':'<span style="color:#009f00;">+9</span>',
'avg':'.262', 'obp':'.339', 'slg':'.414', 'ops':'.753', 'iso':'.152',
},
],
'thirds':[
{ 'caption':'1<sup>st</sup> third',
'w-l':'29-25', 'wpct':'<span style="color:#009f00;">.537</span>',
'r/g':'4.61', 'h/g':'8.70',
'rdiff':'<span style="color:#ff0000;">-28</span>',
'avg':'.253', 'obp':'.334', 'slg':'.418', 'ops':'.751', 'iso':'.165',
},
{ 'caption':'2<sup>nd</sup> third',
'w-l':'23-31', 'wpct':'<span style="color:#ff0000;">.426</span>',
'r/g':'4.35', 'h/g':'8.30',
'rdiff':'<span style="color:#ff0000;">-46</span>',
'avg':'.245', 'obp':'.316', 'slg':'.385', 'ops':'.702', 'iso':'.141',
},
{ 'caption':'3<sup>rd</sup> third',
'w-l':'7-1',
'wpct':'<span style="color:#009f00;">.875</span>',
'r/g':'7.38', 'h/g':'11.12',
'rdiff':'<span style="color:#009f00;">+24</span>',
'avg':'.318', 'obp':'.391', 'slg':'.536', 'ops':'.926', 'iso':'.218',
}
],
'stats':[
{'key':'w-l' , 'caption':'W-L' },
{'key':'wpct' , 'caption':'Win%'},
{'key':'rdiff' , 'caption':'RΔ' },
{'key':'r/g' , 'caption':'R/G' },
{'key':'h/g' , 'caption':'H/G' },
{'key':'avg' , 'caption':'AVG' },
{'key':'obp' , 'caption':'OBP' },
{'key':'slg' , 'caption':'SLG' },
{'key':'ops' , 'caption':'OPS' },
{'key':'iso' , 'caption':'ISO' },
]
}
def do_tokenize (*args):
Log.info('test/parameters: %s' % str(args))
iname = args[0] if 0 < len(args) else TemplateFilename
tmplt = HtmlTemplate(iname, log=Log)
for tok in tmplt.tokens:
Log.info('tok: %s' % str(tok))
return 'Done!'
def do_demo (*args):
Log.info('demo/parameters: %s' % str(args))
template_to_html(TemplateFilename, None, OutputFilename, dbag=SampleData, log=Log)
return 'Done!'
def do_test (*args):
Log.info('test/parameters: %s' % str(args))
iname = args[0] if 0 < len(args) else TemplateFilename
dname = args[1] if 1 < len(args) else DataBagFilename
oname = args[2] if 2 < len(args) else OutputFilename
template_to_html(iname, dname, oname, log=Log)
return 'Done!'
def do_main (*args):
Log.info('main/parameters: %s' % str(args))
if len(args) < 3: return ('Not enough arguments! Three required; got %d' % len(args))
iname = args[0]
dname = args[1]
oname = args[2]
template_to_html(iname, dname, oname, log=Log)
return 'Done!'
def dispatch (cmd, *args):
Log.info('command: %s' % cmd)
Log.info('arguments: %d' % len(args))
if cmd == 'main': return do_main(*args)
if cmd == 'test': return do_test(*args)
if cmd == 'demo': return do_demo(*args)
if cmd == 'toks': return do_tokenize(*args)
return 'Nothing to do!'
if __name__ == '__main__':
print('autorun: %s' % argv[0])
Log.start(path.join(BasePath,'tmplt2html.log'))
Log.level(info())
cmd = argv[1] if 1 < len(argv) else ''
etc = argv[2:] if 2 < len(argv) else []
try:
obj = dispatch(cmd, *etc)
print(obj)
Log.info(obj)
except:
etype, evalue, tb = exc_info()
ts = extract_tb(tb)
Log.error('%s: %s' % (etype.__name__,str(evalue)))
for t in ts[-3:]:
Log.error('[%d] %s (%s)' % (t[1], t[2], t[0]))
Log.error(' %s' % t[3])
raise
finally:
Log.end()
'''eof'''