Upping the version number and logging the change in ChangeLog
[squirrelmail.git] / plugins / squirrelspell / modules / check_me.mod
CommitLineData
849bdf42 1<?php
9804bcde 2 /**
3 ** check_me.mod.php -- Squirrelspell module
4 **
15e6162e 5 ** Copyright (c) 1999-2002 The SquirrelMail development team
9804bcde 6 ** Licensed under the GNU GPL. For full terms see the file COPYING.
7 **
8 ** This module is the main workhorse of SquirrelSpell. It submits
9 ** the message to the spell-checker, parses the output, and loads
10 ** the interface window.
11 **
12 ** $Id$
13 **/
849bdf42 14
158d478f 15function SpellLink( $cod, $tit, $ln ) {
16
17 echo "<td><a href=\"javascript:$cod\"".
18 " title=\"$tit\">$ln</a>".
19 '</td>';
20
21}
22
849bdf42 23// Declaring globals for E_ALL.
24global $sqspell_text, $SQSPELL_APP, $sqspell_use_app, $attachment_dir,
158d478f 25 $username, $SQSPELL_EREG, $color;
849bdf42 26
27 // Now we explode the lines for three reasons:
28 // 1) So we can ignore lines starting with ">" (reply's)
29 // 2) So we can stop processing when we get to "--" on a single line,
30 // which means that the signature is starting
31 // 3) So we can add an extra space at the beginning of each line. This way
32 // ispell/aspell don't treat these as command characters.
33 $sqspell_raw_lines = explode("\n", $sqspell_text);
34 for ($i=0; $i<sizeof($sqspell_raw_lines); $i++){
158d478f 35 if (trim($sqspell_raw_lines[$i]) == '--') break;
36 if(substr($sqspell_raw_lines[$i], 0, 1) != '>')
37 $sqspell_new_lines[$i] = ' ' . $sqspell_raw_lines[$i];
38 else $sqspell_new_lines[$i] = '';
849bdf42 39 }
40 $sqspell_new_text=implode("\n", $sqspell_new_lines);
41
42 // Define the command used to spellcheck the document.
43 $sqspell_command=$SQSPELL_APP[$sqspell_use_app];
44 // For the simplicity's sake we'll put all text into a file
45 // in attachment_dir directory, then cat it and pipe it to sqspell_command.
46 // There are other ways to do it, including popen(), but it's unidirectional
47 // and no fun at all.
48 // NOTE: This will probably change in future releases of squirrelspell
49 // for privacy reasons.
50 //
158d478f 51 $floc = "$attachment_dir/$username_sqspell_data.txt";
52 $fp=fopen($floc, 'w');
849bdf42 53 fwrite($fp, $sqspell_new_text);
54 fclose($fp);
55 exec("cat $floc | $sqspell_command", $sqspell_output);
56 unlink($floc);
57
58 // Load the user dictionary.
59 $words=sqspell_getLang(sqspell_getWords(), $sqspell_use_app);
60 // define some variables.
61 $current_line=0;
62 $missed_words=Array();
63 $misses = Array();
64 $locations = Array();
65 $errors=0;
66 // Now we process the output of sqspell_command (ispell or aspell
67 // in ispell compatibility mode, whichever).
68 for ($i=0; $i<sizeof($sqspell_output); $i++){
69 switch (substr($sqspell_output[$i], 0, 1)){
158d478f 70 case '':
849bdf42 71 // Ispell adds empty lines when an end of line is reached
72 $current_line++;
73 break;
74
158d478f 75 case '&':
849bdf42 76 // This means there's a misspelled word and a few suggestions.
77 list($left, $right) = explode(": ", $sqspell_output[$i]);
78 $tmparray = explode(" ", $left);
79 $sqspell_word=$tmparray[1];
80 // Check if the word is in user dictionary.
158d478f 81 if (!$SQSPELL_EREG("\n$sqspell_word\n", $words)){
849bdf42 82 $sqspell_symb=intval($tmparray[3])-1;
83 if (!$misses[$sqspell_word]) {
158d478f 84 $misses[$sqspell_word] = $right;
85 $missed_words[$errors] = $sqspell_word;
86 $errors++;
849bdf42 87 }
158d478f 88 if ($locations[$sqspell_word])
89 $locations[$sqspell_word] .= ', ';
849bdf42 90 $locations[$sqspell_word] .= "$current_line:$sqspell_symb";
91 }
92 break;
93
158d478f 94 case '#':
849bdf42 95 // This means a misspelled word and no suggestions.
96 $tmparray = explode(" ", $sqspell_output[$i]);
97 $sqspell_word=$tmparray[1];
98 // Check if the word is in user dictionary.
99 if (!$SQSPELL_EREG("\n$sqspell_word\n", $words)){
100 $sqspell_symb=intval($tmparray[2])-1;
101 if (!$misses[$sqspell_word]) {
158d478f 102 $misses[$sqspell_word] = '_NONE';
103 $missed_words[$errors] = $sqspell_word;
104 $errors++;
849bdf42 105 }
158d478f 106 if ($locations[$sqspell_word]) $locations[$sqspell_word] .= ', ';
849bdf42 107 $locations[$sqspell_word] .= "$current_line:$sqspell_symb";
108 }
109 break;
110 }
111 }
112
158d478f 113 if ($errors){
849bdf42 114 // So, there are errors
115 // This is the only place where the generic GUI-wrapper is not
116 // called, but generated right here. This is due to the complexity
117 // of the output.
849bdf42 118
158d478f 119 echo "<html>\n".
120 "<head>\n".
121 '<title>' . _("SquirrelSpell Results") . '</title>';
122 if ($theme_css != '') {
123 echo "<LINK REL=\"stylesheet\" TYPE=\"text/css\" HREF=\"$theme_css\">\n";
124 }
125 // Load the spelling errors into JavaScript arrays
126 echo "<script type=\"text/javascript\">\n".
127 "<!--\n";
128
129 $sqspell_lines = explode("\n", $sqspell_text);
130 // All lines of the message
131 echo "var sqspell_lines=new Array();\n";
132 for ($i=0; $i<sizeof($sqspell_lines); $i++){
133 echo "sqspell_lines[$i] = \"" . chop(addslashes($sqspell_lines[$i])) . "\";\n";
134 }
135
136 echo "\n\n";
137 // Misses are all misspelled words
138 echo "var misses=new Array();\n";
139 for ($i=0; $i<sizeof($missed_words); $i++){
849bdf42 140 echo "misses[$i] = \"" . $missed_words[$i] . "\";\n";
158d478f 141 }
849bdf42 142
158d478f 143 echo "\n\n";
144 // Suggestions are (guess what!) suggestions for misspellings
145 echo "var suggestions = new Array();\n";
146 $i=0;
147 while (list($word, $value) = each($misses)){
148 if ($value=='_NONE') $value='';
849bdf42 149 echo "suggestions[$i] = \"$value\";\n";
150 $i++;
158d478f 151 }
849bdf42 152
158d478f 153 echo "\n\n";
154 // Locations are where those misspellings are located, line:symbol
155 echo "var locations= new Array();\n";
156 $i=0;
157 while (list($word, $value) = each($locations)){
849bdf42 158 echo "locations[$i] = \"$value\";\n";
159 $i++;
158d478f 160 }
161 // Why isn't there a booger fairy?
162 echo "//-->\n".
163 "</script>\n".
2e3ad2bf 164 "<script src=\"js/check_me.js\" type=\"text/javascript\"></script>\n".
158d478f 165 "</head>\n";
166
167 echo "<body bgcolor=\"$color[4]\" text=\"$color[8]\" link=\"$color[7]\" alink=\"$color[7]\" vlink=\"$color[7]\" onload=\"populateSqspellForm()\">\n".
168 '<table width="100%" border="0" cellpadding="2">'.
169 "<tr><td bgcolor=\"$color[9]\" align=center><b>";
170 printf( _("Found %s errors"), $errors );
171?></b></td></tr>
849bdf42 172 <tr><td><hr></td></tr>
173 <tr><td>
174 <form method="post">
175 <input type="hidden" name="MOD" value="forget_me_not">
176 <input type="hidden" name="words" value="">
177 <input type="hidden" name="sqspell_use_app" value="<?php echo $sqspell_use_app ?>">
178 <table border="0" width="100%">
179 <tr align="center">
180 <td colspan="4">
158d478f 181<?php
182 $sptag = "<span style=\"background-color: $color[9]\">";
183 echo $sptag . _("Line with an error:") . '</span>';
184?>
185 <br>
849bdf42 186 <textarea name="sqspell_line_area" cols="50" rows="3" wrap="hard" onfocus="this.blur()"></textarea>
187 </td>
188 </tr>
189 <tr valign="middle">
190 <td align="right" width="25%">
158d478f 191<?php
192 echo $sptag . _("Error:") . '</span>';
193?>
849bdf42 194 </td>
195 <td align="left" width="25%">
196 <input name="sqspell_error" size="10" value="" onfocus="this.blur()">
197 </td>
198 <td align="right" width="25%">
158d478f 199<?php
200 echo $sptag . _("Suggestions:") . '</span>';
201?>
849bdf42 202 </td>
203 <td align="left" width="25%">
204 <select name="sqspell_suggestion" onchange="if (this.options[this.selectedIndex].value != '_NONE') document.forms[0].sqspell_oruse.value=this.options[this.selectedIndex].value">
158d478f 205<?php
206 echo '<option>' . _("Suggestions") . '</option>';
207?>
849bdf42 208 </select>
209 </td>
210 </tr>
211 <tr>
212 <td align="right">
158d478f 213<?php
214 echo $sptag . _("Change to:") . '</span>';
215?>
849bdf42 216 </td>
217 <td align="left">
218 <input name="sqspell_oruse" size="15" value=""
219 onfocus="if(!this.value) this.value=document.forms[0].sqspell_error.value">
220 </td>
221 <td align="right">
158d478f 222<?php
223 echo $sptag . _("Occurs times:") . '</span>';
224?>
849bdf42 225 </td>
226 <td align="left">
158d478f 227 <input name="sqspell_likethis" size=3 value="" onfocus="this.blur()">
849bdf42 228 </td>
229 </tr>
230 </td></tr>
231 <tr><td colspan="4"><hr></td></tr>
232 <tr>
233 <td colspan="4">
234 <table border="0" cellpadding="0" cellspacing="3" width="100%">
158d478f 235<?php
236 echo "<tr align=center bgcolor=\"$color[9]\">";
237
238 SpellLink( 'sqspellChange()',
239 _("Change this word"),
240 _("Change") );
241 SpellLink( 'sqspellChangeAll()',
242 _("Change ALL occurances of this word"),
243 _("Change All") );
244 SpellLink( 'sqspellIgnore()',
245 _("Ignore this word"),
246 _("Ignore") );
247 SpellLink( 'sqspellIgnoreAll()',
248 _("Ignore ALL occurances this word"),
249 _("Ignore All") );
250 SpellLink( 'sqspellRemember()',
251 _("Add this word to your personal dictionary"),
252 _("Add to Dic") );
253?>
849bdf42 254 </tr>
255 </table>
256 </td>
257 </tr>
258 <tr><td colspan="4"><hr></td></tr>
259 <tr>
158d478f 260<?php
261
262 echo "<td colspan=4 align=center bgcolor=\"$color[9]\">" .
263 '<input type="button" value=" ' .
264 _("Close and Commit") .
265 ' " onclick="if (confirm(\''.
266 _("The spellcheck is not finished. Really close and commit changes?").
267 '\')) sqspellCommitChanges()">'.
268 ' <input type="button" value=" '.
269 _("Close and Cancel") .
270 ' " onclick="if (confirm(\''.
271 _("The spellcheck is not finished. Really close and discard changes?").
272 '\')) self.close()">';
273?>
849bdf42 274 </td>
275 </tr>
276 </table>
277 </form>
278 </td></tr>
279 </table>
280 </body>
281 </html>
282 <?php
283 } else {
284 // AREN'T YOU SUCH A KNOW-IT-ALL!
158d478f 285 $msg="<form onsubmit=\"return false\"><div align=\"center\"><input type=\"submit\" value=\" " . _("Close") . " \" onclick=\"self.close()\"></div></form>";
286 sqspell_makeWindow(null, _("No errors found"), null, $msg);
849bdf42 287 }
288?>