javascriptjqueryhtmlckeditornofollow

How can I add rel = "nofollow" to a link in CKEditor if it's an external link


i want to give rel="nofollow" to my external links which its content managed by ckeditor.

example.com = my site

externallink.com = any external link

For example:

<p>
    Lorem <a href="https://example.com/an-article.html">ipsum</a> dolar
    <a href="http://externallink.com/example.html" rel="nofollow">sit</a> amet.
</p>

This solution:

editor.dataProcessor.htmlFilter.addRules(
{
    elements :
    {
        a : function( element )
        {
            if ( !element.attributes.rel )
                element.attributes.rel = 'nofollow';
        }
    }
});

from https://stackoverflow.com/a/6930940/1848929 adds nofollow to all a elements.

How can i filter only external links?

Also deep doc about CKEditor Data Processor: http://docs.cksource.com/CKEditor_3.x/Developers_Guide/Data_Processor


Note: Stackoverflow's text editor using these question's answer. Check two links' rel attribute in this question.


I'm using <script src="//cdn.ckeditor.com/4.5.10/standard/ckeditor.js"></script> from cdn on my pages.


Solution

  • I solved it like;

    CKEDITOR.on('instanceReady', function(ev) {
            var editor = ev.editor;
            editor.dataProcessor.htmlFilter.addRules({
                    elements : {
                        a : function( element ) {
                            if ( !element.attributes.rel ){
                               //gets content's a href values
                                var url = element.attributes.href;
                               //extract host names from URLs 
                                var hostname = (new URL(url)).hostname;
                                if ( hostname !== window.location.host && hostname !=="youranothersite.com") {
                                    element.attributes.rel = 'nofollow';
                                }
                            }
                        }
                    }
                });
        })