Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 5 |
CRAP | |
0.00% |
0 / 70 |
CKEditorPluginManager | |
0.00% |
0 / 1 |
|
0.00% |
0 / 5 |
506 | |
0.00% |
0 / 70 |
__construct | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 4 |
|||
getEnabledPluginFiles | |
0.00% |
0 / 1 |
156 | |
0.00% |
0 / 4 |
|||
anonymous function | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
getButtons | |
0.00% |
0 / 1 |
12 | |
0.00% |
0 / 10 |
|||
injectPluginSettingsForm | |
0.00% |
0 / 1 |
30 | |
0.00% |
0 / 21 |
<?php | |
/** | |
* @file | |
* Contains \Drupal\ckeditor\CKEditorPluginManager. | |
*/ | |
namespace Drupal\ckeditor; | |
use Drupal\Component\Utility\NestedArray; | |
use Drupal\Core\Form\FormStateInterface; | |
use Drupal\Core\Plugin\DefaultPluginManager; | |
use Drupal\Core\Cache\CacheBackendInterface; | |
use Drupal\Core\Extension\ModuleHandlerInterface; | |
use Drupal\editor\Entity\Editor; | |
/** | |
* Provides a CKEditor Plugin plugin manager. | |
* | |
* @see \Drupal\ckeditor\CKEditorPluginInterface | |
* @see \Drupal\ckeditor\CKEditorPluginButtonsInterface | |
* @see \Drupal\ckeditor\CKEditorPluginContextualInterface | |
* @see \Drupal\ckeditor\CKEditorPluginConfigurableInterface | |
* @see \Drupal\ckeditor\CKEditorPluginBase | |
* @see \Drupal\ckeditor\Annotation\CKEditorPlugin | |
* @see plugin_api | |
*/ | |
class CKEditorPluginManager extends DefaultPluginManager { | |
/** | |
* Constructs a CKEditorPluginManager object. | |
* | |
* @param \Traversable $namespaces | |
* An object that implements \Traversable which contains the root paths | |
* keyed by the corresponding namespace to look for plugin implementations. | |
* @param \Drupal\Core\Cache\CacheBackendInterface $cache_backend | |
* Cache backend instance to use. | |
* @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler | |
* The module handler to invoke the alter hook with. | |
*/ | |
public function __construct(\Traversable $namespaces, CacheBackendInterface $cache_backend, ModuleHandlerInterface $module_handler) { | |
parent::__construct('Plugin/CKEditorPlugin', $namespaces, $module_handler, 'Drupal\ckeditor\CKEditorPluginInterface', 'Drupal\ckeditor\Annotation\CKEditorPlugin'); | |
$this->alterInfo('ckeditor_plugin_info'); | |
$this->setCacheBackend($cache_backend, 'ckeditor_plugins'); | |
} | |
/** | |
* Retrieves enabled plugins' files, keyed by plugin ID. | |
* | |
* For CKEditor plugins that implement: | |
* - CKEditorPluginButtonsInterface, not CKEditorPluginContextualInterface, | |
* a plugin is enabled if at least one of its buttons is in the toolbar; | |
* - CKEditorPluginContextualInterface, not CKEditorPluginButtonsInterface, | |
* a plugin is enabled if its isEnabled() method returns TRUE | |
* - both of these interfaces, a plugin is enabled if either is the case. | |
* | |
* Internal plugins (those that are part of the bundled build of CKEditor) are | |
* excluded by default, since they are loaded implicitly. If you need to know | |
* even implicitly loaded (i.e. internal) plugins, then set the optional | |
* second parameter. | |
* | |
* @param \Drupal\editor\Entity\Editor $editor | |
* A configured text editor object. | |
* @param bool $include_internal_plugins | |
* Defaults to FALSE. When set to TRUE, plugins whose isInternal() method | |
* returns TRUE will also be included. | |
* @return array | |
* A list of the enabled CKEditor plugins, with the plugin IDs as keys and | |
* the Drupal root-relative plugin files as values. | |
* For internal plugins, the value is NULL. | |
*/ | |
public function getEnabledPluginFiles(Editor $editor, $include_internal_plugins = FALSE) { | |
$plugins = array_keys($this->getDefinitions()); | |
// Flatten each row. | |
$toolbar_rows = array(); | |
$settings = $editor->getSettings(); | |
foreach ($settings['toolbar']['rows'] as $row_number => $row) { | |
$toolbar_rows[] = array_reduce($settings['toolbar']['rows'][$row_number], function (&$result, $button_group) { | |
return array_merge($result, $button_group['items']); | |
}, array()); | |
} | |
$toolbar_buttons = array_unique(NestedArray::mergeDeepArray($toolbar_rows)); | |
$enabled_plugins = array(); | |
$additional_plugins = array(); | |
foreach ($plugins as $plugin_id) { | |
$plugin = $this->createInstance($plugin_id); | |
if (!$include_internal_plugins && $plugin->isInternal()) { | |
continue; | |
} | |
$enabled = FALSE; | |
// Enable this plugin if it provides a button that has been enabled. | |
if ($plugin instanceof CKEditorPluginButtonsInterface) { | |
$plugin_buttons = array_keys($plugin->getButtons()); | |
$enabled = (count(array_intersect($toolbar_buttons, $plugin_buttons)) > 0); | |
} | |
// Otherwise enable this plugin if it declares itself as enabled. | |
if (!$enabled && $plugin instanceof CKEditorPluginContextualInterface) { | |
$enabled = $plugin->isEnabled($editor); | |
} | |
if ($enabled) { | |
$enabled_plugins[$plugin_id] = ($plugin->isInternal()) ? NULL : $plugin->getFile(); | |
// Check if this plugin has dependencies that also need to be enabled. | |
$additional_plugins = array_merge($additional_plugins, array_diff($plugin->getDependencies($editor), $additional_plugins)); | |
} | |
} | |
// Add the list of dependent plugins. | |
foreach ($additional_plugins as $plugin_id) { | |
$plugin = $this->createInstance($plugin_id); | |
$enabled_plugins[$plugin_id] = ($plugin->isInternal()) ? NULL : $plugin->getFile(); | |
} | |
// Always return plugins in the same order. | |
asort($enabled_plugins); | |
return $enabled_plugins; | |
} | |
/** | |
* Retrieves all available CKEditor buttons, keyed by plugin ID. | |
* | |
* @return array | |
* All available CKEditor buttons, with plugin IDs as keys and button | |
* metadata (as implemented by getButtons()) as values. | |
* | |
* @see CKEditorPluginButtonsInterface::getButtons() | |
*/ | |
public function getButtons() { | |
$plugins = array_keys($this->getDefinitions()); | |
$buttons_plugins = array(); | |
foreach ($plugins as $plugin_id) { | |
$plugin = $this->createInstance($plugin_id); | |
if ($plugin instanceof CKEditorPluginButtonsInterface) { | |
$buttons_plugins[$plugin_id] = $plugin->getButtons(); | |
} | |
} | |
return $buttons_plugins; | |
} | |
/** | |
* Injects the CKEditor plugins settings forms as a vertical tabs subform. | |
* | |
* @param array &$form | |
* A reference to an associative array containing the structure of the form. | |
* @param \Drupal\Core\Form\FormStateInterface $form_state | |
* The current state of the form. | |
* @param \Drupal\editor\Entity\Editor $editor | |
* A configured text editor object. | |
*/ | |
public function injectPluginSettingsForm(array &$form, FormStateInterface $form_state, Editor $editor) { | |
$definitions = $this->getDefinitions(); | |
foreach (array_keys($definitions) as $plugin_id) { | |
$plugin = $this->createInstance($plugin_id); | |
if ($plugin instanceof CKEditorPluginConfigurableInterface) { | |
$plugin_settings_form = array(); | |
$form['plugins'][$plugin_id] = array( | |
'#type' => 'details', | |
'#title' => $definitions[$plugin_id]['label'], | |
'#open' => TRUE, | |
'#group' => 'editor][settings][plugin_settings', | |
'#attributes' => array( | |
'data-ckeditor-plugin-id' => $plugin_id, | |
), | |
); | |
// Provide enough metadata for the drupal.ckeditor.admin library to | |
// allow it to automatically show/hide the vertical tab containing the | |
// settings for this plugin. Only do this if it's a CKEditor plugin that | |
// just provides buttons, don't do this if it's a contextually enabled | |
// CKEditor plugin. After all, in the latter case, we can't know when | |
// its settings should be shown! | |
if ($plugin instanceof CKEditorPluginButtonsInterface && !$plugin instanceof CKEditorPluginContextualInterface) { | |
$form['plugins'][$plugin_id]['#attributes']['data-ckeditor-buttons'] = implode(' ', array_keys($plugin->getButtons())); | |
} | |
$form['plugins'][$plugin_id] += $plugin->settingsForm($plugin_settings_form, $form_state, $editor); | |
} | |
} | |
} | |
} |