wx.html库提供了用于解析和显示HTML的类。
它并非旨在成为一款高端的 HTML 浏览器。如果你在寻找那样的浏览器,可以尝试访问 www.mozilla.org/。
wxhtml可用作通用的富文本查看器,例如用于显示精美的 “关于” 对话框(就像那些 GNOME 应用程序的 “关于” 对话框一样),或者用于显示数据库搜索的结果。有一个wx.FileSystem类,它允许你使用自己的虚拟文件系统。
HtmlWindow支持标签处理程序。这意味着你可以轻松地使用新的、库原本不支持的标签来扩展html库。不仅如此,你甚至可以使用自己特定于应用程序的标签!
还有一个独立于HtmlWindow的通用HtmlParser类。
HTML起步
展示HTML
类HtmlWindow(派生自wx.ScrolledWindow)用于显示HTML文档。
它有两个重要的方法:LoadPage和SetPage。LoadPage方法用于加载并显示HTML文件,而SetPage方法则直接显示传入的字符串。示例如下:
mywin.LoadPage("test.htm")
mywin.SetPage("htmlbody" \
"h1Error/h1" \
"Some error occurred :-H)" \
"/body/hmtl")
设置HtmlWindow
由于HtmlWindow是从wx.ScrolledWindow派生而来,而非从wx.Frame派生,所以它没有可见的窗口。但用户通常希望在某个地方看到所显示的HTML页面的标题,而框架的标题栏就是显示标题的理想位置。
为了处理这一情况,HtmlWindow提供了两种方法:SetRelatedFrame和SetRelatedStatusBar。示例如下:
html = wx.html.HtmlWindow(self)
html.SetRelatedFrame(self, "HTML : %%s")
html.SetRelatedStatusBar(0)
第一条命令将HTML对象与其窗口关联起来(此处的self指向wx.Frame对象),并设置标题的格式。在这个示例中,页面标题 “Hello, world!” 将显示为 “HTML : Hello, world!”。
第二条命令设置应该使用哪个窗口的状态栏来显示浏览器的消息(例如 “正在加载…” 或 “已完成” 或超文本链接)。
自定义HtmlWindow
你可以通过设置字体大小、字体类型以及边框(窗口边框与所显示的HTML内容之间的空白区域)来自定义 HtmlWindow。相关函数如下:
- SetFonts
- SetBorders
- ReadCustomization
- WriteCustomization
最后两个函数用于存储用户自定义信息,也就是wx.ConfigBase相关的内容(例如在Windows系统下存储在注册表中,在Unix系统下存储在点文件中)。
HTML打印
wx.html库提供了具有不同复杂程度的打印功能。打印HTML文档最简单的方法是使用HtmlEasyPrinting类。
它只需一条命令就能让你打印HTML文档,而且你完全不必担心从wx.Printout类派生的问题。它只是 HtmlPrintout(常规的wxPython打印类)的一个简单包装器。
最后还有一个底层类HtmlDCRenderer,你可以使用它将HTML渲染到任何设备上下文(DC)的矩形区域中。
它支持将内容渲染到具有相同宽度的多个矩形区域中。(这种方式最常见的用途是在每一页上放置一个矩形区域,或者打印成两列。 )
帮助文件格式
wx.html库可用于向用户展示帮助手册;实际上,它原生支持(通过HtmlHelpController)微软HTML制作工具格式的一个简化版本。
一本(帮助)手册由三个文件组成:头文件、目录文件和索引文件。
你可以将这些文件,再加上HTML文件以及任意图像文件,制作成一个常规的压缩归档文件,以便HTML(或帮助查看器)读取;并且这个 “.zip” 文件可以视情况重命名为 “.htb” 文件。
头文件(.hhp)
头文件必须包含以下这些行(并且可能包含一些会被忽略的额外行):
Contents file=filename.hhc
Index file=filename.hhk
Title=title of your book
Default topic=default page to be displayed.htm
所有文件名(包括默认主题)都相对于 “.hhp” 文件的位置。
注意:此外,对于本地化,“.hhp” 文件可能包含以下这一行内容:
Charset=rfc_charset这一行指定了在目录文件和索引文件中所使用的字符集(例如 “iso8859_1”)。请注意,这一行与微软HTML帮助制作工具不兼容,该工具要么会在无提示的情况下删除这一行,要么就会报错。
目录文件(.hhc)
目录文件采用HTML语法,并且可以由常规的HTML解析器进行解析。它恰好包含一个列表(<ul> … </ul> 语句):
<ul>
<li><object type="text/sitemap">
<param name="Name" value="@topic name@">
<param name="ID" value=@numeric_id@>
<param name="Local" value="@filename.htm@">
</object></li>
<li><object type="text/sitemap">
<param name="Name" value="@topic name@">
<param name="ID" value=@numeric_id@>
<param name="Local" value="@filename.htm@">
</object></li>
</ul>
你可以修改标签的值属性。主题名称是在目录中显示的章节/主题名称,filename.htm是HTML页面的名称(相对于 “.hhp” 文件),而numeric_id是可选的——仅在使用Display时才会用到它。
列表中的项目可以是嵌套的——一个<li>语句可能包含一个<ul>子语句:
<ul>
<li><object type="text/sitemap">
<param name="Name" value="Top node">
<param name="Local" value="top.htm">
</object></li>
<ul>
<li><object type="text/sitemap">
<param name="Name" value="subnode in
topnode">
<param name="Local" value="subnode1.htm">
</object></li>
</ul>
<li><object type="text/sitemap">
<param name="Name" value="Another Top">
<param name="Local" value="top2.htm">
</object></li>
</ul>
索引文件(.hhk)
索引文件的格式与目录文件相同,只是ID参数会被忽略,并且不允许有子列表。
输入过滤器
wx.html库提供了一种用于读取和显示多种不同文件格式的文件的机制。
LoadPage方法不仅可以加载HTML文件,还能加载任何已知格式的文件。要让HtmlWindow识别某种文件类型,你必须创建一个HtmlFilter过滤器,并使用AddFilter方法将其注册。
单元格与容器
本文介绍了HtmlWinParser和HtmlWindow用于解析和显示HTML文档的机制。
单元格
你可以将任何文本(或HTML)分割成小的片段。我们把这些片段称为单元格。例如,一个单词、一条水平线、一张图片或者文档的任何其他部分都可以是一个单元格。每个单元格都有宽度和高度(特殊的零尺寸 “神奇” 单元格除外,比如颜色更改器或字体更改器)。详见HtmlCell。
容器
容器是一种单元格,它可以包含子单元格。其大小取决于子单元格的数量和尺寸(同时也取决于窗口的宽度)。详见HtmlContainerCell和Layout部分。这张图片展示了单元格和容器:
在标签处理器中使用容器
HtmlWinParser提供了一种便于用户管理容器的方式。它基于打开和关闭容器的理念。
使用OpenContainer可在已打开的容器内打开一个新容器。这个新容器是原容器的子容器。(如果你想创建一个与原容器处于同一深度层级的新容器,可以先调用CloseContainer(),然后再调用OpenContainer() 。)
使用CloseContainer来关闭容器。这并不会创建一个处于相同深度层级的新容器,而是将 “控制权” 交还给父容器。具体解释如下:
显然,OpenContainer的调用次数必须与CloseContainer的调用次数相同。
案例
这段代码创建了一个新的段落(与当前处于相同深度层级的容器),内容为 “Hello, world!” 。
myParser.CloseContainer()
c = myParser.OpenContainer()
myParser.AddText("Hello, ")
myParser.AddText("world!")
myParser.CloseContainer()
myParser.OpenContainer()
下面是这种情况的图示:
你可以看到,在执行这段代码之前有一个已打开的容器。我们关闭了它,创建了我们自己的容器,然后关闭了我们的容器,接着又打开了新的容器。
结果是,在执行完代码后,容器的深度层级保持不变。这是标签处理器应该遵循的一般规则:不改变容器的深度层级(换句话说,在HandleTag函数体中,对OpenContainer和CloseContainer的调用次数应该相同)。
注意:请注意,通常最好使用InsertCell方法,而不是直接向解析器添加文本。
标签处理器
wx.html库提供了可插拔标签处理器的架构。标签处理器是一种能够理解特定的一个或多个HTML标签,并对其进行解释的类。
HtmlWinParser有一个模块静态表。每个模块包含一个或多个标签处理器。每当创建一个新的HtmlWinParser对象时,所有模块都会被扫描,并且这些处理器会被添加到HtmlParser的可用处理器列表中。
工作原理
常见的标签处理器的HandleTag方法按以下四个步骤工作:
- 将父解析器的状态保存到局部变量中。
- 根据标签的参数更改解析器的状态。
- 解析该标签与其配对的结束标签之间的文本(如果存在结束标签的话)。
- 恢复解析器的原始状态。
有关修改解析器状态的方法,请参阅HtmlWinParser。一般来说,你可以进行诸如打开/关闭容器、更改颜色、字体等操作……
提供自定义的标签处理器
有关如何提供你自己的标签处理器,请参阅wx.lib.wxpTag。
标签处理器
该处理器派生自HtmlWinTagHandler(或直接派生自HtmlTagHandler)。
html所支持的标签
wx.html并非HTML标准的完整实现。相反,它支持大多数常见的标签,因此可以使用它来显示简单的HTML文档。(例如,它可以很好地处理在网景网页编辑器(Netscape Composer)中创建的页面,或者由tex2rtf生成的页面)。
以下表格列出了wx.html所识别的所有标签,以及其支持的参数。
一个标签的一般形式为:标签名 参数_1 参数_2 … 参数_n,其中参数_i 要么是参数名="参数值" ,要么是参数名=参数值 ,这两种形式是等效的。除非另有说明,wx.html对大小写不敏感。
常见参数值表
我们将在标签描述中使用以下这些替代内容:
支持的标签列表
支持的样式列表
wx.html实际上并不支持CSS,但它确实支持一些简单的样式:你可以对所有元素使用 “text-align”、“width”、“vertical-align” 和 “background” 这些样式,并且对于SPAN元素,还额外支持其他一些样式:
colorfont-familyfont-size(仅以磅为单位)font-style(仅支持这些值:“oblique”, “italic” and “normal”)font-weight(仅支持这些值:“bold” and “normal”)text-decoration(仅支持值:“underline”)