เอนจินจัดหน้า

เอนจินการจัดวาง

ชั้นการจัดวางแปลง DOM ที่มีสไตล์เป็นเรขาคณิต: ต้นไม้กล่อง, จากนั้นเป็นส่วนย่อยที่มีขนาดและตำแหน่ง มันเป็นขั้นตอนหลังจากสไตล์ที่คำนวณแล้ว และผลลัพธ์ของมันคืออ็อบเจกต์ Python ธรรมดาที่คุณสามารถตรวจสอบได้.


จาก DOM ไปยัง Box Tree

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 เมื่อมิติของกล่องดูไม่ถูกต้อง; ขอบและ padding จะถูกแก้ที่นั่น
  • ให้แยกแยะโครงต้นไม้กล่องและโครงต้นไม้ฟรากเมนต์ในโมเดลทางจิตของคุณ: กล่องอธิบายโครงสร้าง, ฟรากเมนต์อธิบายเรขาคณิตที่วางไว้

ปัญหาทั่วไป

ปัญหาสาเหตุการแก้ไข
ผลลัพธ์ส่วนที่ว่างเปล่าการทำงาน Layout บนต้นไม้ที่ไม่มีสไตล์หรือว่างเปล่าแนบสไตล์ชีตและเนื้อหาก่อน
การจำแนกการแสดงผลที่ไม่คาดคิดค่าที่คำนวณ 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หนึ่งหน้าแบบจัดรูปแบบ

ดูเพิ่มเติม

 ภาษาไทย