Theppitak's blog

My personal blog.

14 กรกฎาคม 2554

Esaan Tham Font with GSUB

ทิ้งค้างไว้จาก blog ที่แล้ว เสียนาน ก็เพิ่งได้โอกาสกลับมาทำ โครงการอักษรอีสาน ต่อ โดยหลังจากที่ได้ glyph ต่าง ๆ เรียบร้อยแล้ว ก็ถึงคราวทำเรื่องกฎการแสดงข้อความ

ดังที่ได้อธิบายไว้ ว่าอักษรธรรมในยูนิโค้ดจะลงรหัสในข้อความในลำดับที่เรียกว่า logical order ตามแบบอักษรอินเดีย (ซึ่งจากการที่โดนกระแนะกระแหนบ่อย ๆ ว่าอักษรไทยกับลาวเป็น ข้อยกเว้น ของ logical order สำหรับอักษรในตระกูลเดียวกัน ราวกับว่าสองอักษรนี้ไม่ logical กระนั้น ก็ทำให้ผมอยากจะเรียก logical order เสียใหม่ว่า phonetic order) ซึ่งลำดับการเก็บแบบ logical order หรือ phonetic order นี้ แตกต่างจากลำดับที่แสดงผลจริงซึ่งเรียกว่า visual order ทำให้ต้องมีการเรียงลำดับ glyph เสียใหม่ขณะแสดงผล

เนื่องจากทางเลือกอื่น คือการรอให้ rendering engine รองรับอักษรธรรม หรือการรอให้ไมโครซอฟท์จัดทำข้อกำหนดของการแสดงอักษรธรรมด้วย OpenType เป็นเรื่องที่ไม่สามารถสำเร็จได้ในเวลาอันสั้น ผมจึงจำเป็นต้องใช้วิธีสร้างกฎ GSUB ให้สามารถวาดแสดงได้ในตัวเองโดยไม่พึ่ง preprocessing ใน rendering engine เลย

โจทย์หนักที่สุดคือการสลับลำดับสระหน้า เพราะ GSUB ไม่มีรูปแบบกฎที่ซับซ้อนพอที่จะเขียนการสลับ AB เป็น BA ได้ เครื่องมือที่มีให้คือ:

  • Multiple substitution คือการแทน glyph 1 glyph ด้วย glyph string เช่น A → XYZ
  • Ligature substitution คือการแทน glyph string ด้วย glyph 1 glyph เช่น XYZ → A
  • Contextual substitution คือการกำหนด substitution (multiple หรือ ligature ข้างต้น) ที่จะกระทำเมื่อพบแพตเทิร์นที่กำหนด เช่น ถ้าพบ abc ให้ใช้กฎ P ที่ตำแหน่ง glyph ที่ 2 เป็นต้น

ยังมี substitution แบบอื่นอีกพอประมาณ แต่ก็ไม่ได้มีความสามารถมากไปกว่านี้ ซึ่งจะพบว่าการเขียนกฎง่าย ๆ แค่ AB → BA นั้น ไม่ใช่เรื่องง่ายเอาเสียเลย แต่โชคดีที่เผอิญไปได้เคล็ดวิชาจากเพื่อนชาวพม่ามาว่าเขามีลูกสูตรกันแบบนี้:

AB → BAB [Mul. A → BA]
BAB → BA [Lig. AB → A]

คือใช้ contextual 2 กฎ, multiple 1 กฎ และ ligature อีก 1 กฎ โดย contextual นั้นสามารถกำหนดแพตเทิร์นเป็นคลาสได้ แต่ multiple และ ligature นั้น ต้องลิสต์ทุก combination แบบเรียงตัวเท่านั้น

เนื่องจากรูปแบบระหว่างทาง (คือ BAB ในตัวอย่างข้างต้น) นั้นสุ่มเสี่ยงที่จะไปชนกับข้อความจริง ผมจึงดัดแปลงกฎเสียใหม่เป็นแบบนี้:

AB → BAxB [Mul. A → BAx]
BAxB → BA [Lig. AxB → A]

โดย x เป็น dummy ตัวหนึ่งที่ใส่เข้ามาเพื่อป้องกันการ match กับข้อความจริง จะเลือก glyph อะไรก็ได้ที่ไม่มีที่ใช้ในข้อความจริง

และในบางกฎ ก็เหมาะที่จะทำข้างหลังก่อน ซึ่งจะทำให้ลดจำนวนกฎ contextual ลงได้:

AB → AxBA [Mul. B → xBA]
AxBA → BA [Lig. AxB → B]

ได้สูตรแบบนี้แล้ว ผมก็มานั่งออกแบบกฎ GSUB สำหรับอักษรธรรมอีสานได้แล้ว โดยหลังจากประมวลอักขรวิธีต่าง ๆ แล้ว ก็สรุปเป็นขั้นตอนการทำงานดังนี้:

  1. สลับลำดับ ไม้อังแล่น (ง สะกดเหนือพยัญชนะ) ในภาษาบาลี
      NGA-above + SAKOT + Cons --> Cons + NGA-above
    
  2. เปลี่ยนพยัญชนะเป็นรูปตัวห้อย/ตัวเฟื้องเมื่อตามหลัง SAKOT
      SAKOT + Cons --> Cons.sub
    
  3. สลับลำดับสระหน้า
      Cons + [sub|medial-RA] + LV --> LV + Cons + [sub|medial-RA]
    
  4. สลับลำดับ ระวง
      Cons + medial-RA --> medial-RA + Cons
    
  5. จัดการรูปย่อ น + า แบบซับซ้อน
      NA + {sub|tone|UV|BV} + AA --> NAA + {sub|tone|UV|BV}
    
  6. จัดการรูปย่อทั่วไป
      NA + AA --> NAA
      WA + tall-AA --> WAA
    

หลังจากได้ลำดับกฎแล้ว ก็มา implement กฎแต่ละกฎด้วยสูตรข้างต้น โดยมีเคล็ดในการลดจำนวนกฎอยู่ว่า ให้พยายามเลือกเซ็ตที่ใหญ่ที่สุด (เช่น พยัญชนะ) เป็นตัวแปลง แล้วไปลิสต์รายการในตาราง multiple/ligature substitution เป็นหมวด ๆ เอา จะทำให้ได้จำนวนหมวดน้อย จัดการในระดับบนได้ง่าย ถ้าเราไปเลือกแปลงเซ็ตเล็ก (เช่น สระหน้า) แทน จะทำให้ได้หมวดเล็ก ๆ จำนวนมาก จำนวน contextual substitution มาก จัดการในระดับบนได้ลำบาก

หมายเหตุ: แม้จะลดปริมาณกฎลงแล้ว แต่ก็ยังมากอยู่ดี ทำใน fontforge อย่างเดียวไม่ไหว งานนี้สำเร็จได้ด้วย vim ครับ ;-)

ทำฟอนต์เสร็จแล้ว ก็ทำ หน้าทดสอบฟอนต์ เอาไว้ด้วย โดยฝังฟอนต์ลงในเว็บเลย เปิดด้วย Firefox/Iceweasel ตั้งแต่รุ่น 4 ขึ้นไปได้ผลดี ส่วน Chrome/Chromium หรือเบราว์เซอร์อื่นที่ใช้ WebKit (เช่น Epiphany, Midori) นั้น แสดงอักษรได้อยู่ แต่กฎ GSUB จะไม่ทำงาน ทำให้ลำดับการแสดงไม่ใช่ลำดับสำหรับมนุษย์อ่าน ส่วน IE ไม่มีให้ทดสอบครับ

ป้ายกำกับ:

4 ความเห็น:

  • 11 กันยายน 2555 เวลา 21:16 , Blogger konnarak แถลง…

    เจริญพร...อาตมาไม่รู้จะเริ่มต้นอย่างไร..เอาเป็นว่าอาตมาเป็นคนสร้างฟอนต์ไทยธรรมคนหนึ่ง มีความรุ้ไม่มาก แต่อยากพัฒนาให้เป็นมาตราฐานมากขึ้น เช่น การตัดคำ การแสดงผลบนเว็บเป็นต้น แต่ก็ติดที่ความรุ้ไม่ถึง อาตมาได้รับการแนะนำจากเพื่อนในเว็บ f0nt.com ถึงเรื่องโยม..และได้เข้าไปอ่านในบทความในบล๊อกโยมว่าด้วยเรื่องการแสดงผลของฟอนต์ธรรมะ และคิดในใจว่า นี่คือ สวดยอดแท้จริง..ซึ่งอยากจะขอรับคำแนะนำจากโยมเรื่องการพัฒนาฟอนต์ไทยธรรม ..ขอเริ่มต้นแค่นี้ก่อน หากได้รับเมตตาจิตจากโยม ก็อยากจะขอคำแนะนำเชิงลึกมากขึ้น เก็บกับฟอนต์ไทยธรรมนี้..ขอเจริญพร

     
  • 11 กันยายน 2555 เวลา 22:02 , Blogger Thep แถลง…

    นมัสการพระคุณเจ้า

    อักษรธรรมลาว-อีสาน ธรรมล้านนา ธรรมขึน ต่างก็ใช้อักขระยูนิโค้ดในช่วงเดียวกัน คือ U+1A20..U+1AAF ครับ ฉะนั้นก็เข้าใจว่าน่าจะสามารถใช้กฎร่วมกันได้เลยครับ เพียงแต่เปลี่ยนรูปร่างอักขระเท่านั้น

    ฟอนต์ที่ผมทำขึ้นนั้น ยังอยู่ในขั้นทดลองใช้ กฎอาจมีการปรับเปลี่ยนตามปัญหาที่พบ พระคุณเจ้าสามารถดาวน์โหลดได้จากเว็บโครงการนะครับ

    http://linux.thai.net/~thep/esaan-scripts/

    หากมีข้อสงสัยหรือมีข้อชี้แนะปรับปรุงแก้ไข ก็เมลถึงผมที่ theppitak at gmail dot com ได้ครับ

    นมัสการครับ

     
  • 6 ธันวาคม 2556 เวลา 21:09 , Blogger Unknown แถลง…

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

     
  • 6 ธันวาคม 2556 เวลา 22:32 , Blogger Thep แถลง…

    นมัสการครับ

    ฟอนต์ตัวธรรมสามารถดาวน์โหลดได้ที่เว็บโครงการครับ:

    http://linux.thai.net/~thep/esaan-scripts/

    ลิงก์โดยตรงครับ:

    http://linux.thai.net/~thep/esaan-scripts/fonts/Khottabun.ttf

    ฟอนต์สามารถดาวน์โหลดได้ฟรี ไม่มีค่าใช้จ่ายครับ และได้ใช้ license แบบโอเพนซอร์สซึ่งอนุญาตให้พัฒนาต่อยอดได้ด้วยครับ

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

    - ไม้อังแล่นที่พฤติกรรมต่างจากไม้กังไหลที่ใช้ในล้านนาและขึน:

    http://linux.thai.net/~thep/esaan-scripts/tham-issues/mai-kang-lai.html

    - อักขระที่ยังขาดรหัสในยูนิโค้ด คือ ก สะกดจุดคู่ และสระแอลดรูป:

    http://linux.thai.net/~thep/esaan-scripts/tham-issues/new-chars.html

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

     

แสดงความเห็น (มีการกลั่นกรองสำหรับ blog ที่เก่ากว่า 14 วัน)

<< กลับหน้าแรก

hacker emblem