| [ Index ] |
PHP Cross Reference of Moodle 1.9.3 [Build 15-Oct-2008] |
[Summary view] [Print] [Text view]
1 <?php // $Id: spellchecker.php,v 1.10 2007/04/15 17:04:26 skodak Exp $ 2 include_once("../../../config.php"); 3 require_login(); 4 5 if (empty($CFG->aspellpath)) { 6 error('Spellchecker not configured'); 7 } 8 9 header('Content-type: text/html; charset=utf-8'); 10 11 // Speller pages script http://spellerpages.sourceforge.net/ 12 // Modified by Marc Alier on August 2004 for the integration with moodle 13 14 $aspell_prog = escapeshellarg($CFG->aspellpath); 15 $spellercss = $CFG->wwwroot .'/lib/speller/spellerStyle.css'; 16 $word_win_src = $CFG->wwwroot .'/lib/speller/wordWindow.js'; 17 18 19 $textinputs = $_POST['textinputs']; // array 20 21 if(!($lang = check_language($aspell_prog))) { 22 error_handler("No suitable dictionary found installed on your server!"); 23 exit; 24 } 25 26 $aspell_opts = '-a -H --lang='. $lang .' --encoding=utf-8'; 27 if (!empty($CFG->aspellextradicts)) { // eg /usr/bin/.aspell.en.pws 28 $aspell_opts .= ' --add-extra-dicts='.$CFG->aspellextradicts; 29 } 30 $tempfiledir = $CFG->dataroot; // Use dataroot since it must be writable 31 $input_separator = 'A'; 32 33 function check_language($cmd) { 34 /// return users current language if its 35 /// dictionary is found installed in system 36 /// and always return english if user's own 37 /// language is not in the list. If english dictionary 38 /// isn't found, then false is returned. 39 40 global $CFG; 41 42 clearstatcache(); 43 $current_lang = str_replace('_utf8', '', current_language()); 44 $output = ''; 45 46 if(!($handle = popen($cmd .' dump dicts', 'r'))) { 47 error_handler("Couldn't create handle!"); 48 exit; 49 } 50 51 while(!feof($handle)) { 52 $output .= fread($handle, 1024); 53 } 54 @pclose($handle); 55 56 $dicts = explode(chr(10), strtolower($output)); 57 58 if(is_array($dicts)) { 59 if(in_array($current_lang,$dicts)) { 60 return $current_lang; 61 } 62 } 63 64 if (!empty($CFG->editordictionary)) { 65 return $CFG->editordictionary; 66 } 67 68 return false; 69 70 } 71 72 // set the JavaScript variable to the submitted text. 73 // textinputs is an array, each element corresponding to the (url-encoded) 74 // value of the text control submitted for spell-checking 75 function print_textinputs_var() { 76 global $textinputs; 77 foreach( $textinputs as $key=>$val ) { 78 // $val = str_replace( "'", "%27", $val ); 79 echo "textinputs[$key] = decodeURIComponent(\"" . $val . "\");\n"; 80 } 81 } 82 83 // make declarations for the text input index 84 function print_textindex_decl( $text_input_idx ) { 85 echo "words[$text_input_idx] = [];\n"; 86 echo "suggs[$text_input_idx] = [];\n"; 87 } 88 89 // set an element of the JavaScript 'words' array to a misspelled word 90 function print_words_elem( $word, $index, $text_input_idx ) { 91 echo "words[$text_input_idx][$index] = '" . escape_quote( $word ) . "';\n"; 92 } 93 94 95 // set an element of the JavaScript 'suggs' array to a list of suggestions 96 function print_suggs_elem( $suggs, $index, $text_input_idx ) { 97 echo "suggs[$text_input_idx][$index] = ["; 98 foreach( $suggs as $key=>$val ) { 99 if( $val ) { 100 echo "'" . escape_quote( $val ) . "'"; 101 if ( $key+1 < count( $suggs )) { 102 echo ", "; 103 } 104 } 105 } 106 echo "];\n"; 107 } 108 109 // escape single quote 110 function escape_quote( $str ) { 111 return preg_replace ( "/'/", "\\'", $str ); 112 } 113 114 115 // handle a server-side error. 116 function error_handler( $err ) { 117 echo "error = '" . escape_quote( $err ) . "';\n"; 118 } 119 120 // get the list of misspelled words. Put the results in the javascript words array 121 // for each misspelled word, get suggestions and put in the javascript suggs array 122 function print_checker_results() { 123 124 global $aspell_prog; 125 global $aspell_opts; 126 global $tempfiledir; 127 global $textinputs; 128 global $input_separator; 129 $aspell_err = ""; 130 // create temp file 131 $tempfile = tempnam( $tempfiledir, 'aspell_data_' ); 132 133 // open temp file, add the submitted text. 134 if( $fh = fopen( $tempfile, 'w' )) { 135 for( $i = 0; $i < count( $textinputs ); $i++ ) { 136 $text = urldecode( $textinputs[$i] ); 137 $lines = explode( "\n", $text ); 138 fwrite ( $fh, "%\n" ); // exit terse mode 139 fwrite ( $fh, "^$input_separator\n" ); 140 fwrite ( $fh, "!\n" ); // enter terse mode 141 foreach( $lines as $key=>$value ) { 142 // use carat on each line to escape possible aspell commands 143 fwrite( $fh, "^$value\n" ); 144 } 145 } 146 fclose( $fh ); 147 148 // exec aspell command - redirect STDERR to STDOUT 149 $cmd = "$aspell_prog $aspell_opts < $tempfile 2>&1"; 150 if( $aspellret = shell_exec( $cmd )) { 151 $linesout = explode( "\n", $aspellret ); 152 $index = 0; 153 $text_input_index = -1; 154 // parse each line of aspell return 155 foreach( $linesout as $key=>$val ) { 156 $chardesc = substr( $val, 0, 1 ); 157 // if '&', then not in dictionary but has suggestions 158 // if '#', then not in dictionary and no suggestions 159 // if '*', then it is a delimiter between text inputs 160 // if '@' then version info 161 if( $chardesc == '&' || $chardesc == '#' ) { 162 $line = explode( " ", $val, 5 ); 163 print_words_elem( $line[1], $index, $text_input_index ); 164 if( isset( $line[4] )) { 165 $suggs = explode( ", ", $line[4] ); 166 } else { 167 $suggs = array(); 168 } 169 print_suggs_elem( $suggs, $index, $text_input_index ); 170 $index++; 171 } elseif( $chardesc == '*' ) { 172 $text_input_index++; 173 print_textindex_decl( $text_input_index ); 174 $index = 0; 175 } elseif( $chardesc != '@' && $chardesc != "" ) { 176 // assume this is error output 177 $aspell_err .= $val; 178 } 179 } 180 if( $aspell_err ) { 181 $aspell_err = "Error executing `$cmd`\\n$aspell_err"; 182 error_handler( $aspell_err ); 183 } 184 } else { 185 error_handler( "System error: Aspell program execution failed (`$cmd`)" ); 186 } 187 } else { 188 error_handler( "System error: Could not open file '$tempfile' for writing" ); 189 } 190 191 // close temp file, delete file 192 unlink( $tempfile ); 193 } 194 195 196 ?> 197 <html> 198 <head> 199 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 200 <link rel="stylesheet" type="text/css" href="<?php echo $spellercss ?>" /> 201 <script type="text/javascript" src="<?php echo $word_win_src ?>"></script> 202 <script type="text/javascript"> 203 //<![CDATA[ 204 var suggs = new Array(); 205 var words = new Array(); 206 var textinputs = new Array(); 207 var error; 208 <?php 209 210 print_textinputs_var(); 211 212 print_checker_results(); 213 214 ?> 215 216 var wordWindowObj = new wordWindow(); 217 wordWindowObj.originalSpellings = words; 218 wordWindowObj.suggestions = suggs; 219 wordWindowObj.textInputs = textinputs; 220 221 function init_spell() { 222 // check if any error occured during server-side processing 223 if( error ) { 224 alert( error ); 225 } else { 226 // call the init_spell() function in the parent frameset 227 if (parent.frames.length) { 228 parent.init_spell( wordWindowObj ); 229 } else { 230 alert('This page was loaded outside of a frameset. It might not display properly'); 231 } 232 } 233 } 234 235 //]]> 236 </script> 237 238 </head> 239 <body onLoad="init_spell();"> 240 241 <script type="text/javascript"> 242 //<![CDATA[ 243 wordWindowObj.writeBody(); 244 //]]> 245 </script> 246 247 </body> 248 </html>
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
| Generated: Wed Jan 14 11:33:29 2009 | Cross-referenced by PHPXref 0.7 |