ckeditor_skin.module in CKEditor Skin 7
CKEditor Skin
File
ckeditor_skin.moduleView source
<?php
/**
* @file
* CKEditor Skin
*/
/**
* Implements hook_menu_alter().
*/
function ckeditor_skin_menu_alter(&$items) {
$items['admin/config/content/ckeditor']['page callback'] = 'ckeditor_skin_admin_main';
}
/**
* Implements of hook_element_info_alter().
*/
function ckeditor_skin_element_info_alter(&$types) {
$types['text_format']['#pre_render'][] = 'ckeditor_skin_pre_render_text_format';
}
/**
* Implements hook_module_implements_alter().
*/
function ckeditor_skin_module_implements_alter(&$implementations, $hook) {
$module_name = 'ckeditor_skin';
switch ($hook) {
case 'menu_alter':
case 'element_info_alter':
if (isset($implementations[$module_name])) {
unset($implementations[$module_name]);
$implementations[$module_name] = $hook;
}
break;
}
}
/**
* Implements hook_ckeditor_skin().
*/
function ckeditor_skin_ckeditor_skin($version = NULL) {
$skins = array();
if (empty($version)) {
return $skins;
}
$skin_path = drupal_get_path('module', 'ckeditor_skin') . '/skins';
if (version_compare($version, '4.1') >= 0) {
$skins['moono'] = array(
'title' => 'Moono',
'path' => $skin_path . '/v4/moono',
);
$skins['moonocolor'] = array(
'title' => 'Moono Color',
'path' => $skin_path . '/v4/moonocolor',
);
$skins['moono-dark'] = array(
'title' => 'Moono Dark',
'path' => $skin_path . '/v4/moono-dark',
);
$skins['kama'] = array(
'title' => 'Kama',
'path' => $skin_path . '/v4/kama',
);
}
elseif (version_compare($version, '3.1') >= 0) {
$skins['grappelli'] = array(
'title' => 'Grappelli',
'path' => $skin_path . '/v3/grappelli',
);
}
return $skins;
}
/**
* Override CKEditor Global Profile form.
*
* @param array $form
* Form element.
*
* @param array $form_state
* Form state.
*
* @see ckeditor_skin_admin_global_profile_form_validate()
*/
function ckeditor_skin_form_ckeditor_admin_global_profile_form_alter(&$form, &$form_state) {
$profile = $form['_profile']['#value'];
$skins = ckeditor_skin_get_skins();
$options = array();
// Build the skin list.
foreach ($skins as $skin_id => $skin) {
$options[$skin_id] = $skin['title'];
}
// Hijack the skin list and default value.
$form['appearance']['skin']['#options'] = $options;
$form['appearance']['skin']['#default_value'] = empty($profile->settings['skin_api']['skin']) ? $profile->settings['skin'] : $profile->settings['skin_api']['skin'];
// Make CKEditor save our value as well. This variable is useless and will be
// overriden.
$form['appearance']['skin_api'] = array(
'#type' => 'hidden',
'#default_value' => '',
);
// Hijack the values.
array_unshift($form['#validate'], 'ckeditor_skin_admin_global_profile_form_validate');
}
/**
* Hack the value to by-pass ckeditor error checking.
*
* @param array $form
* Form element.
*
* @param array $form_state
* Form state.
*
* @see ckeditor_skin_form_ckeditor_admin_global_profile_form_alter()
*/
function ckeditor_skin_admin_global_profile_form_validate($form, &$form_state) {
$values = $form_state['values'];
$default = ckeditor_default_skin();
$skin = empty($values['skin']) ? $default : $values['skin'];
$skins = ckeditor_skin_get_skins();
$skin_api = empty($skins[$skin]) ? NULL : $skins[$skin];
// Switch values.
form_set_value($form['appearance']['skin'], $default, $form_state);
form_set_value($form['appearance']['skin_api'], $skin_api, $form_state);
}
/**
* Override the default admin page to warn the user about missing skin.
*
* @return string
* Page content.
*/
function ckeditor_skin_admin_main() {
$page = ckeditor_admin_main();
if (!empty($page)) {
$skins = ckeditor_skin_get_skins();
$global_profile = ckeditor_profile_load('CKEditor Global Profile');
$skin_options = ckeditor_load_skin_options();
$original_message = t('The <em>CKEditor Global Profile</em> profile is using %skin skin which cannot be found. Please <a href="@profile_settings">update your settings</a>.', array(
'%skin' => $global_profile->settings['skin'],
'@profile_settings' => url('admin/config/content/ckeditor/editg'),
));
// Dirty hack.
if (!empty($_SESSION['messages']['warning'])) {
foreach ($_SESSION['messages']['warning'] as $id => $message) {
if ($message == $original_message) {
unset($_SESSION['messages']['warning'][$id]);
}
}
if (empty($_SESSION['messages']['warning'])) {
unset($_SESSION['messages']['warning']);
}
}
// Skin not found.
if (empty($skins[$global_profile->settings['skin']])) {
drupal_set_message($original_message, 'warning');
}
elseif (!empty($global_profile->settings['skin_api'])) {
$skin_api = $global_profile->settings['skin_api'];
if (!empty($skin_api['skin'])) {
$skin = $skin_api['skin'];
// Check for:
// - Skin not found.
// - skin.js not found.
if (empty($skins[$skin]) || !($skin_info = $skins[$skin]) || !empty($skin_info['js']) && !file_exists($skin_info['js'])) {
drupal_set_message(t('The <em>CKEditor Global Profile</em> profile is using %skin skin which cannot be found. Please <a href="@profile_settings">update your settings</a>.', array(
'%skin' => $skin,
'@profile_settings' => url('admin/config/content/ckeditor/editg'),
)), 'warning');
}
elseif ($skin_api != $skin_info) {
drupal_set_message(t('The <em>CKEditor Global Profile</em> profile is using old %skin skin which is deprecated. Please <a href="@profile_settings">update your settings</a>.', array(
'%skin' => $skin,
'@profile_settings' => url('admin/config/content/ckeditor/editg'),
)), 'warning');
}
}
}
}
return $page;
}
/**
* This function override skin settings of CKEditor.
*
* @param array $element
* A fully populated form element to add the editor to.
*
* @return array
* The same $element with extra CKEditor markup and initialization.
*/
function ckeditor_skin_pre_render_text_format($element) {
static $init = FALSE;
if (!isset($element['#format'])) {
return $element;
}
if ($init === FALSE) {
module_load_include('inc', 'ckeditor', 'includes/ckeditor.lib');
$global_profile = ckeditor_profile_load('CKEditor Global Profile');
if (!empty($global_profile->settings['skin_api'])) {
$skin_info = $global_profile->settings['skin_api'];
if (!empty($skin_info['skin']) && !empty($skin_info['path'])) {
$input_formats = ckeditor_profiles_compile();
$version = ckeditor_get_version(TRUE);
$settings = array();
$skin_path = $GLOBALS['base_url'] . '/' . drupal_encode_path($skin_info['path']) . '/';
switch ($version) {
case 3:
$skin = $skin_info['skin'];
$module_path = drupal_get_path('module', 'ckeditor_skin');
// Hack for CKEditor to load skin from custom path.
drupal_add_js(array(
'ckeditor' => array(
'skin_paths' => array(
$skin_info['skin'] => $skin_path,
),
),
), 'setting');
drupal_add_js($module_path . '/js/ckeditor_skin.min.js', array(
'type' => 'file',
'scope' => 'footer',
));
break;
case 4:
default:
$skin = $skin_info['skin'] . ',' . $skin_path;
break;
}
foreach ($input_formats as $input_format => $data) {
$settings['input_formats'][$input_format]['skin'] = $skin;
}
drupal_add_js(array(
'ckeditor' => $settings,
), 'setting');
drupal_add_js($skin_info['js'], array(
'type' => 'file',
'scope' => 'footer',
));
}
}
$init = TRUE;
}
return $element;
}
/**
* Get all ckeditor skins, including all the skins in ckeditor package.
*
* @return array
* All registered skins.
*/
function ckeditor_skin_get_skins() {
static $drupal_static_fast;
if (!isset($drupal_static_fast)) {
$drupal_static_fast['skins'] =& drupal_static(__FUNCTION__);
}
$skins =& $drupal_static_fast['skins'];
if (empty($skins)) {
module_load_include('inc', 'ckeditor', 'includes/ckeditor.lib');
$version = ckeditor_get_version();
$skins = array();
$skin_options = ckeditor_load_skin_options();
$modules = module_implements('ckeditor_skin');
foreach ($modules as $module) {
$items = call_user_func_array($module . '_ckeditor_skin', array(
$version,
));
if (isset($items) && is_array($items)) {
$skins = array_merge($skins, $items);
}
}
drupal_alter('ckeditor_skin', $skins, $version);
// Registered skins.
foreach ($skins as $skin_id => $skin) {
$skins[$skin_id] = $skin + array(
'title' => $skin_id,
'path' => NULL,
'js' => NULL,
);
$skins[$skin_id]['skin'] = $skin_id;
if (!empty($skins[$skin_id]['path'])) {
$skins[$skin_id]['js'] = $skins[$skin_id]['path'] . '/skin.js';
}
}
// Built-in skins.
foreach ($skin_options as $skin_id => $skin_name) {
$skins[$skin_id] = array(
'skin' => $skin_id,
'title' => $skin_name,
'path' => NULL,
'js' => NULL,
);
}
ksort($skins);
}
return $skins;
}
Functions
Name![]() |
Description |
---|---|
ckeditor_skin_admin_global_profile_form_validate | Hack the value to by-pass ckeditor error checking. |
ckeditor_skin_admin_main | Override the default admin page to warn the user about missing skin. |
ckeditor_skin_ckeditor_skin | Implements hook_ckeditor_skin(). |
ckeditor_skin_element_info_alter | Implements of hook_element_info_alter(). |
ckeditor_skin_form_ckeditor_admin_global_profile_form_alter | Override CKEditor Global Profile form. |
ckeditor_skin_get_skins | Get all ckeditor skins, including all the skins in ckeditor package. |
ckeditor_skin_menu_alter | Implements hook_menu_alter(). |
ckeditor_skin_module_implements_alter | Implements hook_module_implements_alter(). |
ckeditor_skin_pre_render_text_format | This function override skin settings of CKEditor. |