diff options
author | alecpl <alec@alec.pl> | 2011-05-30 15:08:26 +0000 |
---|---|---|
committer | alecpl <alec@alec.pl> | 2011-05-30 15:08:26 +0000 |
commit | b4edf78e4b75bc40a829147941ba0cf6379fbc39 (patch) | |
tree | 04b7d939ee4a5e954fb607a05bb150803185ad91 /program/steps | |
parent | 55150f858fc5b46eefed76687352283d4ef1503c (diff) |
- Provided rcube_spellchecker class, simplified code in utils task (less spell* files)
Diffstat (limited to 'program/steps')
-rw-r--r-- | program/steps/utils/spell.inc | 26 | ||||
-rw-r--r-- | program/steps/utils/spell_googie.inc | 75 | ||||
-rw-r--r-- | program/steps/utils/spell_html.inc | 53 | ||||
-rw-r--r-- | program/steps/utils/spell_html_googie.inc | 110 | ||||
-rw-r--r-- | program/steps/utils/spell_html_pspell.inc | 76 | ||||
-rw-r--r-- | program/steps/utils/spell_pspell.inc | 75 |
6 files changed, 71 insertions, 344 deletions
diff --git a/program/steps/utils/spell.inc b/program/steps/utils/spell.inc index f61939d68..358576c7c 100644 --- a/program/steps/utils/spell.inc +++ b/program/steps/utils/spell.inc @@ -5,6 +5,7 @@ | program/steps/utils/spell.inc | | | | This file is part of the Roundcube Webmail client | + | Copyright (C) 2005-2011, The Roundcube Dev Team | | Licensed under the GNU GPL | | | | PURPOSE: | @@ -18,15 +19,24 @@ */ -// max. number of suggestions for one word -define('MAX_SUGGESTIONS', 10); +// read input +$lang = get_input_value('lang', RCUBE_INPUT_GET); +$data = file_get_contents('php://input'); -$tiny = !empty($_GET['tiny']) ? 'html_' : ''; +// Get data string +$left = strpos($data, '<text>'); +$right = strrpos($data, '</text>'); +$data = substr($data, $left+6, $right-($left+6)); +$data = html_entity_decode($data, ENT_QUOTES, RCMAIL_CHARSET); -if ($spell_engine = $RCMAIL->config->get('spellcheck_engine', 'googie')) { - include('spell_'.$tiny.$spell_engine.'.inc'); -} +$spellchecker = new rcube_spellchecker($lang); +$spellchecker->check($data); +$result = $spellchecker->get_xml(); -header('HTTP/1.1 404 Not Found'); -exit; +// set response length +header("Content-Length: " . strlen($result)); +// Don't use server's default Content-Type charset (#1486406) +header("Content-Type: text/xml; charset=" . RCMAIL_CHARSET); +print $result; +exit; diff --git a/program/steps/utils/spell_googie.inc b/program/steps/utils/spell_googie.inc deleted file mode 100644 index bb6b9e106..000000000 --- a/program/steps/utils/spell_googie.inc +++ /dev/null @@ -1,75 +0,0 @@ -<?php - -/* - +-----------------------------------------------------------------------+ - | program/steps/utils/spell_googie.inc | - | | - | This file is part of the Roundcube Webmail client | - | Copyright (C) 2005-2007, The Roundcube Dev Team | - | Licensed under the GNU GPL | - | | - | PURPOSE: | - | Submit request to Google's spell checking engine | - | | - | CREDITS: | - | Script from GoogieSpell by amix.dk | - | | - +-----------------------------------------------------------------------+ - | Author: Thomas Bruederli <roundcube@gmail.com> | - +-----------------------------------------------------------------------+ - - $Id$ - -*/ - -$REMOTE_REQUEST = TRUE; - -// default settings -$host = "ssl://www.google.com"; -$port = 443; -$lang = get_input_value('lang', RCUBE_INPUT_GET); -$path = "/tbproxy/spell?lang=$lang"; - -// spell check uri is configured -if (!empty($CONFIG['spellcheck_uri'])) - { - $a_uri = parse_url($CONFIG['spellcheck_uri']); - $ssl = ($a_uri['scheme']=='https' || $a_uri['scheme']=='ssl'); - $port = $a_uri['port'] ? $a_uri['port'] : ($ssl ? 443 : 80); - $host = ($ssl ? 'ssl://' : '') . $a_uri['host']; - $path = $a_uri['path'] . ($a_uri['query'] ? '?'.$a_uri['query'] : '') . $lang; - } - -$data = file_get_contents('php://input'); -// Google has some problem with spaces, use \n instead -$data = str_replace(' ', "\n", $data); -$store = ""; - -if ($fp = fsockopen($host, $port, $errno, $errstr, 30)) - { - $out = "POST $path HTTP/1.0\r\n"; - $out .= "Host: " . str_replace('ssl://', '', $host) . "\r\n"; - $out .= "Content-Length: " . strlen($data) . "\r\n"; - $out .= "Content-Type: application/x-www-form-urlencoded\r\n"; - $out .= "Connection: Close\r\n\r\n"; - $out .= $data; - fwrite($fp, $out); - - while (!feof($fp)) - $store .= fgets($fp, 128); - fclose($fp); - } - -// remove headers -$pos = strpos($store, '<?xml'); -$store = substr($store, $pos); - -// set response length -header("Content-Length: " . strlen($store)); - -// Don't use server's default Content-Type charset (#1486406) -header("Content-Type: text/xml; charset=".RCMAIL_CHARSET); -print $store; -exit; - - diff --git a/program/steps/utils/spell_html.inc b/program/steps/utils/spell_html.inc new file mode 100644 index 000000000..d69c73f37 --- /dev/null +++ b/program/steps/utils/spell_html.inc @@ -0,0 +1,53 @@ +<?php + +/* + +-----------------------------------------------------------------------+ + | program/steps/utils/spell_html.inc | + | | + | This file is part of the Roundcube Webmail client | + | Copyright (C) 2005-2011, The Roundcube Dev Team | + | Licensed under the GNU GPL | + | | + | PURPOSE: | + | Spellchecker for TinyMCE | + | | + +-----------------------------------------------------------------------+ + | Author: Aleksander Machniak <alec@alec.pl> | + +-----------------------------------------------------------------------+ + + $Id$ + +*/ + +// read input data +$data = file_get_contents('php://input'); + +// Decode JSON input +$request = json_decode($data, true); +$result = array(); + +$lang = $request['params'][0]; +$data = $request['params'][1]; +$data = implode("\n", (array) $data); + +$result['id'] = $request['id']; + +$spellchecker = new rcube_spellchecker($lang); + +if ($request['method'] == 'checkWords') { + $result['result'] = $spellchecker->get_words($data); +} +else if ($request['method'] == 'getSuggestions') { + $result['result'] = $spellchecker->get_suggestions($data); +} + +if ($error = $spellchecker->error()) { + echo '{"error":{"errstr":"' . addslashes($error) . '","errfile":"","errline":null,"errcontext":"","level":"FATAL"}}'; + exit; +} + +// send output +header("Content-Type: text/xml; charset=".RCMAIL_CHARSET); +echo json_encode($result); +exit; + diff --git a/program/steps/utils/spell_html_googie.inc b/program/steps/utils/spell_html_googie.inc deleted file mode 100644 index ceda62687..000000000 --- a/program/steps/utils/spell_html_googie.inc +++ /dev/null @@ -1,110 +0,0 @@ -<?php - -/* - +-----------------------------------------------------------------------+ - | program/steps/utils/spell_html_googie.inc | - | | - | This file is part of the Roundcube Webmail client | - | Copyright (C) 2005-2010, The Roundcube Dev Team | - | Licensed under the GNU GPL | - | | - | PURPOSE: | - | Submit request to Google's spell checking engine | - | | - +-----------------------------------------------------------------------+ - | Author: Aleksander Machniak <alec@alec.pl> | - +-----------------------------------------------------------------------+ - - $Id: spell_googie.inc 3780 2010-06-23 09:55:08Z alec $ - -*/ - -function json_error($str) -{ - echo '{"error":{"errstr":"' . addslashes($str) . '","errfile":"","errline":null,"errcontext":"","level":"FATAL"}}'; - exit; -} - -function googie_get($host, $port, $path, $data) -{ - $store = ''; - if ($fp = fsockopen($host, $port, $errno, $errstr, 30)) { - $out = "POST $path HTTP/1.0\r\n"; - $out .= "Host: " . str_replace('ssl://', '', $host) . "\r\n"; - $out .= "Content-Length: " . strlen($data) . "\r\n"; - $out .= "Content-Type: application/x-www-form-urlencoded\r\n"; - $out .= "Connection: Close\r\n\r\n"; - $out .= $data; - fwrite($fp, $out); - - while (!feof($fp)) - $store .= fgets($fp, 128); - fclose($fp); - } - - if (!$store) { - json_error("Empty result from spelling engine"); - } - - $matches = array(); - preg_match_all('/<c o="([^"]*)" l="([^"]*)" s="([^"]*)">([^<]*)<\/c>/', $store, $matches, PREG_SET_ORDER); - - return $matches; -} - -$REMOTE_REQUEST = TRUE; - -// read input -$data = file_get_contents('php://input'); - -// Decode JSON input -$request = json_decode($data, true); -$result = array(); - -$lang = $request['params'][0]; -$data = $request['params'][1]; -$result['id'] = $request['id']; - -// default settings -$host = "ssl://www.google.com"; -$port = 443; -$path = "/tbproxy/spell?lang=$lang"; - -// spell check uri is configured -if (!empty($CONFIG['spellcheck_uri'])) - { - $a_uri = parse_url($CONFIG['spellcheck_uri']); - $ssl = ($a_uri['scheme']=='https' || $a_uri['scheme']=='ssl'); - $port = $a_uri['port'] ? $a_uri['port'] : ($ssl ? 443 : 80); - $host = ($ssl ? 'ssl://' : '') . $a_uri['host']; - $path = $a_uri['path'] . ($a_uri['query'] ? '?'.$a_uri['query'] : '') . $lang; - } - -$wordstr = implode("\n", (array) $data); -$data = '<?xml version="1.0" encoding="utf-8" ?>' - .'<spellrequest textalreadyclipped="0" ignoredups="0" ignoredigits="1" ignoreallcaps="1">' - .'<text>' . $wordstr . '</text>' - .'</spellrequest>'; -$matches = googie_get($host, $port, $path, $data); - -if ($request['method'] == 'checkWords') { - $result['result'] = array(); - for ($i=0, $len=count($matches); $i<$len; $i++) - $result['result'][] = mb_substr($wordstr, $matches[$i][1], $matches[$i][2], RCMAIL_CHARSET); -} -else if ($request['method'] == 'getSuggestions') { - if ($matches[0][4]) { - $suggestions = explode("\t", $matches[0][4]); - if (sizeof($suggestions)>MAX_SUGGESTIONS) - $suggestions = array_slice($suggestions, 0, MAX_SUGGESTIONS); - $result['result'] = $suggestions; - } - else - $result['result'] = array(); -} - -// send output -header("Content-Type: text/xml; charset=".RCMAIL_CHARSET); -echo json_encode($result); -exit; - diff --git a/program/steps/utils/spell_html_pspell.inc b/program/steps/utils/spell_html_pspell.inc deleted file mode 100644 index f8c3d38cd..000000000 --- a/program/steps/utils/spell_html_pspell.inc +++ /dev/null @@ -1,76 +0,0 @@ -<?php - -/* - +-----------------------------------------------------------------------+ - | program/steps/utils/spell_pspell_tiny.inc | - | | - | This file is part of the Roundcube Webmail client | - | Copyright (C) 2005-2010, The Roundcube Dev Team | - | Licensed under the GNU GPL | - | | - | PURPOSE: | - | Use the Pspell extension to check spelling in TinyMCE | - | | - +-----------------------------------------------------------------------+ - | Author: Aleksander Machniak <alec@alec.pl> | - +-----------------------------------------------------------------------+ - - $Id: spell_pspell.inc 3780 2010-06-23 09:55:08Z alec $ - -*/ - -function json_error($str) -{ - echo '{"error":{"errstr":"' . addslashes($str) . '","errfile":"","errline":null,"errcontext":"","level":"FATAL"}}'; - exit; -} - -if (!extension_loaded('pspell')) { - raise_error(array( - 'code' => 500, - 'type' => 'php', - 'file' => __FILE__, 'line' => __LINE__, - 'message' => "Pspell extension not available"), true, false); - - json_error("Pspell extension not available"); -} - -// read input -$data = file_get_contents('php://input'); - -// Decode JSON input -$request = json_decode($data, true); -$result = array(); - -$lang = $request['params'][0]; -$data = $request['params'][1]; -$result['id'] = $request['id']; - -// init spellchecker -$plink = pspell_new($lang, null, null, RCMAIL_CHARSET, PSPELL_FAST); - -if (!$plink) { - json_error("Unable to load Pspell engine for selected language"); -} - -if ($request['method'] == 'checkWords') { - $result['result'] = array(); - foreach ((array)$data as $word) { - if ($word && preg_match('/[^0-9\.]/', $word) - && !pspell_check($plink, $word)) { - $result['result'][] = $word; - } - } -} -else if ($request['method'] == 'getSuggestions') { - $suggestions = pspell_suggest($plink, $data); - if (sizeof($suggestions)>MAX_SUGGESTIONS) - $suggestions = array_slice($suggestions, 0, MAX_SUGGESTIONS); - $result['result'] = $suggestions; -} - -// send output -header("Content-Type: text/xml; charset=".RCMAIL_CHARSET); -echo json_encode($result); -exit; - diff --git a/program/steps/utils/spell_pspell.inc b/program/steps/utils/spell_pspell.inc deleted file mode 100644 index 44415cd60..000000000 --- a/program/steps/utils/spell_pspell.inc +++ /dev/null @@ -1,75 +0,0 @@ -<?php - -/* - +-----------------------------------------------------------------------+ - | program/steps/utils/spell_pspell.inc | - | | - | This file is part of the Roundcube Webmail client | - | Licensed under the GNU GPL | - | | - | PURPOSE: | - | Use the Pspell extension to check spelling, returns results | - | compatible with spell_googie.inc. | - | | - +-----------------------------------------------------------------------+ - | Author: Kris Steinhoff <steinhof@umich.edu> | - +-----------------------------------------------------------------------+ - - $Id$ - -*/ - -if (!extension_loaded('pspell')) { - raise_error(array( - 'code' => 500, - 'type' => 'php', - 'file' => __FILE__, 'line' => __LINE__, - 'message' => "Pspell extension not available"), true, false); - - header('HTTP/1.1 404 Not Found'); - exit; -} - -// read input -$data = file_get_contents('php://input'); - -// 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:;<=>?@\[\]^_{|}-]+|\.[^\w]/', $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="'.RCMAIL_CHARSET.'"?><spellresult charschecked="'.mb_strlen($text).'">'; - -$diff = 0; -foreach ($words as $w) { - $word = trim($w[0]); - $pos = $w[1] - $diff; - $len = mb_strlen($word); - if ($word && $plink && preg_match('/[^0-9\.]/', $word) - && !pspell_check($plink, $word)) { - $suggestions = pspell_suggest($plink, $word); - if (sizeof($suggestions)>MAX_SUGGESTIONS) - $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; charset=".RCMAIL_CHARSET); -echo $out; -exit; - - |