2015-3-23
DTCoreText是个开源的iOS富文本组件,它可以解析HTML与CSS最终用CoreText绘制出来,通常用于在一些需要显示富文本的场景下代替低性能的UIWebView,来看看它是怎样解析和渲染HTML+CSS的,总体上分成两步:数据解析—把HTML+CSS转换成NSAttributeString
渲染—用CoreText把NSAttributeString内容渲染出来,再加上图片等元素
本篇先介绍第一步,数据解析的实现。
概览
整体流程如图,HTML字符串传入DTHTMLAttributeStringBuilder,通过DTHTMLParser的回调解析后生成dom树,dom树的每个节点都是自定义的DTHTMLElement,通过DTCSSStylesheet解析每个元素对应的样式,这时每个DTHTMLElement已经包含了节点的内容和样式,最后从DTHTMLElement生成NSAttributeString。这一切都是在解析dom的过程中同步进行,为了分析方便,我们还是把它分为三个步骤:解析HTML,生成dom树
解析CSS,合并得到每个dom节点对应的样式
生成NSAttributeString
接下来详细介绍这三个步骤的实现方式。
解析HTML
iOS/OSX自带了XML/HTML的解析引擎libxml,它提供了两种解析html的接口:DOM解析
直接根据HTML字符串在内存生成一颗dom树,使用者可以自由遍历这颗dom树。这个方法的优点是使用简单方便,缺点一是内存使用多,无论多大的html文件都会一次性生成dom树放在内存里,二是性能不高,它生成dom树时遍历了一遍,用户使用时又遍历了一遍。
SAX解析
SAX的解析方式不会返回一个dom树,而是把解析过程都暴露给使用者,通过回调函数告诉调用者当前解析到了什么元素/内容,让使用者决定怎么处
理。举个例子,对
content
这段html进行解析时,解析器找到