2 * DO NOT EDIT THIS FILE.
3 * See the following change record for more information,
4 * https://www.drupal.org/node/2815083
9 CKEDITOR.plugins.add('drupalimagecaption', {
10 requires: 'drupalimage',
12 beforeInit: function beforeInit(editor) {
13 editor.lang.image2.captionPlaceholder = '';
15 var placeholderText = editor.config.drupalImageCaption_captionPlaceholderText;
17 editor.on('widgetDefinition', function (event) {
18 var widgetDefinition = event.data;
19 if (widgetDefinition.name !== 'image') {
23 var captionFilterEnabled = editor.config.drupalImageCaption_captionFilterEnabled;
24 var alignFilterEnabled = editor.config.drupalImageCaption_alignFilterEnabled;
26 CKEDITOR.tools.extend(widgetDefinition.features, {
28 requiredContent: 'img[data-caption]'
31 requiredContent: 'img[data-align]'
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;
42 widgetDefinition.editables.caption.allowedContent = 'a[!href]; em strong cite code br';
44 var originalDowncast = widgetDefinition.downcast;
45 widgetDefinition.downcast = function (element) {
46 var img = findElementByName(element, 'img');
47 originalDowncast.call(this, img);
49 var caption = this.editables.caption;
50 var captionHtml = caption && caption.getData();
51 var attrs = img.attributes;
53 if (captionFilterEnabled) {
55 attrs['data-caption'] = captionHtml;
58 if (alignFilterEnabled) {
59 if (this.data.align !== 'none') {
60 attrs['data-align'] = this.data.align;
64 if (img.parent.name === 'a') {
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']) {
75 } else if (element.attributes['data-cke-realelement']) {
79 element = originalUpcast.call(this, element, data);
80 var attrs = element.attributes;
82 if (element.parent.name === 'a') {
83 element = element.parent;
86 var retElement = element;
89 if (captionFilterEnabled) {
90 caption = attrs['data-caption'];
91 delete attrs['data-caption'];
93 if (alignFilterEnabled) {
94 data.align = attrs['data-align'];
95 delete attrs['data-align'];
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'];
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;
109 element.parent.split(index);
111 index = element.getIndex();
113 element.parent.split(index + 1);
116 element.parent.replaceWith(element);
117 retElement = element;
121 var figure = new CKEDITOR.htmlParser.element('figure');
122 caption = new CKEDITOR.htmlParser.fragment.fromHtml(caption, 'figcaption');
124 caption.attributes['data-placeholder'] = placeholderText;
126 element.replaceWith(figure);
129 figure.attributes.class = editor.config.image2_captionedClass;
134 if (alignFilterEnabled) {
135 if (data.align === 'center' && (!captionFilterEnabled || !caption)) {
136 var p = new CKEDITOR.htmlParser.element('p');
137 element.replaceWith(p);
140 p.addClass(editor.config.image2_alignClasses[1]);
148 CKEDITOR.tools.extend(widgetDefinition._mapDataToDialog, {
150 'data-caption': 'data-caption',
151 hasCaption: 'hasCaption'
154 var originalCreateDialogSaveCallback = widgetDefinition._createDialogSaveCallback;
155 widgetDefinition._createDialogSaveCallback = function (editor, widget) {
156 var saveCallback = originalCreateDialogSaveCallback.call(this, editor, widget);
158 return function (dialogReturnValues) {
159 dialogReturnValues.attributes.hasCaption = !!dialogReturnValues.attributes.hasCaption;
161 var actualWidget = saveCallback(dialogReturnValues);
163 if (dialogReturnValues.attributes.hasCaption) {
164 actualWidget.editables.caption.setAttribute('data-placeholder', placeholderText);
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));
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);
184 if (editor.plugins.justify && !editor.config.drupalImageCaption_alignFilterEnabled) {
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);
196 function findElementByName(element, name) {
197 if (element.name === name) {
202 element.forEach(function (el) {
203 if (el.name === name) {
208 }, CKEDITOR.NODE_ELEMENT);