Wednesday, January 18, 2006

ปรับแต่ง Trac ให้รองรับ svn repository ที่ encode ด้วย tis620

ช่วงนี้กำลังจะเริ่มใช้ Trac ในการ control project
แต่มีปัญหาภาษาไทยนิดหน่อย
เริ่มตั้งแต่การ convert repository จาก cvs ไปเป็น svn

ผมใช้ cvs2svn ช่วยในการ convert
แต่มีปัญหาก็คือ ไม่สามารถระบุ --encoding=tis620 ได้
ถ้าระบุ ก็จะเกิด error message ว่า unknown encoding: tis620
โปรแกรม cvs2svn นี้เขียนด้วย python
ความมันส์เริ่มต้นนี้แหล่ะ เพราะผมไม่เคยเขียน python ที่ยาวเกิน 3 บรรทัด
ก็เลยสนุกกับการพยายามประติดประต่อว่า error ควรจะเป็นเรื่องไหน และเพราะอะไร
(โชคดีที่ code python อ่านไม่ยาก)

ประเด็นปัญหาก็คือ cvs2svn พยายามเรียกใช้ unicode แบบนี้

xx = unicode(sometext, "tis620")

ซึ่งปัญหาก็คือ python2.3 ของผม มันไม่มี encoding tis620
แต่หลังจาก search ใน google แล้ว ก็พบว่า
มี tis_620.py อยู่ใน sourceforge
ก็เลยจัดการ download มา, พร้อมกับแก้ไข aliases.py ให้
register encoding ใหม่นี้ลงไปด้วย

หลังจาก convert ไปเป็น svn เรียบร้อยแล้ว
ปัญหาต่อมาก็คือ
พอลอง browse code ดูใน Trac ก็พบว่า
มันยังแสดงภาษาไทยผิดอยู่

ปัญหาที่เจอ ก็คือ file browser.py
ที่รับผิดชอบการ render code มันใช้วิธี detect charset
โดยการดูค่าจาก mime-type ที่เก็บอยู่ใน svn properties
ที่ชื่อ svn:mime-type
(ใน svn เราสามารถ set property ให้กับ file
โดยใช้คำสั่ง svn propset ได้)

ค่า svn:mime-type เป็นค่า ที่ svn ออกแบบไว้ให้
subversion apache module
ใช้ในการ render stream กลับไปยัง browser

แน่นอนว่าค่านี้โดยปกติ จะไม่มีการ set ดังนั้น
browser.py ก็เลย render ด้วย encoding แบบ default กลับมา

ทางเลือกในการแก้ไข ก็มี 2 ทาง คือ
  • เขียนโปรแกรมเพื่อ set propset svn:mime-type ให้กับ file ทุกๆ file
  • แก้ไข browser.py ให้มีวิธี lookup ค่า default charset ที่ถูกต้อง


เลือกใช้วิธีที่ 2 คือเข้าไปแก้ไข code ใน browser.py
โดยเลือกว่า ถ้าหา charset ใน mime-type ไม่เจอ
ก็ให้ใช้ค่า default จาก trac.ini แทน (configuration file ของ trac project)

ประเด็นถัดไป ก็คือ การ browse change set ยังแสดงผลไม่ถูกต้อง
หลังจากไล่ดู source แล้ว ก็พบว่า
changeset.py มีการเตรียมการรองรับเรื่อง encoding ไว้อยู่แล้ว
โดยเราสามารถเข้าไปแก้ไข trac.ini ให้เป็น
default_charset = tis620 ได้เลย

ข้อคิดที่ได้
  • python เป็นภาษาที่เข้าใจง่าย
  • Editor ที่ render สวยๆ นี่ช่วยให้ใล่ source code ได้ง่ายขึ้นเยอะ
    ผมลองเปรียบเทียบ vi กับ textmate ดู
    ผมรู้สึกว่า textmate มีแรงเสียดทานในการอ่าน source code น้อยกว่า


Note:
หลังจากเข้าไป check ดูใน Trac Project แล้ว
พบว่าเขามีการ refactor แก้ไขส่วน mime-type กับ charset ให้ถูกต้องแล้ว
ใน changeset 2653
แต่ยังอยู่ใน trunk อยู่ ยังไม่ได้ release ออกมา

Related link from Roti

No comments: