日期:2014-05-17  浏览次数:20712 次

Mozilla FireFox Gecko内核源代码解析(4.nsHTMLTokens)

Mozilla FireFox Gecko内核源代码解析

(4.nsHTMLTokens)

中科院计算技术研究所网络数据科学与工程研究中心

信息抽取小组

耿耘

gengyun@sohu.com

之前我们分析了nsHTMLTokenizer(详见其解析篇),其中我们了解到了,其中设计了如何配合 nsScanner对输入流循环地解析流程,如怎么进行回溯等流式操作。实际上其中并没有包含具体的字符比对,以及正则表达式匹配等工作。同时也没有具体地声明“哪些HTML标签才是合法的标签”等具体信息。

 

而这些信息实际上都包含在了nsHTMLTokens这个文件中。在这个文件中除了对HTML中常见的各种Tag和他们最后生成的Token进行了一一的对应,并且对Tokens的类型,名称,状态,结构等进行了定义。并且对于一些类型的Token,都提供了相应的Consume方法,该种方法就是提供给在nsHTMLTokenizer中所调用的,真正对相应的Token所对应的HTML文本进行解析的方法。

 

通过学习这个nsHTMLTokens,还可以对Mozilla所推出的HTML标准进行了解,可以知道它都包含什么样的Tokens,哪些Tokens是合法的,以及他们的属性都是如何在浏览器中存储的。

 

首先,我们来看它的头文件nsHTMLTokens.h,其中包含了哪些声明和定义,这个头文件比较长,因此我们对其的内容逐个进行解析

 

首先来看他在文件头写下的一段注释:

 

这个文件中包含了我们的HTML Token的类型定义,这个定义能够被我们的DTD所理解。实际上,这一套Token定义也可以用于XML解析。目前我们拥有文本,注释,起始型标签,结束型标签,实体,属性,样式,脚本以及省略内容,这些个类型的Tokens。空格和换行符同样拥有他们所对应的Token,但是它们在未来的版本中可能会被消除掉。

 

如果你想查看HTML的标签定义,请查看叫做nsHTMLTags.h/cpp的文件。

 

大部分的Token类型都有相似的API。他们都有获取Token类型的方法(GetTokenType);那些代表HTML TagTokens还有一个获取tag类型的方法(GetTypeID)。另外,大部分的Token都有一个在解析流程中帮助它们自己进行解析的调用方法(Consume)。我们同样还提供了一些调试用的代码。