comparison lisp/mule/ethiopic.el @ 70:131b0175ea99 r20-0b30

Import from CVS: tag r20-0b30
author cvs
date Mon, 13 Aug 2007 09:02:59 +0200
parents
children 5a88923fcbfe
comparison
equal deleted inserted replaced
69:804d1389bcd6 70:131b0175ea99
1 ;; Ethiopic language utilities for Mule
2 ;; Copyright (C) 1994, 1995 Free Software Foundation, Inc.
3
4 ;; This file is part of XEmacs.
5 ;; This file contains Ethiopic characters.
6
7 ;; XEmacs is free software; you can redistribute it and/or modify it
8 ;; under the terms of the GNU General Public License as published by
9 ;; the Free Software Foundation; either version 2, or (at your option)
10 ;; any later version.
11
12 ;; XEmacs is distributed in the hope that it will be useful, but
13 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
14 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 ;; General Public License for more details.
16
17 ;; You should have received a copy of the GNU General Public License
18 ;; along with XEmacs; see the file COPYING. If not, write to the
19 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 ;; Boston, MA 02111-1307, USA.
21
22 ;;; 94.10.13 created for Mule Ver.2.1 by TAKAHASHI Naoto <ntakahas@etl.go.jp>
23 ;;; 94.12.27 modified for Mule Ver.2.2 by TAKAHASHI Naoto <ntakahas@etl.go.jp>
24 ;;; 95.7.24 modified for Mule Ver.2.3 by TAKAHASHI Naoto <ntakahas@etl.go.jp>
25
26 ;;
27 ;; ETHIOPIC UTILITY FUNCTIONS
28 ;;
29
30 ;; To automatically convert Ethiopic text to SERA format when sending mail,
31 ;; (add-hook 'mail-send-hook 'fidel-to-sera-mail)
32 ;;
33 ;; To automatically convert SERA format to Ethiopic when receiving mail,
34 ;; (add-hook 'rmail-show-message-hook 'sera-to-fidel-mail)
35 ;;
36 ;; To automatically convert Ethiopic text to SERA format when posting news,
37 ;; (add-hook 'news-inews-hook 'fidel-to-sera-mail)
38 ;;
39 ;; If the filename ends in ".sera", editing will be done in fidel
40 ;; while file I/O will be done in sera.
41 ;;
42 ;; The following two functions have been removed.
43 ;; fidel-to-sera-for-disksave
44 ;; sera-to-fidel-for-disksave
45
46 ;;
47 ;; SERA to FIDEL
48 ;;
49
50 (defconst sera-to-fidel-table
51 [
52 nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil
53 nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil
54 ;;; SP ! " # $ % & ' ( ) * + , - . /
55 nil nil nil nil nil nil nil ("") nil nil nil nil ("$(2$Q(B") nil ("$(2$P(B") nil
56 ;;; 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @
57 nil nil nil nil nil nil nil nil nil nil ("$(2$S(B") ("$(2$R(B") nil nil nil nil nil
58 ;;; A
59 ("$(2"V(B" (?2 "$(2#b(B"))
60 ;;; B
61 ("$(2!F(B" (?e "$(2!A(B") (?u "$(2!B(B") (?i "$(2!C(B") (?a "$(2!D(B") (?E "$(2!E(B") (?o "$(2!G(B") (?| "$(2!F(B")
62 (?W "$(2!H(B" (?a "$(2!H(B")
63 (?e "$(2!F#L(B") (?u "$(2!F#M(B") (?i "$(2!F#N(B") (?E "$(2!F#P(B") (?' "$(2!F#M(B")))
64 ;;; C
65 ("$(2"8(B" (?e "$(2"3(B") (?u "$(2"4(B") (?i "$(2"5(B") (?a "$(2"6(B") (?E "$(2"7(B") (?o "$(2"9(B") (?| "$(2"8(B")
66 (?W "$(2":(B" (?a "$(2":(B")
67 (?e "$(2"8#L(B") (?u "$(2"8#M(B") (?i "$(2"8#N(B") (?E "$(2"8#P(B") (?' "$(2"8#M(B")))
68 ;;; D
69 ("$(2$0(B" (?e "$(2$+(B") (?u "$(2$,(B") (?i "$(2$-(B") (?a "$(2$.(B") (?E "$(2$/(B") (?o "$(2$1(B") (?| "$(2$0(B"))
70 ;;; E
71 ("$(2"W(B" (?2 "$(2#c(B"))
72 ;;; F
73 ("$(2"@(B" (?e "$(2";(B") (?u "$(2"<(B") (?i "$(2"=(B") (?a "$(2">(B") (?E "$(2"?(B") (?o "$(2"A(B") (?| "$(2"@(B")
74 (?W "$(2"B(B" (?a "$(2"B(B")
75 (?e "$(2"@#L(B") (?u "$(2"@#M(B") (?i "$(2"@#N(B") (?E "$(2"@#P(B") (?' "$(2"@#M(B")))
76 ;;; G
77 ("$(2$>(B" (?e "$(2$9(B") (?u "$(2$:(B") (?i "$(2$;(B") (?a "$(2$<(B") (?E "$(2$=(B") (?o "$(2$?(B") (?| "$(2$>(B"))
78 ;;; H
79 ("$(2$"(B" (?e "$(2#{(B") (?u "$(2#|(B") (?i "$(2#}(B") (?a "$(2#~(B") (?E "$(2$!(B") (?o "$(2$#(B") (?| "$(2$"(B"))
80 ;;; I
81 ("$(2"X(B" (?2 "$(2#d(B"))
82 ;;; J
83 ("$(2$7(B" (?e "$(2$2(B") (?u "$(2$3(B") (?i "$(2$4(B") (?a "$(2$5(B") (?E "$(2$6(B") (?o "$(2$8(B") (?| "$(2$7(B"))
84 ;;; K
85 ("$(2"x(B" (?e "$(2"s(B") (?u "$(2"t(B") (?i "$(2"u(B") (?a "$(2"v(B") (?E "$(2"w(B") (?o "$(2"y(B") (?| "$(2"x(B")
86 (?W "$(2"{(B" (?e "$(2"z(B") (?u "$(2"{(B") (?i "$(2"|(B") (?a "$(2"}(B") (?E "$(2"~(B")))
87 ;;; L
88 ("$(2!&(B" (?e "$(2!!(B") (?u "$(2!"(B") (?i "$(2!#(B") (?a "$(2!$(B") (?E "$(2!%(B") (?o "$(2!'(B") (?| "$(2!&(B")
89 (?W "$(2!((B" (?a "$(2!((B")
90 (?e "$(2!&#L(B") (?u "$(2!&#M(B") (?i "$(2!&#N(B") (?E "$(2!&#P(B") (?' "$(2!&#M(B")))
91 ;;; M
92 ("$(2!.(B" (?e "$(2!)(B") (?u "$(2!*(B") (?i "$(2!+(B") (?a "$(2!,(B") (?E "$(2!-(B") (?o "$(2!/(B") (?| "$(2!.(B")
93 (?W "$(2!0(B" (?a "$(2!0(B")
94 (?e "$(2!.#L(B") (?u "$(2!.#M(B") (?i "$(2!.#N(B") (?E "$(2!.#P(B") (?' "$(2!.#M(B")))
95 ;;; N
96 ("$(2!n(B" (?e "$(2!i(B") (?u "$(2!j(B") (?i "$(2!k(B") (?a "$(2!l(B") (?E "$(2!m(B") (?o "$(2!o(B") (?| "$(2!n(B")
97 (?W "$(2!p(B" (?a "$(2!p(B")
98 (?e "$(2!n#L(B") (?u "$(2!n#M(B") (?i "$(2!n#N(B") (?E "$(2!n#P(B") (?' "$(2!n#M(B")))
99 ;;; O
100 ("$(2"Y(B" (?2 "$(2#e(B"))
101 ;;; P
102 ("$(2$E(B" (?e "$(2$@(B") (?u "$(2$A(B") (?i "$(2$B(B") (?a "$(2$C(B") (?E "$(2$D(B") (?o "$(2$F(B") (?| "$(2$E(B"))
103 ;;; Q
104 ("$(2#2(B" (?e "$(2#-(B") (?u "$(2#.(B") (?i "$(2#/(B") (?a "$(2#0(B") (?E "$(2#1(B") (?o "$(2#3(B") (?| "$(2#2(B")
105 (?W "$(2#5(B" (?e "$(2#4(B") (?u "$(2#5(B") (?i "$(2#6(B") (?a "$(2#7(B") (?E "$(2#8(B")))
106 ;;; R
107 ("$(2!6(B" (?e "$(2!1(B") (?u "$(2!2(B") (?i "$(2!3(B") (?a "$(2!4(B") (?E "$(2!5(B") (?o "$(2!7(B") (?| "$(2!6(B")
108 (?W "$(2!8(B" (?a "$(2!8(B")
109 (?e "$(2!6#L(B") (?u "$(2!6#M(B") (?i "$(2!6#N(B") (?E "$(2!6#P(B") (?' "$(2!6#M(B")))
110 ;;; S
111 ("$(2"P(B" (?e "$(2"K(B") (?u "$(2"L(B") (?i "$(2"M(B") (?a "$(2"N(B") (?E "$(2"O(B") (?o "$(2"Q(B") (?| "$(2"P(B")
112 (?W "$(2"R(B" (?a "$(2"R(B")
113 (?e "$(2"P#L(B") (?u "$(2"P#M(B") (?i "$(2"P#N(B") (?E "$(2"P#P(B") (?' "$(2"P#M(B"))
114 (?2 "$(2#](B" (?| "$(2#](B")
115 (?e "$(2#X(B") (?u "$(2#Y(B") (?i "$(2#Z(B") (?a "$(2#[(B") (?E "$(2#\(B") (?o "$(2#^(B")
116 (?W "$(2"R(B"
117 (?a "$(2"R(B")
118 (?e "$(2#]#L(B") (?u "$(2#]#M(B") (?i "$(2#]#N(B") (?E "$(2#]#P(B") (?' "$(2#]#M(B"))))
119
120 ;;; T
121 ("$(2"0(B" (?e "$(2"+(B") (?u "$(2",(B") (?i "$(2"-(B") (?a "$(2".(B") (?E "$(2"/(B") (?o "$(2"1(B") (?| "$(2"0(B")
122 (?W "$(2"2(B" (?a "$(2"2(B")
123 (?e "$(2"0#L(B") (?u "$(2"0#M(B") (?i "$(2"0#N(B") (?E "$(2"0#P(B") (?' "$(2"0#M(B")))
124 ;;; U
125 ("$(2"T(B" (?2 "$(2#`(B"))
126 ;;; V
127 ("$(2!N(B" (?e "$(2!I(B") (?u "$(2!J(B") (?i "$(2!K(B") (?a "$(2!L(B") (?E "$(2!M(B") (?o "$(2!O(B") (?| "$(2!N(B")
128 (?W "$(2!P(B" (?a "$(2!P(B")
129 (?e "$(2!N#L(B") (?u "$(2!N#M(B") (?i "$(2!N#N(B") (?E "$(2!N#P(B") (?' "$(2!N#M(B")))
130 ;;; W
131 ("$(2#M(B" (?e "$(2#L(B") (?u "$(2#M(B") (?i "$(2#N(B") (?a "$(2#O(B") (?E "$(2#P(B"))
132 ;;; X
133 ("$(2#y(B" (?e "$(2#t(B") (?u "$(2#u(B") (?i "$(2#v(B") (?a "$(2#w(B") (?E "$(2#x(B") (?o "$(2#z(B") (?| "$(2#y(B"))
134 ;;; Y
135 ("$(2$)(B" (?e "$(2$$(B") (?u "$(2$%(B") (?i "$(2$&(B") (?a "$(2$'(B") (?E "$(2$((B") (?o "$(2$*(B") (?| "$(2$)(B"))
136 ;;; Z
137 ("$(2!~(B" (?e "$(2!y(B") (?u "$(2!z(B") (?i "$(2!{(B") (?a "$(2!|(B") (?E "$(2!}(B") (?o "$(2"!(B") (?| "$(2!~(B")
138 (?W "$(2""(B" (?a "$(2""(B")
139 (?e "$(2!~#L(B") (?u "$(2!~#M(B") (?i "$(2!~#N(B") (?E "$(2!~#P(B") (?' "$(2!~#M(B")))
140 ;;; [ \ ] ^ _
141 nil nil nil nil nil
142 ;;; `
143 ("`"
144 (?e "$(2#_(B") (?u "$(2#`(B") (?U "$(2#`(B") (?i "$(2#a(B") (?a "$(2#b(B") (?A "$(2#b(B")
145 (?E "$(2#c(B") (?I "$(2#d(B") (?o "$(2#e(B") (?O "$(2#e(B")
146 (?s "$(2#V(B"
147 (?e "$(2#Q(B") (?u "$(2#R(B") (?i "$(2#S(B") (?a "$(2#T(B") (?E "$(2#U(B") (?o "$(2#W(B") (?| "$(2#V(B")
148 (?W "$(2"J(B" (?a "$(2"J(B")
149 (?e "$(2#V#L(B") (?u "$(2#V#M(B") (?i "$(2#V#N(B") (?E "$(2#V#P(B") (?' "$(2#V#M(B")))
150 (?S "$(2#](B"
151 (?e "$(2#X(B") (?u "$(2#Y(B") (?i "$(2#Z(B") (?a "$(2#[(B") (?E "$(2#\(B") (?o "$(2#^(B") (?| "$(2#](B")
152 (?W "$(2"R(B" (?a "$(2"R(B")
153 (?e "$(2#]#L(B") (?u "$(2#]#M(B") (?i "$(2#]#N(B") (?E "$(2#]#P(B") (?' "$(2#]#M(B")))
154 (?h "$(2#k(B"
155 (?e "$(2#f(B") (?u "$(2#g(B") (?i "$(2#h(B") (?a "$(2#i(B") (?E "$(2#j(B") (?o "$(2#l(B") (?| "$(2#k(B")
156 (?W "$(2"c(B" (?e "$(2"b(B") (?u "$(2"c(B") (?i "$(2"d(B") (?a "$(2"e(B") (?E "$(2"f(B")))
157 (?k "$(2#r(B"
158 (?e "$(2#m(B") (?u "$(2#n(B") (?i "$(2#o(B") (?a "$(2#p(B") (?E "$(2#q(B") (?o "$(2#s(B") (?| "$(2#r(B")))
159 ;;; a
160 ("$(2"S(B" (?2 "$(2#b(B"))
161
162 ;;; b
163 ("$(2!F(B" (?e "$(2!A(B") (?u "$(2!B(B") (?i "$(2!C(B") (?a "$(2!D(B") (?E "$(2!E(B") (?o "$(2!G(B") (?| "$(2!F(B")
164 (?W "$(2!H(B" (?a "$(2!H(B")
165 (?e "$(2!F#L(B") (?u "$(2!F#M(B") (?i "$(2!F#N(B") (?E "$(2!F#P(B") (?' "$(2!F#M(B")))
166 ;;; c
167 ("$(2!^(B" (?e "$(2!Y(B") (?u "$(2!Z(B") (?i "$(2![(B") (?a "$(2!\(B") (?E "$(2!](B") (?o "$(2!_(B") (?| "$(2!^(B")
168 (?W "$(2!`(B" (?a "$(2!`(B")
169 (?e "$(2!^#L(B") (?u "$(2!^#M(B") (?i "$(2!^#N(B") (?E "$(2!^#P(B") (?' "$(2!^#M(B")))
170 ;;; d
171 ("$(2"((B" (?e "$(2"#(B") (?u "$(2"$(B") (?i "$(2"%(B") (?a "$(2"&(B") (?E "$(2"'(B") (?o "$(2")(B") (?| "$(2"((B")
172 (?W "$(2"*(B" (?a "$(2"*(B")
173 (?e "$(2"(#L(B") (?u "$(2"(#M(B") (?i "$(2"(#N(B") (?E "$(2"(#P(B") (?' "$(2"(#M(B")))
174 ;;; e
175 ("$(2"S(B" (?2 "$(2#_(B") (?3 "$(2"Z(B"))
176 ;;; f
177 ("$(2"@(B" (?e "$(2";(B") (?u "$(2"<(B") (?i "$(2"=(B") (?a "$(2">(B") (?E "$(2"?(B") (?o "$(2"A(B") (?| "$(2"@(B")
178 (?W "$(2"B(B" (?a "$(2"B(B")
179 (?e "$(2"@#L(B") (?u "$(2"@#M(B") (?i "$(2"@#N(B") (?E "$(2"@#P(B") (?' "$(2"@#M(B")))
180 ;;; g
181 ("$(2#>(B" (?e "$(2#9(B") (?u "$(2#:(B") (?i "$(2#;(B") (?a "$(2#<(B") (?E "$(2#=(B") (?o "$(2#?(B") (?| "$(2#>(B")
182 (?W "$(2#A(B" (?e "$(2#@(B") (?u "$(2#A(B") (?i "$(2#B(B") (?a "$(2#C(B") (?E "$(2#D(B")))
183 ;;; h
184 ("$(2"`(B" (?e "$(2"[(B") (?u "$(2"\(B") (?i "$(2"](B") (?a "$(2"^(B") (?E "$(2"_(B") (?o "$(2"a(B") (?| "$(2"`(B")
185 (?W "$(2"c(B" (?e "$(2"b(B") (?u "$(2"c(B") (?i "$(2"d(B") (?a "$(2"e(B") (?E "$(2"f(B"))
186 (?2 "$(2#k(B" (?e "$(2#f(B") (?u "$(2#g(B") (?i "$(2#h(B") (?a "$(2#i(B") (?E "$(2#j(B") (?o "$(2#l(B")
187 (?| "$(2#k(B")
188 (?W "$(2"c(B" (?e "$(2"b(B") (?u "$(2"c(B") (?i "$(2"d(B") (?a "$(2"e(B") (?E "$(2"f(B"))))
189 ;;; i
190 ("$(2"U(B" (?2 "$(2#a(B"))
191 ;;; j
192 ("$(2$7(B" (?e "$(2$2(B") (?u "$(2$3(B") (?i "$(2$4(B") (?a "$(2$5(B") (?E "$(2$6(B") (?o "$(2$8(B") (?| "$(2$7(B"))
193 ;;; k
194 ("$(2"l(B" (?e "$(2"g(B") (?u "$(2"h(B") (?i "$(2"i(B") (?a "$(2"j(B") (?E "$(2"k(B") (?o "$(2"m(B") (?| "$(2"l(B")
195 (?W "$(2"o(B" (?e "$(2"n(B") (?u "$(2"o(B") (?i "$(2"p(B") (?a "$(2"q(B") (?E "$(2"r(B"))
196 (?2 "$(2#r(B" (?e "$(2#m(B") (?u "$(2#n(B") (?i "$(2#o(B") (?a "$(2#p(B") (?E "$(2#q(B") (?o "$(2#s(B")
197 (?| "$(2#r(B")))
198 ;;; l
199 ("$(2!&(B" (?e "$(2!!(B") (?u "$(2!"(B") (?i "$(2!#(B") (?a "$(2!$(B") (?E "$(2!%(B") (?o "$(2!'(B") (?| "$(2!&(B")
200 (?W "$(2!((B" (?a "$(2!((B")
201 (?e "$(2!&#L(B") (?u "$(2!&#M(B") (?i "$(2!&#N(B") (?E "$(2!&#P(B") (?' "$(2!&#M(B")))
202 ;;; m
203 ("$(2!.(B" (?e "$(2!)(B") (?u "$(2!*(B") (?i "$(2!+(B") (?a "$(2!,(B") (?E "$(2!-(B") (?o "$(2!/(B") (?| "$(2!.(B")
204 (?W "$(2!0(B" (?a "$(2!0(B")
205 (?e "$(2!.#L(B") (?u "$(2!.#M(B") (?i "$(2!.#N(B") (?E "$(2!.#P(B") (?' "$(2!.#M(B")))
206 ;;; n
207 ("$(2!f(B" (?e "$(2!a(B") (?u "$(2!b(B") (?i "$(2!c(B") (?a "$(2!d(B") (?E "$(2!e(B") (?o "$(2!g(B") (?| "$(2!f(B")
208 (?W "$(2!h(B" (?a "$(2!h(B")
209 (?e "$(2!f#L(B") (?u "$(2!f#M(B") (?i "$(2!f#N(B") (?E "$(2!f#P(B") (?' "$(2!f#M(B")))
210 ;;; o
211 ("$(2"Y(B" (?2 "$(2#e(B"))
212 ;;; p
213 ("$(2$L(B" (?e "$(2$G(B") (?u "$(2$H(B") (?i "$(2$I(B") (?a "$(2$J(B") (?E "$(2$K(B") (?o "$(2$M(B") (?| "$(2$L(B"))
214 ;;; q
215 ("$(2#&(B" (?e "$(2#!(B") (?u "$(2#"(B") (?i "$(2##(B") (?a "$(2#$(B") (?E "$(2#%(B") (?o "$(2#'(B") (?| "$(2#&(B")
216 (?W "$(2#)(B" (?e "$(2#((B") (?u "$(2#)(B") (?i "$(2#*(B") (?a "$(2#+(B") (?E "$(2#,(B")))
217 ;;; r
218 ("$(2!6(B" (?e "$(2!1(B") (?u "$(2!2(B") (?i "$(2!3(B") (?a "$(2!4(B") (?E "$(2!5(B") (?o "$(2!7(B") (?| "$(2!6(B")
219 (?W "$(2!8(B" (?a "$(2!8(B")
220 (?e "$(2!6#L(B") (?u "$(2!6#M(B") (?i "$(2!6#N(B") (?E "$(2!6#P(B") (?' "$(2!6#M(B")))
221 ;;; s
222 ("$(2"H(B" (?e "$(2"C(B") (?u "$(2"D(B") (?i "$(2"E(B") (?a "$(2"F(B") (?E "$(2"G(B") (?o "$(2"I(B") (?| "$(2"H(B")
223 (?W "$(2"J(B" (?a "$(2"J(B")
224 (?e "$(2"H#L(B") (?u "$(2"H#M(B") (?i "$(2"H#N(B") (?E "$(2"H#P(B") (?' "$(2"H#M(B"))
225 (?2 "$(2#V(B" (?e "$(2#Q(B") (?u "$(2#R(B") (?i "$(2#S(B") (?a "$(2#T(B") (?E "$(2#U(B") (?o "$(2#W(B")
226 (?| "$(2#V(B")
227 (?W "$(2"J(B" (?a "$(2"J(B")
228 (?e "$(2#V#L(B") (?u "$(2#V#M(B") (?i "$(2#V#N(B") (?E "$(2#V#P(B")
229 (?' "$(2#V#M(B"))))
230 ;;; t
231 ("$(2!V(B" (?e "$(2!Q(B") (?u "$(2!R(B") (?i "$(2!S(B") (?a "$(2!T(B") (?E "$(2!U(B") (?o "$(2!W(B") (?| "$(2!V(B")
232 (?W "$(2!X(B" (?a "$(2!X(B")
233 (?e "$(2!V#L(B") (?u "$(2!V#M(B") (?i "$(2!V#N(B") (?E "$(2!V#P(B") (?' "$(2!V#M(B")))
234 ;;; u
235 ("$(2"T(B" (?2 "$(2#`(B"))
236 ;;; v
237 ("$(2!N(B" (?e "$(2!I(B") (?u "$(2!J(B") (?i "$(2!K(B") (?a "$(2!L(B") (?E "$(2!M(B") (?o "$(2!O(B") (?| "$(2!N(B")
238 (?W "$(2!P(B" (?a "$(2!P(B")
239 (?e "$(2!N#L(B") (?u "$(2!N#M(B") (?i "$(2!N#N(B") (?E "$(2!N#P(B") (?' "$(2!N#M(B")))
240 ;;; w
241 ("$(2#J(B" (?e "$(2#E(B") (?u "$(2#F(B") (?i "$(2#G(B") (?a "$(2#H(B") (?E "$(2#I(B") (?o "$(2#K(B") (?| "$(2#J(B")
242 (?W "$(2#M(B" (?e "$(2#L(B") (?u "$(2#M(B") (?i "$(2#N(B") (?a "$(2#O(B") (?E "$(2#P(B")))
243 ;;; x
244 ("$(2!>(B" (?e "$(2!9(B") (?u "$(2!:(B") (?i "$(2!;(B") (?a "$(2!<(B") (?E "$(2!=(B") (?o "$(2!?(B") (?| "$(2!>(B")
245 (?W "$(2!@(B" (?a "$(2!@(B")
246 (?e "$(2!>#L(B") (?u "$(2!>#M(B") (?i "$(2!>#N(B") (?E "$(2!>#P(B") (?' "$(2!>#M(B")))
247 ;;; y
248 ("$(2$)(B" (?e "$(2$$(B") (?u "$(2$%(B") (?i "$(2$&(B") (?a "$(2$'(B") (?E "$(2$((B") (?o "$(2$*(B") (?| "$(2$)(B"))
249 ;;; z
250 ("$(2!v(B" (?e "$(2!q(B") (?u "$(2!r(B") (?i "$(2!s(B") (?a "$(2!t(B") (?E "$(2!u(B") (?o "$(2!w(B") (?| "$(2!v(B")
251 (?W "$(2!x(B" (?a "$(2!x(B")
252 (?e "$(2!v#L(B") (?u "$(2!v#M(B") (?i "$(2!v#N(B") (?E "$(2!v#P(B") (?' "$(2!v#M(B")))
253 ])
254
255 ;;;###autoload
256 (defun sera-to-fidel-region (beg end &optional ascii-mode force)
257 "Translates the characters in region from SERA to FIDEL.
258
259 If the 1st optional parameter ASCII-MODE is non-NIL, assumes that the
260 region begins in ASCII script.
261
262 If the 2nd optional parametr FORCE is non-NIL, translates even if the
263 buffer is read-only."
264
265 (interactive "r\nP")
266 (save-excursion
267 (save-restriction
268 (narrow-to-region beg end)
269 (sera-to-fidel-buffer ascii-mode force))))
270
271 ;;;###autoload
272 (defun sera-to-fidel-buffer (&optional ascii-mode force)
273 "Translates the current buffer from SERA to FIDEL.
274
275 If the 1st optional parameter ASCII-MODE is non-NIL, assumes that the
276 current buffer begins in ASCII script.
277
278 If the 2nd optional panametr FORCE is non-NIL, translates even if the
279 buffer is read-only."
280
281 (interactive "P")
282 (if (and buffer-read-only
283 (not force)
284 (not (y-or-n-p "Buffer is read-only. Force to convert? ")))
285 (error ""))
286 (let (start pre fol hard table table2 (buffer-read-only nil))
287 (goto-char (point-min))
288 (while (not (eobp))
289 (setq start (point))
290 (forward-char 1)
291 (setq pre (preceding-char)
292 fol (following-char))
293
294 (if ascii-mode
295 (cond
296
297 ;; ascii mode, pre != \
298 ((/= pre ?\\ ))
299
300 ;; ascii mode, pre = \, fol = !
301 ((= fol ?!)
302 (backward-delete-char 1)
303 (delete-char 1)
304 (setq ascii-mode nil
305 hard (not hard)))
306
307 ;; hard ascii mode, pre = \, fol != !
308 (hard)
309
310 ;; soft ascii mode, pre = \, fol = {\ _ * < > 0..9 ~}
311 ((or (backward-delete-char 1) ; always nil
312 (eobp)
313 (sera-to-fidel-backslash)))
314
315 ;; soft ascii mode, pre = \, fol = SPC
316 ((= fol 32)
317 (delete-char 1)
318 (setq ascii-mode nil))
319
320 ;; soft ascii mode, pre = \, fol = .
321 ((= fol ?.)
322 (delete-char 1)
323 (insert ?$(2$P(B))
324
325 ;; soft ascii mode, pre = \, fol = ,
326 ((= fol ?,)
327 (delete-char 1)
328 (insert ?$(2$Q(B))
329
330 ;; soft ascii mode, pre = \, fol = ;
331 ((= fol ?\;)
332 (delete-char 1)
333 (insert ?$(2$R(B))
334
335 ;; soft ascii mode, pre = \, fol = :
336 ((= fol ?:)
337 (delete-char 1)
338 (insert ?$(2$S(B))
339
340 ;; soft ascii mode, pre = \, fol = others
341 (t
342 (setq ascii-mode nil)))
343
344 (cond
345
346 ;; very special: skip "<" to ">" (or "&" to ";") if in w3-mode
347 ((and (boundp 'sera-being-called-by-w3)
348 sera-being-called-by-w3
349 (or (= pre ?<) (= pre ?&)))
350 (search-forward (if (= pre ?<) ">" ";")
351 nil 0))
352
353 ;; ethio mode, pre != sera
354 ((or (< pre ?') (> pre ?z)))
355
356 ;; ethio mode, pre != \
357 ((/= pre ?\\ )
358 (setq table (aref sera-to-fidel-table pre))
359 (while (setq table2 (cdr (assoc (following-char) table)))
360 (setq table table2)
361 (forward-char 1))
362 (if (car table)
363 (progn
364 (delete-region start (point))
365 (insert (car table)))))
366
367 ;; ethio mode, pre = \, fol = !
368 ((= fol ?!)
369 (backward-delete-char 1)
370 (delete-char 1)
371 (setq ascii-mode t
372 hard (not hard)))
373
374 ;; hard ethio mode, pre = \, fol != !
375 (hard)
376
377 ;; soft ethio mode, pre = \, fol = {\ _ * < > 0..9 ~}
378 ((or (backward-delete-char 1) ; always nil
379 (eobp)
380 (sera-to-fidel-backslash)))
381
382 ;; soft ethio mode, pre = \, fol = SPC
383 ((= fol 32)
384 (delete-char 1)
385 (setq ascii-mode t))
386
387 ;; soft ethio mode, pre = \, fol = {. , ; : | ' `}
388 ((memq fol '(?. ?, ?\; ?: ?| ?' ?`))
389 (forward-char 1))
390
391 ;; soft ethio mode, pre = \, fol = others
392 (t
393 (setq ascii-mode t))))))
394 (goto-char (point-min)))
395
396 (defun sera-to-fidel-backslash nil
397 "Handle SERA backslash escapes common to ethio- and ascii-mode.
398 Returns t if something has been processed."
399 (let ((ch (following-char))
400 (converted t))
401 (if (and (>= ch ?1) (<= ch ?9))
402 (ethio-convert-digit)
403 (delete-char 1)
404 (cond
405 ((= ch ?\\ )
406 (insert ?\\ ))
407 ((= ch ?_)
408 (insert ?$(2$O(B))
409 ((= ch ?*)
410 (insert ?$(2$T(B))
411 ((= ch ?<)
412 (insert ?$(2$U(B))
413 ((= ch ?>)
414 (insert ?$(2$V(B))
415 ((= ch ?~)
416 (setq ch (following-char))
417 (delete-char 1)
418 (cond
419 ((= ch ?e)
420 (insert "$(2$k(B"))
421 ((= ch ?E)
422 (insert "$(2$l(B"))
423 ((= ch ?a)
424 (insert "$(2$m(B"))
425 ((= ch ?A)
426 (insert "$(2$n(B"))))
427 (t
428 (insert ch)
429 (backward-char 1)
430 (setq converted nil))))
431 converted))
432
433 (defun ethio-convert-digit nil
434 "Convert Arabic digits to Ethiopic digits."
435 (let (ch z)
436 (while (and (>= (setq ch (following-char)) ?1)
437 (<= ch ?9))
438 (delete-char 1)
439
440 ;; count up following zeros
441 (setq z 0)
442 (while (= (following-char) ?0)
443 (delete-char 1)
444 (setq z (1+ z)))
445
446 (cond
447
448 ;; first digit is 10, 20, ..., or 90
449 ((= (mod z 2) 1)
450 ;; (- ch 40) means ?1 -> 9, ?2 -> 10, etc.
451 (insert (aref [?$(2$`(B ?$(2$a(B ?$(2$b(B ?$(2$c(B ?$(2$d(B ?$(2$e(B ?$(2$f(B ?$(2$g(B ?$(2$h(B] (- ch ?1)))
452 (setq z (1- z)))
453
454 ;; first digit is 2, 3, ..., or 9
455 ((/= ch ?1)
456 (insert (aref [?$(2$X(B ?$(2$Y(B ?$(2$Z(B ?$(2$[(B ?$(2$\(B ?$(2$](B ?$(2$^(B ?$(2$_(B] (- ch ?2))))
457
458 ;; single 1
459 ((= z 0)
460 (insert "$(2$W(B")))
461
462 ;; 100
463 (if (= (mod z 4) 2)
464 (insert"$(2$i(B"))
465
466 ;; 10000
467 (insert-char ?$(2$j(B (/ z 4)))))
468
469 ;;;###autoload
470 (defun sera-to-fidel-mail (&optional arg)
471 "Does SERA to FIDEL conversion for reading/writing mail and news.
472
473 If the buffer contains the markers \"<sera>\" and \"</sera>\",
474 converts the segment between the two markers in Ethio start mode and
475 the subject field in ASCII start mode.
476
477 If invoked interactively and there is no marker, converts both the
478 whole body and the subject field in Ethio start mode.
479
480 For backward compatibility, \"<ethiopic>\" and \"<>\" can be used instead of
481 \"<sera>\" and \"</sera>\"."
482
483 (interactive "p")
484 (let* ((buffer-read-only nil) border)
485
486 (save-excursion
487 (goto-char (point-min))
488 (setq border
489 (search-forward
490 (if (eq major-mode 'rmail-mode)
491 "\n\n"
492 (concat "\n" mail-header-separator "\n"))))
493
494 (cond
495
496 ;; with markers
497 ((re-search-forward "^<sera>\n" nil t)
498 (goto-char (match-beginning 0))
499 (while (re-search-forward "^<sera>\n" nil t)
500 (replace-match "" nil t)
501 (sera-to-fidel-region
502 (point)
503 (progn
504 (if (re-search-forward "^</sera>\n" nil 0)
505 (replace-match "" nil t))
506 (point))))
507
508 (goto-char (point-min))
509 (if (re-search-forward "^Subject: " border t)
510 (sera-to-fidel-region
511 (point)
512 (progn (end-of-line) (point))
513 'ascii-start)))
514
515 ;; backward compatibility
516 ((re-search-forward "^<ethiopic>\n" nil t)
517 (goto-char (match-beginning 0))
518 (while (re-search-forward "^<ethiopic>\n" nil t)
519 (replace-match "" nil t)
520 (sera-to-fidel-region
521 (setq border (point))
522 (progn
523 (if (re-search-forward "^<>\n" nil 0)
524 (replace-match "" nil t))
525 (point))))
526
527 (goto-char (point-min))
528 (if (re-search-forward "^Subject: " border t)
529 (sera-to-fidel-region
530 (point)
531 (progn (end-of-line) (point))
532 'ascii-start)))
533
534 ;; interactive & no markers
535 (arg
536 (sera-to-fidel-region border (point-max))
537 (goto-char (point-min))
538 (if (re-search-forward "^Subject: " border t)
539 (sera-to-fidel-region
540 (point)
541 (progn (end-of-line) (point))))))
542
543 ;; adjust the rmail marker
544 (if (eq major-mode 'rmail-mode)
545 (set-marker
546 (aref rmail-message-vector (1+ rmail-current-message))
547 (point-max))))))
548
549 ;;;###autoload
550 (defun sera-to-fidel-marker nil
551 "If the buffer contains the markers \"<sera>\" and \"</sera>\",
552 converts the segment between the two markers from SERA to Fidel
553 in Ethio start mode. The markers will not be removed."
554
555 (interactive)
556 (if (and buffer-read-only
557 (not (y-or-n-p "Buffer is read-only. Force to convert? ")))
558 (error ""))
559 (save-excursion
560 (goto-char (point-min))
561 (while (re-search-forward "<sera>" nil t)
562 (sera-to-fidel-region
563 (point)
564 (if (re-search-forward "</sera>" nil t)
565 (match-beginning 0)
566 (point-max))
567 nil
568 'force))))
569
570 ;;
571 ;; FIDEL to SERA
572 ;;
573
574 (defconst fidel-to-sera-map
575 ["le" "lu" "li" "la" "lE" "l" "lo" "lWa"
576 "me" "mu" "mi" "ma" "mE" "m" "mo" "mWa"
577 "re" "ru" "ri" "ra" "rE" "r" "ro" "rWa"
578 "xe" "xu" "xi" "xa" "xE" "x" "xo" "xWa"
579 "be" "bu" "bi" "ba" "bE" "b" "bo" "bWa"
580 "ve" "vu" "vi" "va" "vE" "v" "vo" "vWa"
581 "te" "tu" "ti" "ta" "tE" "t" "to" "tWa"
582 "ce" "cu" "ci" "ca" "cE" "c" "co" "cWa"
583 "ne" "nu" "ni" "na" "nE" "n" "no" "nWa"
584 "Ne" "Nu" "Ni" "Na" "NE" "N" "No" "NWa"
585 "ze" "zu" "zi" "za" "zE" "z" "zo" "zWa"
586 "Ze" "Zu" "Zi" "Za" "ZE" "Z" "Zo" "ZWa"
587 "de" "du" "di" "da" "dE" "d" "do" "dWa"
588 "Te" "Tu" "Ti" "Ta" "TE" "T" "To" "TWa"
589 "Ce" "Cu" "Ci" "Ca" "CE" "C" "Co" "CWa"
590 "fe" "fu" "fi" "fa" "fE" "f" "fo" "fWa"
591 "se" "su" "si" "sa" "sE" "s" "so" "sWa"
592 "Se" "Su" "Si" "Sa" "SE" "S" "So" "SWa"
593 "a" "u" "i" "A" "E" "I" "o" "e3"
594 "he" "hu" "hi" "ha" "hE" "h" "ho" "hWe" "hWu" "hWi" "hWa" "hWE"
595 "ke" "ku" "ki" "ka" "kE" "k" "ko" "kWe" "kWu" "kWi" "kWa" "kWE"
596 "Ke" "Ku" "Ki" "Ka" "KE" "K" "Ko" "KWe" "KWu" "KWi" "KWa" "KWE"
597 "qe" "qu" "qi" "qa" "qE" "q" "qo" "qWe" "qWu" "qWi" "qWa" "qWE"
598 "Qe" "Qu" "Qi" "Qa" "QE" "Q" "Qo" "QWe" "QWu" "QWi" "QWa" "QWE"
599 "ge" "gu" "gi" "ga" "gE" "g" "go" "gWe" "gWu" "gWi" "gWa" "gWE"
600 "we" "wu" "wi" "wa" "wE" "w" "wo" "wWe" "wWu" "wWi" "wWa" "wWE"
601 "`se" "`su" "`si" "`sa" "`sE" "`s" "`so"
602 "`Se" "`Su" "`Si" "`Sa" "`SE" "`S" "`So"
603 "`e" "`u" "`i" "`a" "`E" "`I" "`o"
604 "`he" "`hu" "`hi" "`ha" "`hE" "`h" "`ho"
605 "`ke" "`ku" "`ki" "`ka" "`kE" "`k" "`ko"
606 "Xe" "Xu" "Xi" "Xa" "XE" "X" "Xo"
607 "He" "Hu" "Hi" "Ha" "HE" "H" "Ho"
608 "ye" "yu" "yi" "ya" "yE" "y" "yo"
609 "De" "Du" "Di" "Da" "DE" "D" "Do"
610 "je" "ju" "ji" "ja" "jE" "j" "jo"
611 "Ge" "Gu" "Gi" "Ga" "GE" "G" "Go"
612 "Pe" "Pu" "Pi" "Pa" "PE" "P" "Po"
613 "pe" "pu" "pi" "pa" "pE" "p" "po"
614 " " "\\_" "." "," ";" ":" "\\*" "\\<" "\\>"
615 "1" "2" "3" "4" "5" "6" "7" "8" "9"
616 "10" "20" "30" "40" "50" "60" "70" "80" "90"
617 "100" "10000"
618 "\\~e" "\\~E" "\\~a" "\\~A"])
619
620 (defvar ethio-use-tigrigna-style nil
621 "*If non-NIL, use \"e\" instead of \"a\" for the first lone vowel
622 translation in sera-to-fidel and fidel-to-sera conversions.")
623
624 (defvar ethio-quote-vowel-always nil
625 "*If non-NIL, lone vowels are always transcribed by \"an apostrophe
626 + the vowel\" except at word initial. Otherwise, they are quoted by
627 an apostrophe only if the preceding Ethiopic character is a lone
628 consonant.")
629
630 (defvar ethio-W-sixth-always nil
631 "*If non-NIL, the Wu-form of a 12-form consonant is transcribed by
632 \"W'\" instead of \"Wu\".")
633
634 (defvar ethio-numeric-reduction 0
635 "*Degree of reduction in transcribing Ethiopic digits by Arabic
636 digits. For example, $(2$`$_$i$g$](B ({10}{9}{100}{80}{7}) will be
637 transcribed by:
638 \10\9\100\80\7 if ETHIO-NUMERIC-REDUCTION is 0,
639 \109100807 is 1,
640 \10900807 is 2.")
641
642 ;;;###autoload
643 (defun fidel-to-sera-region (begin end &optional ascii-mode force)
644 "Replaces all the FIDEL characters in the region to sera format.
645
646 If the 1st optional parameter ASCII-MODE is non-NIL, converts the
647 region so that it begins in ASCII script.
648
649 If the 2nd optional parameter FORCE is non-NIL, converts even if the
650 buffer is read-only."
651
652 (interactive "r\nP")
653 (save-excursion
654 (save-restriction
655 (narrow-to-region begin end)
656 (fidel-to-sera-buffer ascii-mode force))))
657
658 ;;;###autoload
659 (defun fidel-to-sera-buffer (&optional ascii-mode force)
660 "Replace all the FIDEL characters in the current buffer to sera format.
661
662 If the 1st optional parameter ASCII-MODE is non-NIL,
663 convert the current buffer so that it begins in ASCII script.
664
665 If the 2nd optional parameter FORCE is non-NIL, converts even if the
666 buffer is read-only.
667
668 See also the description of the variables ethio-use-tigrigna-style,
669 ethio-quote-vowel-on-demand and ethio-numeric-reduction."
670
671 (interactive "P")
672 (if (and buffer-read-only
673 (not force)
674 (not (y-or-n-p "Buffer is read-only. Force to convert? ")))
675 (error ""))
676
677 ;; user's preference in transcription
678 (aset fidel-to-sera-map 144 (if ethio-use-tigrigna-style "e" "a"))
679 (let ((i 160)
680 (x (if ethio-W-sixth-always
681 '("hW'" "kW'" "KW'" "qW'" "QW'" "gW'" "wW'")
682 '("hWu" "kWu" "KWu" "qWu" "QWu" "gWu" "wWu"))))
683 (while x
684 (aset fidel-to-sera-map i (car x))
685 (setq i (+ i 12)
686 x (cdr x))))
687
688 ;; main conversion routine
689 (let ((lonec nil) ; if lonec = t, previous char was a lone consonant.
690 (fidel nil) ; if fidel = t, previous char was a fidel.
691 (digit nil) ; if digit = t, previous char was an Ethiopic digit.
692 (buffer-read-only nil)
693 ch)
694 (goto-char (point-min))
695 (while (not (eobp))
696 (setq ch (following-char))
697
698 ;; ethiopic charactes
699 (if (= (char-charset ch) 'ethiopic)
700 (progn
701 (setq ch (char-to-ethiocode ch))
702 (delete-char 1)
703
704 (cond
705
706 ;; fidels
707 ((<= ch 326)
708 (if ascii-mode
709 (insert "\\ "))
710 (if (and (memq ch '(144 145 146 147 148 150 151)) ; (auiAEoe3)
711 (or lonec
712 (and ethio-quote-vowel-always
713 fidel)))
714 (insert "'"))
715 (insert (aref fidel-to-sera-map ch))
716 (setq ascii-mode nil
717 lonec (ethio-lone-consonant-p ch)
718 fidel t
719 digit nil))
720
721 ;; punctuations and symbols
722 ((or (< ch 336) (> ch 355))
723 (if (and ascii-mode
724 (memq ch '(329 330 331 332))) ; (.,;:)
725 (insert "\\"))
726 (insert (aref fidel-to-sera-map ch))
727 (setq lonec nil
728 fidel nil
729 digit nil))
730
731 ;; now CH must be an ethiopic digit
732
733 ;; reduction = 0 or leading digit
734 ((or (= ethio-numeric-reduction 0)
735 (not digit))
736 (insert "\\" (aref fidel-to-sera-map ch))
737 (setq lonec nil
738 fidel nil
739 digit t))
740
741 ;; reduction = 2 and following 10s, 100s, 10000s
742 ((and (= ethio-numeric-reduction 2)
743 (memq ch '(345 354 355)))
744 (insert (substring (aref fidel-to-sera-map ch) 1))
745 (setq lonec nil
746 fidel nil
747 digit t))
748
749 ;; ordinary following digits
750 (t
751 (insert (aref fidel-to-sera-map ch))
752 (setq lonec nil
753 fidel nil
754 digit t))))
755
756 ;; non-ethiopic characters
757 (cond
758
759 ;; backslash is always quoted
760 ((= ch ?\\ )
761 (insert "\\"))
762
763 ;; nothing to do if in ascii-mode
764 (ascii-mode)
765
766 ;; ethio-mode -> ascii-mode
767 ((or (and (>= ch ?a) (<= ch ?z))
768 (and (>= ch ?A) (<= ch ?Z))
769 (memq ch '(?| ?' ?`)))
770 (insert "\\ ")
771 (setq ascii-mode t))
772
773 ;; ascii punctuations in ethio-mode
774 ((memq ch '(?. ?, ?\; ?:))
775 (insert "\\")))
776
777 (forward-char 1)
778 (setq lonec nil
779 fidel nil
780 digit nil)))
781
782 ;; a few modifications for readability
783 (goto-char (point-min))
784 (while (re-search-forward "\\([]!\"#$%&()*+/<=>?@[^_-]+\\)\\\\ " nil t)
785 (replace-match "\\\\ \\1"))
786
787 (goto-char (point-min))
788 (while (re-search-forward "\n\\([ \t]*\\)\\\\ " nil t)
789 (replace-match "\\\\\n\\1")))
790
791 (goto-char (point-min)))
792
793 (defun ethio-lone-consonant-p (code)
794 "If the ethiocode CODE is an Ethiopic lone consonant, return t."
795 (cond
796 ((< code 144)
797 (= (mod code 8) 5))
798 ((< code 153)
799 nil)
800 ((< code 236)
801 (= (mod code 12) 1))
802 ((< code 327)
803 (= (mod code 7) 3))))
804
805 ;;;###autoload
806 (defun fidel-to-sera-mail nil
807 "Does FIDEL to SERA conversion for reading/writing mail and news.
808
809 If the buffer contains at least one Ethiopic character,
810 1) inserts the string \"<sera>\" right after the header-body separator,
811 2) inserts \"</sera>\" at the end of the buffer,
812 3) converts the body into SERA in Ethiopic start mode, and
813 4) converts the subject field in ASCII start mode."
814
815 (interactive)
816 (save-excursion
817 (goto-char (point-min))
818 (if (re-search-forward "\\cE" nil t)
819 (let ((buffer-read-only nil) border)
820
821 (goto-char (point-min))
822 (setq border
823 (search-forward
824 (if (eq major-mode 'rmail-mode)
825 "\n\n"
826 (concat "\n" mail-header-separator "\n"))))
827 (insert "<sera>\n")
828
829 (fidel-to-sera-region (point) (point-max))
830
831 (goto-char (point-max))
832 (if (/= (preceding-char) ?\n)
833 (insert "\n"))
834 (insert "</sera>\n")
835
836 (goto-char (point-min))
837 (if (re-search-forward "^Subject: " border t)
838 (fidel-to-sera-region
839 (point)
840 (progn (end-of-line) (point))
841 'ascii-start))
842
843 ;; adjust the rmail marker
844 (if (eq major-mode 'rmail-mode)
845 (set-marker
846 (aref rmail-message-vector (1+ rmail-current-message))
847 (point-max))))
848
849 (message "No Ethiopic characters in this buffer."))))
850
851 ;;;###autoload
852 (defun fidel-to-sera-marker nil
853 "If the buffer contains the markers \"<sera>\" and \"</sera>\",
854 converts the segment between the two markers from Fidel to SERA
855 in Ethio start mode. The markers will not be removed."
856
857 (interactive)
858 (if (and buffer-read-only
859 (not (y-or-n-p "Buffer is read-only. Force to convert? ")))
860 (error ""))
861 (save-excursion
862 (goto-char (point-min))
863 (while (re-search-forward "^<sera>\n" nil t)
864 (fidel-to-sera-region
865 (point)
866 (if (re-search-forward "^</sera>\n" nil t)
867 (match-beginning 0)
868 (point-max))
869 nil
870 'force))))
871
872 ;;
873 ;; file I/O hooks
874 ;;
875
876 (if (not (assoc "\\.sera$" auto-mode-alist))
877 (setq auto-mode-alist
878 (cons '("\\.sera$" . sera-to-fidel-find-file) auto-mode-alist)))
879 (add-hook 'write-file-hooks 'fidel-to-sera-write-file)
880 (add-hook 'after-save-hook 'sera-to-fidel-after-save)
881
882 ;;;###autoload
883 (defun sera-to-fidel-find-file nil
884 "Intended to be called when a file whose name ends in \".sera\" is read in."
885 (sera-to-fidel-buffer nil 'force)
886 (set-buffer-modified-p nil)
887 nil)
888
889 ;;;###autoload
890 (defun fidel-to-sera-write-file nil
891 "Intended to be used as write-file-hooks for the files
892 whose name ends in \".sera\"."
893 (if (string-match "\\.sera$" (buffer-file-name))
894 (save-excursion
895 (fidel-to-sera-buffer nil 'force)
896 (set-buffer-modified-p nil)))
897 nil)
898
899 ;;;###autoload
900 (defun sera-to-fidel-after-save nil
901 "Intended to be used as after-save-hook for the files
902 whose name ends in \".sera\"."
903 (if (string-match "\\.sera$" (buffer-file-name))
904 (save-excursion
905 (sera-to-fidel-buffer nil 'force)
906 (set-buffer-modified-p nil)))
907 nil)
908
909 ;;
910 ;; vowel modification
911 ;;
912
913 ;;;###autoload
914 (defun ethio-modify-vowel nil
915 "Modify the vowel of the FIDEL that is under the cursor."
916 (interactive)
917 (let ((ch (following-char)) newch base vowel)
918 (if (= (char-charset ch) 'ethiopic)
919 (setq ch (char-to-ethiocode ch))
920 (error "Not a valid character."))
921 (if (or (and (>= ch 144) (<= ch 151)) ; lone vowels
922 (and (>= ch 250) (<= ch 256)) ; secondary lone vowels
923 (>= ch 327)) ; not FIDEL
924 (error "Not a valid character."))
925 (message "Modify vowel to: ")
926 (if (null (setq vowel (memq (read-char) '(?e ?u ?i ?a ?E ?' ?o))))
927 (error "Not a valid vowel.")
928 ;; ?e -> 0, ?u -> 1, ?i -> 2, ?a -> 3, ?E -> 4, ?' -> 5, ?o -> 6
929 (setq vowel (- 7 (length vowel))))
930
931 (cond
932
933 ;; 8-form consonant
934 ((<= ch 143)
935 (setq base (* (/ ch 8) 8))
936 (cond
937 ((< (mod ch 8) 7) ; e-form <= ch <= o-form
938 (setq newch (+ base vowel)))
939 ((= vowel 3) ; 3 = a
940 (setq newch (+ base 7))) ; (+ base 7) = Wa-form
941 ((= vowel 5) ; 5 = '
942 (setq newch
943 (cons (+ base 5) ; (+ base 5) = lone consonant
944 232))) ; 232 = Wu
945 (t
946 (setq newch
947 (cons (+ base 5) ; (+ base 5) = lone consonant
948 (+ 231 vowel)))))) ; 231 = We
949
950 ;; 12-form consonant
951 ((<= ch 235)
952 (setq ch (- ch 152) ; 152 = 12-form consonant offset
953 base (* (/ ch 12) 12))
954 (cond
955 ((< (mod ch 12) 7) ; e-form <= ch <= o-form
956 (setq newch (+ base vowel 152)))
957 ((< vowel 5) ; We-form <= ch <= WE-form
958 (setq newch (+ base vowel 159))) ; 159 = 152 (offset) + 7 (We-form)
959 ((= vowel 5) ; 5 = ' (= u in this case)
960 (setq newch (+ base 160))) ; 160 = 152 (offset) + 8 (Wu-form)
961 (t
962 (error "Not a valid vowel."))))
963
964 ;; 7-form consonant
965 (t ; 236 = 7-form consonant offset
966 (setq newch (+ (* (/ (- ch 236) 7) 7) vowel 236))))
967
968 (delete-char 1)
969
970 (cond
971 ((consp newch)
972 (insert (ethiocode-to-char (car newch))
973 (ethiocode-to-char (cdr newch)))
974 (backward-char 2))
975 (t
976 (insert (ethiocode-to-char newch))
977 (backward-char 1)))))
978
979 (defun ethiocode-to-char (code)
980 (make-char 'ethiopic (+ (/ code 94) 33) (+ (mod code 94) 33)))
981
982 (defun char-to-ethiocode (ch)
983 (and (eq (char-charset ch) 'ethiopic)
984 (+ (* (- (char-octet ch 0) 33) 94)
985 (- (char-octet ch 1) 33))))
986
987 ;;
988 ;; space replacement
989 ;;
990
991 ;;;###autoload
992 (defun ethio-replace-space (ch begin end)
993 "In the specified region, replace spaces between two Ethiopic characters."
994 (interactive "*cReplace spaces to: 1 (sg col), 2 (dbl col), 3 (Ethiopic)\nr")
995 (if (not (memq ch '(?1 ?2 ?3)))
996 (error ""))
997 (save-excursion
998 (save-restriction
999 (narrow-to-region begin end)
1000 (goto-char (point-min))
1001
1002 (cond
1003
1004 ((= ch ?1)
1005
1006 ;; A double column space or an Ethiopic word separator is always
1007 ;; converted to an ASCII space.
1008 (while (re-search-forward "[$(2$N$O(B]" nil t)
1009 (replace-match " " nil nil)))
1010
1011 ((= ch ?2)
1012
1013 ;; An Ethiopic word separator is always converted to
1014 ;; a double column space.
1015 (while (search-forward "$(2$O(B" nil t)
1016 (replace-match "$(2$N(B"))
1017
1018 (goto-char (point-min))
1019
1020 ;; ASCII spaces are converted only if they are placed
1021 ;; between two Ethiopic characters.
1022 (while (re-search-forward "\\(\\cE\\)\\( \\)\\( *\\cE\\)" nil t)
1023
1024 ;; Converting the first ASCII space
1025 (replace-match "\\1$(2$N(B\\3")
1026
1027 ;; A double column space is \cE, so going back to the just
1028 ;; converted double column space makes it possible to find
1029 ;; the following ASCII spaces.
1030 (goto-char (match-beginning 2))))
1031
1032 ((= ch ?3)
1033
1034 ;; If more than one consecutive space (either ASCII or double
1035 ;; width) is found between two Ethiopic characters, the first
1036 ;; space will be converted to an Ethiopic word separator.
1037 (let (pred succ)
1038 (while (re-search-forward "[ $(2$N(B]\\([ $(2$N(B]*\\)" nil t)
1039 (and (setq pred (char-before (match-beginning 0)))
1040 (= (char-charset pred) 'ethiopic)
1041 (setq succ (char-after (match-end 0)))
1042 (= (char-charset succ) 'ethiopic)
1043 (replace-match "$(2$O(B\\1" nil nil)))))))))
1044
1045 ;;
1046 ;; special characters
1047 ;;
1048
1049 ;;;###autoload
1050 (defun ethio-input-special-character (arg)
1051 "Allow the user to input special characters."
1052 (interactive "*cInput number: 1.$(2$k(B 2.$(2$l(B 3.$(2$m(B 4.$(2$n(B")
1053 (cond
1054 ((= arg ?1)
1055 (insert ?$(2$k(B))
1056 ((= arg ?2)
1057 (insert ?$(2$l(B))
1058 ((= arg ?3)
1059 (insert ?$(2$m(B))
1060 ((= arg ?4)
1061 (insert ?$(2$n(B))
1062 (t
1063 (error ""))))
1064
1065 ;;
1066 ;; key bindings
1067 ;;
1068
1069 (define-key global-map [f4] 'sera-to-fidel-buffer)
1070 (define-key global-map [(shift f4)] 'sera-to-fidel-region)
1071 (define-key global-map [(control f4)] 'sera-to-fidel-marker)
1072 (define-key global-map [f5] 'fidel-to-sera-buffer)
1073 (define-key global-map [(shift f5)] 'fidel-to-sera-region)
1074 (define-key global-map [(control f5)] 'fidel-to-sera-marker)
1075 (define-key global-map [f6] 'ethio-modify-vowel)
1076 (define-key global-map [f7] 'ethio-replace-space)
1077 (define-key global-map [(shift f2)] 'ethio-replace-space) ; as requested
1078 (define-key global-map [f8] 'ethio-input-special-character)
1079
1080 (add-hook
1081 'rmail-mode-hook
1082 '(lambda nil
1083 (define-key rmail-mode-map [(control f4)] 'sera-to-fidel-mail)
1084 (define-key rmail-mode-map [(control f5)] 'fidel-to-sera-mail)))
1085
1086 (add-hook
1087 'mail-mode-hook
1088 '(lambda nil
1089 (define-key mail-mode-map [(control f4)] 'sera-to-fidel-mail)
1090 (define-key mail-mode-map [(control f5)] 'fidel-to-sera-mail)))
1091
1092 ;;
1093 (provide 'ethio)