From 5d2b7fd387bd887be957d9221c66a030b374938b Mon Sep 17 00:00:00 2001
From: thomascube <thomas@roundcube.net>
Date: Fri, 15 Aug 2008 06:35:09 -0400
Subject: [PATCH] Added pspell support patch by Kris Steinhoff (#1483960)

---
 CHANGELOG                           |    3 
 program/steps/mail/spell.inc        |   48 ++--------------
 program/steps/mail/spell_googie.inc |   64 +++++++++++++++++++++
 program/steps/mail/spell_pspell.inc |   54 ++++++++++++++++++
 config/main.inc.php.dist            |    7 ++
 5 files changed, 132 insertions(+), 44 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index d03e017..4a01686 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,10 +1,11 @@
 CHANGELOG RoundCube Webmail
 ---------------------------
 
-2008/08/14 (thomasb)
+2008/08/15 (thomasb)
 ----------
 - Use current mailbox name in template (#1485256)
 - Better fix for skipping untagged responses (#1485261)
+- Added pspell support patch by Kris Steinhoff (#1483960)
 
 2008/08/09 (alec)
 ----------
diff --git a/config/main.inc.php.dist b/config/main.inc.php.dist
index e79e3f3..5f61b9f 100644
--- a/config/main.inc.php.dist
+++ b/config/main.inc.php.dist
@@ -189,6 +189,10 @@
 // requires to be compiled with Open SSL support
 $rcmail_config['enable_spellcheck'] = TRUE;
 
+// Set the spell checking engine. 'googie' is the default. 'pspell' is also available,
+// but requires the Pspell extensions. When using Nox Spell Server, also set 'googie' here.
+$rcmail_config['spellcheck_engine'] = 'googie';
+
 // For a locally installed Nox Spell Server, please specify the URI to call it.
 // Get Nox Spell Server from http://orangoo.com/labs/?page_id=72
 // Leave empty to use the Google spell checking service, what means
@@ -197,7 +201,8 @@
 
 // These languages can be selected for spell checking.
 // Configure as a PHP style hash array: array('en'=>'English', 'de'=>'Deutsch');
-// Leave empty for default set of Google spell check languages
+// Leave empty for default set of Google spell check languages, should be defined
+// when using local Pspell extension
 $rcmail_config['spellcheck_languages'] = NULL;
 
 // path to a text file which will be added to each sent message
diff --git a/program/steps/mail/spell.inc b/program/steps/mail/spell.inc
index 06c0508..a567c7b 100644
--- a/program/steps/mail/spell.inc
+++ b/program/steps/mail/spell.inc
@@ -5,60 +5,24 @@
  | program/steps/mail/spell.inc                                          |
  |                                                                       |
  | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
- |   Submit request to Google's spell checking engine                    |
- |                                                                       |
- | CREDITS:                                                              |
- |   Script from GoogieSpell by amix.dk                                  |
+ |   Invoke the configured or default spell checking engine.             |
  |                                                                       |
  +-----------------------------------------------------------------------+
- | Author: Thomas Bruederli <roundcube@gmail.com>                        |
+ | Author: Kris Steinhoff <steinhof@umich.edu>                           |
  +-----------------------------------------------------------------------+
 
  $Id$
 
 */
 
-$REMOTE_REQUEST = TRUE;
+if ($spell_engine = $RCMAIL->config->get('spellcheck_engine', 'googie')) {
+    include('spell_'.$spell_engine.'.inc');
+}
 
-// 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');
-$store = "";
-
-if ($fp = fsockopen($host, $port, $errno, $errstr, 30))
-  {
-  $out = "POST $path HTTP/1.0\r\n";
-  $out .= "Host: $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);
-  }
-
-print $store;  
+header('HTTP/1.1 404 Not Found');
 exit;
 
 ?>
diff --git a/program/steps/mail/spell_googie.inc b/program/steps/mail/spell_googie.inc
new file mode 100644
index 0000000..06c0508
--- /dev/null
+++ b/program/steps/mail/spell_googie.inc
@@ -0,0 +1,64 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | program/steps/mail/spell.inc                                          |
+ |                                                                       |
+ | This file is part of the RoundCube Webmail client                     |
+ | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
+ | 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');
+$store = "";
+
+if ($fp = fsockopen($host, $port, $errno, $errstr, 30))
+  {
+  $out = "POST $path HTTP/1.0\r\n";
+  $out .= "Host: $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);
+  }
+
+print $store;  
+exit;
+
+?>
diff --git a/program/steps/mail/spell_pspell.inc b/program/steps/mail/spell_pspell.inc
new file mode 100644
index 0000000..ad637e8
--- /dev/null
+++ b/program/steps/mail/spell_pspell.inc
@@ -0,0 +1,54 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | program/steps/mail/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,
+      'file' => __FILE__,
+      'message' => "Pspell extension not available"), true, false);
+      
+    header('HTTP/1.1 404 Not Found');
+    exit;
+}
+
+$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).'">';
+foreach ($words as $w) {
+    $word = $w[0];
+    $pos  = $w[1];
+    $len  = strlen($word);
+    if (!pspell_check($plink, $word)) {
+        $suggestions = pspell_suggest($plink, $word);
+        $out .= '<c o="'.$pos.'" l="'.$len.'">';
+        $out .= implode("\t", $suggestions);
+        $out .= '</c>';
+    }
+}
+$out .= '</spellresult>';
+
+echo $out;
+exit;
+
+?>

--
Gitblit v1.9.1