树构造

树构建

树构建是第二个解析阶段:它消耗标记器的流,并根据标准算法构建 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 的怪癖分类

另请参阅

 中文