108 lines
3.1 KiB
Ruby
108 lines
3.1 KiB
Ruby
require "jekyll"
|
|
require "uri"
|
|
|
|
module Jekyll
|
|
module GitHubMetadata
|
|
class SiteGitHubMunger
|
|
extend Forwardable
|
|
|
|
class << self
|
|
attr_accessor :global_munger
|
|
end
|
|
|
|
def_delegators Jekyll::GitHubMetadata, :site, :repository
|
|
private :repository
|
|
|
|
def initialize(site)
|
|
Jekyll::GitHubMetadata.site = site
|
|
@original_config = site.config["github"]
|
|
end
|
|
|
|
def munge!
|
|
Jekyll::GitHubMetadata.log :debug, "Initializing..."
|
|
|
|
add_title_and_description_fallbacks!
|
|
add_url_and_baseurl_fallbacks! if should_add_url_fallbacks?
|
|
end
|
|
|
|
def inject_metadata!(payload)
|
|
payload.site["github"] = github_namespace
|
|
end
|
|
|
|
def uninject_metadata!(payload)
|
|
payload.site["github"] = @original_config
|
|
end
|
|
|
|
private
|
|
|
|
def github_namespace
|
|
case @original_config
|
|
when nil
|
|
drop
|
|
when Hash
|
|
drop.merge(@original_config)
|
|
else
|
|
@original_config
|
|
end
|
|
end
|
|
|
|
def drop
|
|
@drop ||= MetadataDrop.new(GitHubMetadata.site)
|
|
end
|
|
|
|
# Set `site.url` and `site.baseurl` if unset.
|
|
def add_url_and_baseurl_fallbacks!
|
|
site.config["url"] ||= Value.new("url", proc { |_c, r| r.url_without_path })
|
|
return unless should_set_baseurl?
|
|
|
|
site.config["baseurl"] = Value.new("baseurl", proc { |_c, r| r.baseurl })
|
|
end
|
|
|
|
def add_title_and_description_fallbacks!
|
|
if should_warn_about_site_name?
|
|
msg = "site.name is set in _config.yml, but many plugins and themes expect "
|
|
msg << "site.title to be used instead. To avoid potential inconsistency, "
|
|
msg << "Jekyll GitHub Metadata will not set site.title to the repository's name."
|
|
Jekyll::GitHubMetadata.log :warn, msg
|
|
else
|
|
site.config["title"] ||= Value.new("title", proc { |_context, repository|
|
|
if repository.project_page?
|
|
repository.name
|
|
else
|
|
repository.owner_display_name || repository.owner
|
|
end
|
|
})
|
|
end
|
|
site.config["description"] ||= Value.new("description", proc { |_c, r| r.tagline })
|
|
end
|
|
|
|
# Set the baseurl only if it is `nil` or `/`
|
|
# Baseurls should never be "/". See http://bit.ly/2s1Srid
|
|
def should_set_baseurl?
|
|
site.config["baseurl"].nil? || site.config["baseurl"] == "/"
|
|
end
|
|
|
|
def should_add_url_fallbacks?
|
|
Jekyll.env == "production" || Pages.page_build?
|
|
end
|
|
|
|
def should_warn_about_site_name?
|
|
site.config["name"] && !site.config["title"]
|
|
end
|
|
end
|
|
|
|
Jekyll::Hooks.register :site, :after_init do |site|
|
|
SiteGitHubMunger.global_munger = SiteGitHubMunger.new(site)
|
|
SiteGitHubMunger.global_munger.munge!
|
|
end
|
|
|
|
Jekyll::Hooks.register :site, :pre_render do |_site, payload|
|
|
SiteGitHubMunger.global_munger.inject_metadata!(payload)
|
|
end
|
|
|
|
Jekyll::Hooks.register :site, :post_render do |_site, payload|
|
|
SiteGitHubMunger.global_munger.uninject_metadata!(payload)
|
|
end
|
|
end
|
|
end
|