function SmartDefaultSettings::createSettingsFromCKEditor4

Same name and namespace in other branches
  1. 9 core/modules/ckeditor5/src/SmartDefaultSettings.php \Drupal\ckeditor5\SmartDefaultSettings::createSettingsFromCKEditor4()

Creates equivalent CKEditor 5 settings from CKEditor 4 settings.

Parameters

array $ckeditor4_settings: The value for "settings" in a Text Editor config entity configured to use CKEditor 4.

\Drupal\ckeditor5\HTMLRestrictions $text_format_html_restrictions: The restrictions of the text format, to allow an upgrade plugin to inspect the text format's HTML restrictions to make a decision.

Return value

array An array with two values: 1. An equivalent value for CKEditor 5. 2. Messages explaining upgrade path issues.

Throws

\LogicException Thrown when an upgrade plugin is attempting to generate plugin settings for a CKEditor 4 plugin upgrade path that have already been generated.

1 call to SmartDefaultSettings::createSettingsFromCKEditor4()
SmartDefaultSettings::computeSmartDefaultSettings in core/modules/ckeditor5/src/SmartDefaultSettings.php
Computes the closest possible equivalent settings for switching to CKEditor 5.

File

core/modules/ckeditor5/src/SmartDefaultSettings.php, line 432

Class

SmartDefaultSettings
Generates CKEditor 5 settings for existing text editors/formats.

Namespace

Drupal\ckeditor5

Code

private function createSettingsFromCKEditor4(array $ckeditor4_settings, HTMLRestrictions $text_format_html_restrictions) : array {
  $settings = [
    'toolbar' => [
      'items' => [],
    ],
    'plugins' => [],
  ];
  $messages = [];
  // First: toolbar items.
  // @see \Drupal\ckeditor\CKEditorPluginButtonsInterface
  foreach ($ckeditor4_settings['toolbar']['rows'] as $row) {
    foreach ($row as $group) {
      $some_added = FALSE;
      foreach ($group['items'] as $cke4_button) {
        try {
          $equivalent = $this->upgradePluginManager
            ->mapCKEditor4ToolbarButtonToCKEditor5ToolbarItem($cke4_button, $text_format_html_restrictions);
        } catch (\OutOfBoundsException $e) {
          $this->logger
            ->warning('The CKEditor 4 button %button does not have a known upgrade path. If it allowed editing markup, then you can do so now through the Source Editing functionality.', [
            '%button' => $cke4_button,
          ]);
          $messages[MessengerInterface::TYPE_WARNING][] = $this->t('The CKEditor 4 button %button does not have a known upgrade path. If it allowed editing markup, then you can do so now through the Source Editing functionality.', [
            '%button' => $cke4_button,
          ]);
          continue;
        }
        if ($equivalent) {
          $settings['toolbar']['items'] = array_merge($settings['toolbar']['items'], $equivalent);
          $some_added = TRUE;
        }
      }
      // Add a CKEditor 5 toolbar group separator for every group.
      if ($some_added) {
        $settings['toolbar']['items'][] = '|';
      }
    }
  }
  // Remove the trailing CKEditor 5 toolbar group separator.
  array_pop($settings['toolbar']['items']);
  // Strip the CKEditor 4 buttons without a CKEditor 5 equivalent.
  $settings['toolbar']['items'] = array_filter($settings['toolbar']['items']);
  // Second: plugin settings.
  // @see \Drupal\ckeditor\CKEditorPluginConfigurableInterface
  $enabled_ckeditor4_plugins_with_settings = $ckeditor4_settings['plugins'];
  foreach ($enabled_ckeditor4_plugins_with_settings as $cke4_plugin_id => $cke4_plugin_settings) {
    try {
      $cke5_plugin_settings = $this->upgradePluginManager
        ->mapCKEditor4SettingsToCKEditor5Configuration($cke4_plugin_id, $cke4_plugin_settings);
      if ($cke5_plugin_settings === NULL) {
        continue;
      }
      assert(count($cke5_plugin_settings) === 1);
      $cke5_plugin_id = array_keys($cke5_plugin_settings)[0];
      if (isset($settings['plugins'][$cke5_plugin_id])) {
        throw new \LogicException(sprintf('The %s plugin settings have already been upgraded. Only a single @CKEditor4To5Upgrade is allowed to migrate the settings for a particular CKEditor 4 plugin.', $cke5_plugin_id));
      }
      $settings['plugins'] += $cke5_plugin_settings;
    } catch (\OutOfBoundsException $e) {
      $this->logger
        ->warning('The %cke4_plugin_id plugin settings do not have a known upgrade path.', [
        '%cke4_plugin_id' => $cke4_plugin_id,
      ]);
      $messages[MessengerInterface::TYPE_WARNING][] = $this->t('The %cke4_plugin_id plugin settings do not have a known upgrade path.', [
        '%cke4_plugin_id' => $cke4_plugin_id,
      ]);
      continue;
    }
  }
  return [
    $settings,
    $messages,
  ];
}

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