Theppitak's blog

My personal blog.

25 กรกฎาคม 2568

Tai Tham Updated, Thai Noi Revisited

Update งานอักษรอีสาน

Khottabun กับอักษรธรรมแบบไร้ USE

หลังจากการวิเคราะห์ทางเลือกต่างๆ สำหรับอักษรธรรมไป 2 blog (Lao Tham Font vs USE และ To USE or Not to USE for Lao Tham) และได้ตัดสินใจ หลีกเลี่ยง USE โดยยอมทิ้ง MS Word ไว้ข้างหลัง ก็ได้ implement ใน fonts-khottabun ตามนั้น ตั้งแต่ commit a0389bd จนถึง commit 1c73c80 โดยปรับ major version ของฟอนต์ขึ้นเป็นรุ่น 003 สำหรับอักษรธรรมแบบไม่ใช้ USE

Keyboard Layout อักษรธรรมบน Windows

ถัดมาคือ ผังแป้นพิมพ์อักษรธรรมบน Windows ในรูปของซอร์ส KLC สำหรับสร้างเป็นผังแป้นพิมพ์ด้วย Microsoft Keyboard Layout Creator (MSKLC) 1.4 ซึ่งจะ build เป็น DLL พร้อมโปรแกรม setup

ประเด็นปลีกย่อยของผังนี้คือ Windows กำหนดให้ผังแป้นพิมพ์ต้องผูกติดกับโลแคล (locale) ซึ่งกำหนดด้วยภาษาและดินแดน ตรงนี้เป็นปัญหาโดยนิยามอยู่ เพราะอักษรธรรมสามารถใช้เขียนได้หลายภาษา ไม่ว่าจะไทย ลาว ไทลื้อ ไทขึน หรือคาถาบาลี-สันสกฤต แต่ Windows จะบังคับให้เราเลือกเพียงภาษาเดียวมาประกอบกับดินแดนที่เป็นถิ่นของภาษาที่ใช้ โดยห้ามใช้ซ้ำกับผังอื่นในโลแคลนั้นๆ ด้วย ประเด็นคือ:

  • โลแคลต่างๆ มักมีผังแป้นพิมพ์อยู่แล้ว ถ้าไม่ต้องการซ้ำก็ต้องสร้างโลแคลใหม่สำหรับอักษรธรรม แต่จะกำหนดโลแคลด้วยภาษาอะไร ในเมื่ออักษรธรรมสามารถใช้เขียนได้หลายภาษา?
  • สมมุติว่าเราเลือกสร้างโลแคลภาษาลาวถิ่นไทย (lo-TH) ด้วย Microsoft Locale Builder แต่ปัญหาคือ เราไม่สามารถเลือกบล็อคยูนิโคดของอักษรธรรมให้กับโลแคลใหม่นี้ได้ เนื่องจาก Microsoft กำหนดตัวเลข enum ให้กับบล็อคยูนิโคดต่างๆ แต่ยังไม่ได้กำหนดเลขสำหรับอ้างให้กับบล็อคอักษรธรรม!
  • ในเมื่อสร้างโลแคลเองไม่ได้ วิธีแก้ขัดจึงเป็นการเลือกโลแคลอะไรก็ได้ที่ไม่ซ้ำกับชุดผังแป้นพิมพ์ที่เราใช้ เช่น ใช้ th, en ไม่ได้ เพราะจะซ้ำกับสองผังหลักที่เราใช้ และผมก็จิ้มเอาโลแคลมลยาฬัมในอินเดีย (ml-IN) โดยไม่มีเหตุผลใดๆ มากไปกว่าการแก้ขัด เวลาจะป้อนอักษรธรรมบน Windows ผู้ใช้ก็สลับแป้นพิมพ์ไปที่ภาษามลยาฬัม
  • อันที่จริง สิ่งที่เราต้องการมากกว่าในกรณีนี้คือการอ้างถึง อักษร (script) ตรงๆ ไปเลย แต่การออกแบบของ Windows ยังไม่เอื้อขนาดนั้น

อย่างไรก็ดี เราก็ได้ผังแป้นพิมพ์อักษรธรรมที่ทำงานได้บน Windows โดยเป็นเพียงผังปุ่มจริงๆ ยังไม่มีการตรวจหรือสลับลำดับอะไร ผู้ใช้ต้องป้อนตามลำดับยูนิโคดเป๊ะๆ เช่น ᨸᩮᩢ᩠ᨶ (เป็น) ก็ต้องป้อนเป็น ป + เอ + ไม้ซัด + SAKOT + น

อักษรไทยน้อย

แม้อักษรไทยน้อยจะเรียบง่ายกว่าอักษรธรรม แต่กลับมีรายละเอียดปลีกย่อยมากกว่า ทั้งเรื่องความหลากหลายของชุดอักษรที่ใช้ การควบอักษรติดกัน การยืมตัวห้อยตัวเฟื้องจากอักษรธรรมตามแต่ผู้จารึกจะเลือกใช้ ดังที่ผมได้เคย สรุปประเด็น ไว้ โดยยังไม่ตกลงว่าจะเลือก implement แบบไหน

เมื่อหลายปีก่อน ในระหว่างที่ทำไปศึกษาไปนั้น ผมเลือกที่จะเติมอักขระลงในช่องที่ยังว่างอยู่ของบล็อคยูนิโคดอักษรลาว ไม่ว่าจะเป็นตัวเฟื้องหรือตัวควบต่างๆ แต่ยิ่งพบอักขระที่ต้องเพิ่มรหัสมากขึ้นจากการอ่านจารึก ก็ยิ่งเห็นว่ามันไม่ใช่วิธีที่ดีในระยะยาว

ตอนนี้ได้โอกาสมาปัดฝุ่น โดยบล็อคยูนิโคดลาวเองก็มีมีการเพิ่มอักขระสำหรับเขียนภาษาบาลีตามแบบพุทธบัณฑิตสภา จึงได้พิจารณาทางเลือกต่างๆ ใหม่

เริ่มจากตรวจสอบความคืบหน้าใน Unicode ของอักษรไทยน้อย ซึ่ง ข้อมูลใน ScriptSource ของ SIL ได้บันทึกรายละเอียดไว้ โดยสถานะล่าสุดคือ ยังไม่กำหนดใน Unicode ส่วนกระบวนการเท่าที่ผ่านมาคือ

2018-01-02 Request to Add Thai Characters — Nitaya Kanchanawan (WG2 N4927, L2/18-041)
เป็นข้อเสนอขอเพิ่มอักขระไทยน้อยลงในบล็อคอักษรไทย! โดยเป็นงานที่เกี่ยวเนื่องกับการกำหนดมาตรฐานการถอดอักษรไทยน้อยเป็นอักษรโรมันที่ราชบัณฑิตยสภาได้เสนอเข้าสู่ ISO/IEC โดยได้รับความเห็นว่าควรกำหนดรหัสอักขระก่อน แต่ไม่ทราบว่าด้วยเหตุผลใด ราชบัณฑิตยสภาถึงได้เสนอให้เพิ่มอักขระในบล็อคอักษรไทยแทนที่จะเป็นบล็อคอักษรลาวที่อยู่ในสายวิวัฒนาการโดยตรง
2018-01-19 Information and documentation - Transliteration of scripts in use in Thailand - Part 1: Transliteration of Akson-Thai-Noi — TC46 / WG3 (WG2 N4927A, L2/18-042)
เป็นร่างมาตรฐานการถอดอักษรไทยน้อยเป็นอักษรโรมันที่เป็นต้นเรื่อง ตัวเอกสารต้องใช้รหัสผ่านในการเข้าถึง และไม่เกี่ยวข้องกับเรื่องรหัสอักขระโดยตรง ผมจึงไม่ใส่ลิงก์ไว้
2018-01-19 Results on ISO CD 20674-1: Information and documentation - Transliteration of scripts in use in Thailand - Part 1: Transliteration of Akson-Thai-Noi — TC46 Secretatriat (WG2 N4927B, L2/18-043)
ผลการโหวตร่างมาตรฐานการถอดอักษรไทยน้อยของคณะกรรมการ เห็นชอบ 16, เห็นชอบโดยมีข้อคิดเห็น 2, ไม่เห็นชอบ 1, งดออกเสียง 19
2018-02-20 Thai-Noi Transliteration — Martin Hosken (WG2 N4939, L2/18-068)
เป็นความเห็นจากคุณ Martin Hosken ผู้เชี่ยวชาญจาก SIL โดยสรุปเห็นว่าอักษรไทยน้อยเข้ากันได้กับอักษรธรรมมากกว่าอักษรไทย
2018-02-28 Towards a comprehensive proposal for Thai Noi / Lao Buhan script — Ben Mitchell (L2/18-072)
เป็นความเห็นจากคุณ Ben Mitchell ผู้เชี่ยวชาญอีกท่านหนึ่ง โดยมีผู้ร่วมให้ข้อมูลคือ Patrick Chew, ผมเอง และ อ.ประพันธ์ เอี่ยมวิริยะกุล โดยสรุปเห็นว่าควรเพิ่มอักขระไทยน้อยในบล็อคอักษรลาว โดยเพิ่มเติมจากอักษรลาวบาลีของพุทธบัณฑิตสภาอีกที และได้เสนอทางเลือกต่างๆ ดังที่ผมได้สรุปไว้ แต่ยังไม่ระบุว่าจะเลือกวิธีการไหน
Recommendations to UTC #155 April-May 2018 on Script Proposals (L2/18-168) (อยู่ที่ข้อ 6.) และบันทึกการประชุมของ UTC #155 (L2/18-115) (อยู่ที่ข้อ D.8.1 และ D.8.3)
สรุปข้อแนะนำของคณะกรรมการว่าอักษรไทยน้อยไม่ใข่ส่วนขยายของอักษรไทย และผู้เสนอร่างอักษรไทยน้อย (หมายถึง อ.นิตยา กาญจนวรรณ จากราชบัณฑิตยสภา) ควรนำข้อมูลในเอกสารของคุณ Ben Mitchell ข้างต้นไปใช้ประกอบการร่างด้วย โดยมอบให้ Deborah Anderson ร่างเอกสารแจ้งเจ้าของร่าง ซึ่งก็คือเอกสาร L2/18-070

แล้วกระบวนการทั้งหมดก็หยุดอยู่ที่รอการดำเนินการของราชบัณฑิตยสภาต่อจากนั้น

สรุปว่ายังไม่มีมาตรฐาน Unicode อักษรไทยน้อยเกิดขึ้น ถ้าจะ implement ตอนนี้ก็เป็นเพียงตุ๊กตาเท่านั้น

จากทางเลือกต่างๆ ที่มี ผมพิจารณาเลือกเองไปก่อนอย่างนี้:

  • Conjunct หรือการสังโยคพยัญชนะด้วยตัวห้อย/ตัวเฟื้อง ใช้พินทุ (U+0EBA LAO SIGN PALI VIRAMA) ตามด้วยพยัญชนะที่จะสังโยค ยกเว้นกรณีที่มีรหัสอยู่แล้ว คือ ล ห้อย (U+0EBC) และ ย เฟื้อง (U+0EBD) ก็ใช้รหัสนั้นๆ ไปเลย
  • Ligature หรือตัวแฝด หรืออักษรควบ ใช้ U+200D ZERO WIDTH JOINER (ZWJ) เชื่อมพยัญชนะ ยกเว้นกรณีที่มีรหัสอยู่แล้ว คือ U+0EDC (ໜ), U+0EDD (ໝ) ก็ใช้รหัสนั้นๆ ไปเลย
  • สระออย กำหนดอักขระใหม่ในช่องที่ยังว่างอยู่ คือ U+0EBE เพื่อให้เป็นวิธีที่สอดคล้องกับอักษรธรรม (อีกวิธีที่ไม่ต้องกำหนดอักขระใหม่คือใช้ พินทุ + ຢ แต่จะเป็นวิธีที่แปลกแยกจากอักษรธรรม)

เมื่อเลือกวิธีนี้แล้ว ก็ปรับเปลี่ยนทั้งในฟอนต์ Khottabun และในระบบป้อนข้อความ Lanxang ดังนี้:

  • fonts-khottabun: detach glyph ตัวห้อย/ตัวเฟื้องและตัวควบทั้งหมดจากรหัสอักขระ แล้วสร้างกฎ 'ccmp' TN conjuncts และ 'ccmp' TN subjoins เพื่อเข้าถึง glyph เหล่านี้ผ่านพินทุและ ZWJ ตามลำดับ พร้อมกับปรับรุ่น major ของฟอนต์เป็นรุ่น 004 (commit cc4935a)
  • lanxang: ตัดกระบวนการแปลง พินทุ + พยัญชนะ เป็นอักขระตัวห้อย/ตัวเฟื้อง และ พยัญชนะ + ZWJ + พยัญชนะ เป็นอักขระตัวควบ ทั้งหมด (ทิ้ง sequence ประกอบไว้อย่างนั้นในข้อความเลย แล้วให้ฟอนต์จัดการตอน render) ยกเว้นการควบ ໜ,ໝ เพื่ออำนวยความสะดวก (commit f0645b1) แต่ก็ยังป้อน ໜ, ໝ โดยตรงได้ด้วย level 3 เช่นกัน
  • lanxang: เพิ่มผังแป้นพิมพ์อักษรไทยน้อยสำหรับ Windows ด้วย (commit cce81cd)

พร้อมกันนี้ก็แปลงวิธีลงรหัสอักขระไทยน้อยในตัวอย่างการปริวรรตทั้งหลายด้วย (พญาคันคาก, ฮีตคองคะลำ, บูชาพญานาค, นกกระจอก)

ป้ายกำกับ: , , , ,

23 ตุลาคม 2564

IBus-LibThai 0.1.5

IBus-LibThai 0.1.5 ออกไปแล้วเมื่อวันพุธที่ผ่านมา หลังจากไม่มี release มาเกือบ 5 ปี โดยมีเงื่อนไขหลักที่ทำให้จำเป็นต้องออกรุ่นใหม่คือปัญหาในระบบตั้งค่า อาการคือตั้งค่าเสร็จแล้วไม่มีผลต่อตัว engine ตั้งยังไงก็ได้ค่า default

ผมไม่ได้ติดตามการพัฒนาของ IBus มาระยะหนึ่ง จึงไม่ทราบว่ามีความเปลี่ยนแปลงอะไรบ้างจนทำให้วิธีตั้งค่าแบบเดิมใช้ไม่ได้ จึงเริ่มจากตรวจสอบ engine อื่นว่าปัจจุบันเขาทำยังไงกัน ก็ได้พบว่าหลาย engine ได้ย้ายจากการใช้ IBusConfig ซึ่งเป็น API ของ IBus เองสำหรับการจัดการค่าตั้งไปใช้ระบบอื่น บาง engine ถึงกับสร้างระบบ config ของตัวเองขึ้นมาเลย

แต่ผมก็ยังคงพยายามปรับแก้ภายใต้ API ของ IBus ต่อไป โดยเปลี่ยนจากการ restart IBus เพื่อ reload config มาเป็นการ watch ค่า config แล้วปรับใช้ค่าที่เปลี่ยนทันทีแทน ซึ่งก็ทำให้ engine เปลี่ยนพฤติกรรมตามค่าที่ผู้ใช้ตั้งได้ ภายใน session เดิม แต่ไม่สามารถ save ค่าไว้ให้มีผลใน session ถัดไปได้

ผมแน่ใจว่าทำทุกอย่างเท่าที่ document บอกแล้ว ถ้าจะมีอะไรที่ undocumented ก็ต้องแกะซอร์สของ IBus ซึ่งพอลงมือแกะก็พบว่า แม้แต่ IBus แกนหลักเองก็ไม่ใช้ IBusConfig แต่ไปใช้ GSettings ของ GLib!

จะรออะไรล่ะครับ ถึงแกะจนเจอที่ผิด แต่เขาจะสนใจแก้โค้ดที่เขาเองก็ไม่ใช้ไหมล่ะ? ผมจึงตัดสินใจเปลี่ยนไปใช้ GSettings เหมือนกัน

ด้วยระบบ GSettings ซึ่งใช้ dconf เป็น backend ค่าตั้งต่างๆ จะสามารถเข้าถึงได้ด้วยโปรแกรม dconf-editor

ค่า config ของ IBus-LibThai ใน dconf editor

โดยค่า config แต่ละค่าจะมีคำอธิบายจาก GSchema ที่เตรียมไว้

คำบรรยายคีย์ kb-layout ของ IBus-LibThai ใน dconf editor

และผู้ใช้ IBus ก็ยังคงสามารถปรับแต่ง IBus-LibThai ได้จาก preferences ของ engine ใน IBus Preferences ตามปกติ

Preferences ของ IBus-LibThai

พร้อมกันนี้ ยังมีความเปลี่ยนแปลงอื่นในส่วนของผังแป้นพิมพ์:

  • มีการปรับโครงสร้างของข้อมูลผังแป้นพิมพ์เพื่อให้เข้าใจง่าย และสะดวกต่อการปรับแก้
  • ปรับแก้ผังปัตตะโชติที่ยังคลาดเคลื่อนจากแพลตฟอร์มอื่น โดย ขอหารือ กับคุณ @sirn ซึ่งเป็นผู้ใช้ผังปัตตะโชติ ซึ่งคุณ @sirn ก็ได้เสนอแนะเพิ่มเติม จนกระทั่งได้ตำแหน่งปุ่มสำหรับอักษรไทยเพิ่ม คือ ฃ ขวด, ฅ คน, ลากข้างยาว, ยามักการ
  • เพิ่มผัง มนูญชัย ซึ่งเป็นผังแป้นพิมพ์ใหม่ล่าสุดที่เกิดจากการออปติไมซ์ด้วย AI จากตัวอย่างเอกสารร่วมสมัย ผู้ใช้ลินุกซ์ที่สนใจทดสอบหรือใช้งานผังใหม่นี้จึงสามารถใช้งานได้ผ่าน IBus-LibThai

ป้ายกำกับ: ,

08 พฤศจิกายน 2556

Thanks, and the September-October Diary

ขอขอบคุณผู้สนับสนุนงานพัฒนาของผมในเดือนกันยายน-ตุลาคมที่ผ่านมาดังนี้ครับ:

เป็นอีกครั้งหนึ่งที่ต้องเขียน blog แบบรวบสองเดือน เนื่องจากภารกิจต่าง ๆ ค่อนข้างเร่งรัด จนอยากใช้เวลาสะสางงานให้เต็มที่มากกว่า

งานในช่วงสองเดือนที่ผ่านมา แบ่งเป็นหมวด ๆ ดังนี้ครับ:

โครงการอักษรอีสาน

งานพัฒนาที่ LTN และ Debian

เป็นการปล่อยสิ่งที่พัฒนาสะสมมาตั้งแต่ระลอกที่แล้วเมื่อต้นปี โดยทยอยตรวจสอบความเรียบร้อยและออกรุ่นซอฟต์แวร์ต่าง ๆ ดังนี้:

  • libdatrie 0.2.7
    • แก้ไขประเด็นเรื่อง portability เกี่ยวกับ void pointer arithmatics ซึ่งจะมีปัญหากับคอมไพเลอร์ที่ไม่ใช่ GCC โดยได้รับรายงานจากคุณ Mikhail Korobov ว่าคุณ Gabi Daver ได้พบปัญหานี้ขณะคอมไพล์ด้วย Visual C++ พร้อมแพตช์แก้
    • ระหว่างแก้ ได้ทดลองคอมไพล์ด้วยตัวเลือก -Wall ทำให้เจอ warning เพิ่มเติม และแก้ไขจนหมด
    • เขียน test case เพื่อให้สามารถตรวจสอบความถูกต้องเวลาแก้โค้ดได้ในอนาคต ที่ผ่านมาจะทดสอบผ่าน libthai เป็นหลัก แต่เขียน test case เป็นเรื่องเป็นราวน่าจะสะดวกกว่า ซึ่งในระหว่างที่เขียน test case ก็ทำให้ได้อ่านเอกสารประกอบและแก้ไขที่ผิด พร้อมกับได้เพิ่ม API เพื่อความสะดวกในการใช้งานด้วย
    • ปรับ Doxyfile ที่ใช้สร้างเอกสาร เพื่อตัดสิ่งที่เลิกใช้แล้วใน doxygen 1.8.4
    • ออก libdatrie 0.2.7.1 ตามมา หลังจากพบว่าลืมปรับค่า library version เพื่อให้ SONAME สะท้อนการเพิ่ม API ที่เกิดขึ้น
    • อัปโหลด 0.2.7.1-1 เข้า Debian sid
  • thaixfonts 1.2.6
    • มีการปรับระบบ build ตาม autoconf รุ่นใหม่ และเปลี่ยนมาใช้ XZ tarball แทน GZ tarball ซึ่งเป็นสิ่งที่ทำไว้นานแล้ว ก็ออกรุ่นมาเพื่อปรับตามซอฟต์แวร์อื่นเท่านั้น ส่วนตัวเนื้อหาฟอนต์ไม่มีการเปลี่ยนแปลงอะไร
    • อัปโหลด 1:1.2.6-1 เข้า Debian sid
  • LibThai 0.1.20
    • ปรับข้อมูลพจนานุกรมตัดคำตามที่พบกรณีต่าง ๆ ในช่วงที่ผ่านมา [เกร็ด: รุ่นนี้รู้จักอำเภอขนอมที่ไม่ใช่ ขน-อม แล้ว ;-)]
    • แก้ compiler warning ที่พบใน test case ต่าง ๆ
    • อัปโหลด 0.1.20-1 เข้า Debian sid
  • TeX hyphenation patterns
    • sync ข้อมูลพจนานุกรมตัดคำจาก libthai เข้าไปที่ ThaiLaTeX SVN พร้อมกับปรับแก้ hyphenation patterns ตามข้อมูลใหม่
    • แจ้งไปที่โครงการ tex-hyphen ว่าขอปรับข้อมูล hyphenation patterns ภาษาไทย พร้อมกับรายงานปัญหาของสคริปต์บางตัวที่ใช้สร้างข้อมูลอัตโนมัติ คุณ Mojca Miklavec ก็ได้ช่วยแก้สคริปต์ให้ (rev 652, 653) และรับแพตช์ปรับข้อมูลภาษาไทยไปรวมให้ (rev 654)
    • สอบถามและขอ import source ของ hyphenation patterns ภาษาไทยเข้าใน tex-hyphen โดยตรง เพื่อที่ต่อไปจะได้ไปทำงานที่นั่นแทนที่จะต้องผ่าน ThaiLaTeX แบบนี้ ทั้งนี้เพื่อให้เป็นไปตามแผน ที่เคยคุยกันไว้ จนกระทั่งได้ import source ใน rev 655
    • ไม่มีการอัปโหลดอะไรใน Debian แค่รอ Debian อัปเดตแพกเกจ texlive-base เท่านั้น
    • request ขอลบ thailatex ออกจาก Debian unstable เพื่อไม่ให้มีซอร์สตกค้างอยู่ (ลบแล้ว)
  • swath 0.5.1
    • แก้รหัสตัดคำของ Lambda จาก U+200C (ZWNJ) เป็น U+200B (ZWSP) ...ว่าแต่มีใครใช้ฟีเจอร์นี้ไหมเนี่ย?
    • sync ข้อมูลพจนานุกรมตัดคำจาก ThaiLaTeX/hyph-utf8 (ซึ่ง sync มาจาก LibThai อีกที) เพื่อให้ตัวตัดคำ LaTeX ทำงานสอดคล้องกับ hyphenation patterns
    • ก่อนออกก็ปรับซอร์สโค้ดของ swath เพื่อให้แต่ละรุ่นมีการปรับปรุงด้านความปลอดภัยไปทีละน้อย โดยในรุ่นนี้ได้ป้องกัน buffer overflow ใน file filter ต่าง ๆ (ยังมีให้แก้อีกเยอะในรุ่นถัด ๆ ไป :-P )
    • อัปโหลด 0.5.1-1 เข้า Debian sid
  • IBus-LibThai 0.1.2
    • แก้ปัญหาการกด shortcut (เช่น Ctrl-C) ใน IBus 1.5 อันเนื่องมาจากการเชื่อมรวมกับ XKB ของ IBus รุ่นนี้ ทำให้ผังแป้นพิมพ์ที่ระบุใน metadata ของ IBus-LibThai ว่าเป็น th ทำให้กด Ctrl-C ได้เป็น Ctrl-แ เสมอ แก้ไขโดยปรับผังแป้นพิมพ์เป็น us เท่านั้น
    • อย่างไรก็ดี การแก้ปัญหาในรายการที่แล้วทำให้เกิดปัญหาใหม่ คือทำให้กด accelerator ใน GUI ที่แปลเป็นไทย (เช่น Alt-ฟ เพื่อเรียกเมนู แฟ้ม) ไม่ได้ วิธีแก้ที่เหมาะสมจึงควรให้ IBus-LibThai พยายามแปลง key event ที่มีการกดปุ่มประกอบให้เป็นภาษาไทย แต่ปรากฏว่าไม่สามารถส่ง event ที่แปลงแล้วกลับไปหา event queue ได้ เนื่องจากฟังก์ชัน ibus_engine_forward_key_event() ไม่ทำงานอย่างที่คาด งมอยู่นานก็ไม่สามารถแก้ได้ เวลามีจำกัดจึงใช้วิธีกำหนดผังแป้นพิมพ์เป็น us,th เพื่อให้ GTK+ กับ XKB ไปคุยกันเอง ซึ่งก็ได้ผล แต่ปัญหาคือ มันจะแปลงอักขระตามผังเกษมณีเท่านั้น ใครใช้ผังปัตตะโชติใน IBus-LibThai ก็จะงง ไว้หาวิธีแก้ต่อไปในรุ่นหน้า
    • เพิ่มการรองรับการป้อนเลขไทยด้วยแป้นตัวเลข โดยอาศัยการกด CapsLock ล็อคไว้ หรือใช้การยกแคร่ระดับ 3 (Alt ขวา) อนึ่ง ตามที่เคยได้ ออกแบบไว้ เมื่อสองปีก่อนนั้น จะใช้ ScrollLock ไม่ใช่ CapsLock เนื่องจาก CapsLock จะไปเพิ่มขั้นตอนขณะสลับภาษาไปเป็นภาษาอังกฤษที่จะต้องปลด CapsLock อีกขั้นหนึ่งด้วย แต่ในครั้งนี้ได้ตัดสินใจเปลี่ยนเป็น CapsLock ด้วยเหตุผลสองประการ ประการแรกคือการตรวจสอบสถานะของ ScrollLock ด้วย API ของ IBus เป็นไปได้ยาก เพราะไม่มีการเตรียมการรองรับไว้ ประการที่สองคือในแป้นพิมพ์ย่อส่วน เช่นแป้นพิมพ์โน้ตบุ๊ก หลายรุ่นได้ตัดปุ่ม ScrollLock ออกไปแล้ว ตามที่ วิกิพีเดียว่าไว้ (โน้ตบุ๊กผมก็ไม่มี)
    • อัปโหลด 0.1.2-1 เข้า Debian sid

งานแปล

  • ตรวจทาน คำแปล GNOME ตามที่มีผู้ส่งคำแปลเข้ามา โดยที่ผมไม่ได้แอคทีฟตามแปลเองอีกต่อไปแล้ว
  • แปล Xfce เป็นไทย เพิ่มเติม โดยล่าสุด ได้แปล core package ต่าง ๆ ครบแล้ว พร้อมกับปรับคำแปลทั้งหมดจาก master กลับไปที่ branch xfce-4.10 ด้วย และแปลปลั๊กอินที่ผมใช้อีกนิดหน่อยเพิ่มเติม ทำให้ขณะนี้อัตราการแปลของภาษาไทยอยู่ที่ 54% แล้ว

blog นี้ก็เลยยาวหน่อย ขอขอบคุณทุกท่านที่ติดตามครับ

ป้ายกำกับ: , , , , , , , , , ,

19 กุมภาพันธ์ 2556

IBus-LibThai 0.1.0

ผมเคย เขียนถึง IBus-LibThai ไปเมื่อ 3 เดือนก่อน ซึ่งเป็นการปัดฝุ่นโค้ดที่ร่างไว้ตั้งแต่ปีก่อนจนใช้การได้ แล้วก็ย้ายไปทำ โครงการล้านช้าง สำหรับป้อนอักษรธรรมลาว-อีสานผ่าน IBus อยู่ระยะหนึ่ง ระหว่างนี้ก็ทดลองใช้เองมาเรื่อย ก็ใช้การได้ดี แต่เนื่องจากมีงาน release ซอฟต์แวร์ต่าง ๆ ก็เลยยังไม่ได้กลับไปดูต่อ

จนกระทั่งในการประชุม “โสเหล่” ครั้งล่าสุดของ KKLUG ผมถูกกระตุ้นอีกครั้งจาก เสกสรร เพื่อนร่วมโครงการ อักษรอีสาน ว่าเขาใช้ IBus แล้วทำให้มีปัญหาการป้อนภาษาไทยด้วย ibus-m17n หลายอย่าง ไหน ๆ ผมก็ปล่อยซอฟต์แวร์ที่คั่งค้างอยู่เสร็จไปแล้ว ก็เลยรับปากว่าจะเร่งออก IBus-LibThai ให้

วันนี้ก็ได้แล้วครับ IBus-LibThai 0.1.0 ซึ่งต้องอาศัย API ใหม่ใน LibThai 0.1.19 ที่เพิ่งออกไป โดยได้ทำแพกเกจสำหรับ Debian และอัปโหลดเข้า experimental เรียบร้อยแล้วด้วย ขณะนี้รออยู่ที่ คิว NEW รอทีม ftp-master มารีวิวก่อนจึงจะได้เข้า อาจจะรอนานหน่อย เพราะช่วงนี้สำหรับ Debian แล้ว งานออกรุ่น Wheezy สำคัญกว่าครับ

ป้ายกำกับ: ,

23 พฤศจิกายน 2555

Lanxang Project

กลับมาพูดถึง โครงการอักษรอีสาน อีกครั้ง โครงการนี้ถ้านับตั้งแต่เริ่มวางแนวคิด ตอนนี้ก็อายุได้ 2 ปีเต็มพอดี ที่ผ่านมาก็ได้ทำ ฟอนต์โคตรบูรณ์ โดยใช้ฟอนต์ อ.สานิตย์ เป็นฐาน เอามาปรับให้เป็นยูนิโค้ด และเพิ่มกฎ GSUB ในระหว่างที่ rendering engine ต่าง ๆ ยังไม่รองรับ

ความคืบหน้าล่าสุด หลังจากที่ได้ตั้งกลุ่มทำงานอักษรอีสานร่วมกับคุณอันธิฌาและคุณเสกสรร ก็ได้เพิ่มความเข้มข้นในการศึกษาจารึกโบราณมากขึ้น โดยในระหว่างปริวรรตจารึกลงเว็บ ก็พบความไม่สะดวกในการป้อนข้อความตาม phonetic order ของยูนิโค้ด และเนื่องจากทีมงานเริ่มมีความเข้าใจอักษรธรรมกันพอสมควรแล้ว จึงได้ประชุมกันออกแบบ input method สำหรับอักษรธรรมลาว/อีสาน

โค้ดอยู่ใน github โดยใช้ชื่อโครงการว่า ล้านช้าง โดย input method นี้จะมีคุณสมบัติดังนี้:

  • มีผังแป้นพิมพ์ในตัว โดยดัดแปลงจากผัง มอก. 820-2538
  • สลับลำดับการพิมพ์ เพื่อให้ผู้ใช้สามารถป้อนข้อความในลำดับจากซ้ายไปขวาเหมือนอักษรไทย แล้ว input method จะสลับลำดับให้เป็น phonetic order ตามข้อกำหนดยูนิโค้ดให้
  • ตรวจลำดับการพิมพ์ คล้าย วทท. 2.0 โดยสามารถปรับแต่งระดับความเข้มงวดของการตรวจสอบได้ 3 ระดับ คือปล่อยผ่าน, ตรวจสอบขั้นพื้นฐาน (สามารถป้อนตัวสะกดแบบพิเศษได้) และตรวจสอบแบบเข้มงวด (ไม่อนุญาตตัวสะกดแบบพิเศษ)

ผังแป้นพิมพ์จะเป็นแบบนี้:

ผังแป้นพิมพ์

ส่วนตารางการตรวจลำดับที่ได้จากการออกแบบร่วมกันของทีมงาน จะเริ่มจากการแบ่งคลาสของอักขระดังนี้:

  1. LV = สระหน้า
  2. AV = สระบน (อิ อี อึ อื ไม้กง ไม้เกาห่อนึ่ง)
  3. AD1 = ตัวสะกดบน (ไม้ซัด ไม้อังแล่น)
  4. AD2 = ตัวสะกดบน/สระบน (นิคหิต)
  5. BV1 = สระล่าง 1 (อุ อู)
  6. BV2 = สระล่าง 2 (ออล่าง)
  7. FV1 = สระหลัง 1 (อะ)
  8. FV2 = สระหลัง 2 (อา อาสูง)
  9. FV3 = สระหลัง 3 (ออย)
  10. IV = สระลอย (อิ อี อุ อู เอ โอ ลอย, ฤ ฦ)
  11. C1 = พยัญชนะที่เฟื้องด้วยพินทุได้
  12. C2 = พยัญชนะที่เฟื้องด้วยพินทุไม่ได้ (ฃ ฅ ซ ฝ ฟ หยอหยาดน้ำ ร ล ฬ อ ฮ สอสองห้อง)
  13. PH = พินทุ (SAKOT)
  14. S1 = เฟื้องพิเศษ 1 (ระวง)
  15. S2 = เฟื้องพิเศษ 2 (ล เฟื้องล่าง, ล เฟื้องข้าง)
  16. T = วรรณยุกต์
  17. LG = ตัวประสม (แล)
  18. CR = ตัวรหัสลับ (cryptogram)
  19. NP = ตัวเลขและเครื่องหมายวรรคตอน

จากนั้น ก็จะพิจารณาการกระทำระหว่างอักขระที่อยู่หน้าเคอร์เซอร์กับอักขระที่กด โดยกำหนดรหัสการกระทำดังนี้:

  • P = เข้าสู่ pre-edit mode
  • A = รับอักขระ
  • W = รับอักขระโดยสลับกับอักขระก่อนหน้า
  • R = ไม่รับอักขระ
  • S = ไม่รับอักขระในโหมดเข้มงวด รับอักขระในโหมดปกติ

และพิจารณาการกระทำจากตารางนี้:

c0,c1 X L
V
A
V
A
D
1
A
D
2
B
V
1
B
V
2
F
V
1
F
V
2
F
V
3
I
V
C
1
C
2
P
H
S
1
S
2
T L
G
C
R
N
P
X R P R R R R R R R R A A A R R R R A R A
LV R P A A S S S A A S A A A A W A A A A A
AV R P R R A R A S A S A A A A R A A A A A
AD1 R P R R R R R S S S A A A A R A A A A A
AD2 R P R R R R R S A S A A A S R R A A R A
BV1 R P S A A R R S S S A A A S A R A A R A
BV2 R P R A R R R A R R R A A S R R A A R A
FV1 R P R R R R R R R R A A A R R R R A R A
FV2 R P R A R R R A R R A A A A R A R A A A
FV3 R P R R R R R R R R A A A R R R R A R A
IV R P A R R R R R R R R A A R R R R A R A
C1 R P A A A A A A A A A A A A A A A A A A
C2 R P A A A A A A A A A A A A A A A A A A
PH R P R R R R R R R R R A R R R R R R R R
S1 R P A A A A A A A A A A A A R R A A A A
S2 R P A A A A S A A A A A A S R R A A A A
T R P R R R R R A A A A A A A R R R A A A
LG R P R R R R R A R R A A A A R R A A A A
CR R P A A A A A A A A A A A S A A A A A A
NP R P R R R R R R R R A A A R R R R A R A

ตารางการกระทำในโหมด pre-edit:

P X L
V
A
V
A
D
1
A
D
2
B
V
1
B
V
2
F
V
1
F
V
2
F
V
3
I
V
C
1
C
2
P
H
S
1
S
2
T L
G
C
R
N
P
LV R R R R R R R R R R R C C R R R R R R R

การกระทำ C = commit อักขระใน pre-edit string โดยกลับลำดับจากหลังมาหน้า

ขณะนี้ engine สำหรับ IBus เริ่มใช้การได้แล้ว โดยกำลังอยู่ระหว่างทำ GUI สำหรับตั้งค่า:

IBus LanXang Preferences

สำหรับตอนนี้อาจใช้ IBus เป็นหลัก แต่ในอนาคตก็อาจพิจารณาเพิ่ม engine สำหรับ framework อื่นตามความจำเป็น

ว่าแล้วก็ทดสอบ input method สักหน่อย:

ᨹᩲᩅᩣᨾᩮᩨᩬᨦᩎᩈᩣ᩠ᨶᩌᩣ᩠ᨦ ᩈᩥᨧᩪᩙᨡᩯ᩠ᨶᨾᩢ᩠ᨶᨸᩲᨷᩮᩥ᩠ᨦ
ᨠᩫ᩠ᨠᩋᩭᨿᩢ᩠ᨦᩈ᩠ᩅ᩠ᨿᩃ᩠ᩅ᩠ᨿ ᨠᩫ᩠ᨠᨠᩖ᩠ᩅ᩠ᨿᨿᩢ᩠ᨦᩈᩣ᩠ᨿᩃᩣ᩠ᨿ
ᨾᩢ᩠ᨶᩈᩥᩌᩣ᩠ᨦᨷᩬᩁᨧᩢ᩠ᨦᨯᩲ

(จะอ่านได้ ก็ติดตั้งฟอนต์ ก่อนนะครับ และควรเปิดด้วย Firefox หรือ IE9 จึงจะอ่านเป็นคำ ส่วน Chrome และเบราว์เซอร์ที่ใช้ WebKit ทั้งหมดนั้น ยังแสดงผลผิดลำดับ อ่านไม่เป็นคำครับ)

ป้ายกำกับ: , , ,

02 พฤศจิกายน 2555

IBus LibThai

แผนการหนึ่งที่ผมคิดจะทำมานานแล้ว คือการเชื่อมต่อ LibThai เข้ากับ IBus ซึ่งเป็น input method framework แบบใหม่ที่กำลังจะมาแทนที่ระบบเดิมแทบทั้งหมด ไม่ว่าจะเป็นรุ่นเก๋ากึ๊กอย่าง XIM หรือทางลัดของ toolkit อย่าง GTK+ IM module หรือ Qt4 IM module หรือจะเป็นระบบที่ยังอายุไม่มากอย่าง SCIM หรือ uim ทั้งหมดจะค่อย ๆ ถูก IBus แทนที่ในดิสโทรต่าง ๆ เช่น สำหรับ Fedora ซึ่งเป็นต้นน้ำนั้น ก็ใช้ IBus โดยปริยายแล้ว และ Debian เองก็เตรียมจะใช้ IBus เป็นตัวหลักเช่นกัน

ทั้งนี้ การเชื่อมรวมกับ IBus ก็เป็นเป้าหมายของ GNOME มาระยะหนึ่ง และสำเร็จในรุ่น 3.6 นี้เอง

แนวโน้มแบบนี้ ทำให้ผมปรารภกับเพื่อน ๆ ในแวดวงมาตั้งแต่ปีก่อนแล้วว่าคงต้องพยายามให้มี input method ภาษาไทยใน IBus แล้วแหละ แต่ก็ชะลอมาเรื่อย ด้วยเหตุผลต่าง ๆ คือ หนึ่ง ผมมีเวลาทำงานน้อย เนื่องจากต้องสลับไปทำหลายงาน, สอง หาเอกสารของ IBus ไม่เจอ (เพิ่งเจอ Developer guide เมื่อเร็ว ๆ นี้ หลังจากที่ได้งมแกะซอร์สของ engine อื่นเป็นตัวอย่างไปเยอะแล้ว), สาม มอดูล ibus-m17n ที่ไปใช้ input method จากคลังของ m17n ก็พอใช้การได้ มีภาษาไทยมาเรียบร้อย ซึ่งผมเคยคุยกับคุณทาคาฮาชิที่ ETL ซึ่งเป็นผู้ดูแลทางเมลและร่วมทดสอบจนมันใช้การได้ สามารถแก้ลำดับการป้อนได้ด้วย (ถ้า app รองรับ) ความเร่งด่วนที่จะต้องเขียน engine ตัวใหม่ก็ลดลง

ผมทดลองใช้ IBus มาระยะหนึ่ง โดยเฉพาะตอนที่ไปเรียนภาษาจีนเมื่อต้นปี ต้องการป้อนภาษาจีน จึงเป็นตัวกระตุ้นให้ใช้ IBus เป็นหลัก แต่รู้สึกไม่พอใจกับ input method ภาษาไทยของ ibus-m17n เลย เนื่องจากมันตอบสนองช้ามากในหลาย ๆ กรณี เช่น เมื่อใช้กับเว็บที่มี Javascript หนัก ๆ อย่าง facebook หรือ Google+ อีกทั้งการพยายาม fallback ไปใช้ pre-edit string โดยอุบัติเหตุก็น่ารำคาญ เนื่องจากอักขระตัวสุดท้ายจะสูญหาย ซึ่งบั๊กนี้ดูเหมือนจะแก้ไปแล้ว แต่มันก็ยังกลับมาเป็นพัก ๆ อยู่ดี

หลังจากที่ห่างหายจากการป้อนภาษาจีนมาระยะหนึ่ง ผมจึงแอบกลับมาใช้ gtk-im-libthai ตามเดิม เพื่อความรวดเร็วของงาน จนกระทั่งถูกกระตุ้นอีกครั้งหนึ่งจากโครงการอักษรอีสาน ที่ทีมงานกำลังร่วมกันออกแบบ input method ของอักษรธรรม และเริ่มศึกษา framework ที่จะใช้สร้างต้นแบบ ซึ่งตัวเลือกอันดับต้น ๆ ก็คือ IBus นั่นเอง

นั่นแหละ ผมถึงได้กลับมาปัดฝุ่นโค้ด ibus-libthai ที่ร่างไว้ตั้งแต่ปีกลาย เอามาปรับต่อจนใช้การได้เมื่อเช้านี้เอง

ตัวโค้ด อยู่ที่ SVN ของ LTN ซึ่งสามารถ checkout มาทดสอบได้:

$ svn co http://linux.thai.net/svn/software/ibus-libthai/trunk \
  ibus-libthai

เนื่องจากมันเพิ่งจะใช้การได้เมื่อเช้านี้เอง จึงคาดหวังได้ว่าอาจยังมีปัญหาต่าง ๆ อยู่ ผมเองก็ยังทดลองใช้เองไปเรื่อย ๆ ถ้าใครกล้าใช้ และมีข้อแนะนำก็แจ้งผมได้ครับ

ป้ายกำกับ: ,

hacker emblem