内容目录
# @file: pyh.py
# @purpose: a HTML tag generator
# @author: Emmanuel Turlay <turlay@cern.ch>
__doc__ = """The pyh.py module is the core of the PyH package. PyH lets you
generate HTML tags from within your python code.
See http://code.google.com/p/pyh/ for documentation.
"""
__author__ = "Emmanuel Turlay "
__version__ = '$Revision: 63 $'
__date__ = '$Date: 2010-05-21 03:09:03 +0200 (Fri, 21 May 2010) $'
from sys import _getframe, stdout, modules, version
nOpen={}
nl = '\n'
doctype = '\n'
charset = '\n'
tags = ['html', 'body', 'head', 'link', 'meta', 'div', 'p', 'form', 'legend',
'input', 'select', 'span', 'b', 'i', 'option', 'img', 'script',
'table', 'tr', 'td', 'th', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',
'fieldset', 'a', 'title', 'body', 'head', 'title', 'script', 'br', 'table',
'ul', 'li', 'ol']
selfClose = ['input', 'img', 'link', 'br']
class Tag(list):
tagname = ''
def __init__(self, *arg, **kw):
self.attributes = kw
if self.tagname :
name = self.tagname
self.isSeq = False
else:
name = 'sequence'
self.isSeq = True
self.id = kw.get('id', name)
#self.extend(arg)
for a in arg: self.addObj(a)
def __iadd__(self, obj):
if isinstance(obj, Tag) and obj.isSeq:
for o in obj: self.addObj(o)
else: self.addObj(obj)
return self
def addObj(self, obj):
if not isinstance(obj, Tag): obj = str(obj)
id=self.setID(obj)
setattr(self, id, obj)
self.append(obj)
def setID(self, obj):
if isinstance(obj, Tag):
id = obj.id
n = len([t for t in self if isinstance(t, Tag) and t.id.startswith(id)])
else:
id = 'content'
n = len([t for t in self if not isinstance(t, Tag)])
if n: id = '%s_%03i' % (id, n)
if isinstance(obj, Tag): obj.id = id
return id
def __add__(self, obj):
if self.tagname: return Tag(self, obj)
self.addObj(obj)
return self
def __lshift__(self, obj):
self += obj
if isinstance(obj, Tag): return obj
def render(self):
result = ''
if self.tagname:
result = '<%s%s%s>' % (self.tagname, self.renderAtt(), self.selfClose()*' /')
if not self.selfClose():
for c in self:
if isinstance(c, Tag):
result += c.render()
else: result += c
if self.tagname:
result += '</%s>' % self.tagname
result += '\n'
return result
def renderAtt(self):
result = ''
for n, v in self.attributes.iteritems():
if n != 'txt' and n != 'open':
if n == 'cl': n = 'class'
result += ' %s="%s"' % (n, v)
return result
def selfClose(self):
return self.tagname in selfClose
def TagFactory(name):
class f(Tag):
tagname = name
f.__name__ = name
return f
thisModule = modules[__name__]
for t in tags: setattr(thisModule, t, TagFactory(t))
def ValidW3C():
out = a(img(src='http://www.w3.org/Icons/valid-xhtml10', alt='Valid XHTML 1.0 Strict'), href='http://validator.w3.org/check?uri=referer')
return out
class PyH(Tag):
tagname = 'html'
def __init__(self, name='MyPyHPage'):
self += head()
self += body()
self.attributes = dict(xmlns='http://www.w3.org/1999/xhtml', lang='en')
self.head += title(name)
def __iadd__(self, obj):
if isinstance(obj, head) or isinstance(obj, body): self.addObj(obj)
elif isinstance(obj, meta) or isinstance(obj, link): self.head += obj
else:
self.body += obj
id=self.setID(obj)
setattr(self, id, obj)
return self
def addJS(self, *arg):
for f in arg: self.head += script(type='text/javascript', src=f)
def addCSS(self, *arg):
for f in arg: self.head += link(rel='stylesheet', type='text/css', href=f)
def printOut(self,file=''):
if file: f = open(file, 'w')
else: f = stdout
f.write(doctype)
f.write(self.render())
f.flush()
实例
#!/usr/bin/python
'''an example for generate html page.
the module used is:PyH
Its home page is: http://code.google.com/p/pyh/
we can download it at:http://code.google.com/p/pyh/downloads/detail?name=PyH-0.1.1.tar.gz&can=2&q=
More things about html at:http://www.w3school.com.cn/tags/tag_div.asp
'''
from pyh import *
page = PyH("MyPage")
#page.addCSS('myStylesheet1.css', 'myStylesheet2.css')
#page.addJS('myJavascript1.js', 'myJavascript2.js')
#<h1 align="center">MyTitle1</h1>
page <<h1('MyTitle1',align='center')
#<div align="center" id="myDiv1"><p id="myp1">my paragraph1</p>
#</div>
page << div(align='center',id='myDiv1') << p('my paragraph1',id='myp1')
#<div id="myDiv2"><h2>title2 in div2<p>paragraph under title2</p>
#</h2>
#</div>
mydiv2 = page << div(id='myDiv2')
mydiv2 <<h2('title2 in div2') << p('paragraph under title2')
#<div align="right" id="myDiv3"><p>paragraph in mydiv3</p>
#</div>
mydiv3 = page << div(id='myDiv3')
mydiv3.attributes['align'] = 'right'
mydiv3 << p('paragraph in mydiv3')
#<table border="1" id="mytable1"><tr id="headline"><td>Head1<td>Head2</td>
#</td>
#</tr>
#<tr id="line1"><td>r1,c1<td>r1,c2</td>
#</td>
#</tr>
#<tr id="line2"><td>r2,c1<td>r2,c2</td>
#</td>
#</tr>
#</table>
table1 = page << table(border='1',id='mytable1')
headtr = table1 << tr(id='headline')
headtr << td('Head1') << td('Head2')
tr1 = table1 << tr(id='line1')
tr1 << td('r1,c1') <<td('r1,c2')
tr2 = table1 << tr(id='line2')
tr2 << td('r2,c1') <<td('r2,c2')
#The result is:
#<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
#<html lang="en" xmlns="http://www.w3.org/1999/xhtml"><head><title>MyPage</title>
#</head>
#<body><h1 align="center">MyTitle1</h1>
#<div align="center" id="myDiv1"><p id="myp1">my paragraph1</p>
#</div>
#<div id="myDiv2"><h2>title2 in div2<p>paragraph under title2</p>
#</h2>
#</div>
#<div align="right" id="myDiv3"><p>paragraph in mydiv3</p>
#</div>
#<table border="1" id="mytable1"><tr id="headline"><td>Head1<td>Head2</td>
#</td>
#</tr>
#<tr id="line1"><td>r1,c1<td>r1,c2</td>
#</td>
#</tr>
#<tr id="line2"><td>r2,c1<td>r2,c2</td>
#</td>
#</tr>
#</table>
#</body>
#</html>
page.printOut()
