@ckeditor/ckeditor5-media-embed
Version:
Media embed feature for CKEditor 5.
279 lines (278 loc) • 10.1 kB
TypeScript
/**
* @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
* For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
*/
import type { ToolbarConfigItem } from 'ckeditor5/src/core';
import type { ArrayOrItem } from 'ckeditor5/src/utils';
/**
* @module media-embed/mediaembedconfig
*/
/**
* The configuration of the media embed features.
*
* Read more about {@glink features/media-embed#configuration configuring the media embed feature}.
*
* ```ts
* ClassicEditor
* .create( editorElement, {
* mediaEmbed: ... // Media embed feature options.
* } )
* .then( ... )
* .catch( ... );
* ```
*
* See {@link module:core/editor/editorconfig~EditorConfig all editor options}.
*/
export interface MediaEmbedConfig {
/**
* The default media providers supported by the editor.
*
* The names of providers with rendering functions (previews):
*
* * "dailymotion",
* * "spotify",
* * "youtube",
* * "vimeo"
*
* The names of providers without rendering functions:
*
* * "instagram",
* * "twitter",
* * "googleMaps",
* * "flickr",
* * "facebook"
*
* See the {@link module:media-embed/mediaembedconfig~MediaEmbedProvider provider syntax} to learn more about
* different kinds of media and media providers.
*
* **Note**: The default media provider configuration may not support all possible media URLs,
* only the most common are included.
*
* Media without rendering functions are always represented in the data using the "semantic" markup. See
* {@link module:media-embed/mediaembedconfig~MediaEmbedConfig#previewsInData `config.mediaEmbed.previewsInData`} to
* learn more about possible data outputs.
*
* The priority of media providers corresponds to the order of configuration. The first provider
* to match the URL is always used, even if there are other providers that support a particular URL.
* The URL is never matched against the remaining providers.
*
* To discard **all** default media providers, simply override this configuration with your own
* {@link module:media-embed/mediaembedconfig~MediaEmbedProvider definitions}:
*
* ```ts
* ClassicEditor
* .create( editorElement, {
* plugins: [ MediaEmbed, ... ],
* mediaEmbed: {
* providers: [
* {
* name: 'myProvider',
* url: /^example\.com\/media\/(\w+)/,
* html: match => '...'
* },
* ...
* ]
* }
* } )
* .then( ... )
* .catch( ... );
* ```
*
* You can take inspiration from the default configuration of this feature which you can find in:
* https://github.com/ckeditor/ckeditor5-media-embed/blob/master/src/mediaembedediting.js
*
* To **extend** the list of default providers, use
* {@link module:media-embed/mediaembedconfig~MediaEmbedConfig#extraProviders `config.mediaEmbed.extraProviders`}.
*
* To **remove** certain providers, use
* {@link module:media-embed/mediaembedconfig~MediaEmbedConfig#removeProviders `config.mediaEmbed.removeProviders`}.
*/
providers?: Array<MediaEmbedProvider>;
/**
* The additional media providers supported by the editor. This configuration helps extend the default
* {@link module:media-embed/mediaembedconfig~MediaEmbedConfig#providers}.
*
* ```ts
* ClassicEditor
* .create( editorElement, {
* plugins: [ MediaEmbed, ... ],
* mediaEmbed: {
* extraProviders: [
* {
* name: 'extraProvider',
* url: /^example\.com\/media\/(\w+)/,
* html: match => '...'
* },
* ...
* ]
* }
* } )
* .then( ... )
* .catch( ... );
* ```
*
* See the {@link module:media-embed/mediaembedconfig~MediaEmbedProvider provider syntax} to learn more.
*/
extraProviders?: Array<MediaEmbedProvider>;
/**
* The list of media providers that should not be used despite being available in
* {@link module:media-embed/mediaembedconfig~MediaEmbedConfig#providers `config.mediaEmbed.providers`} and
* {@link module:media-embed/mediaembedconfig~MediaEmbedConfig#extraProviders `config.mediaEmbed.extraProviders`}
*
* ```ts
* mediaEmbed: {
* removeProviders: [ 'youtube', 'twitter' ]
* }
* ```
*/
removeProviders?: Array<string>;
/**
* Overrides the element name used for "semantic" data.
*
* This is not relevant if
* {@link module:media-embed/mediaembedconfig~MediaEmbedConfig#previewsInData `config.mediaEmbed.previewsInData`} is set to `true`.
*
* When not set, the feature produces the `<oembed>` tag:
*
* ```html
* <figure class="media">
* <oembed url="https://url"></oembed>
* </figure>
* ```
*
* To override the element name with, for instance, the `o-embed` name:
*
* ```ts
* mediaEmbed: {
* elementName: 'o-embed'
* }
* ```
*
* This will produce semantic data with the `<o-embed>` tag:
*
* ```html
* <figure class="media">
* <o-embed url="https://url"></o-embed>
* </figure>
* ```
*
* @default 'oembed'
*/
elementName?: string;
/**
* Controls the data format produced by the feature.
*
* When `false` (default), the feature produces "semantic" data, i.e. it does not include the preview of
* the media, just the `<oembed>` tag with the `url` attribute:
*
* ```ts
* <figure class="media">
* <oembed url="https://url"></oembed>
* </figure>
* ```
*
* When `true`, the media is represented in the output in the same way it looks in the editor,
* i.e. the media preview is saved to the database:
*
* ```ts
* <figure class="media">
* <div data-oembed-url="https://url">
* <iframe src="https://preview"></iframe>
* </div>
* </figure>
* ```
*
* **Note:** Media without preview are always represented in the data using the "semantic" markup
* regardless of the value of the `previewsInData`. Learn more about different kinds of media
* in the {@link module:media-embed/mediaembedconfig~MediaEmbedConfig#providers `config.mediaEmbed.providers`}
* configuration description.
*
* @defualt false
*/
previewsInData?: boolean;
/**
* Items to be placed in the media embed toolbar.
* This option requires adding {@link module:media-embed/mediaembedtoolbar~MediaEmbedToolbar} to the plugin list.
*
* Read more about configuring toolbar in {@link module:core/editor/editorconfig~EditorConfig#toolbar}.
*/
toolbar?: Array<ToolbarConfigItem>;
}
/**
* The media embed provider descriptor. Used in
* {@link module:media-embed/mediaembedconfig~MediaEmbedConfig#providers `config.mediaEmbed.providers`} and
* {@link module:media-embed/mediaembedconfig~MediaEmbedConfig#extraProviders `config.mediaEmbed.extraProviders`}.
*
* See {@link module:media-embed/mediaembedconfig~MediaEmbedConfig} to learn more.
*
* ```ts
* {
* name: 'example',
*
* // The following RegExp matches https://www.example.com/media/{media id},
* // (either with "http(s)://" and "www" or without), so the valid URLs are:
* //
* // * https://www.example.com/media/{media id},
* // * http://www.example.com/media/{media id},
* // * www.example.com/media/{media id},
* // * example.com/media/{media id}
* url: /^example\.com\/media\/(\w+)/,
*
* // The rendering function of the provider.
* // Used to represent the media when editing the content (i.e. in the view)
* // and also in the data output of the editor if semantic data output is disabled.
* html: match => `The HTML representing the media with ID=${ match[ 1 ] }.`
* }
* ```
*
* You can allow any sort of media in the editor using the "allow–all" `RegExp`.
* But mind that, since URLs are processed in the order of configuration, if one of the previous
* `RegExps` matches the URL, it will have a precedence over this one.
*
* ```ts
* {
* name: 'allow-all',
* url: /^.+/
* }
* ```
*
* To implement responsive media, you can use the following HTML structure:
*
* ```ts
* {
* ...
* html: match =>
* '<div style="position:relative; padding-bottom:100%; height:0">' +
* '<iframe src="..." frameborder="0" ' +
* 'style="position:absolute; width:100%; height:100%; top:0; left:0">' +
* '</iframe>' +
* '</div>'
* }
* ```
*/
export interface MediaEmbedProvider {
/**
* The name of the provider. Used e.g. when
* {@link module:media-embed/mediaembedconfig~MediaEmbedConfig#removeProviders removing providers}.
*/
name: string;
/**
* The `RegExp` object (or array of objects) defining the URL of the media.
* If any URL matches the `RegExp`, it becomes the media in the editor model, as defined by the provider. The result
* of matching (output of `String.prototype.match()`) is passed to the `html` rendering function of the media.
*
* **Note:** You do not need to include the protocol (`http://`, `https://`) and `www` subdomain in your `RegExps`,
* they are stripped from the URLs before matching anyway.
*/
url: ArrayOrItem<RegExp>;
/**
* The rendering function of the media. The function receives the entire matching
* array from the corresponding `url` `RegExp` as an argument, allowing rendering a dedicated
* preview of the media identified by a certain ID or a hash. When not defined, the media embed feature
* will use a generic media representation in the view and output data.
* Note that when
* {@link module:media-embed/mediaembedconfig~MediaEmbedConfig#previewsInData `config.mediaEmbed.previewsInData`}
* is `true`, the rendering function **will always** be used for the media in the editor data output.
*/
html?: (match: RegExpMatchArray) => string;
}