core/modules/ckeditor/ckeditor.admin.inc | 173 ++++++++++++ core/modules/ckeditor/ckeditor.info | 6 + core/modules/ckeditor/ckeditor.module | 294 ++++++++++++++++++++ core/modules/ckeditor/css/ckeditor-iframe.css | 18 ++ core/modules/ckeditor/css/ckeditor-rtl.css | 18 ++ core/modules/ckeditor/css/ckeditor.admin.css | 170 +++++++++++ core/modules/ckeditor/css/ckeditor.css | 56 ++++ core/modules/ckeditor/images/break-handle.png | 3 + core/modules/ckeditor/images/buttons/about.png | 5 + .../modules/ckeditor/images/buttons/anchor-rtl.png | 5 + core/modules/ckeditor/images/buttons/anchor.png | 4 + core/modules/ckeditor/images/buttons/bidiltr.png | 10 + core/modules/ckeditor/images/buttons/bidirtl.png | 6 + .../modules/ckeditor/images/buttons/blockquote.png | 4 + core/modules/ckeditor/images/buttons/bold.png | 3 + .../ckeditor/images/buttons/bulletedlist-rtl.png | 4 + .../ckeditor/images/buttons/bulletedlist.png | 3 + core/modules/ckeditor/images/buttons/copy-rtl.png | 3 + core/modules/ckeditor/images/buttons/copy.png | 3 + core/modules/ckeditor/images/buttons/cut-rtl.png | 5 + core/modules/ckeditor/images/buttons/cut.png | 5 + core/modules/ckeditor/images/buttons/form.png | 3 + .../ckeditor/images/buttons/horizontalrule.png | 3 + core/modules/ckeditor/images/buttons/image.png | 4 + .../modules/ckeditor/images/buttons/indent-rtl.png | 4 + core/modules/ckeditor/images/buttons/indent.png | 5 + core/modules/ckeditor/images/buttons/italic.png | 4 + .../ckeditor/images/buttons/justifyblock.png | 4 + .../ckeditor/images/buttons/justifycenter.png | 6 + .../ckeditor/images/buttons/justifyleft.png | 4 + .../ckeditor/images/buttons/justifyright.png | 5 + core/modules/ckeditor/images/buttons/link.png | 5 + core/modules/ckeditor/images/buttons/maximize.png | 4 + .../ckeditor/images/buttons/newpage-rtl.png | 3 + core/modules/ckeditor/images/buttons/newpage.png | 3 + .../ckeditor/images/buttons/numberedlist-rtl.png | 7 + .../ckeditor/images/buttons/numberedlist.png | 5 + .../ckeditor/images/buttons/outdent-rtl.png | 3 + core/modules/ckeditor/images/buttons/outdent.png | 5 + .../ckeditor/images/buttons/pagebreak-rtl.png | 3 + core/modules/ckeditor/images/buttons/pagebreak.png | 3 + core/modules/ckeditor/images/buttons/paste-rtl.png | 3 + core/modules/ckeditor/images/buttons/paste.png | 3 + .../ckeditor/images/buttons/pastefromword-rtl.png | 7 + .../ckeditor/images/buttons/pastefromword.png | 4 + .../ckeditor/images/buttons/pastetext-rtl.png | 3 + core/modules/ckeditor/images/buttons/pastetext.png | 5 + core/modules/ckeditor/images/buttons/redo-rtl.png | 4 + core/modules/ckeditor/images/buttons/redo.png | 6 + .../ckeditor/images/buttons/removeformat.png | 3 + .../modules/ckeditor/images/buttons/select-rtl.png | 4 + core/modules/ckeditor/images/buttons/select.png | 5 + core/modules/ckeditor/images/buttons/selectall.png | 5 + .../ckeditor/images/buttons/showblocks-rtl.png | 7 + .../modules/ckeditor/images/buttons/showblocks.png | 6 + .../modules/ckeditor/images/buttons/source-rtl.png | 5 + core/modules/ckeditor/images/buttons/source.png | 4 + .../ckeditor/images/buttons/specialchar.png | 9 + core/modules/ckeditor/images/buttons/strike.png | 3 + core/modules/ckeditor/images/buttons/subscript.png | 8 + .../ckeditor/images/buttons/superscript.png | 4 + core/modules/ckeditor/images/buttons/table.png | 3 + .../ckeditor/images/buttons/textarea-rtl.png | 5 + core/modules/ckeditor/images/buttons/textarea.png | 5 + core/modules/ckeditor/images/buttons/textcolor.png | 3 + .../ckeditor/images/buttons/textfield-rtl.png | 3 + core/modules/ckeditor/images/buttons/textfield.png | 3 + core/modules/ckeditor/images/buttons/underline.png | 7 + core/modules/ckeditor/images/buttons/undo-rtl.png | 6 + core/modules/ckeditor/images/buttons/undo.png | 4 + core/modules/ckeditor/images/buttons/unlink.png | 3 + core/modules/ckeditor/images/group-separator.png | 4 + core/modules/ckeditor/js/ckeditor.admin.js | 111 ++++++++ core/modules/ckeditor/js/ckeditor.js | 32 +++ .../ckeditor/Plugin/editor/editor/CKEditor.php | 251 +++++++++++++++++ core/modules/editor/editor.module | 106 +++++++ core/modules/editor/js/editor.admin.js | 16 ++ .../editor/lib/Drupal/editor/Plugin/EditorBase.php | 6 + .../lib/Drupal/editor/Plugin/EditorInterface.php | 17 ++ 79 files changed, 1564 insertions(+) diff --git a/core/modules/ckeditor/ckeditor.admin.inc b/core/modules/ckeditor/ckeditor.admin.inc new file mode 100644 index 0000000..cd56d37 --- /dev/null +++ b/core/modules/ckeditor/ckeditor.admin.inc @@ -0,0 +1,173 @@ +direction) && $language->direction === LANGUAGE_RTL ? 'rtl' : 'ltr'; + + // Create lists of active and disabled buttons. + $editor = $variables['editor']; + $plugins = $variables['plugins']; + $buttons = array(); + $variables['multiple_buttons'] = array(); + foreach ($plugins as $plugin) { + if (isset($plugin['buttons'])) { + foreach ($plugin['buttons'] as $button_name => $button) { + if (!empty($button['multiple'])) { + $variables['multiple_buttons'][$button_name] = $button; + } + $button['name'] = $button_name; + $buttons[$button_name] = $button; + } + } + } + $variables['active_buttons'] = array(); + foreach ($editor->settings['toolbar']['buttons'] as $row_number => $row) { + foreach ($row as $button_name) { + if (isset($buttons[$button_name])) { + $variables['active_buttons'][$row_number][] = $buttons[$button_name]; + if (empty($buttons[$button_name]['multiple'])) { + unset($buttons[$button_name]); + } + } + } + } + $variables['disabled_buttons'] = array_diff_key($buttons, $variables['multiple_buttons']); +} + +/** + * Displays the toolbar configuration for CKEditor. + */ +function theme_ckeditor_settings_toolbar($variables) { + $editor = $variables['editor']; + $plugins = $variables['plugins']; + $rtl = $variables['language_direction'] === 'rtl' ? '_rtl' : ''; + + // Assemble items to be added to active button rows. + foreach ($variables['active_buttons'] as $row_number => $row_buttons) { + foreach ($row_buttons as $button) { + $button_name = $button['name']; + if (isset($button['image_alternative'])) { + $data = $button['image_alternative']; + } + elseif (isset($button['image'])) { + $data = theme('image', array('uri' => $button['image' . $rtl], 'title' => $button['label'])); + } + else { + $data = '?'; + } + $button_item = array( + 'data' => $data, + 'data-button-name' => $button_name, + ); + if (!empty($button['multiple'])) { + $button['attributes']['class'][] = 'ckeditor-multiple-button'; + } + if (!empty($button['attributes'])) { + $button_item = array_merge($button_item, $button['attributes']); + } + $active_buttons[$row_number][] = $button_item; + } + } + // Assemble list of disabled buttons (which are always a single row). + foreach ($variables['disabled_buttons'] as $button_name => $button) { + if (isset($button['image_alternative'])) { + $data = $button['image_alternative']; + } + elseif (isset($button['image'])) { + $data = theme('image', array('uri' => $button['image' . $rtl], 'title' => $button['label'])); + } + else { + $data = '?'; + } + $button_item = array( + 'data' => $data, + 'data-button-name' => $button_name, + ); + if (isset($button['attributes'])) { + $button_item = array_merge($button_item, $button['attributes']); + } + $disabled_buttons[] = $button_item; + } + // Assemble list of multiple buttons that may be added multiple times. + foreach ($variables['multiple_buttons'] as $button_name => $button) { + if (isset($button['image_alternative'])) { + $data = $button['image_alternative']; + } + elseif (isset($button['image'])) { + $data = theme('image', array('uri' => $button['image' . $rtl], 'title' => $button['label'])); + } + else { + $data = '?'; + } + $button_item = array( + 'data' => $data, + 'data-button-name' => $button_name, + ); + $button['attributes']['class'][] = 'ckeditor-multiple-button'; + if (isset($button['attributes'])) { + $button_item = array_merge($button_item, $button['attributes']); + } + $multiple_buttons[] = $button_item; + } + + // We don't use theme_item_list() below in case there are no buttons in the + // active or disabled list, as theme_item_list() will not print an empty UL. + $output = ''; + $output .= '' . t('Active toolbar') . ''; + $output .= '
'; + foreach ($active_buttons as $button_row) { + $output .= ''; + } + if (empty($active_buttons)) { + $output .= ''; + } + + $output .= '
'; + $output .= '-'; + $output .= '+'; + $output .= '
'; + + $output .= '
'; + + $output .= '' . t('Available buttons') . ''; + $output .= '
'; + $output .= ''; + $output .= '' . t('Dividers') . ': '; + $output .= ''; + $output .= '
'; + + return $output; +} diff --git a/core/modules/ckeditor/ckeditor.info b/core/modules/ckeditor/ckeditor.info new file mode 100644 index 0000000..9c40ac2 --- /dev/null +++ b/core/modules/ckeditor/ckeditor.info @@ -0,0 +1,6 @@ +name = CKEditor +description = WYSIWYG editing for rich text fields using CKEditor. +package = Core +core = 8.x +version = VERSION +dependencies[] = editor diff --git a/core/modules/ckeditor/ckeditor.module b/core/modules/ckeditor/ckeditor.module new file mode 100644 index 0000000..3587a5a --- /dev/null +++ b/core/modules/ckeditor/ckeditor.module @@ -0,0 +1,294 @@ + 'Loads the main CKEditor library.', + 'website' => 'http://ckeditor.com/', + 'version' => '4.0.1', + 'js' => array( + 'core/misc/ckeditor/ckeditor.js' => array(), + ), + ); + + $module_path = drupal_get_path('module', 'ckeditor'); + $settings = array( + 'ckeditor' => array( + 'modulePath' => drupal_get_path('module', 'ckeditor'), + ), + ); + $libraries['drupal.ckeditor'] = array( + 'title' => 'Drupal behavior to enable CKEditor on textareas.', + 'version' => VERSION, + 'js' => array( + $module_path . '/js/ckeditor.js' => array(), + array('data' => $settings, 'type' => 'setting'), + ), + 'dependencies' => array( + array('editor', 'drupal.editor'), + array('ckeditor', 'ckeditor'), + ) + ); + $libraries['drupal.ckeditor.admin'] = array( + 'title' => 'Drupal behavior to enable CKEditor on textareas.', + 'version' => VERSION, + 'js' => array( + $module_path . '/js/ckeditor.admin.js' => array(), + ), + 'css' => array( + $module_path . '/css/ckeditor.admin.css' => array(), + ), + 'dependencies' => array( + array('system', 'jquery.once'), + array('system', 'jquery.ui.sortable'), + array('system', 'jquery.ui.draggable'), + ) + ); + + return $libraries; +} + +/** + * Implements hook_theme(). + */ +function ckeditor_theme() { + return array( + 'ckeditor_settings_toolbar' => array( + 'file' => 'ckeditor.admin.inc', + 'variables' => array('editor' => NULL, 'plugins' => NULL), + ), + ); +} + +/** + * Implements hook_init(). + */ +function ckeditor_init() { + // Add our CSS file that adds common needed classes, such as align-left, + // align-right, underline, indent, etc. + drupal_add_css(drupal_get_path('module', 'ckeditor') . '/css/ckeditor.css'); +} + +/** + * Retrieves the full list of installed CKEditor plugins. + */ +function ckeditor_plugins() { + $plugins = module_invoke_all('ckeditor_plugins'); + drupal_alter('ckeditor_plugins', $plugins); + return $plugins; +} + +/** + * Implements hook_ckeditor_plugins(). + * + * Return a list of all plugins provided by this module. + */ +function ckeditor_ckeditor_plugins() { + $image_prefix = drupal_get_path('module', 'ckeditor') . '/images/buttons/'; + $buttons = array( + 'Bold' => array( + 'label' => t('Bold'), + 'required_tags' => array('strong'), + ), + 'Italic' => array( + 'label' => t('Italic'), + 'required_tags' => array('em'), + ), + 'Underline' => array( + 'label' => t('Underline'), + // A class is used on spans for underline. + 'required_tags' => array('span'), + ), + 'Strike' => array( + 'label' => t('Strike-through'), + 'required_tags' => array('del'), + ), + 'JustifyLeft' => array( + 'label' => t('Align left'), + 'required_tags' => array('p'), + ), + 'JustifyCenter' => array( + 'label' => t('Align center'), + 'required_tags' => array('p'), + ), + 'JustifyRight' => array( + 'label' => t('Align right'), + 'required_tags' => array('p'), + ), + 'JustifyBlock' => array( + 'label' => t('Justify'), + 'required_tags' => array('p'), + ), + 'BulletedList' => array( + 'label' => t('Bullet list'), + 'image_rtl' => $image_prefix . '/bulletedlist-rtl.png', + 'required_tags' => array('ul', 'li'), + ), + 'NumberedList' => array( + 'label' => t('Numbered list'), + 'image_rtl' => $image_prefix . '/numberedlist-rtl.png', + 'required_tags' => array('ol', 'li'), + ), + 'Outdent' => array( + 'label' => t('Outdent'), + 'image_rtl' => $image_prefix . '/outdent-rtl.png', + 'required_tags' => array('p'), + ), + 'Indent' => array( + 'label' => t('Indent'), + 'image_rtl' => $image_prefix . '/indent-rtl.png', + 'required_tags' => array('p'), + ), + 'Undo' => array( + 'label' => t('Undo'), + 'image_rtl' => $image_prefix . '/undo-rtl.png', + ), + 'Redo' => array( + 'label' => t('Redo'), + 'image_rtl' => $image_prefix . '/redo-rtl.png', + ), + 'Link' => array( + 'label' => t('Link'), + 'required_tags' => array('a'), + ), + 'Unlink' => array( + 'label' => t('Unlink'), + 'required_tags' => array('a'), + ), + 'Anchor' => array( + 'image_rtl' => $image_prefix . '/anchor-rtl.png', + 'label' => t('Anchor'), + 'required_tags' => array('a'), + ), + 'Superscript' => array( + 'label' => t('Superscript'), + 'required_tags' => array('sup'), + ), + 'Subscript' => array( + 'label' => t('Subscript'), + 'required_tags' => array('sub'), + ), + 'Blockquote' => array( + 'label' => t('Blockquote'), + 'required_tags' => array('blockquote'), + ), + 'Source' => array( + 'label' => t('Source code'), + ), + 'HorizontalRule' => array( + 'label' => t('Horizontal rule'), + 'required_tags' => array('hr'), + ), + 'Cut' => array( + 'label' => t('Cut'), + ), + 'Copy' => array( + 'label' => t('Copy'), + ), + 'Paste' => array( + 'label' => t('Paste'), + ), + 'PasteText' => array( + 'label' => t('Paste Text'), + 'image_rtl' => $image_prefix . '/pastetext-rtl.png', + ), + 'PasteFromWord' => array( + 'label' => t('Paste from Word'), + 'image_rtl' => $image_prefix . '/pastefromword-rtl.png', + ), + 'ShowBlocks' => array( + 'label' => t('Show blocks'), + 'image_rtl' => $image_prefix . '/showblocks-rtl.png', + ), + 'RemoveFormat' => array( + 'label' => t('Remove format'), + ), + 'SpecialChar' => array( + 'label' => t('Character map'), + ), + 'Format' => array( + 'label' => t('HTML block format'), + 'image_alternative' => '' . t('Format') . '', + ), + 'Styles' => array( + 'label' => t('Font style'), + 'image_alternative' => '' . t('Styles') . '', + ), + 'Image' => array( + 'label' => t('Image'), + 'required_tags' => array('img'), + ), + 'Table' => array( + 'label' => t('Table'), + 'required_tags' => array('table', 'thead', 'tbody', 'tr', 'td', 'th'), + ), + 'Maximize' => array( + 'label' => t('Maximize'), + ), + '|' => array( + 'label' => t('Group separator'), + 'image_alternative' => ' ', + 'attributes' => array('class' => array('ckeditor-group-button-separator')), + 'multiple' => TRUE, + ), + '-' => array( + 'label' => t('Separator'), + 'image_alternative' => ' ', + 'attributes' => array('class' => array('ckeditor-button-separator')), + 'multiple' => TRUE, + ), + ); + + // Populate image locations, which all match button names. + foreach ($buttons as $button_name => &$button) { + if (!isset($button['image_alternative']) && !isset($button['image'])) { + // Because we know the list of strings, drupal_strtolower() is not needed. + $button['image'] = $image_prefix . strtolower($button_name) . '.png'; + } + } + + // List all the basic plugin buttons as an "internal" plugin. + $plugins['default'] = array( + 'buttons' => $buttons, + 'internal' => TRUE, + ); + + return $plugins; +} + +/** + * Retrieves the default theme's CKEditor stylesheets defined in the .info file. + * + * Themes may specify iFrame-specific CSS files for use with CKEditor by + * including a "ckeditor_stylesheets" key in the theme .info file. + * + * @code + * ckeditor_stylesheets[] = css/ckeditor-iframe.css + * @endcode + */ +function _ckeditor_theme_css($theme = NULL) { + $css = array(); + if (!isset($theme)) { + $theme = variable_get('theme_default'); + } + if ($theme_path = drupal_get_path('theme', $theme)) { + $info = system_get_info('theme', $theme); + if (isset($info['ckeditor_stylesheets'])) { + $css = $info['ckeditor_stylesheets']; + foreach ($css as $key => $path) { + $css[$key] = $theme_path . '/' . $path; + } + } + if (isset($info['base theme'])) { + $css = array_merge($css, _ckeditor_theme_css($info['base theme'])); + } + } + return $css; +} diff --git a/core/modules/ckeditor/css/ckeditor-iframe.css b/core/modules/ckeditor/css/ckeditor-iframe.css new file mode 100644 index 0000000..8dda5d0 --- /dev/null +++ b/core/modules/ckeditor/css/ckeditor-iframe.css @@ -0,0 +1,18 @@ +/** + * CSS added to iFrame-based instances only. + */ +body { + font-family: Arial, Verdana, sans-serif; + font-size: 12px; + color: #222; + background-color: #fff; + margin: 8px; +} + +ol,ul,dl { + /* IE7: reset rtl list margin. (CKEditor issue #7334) */ + *margin-right: 0px; + /* Preserved spaces for list items with text direction other than the list. + * (CKEditor issues #6249,#8049) */ + padding: 0 40px; +} diff --git a/core/modules/ckeditor/css/ckeditor-rtl.css b/core/modules/ckeditor/css/ckeditor-rtl.css new file mode 100644 index 0000000..1e2d05b --- /dev/null +++ b/core/modules/ckeditor/css/ckeditor-rtl.css @@ -0,0 +1,18 @@ +/** + * RTL styles used by CKEditor. Added to front-end theme and iFrame editors. + */ +.align-left { + text-align: right; +} +.align-right { + text-align: left; +} +.indent1 { + margin: 0 40px 0 0; +} +.indent2 { + margin: 0 80px 0 0; +} +.indent3 { + margin: 0 120px 0 0; +} diff --git a/core/modules/ckeditor/css/ckeditor.admin.css b/core/modules/ckeditor/css/ckeditor.admin.css new file mode 100644 index 0000000..2e4027c --- /dev/null +++ b/core/modules/ckeditor/css/ckeditor.admin.css @@ -0,0 +1,170 @@ +/** + * @file + * Styles for configuration of CKEditor module. + */ + +.ckeditor-toolbar-active { + border: 1px solid #B6B6B6; + padding: 6px 8px 2px; + box-shadow: 0 1px 0 white inset; + background: #CFD1CF; + background-image: -webkit-gradient(linear, left top, left bottom, from(whiteSmoke), to(#CFD1CF)); + background-image: -moz-linear-gradient(top, whiteSmoke, #CFD1CF); + background-image: -o-linear-gradient(top, whiteSmoke, #CFD1CF); + background-image: -ms-linear-gradient(top, whiteSmoke, #CFD1CF); + background-image: linear-gradient(top, whiteSmoke, #CFD1CF); + filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#fff5f5f5',endColorstr='#ffcfd1cf'); + margin: 5px 0; + overflow: nowrap; +} +.ckeditor-toolbar-disabled { + margin: 5px 0; +} + +ul.ckeditor-buttons { + min-height: 26px; + min-width: 26px; + list-style: none; + + float: left; + clear: left; + padding: 0; + margin: 0 6px 5px 0; + border: 1px solid #A6A6A6; + border-bottom-color: #979797; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; + -moz-box-shadow: 0 1px 0 rgba(255,255,255,.5),0 0 2px rgba(255,255,255,.15) inset,0 1px 0 rgba(255,255,255,.15) inset; + -webkit-box-shadow: 0 1px 0 rgba(255, 255, 255, .5),0 0 2px rgba(255, 255, 255, .15) inset,0 1px 0 rgba(255, 255, 255, .15) inset; + box-shadow: 0 1px 0 rgba(255, 255, 255, .5),0 0 2px rgba(255, 255, 255, .15) inset,0 1px 0 rgba(255, 255, 255, .15) inset; +} +ul.ckeditor-buttons li { + display: inline-block; + height: 18px; + padding: 4px 6px; + outline: none; + cursor: move; + float: left; + border: 0; + white-space: nowrap; + + background: #E4E4E4; + background-image: -webkit-gradient(linear,left top,left bottom,from(white),to(#E4E4E4)); + background-image: -moz-linear-gradient(top,white,#E4E4E4); + background-image: -webkit-linear-gradient(top,white,#E4E4E4); + background-image: -o-linear-gradient(top,white,#E4E4E4); + background-image: -ms-linear-gradient(top,white,#E4E4E4); + background-image: linear-gradient(top,white,#E4E4E4); + filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4'); +} +ul.ckeditor-buttons li:first-child { + -moz-border-top-left-radius: 2px; + -moz-border-bottom-left-radius: 2px; + -webkit-border-top-left-radius: 2px; + -webkit-border-bottom-left-radius: 2px; + border-top-left-radius: 2px; + border-bottom-left-radius: 2px; +} +ul.ckeditor-buttons li:last-child { + -moz-border-top-right-radius: 2px; + -moz-border-bottom-right-radius: 2px; + -webkit-border-top-right-radius: 2px; + -webkit-border-bottom-right-radius: 2px; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; +} +ul.ckeditor-buttons li.ckeditor-button-placeholder { + background: #333; + opacity: 0.3; +} +ul.ckeditor-multiple-buttons { + padding: 2px; + margin: 0; + list-style: none; + float: left; +} +ul.ckeditor-multiple-buttons li { + padding: 2px 0; + margin: 0; + display: inline-block; + height: 18px; + cursor: move; + float: left; +} +.ckeditor-multiple-label { + float: left; + padding: 4px; +} +ul.ckeditor-buttons li.ckeditor-group-button-separator, +ul.ckeditor-multiple-buttons li.ckeditor-group-button-separator { + background: url(../images/group-separator.png) no-repeat center center; + width: 13px; + padding: 0; + height: 29px; + margin: -1px -3px -2px; + position: relative; + z-index: 10; +} +ul.ckeditor-buttons li.ckeditor-button-separator { + width: 2px; + padding: 0 4px; + height: 26px; + margin: 0 -4px; + position: relative; + z-index: 10; + + background: #E4E4E4; + background-image: -webkit-gradient(linear,left top,left bottom,from(white),to(#E4E4E4)); + background-image: -moz-linear-gradient(top,white,#E4E4E4); + background-image: -webkit-linear-gradient(top,white,#E4E4E4); + background-image: -o-linear-gradient(top,white,#E4E4E4); + background-image: -ms-linear-gradient(top,white,#E4E4E4); + background-image: linear-gradient(top,white,#E4E4E4); + filter: progid:DXImageTransform.Microsoft.gradient(gradientType=0,startColorstr='#ffffffff',endColorstr='#ffe4e4e4'); +} +ul.ckeditor-multiple-buttons li.ckeditor-button-separator { + width: 2px; + padding: 0; + height: 26px; + margin: 0 10px; +} +.ckeditor-separator { + background-color: silver; + background-color: rgba(0, 0, 0, .2); + margin: 5px 0; + height: 18px; + width: 1px; + display: block; + -webkit-box-shadow: 1px 0 1px rgba(255, 255, 255, .5); + -moz-box-shadow: 1px 0 1px rgba(255,255,255,.5); + box-shadow: 1px 0 1px rgba(255, 255, 255, .5) +} +.ckeditor-button-arrow { + width: 0; + text-align: center; + border-left: 3px solid transparent; + border-right: 3px solid transparent; + border-top: 3px solid #333; + display: inline-block; + margin: 0 4px 2px; +} + +.ckeditor-row-controls { + float: right; + font-size: 18px; + width: 40px; + text-align: right; +} +.ckeditor-row-controls a { + display: inline-block; + padding: 6px 2px; + height: 16px; + width: 16px; + line-height: 0.9; + font-weight: bold; + color: #333; +} +.ckeditor-row-controls a:hover { + text-decoration: none; +} diff --git a/core/modules/ckeditor/css/ckeditor.css b/core/modules/ckeditor/css/ckeditor.css new file mode 100644 index 0000000..94bdcf3 --- /dev/null +++ b/core/modules/ckeditor/css/ckeditor.css @@ -0,0 +1,56 @@ +/** + * Common styles used by CKEditor. Added to front-end theme and iFrame editors. + */ +.align-left { + text-align: left; /* RTL */ +} +.align-right { + text-align: right; /* RTL */ +} +.align-center { + text-align: center; +} +.align-justify { + text-align: justify; +} +img.align-left { + float: left; /* RTL */ +} +img.align-right { + float: right; /* RTL */ +} +img.align-center { + margin-left: auto; + margin-right: auto; + display: block; +} +img.full-width { + width: 100%; + height: auto; +} +.underline { + text-decoration: underline; +} +.indent1 { + margin: 0 0 0 40px; /* RTL */ +} +.indent2 { + margin: 0 0 0 80px; /* RTL */ +} +.indent3 { + margin: 0 0 0 120px; /* RTL */ +} +.caption-left { + float: left; /* RTL */ +} +.caption-right { + float: right; /* RTL */ +} +.caption-center { + text-align: center; + margin-left: auto; + margin-right: auto; +} +.align-justify { + text-align: justify; +} diff --git a/core/modules/ckeditor/images/break-handle.png b/core/modules/ckeditor/images/break-handle.png new file mode 100644 index 0000000..23640bb --- /dev/null +++ b/core/modules/ckeditor/images/break-handle.png @@ -0,0 +1,3 @@ +PNG + + IHDRM, pHYs  !IDATc9s2H#ɰU e6l>*IENDB` \ No newline at end of file diff --git a/core/modules/ckeditor/images/buttons/about.png b/core/modules/ckeditor/images/buttons/about.png new file mode 100644 index 0000000..ac976e9 --- /dev/null +++ b/core/modules/ckeditor/images/buttons/about.png @@ -0,0 +1,5 @@ +PNG + + IHDRabKGD pHYs B(xeIDAT8uOSa罗r.%mj $25A0@8"b_PHX+m":C}wsqD4mnZFRjF ԹXD,M7y)"b6h00#H(3@oo/j|>?EdRk*( +a $Idmlll^oi&&&/B pj`l6Zf{K˿ B.<Z_l2<<|/HV,,,$TˡQ._gGGGY\\OMMWkMh8xx< dR!A\_iiNRضR!%"J)D(edzbxy&5aY֞8LOO}mooB#n2atXE{{;"r D=VuRD"D$aY֫0.gsAfV>'Ln{kAѠX,zpxw- +#b%tEXtdate:create2012-10-25T12:48:11+02:00D2%tEXtdate:modify2012-10-25T12:48:11+02:00ptEXtSoftwarewww.inkscape.org<IENDB` \ No newline at end of file diff --git a/core/modules/ckeditor/images/buttons/anchor-rtl.png b/core/modules/ckeditor/images/buttons/anchor-rtl.png new file mode 100644 index 0000000..9017d6e --- /dev/null +++ b/core/modules/ckeditor/images/buttons/anchor-rtl.png @@ -0,0 +1,5 @@ +PNG + + IHDRabKGD pHYs B(xIDAT8ˍJA?3IT z bo7O>D z)^$E[5`7ݙouWmS|1KKKh4!`1h.//?IB MS9ρ7Q:88r(MS $zﳳIEp84P.tDYdYFE@ ,hۤi +$nEι!4ưHWP%!:E,)˲cEQZ1I(˲N{w +!s$IMM3IӔ4Mv}{\11pymmj{{[[[[Y;>::z/黤/%} N#L&8FKI?<%%Iz-?Hz$$ͦsdR纻NOO;EZ-y1k-IYkb/Uྐྵ:_!6˼h, 2'= Il64(p:l|%tEXtdate:create2012-10-25T12:48:11+02:00D2%tEXtdate:modify2012-10-25T12:48:11+02:00ptEXtSoftwarewww.inkscape.org<IENDB` \ No newline at end of file diff --git a/core/modules/ckeditor/images/buttons/anchor.png b/core/modules/ckeditor/images/buttons/anchor.png new file mode 100644 index 0000000..d2ccb8b --- /dev/null +++ b/core/modules/ckeditor/images/buttons/anchor.png @@ -0,0 +1,4 @@ +PNG + + IHDRabKGD pHYs B(xIDAT8ˍN[Acs)JȊL"Hy + ]W ul6QJRzvvvvxzzz8QJ]w:^[v{{ >~kvz=R86aY9pOPeMB@)U*HP%(U[B#1F1$H)'[pB0TED!3"L&Eqh4r,^fYFݦh "8f++>::qrrbku(_EQh4Z2Y+"|NyE䃈|~("Ep8FXk%.//Y,D}gg~`oauN& Ҭ()%VU池M)9(??e,K)"i?z<`O%tEXtdate:create2012-10-25T12:48:11+02:00D2%tEXtdate:modify2012-10-25T12:48:11+02:00ptEXtSoftwarewww.inkscape.org<IENDB` \ No newline at end of file diff --git a/core/modules/ckeditor/images/buttons/bidiltr.png b/core/modules/ckeditor/images/buttons/bidiltr.png new file mode 100644 index 0000000..af851af --- /dev/null +++ b/core/modules/ckeditor/images/buttons/bidiltr.png @@ -0,0 +1,10 @@ +PNG + + IHDRabKGD pHYs B(xIDAT8˅N1?X + PPTih^>J"]:tItReOgO + $d$77f> +{ [c Ƙ?ޝs8Z3??OEk=S<ѳcvc^)RJ) '"t:hRe{:T~q}}c ds!Z1qSUommQU 8$---؂[YY& ySU@1N,R91J8&svww C4,.[,//*8&2| +cYzo꺦( +Oonn=MӠ/"ugG8縺fYXyNlll\Fo$"ZD*;Ȳ}܋zZi +"B4ifmH92b{x$MS( +OyA$$6a?k5yZ%tEXtdate:create2012-10-25T12:48:11+02:00D2%tEXtdate:modify2012-10-25T12:48:11+02:00ptEXtSoftwarewww.inkscape.org<IENDB` \ No newline at end of file diff --git a/core/modules/ckeditor/images/buttons/bidirtl.png b/core/modules/ckeditor/images/buttons/bidirtl.png new file mode 100644 index 0000000..815b22b --- /dev/null +++ b/core/modules/ckeditor/images/buttons/bidirtl.png @@ -0,0 +1,6 @@ +PNG + + IHDRabKGD pHYs B(xIDAT8uS=oA} t…)rݸ 4n\X_Dr"]:K)Q&$ {_"bvͼ74 @D8k-IDBoZsH +!pttj +!Arf̨V`]Q{RJ[T~~RJJ%E(pjrZa I5xIyNNNPT<3Ch!d q>@T8>>F\1mX+Ik t~Z~KN DPȓOOOo///[0 "zssm8bȲ Dk-,}G[t<N x\t:EB[Rf}^?kcd1pRGS7 Chg/ת6AY82 ,˶vA^E0]9;݄D߷ +%tEXtdate:create2012-10-25T12:48:11+02:00D2%tEXtdate:modify2012-10-25T12:48:11+02:00ptEXtSoftwarewww.inkscape.org<IENDB` \ No newline at end of file diff --git a/core/modules/ckeditor/images/buttons/blockquote.png b/core/modules/ckeditor/images/buttons/blockquote.png new file mode 100644 index 0000000..cf9bb49 --- /dev/null +++ b/core/modules/ckeditor/images/buttons/blockquote.png @@ -0,0 +1,4 @@ +PNG + + IHDRabKGD pHYs B(xIDAT8m?H$w?NVj@#Z1K(QBMvb#!$V⚀w!!!vgeAuVnݙAٝy).w}{X,21I oc ZRZ$Hd(hC$}$qQrܰCDQDETl6K.v}(l" u+IHlRT`0#1$|PYXX+i:Nԁ$$1?ommmaT*q||X,/--Xk Ðp&''?zZ-LLLVtvvbeyysc̈F}RlEv/ t\.j Ð0 .FI}wxxlllhuuU{{{ aoOOO_gI߬hjj\rRDZ Z>Γv222@Vhwwwb%͒N1|,?(op]ByVkͽtXո^!P>88C/܋ nnnxQ($*-\^^}Gq:k8>899 +ozǁ1[2 N0 v'.q$07<$IFq$L?<%tEXtdate:create2012-10-25T12:48:11+02:00D2%tEXtdate:modify2012-10-25T12:48:11+02:00ptEXtSoftwarewww.inkscape.org<IENDB` \ No newline at end of file diff --git a/core/modules/ckeditor/images/buttons/bold.png b/core/modules/ckeditor/images/buttons/bold.png new file mode 100644 index 0000000..d49a56d --- /dev/null +++ b/core/modules/ckeditor/images/buttons/bold.png @@ -0,0 +1,3 @@ +PNG + + IHDRabKGD pHYs B(xcIDAT8mK$GvatfN  nD/"C"1WDBr9$]^#Tt^.M;>^꽒+14M.QQZx<&@!TC߲jj&pJ "DQT1&΁Ed$"Dkynj&.'j-..KQ$IBe-}/M"򱪾βysuqtt<{{{M5*mmm}kiTJq@HD'"iEۓ?4Lb191qlrppbyy4MyPUʲ(2I,u=Uߪb4=(˒`P&766~K{o,{mvg;kkkxz ú,"t:VVVfIxLǍF' ݱpm}PUEqnr\2?<< ;;;ooos#8 j oi`|uss~@k-goFRޤD@Hx&%tEXtdate:create2012-10-25T12:48:11+02:00D2%tEXtdate:modify2012-10-25T12:48:11+02:00ptEXtSoftwarewww.inkscape.org<IENDB` \ No newline at end of file diff --git a/core/modules/ckeditor/images/buttons/bulletedlist-rtl.png b/core/modules/ckeditor/images/buttons/bulletedlist-rtl.png new file mode 100644 index 0000000..2d9f640 --- /dev/null +++ b/core/modules/ckeditor/images/buttons/bulletedlist-rtl.png @@ -0,0 +1,4 @@ +PNG + + IHDRabKGD pHYs B(xIDAT8˥"AQ7Y 618 |҃C 4eqT Tgg.ԃ][aR[|/b88$Z1hr>V*ue5f@Dn$IQ@oi^1k\ADN@ƽtz3x<hZk\k-J'P)c|ߧjyj\ceI "?:7 y3>b8GQtY|>GD\<y_W.K0D}hKrZF^Z8q|Zn?گcllFGKy+czF#$!NTUsLU~c cH6^o9 XkFDk-oooLSTo4}Tuy\8Ne$s\s<ɲ wYv:4Sǀ(V+^}T "8%$EQ o.Z.GQAB,K___L&uj' s|*UnfIz#h|[{v^UO99s "bU8|~~r8ꀢ((c ZvK$W!,CU=Q 7yCľ^D8JlrU0k'8{&i^$8Ȳ({sp???ON?*?N%tEXtdate:create2012-10-25T12:48:11+02:00D2%tEXtdate:modify2012-10-25T12:48:11+02:00ptEXtSoftwarewww.inkscape.org<IENDB` \ No newline at end of file diff --git a/core/modules/ckeditor/images/buttons/copy.png b/core/modules/ckeditor/images/buttons/copy.png new file mode 100644 index 0000000..b65abb8 --- /dev/null +++ b/core/modules/ckeditor/images/buttons/copy.png @@ -0,0 +1,3 @@ +PNG + + IHDRabKGD pHYs B(xIDAT8en0;OBH .l"!.8NNp>GKy+czF#$!NTUsLU~c cH6^o9 XkFDk-oooLSTo4}Tuy\8Ne$s\s<ɲ wYv:4Sǀ(V+^}T "8%$EQ o.Z.GQAB,K___L&uj' s|*UnfIz#h|[{v^UO99s "bU8|~~r8ꀢ((c ZvK$W!,CU=Q 7yCľ^D8JlrU0k'8{&i^$8Ȳ({sp???ON?*?N%tEXtdate:create2012-10-25T12:48:11+02:00D2%tEXtdate:modify2012-10-25T12:48:11+02:00ptEXtSoftwarewww.inkscape.org<IENDB` \ No newline at end of file diff --git a/core/modules/ckeditor/images/buttons/cut-rtl.png b/core/modules/ckeditor/images/buttons/cut-rtl.png new file mode 100644 index 0000000..9b19235 --- /dev/null +++ b/core/modules/ckeditor/images/buttons/cut-rtl.png @@ -0,0 +1,5 @@ +PNG + + IHDRabKGD pHYs B(xIDAT8ERKhce=o.okM ڍh}Ai&%]fŭIw,bFą 2A SiXLثi]Jc&ͫM㢓΁oy>K|(yְ, zFn`6"b1jhZ J)haGeݍZq858,ٶJ) "(Ŗ1o9A(Z;"r$Harr򷥥%w"sORD"Zzh6X]]^cqq5u%"fOZ1~}Tj)NOLLzuu cL=}088BJ˛  b̌N/{}}h4 +[[[N[@\l^d21TUJ^|@8322yvv :R7(Fq&xmmG|8;;+"I?LLt: iBt|H$1zfBUus>2*vww T*E* +H8PdOI~ER#H~LB 7K跊&%tEXtdate:create2012-10-25T12:48:11+02:00D2%tEXtdate:modify2012-10-25T12:48:11+02:00ptEXtSoftwarewww.inkscape.org<IENDB` \ No newline at end of file diff --git a/core/modules/ckeditor/images/buttons/cut.png b/core/modules/ckeditor/images/buttons/cut.png new file mode 100644 index 0000000..9b19235 --- /dev/null +++ b/core/modules/ckeditor/images/buttons/cut.png @@ -0,0 +1,5 @@ +PNG + + IHDRabKGD pHYs B(xIDAT8ERKhce=o.okM ڍh}Ai&%]fŭIw,bFą 2A SiXLثi]Jc&ͫM㢓΁oy>K|(yְ, zFn`6"b1jhZ J)haGeݍZq858,ٶJ) "(Ŗ1o9A(Z;"r$Harr򷥥%w"sORD"Zzh6X]]^cqq5u%"fOZ1~}Tj)NOLLzuu cL=}088BJ˛  b̌N/{}}h4 +[[[N[@\l^d21TUJ^|@8322yvv :R7(Fq&xmmG|8;;+"I?LLt: iBt|H$1zfBUus>2*vww T*E* +H8PdOI~ER#H~LB 7K跊&%tEXtdate:create2012-10-25T12:48:11+02:00D2%tEXtdate:modify2012-10-25T12:48:11+02:00ptEXtSoftwarewww.inkscape.org<IENDB` \ No newline at end of file diff --git a/core/modules/ckeditor/images/buttons/form.png b/core/modules/ckeditor/images/buttons/form.png new file mode 100644 index 0000000..1e7312d --- /dev/null +++ b/core/modules/ckeditor/images/buttons/form.png @@ -0,0 +1,3 @@ +PNG + + IHDRabKGD pHYs B(xmIDAT8˕@JZ\4ɋ >o>oe((=T0W]a6}hnnqLԩ,)nzDQTK t(yފ@̌tj f&"wUe>\.ŅH4Mp=cfIB*ÁfQ'xTUq^Zϟͬ '"Ey3m}a41i4**"%PeTR TiD T=eZ-DfDUwqLg0CU\.ܛ'BxmtaADxTUUaHEA9)9<ct:j&I1c<D"r$"w"rDb7n||||P凫+ʲyjNP~䤻ZAf(xxx^c}t( +TUQCUp8,PUwLGҲ,,Kͦ*)7vޫ*kkkZUix0DD"UD"V}z֖qEDFyj5f$Onw^^mUUy0 ;;;Xk9;;cyyU*F777?6$":ivdfPUռ_ZKL&oooQE4`0ϲY<_, ?bz%tEXtdate:create2012-10-25T12:48:11+02:00D2%tEXtdate:modify2012-10-25T12:48:11+02:00ptEXtSoftwarewww.inkscape.org<IENDB` \ No newline at end of file diff --git a/core/modules/ckeditor/images/buttons/indent-rtl.png b/core/modules/ckeditor/images/buttons/indent-rtl.png new file mode 100644 index 0000000..644cf51 --- /dev/null +++ b/core/modules/ckeditor/images/buttons/indent-rtl.png @@ -0,0 +1,4 @@ +PNG + + IHDRabKGD pHYs B(xIDAT8}S1@}kk\*g 7Ht9F&6}R%%JE$P` _IFzbw߼y#qo!"(P%HdWP "MSiz'z ZCk R +QZ5Mק y$ʲDYAL"VdAۅseY2Z;V`0t:p!2 IdYvk{^DEgI5&cp8jSLR5c]h4o#-p:xw&|{`ہJmoI~'ٹN`<q[~oT\.KrSX,Nk v"2"ZOz-p8|!"If+EQ<Iyoe+("0cԱ%tEXtdate:create2012-10-25T13:24:21+02:002%tEXtdate:modify2012-10-25T13:24:21+02:00o%tEXtSoftwarewww.inkscape.org<IENDB` \ No newline at end of file diff --git a/core/modules/ckeditor/images/buttons/indent.png b/core/modules/ckeditor/images/buttons/indent.png new file mode 100644 index 0000000..6bed85e --- /dev/null +++ b/core/modules/ckeditor/images/buttons/indent.png @@ -0,0 +1,5 @@ +PNG + + IHDRabKGD pHYs B(xIDAT8˅jQBY҂nt~RD +ӸI Un"[I"Emf枙9...X 39GT 25͎{dfr$IZDTbccZF<FV.n%tEXtdate:create2012-10-25T13:24:21+02:002%tEXtdate:modify2012-10-25T13:24:21+02:00o%tEXtSoftwarewww.inkscape.org<IENDB` \ No newline at end of file diff --git a/core/modules/ckeditor/images/buttons/italic.png b/core/modules/ckeditor/images/buttons/italic.png new file mode 100644 index 0000000..d447a44 --- /dev/null +++ b/core/modules/ckeditor/images/buttons/italic.png @@ -0,0 +1,4 @@ +PNG + + IHDRabKGD pHYs B(xIDAT8ujA;_"`Dj*n\څ꼃^ @zt@P&`Ld0Lg9r}}sJ)ֈ{49@)CRfJlr9h1PVz sq3LQ}Z}_8fV+F2Ir4Myzz{~$I_777ۯ]@f("DQNNN>WWWf J8UJq{{l~Nky1_Bc~XkCJܩcvEIP$Uax=r9CZK7km[@fhjt:=k-nj5vdm6n6q;uPz@DC=qֿgiJExv'ݑi19|>X +Ҳłr_J}%tEXtdate:create2012-10-25T12:48:11+02:00D2%tEXtdate:modify2012-10-25T12:48:11+02:00ptEXtSoftwarewww.inkscape.org<IENDB` \ No newline at end of file diff --git a/core/modules/ckeditor/images/buttons/justifyblock.png b/core/modules/ckeditor/images/buttons/justifyblock.png new file mode 100644 index 0000000..a33f4cf --- /dev/null +++ b/core/modules/ckeditor/images/buttons/justifyblock.png @@ -0,0 +1,4 @@ +PNG + + IHDRabKGD pHYs B(x IDAT8˥j@l6+H.9% NK)g~r@DH39,#˲eaYBxՊnt:G ?̬.e%tEXtdate:create2012-10-25T12:48:11+02:00D2%tEXtdate:modify2012-10-25T12:48:11+02:00ptEXtSoftwarewww.inkscape.org<IENDB` \ No newline at end of file diff --git a/core/modules/ckeditor/images/buttons/justifyleft.png b/core/modules/ckeditor/images/buttons/justifyleft.png new file mode 100644 index 0000000..59b24ca --- /dev/null +++ b/core/modules/ckeditor/images/buttons/justifyleft.png @@ -0,0 +1,4 @@ +PNG + + IHDRabKGD pHYs B(xGIDAT8˕ˊ@EWW0G-"h $IhN>ڜ8!B D)RA#)tr x<1P%Z=sm[RJH ~gZcd2A)$N,3)%wb@QMӼ:nz~C^s!=3{c9Ͻ]łf1x>rPEoG֎Bno&r4Wm +klB7!n1BJyDRk_s4*%tEXtdate:create2012-10-25T12:48:11+02:00D2%tEXtdate:modify2012-10-25T12:48:11+02:00ptEXtSoftwarewww.inkscape.org<IENDB` \ No newline at end of file diff --git a/core/modules/ckeditor/images/buttons/justifyright.png b/core/modules/ckeditor/images/buttons/justifyright.png new file mode 100644 index 0000000..d7f84f4 --- /dev/null +++ b/core/modules/ckeditor/images/buttons/justifyright.png @@ -0,0 +1,5 @@ +PNG + + IHDRabKGD pHYs B(xCIDAT8˕Mn0?۱@"o $.$U:+KG)<謭V+9XEQbmO)%Y=@}ɦ.,qεsEAv9>wZ֚OW-++%tEXtdate:create2012-10-25T12:48:11+02:00D2%tEXtdate:modify2012-10-25T12:48:11+02:00ptEXtSoftwarewww.inkscape.org<IENDB` \ No newline at end of file diff --git a/core/modules/ckeditor/images/buttons/link.png b/core/modules/ckeditor/images/buttons/link.png new file mode 100644 index 0000000..05b75d0 --- /dev/null +++ b/core/modules/ckeditor/images/buttons/link.png @@ -0,0 +1,5 @@ +PNG + + IHDRabKGD pHYs B(xIDAT8˥Q cL&E \} e#W{X-(kVF!eRdSYY]<;{ﵢ(Kꃙ=*P{8D1FB$psQBs` w>k{!fy7IQ9I40It:b/պsxeY!~eن04e61~f3ŢPJ}B\!.RŢf4ňBp$In' jUiZɄ$In~V(n(Ð^ xtJ n+X,X,T*?[Mz޷0 58R`0;,"˱ɬuBlfQ|yh) \lKXAeö폵ZMj5 \n-\m}}eazkF\.㺮rd\R}uu\h1MRa/E*J4͒R +ttt:e:vǭVyVJl6KRHZk8 C$n?Ap5ϙApn?'I5 C8Fk1|px"8}m !q>~߳Z//n4?`VU+%tEXtdate:create2012-10-25T12:48:11+02:00D2%tEXtdate:modify2012-10-25T12:48:11+02:00ptEXtSoftwarewww.inkscape.org<IENDB` \ No newline at end of file diff --git a/core/modules/ckeditor/images/buttons/newpage-rtl.png b/core/modules/ckeditor/images/buttons/newpage-rtl.png new file mode 100644 index 0000000..c505a7a --- /dev/null +++ b/core/modules/ckeditor/images/buttons/newpage-rtl.png @@ -0,0 +1,3 @@ +PNG + + IHDRabKGD pHYs B(xgIDAT8ˍ@ H 9;AOIfO_;^-w[RQ}SՖ鄗Ei$ "B$9v,K9c%ՊlvaY!,X,1˲pk& MPq MޜaiP٫O`ADƘfr`Z#(pW@+LSDCD`t>#"*9st]Kvy1fT߁X~z Mж->իT/sνoo+,y<m;uMY*38ڶ~SUιZ+ZKE.K%tEXtdate:create2012-10-25T12:48:11+02:00D2%tEXtdate:modify2012-10-25T12:48:11+02:00ptEXtSoftwarewww.inkscape.org<IENDB` \ No newline at end of file diff --git a/core/modules/ckeditor/images/buttons/newpage.png b/core/modules/ckeditor/images/buttons/newpage.png new file mode 100644 index 0000000..24dd819 --- /dev/null +++ b/core/modules/ckeditor/images/buttons/newpage.png @@ -0,0 +1,3 @@ +PNG + + IHDRabKGD pHYs B(x{IDAT8ˍM0)'fزb $~v-fIhJru|>!i\. PJG)EUUXkaHeaEfiVł8"ADnzf2`!s,{ふoֺW5-ө1P?@l6$yC$A{ 9G}PǣQEbip{0 3t:%6(Gkr!Z|64Mӝ_2hkm>ͼ;F;7omG,)֚,Z[J)nUU@]%|꽇1@7 I' kN +RJێHvHI)Ay@!EQ@R#~MY&JjU(eYb2"TUuxX,[%<1C[Ӂ%񴾪*{\TxȬ1z/1v{Ƙ+2_U@+I`w!_-֐7I5T_4V$lp8ce[\.! ,0c`I]V #+%tEXtdate:create2012-10-25T12:48:11+02:00D2%tEXtdate:modify2012-10-25T12:48:11+02:00ptEXtSoftwarewww.inkscape.org<IENDB` \ No newline at end of file diff --git a/core/modules/ckeditor/images/buttons/outdent-rtl.png b/core/modules/ckeditor/images/buttons/outdent-rtl.png new file mode 100644 index 0000000..05e524b --- /dev/null +++ b/core/modules/ckeditor/images/buttons/outdent-rtl.png @@ -0,0 +1,3 @@ +PNG + + IHDRabKGD pHYs B(xIDAT8˅An@D_Xv[NE@n`8Ŝk8E&$db偠|voڶ2`ZKJ IHZs00 $t X,X,XkD: zMIH)pQ5ιeIcMQuM0nI)a<,Kc^PUժ,KYyϤ}#)HO'$)~uڶER&?CMlq[#D{,>VU%mcZd11Y n,K_Byq{0qI᳤m=ȲfQ{$ahwƘb|rsnJ̒9`\__sqqkW16M뺷]cb>g*2Eq_<߬Ԍ%tEXtdate:create2012-10-25T13:24:21+02:002%tEXtdate:modify2012-10-25T13:24:21+02:00o%tEXtSoftwarewww.inkscape.org<IENDB` \ No newline at end of file diff --git a/core/modules/ckeditor/images/buttons/outdent.png b/core/modules/ckeditor/images/buttons/outdent.png new file mode 100644 index 0000000..1d3a4b4 --- /dev/null +++ b/core/modules/ckeditor/images/buttons/outdent.png @@ -0,0 +1,5 @@ +PNG + + IHDRabKGD pHYs B(xIDAT8˅Ao@]"$js+Pʡb@`-z*+웙7oL|<1Xk1" I\:ɥZx !B xXkb!I,{ !v3IZKxruuE8羦ix<sVA,-sh4 )xX6vmwa8nueɅūCb!~>SEUu]ik-I;Pr(`AO\T*2\=.JeO\T*2\=.Je_$I673334c8,g4!^/3zHR䜣T*ijj +II/"$E]9+ 4M' M + 0 f}@RjGы38x9Gﶶ΂ x}rqEښfgg$}?/_IL Ilyyy?$ENNNRߞH::88h>Ý!lggI_aHq "`d%}˿C>#9%My%tEXtdate:create2012-10-25T12:48:11+02:00D2%tEXtdate:modify2012-10-25T12:48:11+02:00ptEXtSoftwarewww.inkscape.org<IENDB` \ No newline at end of file diff --git a/core/modules/ckeditor/images/buttons/pastefromword.png b/core/modules/ckeditor/images/buttons/pastefromword.png new file mode 100644 index 0000000..621366b --- /dev/null +++ b/core/modules/ckeditor/images/buttons/pastefromword.png @@ -0,0 +1,4 @@ +PNG + + IHDRabKGD pHYs B(xIDAT8uK+Ww2uL& ,Hቻ@W |k ]?).J7]*U‹d@!$fgׅ»8;;\^^bq\ejj0 qcnIk-p1KeJL1Fd2RrL1s}}M>X,bN|^.t̸Nf$I +cIH?Bx$ f(BI?>$(zHb(IjU5GZ|XT;Ir /Λ&ᐑ:+++>n8u&aviZ4 IH%I2 < @^ϸ1Xk_ r,&i077 lI6xu4RY[[k2{I,--i~~^WWW?* îoZ'677z}(i0nc=Y\\܏:sǸin=Z^^ӑ'ywwIH$}+ nnn7FFBo[%tEXtdate:create2012-10-25T12:48:11+02:00D2%tEXtdate:modify2012-10-25T12:48:11+02:00ptEXtSoftwarewww.inkscape.org<IENDB` \ No newline at end of file diff --git a/core/modules/ckeditor/images/buttons/pastetext-rtl.png b/core/modules/ckeditor/images/buttons/pastetext-rtl.png new file mode 100644 index 0000000..d69ddd9 --- /dev/null +++ b/core/modules/ckeditor/images/buttons/pastetext-rtl.png @@ -0,0 +1,3 @@ +PNG + + IHDRabKGD pHYs B(xaIDAT8uj#WEOu%5R ]L `0||@^zl_2Y 18 Njc;ZO}ڣ ˃WnݪgY`fxGaH<,KeYU ltH_$It:4M ,}(ncfH6">(˒cתּ, 8^qܓ8{+jcfKb+>m?I̾9~pHQDQ$I/$ٯW}mmM^m9x9$wZ@kGGGo4xW).//fz3g@$n(|'c쭙#ُf&;I3Ixܛf'I*'Bb)IZ-ft]0^TYhl'IPJE>$(<{<-uxx&VVVVs0h_vvvN4M%=1d2? FQ,K1SIӓ8m<4JeibݟHz9 sܐ{`սK>?ߏF#Jl:%tEXtdate:create2012-10-25T12:48:11+02:00D2%tEXtdate:modify2012-10-25T12:48:11+02:00ptEXtSoftwarewww.inkscape.org<IENDB` \ No newline at end of file diff --git a/core/modules/ckeditor/images/buttons/pastetext.png b/core/modules/ckeditor/images/buttons/pastetext.png new file mode 100644 index 0000000..904684c --- /dev/null +++ b/core/modules/ckeditor/images/buttons/pastetext.png @@ -0,0 +1,5 @@ +PNG + + IHDRabKGD pHYs B(xLIDAT8uJQ3ӄdBl\R*5 t]JUKua` BR0DHbc.w qp]jJq( +!IeEQ p]zN"JҎi1KNZ-:bf%l61>xEQpxxh4y Y}' I'{, E>ȃYM_QMdYFٔnQAHRZ1JZ]o㰴!eI-KO_y/VVV&0Z(8:Ig|wwHmo<# 7s!n=*t:ZX/q9gggHZF%}~_|sc%tEXtdate:create2012-10-25T12:48:11+02:00D2%tEXtdate:modify2012-10-25T12:48:11+02:00ptEXtSoftwarewww.inkscape.org<IENDB` \ No newline at end of file diff --git a/core/modules/ckeditor/images/buttons/redo-rtl.png b/core/modules/ckeditor/images/buttons/redo-rtl.png new file mode 100644 index 0000000..dc738da --- /dev/null +++ b/core/modules/ckeditor/images/buttons/redo-rtl.png @@ -0,0 +1,4 @@ +PNG + + IHDRabKGD pHYs B(xlIDAT8˥?Hy?7?]vz"DX!^]y]#w]R $T)-!\}),Rag{X츨;"LB#N8/."w'SSS?Ay1qvlll| l|otty|'MS< AU9==%MSj ( h4CR9t]4Mz7@2jpppP___ץNfff$I>&Mӷ~nβ2"211xggyWle||l~,Evj*"u^~׽ qA%tEXtdate:create2012-10-25T12:48:11+02:00D2%tEXtdate:modify2012-10-25T12:48:11+02:00ptEXtSoftwarewww.inkscape.org<IENDB` \ No newline at end of file diff --git a/core/modules/ckeditor/images/buttons/removeformat.png b/core/modules/ckeditor/images/buttons/removeformat.png new file mode 100644 index 0000000..60c4d9c --- /dev/null +++ b/core/modules/ckeditor/images/buttons/removeformat.png @@ -0,0 +1,3 @@ +PNG + + IHDRabKGD pHYs B(xIDAT8}RKTQι:Of|.f\$B p5JwѶm6nÕ UEI&d? ԧaqh7=ߜ>|{sioo  "4Ͷf03:;;5蒑!:F`ftuu4Gccc Zk$I(|G|z||0sARԚmۘ ]<JBA`qqF}03rMBoRVVV|| Z koMOOFQuxn5 C3_ʈa0pghTWqۀa& MҞZ⋛b"a, DtexxF(Jh3H H@k cRmxovf>Wճ.`^V!`<&9cY.2٬i޾km۟p t:3J<(}]wE!"dcpddWZ]ەJJDBDW(ADI":$U?gZ>7^*x"Dd9'RizKKK\0vvv "$Aq+ɼX"qϓwETdbl%tEXtdate:create2012-10-25T12:48:11+02:00D2%tEXtdate:modify2012-10-25T12:48:11+02:00ptEXtSoftwarewww.inkscape.org<IENDB` \ No newline at end of file diff --git a/core/modules/ckeditor/images/buttons/select-rtl.png b/core/modules/ckeditor/images/buttons/select-rtl.png new file mode 100644 index 0000000..6f14004 --- /dev/null +++ b/core/modules/ckeditor/images/buttons/select-rtl.png @@ -0,0 +1,4 @@ +PNG + + IHDRabKGD pHYs B(xIDAT8˕Q{gFaAMe,|-.E:4jj֞iJ^ Qq8֢*fVvY.߃ x13Iv;9qԇqs<v$Ir>1n]* NG˿lI_`hd2A& { 4m˲*[ΦibXRj LS݀\.GߧRqe8NƧUvGĶU j* Ri~800 +oWj18m%tEXtdate:create2012-10-25T12:48:11+02:00D2%tEXtdate:modify2012-10-25T12:48:11+02:00ptEXtSoftwarewww.inkscape.org<IENDB` \ No newline at end of file diff --git a/core/modules/ckeditor/images/buttons/showblocks-rtl.png b/core/modules/ckeditor/images/buttons/showblocks-rtl.png new file mode 100644 index 0000000..e65cb89 --- /dev/null +++ b/core/modules/ckeditor/images/buttons/showblocks-rtl.png @@ -0,0 +1,7 @@ +PNG + + IHDRabKGD pHYs B(xIDAT8}ϊAŠ&o='@>x dO =ʺz 3:=Ӄ||MUWW%ݎVEE* =ZDU$Irt"e@?M;.r9`\.ϫâ&Ip4MѢjv:o@n{s=qp:Fz.9ZgkZ[CT`T1 3Apk'Eyt!` #"E( + +)HcLPU1`EUuTp;'f?c8qLWrF sll)Z;a;,ˮ +mRpZU5}z0"U*wygk{xk<O/Fc6o|>3NL&ߝslP՞. +/ Um6R>"f%tEXtdate:create2012-10-25T12:48:11+02:00D2%tEXtdate:modify2012-10-25T12:48:11+02:00ptEXtSoftwarewww.inkscape.org<IENDB` \ No newline at end of file diff --git a/core/modules/ckeditor/images/buttons/showblocks.png b/core/modules/ckeditor/images/buttons/showblocks.png new file mode 100644 index 0000000..1acbbcb --- /dev/null +++ b/core/modules/ckeditor/images/buttons/showblocks.png @@ -0,0 +1,6 @@ +PNG + + IHDRabKGD pHYs B(xIDAT8˅n@k +"e` /+m)}JtN$"=>[1jtt̽瞹6 1ct(lk{ MSQ,θ( +$\a9@,C6v;Tg~>{9$W4{ylqӡnIo߁{ $)MS$q,FZ-ʲ%vЂ9DmPfycZ~GуC|{_'-,( Q +!|||EQYZ8>S"FA%IB$$Ivjig뜫+˲0a@FCj*EQ=aX,V;xPzqss3 f;fƘ+cU3gL&??Z><D"H0,MB666PTB,C8??W@r"rD777RT/T +$1j]^u7g+ 8'c (qXH{mJtlte8<<|FĎ]E)"'''+Q(`DC/"P(8;;Oyrdvaa$_;bvvAk}jA)iX%mC)0va6da@D|pqq0 8  %tEXtdate:create2012-10-25T12:48:11+02:00D2%tEXtdate:modify2012-10-25T12:48:11+02:00ptEXtSoftwarewww.inkscape.org<IENDB` \ No newline at end of file diff --git a/core/modules/ckeditor/images/buttons/source.png b/core/modules/ckeditor/images/buttons/source.png new file mode 100644 index 0000000..38b1cd9 --- /dev/null +++ b/core/modules/ckeditor/images/buttons/source.png @@ -0,0 +1,4 @@ +PNG + + IHDRabKGD pHYs B(xzIDAT8ˍKAwoV*xȂM +/1I/`.vI `H#JE ;oofKn#)3 |<;;ym%"t:A)c D$cR)dY8#$eYN144366\.q@@`yyJc E$TJ2[;###fm;X"1I$]fffy,E0L qEF9뺉Me$\-eX,s{{lb___8ZkhAR0X{-$(v! ݃0I* }(p}}U*۵ }ss[0A@k=aZ,JH>XYYI_D>lll;Nq_RJK.KQei3jڏf#I|X8FP@*zE2+"8~R(>|YB1"H}4 Rj < eYhZEF>GZnC)f 5lc ZD$%zs{) `6%tEXtdate:create2012-10-25T12:48:11+02:00D2%tEXtdate:modify2012-10-25T12:48:11+02:00ptEXtSoftwarewww.inkscape.org<IENDB` \ No newline at end of file diff --git a/core/modules/ckeditor/images/buttons/specialchar.png b/core/modules/ckeditor/images/buttons/specialchar.png new file mode 100644 index 0000000..b1933b6 --- /dev/null +++ b/core/modules/ckeditor/images/buttons/specialchar.png @@ -0,0 +1,9 @@ +PNG + + IHDRabKGD pHYs B(xIDAT8uOH#w?ĉ!HRjK=J0`)O^ =lݣ=<\P֛BR)]jMiTbFB|O彯) +c,p8L<q 󸼼} @=]sOOL&!6O%5ǡ^yvq]F$ +P4} @| +FP,V]]tttT|GII[wlcO%QVT*u}HυMMM$Io +$9lll|???W$(݀չ9V듓888uDaqqQ/(aϟG"`6eX췫+1&iB!1fxxxp-²,17AV{nIR1fj6H2@ny-xmWc̳t:Jn)m啕iIEk|2l,//Os=UKsI$ lF +%tEXtdate:create2012-10-25T12:48:11+02:00D2%tEXtdate:modify2012-10-25T12:48:11+02:00ptEXtSoftwarewww.inkscape.org<IENDB` \ No newline at end of file diff --git a/core/modules/ckeditor/images/buttons/strike.png b/core/modules/ckeditor/images/buttons/strike.png new file mode 100644 index 0000000..f0574ea --- /dev/null +++ b/core/modules/ckeditor/images/buttons/strike.png @@ -0,0 +1,3 @@ +PNG + + IHDRabKGD pHYs B(x IDAT8}J@I.qg;]}7W} WB{ՖdmҪp"7ʲ Zk(_(HӔ`@CDZc\^ !lXkTJ1Z(iʲ*޸Wu]DD$I1&4MY,b;2hj~ox<>*\^^}<LD 1MUb2 @3%p%tEXtdate:create2012-10-25T12:48:11+02:00D2%tEXtdate:modify2012-10-25T12:48:11+02:00ptEXtSoftwarewww.inkscape.org<IENDB` \ No newline at end of file diff --git a/core/modules/ckeditor/images/buttons/superscript.png b/core/modules/ckeditor/images/buttons/superscript.png new file mode 100644 index 0000000..5a21143 --- /dev/null +++ b/core/modules/ckeditor/images/buttons/superscript.png @@ -0,0 +1,4 @@ +PNG + + IHDRabKGD pHYs B(xtIDAT8ˍMKQ{#3lJ$Y躵B~JPp(teqe+Mmą!jc#B;Dg̼]%Y=/ܣRh1 5yeR8 +4%"#0, 0nEa`&eQ,qRJRbYVgll S)ie\~@Tu]e!" ӆa`j)RJH^,mn.P5@V{*"k@v:@QD"Z(F;~i8r'^%tEXtdate:create2012-10-25T12:48:11+02:00D2%tEXtdate:modify2012-10-25T12:48:11+02:00ptEXtSoftwarewww.inkscape.org<IENDB` \ No newline at end of file diff --git a/core/modules/ckeditor/images/buttons/table.png b/core/modules/ckeditor/images/buttons/table.png new file mode 100644 index 0000000..f36a887 --- /dev/null +++ b/core/modules/ckeditor/images/buttons/table.png @@ -0,0 +1,3 @@ +PNG + + IHDRabKGD pHYs B(xIDAT8˥?@g xb"`;;B] ?~ .M4!#1W+yq/3fx</?YDQw@>]Del6e00Y,nK{ju^q]5ZkQJ=\W,pjyZO64I$2ypiJJ)xE[vXץ0}_5 t:Om4^PVI󿘕e~jySJq:&w-1 ҎE\.JE.J)Va*uj<08m)J)WLDm$I(qqm{,"ZPi1KvAO{^"ZH%tEXtdate:create2012-10-25T12:48:11+02:00D2%tEXtdate:modify2012-10-25T12:48:11+02:00ptEXtSoftwarewww.inkscape.org<IENDB` \ No newline at end of file diff --git a/core/modules/ckeditor/images/buttons/textarea-rtl.png b/core/modules/ckeditor/images/buttons/textarea-rtl.png new file mode 100644 index 0000000..5286d4b --- /dev/null +++ b/core/modules/ckeditor/images/buttons/textarea-rtl.png @@ -0,0 +1,5 @@ +PNG + + IHDRabKGD pHYs B(xIDAT8ˍkQof!|-!u %()V+VӤE4AȇA DXPBl@c\̾=3B ^s5yc$p2>>yC5圣lB |48=ImIh4Za055Hz.)'/..&@TU1o4MH4'<2҅NVk[Xk|ZKEaX(sO$aii~azur +I. C\c &(XkLcc [Y0 $ann1I/s\]]eQ*cY&h۬VO1+qST +AJKn ,cyyϙdll iZH^\\t$unnnt:LNN&{q;880;;{HF$@ eJ8dmmmwddD930㯒J\^^*(Z]lB^G=Iك>KzT{~%tEXtdate:create2012-10-25T12:48:11+02:00D2%tEXtdate:modify2012-10-25T12:48:11+02:00ptEXtSoftwarewww.inkscape.org<IENDB` \ No newline at end of file diff --git a/core/modules/ckeditor/images/buttons/textarea.png b/core/modules/ckeditor/images/buttons/textarea.png new file mode 100644 index 0000000..ab4a35d --- /dev/null +++ b/core/modules/ckeditor/images/buttons/textarea.png @@ -0,0 +1,5 @@ +PNG + + IHDRabKGD pHYs B(x +IDAT8ˍJAw8asU\Xm`2R2/RBR&`XIp D ?:3MI$S9̽gk-DIJU)˒3nzzy9s{{ 1F5 qGvvUUj}NTRJ,,,;|Qۢ(49S>ꇕ.//^,-"h6 `0sZ:oʲ9lpBٍbc9 Ƙgݝsb{?ZP%"!sOQ"YsBOVpyylǪ"rd+yyyycf8DRT5z=j4{{{7/+9g1]]]q_mh<===}:?55^E9SşV8p{߯#t]ve{j5Z{vxxv頪cҿ0t :I +%tEXtdate:create2012-10-25T12:48:11+02:00D2%tEXtdate:modify2012-10-25T12:48:11+02:00ptEXtSoftwarewww.inkscape.org<IENDB` \ No newline at end of file diff --git a/core/modules/ckeditor/images/buttons/textcolor.png b/core/modules/ckeditor/images/buttons/textcolor.png new file mode 100644 index 0000000..1dcc051 --- /dev/null +++ b/core/modules/ckeditor/images/buttons/textcolor.png @@ -0,0 +1,3 @@ +PNG + + IHDRabKGD pHYs B(xaIDAT8˕OOQu:CئFB҄ư*_6BDY2#tq'  JBu6:3湀6mw-;{l6`mS(s|'cúbJ!YD"EcP ϣ8Řnhmm:;;kzI ]\n}733CTջS0OfwJ&IRj Ɍs0RdAEVHqLDDRd2l~BD~j(~e7\nB^ޭ(hZ+0,,,q @Dn&//svvvf+~| x6HRضs]yܜ...˲NNN8==%csssT*]i_t:6ﳺu]],5pjnhhH\>,K(}z<6M|7oXE:X,V"pyIT*假N<!F:fggg0 I `a%F$}8{a$IFu-Dٜ[f%tEXtdate:create2012-10-25T12:48:11+02:00D2%tEXtdate:modify2012-10-25T12:48:11+02:00ptEXtSoftwarewww.inkscape.org<IENDB` \ No newline at end of file diff --git a/core/modules/ckeditor/images/buttons/textfield-rtl.png b/core/modules/ckeditor/images/buttons/textfield-rtl.png new file mode 100644 index 0000000..642a64f --- /dev/null +++ b/core/modules/ckeditor/images/buttons/textfield-rtl.png @@ -0,0 +1,3 @@ +PNG + + IHDRabKGD pHYs B(xIDAT8˝OA:3"~=nN9C)œeAPA(A+%Kw{EV+D)UFQDEcn&RUBxY1M{=u pވPEMU[0;s~QUE嫪&^9nKYZN&ElH!c^w>"@UU9w6CXkZQQUkDc eYs䚷?KD!1k-vk-qc}f3k-Nc qc!I4BJ)24%I$!MS+B{i~U5P5h4˅"eًvy?ops珻5z?ou~^#t|^6 -_Eh&n%tEXtdate:create2012-10-25T12:48:11+02:00D2%tEXtdate:modify2012-10-25T12:48:11+02:00ptEXtSoftwarewww.inkscape.org<IENDB` \ No newline at end of file diff --git a/core/modules/ckeditor/images/buttons/textfield.png b/core/modules/ckeditor/images/buttons/textfield.png new file mode 100644 index 0000000..642a64f --- /dev/null +++ b/core/modules/ckeditor/images/buttons/textfield.png @@ -0,0 +1,3 @@ +PNG + + IHDRabKGD pHYs B(xIDAT8˝OA:3"~=nN9C)œeAPA(A+%Kw{EV+D)UFQDEcn&RUBxY1M{=u pވPEMU[0;s~QUE嫪&^9nKYZN&ElH!c^w>"@UU9w6CXkZQQUkDc eYs䚷?KD!1k-vk-qc}f3k-Nc qc!I4BJ)24%I$!MS+B{i~U5P5h4˅"eًvy?ops珻5z?ou~^#t|^6 -_Eh&n%tEXtdate:create2012-10-25T12:48:11+02:00D2%tEXtdate:modify2012-10-25T12:48:11+02:00ptEXtSoftwarewww.inkscape.org<IENDB` \ No newline at end of file diff --git a/core/modules/ckeditor/images/buttons/underline.png b/core/modules/ckeditor/images/buttons/underline.png new file mode 100644 index 0000000..8872788 --- /dev/null +++ b/core/modules/ckeditor/images/buttons/underline.png @@ -0,0 +1,7 @@ +PNG + + IHDRabKGD pHYs B(xIDAT8ˍj@Eϼ2E-B0, ^!!?E~7. BMv #,B@Y,͌-01Zk 롔ZKEDQR +i9Z<Zkz"SI( VEQ`EXCDPJ,s64@]rtt֚888(_dYX,Ȳ,(A1,1<-9cƘ{]6Yȃ  !V˳✳O ++c [[[MJ)*ݭR5ŏ<{* + a0\EL`%2FѷtZat~Mx<>==f͚e="EQ0?f_0+_Ǫ*cDvx gޮV+,c\BL&488'I0LFySu7Ks +<%tEXtdate:create2012-10-25T12:48:11+02:00D2%tEXtdate:modify2012-10-25T12:48:11+02:00ptEXtSoftwarewww.inkscape.org<IENDB` \ No newline at end of file diff --git a/core/modules/ckeditor/images/buttons/undo-rtl.png b/core/modules/ckeditor/images/buttons/undo-rtl.png new file mode 100644 index 0000000..5e51f2b --- /dev/null +++ b/core/modules/ckeditor/images/buttons/undo-rtl.png @@ -0,0 +1,6 @@ +PNG + + IHDRabKGD pHYs B(xcIDAT8˥=OYs}b PC!? ]D6EI4dtTInlt@h@ffN +2)osuϹ{niu CT 2#N8/."w'SSS?Ay1qvlll| l|otty|'MS< AU9==%MSj ( h4CR9t]4Mz7@2jpppP___ץNfff$I>&Mӷ~nβ2"211xggyWle||l~,Evj*"u^~׽ qA%tEXtdate:create2012-10-25T12:48:11+02:00D2%tEXtdate:modify2012-10-25T12:48:11+02:00ptEXtSoftwarewww.inkscape.org<IENDB` \ No newline at end of file diff --git a/core/modules/ckeditor/images/buttons/undo.png b/core/modules/ckeditor/images/buttons/undo.png new file mode 100644 index 0000000..7b26736 --- /dev/null +++ b/core/modules/ckeditor/images/buttons/undo.png @@ -0,0 +1,4 @@ +PNG + + IHDRabKGD pHYs B(xlIDAT8˥=hiF+*3?REMv_wטRtHRtqԗ@)F \y5l +m~;)ŠIW(1xsA9q3 p}s)e:Z cLZZDAZRV $ =\.yι'Yk-Z xh4x~O'MST~|]DۭVkT "Oީczi CUi9 I(~W՗gggq8>>,zcT)1XkY\\lmooT,ː#fff~6fggA`,:'''׀&''' $IRՐ(UWխf3kۺNUwTtkkj)XUa0 EUTާJORQnUWU{sc0 S4;R!Isa8ץRƽӻq#:,Fqc sssr:|aEl^?:9ËY%tEXtdate:create2012-10-25T12:48:11+02:00D2%tEXtdate:modify2012-10-25T12:48:11+02:00ptEXtSoftwarewww.inkscape.org<IENDB` \ No newline at end of file diff --git a/core/modules/ckeditor/images/buttons/unlink.png b/core/modules/ckeditor/images/buttons/unlink.png new file mode 100644 index 0000000..ad29aff --- /dev/null +++ b/core/modules/ckeditor/images/buttons/unlink.png @@ -0,0 +1,3 @@ +PNG + + IHDRabKGD pHYs B(xIDAT8˥KSq?uw8A !eؓ>CÞ{$ aƄ6 _ " m{=XEp8~cJ=O qM"(Ð^rEC1`` ðB</HڗTo5Y%Im\XnwcvV[rtP;]mT՝Rl|n t)6;t16cvvv ,i+VϿ6%mu*f2677\'5p t/n.%]zYpxxzbI1I%}$WQMNN~^ҵcLX$"1HbllBX*J=Ln:JR3\./z}LTBRa" uI&]6z|:11}ww^Gb%.pzzE\.w I"؜l4FFF.O.X>88X }u%tEXtdate:create2012-10-25T12:48:11+02:00D2%tEXtdate:modify2012-10-25T12:48:11+02:00ptEXtSoftwarewww.inkscape.org<IENDB` \ No newline at end of file diff --git a/core/modules/ckeditor/images/group-separator.png b/core/modules/ckeditor/images/group-separator.png new file mode 100644 index 0000000..38a3ed8 --- /dev/null +++ b/core/modules/ckeditor/images/group-separator.png @@ -0,0 +1,4 @@ +PNG + + IHDR q=tEXtSoftwareAdobe ImageReadyqe<IDATx씿j@g4D,,նIchB<nvyqG| ~?Wg$I8pItMHkOض-˲ zW󾅂 x6 #mUU,u= )<ԀGyc- /H>>Q>C:]$Jٓ?^Eхq]=_N +p-X8i& 2&BuP4M߂ayG>S@i֠,w4ޡܨ7myIENDB` \ No newline at end of file diff --git a/core/modules/ckeditor/js/ckeditor.admin.js b/core/modules/ckeditor/js/ckeditor.admin.js new file mode 100644 index 0000000..430cec7 --- /dev/null +++ b/core/modules/ckeditor/js/ckeditor.admin.js @@ -0,0 +1,111 @@ +(function ($, Drupal) { + +"use strict"; + +Drupal.ckeditor = Drupal.ckeditor || {}; + +Drupal.behaviors.ckeditorAdmin = { + attach: function (context, settings) { + var $context = $(context); + $(context).find('.ckeditor-toolbar-configuration').once('ckeditor-toolbar', function() { + var $wrapper = $(this); + var $textareaWrapper = $(this).find('.form-item-editor-settings-toolbar-buttons').hide(); + var $textarea = $textareaWrapper.find('textarea'); + var $toolbarAdmin = $(settings.ckeditor.toolbarAdmin); + var sortableSettings = { + connectWith: '.ckeditor-buttons', + placeholder: 'ckeditor-button-placeholder', + forcePlaceholderSize: true, + tolerance: 'pointer', + cursor: 'move', + stop: adminToolbarValue + }; + $toolbarAdmin.insertAfter($textareaWrapper).find('.ckeditor-buttons').sortable(sortableSettings); + $toolbarAdmin.find('.ckeditor-multiple-buttons li').draggable({ + connectToSortable: '.ckeditor-toolbar-active .ckeditor-buttons', + helper: 'clone' + }); + $toolbarAdmin.on('click.ckeditorAddRow', 'a.ckeditor-row-add', adminToolbarAddRow); + $toolbarAdmin.on('click.ckeditorAddRow', 'a.ckeditor-row-remove', adminToolbarRemoveRow); + if ($toolbarAdmin.find('.ckeditor-toolbar-active ul').length > 1) { + $toolbarAdmin.find('a.ckeditor-row-remove').hide(); + } + + /** + * Add a new row of buttons. + */ + function adminToolbarAddRow(event) { + var $this = $(this); + var $rows = $this.closest('.ckeditor-toolbar-active').find('.ckeditor-buttons'); + $rows.last().clone().empty().insertAfter($rows.last()).sortable(sortableSettings); + $this.siblings('a').show(); + redrawToolbarGradient(); + event.preventDefault(); + } + + /** + * Remove a row of buttons. + */ + function adminToolbarRemoveRow(event) { + var $this = $(this); + var $rows = $this.closest('.ckeditor-toolbar-active').find('.ckeditor-buttons'); + if ($rows.length === 2) { + $this.hide(); + } + if ($rows.length > 1) { + var $lastRow = $rows.last(); + var $disabledButtons = $wrapper.find('.ckeditor-toolbar-disabled .ckeditor-buttons'); + $lastRow.children(':not(.ckeditor-multiple-button)').prependTo($disabledButtons); + $lastRow.sortable('destroy').remove(); + redrawToolbarGradient(); + } + event.preventDefault(); + } + + /** + * Browser quirk work-around to redraw CSS3 gradients. + */ + function redrawToolbarGradient() { + $wrapper.find('.ckeditor-toolbar-active').css('position', 'relative'); + window.setTimeout(function() { + $wrapper.find('.ckeditor-toolbar-active').css('position', ''); + }, 10); + } + + /** + * jQuery Sortable stop event. Save updated toolbar positions to the textarea. + */ + function adminToolbarValue(event, ui) { + // Update the toolbar config after updating a sortable. + var toolbarConfig = []; + $wrapper.find('.ckeditor-toolbar-active ul').each(function() { + var $rowButtons = $(this).find('li'); + var rowConfig = []; + if ($rowButtons.length) { + $rowButtons.each(function() { + rowConfig.push(this.getAttribute('data-button-name')); + }); + toolbarConfig.push(rowConfig); + } + }); + $textarea.val(JSON.stringify(toolbarConfig, null, ' ')); + + // Determine whether we should trigger an event. + var from = $(event.target).parents('div[data-toolbar]').attr('data-toolbar'); + var to = $(event.toElement).parents('div[data-toolbar]').attr('data-toolbar'); + var buttonName = $(ui.item).get(0).getAttribute('data-button-name'); + if (from !== to) { + if (to === 'active') { + Drupal.editorConfiguration.addRequiredTag(buttonName); + } + } + } + + }); + }, + detach: function (context, settings) { + // @todo + } +}; + +})(jQuery, Drupal); diff --git a/core/modules/ckeditor/js/ckeditor.js b/core/modules/ckeditor/js/ckeditor.js new file mode 100644 index 0000000..d72cc04 --- /dev/null +++ b/core/modules/ckeditor/js/ckeditor.js @@ -0,0 +1,32 @@ +(function ($, Drupal, drupalSettings, CKEDITOR) { + +"use strict"; + +Drupal.editors.ckeditor = { + attach: function (element, format) { + // Register additional Drupal plugins as necessary. + if (format.editorSettings.externalPlugins) { + for (var pluginName in format.editorSettings.externalPlugins) { + if (format.editorSettings.externalPlugins.hasOwnProperty(pluginName)) { + CKEDITOR.plugins.addExternal(pluginName, drupalSettings.basePath + format.editorSettings.externalPlugins[pluginName]['path'] + '/', format.editorSettings.externalPlugins[pluginName]['file']); + } + } + delete format.editorSettings.externalPlugins; + } + return !!CKEDITOR.replace(element, format.editorSettings); + }, + detach: function (element, format, trigger) { + var editor = CKEDITOR.dom.element.get(element).getEditor(); + if (editor) { + if (trigger === 'serialize') { + editor.updateElement(); + } + else { + editor.destroy(); + } + } + return !!editor; + } +}; + +})(jQuery, Drupal, drupalSettings, CKEDITOR); diff --git a/core/modules/ckeditor/lib/Drupal/ckeditor/Plugin/editor/editor/CKEditor.php b/core/modules/ckeditor/lib/Drupal/ckeditor/Plugin/editor/editor/CKEditor.php new file mode 100644 index 0000000..22a296f --- /dev/null +++ b/core/modules/ckeditor/lib/Drupal/ckeditor/Plugin/editor/editor/CKEditor.php @@ -0,0 +1,251 @@ + array( + 'buttons' => array( + array( + 'Source', '|', 'Bold', 'Italic', '|', + 'NumberedList', 'BulletedList', 'Blockquote', '|', + 'JustifyLeft', 'JustifyCenter', 'JustifyRight', '|', + 'Link', 'Unlink', '|', 'Image', 'Maximize', + ), + ), + 'format_list' => array('p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'), + 'style_list' => array(), + ), + ); + } + + /** + * Implements \Drupal\editor\Plugin\EditorInterface::settingsForm(). + */ + function settingsForm(array $form, array &$form_state, Editor $editor) { + $module_path = drupal_get_path('module', 'ckeditor'); + $plugins = ckeditor_plugins(); + + // Update $editor->settings when the form is being rebuilt. + if (isset($form_state['input']['editor_settings'])) { + $editor->settings['toolbar']['buttons'] = json_decode($form_state['input']['editor_settings']['toolbar']['buttons'], FALSE); + } + + $form['toolbar'] = array( + '#type' => 'fieldset', + '#title' => t('Toolbar'), + '#attached' => array( + 'library' => array(array('ckeditor', 'drupal.ckeditor.admin')), + 'js' => array( + array('data' => array('ckeditor' => array('toolbarAdmin' => theme('ckeditor_settings_toolbar', array('editor' => $editor, 'plugins' => $plugins)))), 'type' => 'setting') + ), + ), + '#attributes' => array('class' => array('ckeditor-toolbar-configuration')), + ); + $form['toolbar']['buttons'] = array( + '#type' => 'textarea', + '#title' => t('Toolbar buttons'), + '#default_value' => json_encode($editor->settings['toolbar']['buttons']), + '#attributes' => array('class' => array('ckeditor-toolbar-textarea')), + ); + $form['toolbar']['format_list'] = array( + '#type' => 'textfield', + '#title' => t('Format list'), + '#default_value' => implode(', ', $editor->settings['toolbar']['format_list']), + '#description' => t('A list of tags that will be provided in the "Format" dropdown, separated by commas.') + ); + $form['toolbar']['style_list'] = array( + '#type' => 'textarea', + '#title' => t('Style list'), + '#rows' => 4, + '#default_value' => implode("\n", $editor->settings['toolbar']['style_list']), + '#description' => t('A list of classes that will be provided in the "Styles" dropdown, each on a separate line. These styles should be available in your theme\'s editor.css as well as in your theme\'s main CSS file.') + ); + + return $form; + } + + /** + * Implements \Drupal\editor\Plugin\EditorInterface::settingsFormSubmit(). + */ + function settingsFormSubmit(array $form, array &$form_state) { + // Modify the toolbar settings by reference. The values in + // $form_state['values']['editor_settings'] will be saved directly by + // editor_form_filter_admin_format_submit(). + $toolbar_settings = &$form_state['values']['editor_settings']['toolbar']; + + $toolbar_settings['buttons'] = json_decode($toolbar_settings['buttons'], FALSE); + + $format_list = array(); + foreach (explode(',', $toolbar_settings['format_list']) as $format) { + $format_list[] = trim($format); + } + $toolbar_settings['format_list'] = $format_list; + + $style_list = array(); + foreach (explode(',', $toolbar_settings['style_list']) as $style) { + $style_list[] = trim($style); + } + $toolbar_settings['style_list'] = $style_list; + } + + /** + * Implements \Drupal\editor\Plugin\EditorInterface::mapSettingsFormStateToRequiredHTMLTags(). + */ + function mapSettingsFormStateToRequiredHTMLTags(array $form_state) { + $required_tags = array(); + + $active_buttons_by_row = json_decode($form_state['values']['editor_settings']['toolbar']['buttons'], FALSE); + $active_buttons = NestedArray::mergeDeepArray($active_buttons_by_row); + $plugins = ckeditor_plugins(); + foreach ($plugins as $plugin) { + if (isset($plugin['buttons'])) { + foreach ($plugin['buttons'] as $button_name => $button) { + if (isset($button['required_tags']) && in_array($button_name, $active_buttons)) { + $required_tags = array_merge($required_tags, $button['required_tags']); + } + } + } + } + + return array_unique($required_tags); + } + + /** + * Implements \Drupal\editor\Plugin\EditorInterface::getJSSettings(). + */ + function getJSSettings(Editor $editor) { + global $language; + + // Loop through all available plugins and check to see if it has been + // explicitly enabled. At the same time, associate each plugin with its + // buttons (if any) so we can check if the plugin should be enabled implicitly + // based on the toolbar. + $plugin_info = ckeditor_plugins(); + $external_plugins = array(); + $external_css = array(); + $all_buttons = array(); + foreach ($plugin_info as $plugin_name => $plugin) { + // Check if this plugin should be enabled. + if (isset($plugin['enabled callback'])) { + if ($plugin['enabled callback'] === TRUE || $plugin['enabled callback']($editor) && !empty($plugin['path'])) { + $external_plugins[$plugin_name]['file'] = $plugin['file']; + $external_plugins[$plugin_name]['path'] = $plugin['path']; + if (isset($plugin['css'])) { + $external_css = array_merge($external_css, $plugin['css']); + } + } + } + // Associate each plugin with its button. + if (isset($plugin['buttons'])) { + if (empty($plugin['internal'])) { + foreach ($plugin['buttons'] as $button_name => &$button) { + $button['plugin'] = $plugin; + $button['plugin']['name'] = $plugin_name; + unset($button['plugin']['buttons']); + } + } + $all_buttons = array_merge($all_buttons, $plugin['buttons']); + } + } + + // Change the toolbar separators into groups and record needed plugins based + // on use in the toolbar. + $toolbar = array(); + foreach ($editor->settings['toolbar']['buttons'] as $row_number => $row) { + $button_group = array(); + foreach ($row as $button_name) { + if ($button_name === '|') { + $toolbar[] = $button_group; + $button_group = array(); + } + else { + // Sanity check that the button exists in our installation. + if (isset($all_buttons[$button_name])) { + $button_group['items'][] = $button_name; + + // Keep track of the needed plugin for this button, if any. + if (isset($all_buttons[$button_name]['plugin']['path'])) { + $plugin_name = $all_buttons[$button_name]['plugin']['name']; + $external_plugin = $all_buttons[$button_name]['plugin']; + $external_plugins[$plugin_name]['file'] = $external_plugin['file']; + $external_plugins[$plugin_name]['path'] = $external_plugin['path']; + if (isset($external_plugin['css'])) { + $external_css = array_merge($external_css, $external_plugin['css']); + } + } + } + } + } + $toolbar[] = $button_group; + $toolbar[] = '/'; + } + + // Collect a list of CSS files to be added to the editor instance. + $css = array( + drupal_get_path('module', 'ckeditor') . '/css/ckeditor.css', + drupal_get_path('module', 'ckeditor') . '/css/ckeditor-iframe.css', + ); + $css = array_merge($css, $external_css, _ckeditor_theme_css()); + drupal_alter('ckeditor_css', $css, $editor, $format); + + // Convert all paths to be relative to root. + foreach ($css as $key => $css_path) { + $css[$key] = base_path() . $css_path; + } + + // Initialize reasonable defaults that provide expected basic behavior. + $settings = array( + 'toolbar' => $toolbar, + 'extraPlugins' => implode(',', array_keys($external_plugins)), + 'contentsCss' => array_values($css), + 'pasteFromWordPromptCleanup' => TRUE, + 'indentClasses' => array('indent1', 'indent2', 'indent3'), + 'justifyClasses' => array('align-left', 'align-center', 'align-right', 'align-justify'), + 'coreStyles_underline' => array('element' => 'span', 'attributes' => array('class' => 'underline')), + 'format_tags' => implode(';', $editor->settings['toolbar']['format_list']), + 'removeDialogTabs' => 'image:Link;image:advanced;link:advanced', + 'language' => isset($language->language) ? $language->language : '', + 'resize_dir' => 'vertical', + ); + + // These settings are used specifically by Drupal. + $settings['externalPlugins'] = $external_plugins; + + return $settings; + } + + /** + * Implements \Drupal\editor\Plugin\EditorInterface::getLibraries(). + */ + function getLibraries(Editor $editor) { + return array( + array('ckeditor', 'drupal.ckeditor'), + ); + } +} diff --git a/core/modules/editor/editor.module b/core/modules/editor/editor.module index a40c249..d23295a 100644 --- a/core/modules/editor/editor.module +++ b/core/modules/editor/editor.module @@ -45,6 +45,31 @@ function editor_menu_alter(&$items) { } /** + * Implements hook_filter_info_alter(). + */ +function editor_filter_info_alter(&$info) { + $info['filter_html']['get allowed tags callback'] = '_filter_html_get_allowed_tags'; + $info['filter_html']['set allowed tags callback'] = '_filter_html_set_allowed_tags'; +} + +/** + * Get allowed tags callback. + */ +function _filter_html_get_allowed_tags($settings) { + return preg_split('/\s+|<|>/', $settings['allowed_html'], -1, PREG_SPLIT_NO_EMPTY); +} + +/** + * Set allowed tags callback. + */ +function _filter_html_set_allowed_tags(&$settings, $tags) { + if (empty($tags)) { + return; + } + $settings['allowed_html'] = '<' . implode('> <', $tags) . '>'; +} + +/** * Implements hook_element_info(). * * Extends the functionality of text_format elements (provided by Filter @@ -78,6 +103,17 @@ function editor_library_info() { array('system', 'jquery.once'), ), ); + $libraries['drupal.editor.admin'] = array( + 'title' => 'Text Editor configuration', + 'version' => VERSION, + 'js' => array( + $path . '/js/editor.admin.js' => array(), + ), + 'dependencies' => array( + array('system', 'jquery'), + array('system', 'drupal'), + ), + ); return $libraries; } @@ -171,6 +207,12 @@ function editor_form_filter_admin_format_form_alter(&$form, &$form_state) { } $form['#submit'][] = 'editor_form_filter_admin_format_submit'; + + // Attach the JavaScript, #validate and #submit callbacks that are needed to + // sync the text editor's configuration to the filter settings. + $form['#attached']['library'][] = array('editor', 'drupal.editor.admin'); + $form['#validate'][] = 'editor_form_filter_admin_format_required_tags_validate'; + array_unshift($form['#submit'], 'editor_form_filter_admin_format_required_tags_submit'); } /** @@ -201,6 +243,70 @@ function editor_form_filter_admin_form_ajax($form, &$form_state) { } /** + * Additional validate handler to check for tags required by the text editor. + */ +function editor_form_filter_admin_format_required_tags_validate($form, &$form_state) { + // Early-return if no editor is set. + if (!$form_state['editor']) { + return; + } + + $plugin = $form_state['editor_manager']->createInstance($form_state['editor']->editor); + $editor_required_tags = $plugin->mapSettingsFormStateToRequiredHTMLTags($form_state); + + // Figure out the tags required for the current text editor configuration that + // are prohibited by the current filter settings. + $prohibited_required_tags = array(); + $filters = filter_get_filters(); + foreach ($form_state['values']['filters'] as $filter_id => $filter_settings) { + // This check is necessary because there's a weird value in the way: + // $form_state['values']['filter']['status'] == '' + if (!is_array($filter_settings)) { + continue; + } + if ($filter_settings['status'] === 1 && isset($filters[$filter_id]['get allowed tags callback'])) { + $allowed_tags = $filters[$filter_id]['get allowed tags callback']($filter_settings['settings']); + $missing_tags = array_diff($editor_required_tags, $allowed_tags); + $prohibited_required_tags = array_merge($prohibited_required_tags, $missing_tags); + } + } + $prohibited_required_tags = array_unique($prohibited_required_tags); + + // If the user hasn't been warned yet about this specific list of tags to be + // allowed, then do so, before allowing this form to be saved. + if (!empty($prohibited_required_tags) && (!isset($form_state['prohibited_required_tags']) || $form_state['prohibited_required_tags'] != $prohibited_required_tags )) { + drupal_set_message(t('Your text editor configuration will cause the following HTML tags to be allowed: @tag-list.', array('@tag-list' => '<' . implode('>, <', $prohibited_required_tags) . '>')), 'warning'); + $form_state['prohibited_required_tags'] = $prohibited_required_tags; + $form_state['rebuild'] = TRUE; + } +} + +/** + * Additional submit handler to set tags required by the text editor. + */ +function editor_form_filter_admin_format_required_tags_submit($form, &$form_state) { + // Early-return if there are no prohibited required tags. + if (!isset($form_state['prohibited_required_tags']) || count($form_state['prohibited_required_tags']) === 0) { + return; + } + + $filters = filter_get_filters(); + foreach ($form_state['values']['filters'] as $filter_id => $filter_settings) { + // This check is necessary because there's a weird value in the way: + // $form_state['values']['filter']['status'] == '' + if (!is_array($filter_settings)) { + continue; + } + if ($filter_settings['status'] === 1 && isset($filters[$filter_id]['set allowed tags callback'])) { + $allowed_tags = $filters[$filter_id]['get allowed tags callback']($filter_settings['settings']); + $missing_tags = array_diff($form_state['prohibited_required_tags'], $allowed_tags); + $allowed_tags = array_merge($allowed_tags, $missing_tags); + $filters[$filter_id]['set allowed tags callback']($form_state['values']['filters'][$filter_id]['settings'], $allowed_tags); + } + } +} + +/** * Additional submit handler for filter_admin_format_form(). */ function editor_form_filter_admin_format_submit($form, &$form_state) { diff --git a/core/modules/editor/js/editor.admin.js b/core/modules/editor/js/editor.admin.js new file mode 100644 index 0000000..100f695 --- /dev/null +++ b/core/modules/editor/js/editor.admin.js @@ -0,0 +1,16 @@ +/** + * @file + * Provides an API to sync text editor configuration to filter settings. + */ + +(function ($, Drupal, document) { + +"use strict"; + +Drupal.editorConfiguration = { + addRequiredTag: function(tagName) { + $('#edit-editor').trigger('change'); + } +}; + +})(jQuery, Drupal, document); diff --git a/core/modules/editor/lib/Drupal/editor/Plugin/EditorBase.php b/core/modules/editor/lib/Drupal/editor/Plugin/EditorBase.php index 00f5e78..3a8ffb6 100644 --- a/core/modules/editor/lib/Drupal/editor/Plugin/EditorBase.php +++ b/core/modules/editor/lib/Drupal/editor/Plugin/EditorBase.php @@ -64,4 +64,10 @@ public function settingsFormValidate(array $form, array &$form_state) { public function settingsFormSubmit(array $form, array &$form_state) { } + /** + * Implements \Drupal\editor\Plugin\EditorInterface::mapSettingsFormStateToRequiredHTMLTags(). + */ + public function mapSettingsFormStateToRequiredHTMLTags(array $form_state) { + return array(); + } } diff --git a/core/modules/editor/lib/Drupal/editor/Plugin/EditorInterface.php b/core/modules/editor/lib/Drupal/editor/Plugin/EditorInterface.php index 1fcbec3..0e7f13a 100644 --- a/core/modules/editor/lib/Drupal/editor/Plugin/EditorInterface.php +++ b/core/modules/editor/lib/Drupal/editor/Plugin/EditorInterface.php @@ -76,6 +76,23 @@ function settingsFormValidate(array $form, array &$form_state); function settingsFormSubmit(array $form, array &$form_state); /** + * Determines which HTML tags are required for the text editor. + * + * Given the state of the form defined in EditorInterface::settingsForm(), + * determines which HTML tags are required for the current configuration of + * the text editor. + * + * @param array $form_state + * A keyed array containing the current state of the form. + * @return array + * A list of HTML tags. E.g.: + * @code + * array('a', 'p', 'br') + * @endcode + */ + function mapSettingsFormStateToRequiredHTMLTags(array $form_state); + + /** * Returns JavaScript settings to be attached. * * Most text editors use JavaScript to provide a WYSIWYG or toolbar on the