public function CKEditor5PluginManager::findPluginSupportingElement in Drupal 10
Searches for CKEditor 5 plugin that supports a given tag.
Parameters
string $tag: The HTML tag to be searched for within plugin definitions.
Return value
string|null The ID of the plugin that supports the given tag.
Overrides CKEditor5PluginManagerInterface::findPluginSupportingElement
File
- core/
modules/ ckeditor5/ src/ Plugin/ CKEditor5PluginManager.php, line 200
Class
- CKEditor5PluginManager
- Provides a CKEditor5 plugin manager.
Namespace
Drupal\ckeditor5\PluginCode
public function findPluginSupportingElement(string $tag) : ?string {
// This will contain the element config for a plugin found to support $tag,
// so it can be compared to additional plugins that support $tag so the
// plugin with the most permissive config can be the id returned.
$selected_provided_elements = [];
$plugin_id = NULL;
foreach ($this
->getDefinitions() as $id => $definition) {
$provided_elements = $this
->getProvidedElements([
$id,
]);
// Multiple plugins may support the $tag being searched for.
if (array_key_exists($tag, $provided_elements)) {
// Skip plugins with conditions as those plugins can't be guaranteed to
// provide a given tag without additional criteria being met. In the
// future we could possibly add support for automatically enabling
// filters or other similar requirements a plugin might need in order to
// be enabled and provide the tag it supports. For now, we assume such
// configuration cannot be modified programmatically.
if ($definition
->hasConditions()) {
continue;
}
// True if a plugin has already been selected. If another plugin
// supports $tag, it will be compared against this one. Whichever
// provides broader support for $tag will be the plugin id returned by
// this method.
$selected_plugin = isset($selected_provided_elements[$tag]);
$selected_config = $selected_provided_elements[$tag] ?? FALSE;
// True if a plugin supporting $tag has been selected but does not allow
// any attributes while the plugin currently being checked does support
// attributes.
$adds_attribute_config = is_array($provided_elements[$tag]) && $selected_plugin && !is_array($selected_config);
$broader_attribute_config = FALSE;
// If the selected plugin and the plugin being checked both have arrays
// for $tag configuration, they both have attribute configuration. Check
// which attribute configuration is more permissive.
if ($selected_plugin && is_array($selected_config) && is_array($provided_elements[$tag])) {
$selected_plugin_full_attributes = array_filter($selected_config, function ($attribute_config) {
return !is_array($attribute_config);
});
$being_checked_plugin_full_attributes = array_filter($provided_elements[$tag], function ($attribute_config) {
return !is_array($attribute_config);
});
if (count($being_checked_plugin_full_attributes) > count($selected_plugin_full_attributes)) {
$broader_attribute_config = TRUE;
}
}
if (empty($selected_provided_elements) || $broader_attribute_config || $adds_attribute_config) {
$selected_provided_elements = $provided_elements;
$plugin_id = $id;
}
}
}
return $plugin_id;
}