1 /* imx-ispell.c -- Ispell input method external module. -*- coding: euc-jp; -*-
2 Copyright (C) 2003, 2004
3 National Institute of Advanced Industrial Science and Technology (AIST)
4 Registration Number H15PRO112
6 This file is part of the m17n library.
8 The m17n library is free software; you can redistribute it and/or
9 modify it under the terms of the GNU Lesser General Public License
10 as published by the Free Software Foundation; either version 2.1 of
11 the License, or (at your option) any later version.
13 The m17n library 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 GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public
19 License along with the m17n library; if not, write to the Free
20 Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
24 @enpage mimx-ispell external module for the input method <en, ispell>
26 @section mimx-ispell-description DESCRIPTION
28 The shared library mimx-ispell.so is an external module used by the
29 input method <en, ispell>. It exports these functions.
34 Initialize this library.
38 Finalize this library.
42 Check the spell of the current preedit text (English) and, if the
43 spell is incorrect, return a list of candidates.
47 This program is just for demonstrating how to write an external
48 module for an m17n input method, not for an actual use.
50 @section mimx-ispell-seealso See also
54 @japage mimx-ispell ÆþÎϥ᥽¥Ã¥É <en, ispell> Íѳ°Éô¥â¥¸¥å¡¼¥ë
56 @section mimx-ispell-description DESCRIPTION
58 ¶¦Í¥é¥¤¥Ö¥é¥ê mimx-ispell.so ¤ÏÆþÎϥ᥽¥Ã¥É <en, ispell> ¤ËÍѤ¤¤é
59 ¤ì¤ë³°Éô¥â¥¸¥å¡¼¥ë¤Ç¤¢¤ê¡¢°Ê²¼¤Î´Ø¿ô¤ò export ¤·¤Æ¤¤¤ë¡£
72 ¸½ºß¤Î preedit ¥Æ¥¥¹¥È (±Ñʸ) ¤ÎÄÖ¤òÄ´¤Ù¡¢´Ö°ã¤Ã¤Æ¤¤¤ì¤Ð¸õÊä¤Î¥ê
77 ¤³¤Î¥×¥í¥°¥é¥à¤Ïm17n ÆþÎϥ᥽¥Ã¥ÉÍѳ°Éô¥â¥¸¥å¡¼¥ë¤Î½ñ¤Êý¤ò¼¨¤¹¤¿
78 ¤á¤Î¤â¤Î¤Ç¤¢¤ê¡¢¼ÂºÝ¤ÎÍøÍѤò°Õ¿Þ¤·¤¿¤â¤Î¤Ç¤Ï¤Ê¤¤¡£
80 @section mimx-ispell-seealso »²¾È
92 static int initialized = 0;
93 static int face_available;
94 static MFace *mface_overstrike = NULL;
97 add_action (MPlist *actions, MSymbol name, MSymbol key, void *val)
99 MPlist *action = mplist ();
101 mplist_add (action, Msymbol, name);
103 mplist_add (action, key, val);
104 mplist_add (actions, Mplist, action);
105 m17n_object_unref (action);
114 MFaceHLineProp hline;
117 if (m17n_status () == M17N_GUI_INITIALIZED)
120 hline.type = MFACE_HLINE_STRIKE_THROUGH;
122 hline.color = msymbol ("black");
123 mface_overstrike = mface ();
124 mface_put_prop (mface_overstrike, Mhline, &hline);
134 && --initialized == 0
136 m17n_object_unref (mface_overstrike);
141 ispell_word (MPlist *args)
144 unsigned char buf[256];
146 MPlist *actions, *candidates, *plist;
150 char *p = (char *) buf;
153 MSymbol select_state;
156 ic = mplist_value (args);
157 args = mplist_next (args);
158 init_state = (MSymbol) mplist_value (args);
159 args = mplist_next (args);
160 select_state = (MSymbol) mplist_value (args);
161 nbytes = mconv_encode_buffer (Mcoding_us_ascii, ic->preedit, buf, 256);
166 return add_action (actions, msymbol ("shift"), Msymbol, init_state);
169 sprintf (command, "echo %s | ispell -a -m", (char *) buf);
170 ispell = popen (command, "r");
172 return add_action (actions, msymbol ("shift"), Msymbol, init_state);
174 /* Skip the heading line. */
175 fgets (p, 256, ispell);
176 /* Read just 256 bytes, thus candidates listed after the first 256
177 bytes are just ignored. */
178 fgets (p, 256, ispell);
180 p[strlen (p) - 1] = '\0';
181 if (*p != '&' && *p != '#')
182 return add_action (actions, msymbol ("shift"), Msymbol, init_state);
184 add_action (actions, msymbol ("delete"), Msymbol, msymbol ("@<"));
187 mt = mtext_dup (ic->preedit);
189 mtext_push_prop (mt, 0, mtext_len (mt), Mface, mface_overstrike);
190 mplist_add (actions, Mtext, mt);
191 add_action (actions, msymbol ("shift"), Msymbol, init_state);
192 m17n_object_unref (mt);
196 p = strchr (p + 2, ' ');
197 if (sscanf (p, "%d", &n) != 1)
198 return add_action (actions, msymbol ("shift"), Msymbol, init_state);
199 words = alloca (sizeof (char *) * n);
200 p = strchr (p + 1, ' ');
201 p = strchr (p + 1, ' ');
202 for (i = 0; i < n - 1; i++)
214 candidates = mplist ();
215 for (i = 0; i < n; i++)
217 mt = mconv_decode_buffer (Mcoding_us_ascii, (unsigned char *) words[i],
219 mplist_add (candidates, Mtext, mt);
220 m17n_object_unref (mt);
222 mt = mtext_dup (ic->preedit);
224 mtext_push_prop (mt, 0, mtext_len (mt), Mface, mface_overstrike);
225 mplist_add (candidates, Mtext, mt);
226 m17n_object_unref (mt);
227 plist = mplist_add (mplist (), Mplist, candidates);
228 m17n_object_unref (candidates);
229 mplist_add (actions, Mplist, plist);
230 m17n_object_unref (plist);
231 add_action (actions, msymbol ("show"), Mnil, NULL);
232 add_action (actions, msymbol ("shift"), Msymbol, select_state);
236 #else /* not HAVE_ISPELL */
238 MPlist *ispell_word (MPlist *args) { return NULL; }
240 #endif /* not HAVE_ISPELL */
241 #endif /* not FOR_DOXYGEN */