FireFox + pango_break()
สุดสัปดาห์ที่ผ่านมา นั่งแกะ mozilla เพื่อหาทางแก้ให้ firefox ตัดคำด้วย pango หลังจากที่เคยเสนอทางเลือกไว้ใน tlwg-devel forum นานมาแล้ว แต่ไม่มีโอกาสได้ทำซะที จนอ๊อทมาถามเรื่องการใช้ pango_break เลยกลายเป็นการกระตุ้น ระหว่างหาโค้ดตัวอย่างให้เขาดู ก็เลยเกิดแรงบันดาลใจทีละนิดๆ ประกอบกับงานแปล GNOME ก็เริ่มชะลอตัวลงแล้ว มารู้ตัวอีกที ก็นั่งไล่โค้ดตัดคำเสียแล้ว โดยเริ่มจาก patch ของพี่สัมพันธ์ ที่ใช้ ICU ตัดคำ
patch ของพี่สัมพันธ์นั้น เป็นการขยาย LineBreaker ของญี่ปุ่น โดยมีการแยกสตริงเป็นภาษาๆ ก่อนจะเรียกกฎของภาษามาพิจารณาจุดแบ่งบรรทัด แต่ในเมื่อเราจะใช้ pango ซึ่งมีความสามารถในการวิเคราะห์สตริงยูนิโค้ดอยู่แล้ว คงไม่ต้องมาแยกก่อนอีก ไอเดียคือ พยายามเชื่อมรวม pango เข้ากับ layout code ให้ได้มากที่สุด ในระดับบนนั้น Gecko ใช้ NGLayout ไม่ใช่ PangoLayout อยู่แล้ว ก็คงต้องมองมาที่ระดับต่ำกว่านั้น คือเชื่อมเข้ากับโค้ดระดับกลางของ pango แทน ซึ่งงานที่ mozilla เขาทำไปก่อนแล้ว คือเรียกใช้ pango_shape() ที่เหลือก็คือ การใช้ pango_break() ในการตัดบรรทัด
ทำไปทำมา ได้ patch มาดังนี้ (เทียบกับ cvs HEAD 2006-02-26 snapshot):
- source tree patch เพื่อให้มาใช้ nsPangoLineBreaker ถ้า --enable-pango
- nsPangoLineBreaker.h และ nsPangoLineBreaker.cpp สำหรับ LineBreaker ที่เรียก pango เอาไปไว้ที่ไดเรกทอรี mozilla/intl/lwbrk/src ใน source tree
รายละเอียดติดตามได้ใน กระทู้ใน tlwg-devel
ปล. การทดสอบ ต้องใช้ pango-libthai และ libthai จากโครงการ LibThai นะครับ จึงจะตัดคำภาษาไทยได้