function FundamentalCompatibilityConstraintValidator::checkAllHtmlTagsAreCreatable

Same name and namespace in other branches
  1. 9 core/modules/ckeditor5/src/Plugin/Validation/Constraint/FundamentalCompatibilityConstraintValidator.php \Drupal\ckeditor5\Plugin\Validation\Constraint\FundamentalCompatibilityConstraintValidator::checkAllHtmlTagsAreCreatable()
  2. 10 core/modules/ckeditor5/src/Plugin/Validation/Constraint/FundamentalCompatibilityConstraintValidator.php \Drupal\ckeditor5\Plugin\Validation\Constraint\FundamentalCompatibilityConstraintValidator::checkAllHtmlTagsAreCreatable()

Checks all HTML tags supported by enabled CKEditor 5 plugins are creatable.

Parameters

\Drupal\editor\EditorInterface $text_editor: The text editor to validate.

\Drupal\ckeditor5\Plugin\Validation\Constraint\FundamentalCompatibilityConstraint $constraint: The constraint to validate.

1 call to FundamentalCompatibilityConstraintValidator::checkAllHtmlTagsAreCreatable()
FundamentalCompatibilityConstraintValidator::validate in core/modules/ckeditor5/src/Plugin/Validation/Constraint/FundamentalCompatibilityConstraintValidator.php

File

core/modules/ckeditor5/src/Plugin/Validation/Constraint/FundamentalCompatibilityConstraintValidator.php, line 186

Class

FundamentalCompatibilityConstraintValidator
Validates fundamental compatibility of CKEditor 5 with the given text format.

Namespace

Drupal\ckeditor5\Plugin\Validation\Constraint

Code

private function checkAllHtmlTagsAreCreatable(EditorInterface $text_editor, FundamentalCompatibilityConstraint $constraint) : void {
    $enabled_definitions = $this->pluginManager
        ->getEnabledDefinitions($text_editor);
    $enabled_plugins = array_keys($enabled_definitions);
    // When arbitrary HTML is supported, all tags are creatable.
    if (in_array('ckeditor5_arbitraryHtmlSupport', $enabled_plugins, TRUE)) {
        return;
    }
    $tags_and_attributes = new HTMLRestrictions($this->pluginManager
        ->getProvidedElements($enabled_plugins, $text_editor));
    $creatable_tags = new HTMLRestrictions($this->pluginManager
        ->getProvidedElements($enabled_plugins, $text_editor, FALSE, TRUE));
    $needed_tags = $tags_and_attributes->extractPlainTagsSubset();
    $non_creatable_tags = $needed_tags->diff($creatable_tags);
    if (!$non_creatable_tags->allowsNothing()) {
        foreach ($non_creatable_tags->toCKEditor5ElementsArray() as $non_creatable_tag) {
            // Find the plugin which has a non-creatable tag.
            $needle = HTMLRestrictions::fromString($non_creatable_tag);
            $matching_plugins = array_filter($enabled_definitions, function (CKEditor5PluginDefinition $d) use ($needle, $text_editor) {
                if (!$d->hasElements()) {
                    return FALSE;
                }
                $haystack = new HTMLRestrictions($this->pluginManager
                    ->getProvidedElements([
                    $d->id(),
                ], $text_editor, FALSE, FALSE));
                return !$haystack->extractPlainTagsSubset()
                    ->intersect($needle)
                    ->allowsNothing();
            });
            assert(count($matching_plugins) === 1);
            $plugin_definition = reset($matching_plugins);
            assert($plugin_definition instanceof CKEditor5PluginDefinition);
            // Compute which attributes it would be able to create on this tag.
            $provided_elements = new HTMLRestrictions($this->pluginManager
                ->getProvidedElements([
                $plugin_definition->id(),
            ], $text_editor, FALSE, FALSE));
            $attributes_on_tag = $provided_elements->intersect(new HTMLRestrictions(array_fill_keys(array_keys($needle->getAllowedElements()), TRUE)));
            $violation = $this->context
                ->buildViolation($constraint->nonCreatableTagMessage)
                ->setParameter('@non_creatable_tag', $non_creatable_tag)
                ->setParameter('%plugin', $plugin_definition->label())
                ->setParameter('@attributes_on_tag', implode(', ', $attributes_on_tag->toCKEditor5ElementsArray()));
            // If this plugin has a configurable subset, associate the violation
            // with the property path pointing to this plugin's settings form.
            if (is_a($plugin_definition->getClass(), CKEditor5PluginElementsSubsetInterface::class, TRUE)) {
                $violation->atPath(sprintf('settings.plugins.%s', $plugin_definition->id()));
            }
            elseif ($plugin_definition->hasToolbarItems()) {
                $toolbar_items = $plugin_definition->getToolbarItems();
                $active_toolbar_items = array_intersect($text_editor->getSettings()['toolbar']['items'], array_keys($toolbar_items));
                $violation->atPath(sprintf('settings.toolbar.items.%d', array_keys($active_toolbar_items)[0]));
            }
            $violation->addViolation();
        }
    }
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.