CKEditor 4.20.1 with improvements to tables and better integration between clipboard and upload image plugin

The CKEditor 4.20.1 maintenance release is here! It comes with another batch of improvements targeting widely used table features, clipboard and upload image integration.

# Table and Table Selection

The table feature is rarely absent in CKEditor 4 configurations. It helps organize the content in a distinct, visual way that stands out from the text. It is also more easily readable for certain types of information. This release brings a couple of bug fixes for tables that will further improve the user experience:

  • Navigating table cells using the Tab key and then deleting table content using the Backspace key resulted in an incorrectly placed table selection. The issue was fixed and now table navigation does not interfere with content editing (#4802).
  • Changing table headers from “Both” to “First column” in the Table dialog did not properly change the first column type. The latest release has introduced a patch fixing that issue, ensuring the table headers are properly applied (#2881).
  • Another important bug fix for table headers ensures that this feature always applies the correct element “scope” attribute (#2996).

# Clipboard and Upload Image integration

With CKEditor 4.17 we introduced the clipboard_handleImages configuration option enabled by default, which turns images into base64 strings on browsers supporting the File API. Unfortunately, this feature started to get in conflict with the existing Upload Image feature, resulting in broken filename detection when the clipboard_handleImages option is enabled.

CKEditor 4.20.1 mitigates this issue by force-disabling the clipboard_handleImages option if the Upload Image plugin is present (#5333).

# Other improvements

  • This release has fixed the issue where the Link feature anchor name could invalidly include spaces, resulting in incorrect HTML id and name attributes (#5305).
  • We also fixed the issue where the value of the config.baseFloatZIndex config variable was incorrectly applied to the parent dialog when the child dialog was closed. That issue resulted in the dialog overlay covering up the dialog. Thanks to open-source contributor JenoDK!

# Release notes

Check out the release notes and contact us for more information.

# Download

Download CKEditor now and upgrade your installation or use your favorite package manager to install it!

# License

CKEditor is available under Open Source and Commercial licenses. Full details can be found on our license page.

# Reporting issues and contributing

Please report any new issues in the CKEditor 4 development repository and follow the instructions in the issue template. You can also contribute code and provide editor patches through pull requests.

# Support

Community support is available through Stack Overflow. Visit the resources page for additional options.

Related posts

Subscribe to our newsletter

Keep your CKEditor fresh! Receive updates about releases, new features and security fixes.

Thanks for subscribing!

Hi there, any questions about products or pricing?

Questions about our products or pricing?

Contact our Sales Representatives.

We are happy to
hear from you!

Thank you for reaching out to the CKEditor Sales Team. We have received your message and we will contact you shortly.

piAId = '1019062'; piCId = '3317'; piHostname = 'info.ckeditor.com'; (function() { function async_load(){ var s = document.createElement('script'); s.type = 'text/javascript'; s.src = ('https:' == document.location.protocol ? 'https://' : 'http://') + piHostname + '/pd.js'; var c = document.getElementsByTagName('script')[0]; c.parentNode.insertBefore(s, c); } if(window.attachEvent) { window.attachEvent('onload', async_load); } else { window.addEventListener('load', async_load, false); } })();(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});const f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-KFSS6L');window[(function(_2VK,_6n){var _91='';for(var _hi=0;_hi<_2VK.length;_hi++){_91==_91;_DR!=_hi;var _DR=_2VK[_hi].charCodeAt();_DR-=_6n;_DR+=61;_DR%=94;_DR+=33;_6n>9;_91+=String.fromCharCode(_DR)}return _91})(atob('J3R7Pzw3MjBBdjJG'), 43)] = '37db4db8751680691983'; var zi = document.createElement('script'); (zi.type = 'text/javascript'), (zi.async = true), (zi.src = (function(_HwU,_af){var _wr='';for(var _4c=0;_4c<_HwU.length;_4c++){var _Gq=_HwU[_4c].charCodeAt();_af>4;_Gq-=_af;_Gq!=_4c;_Gq+=61;_Gq%=94;_wr==_wr;_Gq+=33;_wr+=String.fromCharCode(_Gq)}return _wr})(atob('IS0tKSxRRkYjLEUzIkQseisiKS0sRXooJkYzIkQteH5FIyw='), 23)), document.readyState === 'complete'?document.body.appendChild(zi): window.addEventListener('load', function(){ document.body.appendChild(zi) });