* @package api * @subpackage tools * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License * @version $Id$ */ class egw_ckeditor_config { private static $lang = null; private static $country = null; private static $enterMode = null; private static $skin = null; /** * Read language and country settings for the ckeditor and store them in static * variables */ private static function read_lang_country() { //use the lang and country information to construct a possible lang info for CKEditor UI and scayt_slang self::$lang = ($GLOBALS['egw_info']['user']['preferences']['common']['spellchecker_lang'] ? $GLOBALS['egw_info']['user']['preferences']['common']['spellchecker_lang']: $GLOBALS['egw_info']['user']['preferences']['common']['lang']); self::$country = $GLOBALS['egw_info']['user']['preferences']['common']['country']; if (!(strpos(self::$lang, '-')===false)) list(self::$lang, self::$country) = explode('-', self::$lang); } /** * Returns the current user language */ private static function get_lang() { if (self::$lang == null || self::$country == null) self::read_lang_country(); return self::$lang; } /** * Returns the current user country */ private static function get_country() { if (self::$lang == null || self::$country == null) self::read_lang_country(); return strtoupper(self::$country); } /** * Returns the ckeditor basepath */ private static function get_base_path() { //Get the ckeditor base url return $GLOBALS['egw_info']['server']['webserver_url'].'/phpgwapi/js/ckeditor3/'; } /** * Returns the ckeditor enter mode which defaults to "BR" */ private static function get_enter_mode() { if (self::$enterMode == null) { //Get the input name $enterMode = 2; if (isset($GLOBALS['egw_info']['user']['preferences']['common']['rte_enter_mode'])) { switch ($GLOBALS['egw_info']['user']['preferences']['common']['rte_enter_mode']) { case 'p': $enterMode = 1; break; case 'br': $enterMode = 2; break; case 'div': $enterMode = 3; break; } } self::$enterMode = $enterMode; } return self::$enterMode; } /** * Returns the skin the ckeditor should use */ private static function get_skin() { if (self::$skin == null) { //Get the skin name $skin = $GLOBALS['egw_info']['user']['preferences']['common']['rte_skin']; //Convert old fckeditor skin names to new ones switch ($skin) { case 'silver': $skin = "v2"; break; case 'default': $skin = "kama"; break; case 'office2003': $skin = "office2003"; break; } //Check whether the skin actually exists, if not, switch to a default if (!(file_exists($basePath.'skins/'.$skin) || file_exists($skin) || !empty($skin))) $skin = "office2003"; self::$skin = $skin; } return self::$skin; } /** * Returns the URL of the filebrowser */ private static function get_filebrowserBrowseUrl($start_path = '') { return $GLOBALS['egw_info']['server']['webserver_url'].'/index.php?menuaction=filemanager.filemanager_select.select&mode=open&method=ckeditor_return' .($start_path != '' ? '&path='.$start_path : ''); } /** * Adds all "easy to write" options to the configuration */ private static function add_default_options(&$config, $height, $expanded_toolbar, $start_path) { //Convert the pixel height to an integer value $config['resize_enabled'] = false; $config['height'] = (int)$height; $config['entities'] = true; $config['entities_latin'] = true; $config['editingBlock'] = true; $config['disableNativeSpellChecker'] = true; $config['toolbarStartupExpanded'] = $expanded_toolbar; $config['filebrowserBrowseUrl'] = self::get_filebrowserBrowseUrl($start_path); $config['filebrowserWindowHeight'] = 640; $config['filebrowserWindowWidth'] = 580; $config['language'] = self::get_lang(); $config['enterMode'] = self::get_enter_mode(); $config['skin'] = self::get_skin(); } /** * Adds the spellchecker configuration to the options and writes the name of * the spellchecker toolbar button to the "spellchecker_button" parameter */ private static function add_spellchecker_options(&$config, &$spellchecker_button) { if (isset($GLOBALS['egw_info']['server']['enabled_spellcheck'])) { $spellchecker_button = 'SpellChecker'; if (!empty($GLOBALS['egw_info']['server']['aspell_path']) && is_executable($GLOBALS['egw_info']['server']['aspell_path'])) { $spellchecker_button = 'SpellCheck'; $config['extraPlugins'] = "aspell"; } $config['scayt_autoStartup'] = true; $config['scayt_sLang'] = self::get_lang().'_'.self::get_country(); } else { $config['scayt_autoStartup'] = false; } } /** * Writes the toolbar configuration to the options which depends on the chosen * mode and the spellchecker_button written by the add_spellchecker_options button */ private static function add_toolbar_options(&$config, $mode, $spellchecker_button) { $config['toolbar'] = array(); switch ($mode) { case 'advanced': $config['toolbar'][] = array('Source','DocProps','-','Save','NewPage','Preview','-','Templates'); $config['toolbar'][] = array('Cut','Copy','Paste','PasteText','PasteFromWord','-','Print'); if ($spellchecker_button) $config['toolbar'][count($config['toolbar']) - 1][] = $spellchecker_button; $config['toolbar'][] = array('Undo','Redo','-','Find','Replace','-','SelectAll','RemoveFormat'); $config['toolbar'][] = '/'; $config['toolbar'][] = array('Bold','Italic','Underline','Strike','-','Subscript','Superscript'); $config['toolbar'][] = array('JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock'); $config['toolbar'][] = array('BulletedList','NumberedList','-','Outdent','Indent'); $config['toolbar'][] = array('Link','Unlink','Anchor'); $config['toolbar'][] = array('Maximize','Image','Table','HorizontalRule','SpecialChar','PageBreak'); $config['toolbar'][] = '/'; $config['toolbar'][] = array('Style','Format','Font','FontSize'); $config['toolbar'][] = array('TextColor','BGColor'); $config['toolbar'][] = array('ShowBlocks','-','About'); break; case 'extended': default: $config['toolbar'][] = array('Bold','Italic','Underline'); $config['toolbar'][] = array('JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock'); $config['toolbar'][] = array('BulletedList','NumberedList','Outdent','Indent','Undo','Redo'); $config['toolbar'][] = array('Cut','Copy','Paste','PasteText','PasteFromWord','-','Print'); if ($mode == 'extended') { $config['toolbar'][] = array('Link','Unlink','Anchor'); $config['toolbar'][] = array('Find', 'Replace'); if ($spellchecker_button) $config['toolbar'][] = array('Maximize', $spellchecker_button, 'Image', 'Table'); else $config['toolbar'][] = array('Maximize', 'Image', 'Table'); } else { if ($spellchecker_button) $config['toolbar'][] = array('Maximize', $spellchecker_button); else $config['toolbar'][] = array('Maximize'); } $config['toolbar'][] = '/'; $config['toolbar'][] = array('Format','Font','FontSize'); $config['toolbar'][] = array('TextColor','BGColor'); $config['toolbar'][] = array('ShowBlocks','-','About'); } } /** * @see get_ckeditor_config */ public static function get_ckeditor_config_array($mode = 'simple', $height = 400, $expanded_toolbar = true, $start_path = '') { $config = array(); $spellchecker_button = null; self::add_default_options($config, $height, $expanded_toolbar, $start_path); self::add_spellchecker_options($config, $spellchecker_button); self::add_toolbar_options($config, $mode, $spellchecker_button); return $config; } /** * Returns a json encoded string containing the configuration for the ckeditor. * @param string $mode specifies the count of toolbar buttons available to the user. Possible * values are 'simple', 'extended' and 'advanced'. All other values will default to 'simple' * @param integer $height contains the height of the ckeditor in pixels * @param boolean $expanded_toolbar specifies whether the ckeditor should start with an expanded toolbar or not * @param string $start_path specifies */ public static function get_ckeditor_config($mode = 'simple', $height = 400, $expanded_toolbar = true, $start_path = '') { return json_encode(self::get_ckeditor_config_array($mode, $height, $expanded_toolbar, $start_path)); } }