91 lines
2.3 KiB
PHP
91 lines
2.3 KiB
PHP
|
<?php
|
||
|
/**
|
||
|
* EnchantEngine.php
|
||
|
*
|
||
|
* Copyright, Moxiecode Systems AB
|
||
|
* Released under LGPL License.
|
||
|
*
|
||
|
* License: http://www.tinymce.com/license
|
||
|
* Contributing: http://www.tinymce.com/contributing
|
||
|
*/
|
||
|
|
||
|
class TinyMCE_SpellChecker_EnchantEngine extends TinyMCE_SpellChecker_Engine {
|
||
|
/**
|
||
|
* Spellchecks an array of words.
|
||
|
*
|
||
|
* @param String $lang Selected language code (like en_US or de_DE). Shortcodes like "en" and "de" work with enchant >= 1.4.1
|
||
|
* @param Array $words Array of words to check.
|
||
|
* @return Name/value object with arrays of suggestions.
|
||
|
*/
|
||
|
public function getSuggestions($lang, $words) {
|
||
|
$suggestions = array();
|
||
|
$enchant = enchant_broker_init();
|
||
|
$config = $this->getConfig();
|
||
|
|
||
|
if (isset($config["enchant_dicts_path"])) {
|
||
|
enchant_broker_set_dict_path($enchant, ENCHANT_MYSPELL, $config["enchant_dicts_path"]);
|
||
|
enchant_broker_set_dict_path($enchant, ENCHANT_ISPELL, $config["enchant_dicts_path"]);
|
||
|
}
|
||
|
|
||
|
if (!enchant_broker_describe($enchant)) {
|
||
|
throw new Exception("Enchant spellchecker not find any backends.");
|
||
|
}
|
||
|
|
||
|
$lang = $this->normalizeLangCode($enchant, $lang);
|
||
|
|
||
|
if (enchant_broker_dict_exists($enchant, $lang)) {
|
||
|
$dict = enchant_broker_request_dict($enchant, $lang);
|
||
|
|
||
|
foreach ($words as $word) {
|
||
|
if (!enchant_dict_check($dict, $word)) {
|
||
|
$suggs = enchant_dict_suggest($dict, $word);
|
||
|
|
||
|
if (!is_array($suggs)) {
|
||
|
$suggs = array();
|
||
|
}
|
||
|
|
||
|
$suggestions[$word] = $suggs;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
enchant_broker_free_dict($dict);
|
||
|
enchant_broker_free($enchant);
|
||
|
} else {
|
||
|
enchant_broker_free($enchant);
|
||
|
throw new Exception("Enchant spellchecker could not find dictionary for language: " . $lang);
|
||
|
}
|
||
|
|
||
|
return $suggestions;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Return true/false if the engine is supported by the server.
|
||
|
*
|
||
|
* @return boolean True/false if the engine is supported.
|
||
|
*/
|
||
|
public function isSupported() {
|
||
|
return function_exists("enchant_broker_init");
|
||
|
}
|
||
|
|
||
|
private function normalizeLangCode($enchant, $lang) {
|
||
|
$variants = array(
|
||
|
"en" => array("en_US", "en_GB")
|
||
|
);
|
||
|
|
||
|
if (isset($variants[$lang])) {
|
||
|
array_unshift($variants, $lang);
|
||
|
|
||
|
foreach ($variants[$lang] as $variant) {
|
||
|
if (enchant_broker_dict_exists($enchant, $variant)) {
|
||
|
return $variant;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return $lang;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
TinyMCE_Spellchecker_Engine::add("enchant", "TinyMCE_SpellChecker_EnchantEngine");
|
||
|
?>
|