ckeditor_mentions-8.x-2.x-dev/js/ckeditor5_plugins/drupalMention/src/drupalMention.js

js/ckeditor5_plugins/drupalMention/src/drupalMention.js
/**
 * @file This is what CKEditor refers to as a master (glue) plugin. Its role is
 * just to load the “editing” and “UI” components of this Plugin. Those
 * components could be included in this file, but
 *
 * I.e, this file's purpose is to integrate all the separate parts of the plugin
 * before it's made discoverable via index.js.
 */
// cSpell:ignore simpleboxediting simpleboxui

// The contents of SimpleBoxUI and SimpleBox editing could be included in this
// file, but it is recommended to separate these concerns in different files.
import {Plugin} from 'ckeditor5/src/core';

export default class DrupalMention extends Plugin {

  init() {
    const editor = this.editor;
    const mentionTypeToMakerMap = {};
    const markerToMentionTypeMap = {};
    editor.config.get('mention').feeds.forEach((i) => {
      if (i.drupalMentionsType && i.marker) {
        mentionTypeToMakerMap[i.drupalMentionsType] = i.marker;
        markerToMentionTypeMap[i.marker] = i.drupalMentionsType;
      }
    });

    // The upcast converter will convert view <a class="mention" href="" data-plugin="">
    // elements to the model 'mention' text attribute.
    editor.conversion.for('upcast').elementToAttribute({
      view: {
        name: 'a',
        key: 'data-mention',
        classes: 'mention',
        attributes: {
          href: true,
          'data-plugin': true,
          'data-entity-type': true,
          'data-entity-uuid': true,
          'data-mention-uuid': true,
        }
      },
      model: {
        key: 'mention',
        value: viewItem => {
          // BC-Layer for older mentions from ckeditor4.
          let mentionId = viewItem.getAttribute('data-mention');
          let mentionPlugin = viewItem.getAttribute('data-plugin');
          let mentionMarker = mentionTypeToMakerMap[mentionPlugin] ?? false;
          if (mentionPlugin !== null && mentionId !== null && mentionMarker && mentionId.charAt(0) !== mentionMarker) {
            viewItem._setAttribute('data-mention', mentionMarker + mentionId);
          }
          // End BC-Layer

          // The mention feature expects that the mention attribute value
          // in the model is a plain object with a set of additional attributes.
          // In order to create a proper object use the toMentionAttribute() helper method:
          return editor.plugins.get('Mention').toMentionAttribute(viewItem, {
            // Add any other properties that you need.
            link: viewItem.getAttribute('href'),
            entity_type: viewItem.getAttribute('data-entity-type'),
            entity_uuid: viewItem.getAttribute('data-entity-uuid'),
            mention_uuid: viewItem.getAttribute('data-mention-uuid'),
            plugin: viewItem.getAttribute('data-plugin'),
          });
        }
      },
      converterPriority: 'high'
    });

    // Downcast the model 'mention' text attribute to a view <a> element.
    editor.conversion.for('downcast').attributeToElement({
      model: 'mention',
      view: (modelAttributeValue, {writer}) => {
        // Do not convert empty attributes (lack of value means no mention).
        if (!modelAttributeValue) {
          return;
        }

        return writer.createAttributeElement('a', {
          class: 'mention',
          'data-mention': modelAttributeValue.id,
          'data-mention-uuid': modelAttributeValue.mention_uuid ?? null,
          'data-entity-type': modelAttributeValue.entity_type ?? null,
          'data-entity-uuid': modelAttributeValue.entity_uuid ?? null,
          'data-plugin': modelAttributeValue.plugin ?? null,
          'href': modelAttributeValue.link ?? null,
        }, {
          // Make mention attribute to be wrapped by other attribute elements.
          priority: 20,
          // Prevent merging mentions together.
          id: modelAttributeValue.uid
        });
      },
      converterPriority: 'high'
    });
  }

  /**
   * @inheritdoc
   */
  static get pluginName() {
    return 'drupalMention';
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc