plugin.js 7.2 KB

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