;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
+;; along with GNU Emacs; see the file COPYING. If not, write to
+;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
;;; Commentary:
;; History:
;; 1996.10.18 written by KAWABATA, Taichi <kawabata@is.s.u-tokyo.ac.jp>
;; 1997.1.20 fixed some bugs.
+;; 1997.3.24 fixed some bugs.
+
+;; Future work ::
+;; Decompose the input characters and process them on the character basis.
;; Devanagari script composition rules and related programs.
;;; Steps toward composition of Devanagari Characters.
;;;
+;;; Intersection Function will be used.
+(require 'cl)
+
;;; Basic functions.
;;;###autoload
(save-restriction
(narrow-to-region from to)
(goto-char (point-min))
- (while (re-search-forward "\\cd" nil t)
+; (while (re-search-forward "\\cd" nil t)
+ (while (re-search-forward "." nil t)
(let* ((devanagari-char (indian-to-devanagari (preceding-char))))
(delete-char -1)
(insert devanagari-char)))))
(save-restriction
(narrow-to-region from to)
(goto-char (point-min))
- (while (re-search-forward "\\cD" nil t) ; Devanagari Character Code.
+; (while (re-search-forward "\\cD" nil t) ; Devanagari Character Code.
+ (while (re-search-forward "." nil t)
(let* ((indian-char (devanagari-to-indian (preceding-char))))
(delete-char -1)
(insert indian-char)))))
;; H - Halant(\e$(5!h\e(B) or Virama
;; V - Vowel (\e$(5!$!%!&!'!(!)!*!+!,!-!.!/!0!1!2#&#'#*\e(B)
;; ("\e$(5#&#'#*\e(B" can be obtained by IS13194 vowels with nukta.)
-;; D - Vowel Modifiers, i.e. Anuswar, Chandrabindu, Visarga (\e$(5!!!"!#\e(B)
+;; D - Vowel Modifiers, i.e. Anuswar, Chandrabindu (\e$(5!!!"\e(B)
+;; (Visaraga (\e$(5!#\e(B) is excluded.)
;; M - Matra (\e$(5!Z![!\!]!^!_!`!a!b!c!d!e!f!g#K#L#M\e(B)
;; ("\e$(5#K#L#M\e(B" can be obtained by IS13194 matras with nukta.)
;;
-;; In Emacs, one syllable of Indian language is considered to be one
-;; composite glyph. If we expand the above expression, it would be:
+;; In Emacs, one syllable of Indian language is considered to be one
+;; composite glyph. If we expand the above expression for
+;; cons-vowel-syllable, it would be:
;;
-;; [[C [N] H] [C [N] H] [C [N] H] C [N] H] C [N] [M] [D] | V [D]
+;; [[C [N] H] [C [N] H] [C [N] H] C [N] H] C [N] [M] [D]
;;
-;; Therefore, in worst case, the consonant syllabe will consist of
+;; Therefore, in worst case, the one syllable may contain
;; following characters.
;;
;; C N H C N H C N H C N H C N M D
;;
-;; The example is a sanskrit word "kaurtsnya", where five consecutive
-;; consonant appears.
+;; The example is a sanskrit word "kArtsnya", where five consecutive
+;; consonants appear.
;;
-;; On the other hand, incomplete consonant syllable before inputting
-;; base consonant must satisfy the following condition:
+;; On the other hand, consonant-syllable, which appears at the end of
+;; the word, would have the following expression:
;;
;; [C [N] H] [C [N] H] [C [N] H] C [N] H
;;
;;
;; However, to make editing possible even in this condition, we will
;; not consider about this case.
-
-(defconst devanagari-cons-syllable-examine
- "\\(\\([\e$(5!3\e(B-\e$(5!X\e(B]\e$(5!i\e(B?\e$(5!h\e(B\\)?\\([\e$(5!3\e(B-\e$(5!X\e(B]\e$(5!i\e(B?\e$(5!h\e(B\\)?[\e$(5!3\e(B-\e$(5!X\e(B]\e$(5!i\e(B?\e$(5!h\e(B\\)?[\e$(5!3\e(B-\e$(5!X\e(B]\e$(5!i\e(B?\\([\e$(5!Z\e(B-\e$(5!g#K#L#M\e(B]\\|\\(\e$(5!_!i\e(B\\)\\|\\(\e$(5![!i\e(B\\)\\|\\(\e$(5!\!i\e(B\\)\\)?[\e$(5!!!"!#\e(B]?"
- "Regexp matching to one Devanagari consonant syllable.")
-
-(defconst devanagari-cons-syllable-incomplete-examine
- "\\([\e$(5!3\e(B-\e$(5!X\e(B]\e$(5!i\e(B?\e$(5!h\e(B\\)?\\([\e$(5!3\e(B-\e$(5!X\e(B]\e$(5!i\e(B?\e$(5!h\e(B\\)?\\([\e$(5!3\e(B-\e$(5!X\e(B]\e$(5!i\e(B?\e$(5!h\e(B\\)?[\e$(5!3\e(B-\e$(5!X\e(B]\e$(5!i\e(B?\e$(5!h\e(B$"
- "Regexp matching to one Devanagari incomplete consonant syllable.")
-
-(defconst devanagari-vowel-syllable-examine
- "\\([\e$(5!$\e(B-\e$(5!2#&#'#*\e(B]\\|\\(\e$(5!*!i\e(B\\)\\|\\(\e$(5!&!i\e(B\\)\\|\\(\e$(5!'!i\e(B\\)\\)[\e$(5!!!"!#\e(B]?"
- "Regexp matching to one Devanagari vowel syllable.")
+;;
+;; Note:
+;; Currently, it seems that the only following consonants would have
+;; Nukta sign attatched.
+;; (\e$(5!3!4!5!:!?!@!I\e(B)
+;; Therefore, [\e$(5!3\e(B-\e$(5!X\e(B]\e$(5!i\e(B? can be re-written as
+;; \\([\e$(5!3!4!5!:!?!@!I\e(B]\e$(5!i\e(B\\)\\|[\e$(5!3\e(B-\e$(5!X\e(B]
+
+(defconst devanagari-full-cons
+ "\\(\\([\e$(5!3!4!5!:!?!@!I\e(B]\e$(5!i\e(B\\)\\|[\e$(5!3\e(B-\e$(5!X$.$E"%\e(B]\\)"
+ "Devanagari full consonant")
+
+(defconst devanagari-pure-cons
+ (concat "\\(" devanagari-full-cons "\e$(5!h\e(B\\)")
+ "Devanagari pure consonant")
+
+(defconst devanagari-matra
+ "\\(\\([\e$(5!_![!\\e(B]\e$(5!i\e(B\\)\\|[\e$(5!Z\e(B-\e$(5!g#K#L#M\e(B]\\)"
+ "Devanagari Matra Signs. '\e$(5#K#L#M\e(B' can also be created from the combination
+of '\e$(5!_![!\\e(B' and nukta sign.")
+
+(defconst devanagari-vowel
+ "\\(\\([\e$(5!*!&!'\e(B]\e$(5!i\e(B\\)\\|[\e$(5!$\e(B-\e$(5!2#&#'#*\e(B]\\)"
+ "Devanagari Vowels. '\e$(5#&#'#*\e(B' can also be created from the combination
+of '\e$(5!*!&!'\e(B' and nukta sign.")
+
+(defconst devanagari-vowel-syllable
+ (concat devanagari-vowel "[\e$(5!!!"\e(B]?")
+ "Devanagari vowel syllable.")
+
+(defconst devanagari-cons-syllable
+ (concat devanagari-pure-cons "?" devanagari-pure-cons "?"
+ devanagari-pure-cons "?" devanagari-pure-cons "$")
+ "Devanagari consonant syllable")
+
+(defconst devanagari-cons-vowel-syllable
+ (concat "\\("
+ devanagari-pure-cons "?" devanagari-pure-cons "?"
+ devanagari-pure-cons "?" devanagari-pure-cons "\\)?"
+ devanagari-full-cons devanagari-matra "?[\e$(5!!!"\e(B]?")
+ "Devanagari consonant vowel syllable.")
;;
;; Also, digits and virams should be processed other than syllables.
;; In IS 13194, Avagrah is obtained by Nukta after Viram, and
;; OM is obtained by Nukta after Chandrabindu
;;
-(defconst devanagari-digit-viram-examine
- "[\e$(5!q\e(B-\e$(5!z!j\e(B]")
-(defconst devanagari-other-sign-examine
+
+(defconst devanagari-digit-viram-visarga
+ "[\e$(5!q\e(B-\e$(5!z!j!#\e(B]")
+(defconst devanagari-other-sign
"\\([\e$(5!!!j\e(B]\e$(5!i\e(B\\)\\|\\([\e$(5#!#J\e(B]\\)")
-(defconst devanagari-composite-glyph-unit-examine
- (concat "\\(" devanagari-cons-syllable-incomplete-examine
- "\\)\\|\\(" devanagari-vowel-syllable-examine
- "\\)\\|\\(" devanagari-digit-viram-examine
- "\\)\\|\\(" devanagari-cons-syllable-examine
- "\\)\\|\\(" devanagari-other-sign-examine"\\)")
+(defconst devanagari-composite-glyph-unit
+ (concat "\\(" devanagari-cons-syllable
+ "\\)\\|\\(" devanagari-vowel-syllable
+ "\\)\\|\\(" devanagari-digit-viram-visarga
+ "\\)\\|\\(" devanagari-cons-vowel-syllable
+ "\\)\\|\\(" devanagari-other-sign "\\)")
"Regexp matching to Devanagari string to be composed form one glyph.")
;;(put-charset-property charset-devanagari-1-column
;; Sample
;;
-;;(string-match devanagari-cons-syllable-examine "\e$(5!X![\e(B") => 0
-;;(string-match devanagari-cons-syllable-examine "\e$(5!F!h!D!\\e(B") => 0
-;;(string-match devanagari-cons-syllable-examine "\e$(5!X![!F!h!D!\\e(B") => 0
+;;(string-match devanagari-cons-vowel-syllable-examine "\e$(5!X![\e(B") => 0
+;;(string-match devanagari-cons-vowel-syllable-examine "\e$(5!F!h!D!\\e(B") => 0
+;;(string-match devanagari-cons-vowel-syllable-examine "\e$(5!X![!F!h!D!\\e(B") => 0
;;
;; Steps toward the composition
-;; Converting Character Code to Composite Glyph.
+;; Converting Character Codes to Composite Glyph.
;;
;; Example : \e$(5!X![\e(B/\e$(5!F!h!D!\\e(B
;;
(defconst devanagari-char-to-glyph-rules
'(
- ;; special form for "ru".
- ("\\(\e$(5!O!]\e(B\\)" . "\e$(5",\e(B")
- ("\\(\e$(5!O!^\e(B\\)" . "\e$(5"-\e(B")
- ("\\(\e$(5!P!]\e(B\\)" . "\e$(5".\e(B")
- ("\\(\e$(5!P!^\e(B\\)" . "\e$(5"/\e(B")
;; `r' at the top of syllable and followed by other consonants.
- ;; ("[^\e$(5!h\e(B]\\(\e$(5!O!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"p\e(B")
- ("^\\(\e$(5!O!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"p\e(B")
-
- ;; Half Form Ligature
- ;; Here is the half-form ligature which has higher priority than
- ;; the common ligature rules listed below.
- ;; special forms.
- ("\\(\e$(5!3!h!V!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"l\e(B")
- ("\\(\e$(5!:!h!<!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"m\e(B")
- ;; Ordinary forms.
- ("\\(\e$(5!B!h!B!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"c\e(B")
- ("\\(\e$(5!F!h!F!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"k\e(B")
-
- ;; If "r" is preceded by the vowel-suppressed consonant
- ;; (especially those with vertical line), it will be written as
- ;; slanted line below the preceding consonant character. Some of
- ;; them are pre-composed as one glyph.
-
- ("\\(\e$(5!:!i!h!O\e(B\\)" . "\e$(5"!\e(B")
- ("\\(\e$(5!I!i!h!O\e(B\\)" . "\e$(5""\e(B")
- ("\\(\e$(5!3!h!O\e(B\\)" . "\e$(5"#\e(B")
- ("\\(\e$(5!5!h!O\e(B\\)" . "\e$(5"$\e(B")
- ("\\(\e$(5!B!h!O\e(B\\)" . "\e$(5"%\e(B")
- ("\\(\e$(5!H!h!O\e(B\\)" . "\e$(5"&\e(B")
- ("\\(\e$(5!I!h!O\e(B\\)" . "\e$(5"'\e(B")
- ("\\(\e$(5!U!h!O\e(B\\)" . "\e$(5")\e(B")
-
- ;; Special Rules
- ;; In the following case, "\e$(5!<!h!:\e(B" ligature does not occur.
- ("\\(\e$(5!<!h\e(B\\)\e$(5!:!h!<!h\e(B" . "\e$(5"<\e(B")
+ ;; ("[^\e$(5!h\e(B]\\(\e$(5!O!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" "\e$(5"p\e(B")
+ ("^\\(\e$(5!O!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" "\e$(5"p\e(B")
;; Ligature Rules
- ("\\(\e$(5!3!h!B!h!O!h!M\e(B\\)" . "\e$(5$!\e(B")
- ("\\(\e$(5!3!h!B!h!T\e(B\\)" . "\e$(5$"\e(B")
- ("\\(\e$(5!3!h!B!h!M\e(B\\)" . "\e$(5$#\e(B")
- ("\\(\e$(5!3!h!F!h!M\e(B\\)" . "\e$(5$$\e(B")
- ("\\(\e$(5!3!h!O!h!M\e(B\\)" . "\e$(5$%\e(B")
- ("\\(\e$(5!3!h!T!h!M\e(B\\)" . "\e$(5$&\e(B")
- ("\\(\e$(5!3!h!3\e(B\\)" . "\e$(5$'\e(B")
- ("\\(\e$(5!3!h!B\e(B\\)" . "\e$(5$(\e(B")
- ("\\(\e$(5!3!h!F\e(B\\)" . "\e$(5$)\e(B")
- ("\\(\e$(5!3!h!L\e(B\\)" . "\e$(5$*\e(B")
- ("\\(\e$(5!3!h!M\e(B\\)" . "\e$(5$+\e(B")
- ("\\(\e$(5!3!h!Q\e(B\\)" . "\e$(5$,\e(B")
- ("\\(\e$(5!3!h!T\e(B\\)" . "\e$(5$-\e(B")
- ("\\(\e$(5!3!h!V\e(B\\)" . "\e$(5$.\e(B")
- ("\\(\e$(5!6!h!F\e(B\\)" . "\e$(5$/\e(B")
- ("\\(\e$(5!7!h!3!h!B!h!M\e(B\\)" . "\e$(5$0\e(B")
- ("\\(\e$(5!7!h!3!h!V!h!T\e(B\\)" . "\e$(5$1\e(B")
- ("\\(\e$(5!7!h!3!h!B\e(B\\)" . "\e$(5$2\e(B")
- ("\\(\e$(5!7!h!3!h!V\e(B\\)" . "\e$(5$3\e(B")
- ("\\(\e$(5!7!h!6!h!O\e(B\\)" . "\e$(5$4\e(B")
- ("\\(\e$(5!7!h!3!h!M\e(B\\)" . "\e$(5$5\e(B")
- ("\\(\e$(5!7!h!4!h!M\e(B\\)" . "\e$(5$6\e(B")
- ("\\(\e$(5!7!h!5!h!M\e(B\\)" . "\e$(5$7\e(B")
- ("\\(\e$(5!7!h!6!h!M\e(B\\)" . "\e$(5$8\e(B")
- ("\\(\e$(5!7!h!3\e(B\\)" . "\e$(5$9\e(B")
- ("\\(\e$(5!7!h!4\e(B\\)" . "\e$(5$:\e(B")
- ("\\(\e$(5!7!h!5\e(B\\)" . "\e$(5$;\e(B")
- ("\\(\e$(5!7!h!6\e(B\\)" . "\e$(5$<\e(B")
- ("\\(\e$(5!7!h!7\e(B\\)" . "\e$(5$=\e(B")
- ("\\(\e$(5!7!h!F\e(B\\)" . "\e$(5$>\e(B")
- ("\\(\e$(5!7!h!L\e(B\\)" . "\e$(5$?\e(B")
- ("\\(\e$(5!7!h!M\e(B\\)" . "\e$(5$@\e(B")
- ("\\(\e$(5!8!h!8\e(B\\)" . "\e$(5$A\e(B")
- ("\\(\e$(5!8!h!<\e(B\\)" . "\e$(5$B\e(B")
- ("\\(\e$(5!9!h!M\e(B\\)" . "\e$(5$C\e(B")
- ("\\(\e$(5!:!h!O\e(B\\)" . "\e$(5$D\e(B")
- ("\\(\e$(5!:!h!<\e(B\\)" . "\e$(5$E\e(B")
- ("\\(\e$(5!<!h!8\e(B\\)" . "\e$(5$F\e(B")
- ("\\(\e$(5!<!h!:\e(B\\)" . "\e$(5$G\e(B")
- ("\\(\e$(5!=!h!3\e(B\\)" . "\e$(5$H\e(B")
- ("\\(\e$(5!=!h!=\e(B\\)" . "\e$(5$I\e(B")
- ("\\(\e$(5!=!h!>\e(B\\)" . "\e$(5$J\e(B")
- ("\\(\e$(5!=!h!M\e(B\\)" . "\e$(5$K\e(B")
- ("\\(\e$(5!>!h!M\e(B\\)" . "\e$(5$L\e(B")
- ("\\(\e$(5!?!h!5!h!M\e(B\\)" . "\e$(5$M\e(B")
- ("\\(\e$(5!?!h!6!h!O\e(B\\)" . "\e$(5$N\e(B")
- ("\\(\e$(5!?!h!O!h!M\e(B\\)" . "\e$(5$O\e(B")
- ("\\(\e$(5!?!h!5\e(B\\)" . "\e$(5$P\e(B")
- ("\\(\e$(5!?!h!6\e(B\\)" . "\e$(5$Q\e(B")
- ("\\(\e$(5!?!h!?\e(B\\)" . "\e$(5$R\e(B")
- ("\\(\e$(5!?!h!L\e(B\\)" . "\e$(5$S\e(B")
- ("\\(\e$(5!?!h!M\e(B\\)" . "\e$(5$T\e(B")
- ("\\(\e$(5!@!h!M\e(B\\)" . "\e$(5$`\e(B")
- ("\\(\e$(5!B!h!B\e(B\\)" . "\e$(5$a\e(B")
- ("\\(\e$(5!B!h!F\e(B\\)" . "\e$(5$b\e(B")
- ("\\(\e$(5!D!h!D!h!M\e(B\\)" . "\e$(5$c\e(B")
- ("\\(\e$(5!D!h!E!h!M\e(B\\)" . "\e$(5$d\e(B")
- ("\\(\e$(5!D!h!K!h!M\e(B\\)" . "\e$(5$e\e(B")
- ("\\(\e$(5!D!h!O!h!M\e(B\\)" . "\e$(5$f\e(B")
- ("\\(\e$(5!D!h!T!h!M\e(B\\)" . "\e$(5$g\e(B")
- ("\\(\e$(5!D!h!5!h!O\e(B\\)" . "\e$(5$h\e(B")
- ("\\(\e$(5!D!h!6!h!O\e(B\\)" . "\e$(5$i\e(B")
- ("\\(\e$(5!D!h!D!h!T\e(B\\)" . "\e$(5$j\e(B")
- ("\\(\e$(5!D!h!E!h!T\e(B\\)" . "\e$(5$k\e(B")
- ("\\(\e$(5!D!h!5\e(B\\)" . "\e$(5$l\e(B")
- ("\\(\e$(5!D!h!6\e(B\\)" . "\e$(5$m\e(B")
- ("\\(\e$(5!D!h!D\e(B\\)" . "\e$(5$n\e(B")
- ("\\(\e$(5!D!h!E\e(B\\)" . "\e$(5$o\e(B")
- ("\\(\e$(5!D!h!F\e(B\\)" . "\e$(5$p\e(B")
- ("\\(\e$(5!D!h!J\e(B\\)" . "\e$(5$q\e(B")
- ("\\(\e$(5!D!h!K\e(B\\)" . "\e$(5$r\e(B")
- ("\\(\e$(5!D!h!L\e(B\\)" . "\e$(5$s\e(B")
- ("\\(\e$(5!D!h!M\e(B\\)" . "\e$(5$t\e(B")
- ("\\(\e$(5!D!h!T\e(B\\)" . "\e$(5$u\e(B")
- ("\\(\e$(5!E!h!F\e(B\\)" . "\e$(5$v\e(B")
- ("\\(\e$(5!F!h!F\e(B\\)" . "\e$(5$w\e(B")
- ("\\(\e$(5!H!h!B\e(B\\)" . "\e$(5$x\e(B")
- ("\\(\e$(5!H!h!F\e(B\\)" . "\e$(5$y\e(B")
- ("\\(\e$(5!H!h!Q\e(B\\)" . "\e$(5$z\e(B")
- ("\\(\e$(5!J!h!F\e(B\\)" . "\e$(5${\e(B")
- ("\\(\e$(5!J!h!J\e(B\\)" . "\e$(5$|\e(B")
- ("\\(\e$(5!J!h!T\e(B\\)" . "\e$(5$}\e(B")
- ("\\(\e$(5!K!h!F\e(B\\)" . "\e$(5$~\e(B")
- ("\\(\e$(5!L!h!F\e(B\\)" . "\e$(5#P\e(B")
- ("\\(\e$(5!L!h!Q\e(B\\)" . "\e$(5#Q\e(B")
- ("\\(\e$(5!Q!h!Q\e(B\\)" . "\e$(5#`\e(B")
- ("\\(\e$(5!T!h!F\e(B\\)" . "\e$(5#a\e(B")
- ("\\(\e$(5!T!h!T\e(B\\)" . "\e$(5#b\e(B")
- ("\\(\e$(5!U!h!8\e(B\\)" . "\e$(5#c\e(B")
- ("\\(\e$(5!U!h!F\e(B\\)" . "\e$(5#d\e(B")
- ("\\(\e$(5!U!h!J\e(B\\)" . "\e$(5#e\e(B")
- ("\\(\e$(5!U!h!Q\e(B\\)" . "\e$(5#f\e(B")
- ("\\(\e$(5!U!h!T\e(B\\)" . "\e$(5#g\e(B")
- ("\\(\e$(5!V!h!=!h!O!h!M\e(B\\)" . "\e$(5#h\e(B")
- ("\\(\e$(5!V!h!=!h!M\e(B\\)" . "\e$(5#i\e(B")
- ("\\(\e$(5!V!h!=!h!T\e(B\\)" . "\e$(5#j\e(B")
- ("\\(\e$(5!V!h!=\e(B\\)" . "\e$(5#k\e(B")
- ("\\(\e$(5!V!h!>\e(B\\)" . "\e$(5#l\e(B")
- ("\\(\e$(5!W!h!F\e(B\\)" . "\e$(5#m\e(B")
- ("\\(\e$(5!W!h!O\e(B\\)" . "\e$(5#n\e(B")
- ("\\(\e$(5!X!h!A\e(B\\)" . "\e$(5#p\e(B")
- ("\\(\e$(5!X!h!F\e(B\\)" . "\e$(5#q\e(B")
- ("\\(\e$(5!X!h!L\e(B\\)" . "\e$(5#r\e(B")
- ("\\(\e$(5!X!h!M\e(B\\)" . "\e$(5#s\e(B")
- ("\\(\e$(5!X!h!O\e(B\\)" . "\e$(5#t\e(B")
- ("\\(\e$(5!X!h!Q\e(B\\)" . "\e$(5#u\e(B")
- ("\\(\e$(5!X!h!T\e(B\\)" . "\e$(5#v\e(B")
- ;; Special Ligature Rules
- ("\\(\e$(5!X!_\e(B\\)" . "\e$(5#R\e(B")
-
- ;; Half form with ligature. Special "r" case is included. "r"
- ;; connection which is not listed here has not been examined yet.
- ;; I don't know what to do with them.
+ ("\\(\e$(5!3!h!B!h!O!h!M\e(B\\)" "\e$(5$!\e(B" sanskrit)
+ ("\\(\e$(5!3!h!B!h!T\e(B\\)" "\e$(5$"\e(B" sanskrit)
+ ("\\(\e$(5!3!h!B!h!M\e(B\\)" "\e$(5$#\e(B" sanskrit)
+ ("\\(\e$(5!3!h!F!h!M\e(B\\)" "\e$(5$$\e(B")
+ ("\\(\e$(5!3!h!O!h!M\e(B\\)" "\e$(5$%\e(B")
+ ("\\(\e$(5!3!h!O\e(B\\)" "\e$(5"#\e(B") ; Post "r"
+ ("\\(\e$(5!3!h!T!h!M\e(B\\)" "\e$(5$&\e(B" sanskrit)
+ ("\\(\e$(5!3!h\e(B\\)\e$(5!3!h\e(B[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"3\e(B") ; Special Half Form
+ ("\\(\e$(5!3!h!3\e(B\\)" "\e$(5$'\e(B")
+ ("\\(\e$(5!3!h\e(B\\)\e$(5!B!h!O\e(B" "\e$(5"3\e(B") ; Special Rules for "k-tr"
+ ("\\(\e$(5!3!h!B\e(B\\)" "\e$(5$(\e(B")
+ ("\\(\e$(5!3!h!F\e(B\\)" "\e$(5$)\e(B")
+ ("\\(\e$(5!3!h!L\e(B\\)" "\e$(5$*\e(B")
+ ("\\(\e$(5!3!h!M\e(B\\)" "\e$(5$+\e(B")
+ ("\\(\e$(5!3!h!Q\e(B\\)" "\e$(5$,\e(B")
+ ("\\(\e$(5!3!h!T\e(B\\)" "\e$(5$-\e(B")
+ ("\\(\e$(5!3!h!V!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"l\e(B") ; Half Form
+ ("\\(\e$(5$.!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"l\e(B") ; Half Form
+ ("\\(\e$(5!3!h!V\e(B\\)" "\e$(5$.\e(B")
+ ("\\(\e$(5!3!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"3\e(B") ; Half Form
+ ("\\(\e$(5!3!i!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"s\e(B") ; Nukta Half Form
+ ("\\(\e$(5!3!i\e(B\\)" "\e$(5#3\e(B") ; Nukta
+ ("\\(\e$(5!4!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"4\e(B") ; Half Form
+ ("\\(\e$(5!4!i!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"t\e(B") ; Nukta Half Form
+ ("\\(\e$(5!4!i\e(B\\)" "\e$(5#4\e(B") ; Nukta
+ ("\\(\e$(5!5!h!O!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"`\e(B") ; Half Form
+ ("\\(\e$(5!5!h!O\e(B\\)" "\e$(5"$\e(B") ; Post "r"
+ ("\\(\e$(5!5!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"5\e(B") ; Half Form
+ ("\\(\e$(5!5!i!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"u\e(B") ; Nukta Half Form
+ ("\\(\e$(5!5!i\e(B\\)" "\e$(5#5\e(B") ; Nukta
+ ("\\(\e$(5!6!h!F!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"a\e(B") ; Half Form
+ ("\\(\e$(5!6!h!F\e(B\\)" "\e$(5$/\e(B")
+ ; Slot
+ ("\\(\e$(5!6!h!O\e(B\\)" "\e$(5!6"q\e(B") ; Post "r"
+ ("\\(\e$(5!6!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"6\e(B") ; Half Form
+ ("\\(\e$(5!7!h!3!h!B!h!M\e(B\\)" "\e$(5$0\e(B" sanskrit)
+ ("\\(\e$(5!7!h!3!h!V!h!T\e(B\\)" "\e$(5$1\e(B" sanskrit)
+ ("\\(\e$(5!7!h!3!h!B\e(B\\)" "\e$(5$2\e(B" sanskrit)
+ ("\\(\e$(5!7!h!3!h!V\e(B\\)" "\e$(5$3\e(B" sanskrit)
+ ("\\(\e$(5!7!h!3!h!O\e(B\\)" "\e$(5$9"q\e(B") ; Special Rule. May be precomposed font needed.
+ ("\\(\e$(5!7!h!6!h!O\e(B\\)" "\e$(5$4\e(B" sanskrit)
+ ("\\(\e$(5!7!h!3!h!M\e(B\\)" "\e$(5$5\e(B" sanskrit)
+ ("\\(\e$(5!7!h!4!h!M\e(B\\)" "\e$(5$6\e(B" sanskrit)
+ ("\\(\e$(5!7!h!5!h!M\e(B\\)" "\e$(5$7\e(B" sanskrit)
+ ("\\(\e$(5!7!h!6!h!M\e(B\\)" "\e$(5$8\e(B" sanskrit)
+ ("\\(\e$(5!7!h!3\e(B\\)" "\e$(5$9\e(B")
+ ("\\(\e$(5!7!h!4\e(B\\)" "\e$(5$:\e(B")
+ ("\\(\e$(5!7!h!5!h!O\e(B\\)" "\e$(5$;"q\e(B") ; Special Rule. May be precomposed font needed.
+ ("\\(\e$(5!7!h!5\e(B\\)" "\e$(5$;\e(B")
+ ("\\(\e$(5!7!h!6\e(B\\)" "\e$(5$<\e(B")
+ ("\\(\e$(5!7!h!7\e(B\\)" "\e$(5$=\e(B")
+ ("\\(\e$(5!7!h!F\e(B\\)" "\e$(5$>\e(B")
+ ("\\(\e$(5!7!h!L\e(B\\)" "\e$(5$?\e(B")
+ ("\\(\e$(5!7!h!M\e(B\\)" "\e$(5$@\e(B")
+ ("\\(\e$(5!8!h\e(B\\)[\e$(5!8!<\e(B]\e$(5!h\e(B" "\e$(5"8\e(B") ; Half Form
+ ("\\(\e$(5!8!h!8\e(B\\)" "\e$(5$A\e(B")
+ ("\\(\e$(5!8!h!<\e(B\\)" "\e$(5$B\e(B")
+ ("\\(\e$(5!8!h!O!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"8"q\e(B") ; Half Form Post "r"
+ ("\\(\e$(5!8!h!O\e(B\\)" "\e$(5!8"q\e(B") ; Post "r"
+ ("\\(\e$(5!8!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"8\e(B") ; Half Form
+ ("\\(\e$(5!9!h!M\e(B\\)" "\e$(5$C\e(B")
+ ("\\(\e$(5!:!h!O\e(B\\)" "\e$(5$D\e(B")
+ ("\\(\e$(5!:!h!<!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"m\e(B") ; Half Form
+ ("\\(\e$(5!:!h!<\e(B\\)" "\e$(5$E\e(B")
+ ("\\(\e$(5!:!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5":\e(B") ; Half Form
+ ("\\(\e$(5!:!i!h!O\e(B\\)" "\e$(5"!\e(B") ; Nukta Post "r"
+ ("\\(\e$(5!:!i!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"z\e(B") ; Nukta Half Form
+ ("\\(\e$(5!:!i\e(B\\)" "\e$(5#:\e(B") ; Nukta
+ ("\\(\e$(5!;!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5";\e(B") ; Half Form
+ ("\\(\e$(5!<!h\e(B\\)\e$(5!8!h\e(B[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"<\e(B") ; Special Half Form
+ ("\\(\e$(5!<!h!8\e(B\\)" "\e$(5$F\e(B")
+ ("\\(\e$(5!<!h\e(B\\)\e$(5!:!h\e(B[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"<\e(B") ; Special Half Form
+ ("\\(\e$(5!<!h!:\e(B\\)" "\e$(5$G\e(B")
+ ("\\(\e$(5!<!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"<\e(B") ; Half Form
+ ("\\(\e$(5!=!h!3\e(B\\)" "\e$(5$H\e(B")
+ ("\\(\e$(5!=!h!=\e(B\\)" "\e$(5$I\e(B")
+ ("\\(\e$(5!=!h!>\e(B\\)" "\e$(5$J\e(B")
+ ("\\(\e$(5!=!h!M\e(B\\)" "\e$(5$K\e(B")
+ ("\\(\e$(5!>!h!M\e(B\\)" "\e$(5$L\e(B")
+ ("\\(\e$(5!?!h!5!h!M\e(B\\)" "\e$(5$M\e(B" sanskrit)
+ ("\\(\e$(5!?!h!6!h!O\e(B\\)" "\e$(5$N\e(B" sanskrit)
+ ("\\(\e$(5!?!h!O!h!M\e(B\\)" "\e$(5$O\e(B")
+ ("\\(\e$(5!?!h!5\e(B\\)" "\e$(5$P\e(B")
+ ("\\(\e$(5!?!h!6\e(B\\)" "\e$(5$Q\e(B")
+ ("\\(\e$(5!?!h!?\e(B\\)" "\e$(5$R\e(B")
+ ("\\(\e$(5!?!h!L\e(B\\)" "\e$(5$S\e(B")
+ ("\\(\e$(5!?!h!M\e(B\\)" "\e$(5$T\e(B")
+ ("\\(\e$(5!?!i\e(B\\)" "\e$(5#?\e(B") ; Nukta
+ ("\\(\e$(5!@!h!M\e(B\\)" "\e$(5$`\e(B")
+ ("\\(\e$(5!@!i\e(B\\)" "\e$(5#@\e(B") ; Nukta
+ ("\\(\e$(5!A!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"A\e(B") ; Half Form
+ ("\\(\e$(5!B!h\e(B\\)\e$(5!B!h!O\e(B" "\e$(5"B\e(B") ; Special Rule for "t-tr"
+ ("\\(\e$(5!B!h!B!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"c\e(B") ; Half Form
+ ("\\(\e$(5!B!h!B\e(B\\)" "\e$(5$a\e(B")
+ ("\\(\e$(5!B!h!F\e(B\\)" "\e$(5$b\e(B")
+ ("\\(\e$(5!B!h!O!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"d\e(B") ; Half Form Post "r"
+ ("\\(\e$(5!B!h!O\e(B\\)" "\e$(5"%\e(B") ; Post "r"
+ ("\\(\e$(5!B!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"B\e(B") ; Half Form
+ ("\\(\e$(5!C!h!O\e(B\\)" "\e$(5!C"q\e(B") ; Post "r"
+ ("\\(\e$(5!C!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"C\e(B") ; Half Form
+ ("\\(\e$(5!D!h!D!h!M\e(B\\)" "\e$(5$c\e(B")
+ ("\\(\e$(5!D!h!E!h!M\e(B\\)" "\e$(5$d\e(B")
+ ("\\(\e$(5!D!h!K!h!M\e(B\\)" "\e$(5$e\e(B")
+ ("\\(\e$(5!D!h!K!h!O\e(B\\)" "\e$(5$r"r\e(B") ; Special Case for "dbhr" ; ***
+ ("\\(\e$(5!D!h!O!h!M\e(B\\)" "\e$(5$f\e(B")
+ ("\\(\e$(5!D!h!T!h!M\e(B\\)" "\e$(5$g\e(B")
+ ("\\(\e$(5!D!h!5!h!O\e(B\\)" "\e$(5$h\e(B")
+ ("\\(\e$(5!D!h!6!h!O\e(B\\)" "\e$(5$i\e(B")
+ ("\\(\e$(5!D!h!D!h!T\e(B\\)" "\e$(5$j\e(B")
+ ("\\(\e$(5!D!h!E!h!T\e(B\\)" "\e$(5$k\e(B")
+ ("\\(\e$(5!D!h\e(B\\)\e$(5!E!h\e(B[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5!D!h\e(B") ; Special Half Form (for ddhra)
+ ("\\(\e$(5!D!h!5\e(B\\)" "\e$(5$l\e(B")
+ ("\\(\e$(5!D!h!6\e(B\\)" "\e$(5$m\e(B")
+ ("\\(\e$(5!D!h!D\e(B\\)" "\e$(5$n\e(B")
+ ("\\(\e$(5!D!h!E\e(B\\)" "\e$(5$o\e(B")
+ ("\\(\e$(5!D!h!F\e(B\\)" "\e$(5$p\e(B")
+ ("\\(\e$(5!D!h\e(B\\)\e$(5!J!h\e(B" "\e$(5!D!h\e(B") ; Suppressing "db-"
+ ("\\(\e$(5!D!h!J\e(B\\)" "\e$(5$q\e(B")
+ ("\\(\e$(5!D!h!K\e(B\\)" "\e$(5$r\e(B")
+ ("\\(\e$(5!D!h!L\e(B\\)" "\e$(5$s\e(B")
+ ("\\(\e$(5!D!h!M\e(B\\)" "\e$(5$t\e(B")
+ ("\\(\e$(5!D!h!T\e(B\\)" "\e$(5$u\e(B")
+ ("\\(\e$(5!E!h!F!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"e\e(B") ; Half Form
+ ("\\(\e$(5!E!h!F\e(B\\)" "\e$(5$v\e(B")
+ ("\\(\e$(5!E!h!O!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"f\e(B") ; Half Form Post "r"
+ ("\\(\e$(5!E!h!O\e(B\\)" "\e$(5!E"q\e(B") ; Post "r"
+ ("\\(\e$(5!E!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"E\e(B") ; Half Form
+ ("\\(\e$(5!F!h!F!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"k\e(B") ; Half Form
+ ("\\(\e$(5!F!h!F\e(B\\)" "\e$(5$w\e(B")
+ ("\\(\e$(5!F!h!O\e(B\\)" "\e$(5!F"q\e(B")
+ ("\\(\e$(5!F!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"F\e(B") ; Half Form
+ ("\\(\e$(5!G!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"G\e(B") ; Nukta Half Form
+ ("\\(\e$(5!H!h\e(B\\)\e$(5!B!h!O\e(B" "\e$(5"H\e(B") ; Special Rule for "p-tr"
+ ("\\(\e$(5!H!h!B!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"g\e(B") ; Half Form
+ ("\\(\e$(5!H!h!B\e(B\\)" "\e$(5$x\e(B")
+ ("\\(\e$(5!H!h!F\e(B\\)" "\e$(5$y\e(B")
+ ("\\(\e$(5!H!h!Q\e(B\\)" "\e$(5$z\e(B")
+ ("\\(\e$(5!H!h!O\e(B\\)" "\e$(5"&\e(B") ; Post "r"
+ ("\\(\e$(5!H!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"H\e(B") ; Half Form
+ ("\\(\e$(5!I!h!O\e(B\\)" "\e$(5"'\e(B") ; Post "r"
+ ("\\(\e$(5!I!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"I\e(B") ; Half Form
+ ("\\(\e$(5!I!i!h!O\e(B\\)" "\e$(5""\e(B") ; Nukta Post "r"
+ ("\\(\e$(5!I!i!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"y\e(B") ; Nukta Half Form
+ ("\\(\e$(5!I!i\e(B\\)" "\e$(5#I\e(B") ; Nukta
+ ("\\(\e$(5!J!h\e(B\\)\e$(5!F!h\e(B[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"J\e(B") ; Special Half Form
+ ("\\(\e$(5!J!h!F\e(B\\)" "\e$(5${\e(B")
+ ("\\(\e$(5!J!h\e(B\\)\e$(5!J!h\e(B[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"J\e(B") ; Special Half Form
+ ("\\(\e$(5!J!h!J\e(B\\)" "\e$(5$|\e(B")
+ ("\\(\e$(5!J!h\e(B\\)\e$(5!T!h\e(B[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"J\e(B") ; Special Half Form
+ ("\\(\e$(5!J!h!T\e(B\\)" "\e$(5$}\e(B")
+ ("\\(\e$(5!J!h!O\e(B\\)" "\e$(5!J"q\e(B") ; Post "r"
+ ("\\(\e$(5!J!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"J\e(B") ; Half Form
+ ("\\(\e$(5!K!h!F\e(B\\)" "\e$(5$~\e(B")
+ ("\\(\e$(5!K!h!O\e(B\\)" "\e$(5!K"q\e(B") ; Post "r"
+ ("\\(\e$(5!K!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"K\e(B") ; Half Form
+ ("\\(\e$(5!L!h!F\e(B\\)" "\e$(5#P\e(B")
+ ("\\(\e$(5!L!h!Q\e(B\\)" "\e$(5#Q\e(B")
+ ("\\(\e$(5!L!h!O\e(B\\)" "\e$(5!L"q\e(B") ; Post "r"
+ ("\\(\e$(5!L!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"L\e(B") ; Half Form
+ ("\\(\e$(5!M!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"M\e(B") ; Half Form
+ ("\\(\e$(5!N!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"N\e(B") ; Half Form
+ ;; special form for "ru".
+ ("\\(\e$(5!O!]\e(B\\)" "\e$(5",\e(B")
+ ("\\(\e$(5!O!^\e(B\\)" "\e$(5"-\e(B")
+ ("\\(\e$(5!P!]\e(B\\)" "\e$(5".\e(B")
+ ("\\(\e$(5!P!^\e(B\\)" "\e$(5"/\e(B")
;;
- ;; ordinary forms
- ("\\(\e$(5!5!h!O!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"`\e(B")
- ("\\(\e$(5!6!h!F!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"a\e(B")
- ;; ("\\(\e$(5!<!h!8!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"c\e(B") ; Mistake, must check later.
- ("\\(\e$(5!B!h!O!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"d\e(B")
- ("\\(\e$(5!E!h!F!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"e\e(B")
- ("\\(\e$(5!E!h!O!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"f\e(B")
- ("\\(\e$(5!H!h!B!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"g\e(B")
- ("\\(\e$(5!U!h!8!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"h\e(B")
- ("\\(\e$(5!U!h!O!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"i\e(B")
- ("\\(\e$(5!U!h!T!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"j\e(B")
- ;; ("\\(\e$(5!U!h!T!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"k\e(B") ; must check later.
- ;; Conjunction form associated with Nukta sign.
- ("\\(\e$(5!3!i!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"s\e(B")
- ("\\(\e$(5!4!i!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"t\e(B")
- ("\\(\e$(5!5!i!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"u\e(B")
- ("\\(\e$(5!:!i!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"z\e(B")
- ("\\(\e$(5!I!i!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"y\e(B")
+ ("\\(\e$(5!Q!h!Q\e(B\\)" "\e$(5#`\e(B" sanskrit)
+ ("\\(\e$(5!Q!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"Q\e(B") ; Half Form
+ ("\\(\e$(5!R!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"R\e(B") ; Half Form
+ ("\\(\e$(5!S!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"S\e(B") ; Half Form
+ ("\\(\e$(5!T!h!F\e(B\\)" "\e$(5#a\e(B")
+ ("\\(\e$(5!T!h!T\e(B\\)" "\e$(5#b\e(B")
+ ("\\(\e$(5!T!h!O\e(B\\)" "\e$(5!T"q\e(B") ; Post "r"
+ ("\\(\e$(5!T!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"T\e(B") ; Half Form
+ ("\\(\e$(5!U!h!8!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"h\e(B") ; Half Form
+ ("\\(\e$(5!U!h!8\e(B\\)" "\e$(5#c\e(B")
+ ("\\(\e$(5!U!h!F\e(B\\)" "\e$(5#d\e(B")
+ ("\\(\e$(5!U!h!J\e(B\\)" "\e$(5#e\e(B")
+ ("\\(\e$(5!U!h!Q\e(B\\)" "\e$(5#f\e(B")
+ ("\\(\e$(5!U!h\e(B\\)\e$(5!T!h!O\e(B" "\e$(5"U\e(B") ; Special Half Form
+ ("\\(\e$(5!U!h!T!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"j\e(B") ; Half Form
+; ("\\(\e$(5!U!h!T\e(B\\)" "\e$(5#g\e(B")
+ ("\\(\e$(5!U!h!O!h!T\e(B\\)" "\e$(5#g\e(B")
+ ("\\(\e$(5!U!h!O!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"i\e(B") ; Half Form
+ ("\\(\e$(5!U!h!O\e(B\\)" "\e$(5")\e(B") ; Post "r"
+ ("\\(\e$(5!U!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"U\e(B") ; Half Form
+ ("\\(\e$(5!V!h!=!h!O!h!M\e(B\\)" "\e$(5#h\e(B")
+ ("\\(\e$(5!V!h!=!h!M\e(B\\)" "\e$(5#i\e(B")
+ ("\\(\e$(5!V!h!=!h!T\e(B\\)" "\e$(5#j\e(B")
+ ("\\(\e$(5!V!h!=\e(B\\)" "\e$(5#k\e(B")
+ ("\\(\e$(5!V!h!>\e(B\\)" "\e$(5#l\e(B")
+ ("\\(\e$(5!V!h!O\e(B\\)" "\e$(5!V"q\e(B") ; Post "r"
+ ("\\(\e$(5!V!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"V\e(B") ; Half Form
+ ("\\(\e$(5!W!h!F!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"W"F\e(B") ; Special Half Form
+ ("\\(\e$(5!W!h!F\e(B\\)" "\e$(5#m\e(B")
+ ("\\(\e$(5!W!h!O\e(B\\)" "\e$(5#n\e(B")
+ ("\\(\e$(5!W!h\e(B\\)[\e$(5!3\e(B-\e$(5!N!P\e(B-\e$(5!X\e(B]" "\e$(5"W\e(B") ; Half Form
+ ("\\(\e$(5!X!h!A\e(B\\)" "\e$(5#p\e(B")
+ ("\\(\e$(5!X!h!F\e(B\\)" "\e$(5#q\e(B")
+ ("\\(\e$(5!X!h!L\e(B\\)" "\e$(5#r\e(B")
+ ("\\(\e$(5!X!h!M\e(B\\)" "\e$(5#s\e(B")
+ ("\\(\e$(5!X!h!O\e(B\\)" "\e$(5#t\e(B")
+ ("\\(\e$(5!X!h!Q\e(B\\)" "\e$(5#u\e(B")
+ ("\\(\e$(5!X!h!T\e(B\\)" "\e$(5#v\e(B")
+ ;; Special Ligature Rules
+ ("\\(\e$(5!X!_\e(B\\)" "\e$(5#R\e(B")
;; For consonants other than listed above, glyph-composition will
;; be applied. If the consonant which is preceding "\e$(5!O\e(B" does not
;; have the vertical line (such as "\e$(5!?\e(B"), "\e$(5"r\e(B" is put beneath the
;; consonant.
;;
- ("[\e$(5!7!9!=!>!?!@!D!O!P!R!S!X\e(B]\\(\e$(5!h!O\e(B\\)" . "\e$(5"r\e(B")
- ("\\(\e$(5!J!h!O\e(B\\)" . "\e$(5!J"r\e(B") ; Protect from Half form conversion.
- ("\\(\e$(5!E!h!O\e(B\\)" . "\e$(5!E"r\e(B") ; Will be replaced with precomposed font.
- ("\\(\e$(5!6!h!O\e(B\\)" . "\e$(5!6"r\e(B")
- ("\\(\e$(5!K!h!O\e(B\\)" . "\e$(5!K"r\e(B")
- ("\\(\e$(5!T!h!O\e(B\\)" . "\e$(5!T"r\e(B")
- ("\\(\e$(5!L!h!O\e(B\\)" . "\e$(5!L"r\e(B")
- ("\\(\e$(5!7!h!5!h!O\e(B\\)" . "\e$(5$;"r\e(B") ; Ggr
- ("\\(\e$(5!7!h!3!h!O\e(B\\)" . "\e$(5$9"r\e(B") ; Gkr
-
- ("\e$(5!?!i\e(B\\(\e$(5!h!O\e(B\\)" . "\e$(5"r\e(B")
- ("\e$(5!@!i\e(B\\(\e$(5!h!O\e(B\\)" . "\e$(5"r\e(B")
-
- ;; Nukta
- ("\\(\e$(5!!!i\e(B\\)" . "\e$(5#!\e(B")
- ("\\(\e$(5!&!i\e(B\\)" . "\e$(5#&\e(B")
- ("\\(\e$(5!'!i\e(B\\)" . "\e$(5#'\e(B")
- ("\\(\e$(5!*!i\e(B\\)" . "\e$(5#*\e(B")
- ("\\(\e$(5![!i\e(B\\)" . "\e$(5#L\e(B")
- ("\\(\e$(5!\!i\e(B\\)" . "\e$(5#M\e(B")
- ("\\(\e$(5!_!i\e(B\\)" . "\e$(5#K\e(B")
- ("\\(\e$(5!3!i\e(B\\)" . "\e$(5#3\e(B")
- ("\\(\e$(5!4!i\e(B\\)" . "\e$(5#4\e(B")
- ("\\(\e$(5!5!i\e(B\\)" . "\e$(5#5\e(B")
- ("\\(\e$(5!:!i\e(B\\)" . "\e$(5#:\e(B")
- ("\\(\e$(5!?!i\e(B\\)" . "\e$(5#?\e(B")
- ("\\(\e$(5!@!i\e(B\\)" . "\e$(5#@\e(B")
- ("\\(\e$(5!I!i\e(B\\)" . "\e$(5#I\e(B")
- ("\\(\e$(5!j!i\e(B\\)" . "\e$(5#J\e(B")
-
- ;; Half forms.
- ("\\(\e$(5!3!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"3\e(B")
- ("\\(\e$(5!4!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"4\e(B")
- ("\\(\e$(5!5!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"5\e(B")
- ("\\(\e$(5!6!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"6\e(B")
- ("\\(\e$(5!8!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"8\e(B")
- ("\\(\e$(5!:!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5":\e(B")
- ("\\(\e$(5!;!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5";\e(B")
- ("\\(\e$(5!<!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"<\e(B")
- ("\\(\e$(5!A!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"A\e(B")
- ("\\(\e$(5!B!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"B\e(B")
- ("\\(\e$(5!C!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"C\e(B")
- ("\\(\e$(5!E!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"E\e(B")
- ("\\(\e$(5!F!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"F\e(B")
- ("\\(\e$(5!G!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"G\e(B")
- ("\\(\e$(5!H!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"H\e(B")
- ("\\(\e$(5!I!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"I\e(B")
- ("\\(\e$(5!J!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"J\e(B")
- ("\\(\e$(5!K!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"K\e(B")
- ("\\(\e$(5!L!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"L\e(B")
- ("\\(\e$(5!M!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"M\e(B")
- ("\\(\e$(5!N!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"N\e(B")
- ("\\(\e$(5!Q!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"Q\e(B")
- ("\\(\e$(5!R!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"R\e(B")
- ("\\(\e$(5!S!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"S\e(B")
- ("\\(\e$(5!T!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"T\e(B")
- ("\\(\e$(5!U!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"U\e(B")
- ("\\(\e$(5!V!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"V\e(B")
- ("\\(\e$(5!W!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"W\e(B")
-
- ;; Special rule for "rR"
- ("\\(\e$(5!O!_\e(B\\)" . "\e$(5!*"p\e(B")
+ ("[\e$(5!7!9!=!>!?!@!D!O!P!R!S!X\e(B]\\(\e$(5!h!O\e(B\\)" "\e$(5"r\e(B")
+ ("[\e$(5!6!8!C!E!F!H!J!K!L!M!T!V\e(B]\\(\e$(5!h!O\e(B\\)" "\e$(5"q\e(B")
+ ("\e$(5!?!i\e(B\\(\e$(5!h!O\e(B\\)" "\e$(5"r\e(B")
+ ("\e$(5!@!i\e(B\\(\e$(5!h!O\e(B\\)" "\e$(5"r\e(B")
+
+ ;; Nukta with Non-Consonants
+ ("\\(\e$(5!!!i\e(B\\)" "\e$(5#!\e(B")
+ ("\\(\e$(5!&!i\e(B\\)" "\e$(5#&\e(B")
+ ("\\(\e$(5!'!i\e(B\\)" "\e$(5#'\e(B")
+ ("\\(\e$(5!*!i\e(B\\)" "\e$(5#*\e(B")
+ ("\\(\e$(5![!i\e(B\\)" "\e$(5#L\e(B")
+ ("\\(\e$(5!\!i\e(B\\)" "\e$(5#M\e(B")
+ ("\\(\e$(5!_!i\e(B\\)" "\e$(5#K\e(B")
+ ("\\(\e$(5!j!i\e(B\\)" "\e$(5#J\e(B")
+
+ ;; Special rule for "r + some vowels"
+ ("\\(\e$(5!O!_\e(B\\)" "\e$(5!*"p\e(B")
+ ("\\(\e$(5!O#L\e(B\\)" "\e$(5#&"p\e(B")
+ ("\\(\e$(5!O#K\e(B\\)" "\e$(5#*"p\e(B")
+ ("\\(\e$(5!O#M\e(B\\)" "\e$(5#'"p\e(B")
;; If everything fails, "y" will connect to the front consonant.
- ("\\(\e$(5!h!M\e(B\\)" . "\e$(5"]\e(B")
+ ("\\(\e$(5!h!M\e(B\\)" "\e$(5"]\e(B")
)
"Alist of regexps of Devanagari character sequences vs composed characters.")
-;; Example:
-;;("\\(\e$(5!F!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" . "\e$(5"F\e(B")
-;;(string-match "\\(\e$(5!F!h\e(B\\)[\e$(5!3\e(B-\e$(5!X\e(B]" "\e$(5!X![!F!h!D!\\e(B") => 8
-;;(match-end 1) => 16
-
-;;
-;; Defining character properties : char-to-glyph, glyph-to-char
-;;
-;; * If char-to-glyph is non-nil, it would be one of the following forms.
-;;
-;; (("character-regexp" . "glyphs")
-;; .....) or
-;; (("character-regexp" . ?glyph)
-;; .....) or
-;; ("characters-regexp" . "glyphs")
-;; or
-;; ?glyph
-;;
-;; * If glyph-to-char is non-nil, it would be one of the following forms.
-;;
-;; (("glyph-regexp" . "characters") ;; This is the only case in Devanagari
-;; ....) or
-;; (("glyph-regexp" . ?character)
-;; ....) or
-;; ("glyph-regexp" . "characters")
-;; or
-;; "characters"
-;; or
-;; ?character
-;;
-
(let ((rules devanagari-char-to-glyph-rules))
(while rules
(let ((rule (car rules))
- (chars) (char) (glyph))
+ (chars) (char) (glyphs) (glyph))
(setq rules (cdr rules))
(string-match "\\\\(\\(.+\\)\\\\)" (car rule))
(setq chars (substring (car rule) (match-beginning 1) (match-end 1)))
(setq char (string-to-char chars))
- (setq glyph (string-to-char (cdr rule))) ; assume one glyph in devan.
+ (setq glyphs (cdr rule))
+ (setq glyph (string-to-char (car glyphs)))
(put-char-code-property
- char 'char-to-glyph
- (append (get-char-code-property char 'char-to-glyph) (list rule)))
- (put-char-code-property glyph 'glyph-to-char chars))))
+ char 'char-to-glyph
+ ;; We don't "cons" it since priority is top to down.
+ (append (get-char-code-property char 'char-to-glyph) (list rule)))
+
+ (if (and (< ?\e(5z\e(B glyph) ; Glyphs only.
+ (null (get-char-code-property glyph 'glyph-to-char)))
+ ; One glyph may corresponds to multiple characters,
+ ; e.g., surrounding vowel in Tamil, etc.
+ ; but for Devanagari, we put this restriction
+ ; to make sure the fact that one glyph corresponds to one char.
+ (put-char-code-property
+ glyph 'glyph-to-char
+ (cons (list (car glyphs) chars)
+ (get-char-code-property glyph 'glyph-to-char)
+ ))))))
;;
-;; Convert Character Code to Glyph Code
+;; Function used in both characters-to-glyphs conversion and
+;; glyphs-to-characters conversion.
;;
-;;;###autoload
-(defun char-to-glyph-devanagari (src-str)
- "Convert Devanagari characters in the string to Devanagari glyphs.
-Ligatures and special rules are processed."
+(defun max-match-len (regexp-str)
+ "This returns the possible length of matched string of given regexp.
+ Only [...] pattern of regexp is recognized. The last character of
+ inside of [....] is used for its length."
+ (let ((dest-str regexp-str))
+ (while (string-match "\\[\\([^\]]\\)+\\]" dest-str)
+ (setq dest-str
+ (concat (substring dest-str 0 (match-beginning 0))
+ (substring dest-str (match-beginning 1) (match-end 1))
+ (substring dest-str (match-end 0)))))
+ (length dest-str)))
+
+(defun string-conversion-by-rule (src-str symbol &rest specs)
+ " This function converts the SRC-STR to the new string according to
+the rules described in the each character's SYMBOL property. The
+rules are described in the forms of '((regexp str <specs>) ...), and
+the character sequence in the string which matches to 'regexp' are
+replaced with str. If SPECS are not specified, only rules with no
+<specs> would be applied. If SPECS are specified, then rules with no
+<specs> specified and rules with <spec> matches with SPECS would be
+applied. Rules are tested in the order of the list, thus more
+specific rules should be placed in front of less important rules. No
+composite character is supported, thus such must be converted by
+decompose-char before applying to this function. If rule is given in
+the forms of regexp '...\\(...\\)...', then inside the parenthesis is
+the subject of the match. Otherwise, the entire expression is the
+subject of the match."
(let ((pos 0)
(dst-str ""))
(while (< pos (length src-str))
(let ((found nil)
(rules (get-char-code-property
(string-to-char
- ;; caution. other forms not supported for now.
- (substring src-str pos)) 'char-to-glyph)))
+ (substring src-str pos)) symbol)))
(while rules
(let* ((rule (car rules))
- (regexp (car rule)))
- (if (string-match regexp src-str)
- (if (= (match-beginning 1) pos)
- (progn
- (setq dst-str (concat dst-str (cdr rule)))
- (setq rules nil) ; Get out of the loop.
- (setq found t)
- ;; proceed `pos' for replaced characters.
- (setq pos (match-end 1)))
- (setq rules (cdr rules)))
- (setq rules (cdr rules)))))
+ (regexp (car rule))
+ (replace-str (car (cdr rule)))
+ (rule-specs (cdr (cdr rule)))
+ search-pos)
+ (if (not (or (null rule-specs)
+ (intersection specs rule-specs)))
+ (setq rules (cdr rules))
+ (if (null (string-match "\\\\(.+\\\\)" regexp))
+ (progn
+ (setq regexp (concat "\\(" regexp "\\)"))
+ (setq search-pos pos))
+ (setq search-pos (- pos (max-match-len
+ (substring regexp
+ (string-match "^[^\\\\]*" regexp)
+ (match-end 0))))))
+ (if (< search-pos 0) (setq search-pos 0))
+ (if (string-match regexp src-str search-pos)
+ (if (= (match-beginning 1) pos)
+ (progn
+ (setq dst-str (concat dst-str replace-str))
+ (setq rules nil) ; Get out of the loop.
+ (setq found t)
+ ;; proceed `pos' for replaced characters.
+ (setq pos (match-end 1)))
+ (setq rules (cdr rules)))
+ (setq rules (cdr rules))))))
;; proceed to next position
(if (not found)
(let ((nextchar (string-to-char (substring src-str pos))))
(setq dst-str (concat dst-str (char-to-string nextchar)))))))
dst-str))
+
+;;
+;; Convert Character Code to Glyph Code
+;;
+
+;;;###autoload
+(defun char-to-glyph-devanagari (src-str &rest langs)
+ "Convert Devanagari characters in the string to Devanagari glyphs.
+Ligatures and special rules are processed."
+ (apply
+ 'string-conversion-by-rule
+ (append (list src-str 'char-to-glyph) langs)))
+
;; Example:
;;(char-to-glyph-devanagari "\e$(5!X![!F!h!D!\\e(B") => "\e$(5!X!["F!D!\\e(B"
;;(char-to-glyph-devanagari "\e$(5!O!Z!V!h!=!h!O![!M\e(B") => ???
;; Glyphs will be ordered from low priority number to high priority number.
;; If application-priority is omitted, it is assumed to be 0.
;; If application-direction is omitted, it is asumbed to be '(mr . ml).
-;;
-;; Priority
-;; Base Glyphs = {\e$(5!h!i\e(B} = Misc >
-;; {\e$(5"p"q"r\e(B} > Matras > {\e$(5!!!"!#\e(B}
-;; Question Halant and '\e$(5"q"r\e(B' priority problem.
(defconst devanagari-composition-rules
- '((?\e$(5!!\e(B 70 (tr . br))
- (?\e$(5!"\e(B 70 (mr . mr))
- (?\e$(5!#\e(B 70)
+ '((?\e$(5!!\e(B 0 (tr . br))
+ (?\e$(5!"\e(B 0 (mr . mr))
+ (?\e$(5!#\e(B 0)
(?\e$(5!$\e(B 0)
(?\e$(5!%\e(B 0)
(?\e$(5!&\e(B 0)
(?\e$(5!W\e(B 0)
(?\e$(5!X\e(B 0)
(?\e$(5!Y\e(B 0)
- (?\e$(5!Z\e(B 40)
- (?\e$(5![\e(B 40 (ml . mr))
- (?\e$(5!\\e(B 40)
- (?\e$(5!]\e(B 40 (bc . tc))
- (?\e$(5!^\e(B 40 (bc . tc))
- (?\e$(5!_\e(B 40 (bc . tc))
- (?\e$(5!`\e(B 40 (mr . mr)) ; (tc . bc)
- (?\e$(5!a\e(B 40 (mr . mr))
- (?\e$(5!b\e(B 40 (mr . mr))
- (?\e$(5!c\e(B 40 (mr . mr))
- (?\e$(5!d\e(B 40)
- (?\e$(5!e\e(B 40)
- (?\e$(5!f\e(B 40)
- (?\e$(5!g\e(B 40)
+ (?\e$(5!Z\e(B 0)
+ (?\e$(5![\e(B 0 (ml . mr))
+ (?\e$(5!\\e(B 0)
+ (?\e$(5!]\e(B 0 (br . tr))
+ (?\e$(5!^\e(B 0 (br . tr))
+ (?\e$(5!_\e(B 0 (br . tr))
+ (?\e$(5!`\e(B 0 (mr . mr)) ; (tc . bc)
+ (?\e$(5!a\e(B 0 (mr . mr))
+ (?\e$(5!b\e(B 0 (mr . mr))
+ (?\e$(5!c\e(B 0 (mr . mr))
+ (?\e$(5!d\e(B 0)
+ (?\e$(5!e\e(B 0)
+ (?\e$(5!f\e(B 0)
+ (?\e$(5!g\e(B 0)
(?\e$(5!h\e(B 0 (br . tr))
(?\e$(5!i\e(B 0 (br . tr))
(?\e$(5!j\e(B 0)
(?\e$(5"m\e(B 0)
(?\e$(5"n\e(B 0)
(?\e$(5"o\e(B 0)
- (?\e$(5"p\e(B 30 (mr . mr))
- (?\e$(5"q\e(B 30 (br . tr))
- (?\e$(5"r\e(B 30 (br . tr))
+ (?\e$(5"p\e(B 10 (mr . mr))
+ (?\e$(5"q\e(B 0 (br . br))
+ (?\e$(5"r\e(B 0 (br . tr))
(?\e$(5"s\e(B 0)
(?\e$(5"t\e(B 0)
(?\e$(5"u\e(B 0)
(?\e$(5#H\e(B 0)
(?\e$(5#I\e(B 0)
(?\e$(5#J\e(B 0)
- (?\e$(5#K\e(B 40 (bc . tc))
- (?\e$(5#L\e(B 40 (bc . tc))
- (?\e$(5#M\e(B 40 (bc . tc))
+ (?\e$(5#K\e(B 0 (br . tr))
+ (?\e$(5#L\e(B 0 (br . tr))
+ (?\e$(5#M\e(B 0 (br . tr))
(?\e$(5#N\e(B 0)
(?\e$(5#O\e(B 0)
(?\e$(5#P\e(B 0)
;; Determine composition priority and rule of the array of Glyphs.
;; Sort the glyphs with their priority.
-(defun devanagari-reorder-glyph-for-composition (glyph-alist)
+(defun devanagari-reorder-glyphs-for-composition (glyph-alist)
(let* ((pos 0)
(ordered-glyphs '()))
(while (< pos (length glyph-alist))
;;(devanagari-compose-to-one-glyph "\e$(5"5!X![\e(B") => "\e2\e$(6!XP"5@![\e1\e(B"
(defun devanagari-compose-to-one-glyph (devanagari-string)
- (let* ((o-glyph-list (devanagari-reorder-glyph-for-composition
+ (let* ((o-glyph-list (devanagari-reorder-glyphs-for-composition
(string-to-vector devanagari-string)))
;; List of glyphs to be composed.
(cmp-glyph-list (list (car (car o-glyph-list))))
;; Summary
;;
-;;;###autoload
-(defun devanagari-compose-string (str)
- (let ((len (length str))
- (src str) (dst "") rest match-b match-e)
- (while (string-match devanagari-composite-glyph-unit-examine src)
- (setq match-b (match-beginning 0) match-e (match-end 0))
- (setq dst
- (concat dst
- (substring src 0 match-b)
- (devanagari-compose-to-one-glyph
- (char-to-glyph-devanagari
- (substring src match-b match-e)))))
- (setq src (substring src match-e)))
- (setq dst (concat dst src))
- dst))
-
-;;;###autoload
-(defun devanagari-compose-region (from to)
- (interactive "r")
- (save-restriction
- (narrow-to-region from to)
- (goto-char (point-min))
- (while (re-search-forward devanagari-composite-glyph-unit-examine nil t)
- (let* ((match-b (match-beginning 0)) (match-e (match-end 0))
- (cmps (devanagari-compose-to-one-glyph
- (char-to-glyph-devanagari
- (buffer-substring match-b match-e)))))
- (delete-region match-b match-e)
- (insert cmps)))))
-
;;
;; Decomposition of composite font.
;;
(defvar devanagari-decomposition-rules
'(
- (?\e$(5"p\e(B -20)
+ (?\e$(5"p\e(B -10)
)
)
-(defun devanagari-reorder-glyph-for-decomposition (glyphlist)
- "This function re-orders glyph list."
+(defun devanagari-reorder-glyphs-for-decomposition (glyphlist)
+ "This function re-orders glyph list for decomposition."
(sort glyphlist
'(lambda (x y)
(let ((xx (assoc x devanagari-decomposition-rules))
(if (null yy) (setq yy 0))
(< xx yy)))))
-(defun devanagari-decompose-char (char)
- "This function decomposes one Devanagari composite character to
- basic Devanagari character."
- (let ((glyphlist (decompose-composite-char char)))
- (if (not (listp glyphlist))
- (setq glyphlist (list glyphlist)))
+(defun devanagari-decompose-char (glyph)
+ "This function decomposes one Devanagari composite glyph to
+ basic Devanagari characters as a string."
+ (let ((glyphlist
+ (if (eq (car (split-char glyph)) 'composition)
+ (string-to-list (decompose-composite-char glyph))
+ (list glyph))))
(setq glyphlist (devanagari-normalize-narrow-glyph glyphlist))
- (mapconcat '(lambda (x) (let ((char (get-char-code-property
- x 'glyph-to-char)))
- (if (null char) (char-to-string x) char)))
- (devanagari-reorder-glyph-for-decomposition glyphlist)
- "")))
+ (setq glyphlist (devanagari-reorder-glyphs-for-decomposition glyphlist))
+ (string-conversion-by-rule
+ (mapconcat 'char-to-string glyphlist "") 'glyph-to-char)))
;;;###autoload
(defun devanagari-decompose-string (str)
(delete-char -1)
(insert decmps)))))
+;;;
+;;; Composition
+;;;
+
+;;;###autoload
+(defun devanagari-compose-string (str &rest langs)
+ (let ((len (length str))
+ (src (devanagari-decompose-string str)) (dst "") rest match-b match-e)
+ (while (string-match devanagari-composite-glyph-unit src)
+ (setq match-b (match-beginning 0) match-e (match-end 0))
+ (setq dst
+ (concat dst
+ (substring src 0 match-b)
+ (devanagari-compose-to-one-glyph
+ (apply
+ 'char-to-glyph-devanagari
+ (cons (substring src match-b match-e)
+ langs)))))
+ (setq src (substring src match-e)))
+ (setq dst (concat dst src))
+ dst))
+;;;###autoload
+(defun devanagari-compose-region (from to &rest langs)
+ (interactive "r")
+ (save-restriction
+ (narrow-to-region from to)
+ (goto-char (point-min))
+ (while (re-search-forward devanagari-composite-glyph-unit nil t)
+ (let* ((match-b (match-beginning 0)) (match-e (match-end 0))
+ (cmps (devanagari-compose-to-one-glyph
+ (apply
+ 'char-to-glyph-devanagari
+ (cons (buffer-substring match-b match-e)
+ langs)))))
+ (delete-region match-b match-e)
+ (insert cmps)))))
;; For pre-write and post-read conversion
(devanagari-decompose-region (point-min) (point-max))
(devanagari-to-indian-region (point-min) (point-max))))
+
+;; For input/output of ITRANS
+
+;;;###autoload
+(defun devanagari-encode-itrans-region (from to)
+ (interactive "r")
+ (save-restriction
+ (narrow-to-region from to)
+ (devanagari-decompose-to-is13194-region (point-min) (point-max))
+ (indian-encode-itrans-region (point-min) (point-max))))
+
+;;;###autoload
+(defun devanagari-decode-itrans-region (from to)
+ (interactive "r")
+ (save-restriction
+ (narrow-to-region from to)
+ (indian-decode-itrans-region (point-min) (point-max))
+ (devanagari-compose-from-is13194-region (point-min) (point-max))))
+
;;
(provide 'language/devan-util)
;;; Local Variables:
;;; generated-autoload-file: "../loaddefs.el"
;;; End:
-;;; devan-util.el ends here
+;;; devan-util.el end here