123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- <?php
-
- /**
- +-----------------------------------------------------------------------+
- | This file is part of the Roundcube Webmail client |
- | |
- | Copyright (C) 2011-2013, Kolab Systems AG |
- | Copyright (C) 20011-2013, The Roundcube Dev Team |
- | |
- | Licensed under the GNU General Public License version 3 or |
- | any later version with exceptions for skins & plugins. |
- | See the README file for a full license statement. |
- | |
- | PURPOSE: |
- | Spellchecking backend implementation to work with Enchant |
- +-----------------------------------------------------------------------+
- | Author: Aleksander Machniak <machniak@kolabsys.com> |
- +-----------------------------------------------------------------------+
- */
-
- /**
- * Spellchecking backend implementation to work with Pspell
- *
- * @package Framework
- * @subpackage Utils
- */
- class rcube_spellcheck_enchant extends rcube_spellcheck_engine
- {
- private $enchant_broker;
- private $enchant_dictionary;
- private $matches = array();
-
- /**
- * Return a list of languages supported by this backend
- *
- * @see rcube_spellcheck_engine::languages()
- */
- function languages()
- {
- $this->init();
-
- $langs = array();
- if ($dicts = enchant_broker_list_dicts($this->enchant_broker)) {
- foreach ($dicts as $dict) {
- $langs[] = preg_replace('/-.*$/', '', $dict['lang_tag']);
- }
- }
-
- return array_unique($langs);
- }
-
- /**
- * Initializes Enchant dictionary
- */
- private function init()
- {
- if (!$this->enchant_broker) {
- if (!extension_loaded('enchant')) {
- $this->error = "Enchant extension not available";
- return;
- }
-
- $this->enchant_broker = enchant_broker_init();
- }
-
- if (!enchant_broker_dict_exists($this->enchant_broker, $this->lang)) {
- $this->error = "Unable to load dictionary for selected language using Enchant";
- return;
- }
-
- $this->enchant_dictionary = enchant_broker_request_dict($this->enchant_broker, $this->lang);
- }
-
- /**
- * Set content and check spelling
- *
- * @see rcube_spellcheck_engine::check()
- */
- function check($text)
- {
- $this->init();
-
- if (!$this->enchant_dictionary) {
- return array();
- }
-
- // tokenize
- $text = preg_split($this->separator, $text, NULL, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_OFFSET_CAPTURE);
-
- $diff = 0;
- $matches = array();
-
- foreach ($text as $w) {
- $word = trim($w[0]);
- $pos = $w[1] - $diff;
- $len = mb_strlen($word);
-
- // skip exceptions
- if ($this->dictionary->is_exception($word)) {
- }
- else if (!enchant_dict_check($this->enchant_dictionary, $word)) {
- $suggestions = enchant_dict_suggest($this->enchant_dictionary, $word);
-
- if (sizeof($suggestions) > self::MAX_SUGGESTIONS) {
- $suggestions = array_slice($suggestions, 0, self::MAX_SUGGESTIONS);
- }
-
- $matches[] = array($word, $pos, $len, null, $suggestions);
- }
-
- $diff += (strlen($word) - $len);
- }
-
- $this->matches = $matches;
- return $matches;
- }
-
- /**
- * Returns suggestions for the specified word
- *
- * @see rcube_spellcheck_engine::get_words()
- */
- function get_suggestions($word)
- {
- $this->init();
-
- if (!$this->enchant_dictionary) {
- return array();
- }
-
- $suggestions = enchant_dict_suggest($this->enchant_dictionary, $word);
-
- if (sizeof($suggestions) > self::MAX_SUGGESTIONS)
- $suggestions = array_slice($suggestions, 0, self::MAX_SUGGESTIONS);
-
- return is_array($suggestions) ? $suggestions : array();
- }
-
- /**
- * Returns misspelled words
- *
- * @see rcube_spellcheck_engine::get_suggestions()
- */
- function get_words($text = null)
- {
- $result = array();
-
- if ($text) {
- // init spellchecker
- $this->init();
-
- if (!$this->enchant_dictionary) {
- return array();
- }
-
- // With Enchant we don't need to get suggestions to return misspelled words
- $text = preg_split($this->separator, $text, NULL, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_OFFSET_CAPTURE);
-
- foreach ($text as $w) {
- $word = trim($w[0]);
-
- // skip exceptions
- if ($this->dictionary->is_exception($word)) {
- continue;
- }
-
- if (!enchant_dict_check($this->enchant_dictionary, $word)) {
- $result[] = $word;
- }
- }
-
- return $result;
- }
-
- foreach ($this->matches as $m) {
- $result[] = $m[0];
- }
-
- return $result;
- }
- }
|