补充一下:这是原创。如果转载,我会特别注明,这是道德。
PyH是Python语言的一个模块(不是自带的),用于生成HTML文件。不错,它只能生成HTML,并不能解析它。
它最大的特点是开源,并且源码很短小,只有不到200行。这样,如果你有什么不满意的,可以自己修改它。
源码地址:https://github.com/hanxiaomax/pyh
正如你看到的,一个中国人(很大可能是),对它进行了修改完善,支持了Unicode和Python3。别看这个工程有很多文件,其实只有一个《pyh.py》文件才是源码。
这个源码工程里面,自带了一个中文手册,为加深印象,我又重新总结了一份。
Tag就是HTML标签,也称之为HTML元素,形如<div><div/>。
Tag标签通过同名函数来生成。例如:<tag> 对应的函数就是tag() 。其实这个描述不够准确,它不是函数,而是一个对象,没错,tag()表示的一个Tag对象。示例:
>>> mydiv = div()
>>> mydiv.render()
''
在这里,我要做一下评论,render函数不好,它打印了当前的tag对象,但是为什么不重载标准的__str__方法呢?这样可以减少记忆的负担。
通过看源码,其实render还有一个参数,可以写入到一个文件中,这样也不好,一个函数应该做单一的事情,应该把返回字符串和写字符串分开来。
于是,我重构了代码,实现了__str__函数,于是可以使用下面的函数打印tag的结果。
打印tag对象。如下所示:
>>> from pyh import *
>>> a=div()
>>> print(a)
<div>
</div>
>>> str(a)
'\n\n\n'
有两种方式,一种是生成Tag对象时作为参数传递,另外一种是生成Tag对象后修改和设置其attributes属性,因为attributes是一个字典,存放的就是tag的属性,其key是属性的名字,value就是属性的值。但是有一点需要特别注意,对于class属性,其key为cl,原因也比较容易理解。
方法1,如下示例:
>>> from pyh import *
>>> a=div(b='b',c='c')
>>> print(a)
<div b="b" c="c">
</div>
方法2,如下示例:
>>> from pyh import *
>>> a=div()
>>> a.attributes['b']='b'
>>> a.attributes['c']='c'
>>> print(a)
<div b="b" c="c">
</div>
需要注意的是,key是一个字符串,作为参数不需要加上引号,但是使用属性需要加上引号。
同tag属性的设置一样,也有两种方法,一种是作为构造函数的参数传递,一种使用追加符号<<,如下面的示例。
方法1:作为构造函数的参数
>>> from pyh import *
>>> a=div('a')
>>> print(a)
<div>
a
</div>
方法2:使用追加符号
>>> a=div()
>>> a<<'test'
>>> print(a)
<div>
test
</div>
tag的子元素,也就是子tag,HTML的子标签。与设置tag的内容基本上是一样的,如下示例。
方法1:作为构造函数的参数
>>> a=div(div('test1'),div('test2'))
>>> print(a)
<div>
<div>
test1
</div>
<div>
test2
</div>
</div>
方法2:使用追加操作符
>>> a=div()
>>> a<<div('test1')
>>> a<<div('test2')
>>> print(a)
<div>
<div>
test1
</div>
<div>
test2
</div>
</div>
这里的说法有些不准确,应该是设置当前tag的相邻的下一个元素,使用+连接即可。如下示例。
>>> a=div(id='a')+div(id='b')+div(id='c')
>>> print(a)
<div id="a">
</div>
<div id="b">
</div>
<div id="c">
</div>
这个小结无关紧要,是可选的,但有时也可能用得着,所以还是描述一下吧。之前讲述了如何给tag添加子元素,如果要获取子元素,可以使用子元素的ID,如果子元素没有设置ID,则使用tag_001等类似的字符串作为其ID,如下所示。
有元素ID的情况
>>> a=div(div(id='test'))
>>> print(a.test)
<div id="test">
</div>
没有元素ID的情况
>>> a=div(div(name='d1'),div(name='d2'))
>>> print(a.div)
<div name="d1">
</div>
>>> print(a.div_001)
<div name="d2">
</div>
上一章节讲述了核心的Tag对象,现在我们看看如何生成HTML网页。为什么放在Tag对象的后面来讲呢?因为PyH对象其实也是Tag对象,也不完全是,它继承自Tag对象。只不过增加了一些用于简化的特殊方法,其实没有这些方法也完全可以自己来生成。
>>> a=PyH()
>>> print(a)
<html>
<head>
<title>
MyPyHPage
</title>
</head>
<body>
</body>
</html>
你会发现,这个网页框架少一个类似<!DOCTYPE html>的描述,我们可以重写实现,增加一个就好了。
至此,就基本上就可以用它干活了。由于代码较短,我也做了一些小修改,上述的示例和代码库中的原始版本可能会有微小差异,应该影响也不大。
另外,我准备在写一篇文档,对源码进行分析,这样也方便后来者理解代码并修改完善它。