Двигун розмітки
Двигун розкладки
Шар розкладки перетворює стилізований 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?
Вбудований контент формується у об’єкти ShapedRun і збирається у рядки LineFragment.
API Reference Підсумок
| Клас/Метод | Опис |
|---|---|
build_box_tree | Отримайте дерево коробки зі стилізованого DOM |
layout_block_tree | Запустити блокове розташування над деревом блоків |
layout_inline_fragments | Об’єднати вбудований вміст у рядки |
paginate_fragments | Розділити фрагменти на сторінки |
BoxNode | Один блок у структурі розкладки |
PageFragment | Одна оформлена сторінка |