]> git.donarmstrong.com Git - roundcube.git/blobdiff - program/js/tiny_mce/plugins/spellchecker/classes/GoogleSpell.php
Imported Upstream version 0.2~stable
[roundcube.git] / program / js / tiny_mce / plugins / spellchecker / classes / GoogleSpell.php
diff --git a/program/js/tiny_mce/plugins/spellchecker/classes/GoogleSpell.php b/program/js/tiny_mce/plugins/spellchecker/classes/GoogleSpell.php
new file mode 100755 (executable)
index 0000000..d57dee7
--- /dev/null
@@ -0,0 +1,166 @@
+<?php\r
+/**\r
+ * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+class GoogleSpell extends SpellChecker {\r
+       /**\r
+        * Spellchecks an array of words.\r
+        *\r
+        * @param {String} $lang Language code like sv or en.\r
+        * @param {Array} $words Array of words to spellcheck.\r
+        * @return {Array} Array of misspelled words.\r
+        */\r
+       function &checkWords($lang, $words) {\r
+               $wordstr = implode(' ', $words);\r
+               $matches = $this->_getMatches($lang, $wordstr);\r
+               $words = array();\r
+\r
+               for ($i=0; $i<count($matches); $i++)\r
+                       $words[] = $this->_unhtmlentities(mb_substr($wordstr, $matches[$i][1], $matches[$i][2], "UTF-8"));\r
+\r
+               return $words;\r
+       }\r
+\r
+       /**\r
+        * Returns suggestions of for a specific word.\r
+        *\r
+        * @param {String} $lang Language code like sv or en.\r
+        * @param {String} $word Specific word to get suggestions for.\r
+        * @return {Array} Array of suggestions for the specified word.\r
+        */\r
+       function &getSuggestions($lang, $word) {\r
+               $sug = array();\r
+               $osug = array();\r
+               $matches = $this->_getMatches($lang, $word);\r
+\r
+               if (count($matches) > 0)\r
+                       $sug = explode("\t", $this->_unhtmlentities($matches[0][4]));\r
+\r
+               // Remove empty\r
+               foreach ($sug as $item) {\r
+                       if ($item)\r
+                               $osug[] = $item;\r
+               }\r
+\r
+               return $osug;\r
+       }\r
+\r
+       function &_getMatches($lang, $str) {\r
+               $server = "www.google.com";\r
+               $port = 443;\r
+               $path = "/tbproxy/spell?lang=" . $lang . "&hl=en";\r
+               $ssl = true;\r
+               \r
+               // spell check uri is configured (added by RoundCube)\r
+               if (!empty($this->_config['rpc_uri'])) {\r
+                       $a_uri = parse_url($this->_config['rpc_uri']);\r
+                       $ssl = ($a_uri['scheme']=='https' || $a_uri['scheme']=='ssl');\r
+                       $port = $a_uri['port'] ? $a_uri['port'] : ($ssl ? 443 : 80);\r
+                       $server = $a_uri['host'];\r
+                       $path = $a_uri['path'] . ($a_uri['query'] ? '?'.$a_uri['query'] : '') . $lang;\r
+               }\r
+\r
+               // Setup XML request\r
+               $xml = '<?xml version="1.0" encoding="utf-8" ?><spellrequest textalreadyclipped="0" ignoredups="0" ignoredigits="1" ignoreallcaps="1"><text>' . $str . '</text></spellrequest>';\r
+\r
+               $header  = "POST ".$path." HTTP/1.0 \r\n";\r
+               $header .= "MIME-Version: 1.0 \r\n";\r
+               $header .= "Content-type: application/PTI26 \r\n";\r
+               $header .= "Content-length: ".strlen($xml)." \r\n";\r
+               $header .= "Content-transfer-encoding: text \r\n";\r
+               $header .= "Request-number: 1 \r\n";\r
+               $header .= "Document-type: Request \r\n";\r
+               $header .= "Interface-Version: Test 1.4 \r\n";\r
+               $header .= "Connection: close \r\n\r\n";\r
+               $header .= $xml;\r
+\r
+               // Use curl if it exists\r
+               if (function_exists('curl_init')) {\r
+                       // Use curl\r
+                       $ch = curl_init();\r
+                       curl_setopt($ch, CURLOPT_URL, ($ssl ? "https://" : "http://") . $server);\r
+                       curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\r
+                       curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $header);\r
+                       curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);\r
+                       $xml = curl_exec($ch);\r
+                       curl_close($ch);\r
+               } else {\r
+                       // Use raw sockets\r
+                       $fp = fsockopen(($ssl ? "ssl://" : "") . $server, $port, $errno, $errstr, 30);\r
+                       if ($fp) {\r
+                               // Send request\r
+                               fwrite($fp, $header);\r
+\r
+                               // Read response\r
+                               $xml = "";\r
+                               while (!feof($fp))\r
+                                       $xml .= fgets($fp, 128);\r
+\r
+                               fclose($fp);\r
+                       } else\r
+                               echo "Could not open SSL connection to google.";\r
+               }\r
+\r
+               // Grab and parse content\r
+               $matches = array();\r
+               preg_match_all('/<c o="([^"]*)" l="([^"]*)" s="([^"]*)">([^<]*)<\/c>/', $xml, $matches, PREG_SET_ORDER);\r
+\r
+               return $matches;\r
+       }\r
+\r
+       function _unhtmlentities($string) {\r
+               $string = preg_replace('~&#x([0-9a-f]+);~ei', 'chr(hexdec("\\1"))', $string);\r
+               $string = preg_replace('~&#([0-9]+);~e', 'chr(\\1)', $string);\r
+\r
+               $trans_tbl = get_html_translation_table(HTML_ENTITIES);\r
+               $trans_tbl = array_flip($trans_tbl);\r
+\r
+               return strtr($string, $trans_tbl);\r
+       }\r
+}\r
+\r
+// Patch in multibyte support\r
+if (!function_exists('mb_substr')) {\r
+       function mb_substr($str, $start, $len = '', $encoding="UTF-8"){\r
+               $limit = strlen($str);\r
+\r
+               for ($s = 0; $start > 0;--$start) {// found the real start\r
+                       if ($s >= $limit)\r
+                               break;\r
+\r
+                       if ($str[$s] <= "\x7F")\r
+                               ++$s;\r
+                       else {\r
+                               ++$s; // skip length\r
+\r
+                               while ($str[$s] >= "\x80" && $str[$s] <= "\xBF")\r
+                                       ++$s;\r
+                       }\r
+               }\r
+\r
+               if ($len == '')\r
+                       return substr($str, $s);\r
+               else\r
+                       for ($e = $s; $len > 0; --$len) {//found the real end\r
+                               if ($e >= $limit)\r
+                                       break;\r
+\r
+                               if ($str[$e] <= "\x7F")\r
+                                       ++$e;\r
+                               else {\r
+                                       ++$e;//skip length\r
+\r
+                                       while ($str[$e] >= "\x80" && $str[$e] <= "\xBF" && $e < $limit)\r
+                                               ++$e;\r
+                               }\r
+                       }\r
+\r
+               return substr($str, $s, $e - $s);\r
+       }\r
+}\r
+\r
+?>\r