レイアウトエンジン
レイアウトエンジン
レイアウト層は、スタイルが適用された DOM をジオメトリに変換します:ボックスツリー、そしてサイズと位置を持つフラグメントです。これは、計算されたスタイルの後の段階で、その出力は検査可能なプレーン Python オブジェクトです。
DOM からボックスツリーへ
build_box_tree() は、スタイルが適用されたドキュメントから BoxNode エントリの BoxRoot を生成し、各要素のディスプレイモデルを classify_display() を用いて Display 列挙と照合して分類します。ComputedStyle と EdgeSizes は、ボックスごとのスタイルとボックスモデルの測定値を保持します。
ブロックレイアウト
layout_block_tree() はボックスツリー上でブロックレベルのレイアウトを実行し、解決されたジオメトリを持つ BlockFragment エントリを含む FragmentRoot を生成します。
インラインレイアウト
インラインコンテンツは ShapedRun と InlineTextFragment のピースに形成され、layout_inline_fragments() と flush_inline_run() を介して LineFragment 行に組み立てられます。
Pagination
paginate_fragments() はフラグメント出力を PageFragment ページに分割し、BreakHints を尊重し、PageMarginBoxes がページ余白領域をモデル化し、flush_page() が各ページを確定します。
ヒントとベストプラクティス
- レイアウトの前に計算されたスタイルを解決します — ボックスツリーはスタイルが適用された要素から派生します。
- ボックス寸法が正しくないときは
EdgeSizesを検査してください;余白とパディングはそこで解決されます。 - ボックスツリーとフラグメントツリーはメンタルモデルで明確に区別してください:ボックスは構造を記述し、フラグメントは配置されたジオメトリを記述します。
一般的な問題
| 問題 | 原因 | 修正 |
|---|---|---|
| 空のフラグメント出力 | レイアウトが未スタイルまたは空のツリーで実行される | まずスタイルシートとコンテンツを添付する |
| 予期しない表示分類 | 要素の計算された display が想定と異なる | ボックスの classify_display() 結果を確認してください |
| ページ区切りが不自然な場所にあります | 改ページヒントが設定されていません | BreakHints を paginate_fragments() に提供してください |
FAQ
ボックスとフラグメントの違いは何ですか?
ボックス (BoxNode) はスタイルから派生したレイアウト構造を記述し、フラグメント (BlockFragment, LineFragment) はジオメトリを持つ配置結果です。
エンジンはページネーションに対応していますか?
はい — paginate_fragments() はマージンボックス付きで PageFragment ページを生成します。
テキストランはどこから来るのですか?
インラインコンテンツは ShapedRun オブジェクトに形成され、LineFragment 行に組み立てられます。
API Reference 概要
| クラス/メソッド | 説明 |
|---|---|
build_box_tree | スタイル済みDOMからボックスツリーを導出する |
layout_block_tree | ボックストリー上でブロックレイアウトを実行する |
layout_inline_fragments | インラインコンテンツを行に組み立てる |
paginate_fragments | フラグメントをページに分割する |
BoxNode | レイアウト構造内の1つのボックス |
PageFragment | レイアウト済みページ1枚 |