2 * DO NOT EDIT THIS FILE.
3 * See the following change record for more information,
4 * https://www.drupal.org/node/2815083
9 function findElementByName(element, name) {
10 if (element.name === name) {
15 element.forEach(function (el) {
16 if (el.name === name) {
21 }, CKEDITOR.NODE_ELEMENT);
25 CKEDITOR.plugins.add('drupalimagecaption', {
26 requires: 'drupalimage',
28 beforeInit: function beforeInit(editor) {
29 editor.lang.image2.captionPlaceholder = '';
31 var placeholderText = editor.config.drupalImageCaption_captionPlaceholderText;
33 editor.on('widgetDefinition', function (event) {
34 var widgetDefinition = event.data;
35 if (widgetDefinition.name !== 'image') {
39 var captionFilterEnabled = editor.config.drupalImageCaption_captionFilterEnabled;
40 var alignFilterEnabled = editor.config.drupalImageCaption_alignFilterEnabled;
42 CKEDITOR.tools.extend(widgetDefinition.features, {
44 requiredContent: 'img[data-caption]'
47 requiredContent: 'img[data-align]'
51 var requiredContent = widgetDefinition.requiredContent.getDefinition();
52 requiredContent.attributes['data-align'] = '';
53 requiredContent.attributes['data-caption'] = '';
54 widgetDefinition.requiredContent = new CKEDITOR.style(requiredContent);
55 widgetDefinition.allowedContent.img.attributes['!data-align'] = true;
56 widgetDefinition.allowedContent.img.attributes['!data-caption'] = true;
58 widgetDefinition.editables.caption.allowedContent = 'a[!href]; em strong cite code br';
60 var originalDowncast = widgetDefinition.downcast;
61 widgetDefinition.downcast = function (element) {
62 var img = findElementByName(element, 'img');
63 originalDowncast.call(this, img);
65 var caption = this.editables.caption;
66 var captionHtml = caption && caption.getData();
67 var attrs = img.attributes;
69 if (captionFilterEnabled) {
71 attrs['data-caption'] = captionHtml;
74 if (alignFilterEnabled) {
75 if (this.data.align !== 'none') {
76 attrs['data-align'] = this.data.align;
80 if (img.parent.name === 'a') {
87 var originalUpcast = widgetDefinition.upcast;
88 widgetDefinition.upcast = function (element, data) {
89 if (element.name !== 'img' || !element.attributes['data-entity-type'] || !element.attributes['data-entity-uuid']) {
93 if (element.attributes['data-cke-realelement']) {
97 element = originalUpcast.call(this, element, data);
98 var attrs = element.attributes;
100 if (element.parent.name === 'a') {
101 element = element.parent;
104 var retElement = element;
105 var caption = void 0;
107 if (captionFilterEnabled) {
108 caption = attrs['data-caption'];
109 delete attrs['data-caption'];
111 if (alignFilterEnabled) {
112 data.align = attrs['data-align'];
113 delete attrs['data-align'];
115 data['data-entity-type'] = attrs['data-entity-type'];
116 delete attrs['data-entity-type'];
117 data['data-entity-uuid'] = attrs['data-entity-uuid'];
118 delete attrs['data-entity-uuid'];
120 if (captionFilterEnabled) {
121 if (element.parent.name === 'p' && caption) {
122 var index = element.getIndex();
123 var splitBefore = index > 0;
124 var splitAfter = index + 1 < element.parent.children.length;
127 element.parent.split(index);
129 index = element.getIndex();
131 element.parent.split(index + 1);
134 element.parent.replaceWith(element);
135 retElement = element;
139 var figure = new CKEDITOR.htmlParser.element('figure');
140 caption = new CKEDITOR.htmlParser.fragment.fromHtml(caption, 'figcaption');
142 caption.attributes['data-placeholder'] = placeholderText;
144 element.replaceWith(figure);
147 figure.attributes.class = editor.config.image2_captionedClass;
152 if (alignFilterEnabled) {
153 if (data.align === 'center' && (!captionFilterEnabled || !caption)) {
154 var p = new CKEDITOR.htmlParser.element('p');
155 element.replaceWith(p);
158 p.addClass(editor.config.image2_alignClasses[1]);
166 CKEDITOR.tools.extend(widgetDefinition._mapDataToDialog, {
168 'data-caption': 'data-caption',
169 hasCaption: 'hasCaption'
172 var originalCreateDialogSaveCallback = widgetDefinition._createDialogSaveCallback;
173 widgetDefinition._createDialogSaveCallback = function (editor, widget) {
174 var saveCallback = originalCreateDialogSaveCallback.call(this, editor, widget);
176 return function (dialogReturnValues) {
177 dialogReturnValues.attributes.hasCaption = !!dialogReturnValues.attributes.hasCaption;
179 var actualWidget = saveCallback(dialogReturnValues);
181 if (dialogReturnValues.attributes.hasCaption) {
182 actualWidget.editables.caption.setAttribute('data-placeholder', placeholderText);
184 var captionElement = actualWidget.editables.caption.$;
185 if (captionElement.childNodes.length === 1 && captionElement.childNodes.item(0).nodeName === 'BR') {
186 captionElement.removeChild(captionElement.childNodes.item(0));
193 afterInit: function afterInit(editor) {
194 var disableButtonIfOnWidget = function disableButtonIfOnWidget(evt) {
195 var widget = editor.widgets.focused;
196 if (widget && widget.name === 'image') {
197 this.setState(CKEDITOR.TRISTATE_DISABLED);
202 if (editor.plugins.justify && !editor.config.drupalImageCaption_alignFilterEnabled) {
204 var commands = ['justifyleft', 'justifycenter', 'justifyright', 'justifyblock'];
205 for (var n = 0; n < commands.length; n++) {
206 cmd = editor.getCommand(commands[n]);
207 cmd.contextSensitive = 1;
208 cmd.on('refresh', disableButtonIfOnWidget, null, null, 4);