1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
|
# frozen_string_literal: true
module JekyllRedirectFrom
class Generator < Jekyll::Generator
safe true
attr_reader :site, :redirects
def generate(site)
@site = site
@redirects = {}
# Inject our layout, unless the user has already specified a redirect layout'
unless site.layouts.key?("redirect")
site.layouts["redirect"] = JekyllRedirectFrom::Layout.new(site)
end
# Must duplicate pages to modify while in loop
(site.docs_to_write + site.pages.dup).each do |doc|
next unless redirectable_document?(doc)
generate_redirect_from(doc)
generate_redirect_to(doc)
end
generate_redirects_json if generate_redirects_json?
end
private
# For every `redirect_from` entry, generate a redirect page
def generate_redirect_from(doc)
doc.redirect_from.each do |path|
page = RedirectPage.redirect_from(doc, path)
doc.site.pages << page
redirects[page.redirect_from] = page.redirect_to
end
end
def generate_redirect_to(doc)
return unless doc.redirect_to
page = RedirectPage.redirect_to(doc, doc.redirect_to)
doc.data.merge!(page.data)
doc.content = doc.output = page.output
redirects[page.redirect_from] = page.redirect_to
end
def generate_redirects_json
return if File.exist? site.in_source_dir("redirects.json")
page = PageWithoutAFile.new(site, "", "", "redirects.json")
page.content = redirects.to_json
page.data["layout"] = nil
site.pages << page
end
def redirectable_document?(doc)
doc.is_a?(Jekyll::Document) || doc.is_a?(Jekyll::Page)
end
def generate_redirects_json?
site.config.dig("redirect_from", "json") != false
end
end
end
|