diff --git a/Gemfile b/Gemfile index d7b8fe661d0..1b5ab49ea5a 100644 --- a/Gemfile +++ b/Gemfile @@ -24,3 +24,4 @@ group :jekyll_plugins do end gem 'sinatra', '~> 1.4.2' +gem 'nokogiri' diff --git a/Gemfile.lock b/Gemfile.lock index 9b9a87a02c0..051fb09fdb5 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -42,6 +42,9 @@ GEM rb-inotify (~> 0.9, >= 0.9.7) mercenary (0.3.6) method_source (0.8.2) + mini_portile2 (2.3.0) + nokogiri (1.8.2) + mini_portile2 (~> 2.3.0) octopress (3.0.11) jekyll (>= 2.0) mercenary (~> 0.3.2) @@ -100,6 +103,7 @@ DEPENDENCIES jekyll-redirect-from jekyll-sitemap jekyll-time-to-read + nokogiri octopress (~> 3.0) octopress-include-tag pry @@ -113,4 +117,4 @@ RUBY VERSION ruby 2.4.1p111 BUNDLED WITH - 1.15.4 + 1.16.1 diff --git a/plugins/no_follow.rb b/plugins/no_follow.rb new file mode 100644 index 00000000000..27da6c90f25 --- /dev/null +++ b/plugins/no_follow.rb @@ -0,0 +1,33 @@ +# Jekyll Auto Nofollow Plugin +# Automatically adds rel='external nofollow' to outgoing links. + +require 'jekyll' +require 'nokogiri' + +module Jekyll + module NoFollow + def nofollow(content) + dom = Nokogiri::HTML.fragment(content) + + # Find all links + dom.css('a').each do |link| + rel = ['external', 'nofollow'] + + # All external links start with 'http', skip when this one does not + next unless link.get_attribute('href') =~ /\Ahttp/i + + # Play nice with our own links + next if link.get_attribute('href') =~ /\Ahttps?:\/\/\w*.?home-assistant.io/i + + # Play nice with links that already have a rel attribute set + rel.unshift(link.get_attribute('rel')) + + # Add rel attribute to link + link.set_attribute('rel', rel.join(' ').strip) + end + dom.to_s + end + end +end + +Liquid::Template.register_filter(Jekyll::NoFollow) diff --git a/source/_layouts/default.html b/source/_layouts/default.html index 5c8e47d068f..ca7e0199c2b 100644 --- a/source/_layouts/default.html +++ b/source/_layouts/default.html @@ -24,7 +24,7 @@ layout: compress
{% endif %} - {{ content }} + {{ content | nofollow }}