Jekyll ExtLinks plugin

This Jekyll plugin adds custom attributes to external links. For example, you can add rel="nofollow" to all external links by default (with exceptions if you need them), or something like class="external". You can also use it to add target="_blank" to links, but generally it is not recommended as it leads to bad user experience. Multiple attributes are allowed.

The Nokogiri gem is required. If you experience any problems installing Nokogiri («ERROR: Failed to build gem native extension», etc.), run gem update --system and try again.

Update: Jekyll ExtLinks plugin has been released to RubyGems: Use gem install jekyll-extlinks to install it.

It's also available on GitHub:

Download:  jekyll-extlinks.rb (664 downloads)

Source code:

# Jekyll ExtLinks plugin
# Adds custom attributes like rel="nofollow" to all external links.
# 1. Install: put it in your _plugins folder inside your Jekyll project
# source root. Install nokogiri (gem install nokogiri).
# 2. Configure plugin in _config.yml. Notice the indentation matters. Example:
# extlinks:
#   attributes: {rel: nofollow, target: _blank}
#   rel_exclude: ['', '']
# (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]({:rel="dofollow"}
# 3. Use in layouts: {{ content | extlinks }}
# Developed by Dmitry Ogarkov -
# Based on

require 'nokogiri'

module Jekyll
  module ExtLinks
    # Access plugin config in _config.yml
    def config

    # Checks if str contains any fragment of the fragments array
    def contains_any(str, fragments)
      return false unless Regexp.union(fragments) =~ str

    def extlinks(content)
      # Process configured link attributes and whitelisted hosts
      if config
        if config['attributes']
          attributes = Array(config['attributes'])
        if config['rel_exclude']
          rel_exclude = Array(config['rel_exclude'])
      # 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)
          a.set_attribute(attr, value)



Jekyll ExtLinks plugin: 6 комментариев

  1. Honza Pobo?il

    How is it going?

    I really use it now, because I have Jekyll theme using it and to include it in theme I need to have also plugins as a gem.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *