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