1 |
|
2 |
|
3 |
|
4 |
|
5 | import { Command } from 'ckeditor5/src/core';
|
6 | import { findOptimalInsertionRange } from 'ckeditor5/src/widget';
|
7 | import { getSelectedMediaModelWidget, insertMedia } from './utils';
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 | export default class MediaEmbedCommand extends Command {
|
20 | |
21 |
|
22 |
|
23 | refresh() {
|
24 | const model = this.editor.model;
|
25 | const selection = model.document.selection;
|
26 | const selectedMedia = getSelectedMediaModelWidget(selection);
|
27 | this.value = selectedMedia ? selectedMedia.getAttribute('url') : undefined;
|
28 | this.isEnabled = isMediaSelected(selection) || isAllowedInParent(selection, model);
|
29 | }
|
30 | |
31 |
|
32 |
|
33 |
|
34 |
|
35 |
|
36 |
|
37 |
|
38 |
|
39 | execute(url) {
|
40 | const model = this.editor.model;
|
41 | const selection = model.document.selection;
|
42 | const selectedMedia = getSelectedMediaModelWidget(selection);
|
43 | if (selectedMedia) {
|
44 | model.change(writer => {
|
45 | writer.setAttribute('url', url, selectedMedia);
|
46 | });
|
47 | }
|
48 | else {
|
49 | insertMedia(model, url, selection, true);
|
50 | }
|
51 | }
|
52 | }
|
53 |
|
54 |
|
55 |
|
56 | function isAllowedInParent(selection, model) {
|
57 | const insertionRange = findOptimalInsertionRange(selection, model);
|
58 | let parent = insertionRange.start.parent;
|
59 |
|
60 | if (parent.isEmpty && !model.schema.isLimit(parent)) {
|
61 | parent = parent.parent;
|
62 | }
|
63 | return model.schema.checkChild(parent, 'media');
|
64 | }
|
65 |
|
66 |
|
67 |
|
68 | function isMediaSelected(selection) {
|
69 | const element = selection.getSelectedElement();
|
70 | return !!element && element.name === 'media';
|
71 | }
|