You are here

ckeditor_skin.module in CKEditor Skin 7

CKEditor Skin

File

ckeditor_skin.module
View 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

Namesort descending 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.