Spaces:
Build error
Build error
from __future__ import print_function | |
import os | |
from PIL import Image | |
# see help for ocmmon HTML tags at http://www.mountaindragon.com/html/text.htm | |
class Node: | |
def __init__(self,tag,text='',props=dict()): | |
self.children = [] | |
self.tag=tag | |
self.text=text | |
self.props=props | |
def add(self, node): | |
self.children.append(node) | |
return node | |
def tostr(self): | |
s = "" | |
if not self.props: | |
s+= "<%s>%s"%(self.tag,self.text) | |
else: | |
s+= "<%s %s>%s"%(self.tag,' '.join(["%s='%s'"%(k,v) for k,v in self.props.items() if v!=None]),self.text) | |
for child in self.children: | |
s += child.tostr() | |
s += "</%s>"%self.tag | |
return s | |
def write(self,fout): | |
if not self.props: | |
print("<%s>%s"%(self.tag,self.text), file=fout) | |
else: | |
print("<%s %s>%s"%(self.tag,' '.join(["%s='%s'"%(k,v) for k,v in self.props.items() if v!=None]),self.text), file=fout) | |
for child in self.children: | |
child.write(fout) | |
print("</%s>"%self.tag, file=fout) | |
def first(self,tag,order=1): | |
if self.tag==tag: return self | |
for c in self.children[::order]: | |
res = c.first(tag,order) | |
if res: return res | |
return None | |
def last(self,tag): | |
return self.first(tag,-1) | |
class HTML (Node): | |
def __init__(self): | |
Node.__init__(self,'html') | |
def header(self,**kw): | |
return self.add(Header(**kw)) | |
def body(self,**kw): | |
return self.add(BodyNode('body',props=kw)) | |
def save(self,fname): | |
fout = open(fname,'w') if type(fname)==str else fname | |
for e in self.children: | |
e.write(fout) | |
def show(self,fname=''): | |
if not fname: fname = os.tmpname()+'.html' | |
self.save(fname) | |
os.system('/opt/google/chrome/google-chrome '+fname) | |
class Header (HTML): | |
def __init__(self, **kw): | |
Node.__init__(self,'header',props=kw) | |
def title(self,text): | |
return self.add(Node('title',text=text)) | |
def script(self, text="", **kw): | |
return self.add(Node('script',text=text, props=kw)) | |
def link(self, **kw): | |
return self.add(Node('link', props=kw)) | |
def meta(self): | |
return self.add(Node('meta', props={"http-equiv":"Content-Type", "content": "charset=iso-8859-1"})) | |
class BodyNode (Node): | |
# title of section | |
def h(self, strength, text='', **kw): | |
return self.add(BodyNode('h%d'%strength, text=text, props=kw)) | |
# paragraph | |
def p(self, text='', **kw): | |
return self.add(BodyNode('p',text=text, props=kw)) | |
# bold | |
def bold(self, text='', **kw): | |
return self.add(BodyNode('b',text=text, props=kw)) | |
def b(self, text='', **kw): | |
return self.add(BodyNode('b',text=text, props=kw)) | |
# italic | |
def italic(self, text='', **kw): | |
return self.add(BodyNode('i',text=text, props=kw)) | |
def i(self, text='', **kw): | |
return self.add(BodyNode('i',text=text, props=kw)) | |
# span/text | |
def span(self, text='', **kw): | |
return self.add(BodyNode('span',text=text, props=kw)) | |
# font | |
def font(self,text='',color=None,face=None,size=None): | |
return self.add(BodyNode('font',text=text, props={'color':color,'face':face,'size':size})) | |
# small | |
def small(self, text='', **kw): | |
return self.add(BodyNode('small',text=text, props=kw)) | |
def big(self, text='', **kw): | |
return self.add(BodyNode('big',text=text, props=kw)) | |
# centered | |
def center(self, text='', **kw): | |
return self.add(BodyNode('center',text=text, props=kw)) | |
# div | |
def div(self, text='', **kw): | |
return self.add(BodyNode('div', text=text, props=kw)) | |
# unordered list | |
def unordlist(self, text='', **kw): | |
return self.add(BodyNode('ul', text=text, props=kw)) | |
# ordered list | |
def ordlist(self, text='', **kw): | |
return self.add(BodyNode('ol', text=text, props=kw)) | |
def item(self, text='', type=None, **kw): | |
kw['type'] = type # non-ord {'circle', 'square', 'disc'}, ord {'1', 'A', 'a', 'I', 'i'} | |
return self.add(BodyNode('li', text=text, props=kw)) | |
# line break | |
def br(self): | |
self.add(Node('br')) | |
# horizontal line | |
def hr(self): | |
self.add(Node('hr')) | |
# table | |
def table(self, **kw): | |
return self.add(Table(**kw)) | |
# image | |
def image(self, img, **kw): | |
return self.add(Image(img,**kw)) | |
# link | |
def a(self, href, text='', **kw): | |
kw['href'] = href | |
return self.add(BodyNode('a', text=text, props=kw)) | |
def hidden(self, text, **kw): | |
kw['type'] = 'hidden' | |
kw['value'] = text | |
return self.add(BodyNode('input',props=kw)) | |
def imagelink(self, img, **kw): | |
return self.add( BodyNode('a', text=Image(img,**kw).tostr(), props={"href":img}) ) | |
class Table (Node): | |
def __init__(self,**kw): | |
Node.__init__(self,'table',props=kw) | |
def row(self,elems=[],header=False,**kw): | |
r=TableRow(header, **kw) | |
for e in elems: | |
if issubclass(e.__class__,Node): | |
r.add(e) | |
else: | |
r.cell(str(e)) | |
return self.add(r) | |
def fromlist(self, elems, header=None): | |
if header and type(header)!=bool: elems=[header]+elems; header=True | |
for row in elems: | |
self.row(row,header=header) | |
header=False # only once | |
class TableRow (Node): | |
def __init__(self, isheader=False, **kw): | |
Node.__init__(self,'tr',props=kw) | |
self.isheader=isheader | |
def cell(self, text='', **kw): | |
return self.add(BodyNode(self.isheader and 'th' or 'td',text=text,props=kw)) | |
class Image (Node): | |
def __init__(self, img, dir='', name='', width=None, height=None, alt=None): | |
if type(img)==str: loc = img | |
else: | |
if name: | |
img.save(os.path.join(dir,name)) | |
loc = name | |
else: | |
loc = os.tmpnam()+".png" | |
img.save(loc) | |
Node.__init__(self,'img',props={'src':loc,'width':width,'height':height,'alt':alt,'title':alt}) | |
def htmlspace(n): | |
return " ".join(["" for i in range(n)]) | |
def htmloptions(l): | |
return "".join(["<option>"+s+"</option>" for s in l]) | |
if __name__=='__main__': | |
import pdb | |
doc = HTML() | |
doc.header().title('test of python-generated HTML page') | |
body=doc.body() | |
body.h(1,"1. Title of page") | |
body.p('a paragraph of text') | |
body.h(2,"2.1 second title") | |
p=body.p() | |
p.italic('another') | |
p.font(color='red').bold('paragraph') | |
p.span('of text') | |
body.h(3,'2.1.1. sub-sub-title') | |
body.p("Here is a list:") | |
ls=body.unordlist() | |
ls.item("first item") | |
ls.item("second item") | |
ls.item("final item") | |
body.hr() | |
body.table(border=1).fromlist([[1,2],[3,4]],header=['col1','col2']) | |
body.br() | |
body.center().image(img='/home/lear/revaud/coca-cola.jpg',width=500,height=300) | |
body.hr() | |
tab=body.table(border=0) | |
tab.row(['coca-cola']*5,header=True) | |
for i in range(3): | |
r = body.last('table').row() | |
for j in range(5): | |
r.cell(bgcolor=['#00FF00','red'][(i+j)%2]).image('/home/lear/revaud/coca-cola2.jpg',width=200) | |
doc.show('/tmp/test.html') | |
print('result stored in /tmp/test.html') | |