= 3) { return $document_root_dir; } else{ return FALSE; } } /** * Emulates the asp Server.mapPath function. * Given an url path return the physical directory that it corresponds to. * * Returns absolute path or false on failure * * @param string $path * @return @return string|boolean */ function ckeditor_resolve_url($path) { if (function_exists('apache_lookup_uri')) { $info = @apache_lookup_uri($path); if (!$info) { return FALSE; } return $info->filename . $info->path_info ; } $document_root = ckeditor_get_document_root_full_path(); if ($document_root !== FALSE) { return $document_root . $path; } return FALSE; } function ckeditor_load_skin_options() { $arr = array(); $editor_local_path = ckeditor_path(TRUE); $skin_dir = $editor_local_path .'/skins'; if (is_dir($skin_dir)) { $dh = @opendir($skin_dir); if (FALSE !== $dh) { while (($file = readdir($dh)) !== FALSE ) { if (in_array($file, array(".", "..", "CVS", ".svn"))) { continue; } if (is_dir($skin_dir . DIRECTORY_SEPARATOR . $file)) { $arr[$file] = drupal_ucfirst($file); } } closedir( $dh ); } } //oops, we have no information about skins, let's use only default if (empty($arr)) { $arr = array( 'kama' => 'Kama', ); } asort($arr); return $arr; } /** * Return default skin for CKEditor * * @return string */ function ckeditor_default_skin() { $skin_options = ckeditor_load_skin_options(); if (array_key_exists('moono', $skin_options)) { return 'moono'; } if (array_key_exists('kama', $skin_options)) { return 'kama'; } //if any default theme not exists select first from the list return key(reset($skin_options)); } function ckeditor_load_lang_options() { $arr = array(); $editor_local_path = ckeditor_path(TRUE); $lang_file = $editor_local_path . '/lang/_languages.js'; if (file_exists($lang_file)) { $f = fopen($lang_file, 'r'); $file = fread($f, filesize($lang_file)); $tmp = explode('{', $file); if (isset($tmp[2])) { $tmp = explode('}', $tmp[2]); } $langs = explode(',', $tmp[0]); foreach ($langs AS $lang) { preg_match("/'?(\w+-?\w+)'?:'([\w\s\(\)]+)'/i", $lang, $matches); if (isset($matches[1]) && isset($matches[2])) $arr[$matches[1]] = $matches[2]; } } //oops, we have no information about languages, let's use those available in CKEditor 2.4.3 if (empty($arr)) { $arr = array( 'af' => 'Afrikaans', 'ar' => 'Arabic', 'bg' => 'Bulgarian', 'bn' => 'Bengali/Bangla', 'bs' => 'Bosnian', 'ca' => 'Catalan', 'cs' => 'Czech', 'da' => 'Danish', 'de' => 'German', 'el' => 'Greek', 'en' => 'English', 'en-au' => 'English (Australia)', 'en-ca' => 'English (Canadian)', 'en-uk' => 'English (United Kingdom)', 'eo' => 'Esperanto', 'es' => 'Spanish', 'et' => 'Estonian', 'eu' => 'Basque', 'fa' => 'Persian', 'fi' => 'Finnish', 'fo' => 'Faroese', 'fr' => 'French', 'gl' => 'Galician', 'he' => 'Hebrew', 'hi' => 'Hindi', 'hr' => 'Croatian', 'hu' => 'Hungarian', 'it' => 'Italian', 'ja' => 'Japanese', 'km' => 'Khmer', 'ko' => 'Korean', 'lt' => 'Lithuanian', 'lv' => 'Latvian', 'mn' => 'Mongolian', 'ms' => 'Malay', 'nb' => 'Norwegian Bokmal', 'nl' => 'Dutch', 'no' => 'Norwegian', 'pl' => 'Polish', 'pt' => 'Portuguese (Portugal)', 'pt-br' => 'Portuguese (Brazil)', 'ro' => 'Romanian', 'ru' => 'Russian', 'sk' => 'Slovak', 'sl' => 'Slovenian', 'sr' => 'Serbian (Cyrillic)', 'sr-latn' => 'Serbian (Latin)', 'sv' => 'Swedish', 'th' => 'Thai', 'tr' => 'Turkish', 'uk' => 'Ukrainian', 'vi' => 'Vietnamese', 'zh' => 'Chinese Traditional', 'zh-cn' => 'Chinese Simplified', ); } asort($arr); return $arr; } /** * List of CKEditor plugins * * @return array */ function ckeditor_load_plugins($render = FALSE) { $arr = array(); $base_path = '%base_path%'; $editor_path = '%editor_path%'; $ckeditor_path = '%ckeditor_path%'; $plugin_dir = '%plugin_dir%'; $plugin_dir_additional = '%plugin_dir_extra%'; $pattern = '#\.addButton\([\s]*[\'"](.*?)[\'"][\s]*\,[\s]*\{[\s]*(.*?)[\s]*\}#s'; /* * External plugins */ if (module_exists('ckeditor_swf') && file_exists(drupal_get_path('module', 'ckeditor_swf') . '/plugins/swf/plugin.js')) { $arr['ckeditor_swf'] = array( 'name' => 'swf', 'desc' => t('Support for the CKEditor SWF module'), 'path' => $base_path . drupal_get_path('module', 'ckeditor_swf') . '/plugins/swf/', 'buttons' => FALSE, 'default' => 't' ); } if (module_exists('ckeditor_link') && file_exists(drupal_get_path('module', 'ckeditor_link') . '/plugins/link/plugin.js')) { $arr['ckeditor_link'] = array( 'name' => 'drupal_path', 'desc' => t('Support for the CKEditor Link module'), 'path' => $base_path . drupal_get_path('module', 'ckeditor_link') . '/plugins/link/', 'buttons' => FALSE, 'default' => 't' ); } if (module_exists('linkit') && file_exists(drupal_get_path('module', 'linkit') . '/editors/ckeditor/plugin.js')) { $arr['linkit'] = array( 'name' => 'Linkit', 'desc' => t('Support for the Linkit module (buttons: Linkit)'), 'path' => $base_path . drupal_get_path('module', 'linkit') . '/editors/ckeditor/', 'buttons' => array( 'Linkit' => array( 'title' => 'Linkit', 'icon' => $base_path . drupal_get_path('module', 'linkit') . '/editors/ckeditor/linkit.png' ) ), 'default' => 't' ); } /* * CKEditor build-in plugins */ $_editor_path = ckeditor_path(TRUE) . '/'; if (file_exists($_editor_path . 'plugins/tableresize/plugin.js')) { $arr['tableresize'] = array( 'name' => 'tableresize', 'desc' => t('Table Resize plugin'), 'path' => $base_path . $editor_path . 'plugins/tableresize/', 'buttons' => FALSE, 'default' => 't' ); } if (file_exists($_editor_path . 'plugins/autogrow/plugin.js')) { $arr['autogrow'] = array( 'name' => 'autogrow', 'desc' => t('Auto Grow plugin'), 'path' => $base_path . $editor_path . 'plugins/autogrow/', 'buttons' => FALSE, 'default' => 'f' ); } if (file_exists($_editor_path . 'plugins/stylesheetparser/plugin.js')) { $arr['stylesheetparser'] = array( 'name' => 'stylesheetparser', 'desc' => t('Stylesheet Parser plugin'), 'path' => $base_path . $editor_path . 'plugins/stylesheetparser/', 'buttons' => FALSE, 'default' => 'f' ); } /* * CKEditor module plugins */ $_plugin_dir = drupal_get_path('module', 'ckeditor') . '/plugins/'; if (is_dir($_plugin_dir) && $handle = opendir($_plugin_dir)) { while (false !== ($file = readdir($handle))) { if (is_dir($_plugin_dir . $file) && file_exists($_plugin_dir . $file . '/plugin.js')) { $source = file_get_contents($_plugin_dir . $file . '/plugin.js'); $buttons = array(); if (preg_match_all($pattern, $source, $matches)) { foreach ($matches[1] as $i => $button_name) { if (preg_match('#(icon)[\s]*\:[\s]*([^\,\n]*)#', $matches[2][$i], $matches2)) { $buttons[$button_name] = array(); $buttons[$button_name]['label'] = $button_name; $matches2[2] = str_replace(array('this.path', '+', '\'', '"'), array('', '', '', ''), $matches2[2]); $buttons[$button_name]['icon'] = trim($matches2[2]); } } } if (preg_match('#@file ([^\n\r]*)#', $source, $matches)) { $arr[$file] = array( 'name' => $file, 'desc' => t($matches[1]), 'path' => $base_path . $plugin_dir . $file . '/', 'buttons' => (count($buttons) > 0) ? $buttons : FALSE, 'default' => 'f' ); } else { $arr[$file] = array( 'name' => $file, 'desc' => t('Plugin file: ' . $file), 'path' => $base_path . $plugin_dir . $file . '/', 'buttons' => (count($buttons) > 0) ? $buttons : FALSE, 'default' => 'f' ); } } } closedir($handle); } /* * CKEditor module plugins - additional directory */ $_plugin_dir_additional = ckeditor_plugins_path(TRUE) . '/'; if ($_plugin_dir != $_plugin_dir_additional && is_dir($_plugin_dir_additional) && $handle = opendir($_plugin_dir_additional)) { while (false !== ($file = readdir($handle))) { if (is_dir($_plugin_dir_additional . $file) && file_exists($_plugin_dir_additional . $file . '/plugin.js')) { $source = file_get_contents($_plugin_dir_additional . $file . '/plugin.js'); $buttons = array(); if (preg_match_all($pattern, $source, $matches)) { foreach ($matches[1] as $i => $button_name) { if (preg_match('#(icon)[\s]*\:[\s]*([^\,\n]*)#', $matches[2][$i], $matches2)) { $buttons[$button_name] = array(); $buttons[$button_name]['label'] = $button_name; $matches2[2] = str_replace(array('this.path', '+', '\'', '"'), array('', '', '', ''), $matches2[2]); $buttons[$button_name]['icon'] = trim($matches2[2]); } } } if (preg_match('#@file ([^\n\r]*)#', $source, $matches)) { $arr[$file] = array( 'name' => $file, 'desc' => t($matches[1]), 'path' => $base_path . $plugin_dir_additional . $file . '/', 'buttons' => (count($buttons) > 0) ? $buttons : FALSE, 'default' => 'f' ); } else { $arr[$file] = array( 'name' => $file, 'desc' => t('Plugin file: ' . $file), 'path' => $base_path . $plugin_dir_additional . $file . '/', 'buttons' => (count($buttons) > 0) ? $buttons : FALSE, 'default' => 'f' ); } } } closedir($handle); } /* * CKEditor plugins registered by hook */ $plugins = module_invoke_all('ckeditor_plugin'); foreach ($plugins as $i => $plugin) { if (file_exists($plugin['path'] . 'plugin.js')) { $source = file_get_contents($plugin['path'] . 'plugin.js'); $plugins[$i]['path'] = $base_path . $plugin['path']; if (!isset($plugin['buttons']) || count($plugin['buttons']) == 0) { $buttons = array(); if (preg_match_all($pattern, $source, $matches)) { foreach ($matches[1] as $j => $button_name) { if (preg_match('#(icon)[\s]*\:[\s]*([^\,\n]*)#', $matches[2][$j], $matches2)) { $buttons[$button_name] = array(); $buttons[$button_name]['label'] = $button_name; $matches2[2] = str_replace(array('this.path', '+', '\'', '"'), array('', '', '', ''), $matches2[2]); $buttons[$button_name]['icon'] = trim($matches2[2]); } } } $plugins[$i]['buttons'] = (count($buttons) > 0) ? $buttons : FALSE; } } else { unset($plugins[$i]); } } $arr = array_merge($arr, $plugins); if (isset($arr['linktomenu']) && module_exists('linktocontent') == FALSE) { unset($arr['linktomenu']); } if (isset($arr['linktonode']) && module_exists('linktocontent') == FALSE) { unset($arr['linktonode']); } if (isset($arr['imce']) && module_exists('imce') == FALSE) { unset($arr['imce']); } //remove page break button if there is no module to do this if (isset($arr['drupalbreaks']['buttons']['DrupalPageBreak']) && !module_exists('paging') && !module_exists('pagebreak')) { unset($arr['drupalbreaks']['buttons']['DrupalPageBreak']); } if (isset($arr['drupalbreaks'])) { $arr['drupalbreaks']['default'] = 't'; } ksort($arr); if ($render === TRUE) { $arr = ckeditor_plugins_render($arr); } return $arr; } /** * Render CKEditor plugins path */ function ckeditor_plugins_render($plugins) { $render = array(); $render["%base_path%"] = base_path(); $render["%editor_path%"] = ckeditor_path(TRUE) . '/'; $render["%ckeditor_path%"] = drupal_get_path('module', 'ckeditor') . '/'; $render["%plugin_dir%"] = $render["%ckeditor_path%"] . 'plugins/'; $render["%plugin_dir_extra%"] = ckeditor_plugins_path(TRUE) . '/'; foreach ((array) $plugins as $i => $plugin) { $plugins[$i]['path'] = str_replace(array_keys($render), array_values($render), $plugin['path']); } return $plugins; } function ckeditor_user_get_setting($user, $profile, $setting) { $default = array( 'default' => 't', 'show_toggle' => 't', 'popup' => 'f', 'toolbar' => 'default', 'width' => '100%', 'lang' => 'en', 'auto_lang' => 't', ); if ($profile->settings['allow_user_conf']) { $status = isset($user->{'ckeditor_'. $setting}) ? $user->{'ckeditor_'. $setting} : (isset($profile->settings[$setting]) ? $profile->settings[$setting] : $default[$setting]); } else { $status = isset($profile->settings[$setting]) ? $profile->settings[$setting] : $default[$setting]; } return $status; } function ckeditor_user_get_profile($user, $element_id = 'edit-body', $url = NULL) { $rids = array(); if (is_null($url)) { $url = $_GET['q']; } // Since ckeditor_profile_load() makes a db hit, only call it when we're pretty sure // we're gonna render ckeditor. $sorted_roles = ckeditor_sorted_roles(); foreach (array_keys($sorted_roles) as $rid) { if (isset($user->roles[$rid])) { $rids[] = $rid; } } if ($user->uid == 1 && !sizeof($rids)) { $r = db_fetch_object(db_query_range("SELECT r.rid FROM {ckeditor_role} r ORDER BY r.rid DESC", 1)); $rids[] = $r->rid; } $profile_names = array(); if (sizeof($rids)) { $result = db_query("SELECT r.rid, s.name FROM {ckeditor_settings} s INNER JOIN {ckeditor_role} r ON r.name = s.name WHERE r.rid IN (". implode(",", $rids) .")"); while (($row = db_fetch_array($result))) { if (!isset($profile_names[$row['rid']])) { $profile_names[$row['rid']] = array(); } array_push($profile_names[$row['rid']], $row['name']); } } foreach ($rids as $rid) { if (!empty($profile_names[$rid])) { foreach ($profile_names[$rid] as $profile_name) { $profile = ckeditor_profile_load($profile_name); $conf = $profile->settings; $enabled = ckeditor_is_enabled(empty($conf['excl_mode']) ? '0' : $conf['excl_mode'], empty($conf['excl_regex']) ? '' : $conf['excl_regex'], $element_id, $url); if ($enabled) { return $profile; } } } } return FALSE; } /** * sort roles according to precedence settings. previously sorted roles are followed by latest added roles. */ function ckeditor_sorted_roles($clear = FALSE) { static $order; if (isset($order) && $clear !== TRUE) { return $order; } $order = array(); $roles = user_roles(0, 'access ckeditor'); $result = db_query("SELECT settings FROM {ckeditor_settings} WHERE name='CKEditor Global Profile'"); $data = db_fetch_object($result); if (!empty($data->settings)) { $settings = unserialize($data->settings); if (isset($settings['rank']) && !empty($settings['rank'])) foreach ($settings['rank'] as $rid) { if (isset($roles[$rid])) { $order[$rid] = $roles[$rid]; unset($roles[$rid]); } } } krsort($roles);//sort the remaining unsorted roles by id, descending. $order += $roles; return $order; } /** * @param int $excl_mode 1/include, exclude otherwise * @param string $excl_regex paths (drupal paths with ids attached) * @param string $element_id current ID * @param string $get_q current path * * @return boolean * returns true if CKEditor is enabled */ function ckeditor_is_enabled($excl_mode, $excl_regex, $element_id, $get_q) { global $theme; $front = variable_get('site_frontpage', 'node'); $excl_regex = str_replace('', $front, $excl_regex); $nodetype = ckeditor_get_nodetype($get_q); $element_id = str_replace('.', '\.', $element_id); $match = !empty($excl_regex) && preg_match($excl_regex, $theme . ':' . $nodetype .'@'. $get_q .'.'. $element_id); return ($excl_mode == '0' xor $match); } function _ckeditor_script_path() { $jspath = FALSE; $module_path=drupal_get_path('module', 'ckeditor'); if (file_exists($module_path . '/ckeditor/ckeditor.js')) { $jspath='%m/ckeditor'; } elseif (file_exists($module_path . '/ckeditor/ckeditor/ckeditor.js')) { $jspath='%m/ckeditor/ckeditor'; } elseif (file_exists('sites/all/libraries/ckeditor/ckeditor.js')) { $jspath='%b/sites/all/libraries/ckeditor'; } return $jspath; } /** * Determines whether the CKEditor sources are present * * It checks if ckeditor.js is present. * * This function is used by ckeditor_requirements() * * @return boolean True if CKEditor is installed */ function _ckeditor_requirements_isinstalled() { $editor_path = ckeditor_path(TRUE); $jspath = $editor_path .'/ckeditor.js'; $jsp=file_exists($jspath); if (!$jsp && ($editor_path = _ckeditor_script_path())) { $result = db_query("SELECT name, settings FROM {ckeditor_settings} WHERE name = 'CKEditor Global Profile'"); if ($rs=db_fetch_array($result)) { $rs['settings']=unserialize($rs['settings']); $rs['settings']['ckeditor_path']=$editor_path; $rs['settings']=serialize($rs['settings']); db_query("UPDATE {ckeditor_settings} SET settings='%s' WHERE name = 'CKEditor Global Profile'", $rs['settings']); $jsp=TRUE; ckeditor_path(TRUE, TRUE); } } return $jsp; }