annotate core/modules/ckeditor/ckeditor.admin.inc @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents 4c8ae668cc8c
children
rev   line source
Chris@0 1 <?php
Chris@0 2
Chris@0 3 /**
Chris@0 4 * @file
Chris@0 5 * Callbacks and theming for the CKEditor toolbar configuration UI.
Chris@0 6 */
Chris@0 7
Chris@0 8 use Drupal\Component\Utility\Html;
Chris@0 9 use Drupal\Core\Template\Attribute;
Chris@0 10 use Drupal\Core\Language\LanguageInterface;
Chris@0 11
Chris@0 12 /**
Chris@0 13 * Prepares variables for CKEditor settings toolbar templates.
Chris@0 14 *
Chris@0 15 * Default template: ckeditor-settings-toolbar.html.twig.
Chris@0 16 *
Chris@0 17 * @param array $variables
Chris@0 18 * An associative array containing:
Chris@0 19 * - editor: An editor object.
Chris@0 20 * - plugins: A list of plugins.
Chris@0 21 * - active_buttons: A list of disabled buttons.
Chris@0 22 * - disabled_buttons: A list of disabled buttons.
Chris@0 23 * - multiple_buttons: A list of multiple buttons that may be added multiple
Chris@0 24 * times.
Chris@0 25 */
Chris@0 26 function template_preprocess_ckeditor_settings_toolbar(&$variables) {
Chris@0 27 $language_interface = \Drupal::languageManager()->getCurrentLanguage();
Chris@0 28
Chris@0 29 // Create lists of active and disabled buttons.
Chris@0 30 $editor = $variables['editor'];
Chris@0 31 $plugins = $variables['plugins'];
Chris@0 32 $buttons = [];
Chris@0 33 $multiple_buttons = [];
Chris@0 34 foreach ($plugins as $plugin_buttons) {
Chris@0 35 foreach ($plugin_buttons as $button_name => $button) {
Chris@0 36 $button['name'] = $button_name;
Chris@0 37 if (!empty($button['multiple'])) {
Chris@0 38 $multiple_buttons[$button_name] = $button;
Chris@0 39 }
Chris@0 40 $buttons[$button_name] = $button;
Chris@0 41 }
Chris@0 42 }
Chris@0 43 $button_groups = [];
Chris@0 44 $active_buttons = [];
Chris@0 45 $settings = $editor->getSettings();
Chris@0 46 foreach ($settings['toolbar']['rows'] as $row_number => $row) {
Chris@0 47 $button_groups[$row_number] = [];
Chris@0 48 foreach ($row as $group) {
Chris@0 49 foreach ($group['items'] as $button_name) {
Chris@0 50 if (isset($buttons[$button_name])) {
Chris@0 51 // Save a reference to the button's configured toolbar group.
Chris@0 52 $buttons[$button_name]['group'] = $group['name'];
Chris@0 53 $active_buttons[$row_number][] = $buttons[$button_name];
Chris@0 54 if (empty($buttons[$button_name]['multiple'])) {
Chris@0 55 unset($buttons[$button_name]);
Chris@0 56 }
Chris@0 57 // Create a list of all the toolbar button groups.
Chris@0 58 if (!in_array($group['name'], $button_groups[$row_number])) {
Chris@0 59 array_push($button_groups[$row_number], $group['name']);
Chris@0 60 }
Chris@0 61 }
Chris@0 62 }
Chris@0 63 }
Chris@0 64 }
Chris@0 65 $disabled_buttons = array_diff_key($buttons, $multiple_buttons);
Chris@0 66
Chris@0 67 $rtl = $language_interface->getDirection() === LanguageInterface::DIRECTION_RTL ? '_rtl' : '';
Chris@0 68
Chris@0 69 $build_button_item = function ($button, $rtl) {
Chris@0 70 // Value of the button item.
Chris@0 71 if (isset($button['image_alternative' . $rtl])) {
Chris@0 72 $value = $button['image_alternative' . $rtl];
Chris@0 73 }
Chris@0 74 elseif (isset($button['image_alternative'])) {
Chris@0 75 $value = $button['image_alternative'];
Chris@0 76 }
Chris@0 77 elseif (isset($button['image']) || isset($button['image' . $rtl])) {
Chris@0 78 $value = [
Chris@0 79 '#theme' => 'image',
Chris@0 80 '#uri' => isset($button['image' . $rtl]) ? $button['image' . $rtl] : $button['image'],
Chris@0 81 '#title' => $button['label'],
Chris@0 82 '#prefix' => '<a href="#" role="button" title="' . $button['label'] . '" aria-label="' . $button['label'] . '"><span class="cke_button_icon">',
Chris@0 83 '#suffix' => '</span></a>',
Chris@0 84 ];
Chris@0 85 }
Chris@0 86 else {
Chris@0 87 $value = '?';
Chris@0 88 }
Chris@0 89
Chris@0 90 // Build the button attributes.
Chris@0 91 $attributes = [
Chris@0 92 'data-drupal-ckeditor-button-name' => $button['name'],
Chris@0 93 ];
Chris@0 94 if (!empty($button['attributes'])) {
Chris@0 95 $attributes = array_merge($attributes, $button['attributes']);
Chris@0 96 }
Chris@0 97
Chris@0 98 // Build the button item.
Chris@0 99 $button_item = [
Chris@0 100 'value' => $value,
Chris@0 101 'attributes' => new Attribute($attributes),
Chris@0 102 ];
Chris@0 103 // If this button has group information, add it to the attributes.
Chris@0 104 if (!empty($button['group'])) {
Chris@0 105 $button_item['group'] = $button['group'];
Chris@0 106 }
Chris@0 107
Chris@0 108 // Set additional flag on the button if it can occur multiple times.
Chris@0 109 if (!empty($button['multiple'])) {
Chris@0 110 $button_item['multiple'] = TRUE;
Chris@0 111 }
Chris@0 112
Chris@0 113 return $button_item;
Chris@0 114 };
Chris@0 115
Chris@0 116 // Assemble list of disabled buttons (which are always a single row).
Chris@0 117 $variables['active_buttons'] = [];
Chris@0 118 foreach ($active_buttons as $row_number => $button_row) {
Chris@0 119 foreach ($button_groups[$row_number] as $group_name) {
Chris@0 120 $group_name = (string) $group_name;
Chris@0 121 $variables['active_buttons'][$row_number][$group_name] = [
Chris@0 122 'group_name_class' => Html::getClass($group_name),
Chris@0 123 'buttons' => [],
Chris@0 124 ];
Chris@0 125 $buttons = array_filter($button_row, function ($button) use ($group_name) {
Chris@0 126 return (string) $button['group'] === $group_name;
Chris@0 127 });
Chris@0 128 foreach ($buttons as $button) {
Chris@0 129 $variables['active_buttons'][$row_number][$group_name]['buttons'][] = $build_button_item($button, $rtl);
Chris@0 130 }
Chris@0 131 }
Chris@0 132 }
Chris@0 133 // Assemble list of disabled buttons (which are always a single row).
Chris@0 134 $variables['disabled_buttons'] = [];
Chris@0 135 foreach ($disabled_buttons as $button) {
Chris@0 136 $variables['disabled_buttons'][] = $build_button_item($button, $rtl);
Chris@0 137 }
Chris@0 138 // Assemble list of multiple buttons that may be added multiple times.
Chris@0 139 $variables['multiple_buttons'] = [];
Chris@0 140 foreach ($multiple_buttons as $button) {
Chris@0 141 $variables['multiple_buttons'][] = $build_button_item($button, $rtl);
Chris@0 142 }
Chris@0 143 }