;; GUJR-OTF.flt -- Font Layout Table for Gujarati OpenType fonts
;; Copyright (C) 2004, 2007, 2010 AIST (H15PRO112)
;; See the end for copying conditions.

(font layouter gujr-otf nil
      (version "1.6.0")
      (font (nil nil unicode-bmp :otf=gujr)))

;;; <li> GUJR-OTF.flt
;;;
;;; For Gujarati OpenType fonts to draw the Gujarati script.

(category
 ;; X: generic
 ;; V: independent vowel
 ;; C: consonant
 ;; R: RA
 ;; n: NUKTA
 ;; H: HALANT
 ;; m: vowel sign (pre)
 ;; u: vowel sign (above)
 ;; b: vowel sign (below)
 ;; p: vowel sign (post)
 ;; a: vowel modifier (above)
 ;; A: vowel modifier (post)
 ;; N: ZWNJ
 ;; J: ZWJ
 (0x0A80 0x0AFF	?X)			; generic
 (0x0A81 0x0A82	?a)			; SIGN CANDRABINDU .. ANUSVARA
 (0x0A83	?A)			; SIGN VISARGA
 (0x0A85 0x0A94	?V)			; LETTER A .. AU
 (0x0A95 0x0AB9	?C)			; LETTER KA .. HA
 (0x0AB0	?R)			; LETTER RA
 (0x0ABC	?n)			; SIGN NUKTA
 (0x0ABE	?p)			; VOWEL SIGN AA
 (0x0ABF	?m)			; VOWEL SIGN I
 (0x0AC0	?p)			; VOWEL SIGN II
 (0x0AC1 0x0AC4	?b)			; VOWEL SIGN UU .. VOCALIC RR
 (0x0AC5 0x0AC8	?u)			; VOWEL SIGN CANDRA E .. AI
 (0x0AC9 0x0ACC	?p)			; VOWEL SIGN CANDRA O .. AU
 (0x0ACD	?H)			; SIGN VIRAMA
 (0x0AE0 0x0AE1	?V)			; LETTER VOCALIC RR  .. VOCALIC LL
 (0x0AE2 0x0AE3	?b)			; VOWEL SIGN VOCALIC L .. VOCALIC LL

 (0x200C	?N)			; ZWNJ
 (0x200D	?J)			; ZWJ
 (0x25CC	?X)			; DOTTED CIRCLE

 (rphf		?r)
 )

;; Stage 0
;; Syllable identification
(generator
 (0
  (cond
   ;; Syllables with an independent vowel
   ("(RH)?(Vn?)((J?HR)?m?u?b?p?n?a?A?)"
    < | (1 = =) (2 :otf=gujr=nukt+) (3 = *) | >)

   ;; Consonant-based syllables
   ;;1      23                 4
   ("([CR]n?((J?H|HJ?)[CR]n?)*)(H[NJ]?|m?u?b?p?n?a?A?)"
    < |
    (cond
     (".+HJ$" :otf=gujr=nukt,akhn+)
     ("(.+)(H)N?$" (1 :otf=gujr=nukt,akhn+) (2 =) 0x200C)
     (".+" :otf=gujr=nukt,akhn+))
    | >)

   ;; Combining marks are displayed with a DOTTED CIRCLE.
   ("m"
    (cond
     ((font-facility 0x25CC) < = 0x25CC >)
     ("." [ = ])))
   ("[nHubpaA]"
    (cond
     ((font-facility 0x25CC) < 0x25CC = >)
     ("." [ = ])))

   ;; Isolated blwf is displayed with a DOTTED CIRCLE in the next stage.
   ("(J)(H)(R)"
    < | (1 =) (3 =) (2 =) | >)

   ("." =))
  *))

;; Stage 1
;; Reorder halant for blwf
(generator
 (0
  (cond
   ;; Isolated blwf
   (" J(RH) "
    (cond
     ((font-facility 0x25CC) < 0x25CC :otf=gujr=blwf+ >)
     (" J(RH) " [ (1 :otf=gujr=blwf+) ])))

   ;; Syllables with an overt halant
   (" (RHJ?)?([^ ]+)(HN) "
    | (1 = *) (2 reorder) (3 = =) |)

   ;; Ordinary syllables
   (" (RHJ?)?([^mubpaA ]+)(m?u?b?p?n?a?A?) "
    | (1 = *) (2 reorder) (3 = *) |)

   ("." =))
  *)

 ;; In Devanagari and Gujarati, vattu has a half form.  Thus we handle
 ;; the sequence CHRHC as (CH)half + (RH)blwf + C instead of
 ;; reordering and interpreting it as C + (RH)blwf + H + C.
 (reorder
  (cond
   ("(.+)(H)(R)$" (1 = *) (3 =) (2 =))
   (".+" = *)))
 )

;; Stage 2
;; Language forms and matra reordering
(generator
 (0
  (cond
   ;; Overt halant forms
   (" (RHJ?)?([^ ]+)(HN) "
    |
    (1 (cond ("RHJ" :otf=gujr=half+)
	     ("RH" :otf=gujr=rphf+)))
    (2 (cond ("(.H)J?(.*)" (1 :otf=gujr=half+) (2 lang-forms *))
	     (".+" lang-forms *)))
    (3 = =) |)

   ;; Other syllables
   ;; 1      2            3     4     5     6
   (" (RHJ?)?([^mubpaA ]*)(mn?)?(un?)?(bn?)?(p?n?a?A?) "
    | (3 = *)
    (1 (cond ("RHJ" :otf=gujr=half+)
	     ("RH" :otf=gujr=rphf+)))
    (2 (cond ("(.H)J?(.*)" (1 :otf=gujr=half+) (2 lang-forms *))
	     (".+" lang-forms *)))
    (5 = *) (4 = *) (6 = *) |)

   ("." =))
  *)

 (lang-forms
  (cond
   ("(.H)J" (1 :otf=gujr=half+))
   (".H" :otf=gujr=blwf,half+)
   ("." =)))
 )

;; Stage 3
;; Final reordering #1 (Move pre-base matra after the last halant)
(generator
 (0
  (cond
   ;; 1    2         3
   (" (mn?)([^ ]+HJ?)([^H ]+) "
    | (2 = *) (1 = *) (3 = *) |)

   ("." =))
  *))

;; Stage 4
;; Final reordering #2 (Move reph after the first halant)
(generator
 (0
  (cond
   ;; Syllables with a reph and an explicit halant
   ;; 1     2  3          4
   (" (mn?)?(r)([^H ]+HJ?)([^ ]*) "
    | (1 = *) (3 = *) (2 =) (4 = *) |)

   ;; A reph without explicit halant
   ;; 1     2  3        4
   (" (mn?)?(r)([^aA ]+)(a?A?) "
    | (1 = *) (3 = *) (2 =) (4 = *) |)

   ("." =))
  *))

;; Stage 5
;; Nukta for matra, vattu and presentation forms
(generator
 (0
  (cond
   (" ([^ ]+) "
    | (1 :otf=gujr=nukt,vatu,pres,abvs,blws,psts,haln+) |)

   ("." =))
  *))

;; Stage 6
;; Remove ZWNJ/ZWJ
(generator
 (0
  (cond
   ("[NJ]")

   ("." =))
  *))

;; Stage 7
;; GPOS processing
(generator
 (0
  (cond
   (" ([^ ]+) "
    (1 :otf=gujr=+abvm,blwm,dist))

   ("." =))
  *))

;; Copyright (C) 2004, 2007, 2010
;;   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:
