@ckeditor/ckeditor5-image 39.0.1 → 40.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/LICENSE.md +1 -1
  3. package/README.md +3 -3
  4. package/build/image.js +1 -1
  5. package/build/image.js.map +1 -0
  6. package/build/translations/pt-br.js +1 -1
  7. package/ckeditor5-metadata.json +12 -0
  8. package/lang/translations/ar.po +1 -0
  9. package/lang/translations/ast.po +1 -0
  10. package/lang/translations/az.po +1 -0
  11. package/lang/translations/bg.po +1 -0
  12. package/lang/translations/bn.po +1 -0
  13. package/lang/translations/bs.po +1 -0
  14. package/lang/translations/ca.po +1 -0
  15. package/lang/translations/cs.po +1 -0
  16. package/lang/translations/da.po +1 -0
  17. package/lang/translations/de-ch.po +1 -0
  18. package/lang/translations/de.po +1 -0
  19. package/lang/translations/el.po +1 -0
  20. package/lang/translations/en-au.po +1 -0
  21. package/lang/translations/en-gb.po +1 -0
  22. package/lang/translations/en.po +1 -0
  23. package/lang/translations/eo.po +1 -0
  24. package/lang/translations/es.po +1 -0
  25. package/lang/translations/et.po +1 -0
  26. package/lang/translations/eu.po +1 -0
  27. package/lang/translations/fa.po +1 -0
  28. package/lang/translations/fi.po +1 -0
  29. package/lang/translations/fr.po +1 -0
  30. package/lang/translations/gl.po +1 -0
  31. package/lang/translations/he.po +1 -0
  32. package/lang/translations/hi.po +1 -0
  33. package/lang/translations/hr.po +1 -0
  34. package/lang/translations/hu.po +1 -0
  35. package/lang/translations/id.po +1 -0
  36. package/lang/translations/it.po +1 -0
  37. package/lang/translations/ja.po +1 -0
  38. package/lang/translations/jv.po +1 -0
  39. package/lang/translations/km.po +1 -0
  40. package/lang/translations/kn.po +1 -0
  41. package/lang/translations/ko.po +1 -0
  42. package/lang/translations/ku.po +1 -0
  43. package/lang/translations/lt.po +1 -0
  44. package/lang/translations/lv.po +1 -0
  45. package/lang/translations/ms.po +1 -0
  46. package/lang/translations/nb.po +1 -0
  47. package/lang/translations/ne.po +1 -0
  48. package/lang/translations/nl.po +1 -0
  49. package/lang/translations/no.po +1 -0
  50. package/lang/translations/pl.po +1 -0
  51. package/lang/translations/pt-br.po +2 -1
  52. package/lang/translations/pt.po +1 -0
  53. package/lang/translations/ro.po +1 -0
  54. package/lang/translations/ru.po +1 -0
  55. package/lang/translations/si.po +1 -0
  56. package/lang/translations/sk.po +1 -0
  57. package/lang/translations/sq.po +1 -0
  58. package/lang/translations/sr-latn.po +1 -0
  59. package/lang/translations/sr.po +1 -0
  60. package/lang/translations/sv.po +1 -0
  61. package/lang/translations/th.po +1 -0
  62. package/lang/translations/tk.po +1 -0
  63. package/lang/translations/tr.po +1 -0
  64. package/lang/translations/tt.po +1 -0
  65. package/lang/translations/ug.po +1 -0
  66. package/lang/translations/uk.po +1 -0
  67. package/lang/translations/ur.po +1 -0
  68. package/lang/translations/uz.po +1 -0
  69. package/lang/translations/vi.po +1 -0
  70. package/lang/translations/zh-cn.po +1 -0
  71. package/lang/translations/zh.po +1 -0
  72. package/package.json +3 -7
  73. package/src/augmentation.d.ts +56 -55
  74. package/src/augmentation.js +5 -5
  75. package/src/autoimage.d.ts +52 -52
  76. package/src/autoimage.js +132 -132
  77. package/src/image/converters.d.ts +66 -66
  78. package/src/image/converters.js +232 -242
  79. package/src/image/imageblockediting.d.ts +58 -55
  80. package/src/image/imageblockediting.js +152 -136
  81. package/src/image/imageediting.d.ts +30 -30
  82. package/src/image/imageediting.js +63 -74
  83. package/src/image/imageinlineediting.d.ts +59 -56
  84. package/src/image/imageinlineediting.js +176 -160
  85. package/src/image/imageloadobserver.d.ts +48 -48
  86. package/src/image/imageloadobserver.js +52 -52
  87. package/src/image/imagetypecommand.d.ts +44 -40
  88. package/src/image/imagetypecommand.js +80 -77
  89. package/src/image/insertimagecommand.d.ts +66 -66
  90. package/src/image/insertimagecommand.js +120 -120
  91. package/src/image/replaceimagesourcecommand.d.ts +34 -34
  92. package/src/image/replaceimagesourcecommand.js +44 -44
  93. package/src/image/ui/utils.d.ts +25 -25
  94. package/src/image/ui/utils.js +44 -44
  95. package/src/image/utils.d.ts +64 -52
  96. package/src/image/utils.js +121 -100
  97. package/src/image.d.ts +34 -34
  98. package/src/image.js +38 -38
  99. package/src/imageblock.d.ts +33 -33
  100. package/src/imageblock.js +37 -37
  101. package/src/imagecaption/imagecaptionediting.d.ts +89 -89
  102. package/src/imagecaption/imagecaptionediting.js +225 -225
  103. package/src/imagecaption/imagecaptionui.d.ts +26 -26
  104. package/src/imagecaption/imagecaptionui.js +61 -61
  105. package/src/imagecaption/imagecaptionutils.d.ts +38 -38
  106. package/src/imagecaption/imagecaptionutils.js +62 -62
  107. package/src/imagecaption/toggleimagecaptioncommand.d.ts +66 -66
  108. package/src/imagecaption/toggleimagecaptioncommand.js +138 -138
  109. package/src/imagecaption.d.ts +26 -26
  110. package/src/imagecaption.js +30 -30
  111. package/src/imageconfig.d.ts +713 -713
  112. package/src/imageconfig.js +5 -5
  113. package/src/imageinline.d.ts +33 -33
  114. package/src/imageinline.js +37 -37
  115. package/src/imageinsert/imageinsertui.d.ts +44 -44
  116. package/src/imageinsert/imageinsertui.js +141 -141
  117. package/src/imageinsert/ui/imageinsertformrowview.d.ts +61 -61
  118. package/src/imageinsert/ui/imageinsertformrowview.js +54 -54
  119. package/src/imageinsert/ui/imageinsertpanelview.d.ts +106 -106
  120. package/src/imageinsert/ui/imageinsertpanelview.js +161 -161
  121. package/src/imageinsert/utils.d.ts +25 -25
  122. package/src/imageinsert/utils.js +58 -58
  123. package/src/imageinsert.d.ts +33 -33
  124. package/src/imageinsert.js +37 -37
  125. package/src/imageinsertviaurl.d.ts +30 -30
  126. package/src/imageinsertviaurl.js +34 -34
  127. package/src/imageresize/imageresizebuttons.d.ts +67 -67
  128. package/src/imageresize/imageresizebuttons.js +217 -217
  129. package/src/imageresize/imageresizeediting.d.ts +37 -37
  130. package/src/imageresize/imageresizeediting.js +165 -114
  131. package/src/imageresize/imageresizehandles.d.ts +31 -30
  132. package/src/imageresize/imageresizehandles.js +114 -107
  133. package/src/imageresize/resizeimagecommand.d.ts +42 -42
  134. package/src/imageresize/resizeimagecommand.js +63 -61
  135. package/src/imageresize.d.ts +27 -27
  136. package/src/imageresize.js +31 -31
  137. package/src/imagesizeattributes.d.ts +34 -0
  138. package/src/imagesizeattributes.js +143 -0
  139. package/src/imagestyle/converters.d.ts +24 -24
  140. package/src/imagestyle/converters.js +79 -79
  141. package/src/imagestyle/imagestylecommand.d.ts +68 -65
  142. package/src/imagestyle/imagestylecommand.js +107 -101
  143. package/src/imagestyle/imagestyleediting.d.ts +50 -50
  144. package/src/imagestyle/imagestyleediting.js +108 -108
  145. package/src/imagestyle/imagestyleui.d.ts +56 -56
  146. package/src/imagestyle/imagestyleui.js +192 -192
  147. package/src/imagestyle/utils.d.ts +101 -101
  148. package/src/imagestyle/utils.js +329 -329
  149. package/src/imagestyle.d.ts +32 -32
  150. package/src/imagestyle.js +36 -36
  151. package/src/imagetextalternative/imagetextalternativecommand.d.ts +34 -34
  152. package/src/imagetextalternative/imagetextalternativecommand.js +44 -44
  153. package/src/imagetextalternative/imagetextalternativeediting.d.ts +28 -28
  154. package/src/imagetextalternative/imagetextalternativeediting.js +35 -35
  155. package/src/imagetextalternative/imagetextalternativeui.d.ts +68 -68
  156. package/src/imagetextalternative/imagetextalternativeui.js +173 -173
  157. package/src/imagetextalternative/ui/textalternativeformview.d.ts +72 -72
  158. package/src/imagetextalternative/ui/textalternativeformview.js +121 -121
  159. package/src/imagetextalternative.d.ts +29 -29
  160. package/src/imagetextalternative.js +33 -33
  161. package/src/imagetoolbar.d.ts +35 -35
  162. package/src/imagetoolbar.js +57 -57
  163. package/src/imageupload/imageuploadediting.d.ts +111 -111
  164. package/src/imageupload/imageuploadediting.js +337 -335
  165. package/src/imageupload/imageuploadprogress.d.ts +42 -42
  166. package/src/imageupload/imageuploadprogress.js +211 -211
  167. package/src/imageupload/imageuploadui.d.ts +23 -23
  168. package/src/imageupload/imageuploadui.js +57 -57
  169. package/src/imageupload/uploadimagecommand.d.ts +60 -60
  170. package/src/imageupload/uploadimagecommand.js +100 -100
  171. package/src/imageupload/utils.d.ts +33 -33
  172. package/src/imageupload/utils.js +112 -112
  173. package/src/imageupload.d.ts +32 -32
  174. package/src/imageupload.js +36 -36
  175. package/src/imageutils.d.ts +125 -102
  176. package/src/imageutils.js +306 -248
  177. package/src/index.d.ts +48 -47
  178. package/src/index.js +39 -38
  179. package/src/pictureediting.d.ts +88 -88
  180. package/src/pictureediting.js +130 -130
  181. package/theme/image.css +38 -11
  182. package/theme/imageresize.css +5 -0
@@ -1,55 +1,58 @@
1
- /**
2
- * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
3
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
- */
5
- /**
6
- * @module image/image/imageblockediting
7
- */
8
- import { Plugin } from 'ckeditor5/src/core';
9
- import { ClipboardPipeline } from 'ckeditor5/src/clipboard';
10
- import ImageEditing from './imageediting';
11
- import ImageUtils from '../imageutils';
12
- /**
13
- * The image block plugin.
14
- *
15
- * It registers:
16
- *
17
- * * `<imageBlock>` as a block element in the document schema, and allows `alt`, `src` and `srcset` attributes.
18
- * * converters for editing and data pipelines.,
19
- * * {@link module:image/image/imagetypecommand~ImageTypeCommand `'imageTypeBlock'`} command that converts inline images into
20
- * block images.
21
- */
22
- export default class ImageBlockEditing extends Plugin {
23
- /**
24
- * @inheritDoc
25
- */
26
- static get requires(): readonly [typeof ImageEditing, typeof ImageUtils, typeof ClipboardPipeline];
27
- /**
28
- * @inheritDoc
29
- */
30
- static get pluginName(): "ImageBlockEditing";
31
- /**
32
- * @inheritDoc
33
- */
34
- init(): void;
35
- /**
36
- * Configures conversion pipelines to support upcasting and downcasting
37
- * block images (block image widgets) and their attributes.
38
- */
39
- private _setupConversion;
40
- /**
41
- * Integrates the plugin with the clipboard pipeline.
42
- *
43
- * Idea is that the feature should recognize the user's intent when an **inline** image is
44
- * pasted or dropped. If such an image is pasted/dropped:
45
- *
46
- * * into an empty block (e.g. an empty paragraph),
47
- * * on another object (e.g. some block widget).
48
- *
49
- * it gets converted into a block image on the fly. We assume this is the user's intent
50
- * if they decided to put their image there.
51
- *
52
- * See the `ImageInlineEditing` for the similar integration that works in the opposite direction.
53
- */
54
- private _setupClipboardIntegration;
55
- }
1
+ /**
2
+ * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
3
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
+ */
5
+ /**
6
+ * @module image/image/imageblockediting
7
+ */
8
+ import { Plugin } from 'ckeditor5/src/core';
9
+ import { ClipboardPipeline } from 'ckeditor5/src/clipboard';
10
+ import ImageEditing from './imageediting';
11
+ import ImageSizeAttributes from '../imagesizeattributes';
12
+ import ImageUtils from '../imageutils';
13
+ /**
14
+ * The image block plugin.
15
+ *
16
+ * It registers:
17
+ *
18
+ * * `<imageBlock>` as a block element in the document schema, and allows `alt`, `src` and `srcset` attributes.
19
+ * * converters for editing and data pipelines.,
20
+ * * {@link module:image/image/imagetypecommand~ImageTypeCommand `'imageTypeBlock'`} command that converts inline images into
21
+ * block images.
22
+ */
23
+ export default class ImageBlockEditing extends Plugin {
24
+ /**
25
+ * @inheritDoc
26
+ */
27
+ static get requires(): readonly [typeof ImageEditing, typeof ImageSizeAttributes, typeof ImageUtils, typeof ClipboardPipeline];
28
+ /**
29
+ * @inheritDoc
30
+ */
31
+ static get pluginName(): "ImageBlockEditing";
32
+ /**
33
+ * @inheritDoc
34
+ */
35
+ init(): void;
36
+ /**
37
+ * Configures conversion pipelines to support upcasting and downcasting
38
+ * block images (block image widgets) and their attributes.
39
+ */
40
+ private _setupConversion;
41
+ /**
42
+ * Integrates the plugin with the clipboard pipeline.
43
+ *
44
+ * Idea is that the feature should recognize the user's intent when an **inline** image is
45
+ * pasted or dropped. If such an image is pasted/dropped:
46
+ *
47
+ * * into an empty block (e.g. an empty paragraph),
48
+ * * on another object (e.g. some block widget).
49
+ *
50
+ * it gets converted into a block image on the fly. We assume this is the user's intent
51
+ * if they decided to put their image there.
52
+ *
53
+ * See the `ImageInlineEditing` for the similar integration that works in the opposite direction.
54
+ *
55
+ * The feature also sets image `width` and `height` attributes on paste.
56
+ */
57
+ private _setupClipboardIntegration;
58
+ }
@@ -1,136 +1,152 @@
1
- /**
2
- * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
3
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
- */
5
- /**
6
- * @module image/image/imageblockediting
7
- */
8
- import { Plugin } from 'ckeditor5/src/core';
9
- import { ClipboardPipeline } from 'ckeditor5/src/clipboard';
10
- import { UpcastWriter } from 'ckeditor5/src/engine';
11
- import { downcastImageAttribute, downcastSrcsetAttribute, upcastImageFigure } from './converters';
12
- import ImageEditing from './imageediting';
13
- import ImageTypeCommand from './imagetypecommand';
14
- import ImageUtils from '../imageutils';
15
- import { getImgViewElementMatcher, createBlockImageViewElement, determineImageTypeForInsertionAtSelection } from '../image/utils';
16
- /**
17
- * The image block plugin.
18
- *
19
- * It registers:
20
- *
21
- * * `<imageBlock>` as a block element in the document schema, and allows `alt`, `src` and `srcset` attributes.
22
- * * converters for editing and data pipelines.,
23
- * * {@link module:image/image/imagetypecommand~ImageTypeCommand `'imageTypeBlock'`} command that converts inline images into
24
- * block images.
25
- */
26
- export default class ImageBlockEditing extends Plugin {
27
- /**
28
- * @inheritDoc
29
- */
30
- static get requires() {
31
- return [ImageEditing, ImageUtils, ClipboardPipeline];
32
- }
33
- /**
34
- * @inheritDoc
35
- */
36
- static get pluginName() {
37
- return 'ImageBlockEditing';
38
- }
39
- /**
40
- * @inheritDoc
41
- */
42
- init() {
43
- const editor = this.editor;
44
- const schema = editor.model.schema;
45
- // Converters 'alt' and 'srcset' are added in 'ImageEditing' plugin.
46
- schema.register('imageBlock', {
47
- inheritAllFrom: '$blockObject',
48
- allowAttributes: ['alt', 'src', 'srcset']
49
- });
50
- this._setupConversion();
51
- if (editor.plugins.has('ImageInlineEditing')) {
52
- editor.commands.add('imageTypeBlock', new ImageTypeCommand(this.editor, 'imageBlock'));
53
- this._setupClipboardIntegration();
54
- }
55
- }
56
- /**
57
- * Configures conversion pipelines to support upcasting and downcasting
58
- * block images (block image widgets) and their attributes.
59
- */
60
- _setupConversion() {
61
- const editor = this.editor;
62
- const t = editor.t;
63
- const conversion = editor.conversion;
64
- const imageUtils = editor.plugins.get('ImageUtils');
65
- conversion.for('dataDowncast')
66
- .elementToStructure({
67
- model: 'imageBlock',
68
- view: (modelElement, { writer }) => createBlockImageViewElement(writer)
69
- });
70
- conversion.for('editingDowncast')
71
- .elementToStructure({
72
- model: 'imageBlock',
73
- view: (modelElement, { writer }) => imageUtils.toImageWidget(createBlockImageViewElement(writer), writer, t('image widget'))
74
- });
75
- conversion.for('downcast')
76
- .add(downcastImageAttribute(imageUtils, 'imageBlock', 'src'))
77
- .add(downcastImageAttribute(imageUtils, 'imageBlock', 'alt'))
78
- .add(downcastSrcsetAttribute(imageUtils, 'imageBlock'));
79
- // More image related upcasts are in 'ImageEditing' plugin.
80
- conversion.for('upcast')
81
- .elementToElement({
82
- view: getImgViewElementMatcher(editor, 'imageBlock'),
83
- model: (viewImage, { writer }) => writer.createElement('imageBlock', viewImage.hasAttribute('src') ? { src: viewImage.getAttribute('src') } : undefined)
84
- })
85
- .add(upcastImageFigure(imageUtils));
86
- }
87
- /**
88
- * Integrates the plugin with the clipboard pipeline.
89
- *
90
- * Idea is that the feature should recognize the user's intent when an **inline** image is
91
- * pasted or dropped. If such an image is pasted/dropped:
92
- *
93
- * * into an empty block (e.g. an empty paragraph),
94
- * * on another object (e.g. some block widget).
95
- *
96
- * it gets converted into a block image on the fly. We assume this is the user's intent
97
- * if they decided to put their image there.
98
- *
99
- * See the `ImageInlineEditing` for the similar integration that works in the opposite direction.
100
- */
101
- _setupClipboardIntegration() {
102
- const editor = this.editor;
103
- const model = editor.model;
104
- const editingView = editor.editing.view;
105
- const imageUtils = editor.plugins.get('ImageUtils');
106
- const clipboardPipeline = editor.plugins.get('ClipboardPipeline');
107
- this.listenTo(clipboardPipeline, 'inputTransformation', (evt, data) => {
108
- const docFragmentChildren = Array.from(data.content.getChildren());
109
- let modelRange;
110
- // Make sure only <img> elements are dropped or pasted. Otherwise, if there some other HTML
111
- // mixed up, this should be handled as a regular paste.
112
- if (!docFragmentChildren.every(imageUtils.isInlineImageView)) {
113
- return;
114
- }
115
- // When drag and dropping, data.targetRanges specifies where to drop because
116
- // this is usually a different place than the current model selection (the user
117
- // uses a drop marker to specify the drop location).
118
- if (data.targetRanges) {
119
- modelRange = editor.editing.mapper.toModelRange(data.targetRanges[0]);
120
- }
121
- // Pasting, however, always occurs at the current model selection.
122
- else {
123
- modelRange = model.document.selection.getFirstRange();
124
- }
125
- const selection = model.createSelection(modelRange);
126
- // Convert inline images into block images only when the currently selected block is empty
127
- // (e.g. an empty paragraph) or some object is selected (to replace it).
128
- if (determineImageTypeForInsertionAtSelection(model.schema, selection) === 'imageBlock') {
129
- const writer = new UpcastWriter(editingView.document);
130
- // Wrap <img ... /> -> <figure class="image"><img .../></figure>
131
- const blockViewImages = docFragmentChildren.map(inlineViewImage => writer.createElement('figure', { class: 'image' }, inlineViewImage));
132
- data.content = writer.createDocumentFragment(blockViewImages);
133
- }
134
- });
135
- }
136
- }
1
+ /**
2
+ * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
3
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
+ */
5
+ /**
6
+ * @module image/image/imageblockediting
7
+ */
8
+ import { Plugin } from 'ckeditor5/src/core';
9
+ import { ClipboardPipeline } from 'ckeditor5/src/clipboard';
10
+ import { UpcastWriter } from 'ckeditor5/src/engine';
11
+ import { downcastImageAttribute, downcastSrcsetAttribute, upcastImageFigure } from './converters';
12
+ import ImageEditing from './imageediting';
13
+ import ImageSizeAttributes from '../imagesizeattributes';
14
+ import ImageTypeCommand from './imagetypecommand';
15
+ import ImageUtils from '../imageutils';
16
+ import { getImgViewElementMatcher, createBlockImageViewElement, determineImageTypeForInsertionAtSelection } from '../image/utils';
17
+ /**
18
+ * The image block plugin.
19
+ *
20
+ * It registers:
21
+ *
22
+ * * `<imageBlock>` as a block element in the document schema, and allows `alt`, `src` and `srcset` attributes.
23
+ * * converters for editing and data pipelines.,
24
+ * * {@link module:image/image/imagetypecommand~ImageTypeCommand `'imageTypeBlock'`} command that converts inline images into
25
+ * block images.
26
+ */
27
+ export default class ImageBlockEditing extends Plugin {
28
+ /**
29
+ * @inheritDoc
30
+ */
31
+ static get requires() {
32
+ return [ImageEditing, ImageSizeAttributes, ImageUtils, ClipboardPipeline];
33
+ }
34
+ /**
35
+ * @inheritDoc
36
+ */
37
+ static get pluginName() {
38
+ return 'ImageBlockEditing';
39
+ }
40
+ /**
41
+ * @inheritDoc
42
+ */
43
+ init() {
44
+ const editor = this.editor;
45
+ const schema = editor.model.schema;
46
+ // Converters 'alt' and 'srcset' are added in 'ImageEditing' plugin.
47
+ schema.register('imageBlock', {
48
+ inheritAllFrom: '$blockObject',
49
+ allowAttributes: ['alt', 'src', 'srcset']
50
+ });
51
+ this._setupConversion();
52
+ if (editor.plugins.has('ImageInlineEditing')) {
53
+ editor.commands.add('imageTypeBlock', new ImageTypeCommand(this.editor, 'imageBlock'));
54
+ this._setupClipboardIntegration();
55
+ }
56
+ }
57
+ /**
58
+ * Configures conversion pipelines to support upcasting and downcasting
59
+ * block images (block image widgets) and their attributes.
60
+ */
61
+ _setupConversion() {
62
+ const editor = this.editor;
63
+ const t = editor.t;
64
+ const conversion = editor.conversion;
65
+ const imageUtils = editor.plugins.get('ImageUtils');
66
+ conversion.for('dataDowncast')
67
+ .elementToStructure({
68
+ model: 'imageBlock',
69
+ view: (modelElement, { writer }) => createBlockImageViewElement(writer)
70
+ });
71
+ conversion.for('editingDowncast')
72
+ .elementToStructure({
73
+ model: 'imageBlock',
74
+ view: (modelElement, { writer }) => imageUtils.toImageWidget(createBlockImageViewElement(writer), writer, t('image widget'))
75
+ });
76
+ conversion.for('downcast')
77
+ .add(downcastImageAttribute(imageUtils, 'imageBlock', 'src'))
78
+ .add(downcastImageAttribute(imageUtils, 'imageBlock', 'alt'))
79
+ .add(downcastSrcsetAttribute(imageUtils, 'imageBlock'));
80
+ // More image related upcasts are in 'ImageEditing' plugin.
81
+ conversion.for('upcast')
82
+ .elementToElement({
83
+ view: getImgViewElementMatcher(editor, 'imageBlock'),
84
+ model: (viewImage, { writer }) => writer.createElement('imageBlock', viewImage.hasAttribute('src') ? { src: viewImage.getAttribute('src') } : undefined)
85
+ })
86
+ .add(upcastImageFigure(imageUtils));
87
+ }
88
+ /**
89
+ * Integrates the plugin with the clipboard pipeline.
90
+ *
91
+ * Idea is that the feature should recognize the user's intent when an **inline** image is
92
+ * pasted or dropped. If such an image is pasted/dropped:
93
+ *
94
+ * * into an empty block (e.g. an empty paragraph),
95
+ * * on another object (e.g. some block widget).
96
+ *
97
+ * it gets converted into a block image on the fly. We assume this is the user's intent
98
+ * if they decided to put their image there.
99
+ *
100
+ * See the `ImageInlineEditing` for the similar integration that works in the opposite direction.
101
+ *
102
+ * The feature also sets image `width` and `height` attributes on paste.
103
+ */
104
+ _setupClipboardIntegration() {
105
+ const editor = this.editor;
106
+ const model = editor.model;
107
+ const editingView = editor.editing.view;
108
+ const imageUtils = editor.plugins.get('ImageUtils');
109
+ const clipboardPipeline = editor.plugins.get('ClipboardPipeline');
110
+ this.listenTo(clipboardPipeline, 'inputTransformation', (evt, data) => {
111
+ const docFragmentChildren = Array.from(data.content.getChildren());
112
+ let modelRange;
113
+ // Make sure only <img> elements are dropped or pasted. Otherwise, if there some other HTML
114
+ // mixed up, this should be handled as a regular paste.
115
+ if (!docFragmentChildren.every(imageUtils.isInlineImageView)) {
116
+ return;
117
+ }
118
+ // When drag and dropping, data.targetRanges specifies where to drop because
119
+ // this is usually a different place than the current model selection (the user
120
+ // uses a drop marker to specify the drop location).
121
+ if (data.targetRanges) {
122
+ modelRange = editor.editing.mapper.toModelRange(data.targetRanges[0]);
123
+ }
124
+ // Pasting, however, always occurs at the current model selection.
125
+ else {
126
+ modelRange = model.document.selection.getFirstRange();
127
+ }
128
+ const selection = model.createSelection(modelRange);
129
+ // Convert inline images into block images only when the currently selected block is empty
130
+ // (e.g. an empty paragraph) or some object is selected (to replace it).
131
+ if (determineImageTypeForInsertionAtSelection(model.schema, selection) === 'imageBlock') {
132
+ const writer = new UpcastWriter(editingView.document);
133
+ // Wrap <img ... /> -> <figure class="image"><img .../></figure>
134
+ const blockViewImages = docFragmentChildren.map(inlineViewImage => writer.createElement('figure', { class: 'image' }, inlineViewImage));
135
+ data.content = writer.createDocumentFragment(blockViewImages);
136
+ }
137
+ });
138
+ this.listenTo(clipboardPipeline, 'contentInsertion', (evt, data) => {
139
+ if (data.method !== 'paste') {
140
+ return;
141
+ }
142
+ model.change(writer => {
143
+ const range = writer.createRangeIn(data.content);
144
+ for (const item of range.getItems()) {
145
+ if (item.is('element', 'imageBlock')) {
146
+ imageUtils.setImageNaturalSizeAttributes(item);
147
+ }
148
+ }
149
+ });
150
+ });
151
+ }
152
+ }
@@ -1,30 +1,30 @@
1
- /**
2
- * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
3
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
- */
5
- /**
6
- * @module image/image/imageediting
7
- */
8
- import { Plugin } from 'ckeditor5/src/core';
9
- import ImageUtils from '../imageutils';
10
- /**
11
- * The image engine plugin. This module loads common code shared between
12
- * {@link module:image/image/imageinlineediting~ImageInlineEditing} and
13
- * {@link module:image/image/imageblockediting~ImageBlockEditing} plugins.
14
- *
15
- * This plugin registers the {@link module:image/image/insertimagecommand~InsertImageCommand 'insertImage'} command.
16
- */
17
- export default class ImageEditing extends Plugin {
18
- /**
19
- * @inheritDoc
20
- */
21
- static get requires(): readonly [typeof ImageUtils];
22
- /**
23
- * @inheritDoc
24
- */
25
- static get pluginName(): "ImageEditing";
26
- /**
27
- * @inheritDoc
28
- */
29
- init(): void;
30
- }
1
+ /**
2
+ * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
3
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
+ */
5
+ /**
6
+ * @module image/image/imageediting
7
+ */
8
+ import { Plugin } from 'ckeditor5/src/core';
9
+ import ImageUtils from '../imageutils';
10
+ /**
11
+ * The image engine plugin. This module loads common code shared between
12
+ * {@link module:image/image/imageinlineediting~ImageInlineEditing} and
13
+ * {@link module:image/image/imageblockediting~ImageBlockEditing} plugins.
14
+ *
15
+ * This plugin registers the {@link module:image/image/insertimagecommand~InsertImageCommand 'insertImage'} command.
16
+ */
17
+ export default class ImageEditing extends Plugin {
18
+ /**
19
+ * @inheritDoc
20
+ */
21
+ static get requires(): readonly [typeof ImageUtils];
22
+ /**
23
+ * @inheritDoc
24
+ */
25
+ static get pluginName(): "ImageEditing";
26
+ /**
27
+ * @inheritDoc
28
+ */
29
+ init(): void;
30
+ }
@@ -1,74 +1,63 @@
1
- /**
2
- * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
3
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
- */
5
- /**
6
- * @module image/image/imageediting
7
- */
8
- import { Plugin } from 'ckeditor5/src/core';
9
- import ImageLoadObserver from './imageloadobserver';
10
- import InsertImageCommand from './insertimagecommand';
11
- import ReplaceImageSourceCommand from './replaceimagesourcecommand';
12
- import ImageUtils from '../imageutils';
13
- /**
14
- * The image engine plugin. This module loads common code shared between
15
- * {@link module:image/image/imageinlineediting~ImageInlineEditing} and
16
- * {@link module:image/image/imageblockediting~ImageBlockEditing} plugins.
17
- *
18
- * This plugin registers the {@link module:image/image/insertimagecommand~InsertImageCommand 'insertImage'} command.
19
- */
20
- export default class ImageEditing extends Plugin {
21
- /**
22
- * @inheritDoc
23
- */
24
- static get requires() {
25
- return [ImageUtils];
26
- }
27
- /**
28
- * @inheritDoc
29
- */
30
- static get pluginName() {
31
- return 'ImageEditing';
32
- }
33
- /**
34
- * @inheritDoc
35
- */
36
- init() {
37
- const editor = this.editor;
38
- const conversion = editor.conversion;
39
- // See https://github.com/ckeditor/ckeditor5-image/issues/142.
40
- editor.editing.view.addObserver(ImageLoadObserver);
41
- conversion.for('upcast')
42
- .attributeToAttribute({
43
- view: {
44
- name: 'img',
45
- key: 'alt'
46
- },
47
- model: 'alt'
48
- })
49
- .attributeToAttribute({
50
- view: {
51
- name: 'img',
52
- key: 'srcset'
53
- },
54
- model: {
55
- key: 'srcset',
56
- value: (viewImage) => {
57
- const value = {
58
- data: viewImage.getAttribute('srcset')
59
- };
60
- if (viewImage.hasAttribute('width')) {
61
- value.width = viewImage.getAttribute('width');
62
- }
63
- return value;
64
- }
65
- }
66
- });
67
- const insertImageCommand = new InsertImageCommand(editor);
68
- const replaceImageSourceCommand = new ReplaceImageSourceCommand(editor);
69
- editor.commands.add('insertImage', insertImageCommand);
70
- editor.commands.add('replaceImageSource', replaceImageSourceCommand);
71
- // `imageInsert` is an alias for backward compatibility.
72
- editor.commands.add('imageInsert', insertImageCommand);
73
- }
74
- }
1
+ /**
2
+ * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved.
3
+ * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
4
+ */
5
+ /**
6
+ * @module image/image/imageediting
7
+ */
8
+ import { Plugin } from 'ckeditor5/src/core';
9
+ import ImageLoadObserver from './imageloadobserver';
10
+ import InsertImageCommand from './insertimagecommand';
11
+ import ReplaceImageSourceCommand from './replaceimagesourcecommand';
12
+ import ImageUtils from '../imageutils';
13
+ /**
14
+ * The image engine plugin. This module loads common code shared between
15
+ * {@link module:image/image/imageinlineediting~ImageInlineEditing} and
16
+ * {@link module:image/image/imageblockediting~ImageBlockEditing} plugins.
17
+ *
18
+ * This plugin registers the {@link module:image/image/insertimagecommand~InsertImageCommand 'insertImage'} command.
19
+ */
20
+ export default class ImageEditing extends Plugin {
21
+ /**
22
+ * @inheritDoc
23
+ */
24
+ static get requires() {
25
+ return [ImageUtils];
26
+ }
27
+ /**
28
+ * @inheritDoc
29
+ */
30
+ static get pluginName() {
31
+ return 'ImageEditing';
32
+ }
33
+ /**
34
+ * @inheritDoc
35
+ */
36
+ init() {
37
+ const editor = this.editor;
38
+ const conversion = editor.conversion;
39
+ // See https://github.com/ckeditor/ckeditor5-image/issues/142.
40
+ editor.editing.view.addObserver(ImageLoadObserver);
41
+ conversion.for('upcast')
42
+ .attributeToAttribute({
43
+ view: {
44
+ name: 'img',
45
+ key: 'alt'
46
+ },
47
+ model: 'alt'
48
+ })
49
+ .attributeToAttribute({
50
+ view: {
51
+ name: 'img',
52
+ key: 'srcset'
53
+ },
54
+ model: 'srcset'
55
+ });
56
+ const insertImageCommand = new InsertImageCommand(editor);
57
+ const replaceImageSourceCommand = new ReplaceImageSourceCommand(editor);
58
+ editor.commands.add('insertImage', insertImageCommand);
59
+ editor.commands.add('replaceImageSource', replaceImageSourceCommand);
60
+ // `imageInsert` is an alias for backward compatibility.
61
+ editor.commands.add('imageInsert', insertImageCommand);
62
+ }
63
+ }