Движок компоновки
Движок компоновки
Слой компоновки преобразует стилизованный DOM в геометрию: дерево коробок, а затем фрагменты с размерами и позициями. Это этап после вычисленных стилей, и его выводом являются простые объекты Python, которые вы можете исследовать.
От DOM к дереву коробок
build_box_tree() создает BoxRoot из BoxNode записей из стилизованного документа, классифицируя модель отображения каждого элемента с помощью classify_display() в соответствии с перечислением Display. ComputedStyle и EdgeSizes содержат стиль для каждой коробки и измерения модели коробки.
Блочная компоновка
layout_block_tree() выполняет блочную компоновку над деревом коробок, создавая FragmentRoot, содержащий BlockFragment записей с разрешённой геометрией.
Встроенная компоновка
Встроенный контент формируется в части ShapedRun и InlineTextFragment, собираются в строки LineFragment с помощью layout_inline_fragments() и flush_inline_run().
Pagination
paginate_fragments() разбивает вывод фрагментов на PageFragment страниц, учитывая BreakHints, при этом PageMarginBoxes моделирует области полей страниц, а flush_page() завершает каждую страницу.
Советы и лучшие практики
- Вычислите вычисленные стили до компоновки — дерево коробок формируется из стилизованных элементов.
- Проверьте
EdgeSizes, когда размеры коробки выглядят неверно; отступы и внутренние отступы определяются там. - Сохраняйте в своей умственной модели различие между деревом коробок и деревом фрагментов: коробки описывают структуру, фрагменты описывают размещённую геометрию.
Распространённые проблемы
| Проблема | Причина | Исправление |
|---|---|---|
| Пустой вывод фрагмента | Выполнение разметки на неоформленном или пустом дереве | Сначала подключите таблицы стилей и содержимое |
| Неожиданная классификация отображения | Вычисленное display элемента отличается от предположения | Проверьте результат classify_display() для коробки |
| Разрывы страниц в неправильных местах | Подсказки разрыва не установлены | Предоставьте BreakHints для paginate_fragments() |
FAQ
В чём разница между box и fragment?
Boxes (BoxNode) описывают структуру макета, полученную из стилей; fragments (BlockFragment, LineFragment) — это размещённые результаты с геометрией.
Обрабатывает ли engine пагинацию?
Да — paginate_fragments() генерирует PageFragment страниц с margin boxes.
Откуда берутся text runs?
Inline content формируется в объекты ShapedRun и собирается в строки LineFragment.
API Reference Сводка
| Класс/Метод | Описание: |
|---|---|
build_box_tree | Получите дерево коробки из стилизованного DOM |
layout_block_tree | Запустить block layout над box tree |
layout_inline_fragments | Собрать inline content в строки |
paginate_fragments | Разбить фрагменты на страницы |
BoxNode | Один блок в структуре раскладки |
PageFragment | Одна оформленная страница |