class Jekyll::WebmentionIO::GatherWebmentions

Public Instance Methods

generate(site) click to toggle source
# File lib/jekyll/generators/gather_webmentions.rb, line 18
def generate(site)
  @site = site
  @site_url = site.config["url"].to_s

  if @site.config['serving']
    Jekyll::WebmentionIO.log "msg", "Webmentions won’t be gathered when running `jekyll serve`."
    @site.config['webmentions']['pause_lookups'] = true
    return
  end

  if @site_url.include? "localhost"
    Jekyll::WebmentionIO.log "msg", "Webmentions won’t be gathered on localhost."
    return
  end

  if @site.config.dig("webmentions", "pause_lookups") == true
    WebmentionIO.log "msg", "Webmention gathering is currently paused."
    return
  end

  WebmentionIO.log "msg", "Beginning to gather webmentions of your posts. This may take a while."

  WebmentionIO.api_path = "mentions"
  # add an arbitrarily high perPage to trump pagination
  WebmentionIO.api_suffix = "&perPage=9999"

  @cached_webmentions = WebmentionIO.read_cached_webmentions "incoming"

  @lookups = WebmentionIO.read_lookup_dates

  posts = WebmentionIO.gather_documents(@site)
  posts.each do |post|
    check_for_webmentions(post)
  end

  WebmentionIO.cache_lookup_dates @lookups

  WebmentionIO.cache_webmentions "incoming", @cached_webmentions
end

Private Instance Methods

assemble_api_params(targets, since_id) click to toggle source
# File lib/jekyll/generators/gather_webmentions.rb, line 139
def assemble_api_params(targets, since_id)
  api_params = targets.collect { |v| "target[]=#{v}" }.join("&")
  api_params << "&since_id=#{since_id}" if since_id
  api_params << "&sort-by=published"
  api_params
end
cache_new_webmentions(post_uri, response) click to toggle source
# File lib/jekyll/generators/gather_webmentions.rb, line 146
def cache_new_webmentions(post_uri, response)
  # Get cached webmentions
  webmentions = if @cached_webmentions.key? post_uri
                  @cached_webmentions[post_uri]
                else
                  {}
                end

  if response && response["links"]
    response["links"].reverse_each do |link|
      webmention = WebmentionIO::WebmentionItem.new(link, @site)

      # Do we already have it?
      if webmentions.key? webmention.id
        next
      end

      # Add it to the list
      WebmentionIO.log "info", webmention.to_hash.inspect
      webmentions[webmention.id] = webmention.to_hash
    end # each link
  end # if response
  @cached_webmentions[post_uri] = webmentions
end
check_for_webmentions(post) click to toggle source
# File lib/jekyll/generators/gather_webmentions.rb, line 60
def check_for_webmentions(post)
  WebmentionIO.log "info", "Checking for webmentions of #{post.url}."

  last_webmention = @cached_webmentions.dig(post.url, @cached_webmentions.dig(post.url)&.keys&.last)

  # get the last webmention
  last_lookup = if @lookups[post.url]
                  @lookups[post.url]
                elsif last_webmention
                  Date.parse last_webmention.dig("raw", "verified_date")
                end

  # should we throttle?
  if post.respond_to? "date" # Some docs have no date
    if last_lookup && WebmentionIO.post_should_be_throttled?(post, post.date, last_lookup)
      WebmentionIO.log "info", "Throttling this post."
      return
    end
  end

  # Get the last id we have in the hash
  since_id = last_webmention ? last_webmention.dig("raw", "id") : false

  # Gather the URLs
  targets = get_webmention_target_urls(post)

  # execute the API
  response = WebmentionIO.get_response assemble_api_params(targets, since_id)
  webmentions = response.dig("links")
  if webmentions && !webmentions.empty?
    WebmentionIO.log "info", "Here’s what we got back:\n\n#{response.inspect}\n\n"
  else
    WebmentionIO.log "info", "No webmentions found."
  end

  @lookups[post.url] = Date.today
  cache_new_webmentions(post.url, response)
end
gather_legacy_targets(uri, targets) click to toggle source
# File lib/jekyll/generators/gather_webmentions.rb, line 128
def gather_legacy_targets(uri, targets)
  if WebmentionIO.config.key? "legacy_domains"
    WebmentionIO.log "info", "adding legacy URIs"
    WebmentionIO.config["legacy_domains"].each do |domain|
      legacy = uri.sub(@site_url, domain)
      WebmentionIO.log "info", "adding URI #{legacy}"
      targets.push(legacy)
    end
  end
end
gather_redirected_targets(post, uri, targets) click to toggle source
# File lib/jekyll/generators/gather_webmentions.rb, line 113
def gather_redirected_targets(post, uri, targets)
  redirected = false
  if post.data.key? "redirect_from"
    if post.data["redirect_from"].is_a? String
      redirected = uri.sub post.url, post.data["redirect_from"]
      targets.push(redirected)
    elsif post.data["redirect_from"].is_a? Array
      post.data["redirect_from"].each do |redirect|
        redirected = uri.sub post.url, redirect
        targets.push(redirected)
      end
    end
  end
end
get_webmention_target_urls(post) click to toggle source
# File lib/jekyll/generators/gather_webmentions.rb, line 99
def get_webmention_target_urls(post)
  targets = []
  uri = File.join(@site_url, post.url)
  targets.push(uri)

  # Redirection?
  gather_redirected_targets(post, uri, targets)

  # Domain changed?
  gather_legacy_targets(uri, targets)

  targets
end