b1751c28e0c55080d043afa3dcc62e7eee6850bf
[yaffs-website] / web / core / modules / ckeditor / js / plugins / drupalimage / plugin.js
1 /**
2 * DO NOT EDIT THIS FILE.
3 * See the following change record for more information,
4 * https://www.drupal.org/node/2815083
5 * @preserve
6 **/
7
8 (function ($, Drupal, CKEDITOR) {
9   CKEDITOR.plugins.add('drupalimage', {
10     requires: 'image2',
11     icons: 'drupalimage',
12     hidpi: true,
13
14     beforeInit: function beforeInit(editor) {
15       editor.on('widgetDefinition', function (event) {
16         var widgetDefinition = event.data;
17         if (widgetDefinition.name !== 'image') {
18           return;
19         }
20
21         widgetDefinition.allowedContent = {
22           img: {
23             attributes: {
24               '!src': true,
25               '!alt': true,
26               width: true,
27               height: true
28             },
29             classes: {}
30           }
31         };
32
33         widgetDefinition.requiredContent = new CKEDITOR.style({
34           element: 'img',
35           attributes: {
36             src: '',
37             alt: ''
38           }
39         });
40
41         var requiredContent = widgetDefinition.requiredContent.getDefinition();
42         requiredContent.attributes['data-entity-type'] = '';
43         requiredContent.attributes['data-entity-uuid'] = '';
44         widgetDefinition.requiredContent = new CKEDITOR.style(requiredContent);
45         widgetDefinition.allowedContent.img.attributes['!data-entity-type'] = true;
46         widgetDefinition.allowedContent.img.attributes['!data-entity-uuid'] = true;
47
48         widgetDefinition.downcast = function (element) {
49           element.attributes['data-entity-type'] = this.data['data-entity-type'];
50           element.attributes['data-entity-uuid'] = this.data['data-entity-uuid'];
51         };
52
53         widgetDefinition.upcast = function (element, data) {
54           if (element.name !== 'img') {
55             return;
56           } else if (element.attributes['data-cke-realelement']) {
57               return;
58             }
59
60           data['data-entity-type'] = element.attributes['data-entity-type'];
61
62           data['data-entity-uuid'] = element.attributes['data-entity-uuid'];
63
64           return element;
65         };
66
67         var originalGetClasses = widgetDefinition.getClasses;
68         widgetDefinition.getClasses = function () {
69           var classes = originalGetClasses.call(this);
70           var captionedClasses = (this.editor.config.image2_captionedClass || '').split(/\s+/);
71
72           if (captionedClasses.length && classes) {
73             for (var i = 0; i < captionedClasses.length; i++) {
74               if (captionedClasses[i] in classes) {
75                 delete classes[captionedClasses[i]];
76               }
77             }
78           }
79
80           return classes;
81         };
82
83         widgetDefinition._mapDataToDialog = {
84           src: 'src',
85           alt: 'alt',
86           width: 'width',
87           height: 'height',
88           'data-entity-type': 'data-entity-type',
89           'data-entity-uuid': 'data-entity-uuid'
90         };
91
92         widgetDefinition._dataToDialogValues = function (data) {
93           var dialogValues = {};
94           var map = widgetDefinition._mapDataToDialog;
95           Object.keys(widgetDefinition._mapDataToDialog).forEach(function (key) {
96             dialogValues[map[key]] = data[key];
97           });
98           return dialogValues;
99         };
100
101         widgetDefinition._dialogValuesToData = function (dialogReturnValues) {
102           var data = {};
103           var map = widgetDefinition._mapDataToDialog;
104           Object.keys(widgetDefinition._mapDataToDialog).forEach(function (key) {
105             if (dialogReturnValues.hasOwnProperty(map[key])) {
106               data[key] = dialogReturnValues[map[key]];
107             }
108           });
109           return data;
110         };
111
112         widgetDefinition._createDialogSaveCallback = function (editor, widget) {
113           return function (dialogReturnValues) {
114             var firstEdit = !widget.ready;
115
116             if (!firstEdit) {
117               widget.focus();
118             }
119
120             editor.fire('saveSnapshot');
121
122             var container = widget.wrapper.getParent(true);
123             var image = widget.parts.image;
124
125             var data = widgetDefinition._dialogValuesToData(dialogReturnValues.attributes);
126             widget.setData(data);
127
128             widget = editor.widgets.getByElement(image);
129
130             if (firstEdit) {
131               editor.widgets.finalizeCreation(container);
132             }
133
134             setTimeout(function () {
135               widget.focus();
136
137               editor.fire('saveSnapshot');
138             });
139
140             return widget;
141           };
142         };
143
144         var originalInit = widgetDefinition.init;
145         widgetDefinition.init = function () {
146           originalInit.call(this);
147
148           if (this.parts.link) {
149             this.setData('link', CKEDITOR.plugins.image2.getLinkAttributesParser()(editor, this.parts.link));
150           }
151         };
152       });
153
154       editor.widgets.on('instanceCreated', function (event) {
155         var widget = event.data;
156
157         if (widget.name !== 'image') {
158           return;
159         }
160
161         widget.on('edit', function (event) {
162           event.cancel();
163
164           editor.execCommand('editdrupalimage', {
165             existingValues: widget.definition._dataToDialogValues(widget.data),
166             saveCallback: widget.definition._createDialogSaveCallback(editor, widget),
167
168             dialogTitle: widget.data.src ? editor.config.drupalImage_dialogTitleEdit : editor.config.drupalImage_dialogTitleAdd
169           });
170         });
171       });
172
173       editor.addCommand('editdrupalimage', {
174         allowedContent: 'img[alt,!src,width,height,!data-entity-type,!data-entity-uuid]',
175         requiredContent: 'img[alt,src,data-entity-type,data-entity-uuid]',
176         modes: { wysiwyg: 1 },
177         canUndo: true,
178         exec: function exec(editor, data) {
179           var dialogSettings = {
180             title: data.dialogTitle,
181             dialogClass: 'editor-image-dialog'
182           };
183           Drupal.ckeditor.openDialog(editor, Drupal.url('editor/dialog/image/' + editor.config.drupal.format), data.existingValues, data.saveCallback, dialogSettings);
184         }
185       });
186
187       if (editor.ui.addButton) {
188         editor.ui.addButton('DrupalImage', {
189           label: Drupal.t('Image'),
190
191           command: 'image'
192         });
193       }
194     },
195     afterInit: function afterInit(editor) {
196       linkCommandIntegrator(editor);
197     }
198   });
199
200   CKEDITOR.plugins.image2.getLinkAttributesParser = function () {
201     return CKEDITOR.plugins.drupallink.parseLinkAttributes;
202   };
203   CKEDITOR.plugins.image2.getLinkAttributesGetter = function () {
204     return CKEDITOR.plugins.drupallink.getLinkAttributes;
205   };
206
207   function linkCommandIntegrator(editor) {
208     if (!editor.plugins.drupallink) {
209       return;
210     }
211
212     editor.getCommand('drupalunlink').on('exec', function (evt) {
213       var widget = getFocusedWidget(editor);
214
215       if (!widget || !widget.parts.link) {
216         return;
217       }
218
219       widget.setData('link', null);
220
221       this.refresh(editor, editor.elementPath());
222
223       evt.cancel();
224     });
225
226     editor.getCommand('drupalunlink').on('refresh', function (evt) {
227       var widget = getFocusedWidget(editor);
228
229       if (!widget) {
230         return;
231       }
232
233       this.setState(widget.data.link || widget.wrapper.getAscendant('a') ? CKEDITOR.TRISTATE_OFF : CKEDITOR.TRISTATE_DISABLED);
234
235       evt.cancel();
236     });
237   }
238
239   function getFocusedWidget(editor) {
240     var widget = editor.widgets.focused;
241
242     if (widget && widget.name === 'image') {
243       return widget;
244     }
245
246     return null;
247   }
248
249   CKEDITOR.plugins.drupalimage = {
250     getFocusedWidget: getFocusedWidget
251   };
252 })(jQuery, Drupal, CKEDITOR);