@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,64 @@
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/image/utils
7
+ */
8
+ import type { DocumentSelection, MatcherPattern, Schema, Selection, ViewContainerElement, DowncastWriter, ViewElement } from 'ckeditor5/src/engine.js';
9
+ import type { Editor } from 'ckeditor5/src/core.js';
10
+ /**
11
+ * Creates a view element representing the inline image.
12
+ *
13
+ * ```html
14
+ * <span class="image-inline"><img></img></span>
15
+ * ```
16
+ *
17
+ * Note that `alt` and `src` attributes are converted separately, so they are not included.
18
+ *
19
+ * @internal
20
+ */
21
+ export declare function createInlineImageViewElement(writer: DowncastWriter): ViewContainerElement;
22
+ /**
23
+ * Creates a view element representing the block image.
24
+ *
25
+ * ```html
26
+ * <figure class="image"><img></img></figure>
27
+ * ```
28
+ *
29
+ * Note that `alt` and `src` attributes are converted separately, so they are not included.
30
+ *
31
+ * @internal
32
+ */
33
+ export declare function createBlockImageViewElement(writer: DowncastWriter): ViewContainerElement;
34
+ /**
35
+ * A function returning a `MatcherPattern` for a particular type of View images.
36
+ *
37
+ * @internal
38
+ * @param matchImageType The type of created image.
39
+ */
40
+ export declare function getImgViewElementMatcher(editor: Editor, matchImageType: 'imageBlock' | 'imageInline'): MatcherPattern;
41
+ /**
42
+ * Considering the current model selection, it returns the name of the model image element
43
+ * (`'imageBlock'` or `'imageInline'`) that will make most sense from the UX perspective if a new
44
+ * image was inserted (also: uploaded, dropped, pasted) at that selection.
45
+ *
46
+ * The assumption is that inserting images into empty blocks or on other block widgets should
47
+ * produce block images. Inline images should be inserted in other cases, e.g. in paragraphs
48
+ * that already contain some text.
49
+ *
50
+ * @internal
51
+ */
52
+ export declare function determineImageTypeForInsertionAtSelection(schema: Schema, selection: Selection | DocumentSelection): 'imageBlock' | 'imageInline';
53
+ /**
54
+ * Returns parsed value of the size, but only if it contains unit: px.
55
+ */
56
+ export declare function getSizeValueIfInPx(size: string | undefined): number | null;
57
+ /**
58
+ * Returns true if both styles (width and height) are set.
59
+ *
60
+ * If both image styles: width & height are set, they will override the image width & height attributes in the
61
+ * browser. In this case, the image looks the same as if these styles were applied to attributes instead of styles.
62
+ * That's why we can upcast these styles to width & height attributes instead of resizedWidth and resizedHeight.
63
+ */
64
+ export declare function widthAndHeightStylesAreBothSet(viewElement: ViewElement): boolean;
@@ -0,0 +1,121 @@
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
+ import { first } from 'ckeditor5/src/utils.js';
6
+ /**
7
+ * Creates a view element representing the inline image.
8
+ *
9
+ * ```html
10
+ * <span class="image-inline"><img></img></span>
11
+ * ```
12
+ *
13
+ * Note that `alt` and `src` attributes are converted separately, so they are not included.
14
+ *
15
+ * @internal
16
+ */
17
+ export function createInlineImageViewElement(writer) {
18
+ return writer.createContainerElement('span', { class: 'image-inline' }, writer.createEmptyElement('img'));
19
+ }
20
+ /**
21
+ * Creates a view element representing the block image.
22
+ *
23
+ * ```html
24
+ * <figure class="image"><img></img></figure>
25
+ * ```
26
+ *
27
+ * Note that `alt` and `src` attributes are converted separately, so they are not included.
28
+ *
29
+ * @internal
30
+ */
31
+ export function createBlockImageViewElement(writer) {
32
+ return writer.createContainerElement('figure', { class: 'image' }, [
33
+ writer.createEmptyElement('img'),
34
+ writer.createSlot('children')
35
+ ]);
36
+ }
37
+ /**
38
+ * A function returning a `MatcherPattern` for a particular type of View images.
39
+ *
40
+ * @internal
41
+ * @param matchImageType The type of created image.
42
+ */
43
+ export function getImgViewElementMatcher(editor, matchImageType) {
44
+ const imageUtils = editor.plugins.get('ImageUtils');
45
+ const areBothImagePluginsLoaded = editor.plugins.has('ImageInlineEditing') && editor.plugins.has('ImageBlockEditing');
46
+ return element => {
47
+ // Check if the matched view element is an <img>.
48
+ if (!imageUtils.isInlineImageView(element)) {
49
+ return null;
50
+ }
51
+ // If just one of the plugins is loaded (block or inline), it will match all kinds of images.
52
+ if (!areBothImagePluginsLoaded) {
53
+ return getPositiveMatchPattern(element);
54
+ }
55
+ // The <img> can be standalone, wrapped in <figure>...</figure> (ImageBlock plugin) or
56
+ // wrapped in <figure><a>...</a></figure> (LinkImage plugin).
57
+ const imageType = element.getStyle('display') == 'block' || element.findAncestor(imageUtils.isBlockImageView) ?
58
+ 'imageBlock' :
59
+ 'imageInline';
60
+ if (imageType !== matchImageType) {
61
+ return null;
62
+ }
63
+ return getPositiveMatchPattern(element);
64
+ };
65
+ function getPositiveMatchPattern(element) {
66
+ const pattern = {
67
+ name: true
68
+ };
69
+ // This will trigger src consumption (See https://github.com/ckeditor/ckeditor5/issues/11530).
70
+ if (element.hasAttribute('src')) {
71
+ pattern.attributes = ['src'];
72
+ }
73
+ return pattern;
74
+ }
75
+ }
76
+ /**
77
+ * Considering the current model selection, it returns the name of the model image element
78
+ * (`'imageBlock'` or `'imageInline'`) that will make most sense from the UX perspective if a new
79
+ * image was inserted (also: uploaded, dropped, pasted) at that selection.
80
+ *
81
+ * The assumption is that inserting images into empty blocks or on other block widgets should
82
+ * produce block images. Inline images should be inserted in other cases, e.g. in paragraphs
83
+ * that already contain some text.
84
+ *
85
+ * @internal
86
+ */
87
+ export function determineImageTypeForInsertionAtSelection(schema, selection) {
88
+ const firstBlock = first(selection.getSelectedBlocks());
89
+ // Insert a block image if the selection is not in/on block elements or it's on a block widget.
90
+ if (!firstBlock || schema.isObject(firstBlock)) {
91
+ return 'imageBlock';
92
+ }
93
+ // A block image should also be inserted into an empty block element
94
+ // (that is not an empty list item so the list won't get split).
95
+ if (firstBlock.isEmpty && firstBlock.name != 'listItem') {
96
+ return 'imageBlock';
97
+ }
98
+ // Otherwise insert an inline image.
99
+ return 'imageInline';
100
+ }
101
+ /**
102
+ * Returns parsed value of the size, but only if it contains unit: px.
103
+ */
104
+ export function getSizeValueIfInPx(size) {
105
+ if (size && size.endsWith('px')) {
106
+ return parseInt(size);
107
+ }
108
+ return null;
109
+ }
110
+ /**
111
+ * Returns true if both styles (width and height) are set.
112
+ *
113
+ * If both image styles: width & height are set, they will override the image width & height attributes in the
114
+ * browser. In this case, the image looks the same as if these styles were applied to attributes instead of styles.
115
+ * That's why we can upcast these styles to width & height attributes instead of resizedWidth and resizedHeight.
116
+ */
117
+ export function widthAndHeightStylesAreBothSet(viewElement) {
118
+ const widthStyle = getSizeValueIfInPx(viewElement.getStyle('width'));
119
+ const heightStyle = getSizeValueIfInPx(viewElement.getStyle('height'));
120
+ return !!(widthStyle && heightStyle);
121
+ }
package/src/image.d.ts ADDED
@@ -0,0 +1,38 @@
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/image
7
+ */
8
+ import { Plugin } from 'ckeditor5/src/core.js';
9
+ import ImageBlock from './imageblock.js';
10
+ import ImageInline from './imageinline.js';
11
+ import '../theme/image.css';
12
+ /**
13
+ * The image plugin.
14
+ *
15
+ * For a detailed overview, check the {@glink features/images/images-overview image feature} documentation.
16
+ *
17
+ * This is a "glue" plugin which loads the following plugins:
18
+ *
19
+ * * {@link module:image/imageblock~ImageBlock},
20
+ * * {@link module:image/imageinline~ImageInline},
21
+ *
22
+ * Usually, it is used in conjunction with other plugins from this package. See the {@glink api/image package page}
23
+ * for more information.
24
+ */
25
+ export default class Image extends Plugin {
26
+ /**
27
+ * @inheritDoc
28
+ */
29
+ static get requires(): readonly [typeof ImageBlock, typeof ImageInline];
30
+ /**
31
+ * @inheritDoc
32
+ */
33
+ static get pluginName(): "Image";
34
+ /**
35
+ * @inheritDoc
36
+ */
37
+ static get isOfficialPlugin(): true;
38
+ }
package/src/image.js ADDED
@@ -0,0 +1,44 @@
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/image
7
+ */
8
+ import { Plugin } from 'ckeditor5/src/core.js';
9
+ import ImageBlock from './imageblock.js';
10
+ import ImageInline from './imageinline.js';
11
+ import '../theme/image.css';
12
+ /**
13
+ * The image plugin.
14
+ *
15
+ * For a detailed overview, check the {@glink features/images/images-overview image feature} documentation.
16
+ *
17
+ * This is a "glue" plugin which loads the following plugins:
18
+ *
19
+ * * {@link module:image/imageblock~ImageBlock},
20
+ * * {@link module:image/imageinline~ImageInline},
21
+ *
22
+ * Usually, it is used in conjunction with other plugins from this package. See the {@glink api/image package page}
23
+ * for more information.
24
+ */
25
+ export default class Image extends Plugin {
26
+ /**
27
+ * @inheritDoc
28
+ */
29
+ static get requires() {
30
+ return [ImageBlock, ImageInline];
31
+ }
32
+ /**
33
+ * @inheritDoc
34
+ */
35
+ static get pluginName() {
36
+ return 'Image';
37
+ }
38
+ /**
39
+ * @inheritDoc
40
+ */
41
+ static get isOfficialPlugin() {
42
+ return true;
43
+ }
44
+ }
@@ -0,0 +1,38 @@
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/imageblock
7
+ */
8
+ import { Plugin } from 'ckeditor5/src/core.js';
9
+ import { Widget } from 'ckeditor5/src/widget.js';
10
+ import ImageTextAlternative from './imagetextalternative.js';
11
+ import ImageBlockEditing from './image/imageblockediting.js';
12
+ import ImageInsertUI from './imageinsert/imageinsertui.js';
13
+ import '../theme/image.css';
14
+ /**
15
+ * The image block plugin.
16
+ *
17
+ * This is a "glue" plugin which loads the following plugins:
18
+ *
19
+ * * {@link module:image/image/imageblockediting~ImageBlockEditing},
20
+ * * {@link module:image/imagetextalternative~ImageTextAlternative}.
21
+ *
22
+ * Usually, it is used in conjunction with other plugins from this package. See the {@glink api/image package page}
23
+ * for more information.
24
+ */
25
+ export default class ImageBlock extends Plugin {
26
+ /**
27
+ * @inheritDoc
28
+ */
29
+ static get requires(): readonly [typeof ImageBlockEditing, typeof Widget, typeof ImageTextAlternative, typeof ImageInsertUI];
30
+ /**
31
+ * @inheritDoc
32
+ */
33
+ static get pluginName(): "ImageBlock";
34
+ /**
35
+ * @inheritDoc
36
+ */
37
+ static get isOfficialPlugin(): true;
38
+ }
@@ -0,0 +1,44 @@
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/imageblock
7
+ */
8
+ import { Plugin } from 'ckeditor5/src/core.js';
9
+ import { Widget } from 'ckeditor5/src/widget.js';
10
+ import ImageTextAlternative from './imagetextalternative.js';
11
+ import ImageBlockEditing from './image/imageblockediting.js';
12
+ import ImageInsertUI from './imageinsert/imageinsertui.js';
13
+ import '../theme/image.css';
14
+ /**
15
+ * The image block plugin.
16
+ *
17
+ * This is a "glue" plugin which loads the following plugins:
18
+ *
19
+ * * {@link module:image/image/imageblockediting~ImageBlockEditing},
20
+ * * {@link module:image/imagetextalternative~ImageTextAlternative}.
21
+ *
22
+ * Usually, it is used in conjunction with other plugins from this package. See the {@glink api/image package page}
23
+ * for more information.
24
+ */
25
+ export default class ImageBlock extends Plugin {
26
+ /**
27
+ * @inheritDoc
28
+ */
29
+ static get requires() {
30
+ return [ImageBlockEditing, Widget, ImageTextAlternative, ImageInsertUI];
31
+ }
32
+ /**
33
+ * @inheritDoc
34
+ */
35
+ static get pluginName() {
36
+ return 'ImageBlock';
37
+ }
38
+ /**
39
+ * @inheritDoc
40
+ */
41
+ static get isOfficialPlugin() {
42
+ return true;
43
+ }
44
+ }
@@ -0,0 +1,93 @@
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/imagecaption/imagecaptionediting
7
+ */
8
+ import { type Editor, Plugin } from 'ckeditor5/src/core.js';
9
+ import { Element } from 'ckeditor5/src/engine.js';
10
+ import ImageUtils from '../imageutils.js';
11
+ import ImageCaptionUtils from './imagecaptionutils.js';
12
+ /**
13
+ * The image caption engine plugin. It is responsible for:
14
+ *
15
+ * * registering converters for the caption element,
16
+ * * registering converters for the caption model attribute,
17
+ * * registering the {@link module:image/imagecaption/toggleimagecaptioncommand~ToggleImageCaptionCommand `toggleImageCaption`} command.
18
+ */
19
+ export default class ImageCaptionEditing extends Plugin {
20
+ /**
21
+ * @inheritDoc
22
+ */
23
+ static get requires(): readonly [typeof ImageUtils, typeof ImageCaptionUtils];
24
+ /**
25
+ * @inheritDoc
26
+ */
27
+ static get pluginName(): "ImageCaptionEditing";
28
+ /**
29
+ * @inheritDoc
30
+ */
31
+ static get isOfficialPlugin(): true;
32
+ /**
33
+ * A map that keeps saved JSONified image captions and image model elements they are
34
+ * associated with.
35
+ *
36
+ * To learn more about this system, see {@link #_saveCaption}.
37
+ */
38
+ private _savedCaptionsMap;
39
+ /**
40
+ * @inheritDoc
41
+ */
42
+ constructor(editor: Editor);
43
+ /**
44
+ * @inheritDoc
45
+ */
46
+ init(): void;
47
+ /**
48
+ * Configures conversion pipelines to support upcasting and downcasting
49
+ * image captions.
50
+ */
51
+ private _setupConversion;
52
+ /**
53
+ * Integrates with {@link module:image/image/imagetypecommand~ImageTypeCommand image type commands}
54
+ * to make sure the caption is preserved when the type of an image changes so it can be restored
55
+ * in the future if the user decides they want their caption back.
56
+ */
57
+ private _setupImageTypeCommandsIntegration;
58
+ /**
59
+ * Returns the saved {@link module:engine/model/element~Element#toJSON JSONified} caption
60
+ * of an image model element.
61
+ *
62
+ * See {@link #_saveCaption}.
63
+ *
64
+ * @internal
65
+ * @param imageModelElement The model element the caption should be returned for.
66
+ * @returns The model caption element or `null` if there is none.
67
+ */
68
+ _getSavedCaption(imageModelElement: Element): Element | null;
69
+ /**
70
+ * Saves a {@link module:engine/model/element~Element#toJSON JSONified} caption for
71
+ * an image element to allow restoring it in the future.
72
+ *
73
+ * A caption is saved every time it gets hidden and/or the type of an image changes. The
74
+ * user should be able to restore it on demand.
75
+ *
76
+ * **Note**: The caption cannot be stored in the image model element attribute because,
77
+ * for instance, when the model state propagates to collaborators, the attribute would get
78
+ * lost (mainly because it does not convert to anything when the caption is hidden) and
79
+ * the states of collaborators' models would de-synchronize causing numerous issues.
80
+ *
81
+ * See {@link #_getSavedCaption}.
82
+ *
83
+ * @internal
84
+ * @param imageModelElement The model element the caption is saved for.
85
+ * @param caption The caption model element to be saved.
86
+ */
87
+ _saveCaption(imageModelElement: Element, caption: Element): void;
88
+ /**
89
+ * Reconverts image caption when image alt attribute changes.
90
+ * The change of alt attribute is reflected in caption's aria-label attribute.
91
+ */
92
+ private _registerCaptionReconversion;
93
+ }
@@ -0,0 +1,231 @@
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/imagecaption/imagecaptionediting
7
+ */
8
+ import { Plugin } from 'ckeditor5/src/core.js';
9
+ import { Element, enablePlaceholder } from 'ckeditor5/src/engine.js';
10
+ import { toWidgetEditable } from 'ckeditor5/src/widget.js';
11
+ import ToggleImageCaptionCommand from './toggleimagecaptioncommand.js';
12
+ import ImageUtils from '../imageutils.js';
13
+ import ImageCaptionUtils from './imagecaptionutils.js';
14
+ /**
15
+ * The image caption engine plugin. It is responsible for:
16
+ *
17
+ * * registering converters for the caption element,
18
+ * * registering converters for the caption model attribute,
19
+ * * registering the {@link module:image/imagecaption/toggleimagecaptioncommand~ToggleImageCaptionCommand `toggleImageCaption`} command.
20
+ */
21
+ export default class ImageCaptionEditing extends Plugin {
22
+ /**
23
+ * @inheritDoc
24
+ */
25
+ static get requires() {
26
+ return [ImageUtils, ImageCaptionUtils];
27
+ }
28
+ /**
29
+ * @inheritDoc
30
+ */
31
+ static get pluginName() {
32
+ return 'ImageCaptionEditing';
33
+ }
34
+ /**
35
+ * @inheritDoc
36
+ */
37
+ static get isOfficialPlugin() {
38
+ return true;
39
+ }
40
+ /**
41
+ * @inheritDoc
42
+ */
43
+ constructor(editor) {
44
+ super(editor);
45
+ this._savedCaptionsMap = new WeakMap();
46
+ }
47
+ /**
48
+ * @inheritDoc
49
+ */
50
+ init() {
51
+ const editor = this.editor;
52
+ const schema = editor.model.schema;
53
+ // Schema configuration.
54
+ if (!schema.isRegistered('caption')) {
55
+ schema.register('caption', {
56
+ allowIn: 'imageBlock',
57
+ allowContentOf: '$block',
58
+ isLimit: true
59
+ });
60
+ }
61
+ else {
62
+ schema.extend('caption', {
63
+ allowIn: 'imageBlock'
64
+ });
65
+ }
66
+ editor.commands.add('toggleImageCaption', new ToggleImageCaptionCommand(this.editor));
67
+ this._setupConversion();
68
+ this._setupImageTypeCommandsIntegration();
69
+ this._registerCaptionReconversion();
70
+ }
71
+ /**
72
+ * Configures conversion pipelines to support upcasting and downcasting
73
+ * image captions.
74
+ */
75
+ _setupConversion() {
76
+ const editor = this.editor;
77
+ const view = editor.editing.view;
78
+ const imageUtils = editor.plugins.get('ImageUtils');
79
+ const imageCaptionUtils = editor.plugins.get('ImageCaptionUtils');
80
+ const t = editor.t;
81
+ // View -> model converter for the data pipeline.
82
+ editor.conversion.for('upcast').elementToElement({
83
+ view: element => imageCaptionUtils.matchImageCaptionViewElement(element),
84
+ model: 'caption'
85
+ });
86
+ // Model -> view converter for the data pipeline.
87
+ editor.conversion.for('dataDowncast').elementToElement({
88
+ model: 'caption',
89
+ view: (modelElement, { writer }) => {
90
+ if (!imageUtils.isBlockImage(modelElement.parent)) {
91
+ return null;
92
+ }
93
+ return writer.createContainerElement('figcaption');
94
+ }
95
+ });
96
+ // Model -> view converter for the editing pipeline.
97
+ editor.conversion.for('editingDowncast').elementToElement({
98
+ model: 'caption',
99
+ view: (modelElement, { writer }) => {
100
+ if (!imageUtils.isBlockImage(modelElement.parent)) {
101
+ return null;
102
+ }
103
+ const figcaptionElement = writer.createEditableElement('figcaption');
104
+ writer.setCustomProperty('imageCaption', true, figcaptionElement);
105
+ figcaptionElement.placeholder = t('Enter image caption');
106
+ enablePlaceholder({
107
+ view,
108
+ element: figcaptionElement,
109
+ keepOnFocus: true
110
+ });
111
+ const imageAlt = modelElement.parent.getAttribute('alt');
112
+ const label = imageAlt ? t('Caption for image: %0', [imageAlt]) : t('Caption for the image');
113
+ return toWidgetEditable(figcaptionElement, writer, { label });
114
+ }
115
+ });
116
+ }
117
+ /**
118
+ * Integrates with {@link module:image/image/imagetypecommand~ImageTypeCommand image type commands}
119
+ * to make sure the caption is preserved when the type of an image changes so it can be restored
120
+ * in the future if the user decides they want their caption back.
121
+ */
122
+ _setupImageTypeCommandsIntegration() {
123
+ const editor = this.editor;
124
+ const imageUtils = editor.plugins.get('ImageUtils');
125
+ const imageCaptionUtils = editor.plugins.get('ImageCaptionUtils');
126
+ const imageTypeInlineCommand = editor.commands.get('imageTypeInline');
127
+ const imageTypeBlockCommand = editor.commands.get('imageTypeBlock');
128
+ const handleImageTypeChange = evt => {
129
+ // The image type command execution can be unsuccessful.
130
+ if (!evt.return) {
131
+ return;
132
+ }
133
+ const { oldElement, newElement } = evt.return;
134
+ /* istanbul ignore if: paranoid check -- @preserve */
135
+ if (!oldElement) {
136
+ return;
137
+ }
138
+ if (imageUtils.isBlockImage(oldElement)) {
139
+ const oldCaptionElement = imageCaptionUtils.getCaptionFromImageModelElement(oldElement);
140
+ // If the old element was a captioned block image (the caption was visible),
141
+ // simply save it so it can be restored.
142
+ if (oldCaptionElement) {
143
+ this._saveCaption(newElement, oldCaptionElement);
144
+ return;
145
+ }
146
+ }
147
+ const savedOldElementCaption = this._getSavedCaption(oldElement);
148
+ // If either:
149
+ //
150
+ // * the block image didn't have a visible caption,
151
+ // * the block image caption was hidden (and already saved),
152
+ // * the inline image was passed
153
+ //
154
+ // just try to "pass" the saved caption from the old image to the new image
155
+ // so it can be retrieved in the future if the user wants it back.
156
+ if (savedOldElementCaption) {
157
+ // Note: Since we're writing to a WeakMap, we don't bother with removing the
158
+ // [ oldElement, savedOldElementCaption ] pair from it.
159
+ this._saveCaption(newElement, savedOldElementCaption);
160
+ }
161
+ };
162
+ // Presence of the commands depends on the Image(Inline|Block)Editing plugins loaded in the editor.
163
+ if (imageTypeInlineCommand) {
164
+ this.listenTo(imageTypeInlineCommand, 'execute', handleImageTypeChange, { priority: 'low' });
165
+ }
166
+ if (imageTypeBlockCommand) {
167
+ this.listenTo(imageTypeBlockCommand, 'execute', handleImageTypeChange, { priority: 'low' });
168
+ }
169
+ }
170
+ /**
171
+ * Returns the saved {@link module:engine/model/element~Element#toJSON JSONified} caption
172
+ * of an image model element.
173
+ *
174
+ * See {@link #_saveCaption}.
175
+ *
176
+ * @internal
177
+ * @param imageModelElement The model element the caption should be returned for.
178
+ * @returns The model caption element or `null` if there is none.
179
+ */
180
+ _getSavedCaption(imageModelElement) {
181
+ const jsonObject = this._savedCaptionsMap.get(imageModelElement);
182
+ return jsonObject ? Element.fromJSON(jsonObject) : null;
183
+ }
184
+ /**
185
+ * Saves a {@link module:engine/model/element~Element#toJSON JSONified} caption for
186
+ * an image element to allow restoring it in the future.
187
+ *
188
+ * A caption is saved every time it gets hidden and/or the type of an image changes. The
189
+ * user should be able to restore it on demand.
190
+ *
191
+ * **Note**: The caption cannot be stored in the image model element attribute because,
192
+ * for instance, when the model state propagates to collaborators, the attribute would get
193
+ * lost (mainly because it does not convert to anything when the caption is hidden) and
194
+ * the states of collaborators' models would de-synchronize causing numerous issues.
195
+ *
196
+ * See {@link #_getSavedCaption}.
197
+ *
198
+ * @internal
199
+ * @param imageModelElement The model element the caption is saved for.
200
+ * @param caption The caption model element to be saved.
201
+ */
202
+ _saveCaption(imageModelElement, caption) {
203
+ this._savedCaptionsMap.set(imageModelElement, caption.toJSON());
204
+ }
205
+ /**
206
+ * Reconverts image caption when image alt attribute changes.
207
+ * The change of alt attribute is reflected in caption's aria-label attribute.
208
+ */
209
+ _registerCaptionReconversion() {
210
+ const editor = this.editor;
211
+ const model = editor.model;
212
+ const imageUtils = editor.plugins.get('ImageUtils');
213
+ const imageCaptionUtils = editor.plugins.get('ImageCaptionUtils');
214
+ model.document.on('change:data', () => {
215
+ const changes = model.document.differ.getChanges();
216
+ for (const change of changes) {
217
+ if (change.attributeKey !== 'alt') {
218
+ continue;
219
+ }
220
+ const image = change.range.start.nodeAfter;
221
+ if (imageUtils.isBlockImage(image)) {
222
+ const caption = imageCaptionUtils.getCaptionFromImageModelElement(image);
223
+ if (!caption) {
224
+ return;
225
+ }
226
+ editor.editing.reconvertItem(caption);
227
+ }
228
+ }
229
+ });
230
+ }
231
+ }