class Jekyll::Mentions

Constants

BODY_START_TAG
GITHUB_DOT_COM
InvalidJekyllMentionConfig
OPENING_BODY_TAG_REGEX

Public Class Methods

filter_with_mention(src) click to toggle source

Public: Create or fetch the filter for the given {{src}} base URL.

src - the base URL (e.g. github.com)

Returns an HTML::Pipeline instance for the given base URL.

# File lib/jekyll-mentions.rb, line 47
def filter_with_mention(src)
  filters[src] ||= HTML::Pipeline.new([
    HTML::Pipeline::MentionFilter,
  ], :base_url => src, :username_pattern => mention_username_pattern)
end
filters() click to toggle source

Public: Filters hash where the key is the mention base URL. Effectively a cache.

# File lib/jekyll-mentions.rb, line 59
def filters
  @filters ||= {}
end
mention_base(config = {}) click to toggle source

Public: Calculate the base URL to use for mentioning.

The custom base URL can be defined in either the site config or a document's front matter as `jekyll-mentions.base_url` or `jekyll-mentions`, and must be a valid URL (i.e. it must include a protocol and valid domain). It should not have a trailing slash.

config - The effective configuration that includes configurations for mentions.

Returns a URL to use as the base URL for mentions. Defaults to the github.com.

# File lib/jekyll-mentions.rb, line 74
def mention_base(config = {})
  mention_config = config["jekyll-mentions"]
  case mention_config
  when nil, NilClass
    default_mention_base
  when String
    mention_config.to_s
  when Hash
    mention_config.fetch("base_url", default_mention_base)
  else
    raise InvalidJekyllMentionConfig,
          "Your jekyll-mentions config has to either be a string or a hash. " \
          "It's a #{mention_config.class} right now."
  end
end
mention_username_pattern() click to toggle source
# File lib/jekyll-mentions.rb, line 53
def mention_username_pattern
  @mention_username_pattern ||= %r![\w][\w-]*!
end
mentionable?(doc) click to toggle source

Public: Defines the conditions for a document to be mentionable.

doc - the Jekyll::Document or Jekyll::Page

Returns true if the doc is written & is HTML.

# File lib/jekyll-mentions.rb, line 95
def mentionable?(doc)
  (doc.is_a?(Jekyll::Page) || doc.write?) &&
    (doc.output_ext == ".html" || (doc.permalink&.end_with?("/"))) &&
    (doc.data["jekyll-mentions"] != false)
end
mentionify(doc) click to toggle source

rubocop:disable Metrics/AbcSize

# File lib/jekyll-mentions.rb, line 17
def mentionify(doc)
  content = doc.output
  return unless content.include?("@")

  config = doc.site.config
  config = config.merge(doc.data) if doc.data.key?("jekyll-mentions")

  src = mention_base(config)

  if content.include? BODY_START_TAG
    head, opener, tail  = content.partition(OPENING_BODY_TAG_REGEX)
    body_content, *rest = tail.partition("</body>")

    return unless body_content&.match?(filter_regex)

    processed_markup = filter_with_mention(src).call(body_content)[:output].to_s
    doc.output       = String.new(head) << opener << processed_markup << rest.join
  else
    return unless content&.match?(filter_regex)

    doc.output = filter_with_mention(src).call(content)[:output].to_s
  end
end

Private Class Methods

default_mention_base() click to toggle source
# File lib/jekyll-mentions.rb, line 114
def default_mention_base
  if !ENV["SSL"].to_s.empty? && !ENV["GITHUB_HOSTNAME"].to_s.empty?
    scheme = ENV["SSL"] == "true" ? "https://" : "http://"
    "#{scheme}#{ENV["GITHUB_HOSTNAME"].chomp("/")}"
  else
    GITHUB_DOT_COM
  end
end
filter_regex() click to toggle source
# File lib/jekyll-mentions.rb, line 103
def filter_regex
  @filter_regex ||=
    begin
      Regexp.new(
        HTML::Pipeline::MentionFilter::MentionPatterns[mention_username_pattern]
      )
    rescue TypeError
      %r!@\w+!
    end
end