Updated TODO.
[mp-5.x.git] / mp_spell.mpsl
blob71b74fa18b1f6dfe780d0abafb40ebc5ab09ad77
1 /*
3     Minimum Profit 5.x
4     A Programmer's Text Editor
6     Spellchecking code.
8     Copyright (C) 1991-2007 Angel Ortega <angel@triptico.com>
10     This program is free software; you can redistribute it and/or
11     modify it under the terms of the GNU General Public License
12     as published by the Free Software Foundation; either version 2
13     of the License, or (at your option) any later version.
15     This program is distributed in the hope that it will be useful,
16     but WITHOUT ANY WARRANTY; without even the implied warranty of
17     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18     GNU General Public License for more details.
20     You should have received a copy of the GNU General Public License
21     along with this program; if not, write to the Free Software
22     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
24     http://www.triptico.com
28 /* editor actions */
30 mp.actions['toggle_spellcheck'] = sub(d) { mp.ispell(-1); };
32 /* default key bindings */
34 /* action descriptions */
36 mp.actdesc['toggle_spellcheck'] = LL("Toggle spellchecking");
38 /* data */
40 /* spellchecking command */
41 mp.config.ispell_cmd = "ispell -a";
43 /* code */
45 sub mp.open_ispell_pipe
46 /* opens the pipe to ispell */
48         local p, l;
50         /* open the pipe */
51         if((p = popen(mp.config.ispell_cmd, "r+")) == NULL)
52                 return(NULL);
54         /* read the first line */
55         l = read(p);
57         /* check for the signature */
58         if(! regex('/^@\(#\) International Ispell/', l))
59         {
60                 pclose(p);
61                 return(NULL);
62         }
64         /* it works; set the word color function */
65         mp.word_color_func = mp.ispell_word_color_func;
67         /* store the pipe */
68         mp.ispell_pipe = p;
72 sub mp.close_ispell_pipe
73 /* closes the pipe to ispell */
75         if(mp.ispell_pipe == NULL)
76                 return;
78         /* close and delete */
79         pclose(mp.ispell_pipe);
80         mp.ispell_pipe = NULL;
82         /* delete all words marked as misspelled from the word cache */
83         foreach(local w, keys(mp.word_color))
84         {
85                 if(mp.word_color[w] == mp.colors.spell.attr)
86                         hdel(mp.word_color, w);
87         }
89         /* delete the word color function */
90         mp.word_color_func = NULL;
94 sub mp.ispell_word_color_func(w)
95 /* mp.word_color_func() for ispell */
97         local l, a;
99         a = -1;
101         /* attributes must exist before entering here */
102         if(mp.colors.spell.attr == NULL)
103                 return(-1);
105         /* write the word */
106         write(mp.ispell_pipe, w ~ "\n");
108         /* wait for the response */
109         if((l = read(mp.ispell_pipe)) == NULL)
110                 mp.close_ispell_pipe();
111         else
112         {
113                 local t = l;
115                 /* drop all lines until an empty one */
116                 while(t ne "\n")
117                         t = read(mp.ispell_pipe);
119                 /* take first char of the response */
120                 l = regex('/^./', l);
122                 /* if it's not a '*' nor a '+', it's misspelled */
123                 if(l ne '*' && l ne '+')
124                         a = mp.colors.spell.attr;
125         }
127         /* store the attribute in the cache */
128         mp.word_color[w] = a;
130         return(a);
134 sub mp.ispell(b)
135 /* sets or unsets spell checking (-1, toggle) */
137         if(b == -1)
138                 b = mp.ispell_pipe == NULL && 1 || 0;
140         b && mp.open_ispell_pipe() || mp.close_ispell_pipe();