@ckeditor/ckeditor5-image 0.0.0-internal-20241017.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 (526) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/LICENSE.md +21 -0
  3. package/README.md +26 -0
  4. package/build/image.js +5 -0
  5. package/build/translations/ar.js +1 -0
  6. package/build/translations/ast.js +1 -0
  7. package/build/translations/az.js +1 -0
  8. package/build/translations/bg.js +1 -0
  9. package/build/translations/bn.js +1 -0
  10. package/build/translations/bs.js +1 -0
  11. package/build/translations/ca.js +1 -0
  12. package/build/translations/cs.js +1 -0
  13. package/build/translations/da.js +1 -0
  14. package/build/translations/de-ch.js +1 -0
  15. package/build/translations/de.js +1 -0
  16. package/build/translations/el.js +1 -0
  17. package/build/translations/en-au.js +1 -0
  18. package/build/translations/en-gb.js +1 -0
  19. package/build/translations/eo.js +1 -0
  20. package/build/translations/es.js +1 -0
  21. package/build/translations/et.js +1 -0
  22. package/build/translations/eu.js +1 -0
  23. package/build/translations/fa.js +1 -0
  24. package/build/translations/fi.js +1 -0
  25. package/build/translations/fr.js +1 -0
  26. package/build/translations/gl.js +1 -0
  27. package/build/translations/he.js +1 -0
  28. package/build/translations/hi.js +1 -0
  29. package/build/translations/hr.js +1 -0
  30. package/build/translations/hu.js +1 -0
  31. package/build/translations/id.js +1 -0
  32. package/build/translations/it.js +1 -0
  33. package/build/translations/ja.js +1 -0
  34. package/build/translations/jv.js +1 -0
  35. package/build/translations/km.js +1 -0
  36. package/build/translations/kn.js +1 -0
  37. package/build/translations/ko.js +1 -0
  38. package/build/translations/ku.js +1 -0
  39. package/build/translations/lt.js +1 -0
  40. package/build/translations/lv.js +1 -0
  41. package/build/translations/ms.js +1 -0
  42. package/build/translations/nb.js +1 -0
  43. package/build/translations/ne.js +1 -0
  44. package/build/translations/nl.js +1 -0
  45. package/build/translations/no.js +1 -0
  46. package/build/translations/pl.js +1 -0
  47. package/build/translations/pt-br.js +1 -0
  48. package/build/translations/pt.js +1 -0
  49. package/build/translations/ro.js +1 -0
  50. package/build/translations/ru.js +1 -0
  51. package/build/translations/si.js +1 -0
  52. package/build/translations/sk.js +1 -0
  53. package/build/translations/sq.js +1 -0
  54. package/build/translations/sr-latn.js +1 -0
  55. package/build/translations/sr.js +1 -0
  56. package/build/translations/sv.js +1 -0
  57. package/build/translations/th.js +1 -0
  58. package/build/translations/ti.js +1 -0
  59. package/build/translations/tk.js +1 -0
  60. package/build/translations/tr.js +1 -0
  61. package/build/translations/ug.js +1 -0
  62. package/build/translations/uk.js +1 -0
  63. package/build/translations/ur.js +1 -0
  64. package/build/translations/uz.js +1 -0
  65. package/build/translations/vi.js +1 -0
  66. package/build/translations/zh-cn.js +1 -0
  67. package/build/translations/zh.js +1 -0
  68. package/ckeditor5-metadata.json +270 -0
  69. package/dist/augmentation.d.ts +61 -0
  70. package/dist/autoimage.d.ts +60 -0
  71. package/dist/image/converters.d.ts +70 -0
  72. package/dist/image/imageblockediting.d.ts +67 -0
  73. package/dist/image/imageediting.d.ts +38 -0
  74. package/dist/image/imageinlineediting.d.ts +68 -0
  75. package/dist/image/imageloadobserver.d.ts +52 -0
  76. package/dist/image/imageplaceholder.d.ts +47 -0
  77. package/dist/image/imagetypecommand.d.ts +48 -0
  78. package/dist/image/insertimagecommand.d.ts +72 -0
  79. package/dist/image/replaceimagesourcecommand.d.ts +55 -0
  80. package/dist/image/ui/utils.d.ts +29 -0
  81. package/dist/image/utils.d.ts +68 -0
  82. package/dist/image.d.ts +42 -0
  83. package/dist/imageblock.d.ts +42 -0
  84. package/dist/imagecaption/imagecaptionediting.d.ts +97 -0
  85. package/dist/imagecaption/imagecaptionui.d.ts +34 -0
  86. package/dist/imagecaption/imagecaptionutils.d.ts +46 -0
  87. package/dist/imagecaption/toggleimagecaptioncommand.d.ts +70 -0
  88. package/dist/imagecaption.d.ts +34 -0
  89. package/dist/imageconfig.d.ts +716 -0
  90. package/dist/imageinline.d.ts +42 -0
  91. package/dist/imageinsert/imageinsertui.d.ts +90 -0
  92. package/dist/imageinsert/imageinsertviaurlui.d.ts +74 -0
  93. package/dist/imageinsert/ui/imageinsertformview.d.ts +60 -0
  94. package/dist/imageinsert/ui/imageinserturlview.d.ts +68 -0
  95. package/dist/imageinsert.d.ts +41 -0
  96. package/dist/imageinsertviaurl.d.ts +39 -0
  97. package/dist/imageresize/imagecustomresizeui.d.ts +69 -0
  98. package/dist/imageresize/imageresizebuttons.d.ts +72 -0
  99. package/dist/imageresize/imageresizeediting.d.ts +49 -0
  100. package/dist/imageresize/imageresizehandles.d.ts +39 -0
  101. package/dist/imageresize/resizeimagecommand.d.ts +46 -0
  102. package/dist/imageresize/ui/imagecustomresizeformview.d.ts +133 -0
  103. package/dist/imageresize/utils/getselectedimageeditornodes.d.ts +28 -0
  104. package/dist/imageresize/utils/getselectedimagepossibleresizerange.d.ts +28 -0
  105. package/dist/imageresize/utils/getselectedimagewidthinunits.d.ts +22 -0
  106. package/dist/imageresize/utils/tryparsedimensionwithunit.d.ts +41 -0
  107. package/dist/imageresize.d.ts +36 -0
  108. package/dist/imagesizeattributes.d.ts +42 -0
  109. package/dist/imagestyle/converters.d.ts +28 -0
  110. package/dist/imagestyle/imagestylecommand.d.ts +72 -0
  111. package/dist/imagestyle/imagestyleediting.d.ts +58 -0
  112. package/dist/imagestyle/imagestyleui.d.ts +64 -0
  113. package/dist/imagestyle/utils.d.ts +105 -0
  114. package/dist/imagestyle.d.ts +40 -0
  115. package/dist/imagetextalternative/imagetextalternativecommand.d.ts +38 -0
  116. package/dist/imagetextalternative/imagetextalternativeediting.d.ts +36 -0
  117. package/dist/imagetextalternative/imagetextalternativeui.d.ts +76 -0
  118. package/dist/imagetextalternative/ui/textalternativeformview.d.ts +94 -0
  119. package/dist/imagetextalternative.d.ts +37 -0
  120. package/dist/imagetoolbar.d.ts +43 -0
  121. package/dist/imageupload/imageuploadediting.d.ts +119 -0
  122. package/dist/imageupload/imageuploadprogress.d.ts +50 -0
  123. package/dist/imageupload/imageuploadui.d.ts +55 -0
  124. package/dist/imageupload/uploadimagecommand.d.ts +78 -0
  125. package/dist/imageupload/utils.d.ts +37 -0
  126. package/dist/imageupload.d.ts +40 -0
  127. package/dist/imageutils.d.ts +133 -0
  128. package/dist/index-content.css +150 -0
  129. package/dist/index-editor.css +248 -0
  130. package/dist/index.css +579 -0
  131. package/dist/index.css.map +1 -0
  132. package/dist/index.d.ts +54 -0
  133. package/dist/index.js +6383 -0
  134. package/dist/index.js.map +1 -0
  135. package/dist/pictureediting.d.ts +96 -0
  136. package/dist/translations/ar.d.ts +8 -0
  137. package/dist/translations/ar.js +5 -0
  138. package/dist/translations/ar.umd.js +11 -0
  139. package/dist/translations/ast.d.ts +8 -0
  140. package/dist/translations/ast.js +5 -0
  141. package/dist/translations/ast.umd.js +11 -0
  142. package/dist/translations/az.d.ts +8 -0
  143. package/dist/translations/az.js +5 -0
  144. package/dist/translations/az.umd.js +11 -0
  145. package/dist/translations/bg.d.ts +8 -0
  146. package/dist/translations/bg.js +5 -0
  147. package/dist/translations/bg.umd.js +11 -0
  148. package/dist/translations/bn.d.ts +8 -0
  149. package/dist/translations/bn.js +5 -0
  150. package/dist/translations/bn.umd.js +11 -0
  151. package/dist/translations/bs.d.ts +8 -0
  152. package/dist/translations/bs.js +5 -0
  153. package/dist/translations/bs.umd.js +11 -0
  154. package/dist/translations/ca.d.ts +8 -0
  155. package/dist/translations/ca.js +5 -0
  156. package/dist/translations/ca.umd.js +11 -0
  157. package/dist/translations/cs.d.ts +8 -0
  158. package/dist/translations/cs.js +5 -0
  159. package/dist/translations/cs.umd.js +11 -0
  160. package/dist/translations/da.d.ts +8 -0
  161. package/dist/translations/da.js +5 -0
  162. package/dist/translations/da.umd.js +11 -0
  163. package/dist/translations/de-ch.d.ts +8 -0
  164. package/dist/translations/de-ch.js +5 -0
  165. package/dist/translations/de-ch.umd.js +11 -0
  166. package/dist/translations/de.d.ts +8 -0
  167. package/dist/translations/de.js +5 -0
  168. package/dist/translations/de.umd.js +11 -0
  169. package/dist/translations/el.d.ts +8 -0
  170. package/dist/translations/el.js +5 -0
  171. package/dist/translations/el.umd.js +11 -0
  172. package/dist/translations/en-au.d.ts +8 -0
  173. package/dist/translations/en-au.js +5 -0
  174. package/dist/translations/en-au.umd.js +11 -0
  175. package/dist/translations/en-gb.d.ts +8 -0
  176. package/dist/translations/en-gb.js +5 -0
  177. package/dist/translations/en-gb.umd.js +11 -0
  178. package/dist/translations/en.d.ts +8 -0
  179. package/dist/translations/en.js +5 -0
  180. package/dist/translations/en.umd.js +11 -0
  181. package/dist/translations/eo.d.ts +8 -0
  182. package/dist/translations/eo.js +5 -0
  183. package/dist/translations/eo.umd.js +11 -0
  184. package/dist/translations/es.d.ts +8 -0
  185. package/dist/translations/es.js +5 -0
  186. package/dist/translations/es.umd.js +11 -0
  187. package/dist/translations/et.d.ts +8 -0
  188. package/dist/translations/et.js +5 -0
  189. package/dist/translations/et.umd.js +11 -0
  190. package/dist/translations/eu.d.ts +8 -0
  191. package/dist/translations/eu.js +5 -0
  192. package/dist/translations/eu.umd.js +11 -0
  193. package/dist/translations/fa.d.ts +8 -0
  194. package/dist/translations/fa.js +5 -0
  195. package/dist/translations/fa.umd.js +11 -0
  196. package/dist/translations/fi.d.ts +8 -0
  197. package/dist/translations/fi.js +5 -0
  198. package/dist/translations/fi.umd.js +11 -0
  199. package/dist/translations/fr.d.ts +8 -0
  200. package/dist/translations/fr.js +5 -0
  201. package/dist/translations/fr.umd.js +11 -0
  202. package/dist/translations/gl.d.ts +8 -0
  203. package/dist/translations/gl.js +5 -0
  204. package/dist/translations/gl.umd.js +11 -0
  205. package/dist/translations/he.d.ts +8 -0
  206. package/dist/translations/he.js +5 -0
  207. package/dist/translations/he.umd.js +11 -0
  208. package/dist/translations/hi.d.ts +8 -0
  209. package/dist/translations/hi.js +5 -0
  210. package/dist/translations/hi.umd.js +11 -0
  211. package/dist/translations/hr.d.ts +8 -0
  212. package/dist/translations/hr.js +5 -0
  213. package/dist/translations/hr.umd.js +11 -0
  214. package/dist/translations/hu.d.ts +8 -0
  215. package/dist/translations/hu.js +5 -0
  216. package/dist/translations/hu.umd.js +11 -0
  217. package/dist/translations/id.d.ts +8 -0
  218. package/dist/translations/id.js +5 -0
  219. package/dist/translations/id.umd.js +11 -0
  220. package/dist/translations/it.d.ts +8 -0
  221. package/dist/translations/it.js +5 -0
  222. package/dist/translations/it.umd.js +11 -0
  223. package/dist/translations/ja.d.ts +8 -0
  224. package/dist/translations/ja.js +5 -0
  225. package/dist/translations/ja.umd.js +11 -0
  226. package/dist/translations/jv.d.ts +8 -0
  227. package/dist/translations/jv.js +5 -0
  228. package/dist/translations/jv.umd.js +11 -0
  229. package/dist/translations/km.d.ts +8 -0
  230. package/dist/translations/km.js +5 -0
  231. package/dist/translations/km.umd.js +11 -0
  232. package/dist/translations/kn.d.ts +8 -0
  233. package/dist/translations/kn.js +5 -0
  234. package/dist/translations/kn.umd.js +11 -0
  235. package/dist/translations/ko.d.ts +8 -0
  236. package/dist/translations/ko.js +5 -0
  237. package/dist/translations/ko.umd.js +11 -0
  238. package/dist/translations/ku.d.ts +8 -0
  239. package/dist/translations/ku.js +5 -0
  240. package/dist/translations/ku.umd.js +11 -0
  241. package/dist/translations/lt.d.ts +8 -0
  242. package/dist/translations/lt.js +5 -0
  243. package/dist/translations/lt.umd.js +11 -0
  244. package/dist/translations/lv.d.ts +8 -0
  245. package/dist/translations/lv.js +5 -0
  246. package/dist/translations/lv.umd.js +11 -0
  247. package/dist/translations/ms.d.ts +8 -0
  248. package/dist/translations/ms.js +5 -0
  249. package/dist/translations/ms.umd.js +11 -0
  250. package/dist/translations/nb.d.ts +8 -0
  251. package/dist/translations/nb.js +5 -0
  252. package/dist/translations/nb.umd.js +11 -0
  253. package/dist/translations/ne.d.ts +8 -0
  254. package/dist/translations/ne.js +5 -0
  255. package/dist/translations/ne.umd.js +11 -0
  256. package/dist/translations/nl.d.ts +8 -0
  257. package/dist/translations/nl.js +5 -0
  258. package/dist/translations/nl.umd.js +11 -0
  259. package/dist/translations/no.d.ts +8 -0
  260. package/dist/translations/no.js +5 -0
  261. package/dist/translations/no.umd.js +11 -0
  262. package/dist/translations/pl.d.ts +8 -0
  263. package/dist/translations/pl.js +5 -0
  264. package/dist/translations/pl.umd.js +11 -0
  265. package/dist/translations/pt-br.d.ts +8 -0
  266. package/dist/translations/pt-br.js +5 -0
  267. package/dist/translations/pt-br.umd.js +11 -0
  268. package/dist/translations/pt.d.ts +8 -0
  269. package/dist/translations/pt.js +5 -0
  270. package/dist/translations/pt.umd.js +11 -0
  271. package/dist/translations/ro.d.ts +8 -0
  272. package/dist/translations/ro.js +5 -0
  273. package/dist/translations/ro.umd.js +11 -0
  274. package/dist/translations/ru.d.ts +8 -0
  275. package/dist/translations/ru.js +5 -0
  276. package/dist/translations/ru.umd.js +11 -0
  277. package/dist/translations/si.d.ts +8 -0
  278. package/dist/translations/si.js +5 -0
  279. package/dist/translations/si.umd.js +11 -0
  280. package/dist/translations/sk.d.ts +8 -0
  281. package/dist/translations/sk.js +5 -0
  282. package/dist/translations/sk.umd.js +11 -0
  283. package/dist/translations/sq.d.ts +8 -0
  284. package/dist/translations/sq.js +5 -0
  285. package/dist/translations/sq.umd.js +11 -0
  286. package/dist/translations/sr-latn.d.ts +8 -0
  287. package/dist/translations/sr-latn.js +5 -0
  288. package/dist/translations/sr-latn.umd.js +11 -0
  289. package/dist/translations/sr.d.ts +8 -0
  290. package/dist/translations/sr.js +5 -0
  291. package/dist/translations/sr.umd.js +11 -0
  292. package/dist/translations/sv.d.ts +8 -0
  293. package/dist/translations/sv.js +5 -0
  294. package/dist/translations/sv.umd.js +11 -0
  295. package/dist/translations/th.d.ts +8 -0
  296. package/dist/translations/th.js +5 -0
  297. package/dist/translations/th.umd.js +11 -0
  298. package/dist/translations/ti.d.ts +8 -0
  299. package/dist/translations/ti.js +5 -0
  300. package/dist/translations/ti.umd.js +11 -0
  301. package/dist/translations/tk.d.ts +8 -0
  302. package/dist/translations/tk.js +5 -0
  303. package/dist/translations/tk.umd.js +11 -0
  304. package/dist/translations/tr.d.ts +8 -0
  305. package/dist/translations/tr.js +5 -0
  306. package/dist/translations/tr.umd.js +11 -0
  307. package/dist/translations/ug.d.ts +8 -0
  308. package/dist/translations/ug.js +5 -0
  309. package/dist/translations/ug.umd.js +11 -0
  310. package/dist/translations/uk.d.ts +8 -0
  311. package/dist/translations/uk.js +5 -0
  312. package/dist/translations/uk.umd.js +11 -0
  313. package/dist/translations/ur.d.ts +8 -0
  314. package/dist/translations/ur.js +5 -0
  315. package/dist/translations/ur.umd.js +11 -0
  316. package/dist/translations/uz.d.ts +8 -0
  317. package/dist/translations/uz.js +5 -0
  318. package/dist/translations/uz.umd.js +11 -0
  319. package/dist/translations/vi.d.ts +8 -0
  320. package/dist/translations/vi.js +5 -0
  321. package/dist/translations/vi.umd.js +11 -0
  322. package/dist/translations/zh-cn.d.ts +8 -0
  323. package/dist/translations/zh-cn.js +5 -0
  324. package/dist/translations/zh-cn.umd.js +11 -0
  325. package/dist/translations/zh.d.ts +8 -0
  326. package/dist/translations/zh.js +5 -0
  327. package/dist/translations/zh.umd.js +11 -0
  328. package/lang/contexts.json +46 -0
  329. package/lang/translations/ar.po +194 -0
  330. package/lang/translations/ast.po +194 -0
  331. package/lang/translations/az.po +194 -0
  332. package/lang/translations/bg.po +194 -0
  333. package/lang/translations/bn.po +194 -0
  334. package/lang/translations/bs.po +194 -0
  335. package/lang/translations/ca.po +194 -0
  336. package/lang/translations/cs.po +194 -0
  337. package/lang/translations/da.po +194 -0
  338. package/lang/translations/de-ch.po +194 -0
  339. package/lang/translations/de.po +194 -0
  340. package/lang/translations/el.po +194 -0
  341. package/lang/translations/en-au.po +194 -0
  342. package/lang/translations/en-gb.po +194 -0
  343. package/lang/translations/en.po +194 -0
  344. package/lang/translations/eo.po +194 -0
  345. package/lang/translations/es.po +194 -0
  346. package/lang/translations/et.po +194 -0
  347. package/lang/translations/eu.po +194 -0
  348. package/lang/translations/fa.po +194 -0
  349. package/lang/translations/fi.po +194 -0
  350. package/lang/translations/fr.po +194 -0
  351. package/lang/translations/gl.po +194 -0
  352. package/lang/translations/he.po +194 -0
  353. package/lang/translations/hi.po +194 -0
  354. package/lang/translations/hr.po +194 -0
  355. package/lang/translations/hu.po +194 -0
  356. package/lang/translations/id.po +194 -0
  357. package/lang/translations/it.po +194 -0
  358. package/lang/translations/ja.po +194 -0
  359. package/lang/translations/jv.po +194 -0
  360. package/lang/translations/km.po +194 -0
  361. package/lang/translations/kn.po +194 -0
  362. package/lang/translations/ko.po +194 -0
  363. package/lang/translations/ku.po +194 -0
  364. package/lang/translations/lt.po +194 -0
  365. package/lang/translations/lv.po +194 -0
  366. package/lang/translations/ms.po +194 -0
  367. package/lang/translations/nb.po +194 -0
  368. package/lang/translations/ne.po +194 -0
  369. package/lang/translations/nl.po +194 -0
  370. package/lang/translations/no.po +194 -0
  371. package/lang/translations/pl.po +194 -0
  372. package/lang/translations/pt-br.po +194 -0
  373. package/lang/translations/pt.po +194 -0
  374. package/lang/translations/ro.po +194 -0
  375. package/lang/translations/ru.po +194 -0
  376. package/lang/translations/si.po +194 -0
  377. package/lang/translations/sk.po +194 -0
  378. package/lang/translations/sq.po +194 -0
  379. package/lang/translations/sr-latn.po +194 -0
  380. package/lang/translations/sr.po +194 -0
  381. package/lang/translations/sv.po +194 -0
  382. package/lang/translations/th.po +194 -0
  383. package/lang/translations/ti.po +194 -0
  384. package/lang/translations/tk.po +194 -0
  385. package/lang/translations/tr.po +194 -0
  386. package/lang/translations/ug.po +194 -0
  387. package/lang/translations/uk.po +194 -0
  388. package/lang/translations/ur.po +194 -0
  389. package/lang/translations/uz.po +194 -0
  390. package/lang/translations/vi.po +194 -0
  391. package/lang/translations/zh-cn.po +194 -0
  392. package/lang/translations/zh.po +194 -0
  393. package/package.json +48 -0
  394. package/src/augmentation.d.ts +57 -0
  395. package/src/augmentation.js +5 -0
  396. package/src/autoimage.d.ts +56 -0
  397. package/src/autoimage.js +138 -0
  398. package/src/image/converters.d.ts +66 -0
  399. package/src/image/converters.js +232 -0
  400. package/src/image/imageblockediting.d.ts +63 -0
  401. package/src/image/imageblockediting.js +159 -0
  402. package/src/image/imageediting.d.ts +34 -0
  403. package/src/image/imageediting.js +69 -0
  404. package/src/image/imageinlineediting.d.ts +64 -0
  405. package/src/image/imageinlineediting.js +178 -0
  406. package/src/image/imageloadobserver.d.ts +48 -0
  407. package/src/image/imageloadobserver.js +52 -0
  408. package/src/image/imageplaceholder.d.ts +43 -0
  409. package/src/image/imageplaceholder.js +119 -0
  410. package/src/image/imagetypecommand.d.ts +44 -0
  411. package/src/image/imagetypecommand.js +80 -0
  412. package/src/image/insertimagecommand.d.ts +68 -0
  413. package/src/image/insertimagecommand.js +121 -0
  414. package/src/image/replaceimagesourcecommand.d.ts +51 -0
  415. package/src/image/replaceimagesourcecommand.js +75 -0
  416. package/src/image/ui/utils.d.ts +25 -0
  417. package/src/image/ui/utils.js +44 -0
  418. package/src/image/utils.d.ts +64 -0
  419. package/src/image/utils.js +121 -0
  420. package/src/image.d.ts +38 -0
  421. package/src/image.js +44 -0
  422. package/src/imageblock.d.ts +38 -0
  423. package/src/imageblock.js +44 -0
  424. package/src/imagecaption/imagecaptionediting.d.ts +93 -0
  425. package/src/imagecaption/imagecaptionediting.js +231 -0
  426. package/src/imagecaption/imagecaptionui.d.ts +30 -0
  427. package/src/imagecaption/imagecaptionui.js +67 -0
  428. package/src/imagecaption/imagecaptionutils.d.ts +42 -0
  429. package/src/imagecaption/imagecaptionutils.js +68 -0
  430. package/src/imagecaption/toggleimagecaptioncommand.d.ts +66 -0
  431. package/src/imagecaption/toggleimagecaptioncommand.js +138 -0
  432. package/src/imagecaption.d.ts +30 -0
  433. package/src/imagecaption.js +36 -0
  434. package/src/imageconfig.d.ts +712 -0
  435. package/src/imageconfig.js +5 -0
  436. package/src/imageinline.d.ts +38 -0
  437. package/src/imageinline.js +44 -0
  438. package/src/imageinsert/imageinsertui.d.ts +86 -0
  439. package/src/imageinsert/imageinsertui.js +217 -0
  440. package/src/imageinsert/imageinsertviaurlui.d.ts +70 -0
  441. package/src/imageinsert/imageinsertviaurlui.js +174 -0
  442. package/src/imageinsert/ui/imageinsertformview.d.ts +56 -0
  443. package/src/imageinsert/ui/imageinsertformview.js +95 -0
  444. package/src/imageinsert/ui/imageinserturlview.d.ts +64 -0
  445. package/src/imageinsert/ui/imageinserturlview.js +88 -0
  446. package/src/imageinsert.d.ts +37 -0
  447. package/src/imageinsert.js +43 -0
  448. package/src/imageinsertviaurl.d.ts +35 -0
  449. package/src/imageinsertviaurl.js +41 -0
  450. package/src/imageresize/imagecustomresizeui.d.ts +65 -0
  451. package/src/imageresize/imagecustomresizeui.js +174 -0
  452. package/src/imageresize/imageresizebuttons.d.ts +68 -0
  453. package/src/imageresize/imageresizebuttons.js +295 -0
  454. package/src/imageresize/imageresizeediting.d.ts +45 -0
  455. package/src/imageresize/imageresizeediting.js +183 -0
  456. package/src/imageresize/imageresizehandles.d.ts +35 -0
  457. package/src/imageresize/imageresizehandles.js +118 -0
  458. package/src/imageresize/resizeimagecommand.d.ts +42 -0
  459. package/src/imageresize/resizeimagecommand.js +63 -0
  460. package/src/imageresize/ui/imagecustomresizeformview.d.ts +129 -0
  461. package/src/imageresize/ui/imagecustomresizeformview.js +186 -0
  462. package/src/imageresize/utils/getselectedimageeditornodes.d.ts +24 -0
  463. package/src/imageresize/utils/getselectedimageeditornodes.js +24 -0
  464. package/src/imageresize/utils/getselectedimagepossibleresizerange.d.ts +24 -0
  465. package/src/imageresize/utils/getselectedimagepossibleresizerange.js +32 -0
  466. package/src/imageresize/utils/getselectedimagewidthinunits.d.ts +18 -0
  467. package/src/imageresize/utils/getselectedimagewidthinunits.js +41 -0
  468. package/src/imageresize/utils/tryparsedimensionwithunit.d.ts +37 -0
  469. package/src/imageresize/utils/tryparsedimensionwithunit.js +56 -0
  470. package/src/imageresize.d.ts +32 -0
  471. package/src/imageresize.js +38 -0
  472. package/src/imagesizeattributes.d.ts +38 -0
  473. package/src/imagesizeattributes.js +148 -0
  474. package/src/imagestyle/converters.d.ts +24 -0
  475. package/src/imagestyle/converters.js +79 -0
  476. package/src/imagestyle/imagestylecommand.d.ts +68 -0
  477. package/src/imagestyle/imagestylecommand.js +107 -0
  478. package/src/imagestyle/imagestyleediting.d.ts +54 -0
  479. package/src/imagestyle/imagestyleediting.js +114 -0
  480. package/src/imagestyle/imagestyleui.d.ts +60 -0
  481. package/src/imagestyle/imagestyleui.js +198 -0
  482. package/src/imagestyle/utils.d.ts +101 -0
  483. package/src/imagestyle/utils.js +328 -0
  484. package/src/imagestyle.d.ts +36 -0
  485. package/src/imagestyle.js +42 -0
  486. package/src/imagetextalternative/imagetextalternativecommand.d.ts +34 -0
  487. package/src/imagetextalternative/imagetextalternativecommand.js +44 -0
  488. package/src/imagetextalternative/imagetextalternativeediting.d.ts +32 -0
  489. package/src/imagetextalternative/imagetextalternativeediting.js +41 -0
  490. package/src/imagetextalternative/imagetextalternativeui.d.ts +72 -0
  491. package/src/imagetextalternative/imagetextalternativeui.js +179 -0
  492. package/src/imagetextalternative/ui/textalternativeformview.d.ts +90 -0
  493. package/src/imagetextalternative/ui/textalternativeformview.js +121 -0
  494. package/src/imagetextalternative.d.ts +33 -0
  495. package/src/imagetextalternative.js +39 -0
  496. package/src/imagetoolbar.d.ts +39 -0
  497. package/src/imagetoolbar.js +63 -0
  498. package/src/imageupload/imageuploadediting.d.ts +115 -0
  499. package/src/imageupload/imageuploadediting.js +361 -0
  500. package/src/imageupload/imageuploadprogress.d.ts +46 -0
  501. package/src/imageupload/imageuploadprogress.js +217 -0
  502. package/src/imageupload/imageuploadui.d.ts +51 -0
  503. package/src/imageupload/imageuploadui.js +134 -0
  504. package/src/imageupload/uploadimagecommand.d.ts +74 -0
  505. package/src/imageupload/uploadimagecommand.js +110 -0
  506. package/src/imageupload/utils.d.ts +33 -0
  507. package/src/imageupload/utils.js +112 -0
  508. package/src/imageupload.d.ts +36 -0
  509. package/src/imageupload.js +42 -0
  510. package/src/imageutils.d.ts +129 -0
  511. package/src/imageutils.js +312 -0
  512. package/src/index.d.ts +50 -0
  513. package/src/index.js +41 -0
  514. package/src/pictureediting.d.ts +92 -0
  515. package/src/pictureediting.js +136 -0
  516. package/theme/image.css +143 -0
  517. package/theme/imagecaption.css +51 -0
  518. package/theme/imagecustomresizeform.css +33 -0
  519. package/theme/imageinsert.css +14 -0
  520. package/theme/imageplaceholder.css +10 -0
  521. package/theme/imageresize.css +53 -0
  522. package/theme/imagestyle.css +120 -0
  523. package/theme/imageuploadicon.css +23 -0
  524. package/theme/imageuploadloader.css +18 -0
  525. package/theme/imageuploadprogress.css +19 -0
  526. package/theme/textalternativeform.css +32 -0
@@ -0,0 +1,39 @@
1
+ /**
2
+ * @license Copyright (c) 2003-2024, 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/imagetextalternative
7
+ */
8
+ import { Plugin } from 'ckeditor5/src/core.js';
9
+ import ImageTextAlternativeEditing from './imagetextalternative/imagetextalternativeediting.js';
10
+ import ImageTextAlternativeUI from './imagetextalternative/imagetextalternativeui.js';
11
+ /**
12
+ * The image text alternative plugin.
13
+ *
14
+ * For a detailed overview, check the {@glink features/images/images-styles image styles} documentation.
15
+ *
16
+ * This is a "glue" plugin which loads the
17
+ * {@link module:image/imagetextalternative/imagetextalternativeediting~ImageTextAlternativeEditing}
18
+ * and {@link module:image/imagetextalternative/imagetextalternativeui~ImageTextAlternativeUI} plugins.
19
+ */
20
+ export default class ImageTextAlternative extends Plugin {
21
+ /**
22
+ * @inheritDoc
23
+ */
24
+ static get requires() {
25
+ return [ImageTextAlternativeEditing, ImageTextAlternativeUI];
26
+ }
27
+ /**
28
+ * @inheritDoc
29
+ */
30
+ static get pluginName() {
31
+ return 'ImageTextAlternative';
32
+ }
33
+ /**
34
+ * @inheritDoc
35
+ */
36
+ static get isOfficialPlugin() {
37
+ return true;
38
+ }
39
+ }
@@ -0,0 +1,39 @@
1
+ /**
2
+ * @license Copyright (c) 2003-2024, 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/imagetoolbar
7
+ */
8
+ import { Plugin } from 'ckeditor5/src/core.js';
9
+ import { WidgetToolbarRepository } from 'ckeditor5/src/widget.js';
10
+ import ImageUtils from './imageutils.js';
11
+ /**
12
+ * The image toolbar plugin. It creates and manages the image toolbar (the toolbar displayed when an image is selected).
13
+ *
14
+ * For an overview, check the {@glink features/images/images-overview#image-contextual-toolbar image contextual toolbar} documentation.
15
+ *
16
+ * Instances of toolbar components (e.g. buttons) are created using the editor's
17
+ * {@link module:ui/componentfactory~ComponentFactory component factory}
18
+ * based on the {@link module:image/imageconfig~ImageConfig#toolbar `image.toolbar` configuration option}.
19
+ *
20
+ * The toolbar uses the {@link module:ui/panel/balloon/contextualballoon~ContextualBalloon}.
21
+ */
22
+ export default class ImageToolbar extends Plugin {
23
+ /**
24
+ * @inheritDoc
25
+ */
26
+ static get requires(): readonly [typeof WidgetToolbarRepository, typeof ImageUtils];
27
+ /**
28
+ * @inheritDoc
29
+ */
30
+ static get pluginName(): "ImageToolbar";
31
+ /**
32
+ * @inheritDoc
33
+ */
34
+ static get isOfficialPlugin(): true;
35
+ /**
36
+ * @inheritDoc
37
+ */
38
+ afterInit(): void;
39
+ }
@@ -0,0 +1,63 @@
1
+ /**
2
+ * @license Copyright (c) 2003-2024, 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/imagetoolbar
7
+ */
8
+ import { Plugin } from 'ckeditor5/src/core.js';
9
+ import { WidgetToolbarRepository } from 'ckeditor5/src/widget.js';
10
+ import ImageUtils from './imageutils.js';
11
+ import { isObject } from 'lodash-es';
12
+ /**
13
+ * The image toolbar plugin. It creates and manages the image toolbar (the toolbar displayed when an image is selected).
14
+ *
15
+ * For an overview, check the {@glink features/images/images-overview#image-contextual-toolbar image contextual toolbar} documentation.
16
+ *
17
+ * Instances of toolbar components (e.g. buttons) are created using the editor's
18
+ * {@link module:ui/componentfactory~ComponentFactory component factory}
19
+ * based on the {@link module:image/imageconfig~ImageConfig#toolbar `image.toolbar` configuration option}.
20
+ *
21
+ * The toolbar uses the {@link module:ui/panel/balloon/contextualballoon~ContextualBalloon}.
22
+ */
23
+ export default class ImageToolbar extends Plugin {
24
+ /**
25
+ * @inheritDoc
26
+ */
27
+ static get requires() {
28
+ return [WidgetToolbarRepository, ImageUtils];
29
+ }
30
+ /**
31
+ * @inheritDoc
32
+ */
33
+ static get pluginName() {
34
+ return 'ImageToolbar';
35
+ }
36
+ /**
37
+ * @inheritDoc
38
+ */
39
+ static get isOfficialPlugin() {
40
+ return true;
41
+ }
42
+ /**
43
+ * @inheritDoc
44
+ */
45
+ afterInit() {
46
+ const editor = this.editor;
47
+ const t = editor.t;
48
+ const widgetToolbarRepository = editor.plugins.get(WidgetToolbarRepository);
49
+ const imageUtils = editor.plugins.get('ImageUtils');
50
+ widgetToolbarRepository.register('image', {
51
+ ariaLabel: t('Image toolbar'),
52
+ items: normalizeDeclarativeConfig(editor.config.get('image.toolbar') || []),
53
+ getRelatedElement: selection => imageUtils.getClosestSelectedImageWidget(selection)
54
+ });
55
+ }
56
+ }
57
+ /**
58
+ * Convert the dropdown definitions to their keys registered in the ComponentFactory.
59
+ * The registration precess should be handled by the plugin which handles the UI of a particular feature.
60
+ */
61
+ function normalizeDeclarativeConfig(config) {
62
+ return config.map(item => isObject(item) ? item.name : item);
63
+ }
@@ -0,0 +1,115 @@
1
+ /**
2
+ * @license Copyright (c) 2003-2024, 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/imageupload/imageuploadediting
7
+ */
8
+ import { Plugin, type Editor } from 'ckeditor5/src/core.js';
9
+ import { type Element, type Writer, type DataTransfer } from 'ckeditor5/src/engine.js';
10
+ import { Notification } from 'ckeditor5/src/ui.js';
11
+ import { ClipboardPipeline } from 'ckeditor5/src/clipboard.js';
12
+ import { FileRepository, type UploadResponse, type FileLoader } from 'ckeditor5/src/upload.js';
13
+ import ImageUtils from '../imageutils.js';
14
+ /**
15
+ * The editing part of the image upload feature. It registers the `'uploadImage'` command
16
+ * and the `imageUpload` command as an aliased name.
17
+ *
18
+ * When an image is uploaded, it fires the {@link ~ImageUploadEditing#event:uploadComplete `uploadComplete`} event
19
+ * that allows adding custom attributes to the {@link module:engine/model/element~Element image element}.
20
+ */
21
+ export default class ImageUploadEditing extends Plugin {
22
+ /**
23
+ * @inheritDoc
24
+ */
25
+ static get requires(): readonly [typeof FileRepository, typeof Notification, typeof ClipboardPipeline, typeof ImageUtils];
26
+ static get pluginName(): "ImageUploadEditing";
27
+ /**
28
+ * @inheritDoc
29
+ */
30
+ static get isOfficialPlugin(): true;
31
+ /**
32
+ * An internal mapping of {@link module:upload/filerepository~FileLoader#id file loader UIDs} and
33
+ * model elements during the upload.
34
+ *
35
+ * Model element of the uploaded image can change, for instance, when {@link module:image/image/imagetypecommand~ImageTypeCommand}
36
+ * is executed as a result of adding caption or changing image style. As a result, the upload logic must keep track of the model
37
+ * element (reference) and resolve the upload for the correct model element (instead of the one that landed in the `$graveyard`
38
+ * after image type changed).
39
+ */
40
+ private readonly _uploadImageElements;
41
+ /**
42
+ * @inheritDoc
43
+ */
44
+ constructor(editor: Editor);
45
+ /**
46
+ * @inheritDoc
47
+ */
48
+ init(): void;
49
+ /**
50
+ * @inheritDoc
51
+ */
52
+ afterInit(): void;
53
+ /**
54
+ * Reads and uploads an image.
55
+ *
56
+ * The image is read from the disk and as a Base64-encoded string it is set temporarily to
57
+ * `image[src]`. When the image is successfully uploaded, the temporary data is replaced with the target
58
+ * image's URL (the URL to the uploaded image on the server).
59
+ */
60
+ protected _readAndUpload(loader: FileLoader): Promise<void>;
61
+ /**
62
+ * Creates the `srcset` attribute based on a given file upload response and sets it as an attribute to a specific image element.
63
+ *
64
+ * @param data Data object from which `srcset` will be created.
65
+ * @param image The image element on which the `srcset` attribute will be set.
66
+ */
67
+ protected _parseAndSetSrcsetAttributeOnImage(data: Record<string, unknown>, image: Element, writer: Writer): void;
68
+ }
69
+ /**
70
+ * Returns `true` if non-empty `text/html` is included in the data transfer.
71
+ */
72
+ export declare function isHtmlIncluded(dataTransfer: DataTransfer): boolean;
73
+ /**
74
+ * An event fired when an image is uploaded. You can hook into this event to provide
75
+ * custom attributes to the {@link module:engine/model/element~Element image element} based on the data from
76
+ * the server.
77
+ *
78
+ * ```ts
79
+ * const imageUploadEditing = editor.plugins.get( 'ImageUploadEditing' );
80
+ *
81
+ * imageUploadEditing.on( 'uploadComplete', ( evt, { data, imageElement } ) => {
82
+ * editor.model.change( writer => {
83
+ * writer.setAttribute( 'someAttribute', 'foo', imageElement );
84
+ * } );
85
+ * } );
86
+ * ```
87
+ *
88
+ * You can also stop the default handler that sets the `src` and `srcset` attributes
89
+ * if you want to provide custom values for these attributes.
90
+ *
91
+ * ```ts
92
+ * imageUploadEditing.on( 'uploadComplete', ( evt, { data, imageElement } ) => {
93
+ * evt.stop();
94
+ * } );
95
+ * ```
96
+ *
97
+ * **Note**: This event is fired by the {@link module:image/imageupload/imageuploadediting~ImageUploadEditing} plugin.
98
+ *
99
+ * @eventName ~ImageUploadEditing#uploadComplete
100
+ * @param data The `uploadComplete` event data.
101
+ */
102
+ export type ImageUploadCompleteEvent = {
103
+ name: 'uploadComplete';
104
+ args: [data: ImageUploadCompleteData];
105
+ };
106
+ export type ImageUploadCompleteData = {
107
+ /**
108
+ * The data coming from the upload adapter.
109
+ */
110
+ data: UploadResponse;
111
+ /**
112
+ * The model {@link module:engine/model/element~Element image element} that can be customized.
113
+ */
114
+ imageElement: Element;
115
+ };
@@ -0,0 +1,361 @@
1
+ /**
2
+ * @license Copyright (c) 2003-2024, 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/imageupload/imageuploadediting
7
+ */
8
+ import { Plugin } from 'ckeditor5/src/core.js';
9
+ import { UpcastWriter } from 'ckeditor5/src/engine.js';
10
+ import { Notification } from 'ckeditor5/src/ui.js';
11
+ import { ClipboardPipeline } from 'ckeditor5/src/clipboard.js';
12
+ import { FileRepository } from 'ckeditor5/src/upload.js';
13
+ import { env } from 'ckeditor5/src/utils.js';
14
+ import ImageUtils from '../imageutils.js';
15
+ import UploadImageCommand from './uploadimagecommand.js';
16
+ import { fetchLocalImage, isLocalImage } from '../../src/imageupload/utils.js';
17
+ import { createImageTypeRegExp } from './utils.js';
18
+ /**
19
+ * The editing part of the image upload feature. It registers the `'uploadImage'` command
20
+ * and the `imageUpload` command as an aliased name.
21
+ *
22
+ * When an image is uploaded, it fires the {@link ~ImageUploadEditing#event:uploadComplete `uploadComplete`} event
23
+ * that allows adding custom attributes to the {@link module:engine/model/element~Element image element}.
24
+ */
25
+ export default class ImageUploadEditing extends Plugin {
26
+ /**
27
+ * @inheritDoc
28
+ */
29
+ static get requires() {
30
+ return [FileRepository, Notification, ClipboardPipeline, ImageUtils];
31
+ }
32
+ static get pluginName() {
33
+ return 'ImageUploadEditing';
34
+ }
35
+ /**
36
+ * @inheritDoc
37
+ */
38
+ static get isOfficialPlugin() {
39
+ return true;
40
+ }
41
+ /**
42
+ * @inheritDoc
43
+ */
44
+ constructor(editor) {
45
+ super(editor);
46
+ editor.config.define('image', {
47
+ upload: {
48
+ types: ['jpeg', 'png', 'gif', 'bmp', 'webp', 'tiff']
49
+ }
50
+ });
51
+ this._uploadImageElements = new Map();
52
+ }
53
+ /**
54
+ * @inheritDoc
55
+ */
56
+ init() {
57
+ const editor = this.editor;
58
+ const doc = editor.model.document;
59
+ const conversion = editor.conversion;
60
+ const fileRepository = editor.plugins.get(FileRepository);
61
+ const imageUtils = editor.plugins.get('ImageUtils');
62
+ const clipboardPipeline = editor.plugins.get('ClipboardPipeline');
63
+ const imageTypes = createImageTypeRegExp(editor.config.get('image.upload.types'));
64
+ const uploadImageCommand = new UploadImageCommand(editor);
65
+ // Register `uploadImage` command and add `imageUpload` command as an alias for backward compatibility.
66
+ editor.commands.add('uploadImage', uploadImageCommand);
67
+ editor.commands.add('imageUpload', uploadImageCommand);
68
+ // Register upcast converter for uploadId.
69
+ conversion.for('upcast')
70
+ .attributeToAttribute({
71
+ view: {
72
+ name: 'img',
73
+ key: 'uploadId'
74
+ },
75
+ model: 'uploadId'
76
+ });
77
+ // Handle pasted images.
78
+ // For every image file, a new file loader is created and a placeholder image is
79
+ // inserted into the content. Then, those images are uploaded once they appear in the model
80
+ // (see Document#change listener below).
81
+ this.listenTo(editor.editing.view.document, 'clipboardInput', (evt, data) => {
82
+ // Skip if non empty HTML data is included.
83
+ // https://github.com/ckeditor/ckeditor5-upload/issues/68
84
+ if (isHtmlIncluded(data.dataTransfer)) {
85
+ return;
86
+ }
87
+ const images = Array.from(data.dataTransfer.files).filter(file => {
88
+ // See https://github.com/ckeditor/ckeditor5-image/pull/254.
89
+ if (!file) {
90
+ return false;
91
+ }
92
+ return imageTypes.test(file.type);
93
+ });
94
+ if (!images.length) {
95
+ return;
96
+ }
97
+ evt.stop();
98
+ editor.model.change(writer => {
99
+ // Set selection to paste target.
100
+ if (data.targetRanges) {
101
+ writer.setSelection(data.targetRanges.map(viewRange => editor.editing.mapper.toModelRange(viewRange)));
102
+ }
103
+ editor.execute('uploadImage', { file: images });
104
+ });
105
+ const uploadImageCommand = editor.commands.get('uploadImage');
106
+ if (!uploadImageCommand.isAccessAllowed) {
107
+ const notification = editor.plugins.get('Notification');
108
+ const t = editor.locale.t;
109
+ // eslint-disable-next-line max-len
110
+ notification.showWarning(t('You have no image upload permissions.'), {
111
+ namespace: 'image'
112
+ });
113
+ }
114
+ });
115
+ // Handle HTML pasted with images with base64 or blob sources.
116
+ // For every image file, a new file loader is created and a placeholder image is
117
+ // inserted into the content. Then, those images are uploaded once they appear in the model
118
+ // (see Document#change listener below).
119
+ this.listenTo(clipboardPipeline, 'inputTransformation', (evt, data) => {
120
+ const fetchableImages = Array.from(editor.editing.view.createRangeIn(data.content))
121
+ .map(value => value.item)
122
+ .filter(viewElement => isLocalImage(imageUtils, viewElement) &&
123
+ !viewElement.getAttribute('uploadProcessed'))
124
+ .map(viewElement => { return { promise: fetchLocalImage(viewElement), imageElement: viewElement }; });
125
+ if (!fetchableImages.length) {
126
+ return;
127
+ }
128
+ const writer = new UpcastWriter(editor.editing.view.document);
129
+ for (const fetchableImage of fetchableImages) {
130
+ // Set attribute marking that the image was processed already.
131
+ writer.setAttribute('uploadProcessed', true, fetchableImage.imageElement);
132
+ const loader = fileRepository.createLoader(fetchableImage.promise);
133
+ if (loader) {
134
+ writer.setAttribute('src', '', fetchableImage.imageElement);
135
+ writer.setAttribute('uploadId', loader.id, fetchableImage.imageElement);
136
+ }
137
+ }
138
+ });
139
+ // Prevents from the browser redirecting to the dropped image.
140
+ editor.editing.view.document.on('dragover', (evt, data) => {
141
+ data.preventDefault();
142
+ });
143
+ // Upload placeholder images that appeared in the model.
144
+ doc.on('change', () => {
145
+ // Note: Reversing changes to start with insertions and only then handle removals. If it was the other way around,
146
+ // loaders for **all** images that land in the $graveyard would abort while in fact only those that were **not** replaced
147
+ // by other images should be aborted.
148
+ const changes = doc.differ.getChanges({ includeChangesInGraveyard: true }).reverse();
149
+ const insertedImagesIds = new Set();
150
+ for (const entry of changes) {
151
+ if (entry.type == 'insert' && entry.name != '$text') {
152
+ const item = entry.position.nodeAfter;
153
+ const isInsertedInGraveyard = entry.position.root.rootName == '$graveyard';
154
+ for (const imageElement of getImagesFromChangeItem(editor, item)) {
155
+ // Check if the image element still has upload id.
156
+ const uploadId = imageElement.getAttribute('uploadId');
157
+ if (!uploadId) {
158
+ continue;
159
+ }
160
+ // Check if the image is loaded on this client.
161
+ const loader = fileRepository.loaders.get(uploadId);
162
+ if (!loader) {
163
+ continue;
164
+ }
165
+ if (isInsertedInGraveyard) {
166
+ // If the image was inserted to the graveyard for good (**not** replaced by another image),
167
+ // only then abort the loading process.
168
+ if (!insertedImagesIds.has(uploadId)) {
169
+ loader.abort();
170
+ }
171
+ }
172
+ else {
173
+ // Remember the upload id of the inserted image. If it acted as a replacement for another
174
+ // image (which landed in the $graveyard), the related loader will not be aborted because
175
+ // this is still the same image upload.
176
+ insertedImagesIds.add(uploadId);
177
+ // Keep the mapping between the upload ID and the image model element so the upload
178
+ // can later resolve in the context of the correct model element. The model element could
179
+ // change for the same upload if one image was replaced by another (e.g. image type was changed),
180
+ // so this may also replace an existing mapping.
181
+ this._uploadImageElements.set(uploadId, imageElement);
182
+ if (loader.status == 'idle') {
183
+ // If the image was inserted into content and has not been loaded yet, start loading it.
184
+ this._readAndUpload(loader);
185
+ }
186
+ }
187
+ }
188
+ }
189
+ }
190
+ });
191
+ // Set the default handler for feeding the image element with `src` and `srcset` attributes.
192
+ // Also set the natural `width` and `height` attributes (if not already set).
193
+ this.on('uploadComplete', (evt, { imageElement, data }) => {
194
+ const urls = data.urls ? data.urls : data;
195
+ this.editor.model.change(writer => {
196
+ writer.setAttribute('src', urls.default, imageElement);
197
+ this._parseAndSetSrcsetAttributeOnImage(urls, imageElement, writer);
198
+ imageUtils.setImageNaturalSizeAttributes(imageElement);
199
+ });
200
+ }, { priority: 'low' });
201
+ }
202
+ /**
203
+ * @inheritDoc
204
+ */
205
+ afterInit() {
206
+ const schema = this.editor.model.schema;
207
+ // Setup schema to allow uploadId and uploadStatus for images.
208
+ // Wait for ImageBlockEditing or ImageInlineEditing to register their elements first,
209
+ // that's why doing this in afterInit() instead of init().
210
+ if (this.editor.plugins.has('ImageBlockEditing')) {
211
+ schema.extend('imageBlock', {
212
+ allowAttributes: ['uploadId', 'uploadStatus']
213
+ });
214
+ }
215
+ if (this.editor.plugins.has('ImageInlineEditing')) {
216
+ schema.extend('imageInline', {
217
+ allowAttributes: ['uploadId', 'uploadStatus']
218
+ });
219
+ }
220
+ }
221
+ /**
222
+ * Reads and uploads an image.
223
+ *
224
+ * The image is read from the disk and as a Base64-encoded string it is set temporarily to
225
+ * `image[src]`. When the image is successfully uploaded, the temporary data is replaced with the target
226
+ * image's URL (the URL to the uploaded image on the server).
227
+ */
228
+ _readAndUpload(loader) {
229
+ const editor = this.editor;
230
+ const model = editor.model;
231
+ const t = editor.locale.t;
232
+ const fileRepository = editor.plugins.get(FileRepository);
233
+ const notification = editor.plugins.get(Notification);
234
+ const imageUtils = editor.plugins.get('ImageUtils');
235
+ const imageUploadElements = this._uploadImageElements;
236
+ model.enqueueChange({ isUndoable: false }, writer => {
237
+ writer.setAttribute('uploadStatus', 'reading', imageUploadElements.get(loader.id));
238
+ });
239
+ return loader.read()
240
+ .then(() => {
241
+ const promise = loader.upload();
242
+ const imageElement = imageUploadElements.get(loader.id);
243
+ // Force re–paint in Safari. Without it, the image will display with a wrong size.
244
+ // https://github.com/ckeditor/ckeditor5/issues/1975
245
+ /* istanbul ignore next -- @preserve */
246
+ if (env.isSafari) {
247
+ const viewFigure = editor.editing.mapper.toViewElement(imageElement);
248
+ const viewImg = imageUtils.findViewImgElement(viewFigure);
249
+ editor.editing.view.once('render', () => {
250
+ // Early returns just to be safe. There might be some code ran
251
+ // in between the outer scope and this callback.
252
+ if (!viewImg.parent) {
253
+ return;
254
+ }
255
+ const domFigure = editor.editing.view.domConverter.mapViewToDom(viewImg.parent);
256
+ if (!domFigure) {
257
+ return;
258
+ }
259
+ const originalDisplay = domFigure.style.display;
260
+ domFigure.style.display = 'none';
261
+ // Make sure this line will never be removed during minification for having "no effect".
262
+ domFigure._ckHack = domFigure.offsetHeight;
263
+ domFigure.style.display = originalDisplay;
264
+ });
265
+ }
266
+ if (editor.ui) {
267
+ editor.ui.ariaLiveAnnouncer.announce(t('Uploading image'));
268
+ }
269
+ model.enqueueChange({ isUndoable: false }, writer => {
270
+ writer.setAttribute('uploadStatus', 'uploading', imageElement);
271
+ });
272
+ return promise;
273
+ })
274
+ .then(data => {
275
+ model.enqueueChange({ isUndoable: false }, writer => {
276
+ const imageElement = imageUploadElements.get(loader.id);
277
+ writer.setAttribute('uploadStatus', 'complete', imageElement);
278
+ if (editor.ui) {
279
+ editor.ui.ariaLiveAnnouncer.announce(t('Image upload complete'));
280
+ }
281
+ this.fire('uploadComplete', { data, imageElement });
282
+ });
283
+ clean();
284
+ })
285
+ .catch(error => {
286
+ if (editor.ui) {
287
+ editor.ui.ariaLiveAnnouncer.announce(t('Error during image upload'));
288
+ }
289
+ // If status is not 'error' nor 'aborted' - throw error because it means that something else went wrong,
290
+ // it might be generic error and it would be real pain to find what is going on.
291
+ if (loader.status !== 'error' && loader.status !== 'aborted') {
292
+ throw error;
293
+ }
294
+ // Might be 'aborted'.
295
+ if (loader.status == 'error' && error) {
296
+ notification.showWarning(error, {
297
+ title: t('Upload failed'),
298
+ namespace: 'upload'
299
+ });
300
+ }
301
+ // Permanently remove image from insertion batch.
302
+ model.enqueueChange({ isUndoable: false }, writer => {
303
+ writer.remove(imageUploadElements.get(loader.id));
304
+ });
305
+ clean();
306
+ });
307
+ function clean() {
308
+ model.enqueueChange({ isUndoable: false }, writer => {
309
+ const imageElement = imageUploadElements.get(loader.id);
310
+ writer.removeAttribute('uploadId', imageElement);
311
+ writer.removeAttribute('uploadStatus', imageElement);
312
+ imageUploadElements.delete(loader.id);
313
+ });
314
+ fileRepository.destroyLoader(loader);
315
+ }
316
+ }
317
+ /**
318
+ * Creates the `srcset` attribute based on a given file upload response and sets it as an attribute to a specific image element.
319
+ *
320
+ * @param data Data object from which `srcset` will be created.
321
+ * @param image The image element on which the `srcset` attribute will be set.
322
+ */
323
+ _parseAndSetSrcsetAttributeOnImage(data, image, writer) {
324
+ // Srcset attribute for responsive images support.
325
+ let maxWidth = 0;
326
+ const srcsetAttribute = Object.keys(data)
327
+ // Filter out keys that are not integers.
328
+ .filter(key => {
329
+ const width = parseInt(key, 10);
330
+ if (!isNaN(width)) {
331
+ maxWidth = Math.max(maxWidth, width);
332
+ return true;
333
+ }
334
+ })
335
+ // Convert each key to srcset entry.
336
+ .map(key => `${data[key]} ${key}w`)
337
+ // Join all entries.
338
+ .join(', ');
339
+ if (srcsetAttribute != '') {
340
+ const attributes = {
341
+ srcset: srcsetAttribute
342
+ };
343
+ if (!image.hasAttribute('width') && !image.hasAttribute('height')) {
344
+ attributes.width = maxWidth;
345
+ }
346
+ writer.setAttributes(attributes, image);
347
+ }
348
+ }
349
+ }
350
+ /**
351
+ * Returns `true` if non-empty `text/html` is included in the data transfer.
352
+ */
353
+ export function isHtmlIncluded(dataTransfer) {
354
+ return Array.from(dataTransfer.types).includes('text/html') && dataTransfer.getData('text/html') !== '';
355
+ }
356
+ function getImagesFromChangeItem(editor, item) {
357
+ const imageUtils = editor.plugins.get('ImageUtils');
358
+ return Array.from(editor.model.createRangeOn(item))
359
+ .filter(value => imageUtils.isImage(value.item))
360
+ .map(value => value.item);
361
+ }
@@ -0,0 +1,46 @@
1
+ /**
2
+ * @license Copyright (c) 2003-2024, 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/imageupload/imageuploadprogress
7
+ */
8
+ import { type Editor, Plugin } from 'ckeditor5/src/core.js';
9
+ import '../../theme/imageuploadprogress.css';
10
+ import '../../theme/imageuploadicon.css';
11
+ import '../../theme/imageuploadloader.css';
12
+ /**
13
+ * The image upload progress plugin.
14
+ * It shows a placeholder when the image is read from the disk and a progress bar while the image is uploading.
15
+ */
16
+ export default class ImageUploadProgress extends Plugin {
17
+ /**
18
+ * @inheritDoc
19
+ */
20
+ static get pluginName(): "ImageUploadProgress";
21
+ /**
22
+ * @inheritDoc
23
+ */
24
+ static get isOfficialPlugin(): true;
25
+ /**
26
+ * The image placeholder that is displayed before real image data can be accessed.
27
+ *
28
+ * For the record, this image is a 1x1 px GIF with an aspect ratio set by CSS.
29
+ */
30
+ private placeholder;
31
+ /**
32
+ * @inheritDoc
33
+ */
34
+ constructor(editor: Editor);
35
+ /**
36
+ * @inheritDoc
37
+ */
38
+ init(): void;
39
+ /**
40
+ * This method is called each time the image `uploadStatus` attribute is changed.
41
+ *
42
+ * @param evt An object containing information about the fired event.
43
+ * @param data Additional information about the change.
44
+ */
45
+ private uploadStatusChange;
46
+ }