Fix the handling of LAM-ALEF.
[m17n/m17n-db.git] / FLT / ARAB-OTF-NO-GPOS.flt
index beab4a0..4e8d86f 100644 (file)
@@ -1,9 +1,9 @@
 ;; ARAB-OTF-NO-GPOS.flt -- Font Layout Table for Arabic OpenType font sans GPOS
-;; Copyright (C) 2005, 2006, 2007  AIST (H15PRO112)
+;; Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010  AIST (H15PRO112)
 ;; See the end for copying conditions.
 
 (font layouter arab-otf-no-gpos nil
-      (font (nil nil unicode-bmp :otf=arab=init,medi,fina,liga+~mark)))
+      (font (nil nil unicode-bmp :otf=arab=init,medi,fina+~mark)))
 
 ;;; <li> ARAB-OTF-NO-GPOS.flt
 ;;;
  ;; p: high hamza carrier (p for positive)
  ;; n: high hamza suppressor (n for negative)
  ;; x: don't care
+ ;; X: presentation form
  (0x0600 0x06FF                ?x)
- (0x0750 0x077F                ?x)             ; Arabic Supplement
  (0x0674 0x0678                ?p)
  (0x0643               ?n)
  (0x06AF               ?n)
  (0x06D5               ?n)
+ (0x0750 0x077F                ?x)             ; Arabic Supplement
  (0x200C               ?x)
  (0x200D               ?x)
  (0x25CC               ?x)
    ((0x0678)           0x0649)
    ("."                        =))))
 
-;; Step 1: ccmp
+;; Step 1: Initial, medial, or final.  Surround diacritics by
+;; separators (|).
 
 (category
- ;; D: Dual-joining (beh, teh, etc. & zwj)
- ;; R: Right-joining (alef, dal, thal, reh, zain)
+ ;; D: Dual-joining (beh, teh, etc. & zwj) except for LAMs
+ ;; L: LAMs
+ ;; R: Right-joining (alef, dal, thal, reh, zain) except for ALEFs
+ ;; A: ALEFs
  ;; U: Non-joining (Hamza, etc. & zwnj)
  ;; T: Transparent (combining marks)
  (0x060B 0x060F                ?U)
  (0x061B               ?U)
  (0x061E 0x061F                ?U)
  (0x0621               ?U)
- (0x0622 0x0623                ?R)
+ (0x0622 0x0627                ?A)
  (0x0624               ?R)
- (0x0625               ?R)
  (0x0626               ?D)
- (0x0627               ?R)
  (0x0628               ?D)
  (0x0629               ?R)
  (0x062A 0x062E                ?D)
  (0x062F 0x0632                ?R)
  (0x0633 0x0647                ?D)
+ (0x0644               ?L)
  (0x0648               ?R)
  (0x0649 0x064A                ?D)
  (0x064B 0x065E                ?T)
  (0x0660 0x066D                ?U)
  (0x066E 0x066F                ?D)
  (0x0670               ?T)
- (0x0671 0x0673                ?R)
+ (0x0671 0x0673                ?A)
  (0x0674 0x0678                ?U)
  (0x0679 0x0687                ?D)
  (0x0688 0x0699                ?R)
  (0x069A 0x06C3                ?D)
+ (0x06B5 0x06B8                ?L)
  (0x06C4 0x06CB                ?R)
  (0x06CC 0x06CE                ?D)
  (0x06CF               ?R)
  (0x0759 0x075B                ?R)
  (0x075C 0x076A                ?D)
  (0x076B 0x076C                ?R)
- (0x076D               ?D)
+ (0x076D 0x0770                ?D)
+ (0x0771               ?R)
+ (0x0772               ?D)
+ (0x0773 0x0774                ?R)
+ (0x0775 0x0777                ?D)
+ (0x0778 0x0779                ?R)
+ (0x077A 0x077F                ?D)
  (0x200C               ?U)
  (0x200D               ?D)
  (0x25CC               ?U)
+ (0xE800               ?C)             ; dummy dotted-circle
  (0xFB50 0xFDFF                ?X)             ; Arabic Presentation Forms-A
  (0xFE70 0xFEFC                ?X)             ; Arabic Presentation Forms-B
  )
 
-;; (generator
-;;  (0
-;;   otf:arab=ccmp))
-
-;; Step 2: Initial, medial, or final.
-
 (generator
  (0
   (cond
-   (".*X.*" (cond ("[DRUX]T*" < = * >) ("." =)) *)
+   (".*X.*" (cond ("[DLRAUX]T*" < = * >) ("." =)) *)
+
+   ;; LAM-ALEF pattern.  Move diacritcs on LAM after ALEF.  This is to
+   ;; avoid loosing surrounding separators by OTF's liga or rlig
+   ;; features in the next step.
+   ("(L)(T*)(A)(T*)(.*)"
+    (1 otf:arab=init)
+    (3 otf:arab=fina)
+    (2 | = * |)
+    (4 | = * |)
+    (5 disjoin))
 
-   ("D.*"
+   ("[DL].*"
     (cond
-     ("(.)(T*)([DR].*)"
-      <
+     ("(.)(T*)([DLRA].*)"
       (1 otf:arab=init)
-      (2 = *)
-      >
+      (2 | = * |)
       (3 join))
      ("(.)(T*)(.*)"                    ; == (D)(T*)(U.*)
-      <
       (1 otf:arab=isol)
-      (2 = *)
-      >
+      (2 | = * |)
       (3 disjoin))))
 
-   ("([RU])(T*)(.*)"
-    <
+   ("([RAU])(T*)(.*)"
     (1 otf:arab=isol)
-    (2 = *)
-    >
+    (2 | = * | )
     (3 disjoin))
 
+   ;; Incorrect leading diacritcs.
    ("(T+)(.*)"
-    (1 = *)
+    (1 (cond ((font-facility 0x25CC)
+             (cond ("." 0x25CC | = |)) *)
+            ("." 0xE800 | = |)) *)
     (2 disjoin))))
 
  (join
   (cond
-   ("D.*"
+   ;; LAM-ALEF pattern.  See the above comment.
+   ("(L)(T*)(A)(T*)(.*)"
+    (1 otf:arab=medi)
+    (3 otf:arab=fina)
+    (2 | = * |)
+    (4 | = * |)
+    (5 disjoin))
+
+   ("[DL].*"
     (cond
-     ("(.)(T*)([DR].*)"
-      <
+     ("(.)(T*)([DLRA].*)"
       (1 otf:arab=medi)
-      (2 = *)
-      >
+      (2 | = * |)
       (3 join))
      ("(.)(T*)(.*)"                    ; == (D)(T*)(U.*)
-      <
       (1 otf:arab=fina)
-      (2 = *)
-      >
+      (2 | = * |)
       (3 disjoin))))
 
    ("(.)(T*)(.*)"
-    <
     (1 otf:arab=fina)
-    (2 = *)
-    >
+    (2 | = * |)
     (3 disjoin))))
 
  (disjoin
   (cond
-   ("D.*"
+   ;; LAM-ALEF pattern.  See the above comment.
+   ("(L)(T*)(A)(T*)(.*)"
+    (1 otf:arab=init)
+    (3 otf:arab=fina)
+    (2 | = * |)
+    (4 | = * |)
+    (5 disjoin))
+
+   ("[DL].*"
     (cond
-     ("(.)(T*)([DR].*)"
-      <
+     ("(.)(T*)([DLRA].*)"
       (1 otf:arab=init)
-      (2 = *)
-      >
+      (2 | = * |)
       (3 join))
      ("(.)(T*)(.*)"                    ; == (D)(T*)(U.*)
-      <
       (1 otf:arab=isol)
-      (2 = *)
-      >
+      (2 | = * |)
       (3 disjoin))))
 
    ("(.)(T*)(.*)"                      ; == ([RU])(T*)(.*)
-    <
     (1 otf:arab=isol)
-    (2 = *)
-    >
+    (2 | = * |)
     (3 disjoin)))))
 
-;; Step 3: GPOS features.
+;; Step 2: Remaining GSUB features (ligature, etc.).
+
+(generator
+ (0
+  otf:arab=rlig,calt,liga,dlig,cswh,mset+))
+
+;; Step 3: Simulate missing GPOS features.
 
 (generator
  (0
   (cond
-   ((0x0651 0x0650) tc+bc 0x064E tc+bc 0x0651) ; shadda + kasra
-   ((0x0651 0x064D) tc+bc 0x064B tc+bc 0x0651) ; shadda + kasratan
-   ((range 0x0610 0x0615) tc+bc =)
-   ((0x064B) tc+bc =)
-   ((0x064C) tc+bc =)
-   ((0x064D) bc-tc =)
-   ((0x064E) tc+bc =)
-   ((0x064F) tc+bc =)
-   ((0x0650) bc-tc =)
-   ((range 0x0651 0x0654) tc+bc =)
-   ((0x0655) bc-tc =)
-   ((0x0656) bc-tc =)
-   ((range 0x0657 0x065B) tc+bc =)
-   ((0x065C) bc-tc =)
-   ((0x065D) tc+bc =)
-   ((0x065E) tc+bc =)
-   ((0x0670) tc+bc =)
-   ((range 0x06D6 0x06DC) tc+bc =)
-   ((range 0x06DF 0x06E2) tc+bc =)
-   ((0x06E3) bc-tc =)
-   ((0x06E4) tc+bc =)
-   ((0x06E7) tc+bc =)
-   ((0x06E8) tc+bc =)
-   ((0x06EA) bc-tc =)
-   ((0x06EB) tc+bc =)
-   ((0x06EC) tc+bc =)
-   ((0x06ED) bc-tc =)
-   ((0x200C)   =)
-   ((0x200D)   =)
-   ("." =))
+   ("C ([^ ]) "                                ; dummy dotted-circle
+    [ (1 =) ])
+   ("([^ ]) ([^ ]+)?  ([^ ]+)? "       ; LAM-ALEF ligature
+    < (1 =) (2 ("." Br.Br =) *) (3 ("." Bl.Bl =) *) >)
+   ("([^ ]) ([^ ]+)? "
+    < (1 =) (2 ("." Bc.Bc =) *) >)
+   ("([^ ])([^ ]) ([^ ]+)?  ([^ ]+)? " ; failed LAM-ALEF ligature
+    (1 < =) (3 ("." Br.Br =) *) > (2 < = ) (4 ("." Bl.Bl =) *) >)
+   ("[^ ]" =)
+   (" "))
   *))
 
-;; Copyright (C) 2005, 2006, 2007
+;; Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010
 ;;   National Institute of Advanced Industrial Science and Technology (AIST)
 ;;   Registration Number H15PRO112
 
 ;; Boston, MA 02110-1301, USA.
 
 ;; Local Variables:
-;; mode: lisp
+;; mode: emacs-lisp
 ;; End: