c9c9427327023947c4cff89f6310622b28a46372
[yaffs-website] / web / core / modules / ckeditor / js / plugins / drupalimagecaption / 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 (CKEDITOR) {
9   CKEDITOR.plugins.add('drupalimagecaption', {
10     requires: 'drupalimage',
11
12     beforeInit: function beforeInit(editor) {
13       editor.lang.image2.captionPlaceholder = '';
14
15       var placeholderText = editor.config.drupalImageCaption_captionPlaceholderText;
16
17       editor.on('widgetDefinition', function (event) {
18         var widgetDefinition = event.data;
19         if (widgetDefinition.name !== 'image') {
20           return;
21         }
22
23         var captionFilterEnabled = editor.config.drupalImageCaption_captionFilterEnabled;
24         var alignFilterEnabled = editor.config.drupalImageCaption_alignFilterEnabled;
25
26         CKEDITOR.tools.extend(widgetDefinition.features, {
27           caption: {
28             requiredContent: 'img[data-caption]'
29           },
30           align: {
31             requiredContent: 'img[data-align]'
32           }
33         }, true);
34
35         var requiredContent = widgetDefinition.requiredContent.getDefinition();
36         requiredContent.attributes['data-align'] = '';
37         requiredContent.attributes['data-caption'] = '';
38         widgetDefinition.requiredContent = new CKEDITOR.style(requiredContent);
39         widgetDefinition.allowedContent.img.attributes['!data-align'] = true;
40         widgetDefinition.allowedContent.img.attributes['!data-caption'] = true;
41
42         widgetDefinition.editables.caption.allowedContent = 'a[!href]; em strong cite code br';
43
44         var originalDowncast = widgetDefinition.downcast;
45         widgetDefinition.downcast = function (element) {
46           var img = findElementByName(element, 'img');
47           originalDowncast.call(this, img);
48
49           var caption = this.editables.caption;
50           var captionHtml = caption && caption.getData();
51           var attrs = img.attributes;
52
53           if (captionFilterEnabled) {
54             if (captionHtml) {
55               attrs['data-caption'] = captionHtml;
56             }
57           }
58           if (alignFilterEnabled) {
59             if (this.data.align !== 'none') {
60               attrs['data-align'] = this.data.align;
61             }
62           }
63
64           if (img.parent.name === 'a') {
65             return img.parent;
66           }
67
68           return img;
69         };
70
71         var originalUpcast = widgetDefinition.upcast;
72         widgetDefinition.upcast = function (element, data) {
73           if (element.name !== 'img' || !element.attributes['data-entity-type'] || !element.attributes['data-entity-uuid']) {
74             return;
75           } else if (element.attributes['data-cke-realelement']) {
76               return;
77             }
78
79           element = originalUpcast.call(this, element, data);
80           var attrs = element.attributes;
81
82           if (element.parent.name === 'a') {
83             element = element.parent;
84           }
85
86           var retElement = element;
87           var caption = void 0;
88
89           if (captionFilterEnabled) {
90             caption = attrs['data-caption'];
91             delete attrs['data-caption'];
92           }
93           if (alignFilterEnabled) {
94             data.align = attrs['data-align'];
95             delete attrs['data-align'];
96           }
97           data['data-entity-type'] = attrs['data-entity-type'];
98           delete attrs['data-entity-type'];
99           data['data-entity-uuid'] = attrs['data-entity-uuid'];
100           delete attrs['data-entity-uuid'];
101
102           if (captionFilterEnabled) {
103             if (element.parent.name === 'p' && caption) {
104               var index = element.getIndex();
105               var splitBefore = index > 0;
106               var splitAfter = index + 1 < element.parent.children.length;
107
108               if (splitBefore) {
109                 element.parent.split(index);
110               }
111               index = element.getIndex();
112               if (splitAfter) {
113                 element.parent.split(index + 1);
114               }
115
116               element.parent.replaceWith(element);
117               retElement = element;
118             }
119
120             if (caption) {
121               var figure = new CKEDITOR.htmlParser.element('figure');
122               caption = new CKEDITOR.htmlParser.fragment.fromHtml(caption, 'figcaption');
123
124               caption.attributes['data-placeholder'] = placeholderText;
125
126               element.replaceWith(figure);
127               figure.add(element);
128               figure.add(caption);
129               figure.attributes.class = editor.config.image2_captionedClass;
130               retElement = figure;
131             }
132           }
133
134           if (alignFilterEnabled) {
135             if (data.align === 'center' && (!captionFilterEnabled || !caption)) {
136               var p = new CKEDITOR.htmlParser.element('p');
137               element.replaceWith(p);
138               p.add(element);
139
140               p.addClass(editor.config.image2_alignClasses[1]);
141               retElement = p;
142             }
143           }
144
145           return retElement;
146         };
147
148         CKEDITOR.tools.extend(widgetDefinition._mapDataToDialog, {
149           align: 'data-align',
150           'data-caption': 'data-caption',
151           hasCaption: 'hasCaption'
152         });
153
154         var originalCreateDialogSaveCallback = widgetDefinition._createDialogSaveCallback;
155         widgetDefinition._createDialogSaveCallback = function (editor, widget) {
156           var saveCallback = originalCreateDialogSaveCallback.call(this, editor, widget);
157
158           return function (dialogReturnValues) {
159             dialogReturnValues.attributes.hasCaption = !!dialogReturnValues.attributes.hasCaption;
160
161             var actualWidget = saveCallback(dialogReturnValues);
162
163             if (dialogReturnValues.attributes.hasCaption) {
164               actualWidget.editables.caption.setAttribute('data-placeholder', placeholderText);
165
166               var captionElement = actualWidget.editables.caption.$;
167               if (captionElement.childNodes.length === 1 && captionElement.childNodes.item(0).nodeName === 'BR') {
168                 captionElement.removeChild(captionElement.childNodes.item(0));
169               }
170             }
171           };
172         };
173       }, null, null, 20);
174     },
175     afterInit: function afterInit(editor) {
176       var disableButtonIfOnWidget = function disableButtonIfOnWidget(evt) {
177         var widget = editor.widgets.focused;
178         if (widget && widget.name === 'image') {
179           this.setState(CKEDITOR.TRISTATE_DISABLED);
180           evt.cancel();
181         }
182       };
183
184       if (editor.plugins.justify && !editor.config.drupalImageCaption_alignFilterEnabled) {
185         var cmd = void 0;
186         var commands = ['justifyleft', 'justifycenter', 'justifyright', 'justifyblock'];
187         for (var n = 0; n < commands.length; n++) {
188           cmd = editor.getCommand(commands[n]);
189           cmd.contextSensitive = 1;
190           cmd.on('refresh', disableButtonIfOnWidget, null, null, 4);
191         }
192       }
193     }
194   });
195
196   function findElementByName(element, name) {
197     if (element.name === name) {
198       return element;
199     }
200
201     var found = null;
202     element.forEach(function (el) {
203       if (el.name === name) {
204         found = el;
205
206         return false;
207       }
208     }, CKEDITOR.NODE_ELEMENT);
209     return found;
210   }
211 })(CKEDITOR);