1;;; izonmoji-mode.el --- Visualize Windows and Macintosh izonmoji
2
3;; Copyright (C) 2002-2004 by Navi2ch Project
4
5;; Author: SAITO Takuya <tabmore@users.sourceforge.net>
6;; Keywords: 2ch, charset
7
8;; This file is free software; you can redistribute it and/or modify
9;; it under the terms of the GNU General Public License as published by
10;; the Free Software Foundation; either version 2, or (at your option)
11;; any later version.
12
13;; This file is distributed in the hope that it will be useful,
14;; but WITHOUT ANY WARRANTY; without even the implied warranty of
15;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16;; GNU General Public License for more details.
17
18;; You should have received a copy of the GNU General Public License
19;; along with GNU Emacs; see the file COPYING.  If not, write to
20;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21;; Boston, MA 02111-1307, USA.
22
23;; izonmoji-mode() and the way to apply izonmoji-{win,mac}-face on GNU Emacs
24;; are derived from
25
26;; blank-mode.el
27;; Author: Vinicius Jose Latorre <vinicius@cpqd.com.br>
28;; Version: 4.0
29;; X-URL: http://www.cpqd.com.br/~vinicius/emacs/
30
31;;; Commentary:
32
33;; $B5!<o0MB8J8;z$rI=<(2DG=$JJ8;zNs$KCV$-49$($FI=<($9$k!#(B
34;; $B%G%U%)%k%H$G$OCV49@h$K(B JISX0213 $B$NJ8;z$b;H$C$F$$$^$9$N$G!"(B
35;; JISX0213$BMQ$N%U%)%s%H$,I,MW$G$9!#(B
36;; $BA4$F$N5!<o0MB8J8;z$rI=<($G$-$k$o$1$G$O$"$j$^$;$s$N$GCm0U!#(B
37
38;; commands:
39;;   izonmoji-mode      $B5!<o0MB8J8;zI=<($r%H%0%k(B
40;;   izonmoji-mode-on   $B5!<o0MB8J8;z$rI=<((B
41;;   izonmoji-mode-off  $B5!<o0MB8J8;zI=<($r$d$a$k(B
42
43;; coding-system:
44;;   izonmoji-shift-jis $BFI$_9~$_;~$K!"(BIBM$B3HD%J8;z$rBP1~$9$k(BNEC$BFC<lJ8;z!"(B
45;;                      NEC$BA*Dj(BIBM$B3HD%J8;z$KCV49$9$k!#(B
46
47;; izonmoji-mode-on $B$O(B buffer $B$NFbMF$rJQ99$7$^$;$s$,!"(Bizonmoji-shift-jis $B$G(B
48;; $B%U%!%$%k$rFI$_9~$s$@;~$H(B shift_jis$B$GFI$_9~$s$@;~$H$G$O(B buffer $B$NFbMF$,(B
49;; $B0[$J$k>l9g$b$"$j$^$9$N$G!"0U?^$;$:$K(B file $B$NFbMF$rJQ99$7$J$$$h$&Cm0U(B
50;; $B$7$F2<$5$$!#(B
51
52;; Emacs $B$N%P!<%8%g%s(B
53;;  Emacs 20 $B0J9_!"(BXEmacs 21.4 $B0J9_$r;H$C$F2<$5$$!#(B
54;;  $B$?$@$7!"(BXEmacs 21.1 $B$G$b0lIt$N5!G=$O;H$($^$9!#(B
55
56;; GNU Emacs 20 $B$G$O!"(BMule-UCS$B$,I,MW$G$9!#(B
57;; $B$3$N%U%!%$%k$rFI$_9~$`A0$K(B (require 'jisx0213) $B$7$F$/$@$5$$!#(B
58
59;; GNU Emacs 20,21$B$G$O!"(Bbuffer-display-table$B$K$h$C$FI=<($rCV$-BX$($?(B
60;; Non-ASCII$B$JJ8;z$N(Bchar-width$B$,$*$+$7$/$J$j$^$9!#(B
61;; $BJQ49A08e$G(Bchar-width$B$,JQ$o$i$J$$>l9g$O!"(B
62;;  (defadvice char-width (around display-table-hack activate)
63;;    (let ((buffer-display-table nil))
64;;      ad-do-it))
65;; $B$G$4$^$+$;$^$9!#(B string-width$B$bF1MM$G$9!#(B
66
67;; XEmacs 21.4$B0JA0$G$O(Binit-file$B$K0J2<$N$h$&$K=q$$$F$/$@$5$$!#(B
68;; (make-charset
69;;  'japanese-jisx0213-1
70;;  "JIS X 0213:2000 Plain 1"
71;;  '(registry "jisx0213\\(\\.2000\\)-1"
72;;             dimension 2 chars 94 final ?O graphic 0))
73;; (make-charset
74;;  'japanese-jisx0213-2
75;;  "JIS X 0213:2000 Plain 2"
76;;  '(registry "jisx0213\\(\\.2000\\)-2"
77;;             dimension 2 chars 94 final ?P graphic 0))
78
79;; $B@_DjNc(B
80
81;; [$B6&DL(B] ~/.emacs $B$X(B
82;;  (require 'izonmoji-mode)
83
84;; [navi2ch] ~/.navi2ch/init.el $B$X(B
85;;  (add-hook 'navi2ch-bm-mode-hook      'izonmoji-mode-on)
86;;  (add-hook 'navi2ch-article-mode-hook 'izonmoji-mode-on)
87;;  (add-hook 'navi2ch-popup-article-mode-hook 'izonmoji-mode-on)
88;;  ;; IBM$B3HD%J8;z$rI=<((B (XEmacs-21.1 $B$OHsBP1~(B)
89;;  (when (memq 'izonmoji-shift-jis (coding-system-list))
90;;    (setq navi2ch-coding-system 'izonmoji-shift-jis))
91
92;; [Mew] ~/.mew.el $B$X(B
93;;  (add-hook 'mew-message-mode-hook 'izonmoji-mode-on)
94
95;; [Wanderlust] ~/.wl $B$X(B
96;;  (add-hook 'wl-message-redisplay-hook 'izonmoji-mode-on)
97
98;; [emacs-w3m] ~/.emacs-w3m.el $B$X(B
99;;  (add-hook 'w3m-mode-hook 'izonmoji-mode-on)
100
101;;; Bugs:
102
103;;  1. display-table$B$r$$$8$k(B
104;;  2. M-x izonmoji-mode-on
105;;  3. 1$B$NJQ99$r85$KLa$9(B
106;;  4. M-x izonmoji-mode-off
107;;  $B$9$k$H85$K$b$I$i$J$$!#(B
108;;  C-u M-x izonmoji-mode-off $B$7$F(Bdisplay-table$B$X$NA4$F$NJQ99$r<h$j>C$9(B
109;;  $B$3$H$O$G$-$^$9!#(B
110
111
112;;; Code:
113
114(eval-when-compile
115  (defvar buffer-display-table)
116  (defvar current-display-table))
117
118(require 'ccl)
119
120(defvar izonmoji-priority-list '(win mac)
121  "*$BI=<($NM%@h=g0L!#(B
122'(win mac) $B$J$i!"(BWindows$B$N5!<o0MB8J8;z$rM%@h$7$D$D!"(BMac$B$NJ8;z$bI=<(!#(B
123'(win) $B$J$i!"(BWindows$B$N5!<o0MB8J8;z$N$_I=<(!#(B")
124
125(defvar izonmoji-win-face 'izonmoji-win-face
126  "*Windows$B$N5!<o0MB8J8;z$NI=<($K;H$&%U%'%$%9L>!#(B
127'default $B$K$9$k$H%U%'%$%9$r$D$1$^$;$s!#(B")
128
129(defvar izonmoji-mac-face 'izonmoji-mac-face
130  "*Mac$B$N5!<o0MB8J8;z$NI=<($K;H$&%U%'%$%9L>!#(B
131'default $B$K$9$k$H%U%'%$%9$r$D$1$^$;$s!#(B")
132
133(defface izonmoji-win-face
134  '((((class color) (type tty)) (:foreground "cyan"))
135    (((class color) (background light)) (:foreground "Aquamarine4"))
136    (((class color) (background dark))  (:foreground "Aquamarine3"))
137    (t (:underline t)))
138  "Windows$B$N5!<o0MB8J8;z$N%U%'%$%9!#(B")
139
140(defface izonmoji-mac-face
141  '((((class color) (type tty)) (:foreground "magenta"))
142    (((class color) (background light)) (:foreground "pink4"))
143    (((class color) (background dark))  (:foreground "pink3"))
144    (t (:underline t)))
145  "Mac$B$N5!<o0MB8J8;z$N%U%'%$%9!#(B")
146
147(defvar izonmoji-win-display-list
148  '("$(O-!(B" "$(O-"(B" "$(O-#(B" "$(O-$(B" "$(O-%(B" "$(O-&(B" "$(O-'(B" "$(O-((B" "$(O-)(B" "$(O-*(B"
149    "$(O-+(B" "$(O-,(B" "$(O--(B" "$(O-.(B" "$(O-/(B" "$(O-0(B" "$(O-1(B" "$(O-2(B" "$(O-3(B" "$(O-4(B"
150    "$(O-5(B" "$(O-6(B" "$(O-7(B" "$(O-8(B" "$(O-9(B" "$(O-:(B" "$(O-;(B" "$(O-<(B" "$(O-=(B" "$(O->(B"
151    "$(O-@(B" "$(O-A(B" "$(O-B(B" "$(O-C(B" "$(O-D(B" "$(O-E(B" "$(O-F(B" "$(O-G(B" "$(O-H(B" "$(O-I(B" "$(O-J(B" "$(O-K(B"
152    "$(O-L(B" "$(O-M(B" "$(O-N(B" "$(O-O(B" "$(O-P(B" "$(O-Q(B" "$(O-R(B" "$(O-S(B" "$(O-T(B" "$(O-U(B" "$(O-V(B"
153    "$(O-_(B" "$(O-`(B" "$(O-a(B" "$(O-b(B" "$(O-c(B" "$(O-d(B" "$(O-e(B" "$(O-f(B" "$(O-g(B" "$(O-h(B" "$(O-i(B"
154    "$(O-j(B" "$(O-k(B" "$(O-l(B" "$(O-m(B" "$(O-n(B" "$(O-o(B"
155    "$B"b(B" "$B"a(B" "$B"i(B" "$(O-s(B" "$B&2(B" "$B"e(B" "$B"](B" "$B"\(B" "$(O-x(B" "$(O-y(B" "$B"h(B" "$B"A(B" "$B"@(B"
156    "$(Oz7(B" "$(O{n(B" "$(O}9(B" "$(O}.(B" "$(PvU(B" "$(O.9(B" "$(Po`(B" "$(Ou5(B" "$(Oui(B" "$(P{#(B" "$(Ou7(B" "$(Ot:(B" "$(O.$(B" "$(O.((B"
157    "$(I"n(B" "$(P!?(B" "$(O.+(B" "$(D0c(B" "$(O.0(B" "$(P!M(B" "$(O.5(B" "$(P!N(B" "$(O.6(B" "$(D1>(B" "$(O.A(B" "$(P!](B" "$(D1H(B" "$(P!\(B"
158    "$(P!`(B" "$(P!g(B" "$(P!_(B" "$(O.D(B" "$(IEt(B" "$(D2;(B" "$(O.O(B" "$(D2m(B" "$(O.T(B" "$(D2|(B" "$(I$[(B" "$(O.](B" "$(D3X(B" "$(P#C(B"
159    "$(D3e(B" "$(O.g(B" "$(O.k(B" "$(O.l(B" "$(P#N(B" "$(D4@(B" "$(O.r(B" "$(O.t(B" "$(D4^(B" "$B".(B" "$(O.x(B" "$(P#l(B" "$(O/!(B" "$(O/#(B"
160    "$(O/*(B" "$(J#a(B" "$(D7B(B" "$(P$l(B" "$(O/O(B" "$(O/N(B" "$(O/K(B" "$(O/W(B" "$(O/](B" "$(D8N(B" "$(P%:(B" "$(D8u(B" "$(P%E(B" "$(O/i(B"
161    "$(D8|(B" "$(O/m(B" "$(D97(B" "$(OOV(B" "$(P($(B" "$(OxI(B" "$(OOY(B" "$(OOZ(B" "$(OO\(B" "$(P(C(B" "$(OOi(B" "$(I0b(B" "$(OOq(B" "$(OOu(B"
162    "$(OOr(B" "$(P(U(B" "$(OOw(B" "$(OO|(B" "$(P(g(B" "$(D;y(B" "$(D<d(B" "$(Ot6(B" "$(Ot>(B" "$(OtE(B" "$(OtG(B" "$(D=g(B" "$(GUP(B" "$(P,M(B"
163    "$(D>0(B" "$(OtU(B" "$Ac3(B" "$(P,X(B" "$(D>=(B" "$(Ot[(B" "$(OtZ(B" "$(P,i(B" "$(D?((B" "$(P-"(B" "$(Ott(B" "$(Otz(B" "$(P-P(B" "$(Ot|(B"
164    "$(I66(B" "$(Ou,(B" "$(Ou.(B" "$(I-"(B" "$(Ou-(B" "$(DB+(B" "$(Ou/(B" "$(Ou2(B" "$(Ou>(B" "$(P-~(B" "$(Ou;(B" "$B".(B" "$(Ou?(B" "$(P.-(B"
165    "$(OuD(B" "$(OuE(B" "$(P.3(B" "$(OuL(B" "$(DBp(B" "$(OuN(B" "$(OuP(B" "$(OuX(B" "$(Ou^(B" "$(OuZ(B" "$(Ou](B" "$(P._(B" "$(P.}(B" "$(P.y(B"
166    "$(Oux(B" "$(Ouz(B" "$(P/6(B" "$(Ov"(B" "$(P/A(B" "$(Ov0(B" "$(P/S(B" "$(Ov1(B" "$(P/Z(B" "$(IZH(B" "$(Ov8(B" "$(OvK(B" "$(Pn5(B" "$(OvR(B"
167    "$(OvW(B" "$(DFc(B" "$(PnD(B" "$(Ova(B" "$(Ovk(B" "$(DGC(B" "$(DGK(B" "$(Ovo(B" "$(Pnh(B" "$(I6|(B" "$(H6d(B" "$(Ovv(B" "$(DGn(B" "$(Ovz(B"
168    "$(Pnp(B" "$(Pns(B" "$(Po$(B" "$(Ow/(B" "$(PoA(B" "$(Ow;(B" "$(Ow<(B" "$(PoJ(B" "$(Ow>(B" "$(OwE(B" "$(OwG(B" "$(OwL(B" "$(Pok(B" "$(OwW(B"
169    "$(OwR(B" "$(OwS(B" "$(OwZ(B" "$(Ow^(B" "$(Owa(B" "$(Pp=(B" "$(Owi(B" "$(DK.(B" "$(Owo(B" "$(PpW(B" "$(DKf(B" "$(Owy(B" "$(Ow{(B" "$(Ow}(B"
170    "$(DKn(B" "$(Ox!(B" "$(DKy(B" "$(Ox&(B" "$(Ox((B" "$(DL-(B" "$(Ox+(B" "$(Ox3(B" "$(Ox8(B" "$(Ox;(B" "$(OxG(B" "$(OxJ(B" "$ATm(B" "$(Pqo(B"
171    "$(Oxc(B" "$(Oxa(B" "$(Oxd(B" "$B".(B" "$(Oxr(B" "$(P#D(B" "$(PrC(B" "$(Oy"(B" "$(PrF(B" "$(DOm(B" "$(Pr^(B" "$B".(B" "$(Oy<(B" "$(Oy=(B"
172    "$(Prg(B" "$(OyA(B" "$(Prj(B" "$(Ps9(B" "$(Ps:(B" "$B".(B" "$(OyX(B" "$(Oyc(B" "$B".(B" "$(Oz"(B" "$(Oz$(B" "$(PtG(B" "$(Oz((B" "$(Oz,(B"
173    "$(Oz5(B" "$(Oz9(B" "$(DU.(B" "$B".(B" "$(Ozl(B" "$(Ozm(B" "$(Pv3(B" "$(Oz}(B" "$(DXA(B" "$(O{((B" "$(O{/(B" "$(Pvq(B" "$(O{8(B" "$(DYQ(B"
174    "$(O{:(B" "$(O{@(B" "$(Pw8(B" "$(PwE(B" "$(I[)(B" "$(O{m(B" "$(O{}(B" "$(O|"(B" "$(O|((B" "$(O|)(B" "$(Px`(B" "$(O|+(B" "$(O|.(B" "$(O|-(B"
175    "$(D^K(B" "$(Pxo(B" "$(Py0(B" "$(O|:(B" "$(O|>(B" "$A8O(B" "$B".(B" "$(D`Y(B" "$(Pyn(B" "$B".(B" "$(Dab(B" "$(O|g(B" "$(O|j(B" "$(O|l(B"
176    "$(O|p(B" "$(PzN(B" "$(O||(B" "$(Dc)(B" "$(O}"(B" "$(PzR(B" "$(O|~(B" "$(O}!(B" "$(Dc<(B" "$(O}%(B" "$(PzT(B" "$(O}((B" "$(O}*(B" "$(O})(B"
177    "$(Pz\(B" "$(Pz_(B" "$(Pz](B" "$(O}'(B" "$(Pzc(B" "$(Pzo(B" "$(Dcq(B" "$(O}-(B" "$(Pz|(B" "$(Pzy(B" "$(Pzz(B" "$(Pzx(B" "$B".(B" "$(Dd@(B"
178    "$(O}3(B" "$(O}2(B" "$(O}8(B" "$(O}7(B" "$(P{$(B" "$B".(B" "$(P{)(B" "$(O}4(B" "$(P{((B" "$(P{%(B" "$(O}?(B" "$(P{0(B" "$(De3(B" "$(O}C(B"
179    "$(O}D(B" "$(DeP(B" "$(Deb(B" "$(P{M(B" "$(Dek(B" "$(Gbg(B" "$(O}](B" "$B".(B" "$(O}^(B" "$(P{l(B" "$(O}f(B" "$(O}g(B" "$(Dg.(B" "$(O}h(B"
180    "$(O}j(B" "$(I*~(B" "$(P{|(B" "$(O~!(B" "$(O~%(B" "$B".(B" "$B".(B" "$(Dh](B" "$B".(B" "$(O~+(B" "$(O~3(B" "$(J6-(B" "$(P}2(B" "$(O~D(B"
181    "$(O~C(B" "$(O~G(B" "$(P}J(B" "$(Djj(B" "$(O~O(B" "$(O~^(B" "$(P~4(B" "$B".(B" "$(P~O(B" "$(O~r(B"
182    "$(O,5(B" "$(O,6(B" "$(O,7(B" "$(O,8(B" "$(O,9(B" "$(O,:(B" "$(O,;(B" "$(O,<(B" "$(O,=(B" "$(O,>(B" "$B"L(B" "$(O)%(B" "$(O"/(B" "$(O"0(B")
183  "*Windows$B$N5!<o0MB8J8;z$NI=<($K;H$&J8;zNs$N%j%9%H!#(B")
184
185(defvar izonmoji-mac-display-list
186  '("$(O-!(B" "$(O-"(B" "$(O-#(B" "$(O-$(B" "$(O-%(B" "$(O-&(B" "$(O-'(B" "$(O-((B" "$(O-)(B" "$(O-*(B"
187    "$(O-+(B" "$(O-,(B" "$(O--(B" "$(O-.(B" "$(O-/(B" "$(O-0(B" "$(O-1(B" "$(O-2(B" "$(O-3(B" "$(O-4(B"
188    "(1)" "(2)" "(3)" "(4)" "(5)" "(6)" "(7)" "(8)" "(9)" "(10)"
189    "(11)" "(12)" "(13)" "(14)" "(15)" "(16)" "(17)" "(18)" "(19)" "(20)"
190    "$(O,!(B" "$(O,"(B" "$(O,#(B" "$(O,$(B" "$(O,%(B" "$(O,&(B" "$(O,'(B" "$(O,((B" "$(O,)(B"
191    "0." "1." "2." "3." "4." "5." "6." "7." "8." "9." "0." ;0. $B$O$I$3!)(B
192    "$(O-5(B" "$(O-6(B" "$(O-7(B" "$(O-8(B" "$(O-9(B" "$(O-:(B" "$(O-;(B" "$(O-<(B" "$(O-=(B" "$(O->(B"
193    "$(O-?(B" "$(O-W(B" "X$(O-7(B" "X$(O-8(B" "XV"
194    "$(O,5(B" "$(O,6(B" "$(O,7(B" "$(O,8(B" "$(O,9(B" "$(O,:(B" "$(O,;(B" "$(O,<(B" "$(O,=(B" "$(O,>(B"
195    "$(O,?(B" "$(O,@(B" "x$(O,7(B" "x$(O,8(B" "xv"
196    "(a)" "(b)" "(c)" "(d)" "(e)" "(f)" "(g)" "(h)" "(i)" "(j)" "(k)"
197    "(l)" "(m)" "(n)" "(o)" "(p)" "(q)" "(r)" "(s)" "(t)" "(u)" "(v)"
198    "(w)" "(x)" "(y)" "(z)"
199    "$(O-P(B" "mm$(O),(B" "$(O-Q(B" "$(O-Q),(B" "$(O-Q)-(B" "m" "$(O-V(B" "m$(O)-(B" "$(O-R(B" "k$(O-V(B"
200    "$(O-S(B" "g" "$(O-T(B" "$(O-U(B" "m$(O#_(B" "d$(O#_(B" "$(O#_(B" "k$(O#_(B"
201    "ms" "$B&L(Bs" "ns" "ps" "$(O!k(BF" "mb" "$(O#^(B" "Hz" "KB" "MB" "GB" "TB"
202    "$(O-b(B" "$(O-c(B" "$(O-d(B" "FAX"
203    "$(O&9(B" "$(O&?(B" "$(O&=(B" "$(O&;(B" "$(O&:(B" "$(O&@(B" "$(O&>(B" "$(O&<(B"
204    "$(O&f(B" "$(O&g(B" "JIS"			;JIS$B%^!<%/(B
205    "$B"*(B" "$B"+(B" "$B",(B" "$B"-(B"			;$B;X:9$7Lp0u(B
206    "$(O#)(B" "$(O#)(B" "$B","-(B" "$B"-",(B"	     ;$B6v?tHVL\$O!">e2<!":81&$N8~$-$,5U(B
207    "$(O#*(B" "$(O#+(B" "$(O#,(B" "$(O#-(B" "$(O#*(B" "$(O#+(B" "$(O#,(B" "$(O#-(B" ;$B8eH>$OEI$jDY$7(B
208    "($BF|(B)" "($B7n(B)" "($B2P(B)" "($B?e(B)" "($BLZ(B)" "($B6b(B)" "($BEZ(B)"
209    "($B:W(B)" "($B=K(B)" "($B<+(B)" "($B;j(B)" "$(O-l(B" "($B8F(B)" "$(O-j(B" "($B;q(B)" "($BL>(B)"
210    "$(O-k(B" "($B3X(B)" "($B:b(B)" "($B<R(B)" "($BFC(B)" "($B4F(B)" "($B4k(B)" "($B6((B)" "($BO+(B)"
211    "($BBg(B)" "($B>.(B)" "$(O-e(B" "$(O-f(B" "$(O-g(B" "$(O-h(B" "$(O-i(B"
212    "($B0e(B)" "($B:b(B)" "($BM%(B)" "($BO+(B)" "($B0u(B)" "($B95(B)" "($BHk(B)" ;$BK\Ev$O4]IU$-(B
213    "$(O-@(B" "$(O-B(B" "$(O-C(B" "$(O-A(B" "$(O-A-C(B" "(I2]A(B" "(IL(0D(B" "(IT0D^(B" "$(O-F(B" "$(O-G(B"
214    "$(O-D(B" "$(O-A-D(B" "$(O-E(B" "$(O-H(B" "$(O-N(B" "(IMYB(B" "$(O-I(B" "$(O-J(B" "(IN0](B" "$(O-L(B" "$(O-K(B" "$(O-O(B" "$(O-M(B"
215    "(I1J_0D(B" "(I:0N_(B" "(IJ2B(B" "(IK^Y(B" "(IO]<.](B"
216    "$(O-m(B" "$(O-n(B" "$(O-o(B" "$(O-_(B"
217    "$B3t<02q<R(B" "$BM-8B2q<R(B" "$B:bCDK!?M(B"	;"$(O-j(B" "$(O-k(B"
218    "$(O-s(B" "$(O-x(B" "$(O-y(B"
219    "$(O-`(B" "$(O-a(B"
220    "$(O$t(B" "$(O'r(B" "$(O's(B" "$(O't(B" "$(O'u(B"
221    ;; $B=D=q$-(B
222    "$B!"(B" "$B!#(B" "$B!1(B" "$B!2(B" "$B!<(B" "$B(!(B" "$B!>(B" "$B!A(B"
223    "$B!a(B" "$B(!(B"				;$B2#D>@~(B
224    "$B!D(B" "$B!E(B" "$B!J(B" "$B!K(B" "$B!L(B" "$B!M(B" "$B!N(B" "$B!O(B" "$B!P(B" "$B!Q(B" "$B!R(B" "$B!S(B" "$B!T(B" "$B!U(B"
225    "$B!V(B" "$B!W(B" "$B!X(B" "$B!Y(B" "$B!Z(B" "$B![(B" "$B!a(B"
226    "$B$!(B" "$B$#(B" "$B$%(B" "$B$'(B" "$B$)(B" "$B$C(B" "$B$c(B" "$B$e(B" "$B$g(B" "$B$n(B"
227    "$B%!(B" "$B%#(B" "$B%%(B" "$B%'(B" "$B%)(B" "$B%C(B" "$B%c(B" "$B%e(B" "$B%g(B" "$B%n(B" "$B%u(B" "$B%v(B")
228  "*Mac$B$N5!<o0MB8J8;z$NI=<($K;H$&J8;zNs$N%j%9%H!#(B")
229
230(defun izonmoji-make-char-list (i js je &optional k)
231  (unless k (setq k 1))
232  (let ((j js) list)
233    (while (<= j je)
234      (setq list (cons (make-char 'japanese-jisx0208 i j) list))
235      (setq j (+ j k)))
236    (nreverse list)))
237
238;; Windows$B$N4]IU$-(B1$B$O!"(B
239;; (split-char (decode-sjis-char (hexl-hex-string-to-integer "8740")))
240(defvar izonmoji-win-chars-list
241  (append
242   (izonmoji-make-char-list  45  33  62) ;$B4]IU$-?t;z(B + $B%m!<%^?t;z(B($BBgJ8;z(B)
243   (izonmoji-make-char-list  45  64  86) ;$BC10L(B
244   (izonmoji-make-char-list  45  95 124) ;$B859f!"?t3X5-9f$J$I(B
245   (izonmoji-make-char-list 121  33 126) ;$B4A;z(B
246   (izonmoji-make-char-list 122  33 126)
247   (izonmoji-make-char-list 123  33 126)
248   (izonmoji-make-char-list 124  33 110)
249   (izonmoji-make-char-list 124 113 126) ;$B%m!<%^?t;z(B($B>.J8;z(B)
250   )
251  "*Windows$B$N5!<o0MB8J8;z%j%9%H!#(B")
252
253(defvar izonmoji-mac-chars-list
254  (append
255   (izonmoji-make-char-list  41  33  52) ;$B4]IU$-?t;z(B
256   (izonmoji-make-char-list  41  63  82) ;$B3g8LIU$-?t;z(B
257   (izonmoji-make-char-list  41  93 101) ;$B9u4]IU$-?t;z(B
258   (izonmoji-make-char-list  41 113 123) ;$BE@IU$-?t;z(B
259   (izonmoji-make-char-list  42  33  47) ;$B%m!<%^?t;z(B($BBgJ8;z(B)
260   (izonmoji-make-char-list  42  53  67) ;$B%m!<%^?t;z(B($B>.J8;z(B)
261   (izonmoji-make-char-list  42  93 118) ;$B3g8LIU$-%"%k%U%!%Y%C%H(B
262   (izonmoji-make-char-list  43  33  62) ;$BC10L(B
263   (izonmoji-make-char-list  43 123 126) ;$BN,9f(B
264   (izonmoji-make-char-list  44  33  40) ;$B%H%i%s%W(B
265   (izonmoji-make-char-list  44  53  55) ;$BM9JX(B
266   (izonmoji-make-char-list  44  73  88) ;$BLp0u(B
267   (izonmoji-make-char-list  45  33  57) ;$BMKF|$J$I(B
268   (izonmoji-make-char-list  45 113 126) ;$B4]IU$-J8;z(B
269   (izonmoji-make-char-list  46  33  55) ;$B%+%?%+%JC10L(B
270   (izonmoji-make-char-list  46  63  67) ;$B%"%Q!<%H(B
271   (izonmoji-make-char-list  46 103 106) ;$B859f(B
272   (izonmoji-make-char-list  46 124 126) ;$B3t<02q<R(B
273   (izonmoji-make-char-list  47  33  35) ;$B?t3X5-9f(B
274   (izonmoji-make-char-list  47  53  54) ;""
275   (izonmoji-make-char-list  47  73  73) ;$B$&!+(B
276   (izonmoji-make-char-list  47  75  78) ;$B%o!+(B
277   (izonmoji-make-char-list 117  34  35) ;$B=D=q$-(B
278   (izonmoji-make-char-list 117  49  50)
279   (izonmoji-make-char-list 117  60  62)
280   (izonmoji-make-char-list 117  65  69)
281   (izonmoji-make-char-list 117  74  91)
282   (izonmoji-make-char-list 117  97  97)
283   (izonmoji-make-char-list 120  33  41 2)
284   (izonmoji-make-char-list 120  67  67)
285   (izonmoji-make-char-list 120  99  99)
286   (izonmoji-make-char-list 120 101 103 2)
287   (izonmoji-make-char-list 120 110 110)
288   (izonmoji-make-char-list 121  33  41 2)
289   (izonmoji-make-char-list 121  67  67)
290   (izonmoji-make-char-list 121  99  99)
291   (izonmoji-make-char-list 121 101 103 2)
292   (izonmoji-make-char-list 121 110 110)
293   (izonmoji-make-char-list 121 117 118))
294  "*Mac$B$N5!<o0MB8J8;z%j%9%H!#(B")
295
296(defvar izonmoji-mode-hook nil "*$B5!<o0MB8J8;z$rI=<($7$?8e$K8F$P$l$k%U%C%/!#(B")
297
298;; Internal variables
299
300(defvar izonmoji-mode nil)
301(make-variable-buffer-local 'izonmoji-mode)
302
303(defvar izonmoji-backuped-display-table nil)
304(make-variable-buffer-local 'izonmoji-backuped-display-table)
305
306(defun izonmoji-mode (&optional arg)
307  "$B5!<o0MB8J8;zI=<($r%H%0%k!#(B
308ARG $B$,(B non-nil $B$N>l9g!"(B1$B0J>e$N?t$J$i5!<o0MB8J8;z$rI=<(!#(B
309$B$=$l0J30$J$i5!<o0MB8J8;zI=<($r$d$a$k!#(B"
310  (interactive "P")
311  (if (if arg
312	  (> (prefix-numeric-value arg) 0)
313	(not izonmoji-mode))
314      (izonmoji-mode-on)
315    (izonmoji-mode-off)))
316
317(defun izonmoji-mode-on (&optional reverse win-face mac-face)
318  "$B5!<o0MB8J8;z$rI=<((B"
319  (interactive "P")
320  (let ((priority (reverse izonmoji-priority-list))
321	from to table)
322    (when reverse
323      (setq priority (nreverse priority)))
324    (unless izonmoji-mode
325      (cond
326       ((featurep 'xemacs)
327	(let* ((ctable (specifier-instance current-display-table))
328	       (len (- (1+ (apply 'max (append izonmoji-win-chars-list
329					       izonmoji-mac-chars-list)))
330		       (length ctable)))
331	       face glyph)
332	  (setq izonmoji-backuped-display-table ctable
333		table (copy-sequence ctable))
334	  (when (> len 0)
335	    (setq table (vconcat table (make-vector len nil))))
336	  (while priority
337	    (cond
338	     ((eq (car priority) 'win)
339	      (setq from izonmoji-win-chars-list
340		    to   izonmoji-win-display-list
341		    face (or win-face izonmoji-win-face 'default)))
342	     ((eq (car priority) 'mac)
343	      (setq from izonmoji-mac-chars-list
344		    to   izonmoji-mac-display-list
345		    face (or mac-face izonmoji-mac-face 'default))))
346	    (setq priority (cdr priority))
347	    (while (and from to)
348	      (if (or (eq face 'default)
349		      ;; XEmacs 21.1 $B$G(B face $B$rIU$1$k$HMn$A$k$N$G!#(B
350		      (and (= emacs-major-version 21)
351			   (= emacs-minor-version 1)))
352		  ;; face $B$r;XDj$7$J$$!#(B
353		  (aset table (car from) (car to))
354		(setq glyph (make-glyph (car to)))
355		(set-glyph-face glyph face)
356		(aset table (car from) glyph))
357	      (setq from (cdr from) to (cdr to))))
358	  (set-specifier current-display-table table (current-buffer))))
359       (t				;GNU Emacs
360	(let (face-bits)
361	  (setq izonmoji-backuped-display-table buffer-display-table
362		table (or (copy-sequence (or buffer-display-table
363					     standard-display-table))
364			  (make-display-table)))
365	  (while priority
366	    (cond
367	     ((eq (car priority) 'win)
368	      (setq from izonmoji-win-chars-list
369		    to   izonmoji-win-display-list
370		    face-bits (ash (face-id
371				    (or win-face izonmoji-win-face 'default))
372				   19)))
373	     ((eq (car priority) 'mac)
374	      (setq from izonmoji-mac-chars-list
375		    to   izonmoji-mac-display-list
376		    face-bits (ash (face-id
377				    (or mac-face izonmoji-mac-face 'default))
378				   19))))
379	    (setq priority (cdr priority))
380	    (while (and from to)
381	      (aset table (car from)
382		    (apply 'vector (mapcar
383				    (lambda (ch) (logior ch face-bits))
384				    (car to))))
385	      (setq from (cdr from) to (cdr to))))
386	  (setq buffer-display-table table)))))
387    (setq izonmoji-mode t)
388    (run-hooks 'izonmoji-mode-hook)))
389
390(defun izonmoji-mode-off (&optional initialize)
391  "$B5!<o0MB8J8;zI=<($r$d$a$k(B"
392  (interactive "P")
393  (when initialize
394    (setq izonmoji-mode t
395	  izonmoji-backuped-display-table (make-display-table)))
396  (when izonmoji-mode
397    (if (featurep 'xemacs)
398	(set-specifier current-display-table
399		       izonmoji-backuped-display-table (current-buffer))
400      (setq buffer-display-table izonmoji-backuped-display-table))
401    (setq izonmoji-mode nil)))
402
403;; izonmoji-shift-jis
404(when (and (fboundp 'ccl-compile-write-multibyte-character)
405	   (not (memq 'izonmoji-shift-jis (coding-system-list))))
406  (eval-and-compile
407    (defun izonmoji-ccl-write-sjis ()
408      `((r1 = (r0 de-sjis r1))
409	(r0 = (r1 << 7))
410	(r0 += r7)
411	(r1 = ,(charset-id 'japanese-jisx0208))
412	(write-multibyte-character r1 r0)
413	(repeat)))
414
415    (defun izonmoji-ccl-ibm-ext (d0 d1)
416      `((r0 -= ,d0)
417	(r1 -= ,d1)
418	,@(izonmoji-ccl-write-sjis))))
419
420  (define-ccl-program izonmoji-shift-jis-decode
421    `(2
422      (loop
423       (read r0)
424       (if (r0 < ?\x80)
425	   (write-repeat r0))
426       ;; if (r0 == 0x80 || r0 == 0xA0 || 0xEF < r0 < 0xFA || r0 > 0xFC)
427       (r1 = (r0 == ?\x80))
428       (r1 |= (r0 == ?\xA0))
429       (r2 = (r0 > ?\xEF))
430       (r2 &= (r0 < ?\xFA))
431       (r1 |= r2)
432       (r1 |= (r0 > ?\xFC))
433       (if r1
434	   (write-repeat r0))
435       (r1 = (r0 <= ?\x9F))
436       (r1 |= (r0 >= ?\xE0))
437       (if r1
438	   ((read r1)
439	    (r2 = (r1 < ?\x40))
440	    (r2 |= (r1 == ?\x7F))
441	    (r2 |= (r1 > ?\xFC))
442	    (if r2
443		((write r0)
444		 (write-repeat r1)))
445	    (if (r0 >= ?\xFA)
446		((if (r0 == ?\xFA)
447		     ((if (r1 <= ?\x49)
448			  ,(izonmoji-ccl-ibm-ext 12 -175))
449		      (if (r1 <= ?\x53)
450			  ,(izonmoji-ccl-ibm-ext 115 -10))
451		      (if (r1 <= ?\x57)
452			  ,(izonmoji-ccl-ibm-ext 12 -165))
453		      (if (r1 == ?\x58)
454			  ,(izonmoji-ccl-ibm-ext 115 -50))
455		      (if (r1 == ?\x59)
456			  ,(izonmoji-ccl-ibm-ext 115 -41))
457		      (if (r1 == ?\x5A)
458			  ,(izonmoji-ccl-ibm-ext 115 -42))
459		      (if (r1 == ?\x5B)
460			  ,(izonmoji-ccl-ibm-ext 115 -63))
461		      (if (r1 <= ?\x7E)
462			  ,(izonmoji-ccl-ibm-ext 13 28))
463		      (if (r1 <= ?\x9B)
464			  ,(izonmoji-ccl-ibm-ext 13 29))
465		      (if (r1 <= ?\xFC)
466			  ,(izonmoji-ccl-ibm-ext 13 28))))
467		 (if (r0 == ?\xFB)
468		     ((if (r1 <= ?\x5B)
469			  ,(izonmoji-ccl-ibm-ext 14 -161))
470		      (if (r1 <= ?\x7E)
471			  ,(izonmoji-ccl-ibm-ext 13 28))
472		      (if (r1 <= ?\x9B)
473			  ,(izonmoji-ccl-ibm-ext 13 29))
474		      (if (r1 <= ?\xFC)
475			  ,(izonmoji-ccl-ibm-ext 13 28))))
476		 (if (r0 == ?\xFC)
477		     ((if (r1 <= ?\x4B)
478			  ,(izonmoji-ccl-ibm-ext 14 -161))))
479		 (write r0)
480		 (write-repeat r1)))
481	    ,@(izonmoji-ccl-write-sjis))
482	 ((r0 &= ?\x7F)
483	  (r1 = ,(charset-id 'katakana-jisx0201))
484	  (write-multibyte-character r1 r0)
485	  (repeat))))))
486
487  (define-ccl-program izonmoji-shift-jis-encode
488    `(1
489      (loop
490       (read r0)
491       (if (r0 == ,(charset-id 'japanese-jisx0208))
492	   ((read r0)
493	    (read r1)
494	    (r0 &= ?\x7F)
495	    (r1 &= ?\x7F)
496	    (r1 = (r0 en-sjis r1))
497	    (write r1 r7)
498	    (repeat))
499	 ((if (r0 == ,(charset-id 'katakana-jisx0201))
500	      (read r0))
501	  (write-repeat r0))))))
502
503  (if (featurep 'xemacs)
504      (make-coding-system 'izonmoji-shift-jis 'ccl
505			  "Shift-JIS for displaying IBM ext characters"
506			  (list 'mnemonic "S"
507				'decode 'izonmoji-shift-jis-decode
508				'encode 'izonmoji-shift-jis-encode))
509    (make-coding-system 'izonmoji-shift-jis 4 ?S
510			"Shift-JIS for displaying IBM ext characters"
511			(cons 'izonmoji-shift-jis-decode
512			      'izonmoji-shift-jis-encode)
513			(list (cons 'safe-charsets
514				    (coding-system-get 'japanese-shift-jis
515						       'safe-charsets))))))
516
517(add-to-list 'minor-mode-alist '(izonmoji-mode " Iz"))
518
519(provide 'izonmoji-mode)
520
521;;; izonmoji-mode.el ends here
522