diff --git a/_config.yml b/_config.yml index 92c0b50..e3a1eb4 100644 --- a/_config.yml +++ b/_config.yml @@ -63,6 +63,10 @@ autopages: collections: enabled: false +extlinks: + attributes: {rel: "noreferrer noopener", target: _blank} + rel_exclude: ['angular.de', 'vuejs.de', 'reactjs.de', 'workshops.de', 'webdave.de', 'ng-de.org', 'conf.vuejs.de'] + # Build settings markdown: kramdown sass: diff --git a/_layouts/post.html b/_layouts/post.html index 525da22..97b9cfe 100644 --- a/_layouts/post.html +++ b/_layouts/post.html @@ -50,7 +50,7 @@

{{ page.title }}

- {{ content }} + {{ content | extlinks }}
diff --git a/_plugins/jekyll-extlinks.rb b/_plugins/jekyll-extlinks.rb new file mode 100644 index 0000000..481fd36 --- /dev/null +++ b/_plugins/jekyll-extlinks.rb @@ -0,0 +1,76 @@ +# Jekyll ExtLinks Plugin +# Adds custom attributes to external links (rel="nofollow", target="_blank", etc.) +# +# Configuration example in _config.yml (notice the indentation matters): +# +# extlinks: +# attributes: {rel: nofollow, target: _blank} +# rel_exclude: ['host1.com', 'host2.net'] +# +# (attributes are required - at least one of them, rel_exclude is optional) +# Relative links will not be processed. +# Links to hosts listed in rel_exclude will not have the 'rel' attribute set. +# Links which have the 'rel' attribute already will keep it unchanged, like +# this one in Markdown: +# [Link text](http://someurl.com){:rel="dofollow"} +# +# Using in layouts: {{ content | extlinks }} +# +# Developed by Dmitry Ogarkov - http://ogarkov.com/jekyll/plugins/extlinks/ +# Based on http://dev.mensfeld.pl/2014/12/rackrails-middleware-that-will-ensure-relnofollow-for-all-your-links/ + +require 'jekyll' +require 'nokogiri' + +module Jekyll + module ExtLinks + # Access plugin config in _config.yml + def config + @context.registers[:site].config['extlinks'] + end + + # Checks if str contains any fragment of the fragments array + def contains_any(str, fragments) + return false unless Regexp.union(fragments) =~ str + true + end + + def extlinks(content) + # Process configured link attributes and whitelisted hosts + if config + if config['attributes'] + attributes = Array(config['attributes']) + end + if config['rel_exclude'] + rel_exclude = Array(config['rel_exclude']) + end + end + # Stop if no attributes were specified + return content unless attributes + + doc = Nokogiri::HTML.fragment(content) + # Stop if we could't parse with HTML + return content unless doc + + doc.css('a').each do |a| + # If this is a local link don't change it + next unless a.get_attribute('href') =~ /\Ahttp/i + + attributes.each do |attr, value| + if attr.downcase == 'rel' + # If there's a rel already don't change it + next unless !a.get_attribute('rel') || a.get_attribute('rel').empty? + # Skip whitelisted hosts for the 'rel' attribute + next if rel_exclude && contains_any(a.get_attribute('href'), rel_exclude) + end + a.set_attribute(attr, value) + end + end + + doc.to_s + end + + end +end + +Liquid::Template.register_filter(Jekyll::ExtLinks) \ No newline at end of file diff --git a/shared b/shared index 2b90e78..d211830 160000 --- a/shared +++ b/shared @@ -1 +1 @@ -Subproject commit 2b90e78ffeca924311bfcf484409d6cd828fa6e8 +Subproject commit d2118301a593045195424a189f1fbc90e4c2bca8