htmlpage.py
'''\
HTML Page Base Class.
example:
fn = path.join(HtmlPath,FileName)
fp = open(fn, 'w')
try:
# The PageWriterClass implements obj.writepage(fstream)
pw = PageWriterClass(pagedata)
# New HTML Page object...
pg = htmlpage(Title,H1,H2,CSS,JS)
pg.writepage(fp, pw)
# ...
print 'wrote: %s' % fn
except Exception as e:
raise
finally:
fp.close()
Developer@Sonnack.com
April 2012
'''
from sys import stdout, stderr, argv
from datetime import datetime
HtmlH1 = 'Sonnack.com'
HtmlH2 = 'HTML Page'
HtmlCSS = ['/basic.css']
HtmlJS = []
class htmlpage (object):
'''\
HTML Page Class.
properties:
.now - Current datetime
.header1 - <H1> string
.header2 - <H2> string
.title - <H3> string
.csspages[] - List of CSS filenames
.jspages[] - List of JS filenames
methods:
.writefile(fn, caller) - write to filename 'fn'
.writepage(fp, caller) - write to open file 'fp'
str(obj) - Headers + Title string
repr(obj) - JSON-like string
'''
def __init__ (self, ttl, h1=HtmlH1, h2=HtmlH2, meta=None, csspages=HtmlCSS, jspages=HtmlJS):
self.now = datetime.today()
self.title = ttl
self.header1 = h1
self.header2 = h2
self.meta = meta
self.csspages = csspages
self.jspages = jspages
self.onload = None
self.cb_htmlhead = None
self.cb_pagehead = None
self.cb_pagefoot = None
def writefile (self, filename, caller):
''' Write HTML Page to filename. Caller must have a writepage(fp) method. '''
f = open(filename, "w")
try:
self.writepage(f, caller)
except Exception as e:
raise
finally:
f.close()
def writepage (self, fp, caller):
''' Write HTML Page to fp. Caller must have a writepage(fp) method. '''
lm_dt = self.now.strftime('%a %b %d %H:%M:%S %Y')
cr_dt = self.now.strftime('%B %d, %Y %H:%M:%S')
print >> fp, '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">'
print >> fp, '<html><head>'
print >> fp, '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">'
print >> fp, '<meta http-equiv="Last-Modified" content="%s">' % lm_dt
print >> fp, '<title>%s</title>' % (self.meta if self.meta else self.title)
for css in self.csspages:
print >> fp, '<link rel="stylesheet" type="text/css" href="%s">' % css
for js in self.jspages:
print >> fp, '<script type="text/javascript" src="%s"></script>' % js
if self.cb_htmlhead:
self.cb_htmlhead(self, fp)
print >> fp, '</head>'
if self.onload:
print >> fp, '<body onload="%s">' % self.onload
else:
print >> fp, '<body>'
print >> fp, '<div id="PageHead">'
if self.cb_pagehead:
self.cb_pagehead(self, fp)
else:
print >> fp, '<h1>%s</h1>' % self.header1
print >> fp, '<h2>%s</h2>' % self.header2
print >> fp, '</div>'
print >> fp, '<div id="PageBody">'
print >> fp, '<h3>%s</h3>' % self.title
fp.flush()
try:
caller.writepage(fp)
except Exception as e:
raise
fp.flush()
print >> fp, '</div>'
print >> fp, '<div id="PageFoot">'
if self.cb_pagefoot:
self.cb_pagefoot(self, fp)
else:
print >> fp, '<span class="Lt">created: %s</span>' % cr_dt
print >> fp, '<span class="Rt" style="font-style:italic;">(private page)</span>'
print >> fp, '<br clear=ALL>'
print >> fp, '</div>'
print >> fp, '</body></html>'
fp.flush()
def __str__ (self):
s = '::%s:%s::%s'
t = (self.header1, self.header2, self.title)
return s % t
def __repr__ (self):
s = '{htmlpage:{h1:"%s", h2:"%s", ttl:"%s"}}'
t = (self.header1, self.header2, self.title)
return s % t
class writer (object):
tag = 'Demo Writer'
def writepage (self, fp):
print >> fp, '<p>Hello, World!</p>'
print >> fp, '<p>%s</p>' % self.tag
if __name__ == '__main__':
print 'autorun:',argv[0]
pg = htmlpage('Test!', 'CJSoftware', 'Python')
print str(pg)
print repr(pg)
pg.writepage(stdout, writer())