Движок компоновки

Движок компоновки

Слой компоновки преобразует стилизованный 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Одна оформленная страница

См. также:

 Русский