-
Notifications
You must be signed in to change notification settings - Fork 10
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
4 changed files
with
82 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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) |