Motore di layout
Motore di layout
Il livello di layout trasforma un DOM stilizzato in geometria: un albero di box, poi frammenti con dimensioni e posizioni. È la fase successiva agli stili calcolati, e i suoi output sono semplici oggetti Python che puoi ispezionare.
Dal DOM all’albero di box
build_box_tree() genera un BoxRoot di BoxNode voci da un documento stilizzato, classificando il modello di visualizzazione di ciascun elemento tramite classify_display() rispetto all’enumerazione Display. ComputedStyle e EdgeSizes contengono lo stile per box e le misurazioni del modello di box.
Layout a blocchi
layout_block_tree() esegue il layout a livello di blocco sull’albero di box, generando un FragmentRoot contenente BlockFragment voci con geometria risolta.
Layout in linea
Il contenuto in linea viene modellato in pezzi ShapedRun e InlineTextFragment, assemblati in linee LineFragment tramite layout_inline_fragments() e flush_inline_run().
Pagination
paginate_fragments() divide l’output dei frammenti in PageFragment pagine, rispettando BreakHints, con PageMarginBoxes che modella le aree di margine della pagina e flush_page() che finalizza ogni pagina.
Suggerimenti e migliori pratiche
- Risolvi gli stili calcolati prima del layout — il box tree deriva dagli elementi stilizzati
- Ispeziona
EdgeSizesquando le dimensioni della casella sembrano errate; i margini e il padding si risolvono lì - Mantieni il box tree e il fragment tree distinti nel tuo modello mentale: le box descrivono la struttura, i frammenti descrivono la geometria posizionata
Problemi comuni
| Problema | Causa | Correzione |
|---|---|---|
| Output del frammento vuoto | Esecuzione del layout su un albero non stilizzato o vuoto | Allega prima i fogli di stile e i contenuti |
| Classificazione di visualizzazione inattesa | Il display calcolato dell’elemento differisce dall’assunzione | Verifica il risultato di classify_display() per la casella |
| Interruzioni di pagina in punti strani | Suggerimenti di interruzione non impostati | Fornisci BreakHints a paginate_fragments() |
FAQ
Qual è la differenza tra un box e un frammento?
I box (BoxNode) descrivono la struttura di layout derivata dagli stili; i frammenti (BlockFragment, LineFragment) sono i risultati posizionati con geometria.
Il motore gestisce l’impaginazione?
Sì — paginate_fragments() produce PageFragment pagine con box di margine.
Da dove provengono i blocchi di testo?
Il contenuto in linea viene modellato in oggetti ShapedRun e assemblato in linee LineFragment.
API Reference Riepilogo
| Classe/Metodo | Descrizione |
|---|---|
build_box_tree | Deriva l’albero della casella da un DOM stilizzato |
layout_block_tree | Esegui il layout a blocchi sull’albero dei box |
layout_inline_fragments | Assembla il contenuto inline in righe |
paginate_fragments | Dividi i frammenti in pagine |
BoxNode | Un box nella struttura del layout |
PageFragment | Una pagina impaginata |