qbank_dam-8.x-1.4/js/ckeditor5_plugins/qbank/src/qbankmediaediting.js

js/ckeditor5_plugins/qbank/src/qbankmediaediting.js
import { Plugin } from 'ckeditor5/src/core';
import InsertQBankMediaCommand from './insertqbankmediacommand';
import { toWidget, toWidgetEditable } from 'ckeditor5/src/widget';

export default class QBankMediaEditing extends Plugin {


  init() {
    this._defineSchema();
    this._defineConverters();
    this.editor.commands.add(
      'insertQBankMedia',
      new InsertQBankMediaCommand(this.editor),
    );
  }

  //Plugin Schemas
  _defineSchema() {
    const schema = this.editor.model.schema;

    schema.register('qbankMedia', {
      isObject: true,
      allowWhere: '$block',
      allowAttributes: ['alt', 'src', 'data-entity-type', 'data-entity-uuid'],
      allowContent: 'source'
    });

    schema.register('qbankVideo', {
      isObject: true,
      allowWhere: '$block',
      allowAttributes: ['width', 'height', 'controls', 'data-entity-type', 'data-entity-uuid']
    });

    schema.register('qbankAudio', {
      isObject: true,
      allowWhere: '$block',
      allowAttributes: ['controls', 'data-entity-type', 'data-entity-uuid']
    });

    schema.register('qbankSource', {
      isInline: true,
      allowWhere: '$block',
      allowAttributes: ['type', 'src']
    });

    schema.register('qbankLink', {
      allowIn: '$root',
      allowChildren: '$text',
      isContent: true,
      isInline: true,
      allowAttributes: ['href', 'target', 'data-entity-type', 'data-entity-uuid'],
    });

  }

  //Convert component into HTML
  _defineConverters() {
    const { conversion } = this.editor;

    //Store model data including attributes into view
    conversion.for('dataDowncast').elementToElement({
      model: 'qbankMedia',
      view: {
        name: 'img'
      },
    }).attributeToAttribute({
      view: {
        name: 'img',
        key: 'src'
      },
      model: 'src'
    }).attributeToAttribute({
      view: {
        name: 'img',
        key: 'data-entity-uuid'
      },
      model: 'data-entity-uuid'
    }).attributeToAttribute({
      view: {
        name: 'img',
        key: 'data-entity-type'
      },
      model: 'data-entity-type'
    });

    conversion.for('dataDowncast').elementToElement({
      model: 'qbankVideo',
      view: {
        name: 'video'
      },
    }).attributeToAttribute({
      view: {
        name: 'video',
        key: 'width'
      },
      model: 'width'
    }).attributeToAttribute({
      view: {
        name: 'video',
        key: 'height'
      },
      model: 'height'
    }).attributeToAttribute({
      view: {
        name: 'video',
        key: 'controls'
      },
      model: 'controls'
    }).attributeToAttribute({
      view: {
        name: 'video',
        key: 'data-entity-uuid'
      },
      model: 'data-entity-uuid'
    }).attributeToAttribute({
      view: {
        name: 'video',
        key: 'data-entity-type'
      },
      model: 'data-entity-type'
    });

    conversion.for('dataDowncast').elementToElement({
      model: 'qbankAudio',
      view: {
        name: 'audio'
      },
    }).attributeToAttribute({
      view: {
        name: 'audio',
        key: 'controls'
      },
      model: 'controls'
    }).attributeToAttribute({
      view: {
        name: 'audio',
        key: 'data-entity-uuid'
      },
      model: 'data-entity-uuid'
    }).attributeToAttribute({
      view: {
        name: 'audio',
        key: 'data-entity-type'
      },
      model: 'data-entity-type'
    });

    //Store model data including attributes into view
    conversion.for('dataDowncast').elementToElement({
      model: 'qbankSource',
      view: {
        name: 'source'
      },
    }).attributeToAttribute({
      view: {
        name: 'source',
        key: 'src'
      },
      model: 'src'
    }).attributeToAttribute({
      view: {
        name: 'source',
        key: 'type'
      },
      model: 'type'
    });

    conversion.for('dataDowncast').elementToElement({
      model: 'qbankLink',
      view: {
        name: 'a'
      },
    }).attributeToAttribute({
      view: {
        name: 'a',
        key: 'target'
      },
      model: 'target'
    }).attributeToAttribute({
      view: {
        name: 'a',
        key: 'href'
      },
      model: 'href'
    }).attributeToAttribute({
      view: {
        name: 'a',
        key: 'data-entity-uuid'
      },
      model: 'data-entity-uuid'
    }).attributeToAttribute({
      view: {
        name: 'a',
        key: 'data-entity-type'
      },
      model: 'data-entity-type'
    });


    //Convert to HTML tag
    conversion.for('editingDowncast').elementToElement({
      model: 'qbankMedia',
      view: (modelElement, { writer: viewWriter }) => {
        const media = viewWriter.createEmptyElement('img', {
          src: modelElement.getAttribute('src'),
          "data-entity-uuid": modelElement.getAttribute('data-entity-uuid'),
          "data-entity-type": modelElement.getAttribute('data-entity-type')
        });

        return media;
      },
    });

    conversion.for('editingDowncast').elementToElement({
      model: 'qbankVideo',
      view: (modelElement, { writer: viewWriter }) => {
        const video = viewWriter.createContainerElement('video', {
          width: modelElement.getAttribute('width'),
          height: modelElement.getAttribute('height'),
          controls: modelElement.getAttribute('controls'),
          "data-entity-uuid": modelElement.getAttribute('data-entity-uuid'),
          "data-entity-type": modelElement.getAttribute('data-entity-type')
        });

        return video;
      },
    });

    conversion.for('editingDowncast').elementToElement({
      model: 'qbankAudio',
      view: (modelElement, { writer: viewWriter }) => {
        const audio = viewWriter.createContainerElement('audio', {
          controls: modelElement.getAttribute('controls'),
          "data-entity-uuid": modelElement.getAttribute('data-entity-uuid'),
          "data-entity-type": modelElement.getAttribute('data-entity-type')
        });

        return audio;
      },
    });

    conversion.for('editingDowncast').elementToElement({
      model: 'qbankSource',
      view: (modelElement, { writer: viewWriter }) => {
        const source = viewWriter.createEmptyElement('source', {
          src: modelElement.getAttribute('src'),
          type: modelElement.getAttribute('type'),
        });

        return source;
      },
    });

    conversion.for('editingDowncast').elementToElement({
      model: 'qbankLink',
      view: (modelElement, { writer: viewWriter }) => {
        const link = viewWriter.createContainerElement('a', {
          href: modelElement.getAttribute('href'),
          target: modelElement.getAttribute('target'),
          "data-entity-uuid": modelElement.getAttribute('data-entity-uuid'),
          "data-entity-type": modelElement.getAttribute('data-entity-type')
        });

        return toWidgetEditable(link, viewWriter);
      },
    });

  }
}

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

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