树构造
树构建
树构建是第二个解析阶段:它消耗标记器的流,并根据标准算法构建 DOM——包括其著名的错误恢复行为。parse_html() 在一次调用中封装整个管道;TreeBuilder 则公开了内部机制。
一次调用解析
parse_html() 将标记文本转换为完整的树;parse_fragment() 对上下文元素应用片段算法。两者均通过 TreeBuilder.run() 驱动相同的 TreeBuilder 内部实现。
插入模式与打开的元素
InsertionMode 对算法的模式机进行建模,StackOfOpenElements 与 TemplateInsertionModeStack 精确跟踪构建状态,完全符合规范的描述。
错误恢复
错位的格式化元素通过 run_adoption_agency_algorithm() —— 标准的 adoption agency 算法 —— 来解决,ActiveFormattingList 跟踪活动的格式化元素。get_foster_parent_location() 实现了对错位表格内容的 foster parenting。
怪癖模式与外部内容
determine_quirks_mode() 根据文档的 doctype 对文档进行分类。SVG 和 MathML 内容通过 adjust_svg_attributes()、adjust_mathml_attributes() 和 adjust_foreign_attributes() 进行路由,集成点由 is_html_integration_point() 和 is_mathml_text_integration_point() 检测。
技巧与最佳实践
- 除非你特别需要构造状态的内省,否则请使用
parse_html() - 使用
parse_fragment()时配合正确的上下文元素——片段解析规则取决于它 - 在调试因错误标记导致的异常树时,adoption agency 和 foster-parenting 行为通常是解释,而不是 bug
常见问题
| 问题 | 原因 | 修复 |
|---|---|---|
| 表格内容移到了表格外部 | 对错位内容进行收养 | 修复源标记的嵌套 |
| 输出中格式标签重复 | 收养机构重建 | 对错误嵌套的预期标准行为 |
| 文档以怪异模式渲染 | 缺少或旧版文档类型声明 | 检查输入上的 determine_quirks_mode() |
FAQ
为什么错误的标记会生成有效的树?
标准算法为每种错误情况定义了恢复——TreeBuilder 实现了这些路径,而不是抛出错误。
什么是 adoption agency 算法?
标准用于修复错位嵌套格式元素的过程;以 run_adoption_agency_algorithm() 形式公开。
构建器是否支持 SVG 和 MathML?
是的——外部内容属性通过专用的 adjust_*_attributes() 函数进行调整,并配合标准的集成点检测。
API Reference 摘要
| 类/方法 | 描述 |
|---|---|
parse_html | 一次调用将标记解析为树 |
parse_fragment | 片段算法解析 |
TreeBuilder.run | 运行树构建 |
InsertionMode | 算法模式机器 |
run_adoption_agency_algorithm | 错误嵌套修复 |
determine_quirks_mode | 基于 Doctype 的怪癖分类 |