From d8488aae321ba825d9a436efff09108d4e2a072e Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Tue, 19 Mar 2019 09:03:19 +0100 Subject: [PATCH] Disable spellcheker (hide button) if the list of languages is empty Better handling of uninitialized (not installed) spellchecker engine. Also prevent from PHP fatal error if enchant ext is not installed. --- program/lib/Roundcube/rcube_spellchecker.php | 2 +- .../lib/Roundcube/spellchecker/enchant.php | 4 + program/steps/mail/compose.inc | 126 ++++++++++-------- skins/classic/templates/compose.html | 2 +- skins/elastic/templates/compose.html | 2 +- skins/larry/templates/compose.html | 2 +- 6 files changed, 80 insertions(+), 58 deletions(-) diff --git a/program/lib/Roundcube/rcube_spellchecker.php b/program/lib/Roundcube/rcube_spellchecker.php index 578397612..88d8282c7 100644 --- a/program/lib/Roundcube/rcube_spellchecker.php +++ b/program/lib/Roundcube/rcube_spellchecker.php @@ -87,7 +87,7 @@ class rcube_spellchecker // add correct labels $languages = array(); - foreach ($langs as $lang) { + foreach ((array) $langs as $lang) { $langc = strtolower(substr($lang, 0, 2)); $alias = $rcube_language_aliases[$langc]; if (!$alias) { diff --git a/program/lib/Roundcube/spellchecker/enchant.php b/program/lib/Roundcube/spellchecker/enchant.php index b20e2b49d..0b6dab9e9 100644 --- a/program/lib/Roundcube/spellchecker/enchant.php +++ b/program/lib/Roundcube/spellchecker/enchant.php @@ -39,6 +39,10 @@ class rcube_spellchecker_enchant extends rcube_spellchecker_engine { $this->init(); + if (!$this->enchant_broker) { + return; + } + $langs = array(); if ($dicts = enchant_broker_list_dicts($this->enchant_broker)) { foreach ($dicts as $dict) { diff --git a/program/steps/mail/compose.inc b/program/steps/mail/compose.inc index 6ae288aa7..76e4486af 100644 --- a/program/steps/mail/compose.inc +++ b/program/steps/mail/compose.inc @@ -280,6 +280,8 @@ $OUTPUT->add_handlers(array( $OUTPUT->include_script('publickey.js'); +rcmail_spellchecker_init(); + $OUTPUT->send('compose'); @@ -424,6 +426,76 @@ function rcmail_message_is_html() return $RCMAIL->config->get('prefer_html') && ($MESSAGE instanceof rcube_message) && $MESSAGE->has_html_part(true); } +function rcmail_spellchecker_init() +{ + global $RCMAIL, $OUTPUT; + + // Set language list + if ($RCMAIL->config->get('enable_spellcheck')) { + $spellchecker = new rcube_spellchecker(); + $spellcheck_langs = $spellchecker->languages(); + } + + if (!empty($spellchecker) && empty($spellcheck_langs)) { + if ($err = $spellchecker->error()) { + rcube::raise_error(array('code' => 500, + 'file' => __FILE__, 'line' => __LINE__, + 'message' => "Spell check engine error: " . trim($err)), + true, false); + } + } + else if (!empty($spellchecker)) { + $dictionary = (bool) $RCMAIL->config->get('spellcheck_dictionary'); + $lang = $_SESSION['language']; + + // if not found in the list, try with two-letter code + if (!$spellcheck_langs[$lang]) { + $lang = strtolower(substr($lang, 0, 2)); + } + + if (!$spellcheck_langs[$lang]) { + $lang = 'en'; + } + + $editor_lang_set = array(); + foreach ($spellcheck_langs as $key => $name) { + $editor_lang_set[] = ($key == $lang ? '+' : '') . rcube::JQ($name).'='.rcube::JQ($key); + } + + // include GoogieSpell + $OUTPUT->include_script('googiespell.js'); + $OUTPUT->add_script(sprintf( + "var googie = new GoogieSpell('%s/images/googiespell/','%s&lang=', %s);\n". + "googie.lang_chck_spell = \"%s\";\n". + "googie.lang_rsm_edt = \"%s\";\n". + "googie.lang_close = \"%s\";\n". + "googie.lang_revert = \"%s\";\n". + "googie.lang_no_error_found = \"%s\";\n". + "googie.lang_learn_word = \"%s\";\n". + "googie.setLanguages(%s);\n". + "googie.setCurrentLanguage('%s');\n". + "googie.setDecoration(false);\n". + "googie.decorateTextarea(rcmail.env.composebody);\n", + $RCMAIL->output->asset_url($RCMAIL->output->get_skin_path()), + $RCMAIL->url(array('_task' => 'utils', '_action' => 'spell', '_remote' => 1)), + !empty($dictionary) ? 'true' : 'false', + rcube::JQ(rcube::Q($RCMAIL->gettext('checkspelling'))), + rcube::JQ(rcube::Q($RCMAIL->gettext('resumeediting'))), + rcube::JQ(rcube::Q($RCMAIL->gettext('close'))), + rcube::JQ(rcube::Q($RCMAIL->gettext('revertto'))), + rcube::JQ(rcube::Q($RCMAIL->gettext('nospellerrors'))), + rcube::JQ(rcube::Q($RCMAIL->gettext('addtodict'))), + rcube_output::json_serialize($spellcheck_langs), + $lang + ), 'foot'); + + $OUTPUT->add_label('checking'); + $OUTPUT->set_env('spellcheck_langs', join(',', $editor_lang_set)); + $OUTPUT->set_env('spell_langs', $spellcheck_langs); + $OUTPUT->set_env('spell_lang', $lang); + } +} + function rcmail_prepare_message_body() { global $RCMAIL, $MESSAGE, $COMPOSE, $HTML_MODE; @@ -641,60 +713,6 @@ function rcmail_compose_body($attrib) // include HTML editor $RCMAIL->html_editor(); - // Set language list - if ($RCMAIL->config->get('enable_spellcheck')) { - $engine = new rcube_spellchecker(); - $dictionary = (bool) $RCMAIL->config->get('spellcheck_dictionary'); - $spellcheck_langs = $engine->languages(); - $lang = $_SESSION['language']; - - // if not found in the list, try with two-letter code - if (!$spellcheck_langs[$lang]) { - $lang = strtolower(substr($lang, 0, 2)); - } - - if (!$spellcheck_langs[$lang]) { - $lang = 'en'; - } - - $editor_lang_set = array(); - foreach ($spellcheck_langs as $key => $name) { - $editor_lang_set[] = ($key == $lang ? '+' : '') . rcube::JQ($name).'='.rcube::JQ($key); - } - - // include GoogieSpell - $OUTPUT->include_script('googiespell.js'); - $OUTPUT->add_script(sprintf( - "var googie = new GoogieSpell('%s/images/googiespell/','%s&lang=', %s);\n". - "googie.lang_chck_spell = \"%s\";\n". - "googie.lang_rsm_edt = \"%s\";\n". - "googie.lang_close = \"%s\";\n". - "googie.lang_revert = \"%s\";\n". - "googie.lang_no_error_found = \"%s\";\n". - "googie.lang_learn_word = \"%s\";\n". - "googie.setLanguages(%s);\n". - "googie.setCurrentLanguage('%s');\n". - "googie.setDecoration(false);\n". - "googie.decorateTextarea('%s');\n", - $RCMAIL->output->asset_url($RCMAIL->output->get_skin_path()), - $RCMAIL->url(array('_task' => 'utils', '_action' => 'spell', '_remote' => 1)), - !empty($dictionary) ? 'true' : 'false', - rcube::JQ(rcube::Q($RCMAIL->gettext('checkspelling'))), - rcube::JQ(rcube::Q($RCMAIL->gettext('resumeediting'))), - rcube::JQ(rcube::Q($RCMAIL->gettext('close'))), - rcube::JQ(rcube::Q($RCMAIL->gettext('revertto'))), - rcube::JQ(rcube::Q($RCMAIL->gettext('nospellerrors'))), - rcube::JQ(rcube::Q($RCMAIL->gettext('addtodict'))), - rcube_output::json_serialize($spellcheck_langs), - $lang, - $attrib['id']), 'foot'); - - $OUTPUT->add_label('checking'); - $OUTPUT->set_env('spellcheck_langs', join(',', $editor_lang_set)); - $OUTPUT->set_env('spell_langs', $spellcheck_langs); - $OUTPUT->set_env('spell_lang', $lang); - } - return ($form_start ? "$form_start\n" : '') . "\n" . $hidden->show() . "\n" . $textarea->show($MESSAGE_BODY) . ($form_end ? "\n$form_end\n" : ''); diff --git a/skins/classic/templates/compose.html b/skins/classic/templates/compose.html index e14709799..d83e51c42 100644 --- a/skins/classic/templates/compose.html +++ b/skins/classic/templates/compose.html @@ -32,7 +32,7 @@ - + diff --git a/skins/elastic/templates/compose.html b/skins/elastic/templates/compose.html index 1859ef90b..054aba1bc 100644 --- a/skins/elastic/templates/compose.html +++ b/skins/elastic/templates/compose.html @@ -94,7 +94,7 @@ - + - +