| | |
| | | if (!extension_loaded('pspell')) { |
| | | raise_error(array( |
| | | 'code' => 500, |
| | | 'type' => 'php', |
| | | 'file' => __FILE__, |
| | | 'message' => "Pspell extension not available"), true, false); |
| | | |
| | |
| | | exit; |
| | | } |
| | | |
| | | // max. number of suggestions for one word |
| | | define('MAX_SUGGESTIONS', 10); |
| | | |
| | | // read input |
| | | $data = file_get_contents('php://input'); |
| | | $xml = simplexml_load_string($data); |
| | | $text = (string)$xml->text; |
| | | $words = preg_split('/[ !"#$%&()*+\\,-.\/\n:;<=>?@\[\]^_{|}]+/', $text, NULL, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_OFFSET_CAPTURE ); |
| | | $plink = pspell_new(get_input_value('lang', RCUBE_INPUT_GET), null, null, 'utf-8'); |
| | | $out = '<?xml version="1.0" encoding="UTF-8"?><spellresult charschecked="'.strlen($text).'">'; |
| | | |
| | | // parse data (simplexml_load_string breaks CRLFs) |
| | | $left = strpos($data, '<text>'); |
| | | $right = strrpos($data, '</text>'); |
| | | $text = substr($data, $left+6, $right-($left+6)); |
| | | $text = html_entity_decode($text, ENT_QUOTES, RCMAIL_CHARSET); |
| | | |
| | | // tokenize |
| | | $words = preg_split('/[ !"#$%&()*+\\,-.\/\n:;<=>?@\[\]^_{|}]+/', $text, NULL, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_OFFSET_CAPTURE ); |
| | | |
| | | // init spellchecker |
| | | $plink = pspell_new(get_input_value('lang', RCUBE_INPUT_GET), null, null, RCMAIL_CHARSET, PSPELL_FAST); |
| | | |
| | | // send output |
| | | $out = '<?xml version="1.0" encoding="UTF-8"?><spellresult charschecked="'.rc_strlen($text).'">'; |
| | | |
| | | $diff = 0; |
| | | foreach ($words as $w) { |
| | | $word = $w[0]; |
| | | $pos = $w[1]; |
| | | $len = strlen($word); |
| | | if (!pspell_check($plink, $word)) { |
| | | $word = trim($w[0]); |
| | | $pos = $w[1] - $diff; |
| | | $len = rc_strlen($word); |
| | | if ($word && $plink && !pspell_check($plink, $word)) { |
| | | $suggestions = pspell_suggest($plink, $word); |
| | | if (sizeof($suggestions)>10) |
| | | $suggestions = array_slice($suggestions, 0, MAX_SUGGESTIONS); |
| | | |
| | | $out .= '<c o="'.$pos.'" l="'.$len.'">'; |
| | | $out .= implode("\t", $suggestions); |
| | | $out .= '</c>'; |
| | | } |
| | | $diff += (strlen($word) - $len); |
| | | } |
| | | |
| | | $out .= '</spellresult>'; |
| | | |
| | | header("Content-Type: text/xml"); |
| | | echo $out; |
| | | exit; |
| | | |