function Ckeditor5Hooks::libraryInfoAlter

Implements hook_library_info_alter().

File

core/modules/ckeditor5/src/Hook/Ckeditor5Hooks.php, line 205

Class

Ckeditor5Hooks
Hook implementations for ckeditor5.

Namespace

Drupal\ckeditor5\Hook

Code

public function libraryInfoAlter(&$libraries, $extension) : void {
    if ($extension === 'filter') {
        $libraries['drupal.filter.admin']['dependencies'][] = 'ckeditor5/internal.drupal.ckeditor5.filter.admin';
    }
    $moduleHandler = \Drupal::moduleHandler();
    if ($extension === 'ckeditor5') {
        // Add paths to stylesheets specified by a theme's ckeditor5-stylesheets
        // config property.
        $css = _ckeditor5_theme_css();
        $libraries['internal.drupal.ckeditor5.stylesheets'] = [
            'css' => [
                'theme' => array_fill_keys(array_values($css), []),
            ],
        ];
    }
    if ($extension === 'core') {
        // CSS rule to resolve the conflict with z-index between CKEditor 5 and jQuery UI.
        $libraries['drupal.dialog']['css']['component']['modules/ckeditor5/css/ckeditor5.dialog.fix.css'] = [];
        // Fix the CKEditor 5 focus management in dialogs. Modify the library
        // declaration to ensure this file is always loaded after
        // drupal.dialog.jquery-ui.js.
        $libraries['drupal.dialog']['js']['modules/ckeditor5/js/ckeditor5.dialog.fix.js'] = [];
    }
    // Only add translation processing if the locale module is enabled.
    if (!$moduleHandler->moduleExists('locale')) {
        return;
    }
    // All possibles CKEditor 5 languages that can be used by Drupal.
    $ckeditor_langcodes = array_values(_ckeditor5_get_langcode_mapping());
    if ($extension === 'core') {
        // Generate libraries for each of the CKEditor 5 translation files so that
        // the correct translation file can be attached depending on the current
        // language. This makes sure that caching caches the appropriate language.
        // Only create libraries for languages that have a mapping to Drupal.
        foreach ($ckeditor_langcodes as $langcode) {
            $libraries['ckeditor5.translations.' . $langcode] = [
                'remote' => $libraries['ckeditor5']['remote'],
                'version' => $libraries['ckeditor5']['version'],
                'license' => $libraries['ckeditor5']['license'],
                'dependencies' => [
                    'core/ckeditor5',
                    'core/ckeditor5.translations',
                ],
            ];
        }
    }
    // Copied from \Drupal\Core\Asset\LibraryDiscoveryParser::buildByExtension().
    if ($extension === 'core') {
        $path = 'core';
    }
    else {
        if ($moduleHandler->moduleExists($extension)) {
            $extension_type = 'module';
        }
        else {
            $extension_type = 'theme';
        }
        $path = \Drupal::getContainer()->get('extension.path.resolver')
            ->getPath($extension_type, $extension);
    }
    foreach ($libraries as &$library) {
        // The way to know if a library has a translation is to depend on the
        // special "core/ckeditor5.translations" library.
        if (empty($library['js']) || empty($library['dependencies']) || !in_array('core/ckeditor5.translations', $library['dependencies'])) {
            continue;
        }
        foreach ($library['js'] as $file => $options) {
            // Only look for translations on libraries defined with a relative path.
            if (!empty($options['type']) && $options['type'] === 'external') {
                continue;
            }
            // Path relative to the current extension folder.
            $dirname = dirname($file);
            // Path of the folder in the filesystem relative to the Drupal root.
            $dir = $path . '/' . $dirname;
            // Exclude protocol-free URI.
            if (str_starts_with($dirname, '//')) {
                continue;
            }
            // CKEditor 5 plugins are most likely added through composer and
            // installed in the module exposing it. Suppose the file path is
            // relative to the module and not in the /libraries/ folder.
            // Collect translations based on filename, and add all existing
            // translations files to the plugin library. Unnecessary translations
            // will be filtered in ckeditor5_js_alter() hook.
            $files = scandir("{$dir}/translations");
            foreach ($files as $file) {
                if (str_ends_with($file, '.js')) {
                    $langcode = basename($file, '.js');
                    // Only add languages that Drupal can understands.
                    if (in_array($langcode, $ckeditor_langcodes)) {
                        $library['js']["{$dirname}/translations/{$langcode}.js"] = [
                            'ckeditor5_langcode' => $langcode,
                            'minified' => TRUE,
                            'preprocess' => TRUE,
                        ];
                    }
                }
            }
        }
    }
}

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