;; KHMR-OTF.flt -- Font Layout Table for Khmer OpenType fonts
;; Copyright (C) 2005, 2007 AIST (H15PRO112)
;; See the end for copying conditions.
(font layouter khmr-otf nil
(font (nil nil unicode-bmp :otf=khmr=pres)))
;;;
KHMR-OTF.flt
;;;
;;; For Khmer OpenType fonts to draw Khmer.
;;; A Font is available from
;;; .
(category
(0x1780 0x17FF ?E) ; E: else
(0x19E0 0x19FF ?E)
(0x1780 0x17B3 ?C) ; C: consonant & independent vowel
(0x179A ?R) ; R: RO
(0x17B6 ?p) ; p: vowel sign (post)
(0x17B7 0x17BA ?a) ; a: vowel sign (above)
(0x17BB 0x17BD ?b) ; b: vowel sign (below)
(0x17BE ?A) ; A: vowel sign (two-part, above)
(0x17BF 0x17C0 ?P) ; P: vowel sign (two-part, post)
(0x17C1 0x17C3 ?m) ; m: vowel sign (pre)
(0x17C4 0x17C5 ?P)
(0x17C6 ?s) ; s: sign (above)
(0x17C7 0x17C8 ?S) ; S: sign (post)
(0x17C9 0x17CA ?c) ; c: consonant shifter
(0x17CB 0x17D1 ?s)
(0x17CC ?r) ; r: ROBAT
(0x17D2 ?H) ; H: COENG
(0x17D3 ?s)
(0x17DD ?s)
(0x200C ?N) ; N: ZERO WIDTH NON-JOINER
(0x200D ?J) ; J: ZERO WIDTH JOINER
)
;; Generic syllable pattern is as follows.
;; [CR](r|N?c)?(HCr?)*(HR)?(HCr?)*[NJ]?(m|b|a|A|p|P)?s*S?(H[CR])?
;; Step 0.
;; Move m to the beginning.
;; Split A and P.
;; Exchange the order of pP and s.
;; Move HR before the base.
(generator
(0
(cond
;; pre vowel sign
;;1 2 3 4 5 67 8 9 10
("([CR](r|N?c)?(HCr?)*)(HR(r)?)?((HCr?)*[NJ]?)(m)(s*S?(H[CR])?)"
< | (8 =) (4 = =) (1 = *) (5 =) (6 = *) (9 = *) | > )
;; two-part above vowel sign
;;1 2 3 4 5 67 8
("([CR](r|N?c)?(HCr?)*)(HR(r)?)?((HCr?)*[NJ]?As*S?(H[CR])?)"
< | 0x17C1 (4 = =) (1 = *) (5 =) (6 = *) | > )
;; post vowel sign
;;1 2 3 4 5 67 8 9 10 11
("([CR](r|N?c)?(HCr?)*)(HR(r)?)?((HCr?)*[NJ]?)(p)(s*)(S?(H[CR])?)"
< | (4 = =) (1 = *) (5 =) (6 = *) (9 = *) (8 =) (10 = *) | > )
;; two-part post vowel sign
;;1 2 3 4 5 67 8 9 10 11
("([CR](r|N?c)?(HCr?)*)(HR(r)?)?((HCr?)*[NJ]?)(P)(s*)(S?(H[CR])?)"
< | 0x17C1 (4 = =) (1 = *) (5 =) (6 = *) (9 = *) (8 =) (10 = *) | > )
;; other vowel signs or no vowel sign
;;1 2 3 4 5 67 8
("([CR](r|N?c)?(HCr?)*)(HR(r)?)?((HCr?)*[NJ]?[b|a]?s*S?(H[CR])?)"
< | (4 = =) (1 = *) (5 =) (6 = *) | > )
("." =))
*))
;; Now a syllable looks like below.
;; m?(HR)?[CR](r|N?c)?(HCr?)*[NJ]?(b|a|A)?s*(p|P)?S?(H[CR])?
;; Step 1.
;; Set the form of consonant shifter.
(generator
(0
(cond
;; shifter + above vowel sign without ZWNJ
;; Shifter take blwf. HR takes pref. HC's take blwf or pstf.
;; 1 2 3 4 5 6 7 8
(" (m)?(HR)?([CR]c(HCr?)*(N|J)?(a|A))(s*S?)(H[CR])? "
|
(1 =)
(2 otf:khmr=pref+)
(3 otf:khmr=blwf,abvf,pstf+)
(7 = *)
(8 otf:khmr=blwf,pstf+)
| )
;; shifter + ZWNJ + above vowel sign, or, shifter without above vowel sign
;; Shifter stays above. HR takes pref. HC's take blwf or pstf.
;; 1 2 3 45 6 7 8 9 10 11
(" (m)?(HR)?([CR]N?c)((HCr?)*)([NJ]?[ba]?)(A)?(s*p?)(P)?(S)?(H[CR])? "
|
(1 =)
(2 otf:khmr=pref+)
(3 = *)
(4 otf:khmr=blwf,pstf+)
(6 = *)
(7 otf:khmr=abvf+)
(8 = *)
(9 otf:khmr=pstf+)
(10 =)
(11 otf:khmr=blwf,pstf+)
| )
;; no shifter
;; 1 2 3 45 6 7 8 9 10 11
(" (m)?(HR)?([CR]r?)((HCr?)*)([NJ]?[ba]?)(A)?(s*p?)(P)?(S)?(H[CR])? "
|
(1 =)
(2 otf:khmr=pref+)
(3 = *)
(4 otf:khmr=blwf,pstf+)
(6 = *)
(7 otf:khmr=abvf+)
(8 = *)
(9 otf:khmr=pstf+)
(10 =)
(11 otf:khmr=blwf,pstf+)
| )
("." =))
*))
;; Now a syllable looks like below. ~ characters are OTF feature applied.
;; m?(HR)?[CR](r|c)?(HCr?)*[NJ]?(b|a|A)?s*(p|P)?S?(H[CR])?
;; ~~ ~~ ~ ~~~~ ~ ~ ~~~~~
;; Step 2.
;; Concatenate adjacent Khmer syllables.
;; Remove J. Retain N to prevent ligature.
(generator
(0
(cond
(" ")
("J")
("." =))
*))
;; Step 3.
;; Apply other OTF features.
(generator
(0
(cond
(" ([^ ]*) "
(1 otf:khmr=pres,blws,abvs,psts,clig))
("."
[ = ]))
*))
;; Step 4.
;; Remove N to clean up.
(generator
(0
(cond
("N")
("." =))
*))
;; Copyright (C) 2005, 2007
;; National Institute of Advanced Industrial Science and Technology (AIST)
;; Registration Number H15PRO112
;; This file is part of the m17n database; a sub-part of the m17n
;; library.
;; The m17n library is free software; you can redistribute it and/or
;; modify it under the terms of the GNU Lesser General Public License
;; as published by the Free Software Foundation; either version 2.1 of
;; the License, or (at your option) any later version.
;; The m17n library is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
;; Lesser General Public License for more details.
;; You should have received a copy of the GNU Lesser General Public
;; License along with the m17n library; if not, write to the Free
;; Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
;; Boston, MA 02110-1301, USA.
;; Local Variables:
;; mode: emacs-lisp
;; End: