123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297 |
- <?php
- /**
- * @file
- * Editor integration functions for YUI editor.
- */
- /**
- * Plugin implementation of hook_editor().
- */
- function wysiwyg_yui_editor() {
- $editor['yui'] = array(
- 'title' => 'YUI editor',
- 'vendor url' => 'http://developer.yahoo.com/yui/editor/',
- 'download url' => 'http://developer.yahoo.com/yui/download/',
- 'library path' => wysiwyg_get_path('yui') . '/build',
- 'libraries' => array(
- 'min' => array(
- 'title' => 'Minified',
- 'files' => array(
- 'yahoo-dom-event/yahoo-dom-event.js',
- 'animation/animation-min.js',
- 'element/element-min.js',
- 'container/container-min.js',
- 'menu/menu-min.js',
- 'button/button-min.js',
- 'editor/editor-min.js',
- ),
- ),
- 'src' => array(
- 'title' => 'Source',
- 'files' => array(
- 'yahoo-dom-event/yahoo-dom-event.js',
- 'animation/animation.js',
- 'element/element.js',
- 'container/container.js',
- 'menu/menu.js',
- 'button/button.js',
- 'editor/editor.js',
- ),
- ),
- ),
- 'version callback' => 'wysiwyg_yui_version',
- 'themes callback' => 'wysiwyg_yui_themes',
- 'load callback' => 'wysiwyg_yui_load',
- 'settings callback' => 'wysiwyg_yui_settings',
- 'plugin callback' => 'wysiwyg_yui_plugins',
- 'versions' => array(
- '2.7.0' => array(
- 'js files' => array('yui.js'),
- ),
- ),
- );
- return $editor;
- }
- /**
- * Detect editor version.
- *
- * @param $editor
- * An array containing editor properties as returned from hook_editor().
- *
- * @return
- * The installed editor version.
- */
- function wysiwyg_yui_version($editor) {
- $library = $editor['library path'] . '/editor/editor.js';
- if (!file_exists($library)) {
- return;
- }
- $library = fopen($library, 'r');
- $max_lines = 10;
- while ($max_lines && $line = fgets($library, 60)) {
- if (preg_match('@version:\s([0-9\.]+)@', $line, $version)) {
- fclose($library);
- return $version[1];
- }
- $max_lines--;
- }
- fclose($library);
- }
- /**
- * Determine available editor themes or check/reset a given one.
- *
- * @param $editor
- * A processed hook_editor() array of editor properties.
- * @param $profile
- * A wysiwyg editor profile.
- *
- * @return
- * An array of theme names. The first returned name should be the default
- * theme name.
- */
- function wysiwyg_yui_themes($editor, $profile) {
- return array('sam');
- }
- /**
- * Perform additional actions upon loading this editor.
- *
- * @param $editor
- * A processed hook_editor() array of editor properties.
- * @param $library
- * The internal library name (array key) to use.
- */
- function wysiwyg_yui_load($editor, $library) {
- drupal_add_css($editor['library path'] . '/menu/assets/skins/sam/menu.css');
- drupal_add_css($editor['library path'] . '/button/assets/skins/sam/button.css');
- drupal_add_css($editor['library path'] . '/fonts/fonts-min.css');
- drupal_add_css($editor['library path'] . '/container/assets/skins/sam/container.css');
- drupal_add_css($editor['library path'] . '/editor/assets/skins/sam/editor.css');
- }
- /**
- * Return runtime editor settings for a given wysiwyg profile.
- *
- * @param $editor
- * A processed hook_editor() array of editor properties.
- * @param $config
- * An array containing wysiwyg editor profile settings.
- * @param $theme
- * The name of a theme/GUI/skin to use.
- *
- * @return
- * A settings array to be populated in
- * Drupal.settings.wysiwyg.configs.{editor}
- */
- function wysiwyg_yui_settings($editor, $config, $theme) {
- $settings = array(
- 'theme' => $theme,
- 'animate' => TRUE,
- 'handleSubmit' => TRUE,
- 'markup' => 'xhtml',
- 'ptags' => TRUE,
- );
- if (isset($config['path_loc']) && $config['path_loc'] != 'none') {
- $settings['dompath'] = $config['path_loc'];
- }
- // Enable auto-height feature when editor should be resizable.
- if (!empty($config['resizing'])) {
- $settings['autoHeight'] = TRUE;
- }
- $settings += array(
- 'toolbar' => array(
- 'collapse' => FALSE,
- 'draggable' => TRUE,
- 'buttonType' => 'advanced',
- 'buttons' => array(),
- ),
- );
- if (!empty($config['buttons'])) {
- $buttons = array();
- foreach ($config['buttons'] as $plugin => $enabled_buttons) {
- foreach ($enabled_buttons as $button => $enabled) {
- $extra = array();
- if ($button == 'heading') {
- $extra = array('menu' => array(
- array('text' => 'Normal', 'value' => 'none', 'checked' => TRUE),
- ));
- if (!empty($config['block_formats'])) {
- $headings = array(
- 'p' => array('text' => 'Paragraph', 'value' => 'p'),
- 'h1' => array('text' => 'Heading 1', 'value' => 'h1'),
- 'h2' => array('text' => 'Heading 2', 'value' => 'h2'),
- 'h3' => array('text' => 'Heading 3', 'value' => 'h3'),
- 'h4' => array('text' => 'Heading 4', 'value' => 'h4'),
- 'h5' => array('text' => 'Heading 5', 'value' => 'h5'),
- 'h6' => array('text' => 'Heading 6', 'value' => 'h6'),
- );
- foreach (explode(',', $config['block_formats']) as $tag) {
- if (isset($headings[$tag])) {
- $extra['menu'][] = $headings[$tag];
- }
- }
- }
- }
- else if ($button == 'fontname') {
- $extra = array('menu' => array(
- array('text' => 'Arial', 'checked' => TRUE),
- array('text' => 'Arial Black'),
- array('text' => 'Comic Sans MS'),
- array('text' => 'Courier New'),
- array('text' => 'Lucida Console'),
- array('text' => 'Tahoma'),
- array('text' => 'Times New Roman'),
- array('text' => 'Trebuchet MS'),
- array('text' => 'Verdana'),
- ));
- }
- $buttons[] = wysiwyg_yui_button_setting($editor, $plugin, $button, $extra);
- }
- }
- // Group buttons in a dummy group.
- $buttons = array('group' => 'default', 'label' => '', 'buttons' => $buttons);
- $settings['toolbar']['buttons'] = array($buttons);
- }
- if (isset($config['css_setting'])) {
- if ($config['css_setting'] == 'theme') {
- $settings['extracss'] = wysiwyg_get_css();
- }
- else if ($config['css_setting'] == 'self' && isset($config['css_path'])) {
- $settings['extracss'] = strtr($config['css_path'], array('%b' => base_path(), '%t' => path_to_theme()));
- $settings['extracss'] = explode(',', $settings['extracss']);
- }
- // YUI only supports inline CSS, so we need to use @import directives.
- // Syntax: '@import "/base/path/to/theme/style.css"; '
- if (!empty($settings['extracss'])) {
- $settings['extracss'] = '@import "' . implode('"; @import "', $settings['extracss']) . '";';
- }
- }
- return $settings;
- }
- /**
- * Create the JavaScript structure for a YUI button.
- *
- * @param $editor
- * A processed hook_editor() array of editor properties.
- * @param $plugin
- * The internal name of a plugin.
- * @param $button
- * The internal name of a button, defined by $plugin.
- * @param $extra
- * (optional) An array containing arbitrary other elements to add to the
- * resulting button.
- */
- function wysiwyg_yui_button_setting($editor, $plugin, $button, $extra = array()) {
- static $plugins;
- if (!isset($plugins)) {
- // @todo Invoke all enabled plugins, not just internals.
- $plugins = wysiwyg_yui_plugins($editor);
- }
- // Return a simple separator.
- if ($button === 'separator') {
- return array('type' => 'separator');
- }
- // Setup defaults.
- $type = 'push';
- $label = $plugins[$plugin]['buttons'][$button];
- // Special handling for certain buttons.
- if (in_array($button, array('heading', 'fontname'))) {
- $type = 'select';
- $label = $extra['menu'][0]['text'];
- }
- elseif (in_array($button, array('fontsize'))) {
- $type = 'spin';
- }
- elseif (in_array($button, array('forecolor', 'backcolor'))) {
- $type = 'color';
- }
- $button = array(
- 'type' => $type,
- 'label' => $label,
- 'value' => $button,
- );
- // Add arbitrary other elements, if defined.
- if (!empty($extra)) {
- $button = array_merge($button, $extra);
- }
- return $button;
- }
- /**
- * Return internal plugins for this editor; semi-implementation of hook_wysiwyg_plugin().
- */
- function wysiwyg_yui_plugins($editor) {
- return array(
- 'default' => array(
- 'buttons' => array(
- 'bold' => t('Bold'), 'italic' => t('Italic'), 'underline' => t('Underline'),
- 'strikethrough' => t('Strike-through'),
- 'justifyleft' => t('Align left'), 'justifycenter' => t('Align center'), 'justifyright' => t('Align right'), 'justifyfull' => t('Justify'),
- 'insertunorderedlist' => t('Bullet list'), 'insertorderedlist' => t('Numbered list'),
- 'outdent' => t('Outdent'), 'indent' => t('Indent'),
- 'undo' => t('Undo'), 'redo' => t('Redo'),
- 'createlink' => t('Link'),
- 'insertimage' => t('Image'),
- 'forecolor' => t('Font Color'), 'backcolor' => t('Background Color'),
- 'superscript' => t('Sup'), 'subscript' => t('Sub'),
- 'hiddenelements' => t('Show/hide hidden elements'),
- 'removeformat' => t('Remove format'),
- 'heading' => t('HTML block format'), 'fontname' => t('Font'), 'fontsize' => t('Font size'),
- ),
- 'internal' => TRUE,
- ),
- );
- }
|