Построение дерева
Построение дерева
Построение дерева — это второй этап парсинга: он потребляет поток токенизатора и создает DOM в соответствии со стандартным алгоритмом — включая его знаменитое поведение по восстановлению после ошибок. parse_html() оборачивает весь конвейер в один вызов; TreeBuilder раскрывает механизм.
Парсинг за один вызов
parse_html() переводит разметочный текст в готовое дерево; parse_fragment() применяет алгоритм фрагмента к элементу контекста. Оба управляют одинаковыми внутренними механизмами TreeBuilder через TreeBuilder.run().
Режимы вставки и открытые элементы
InsertionMode моделирует машину режимов алгоритма, при этом StackOfOpenElements и TemplateInsertionModeStack отслеживают состояние построения точно так, как описано в спецификации.
Восстановление после ошибок
Элементы форматирования с неправильным вложением разрешаются через run_adoption_agency_algorithm() — алгоритм агентства по принятию стандарта — и 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()с правильным элементом контекста — правила разбора фрагмента зависят от него - При отладке неожиданно сложных деревьев из плохой разметки поведения агентства по принятию и foster-parenting обычно являются объяснением, а не ошибкой
Распространённые проблемы
| Проблема | Причина | Исправление |
|---|---|---|
| Содержимое таблицы перемещено за пределы таблицы | Опека над перемещённым контентом | Исправить вложенность разметки источника |
| Теги форматирования дублируются в выводе | Реконструкция агентства по усыновлению | Ожидаемое стандартное поведение при неправильном вложении |
| Документ отображается в режиме quirks | Отсутствует или устаревший doctype | Проверьте 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 | Классификация quirks-режима на основе Doctype |