Merge pull request #2197 from jekyll/plugin-manager
This commit is contained in:
commit
9ace48c835
|
@ -34,6 +34,7 @@ require 'jekyll/utils'
|
||||||
require 'jekyll/stevenson'
|
require 'jekyll/stevenson'
|
||||||
require 'jekyll/deprecator'
|
require 'jekyll/deprecator'
|
||||||
require 'jekyll/configuration'
|
require 'jekyll/configuration'
|
||||||
|
require 'jekyll/plugin_manager'
|
||||||
require 'jekyll/site'
|
require 'jekyll/site'
|
||||||
require 'jekyll/convertible'
|
require 'jekyll/convertible'
|
||||||
require 'jekyll/url'
|
require 'jekyll/url'
|
||||||
|
|
|
@ -0,0 +1,76 @@
|
||||||
|
module Jekyll
|
||||||
|
class PluginManager
|
||||||
|
attr_reader :site
|
||||||
|
|
||||||
|
# Create an instance of this class.
|
||||||
|
#
|
||||||
|
# site - the instance of Jekyll::Site we're concerned with
|
||||||
|
#
|
||||||
|
# Returns nothing
|
||||||
|
def initialize(site)
|
||||||
|
@site = site
|
||||||
|
end
|
||||||
|
|
||||||
|
# Require all the plugins which are allowed.
|
||||||
|
#
|
||||||
|
# Returns nothing
|
||||||
|
def conscientious_require
|
||||||
|
require_plugin_files
|
||||||
|
require_gems
|
||||||
|
end
|
||||||
|
|
||||||
|
# Require each of the gem plugins specified.
|
||||||
|
#
|
||||||
|
# Returns nothing.
|
||||||
|
def require_gems
|
||||||
|
site.gems.each do |gem|
|
||||||
|
if plugin_allowed?(gem)
|
||||||
|
require gem
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Check whether a gem plugin is allowed to be used during this build.
|
||||||
|
#
|
||||||
|
# gem_name - the name of the gem
|
||||||
|
#
|
||||||
|
# Returns true if the gem name is in the whitelist or if the site is not
|
||||||
|
# in safe mode.
|
||||||
|
def plugin_allowed?(gem_name)
|
||||||
|
!site.safe || whitelist.include?(gem_name)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Build an array of allowed plugin gem names.
|
||||||
|
#
|
||||||
|
# Returns an array of strings, each string being the name of a gem name
|
||||||
|
# that is allowed to be used.
|
||||||
|
def whitelist
|
||||||
|
@whitelist ||= Array[site.config['whitelist']].flatten
|
||||||
|
end
|
||||||
|
|
||||||
|
# Require all .rb files if safe mode is off
|
||||||
|
#
|
||||||
|
# Returns nothing.
|
||||||
|
def require_plugin_files
|
||||||
|
unless site.safe
|
||||||
|
plugins_path.each do |plugins|
|
||||||
|
Dir[File.join(plugins, "**", "*.rb")].sort.each do |f|
|
||||||
|
require f
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Public: Setup the plugin search path
|
||||||
|
#
|
||||||
|
# Returns an Array of plugin search paths
|
||||||
|
def plugins_path
|
||||||
|
if (site.config['plugins'] == Jekyll::Configuration::DEFAULTS['plugins'])
|
||||||
|
[Jekyll.sanitized_path(site.source, site.config['plugins'])]
|
||||||
|
else
|
||||||
|
Array(site.config['plugins']).map { |d| File.expand_path(d) }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
|
@ -3,7 +3,8 @@ module Jekyll
|
||||||
attr_accessor :config, :layouts, :posts, :pages, :static_files,
|
attr_accessor :config, :layouts, :posts, :pages, :static_files,
|
||||||
:exclude, :include, :source, :dest, :lsi, :highlighter,
|
:exclude, :include, :source, :dest, :lsi, :highlighter,
|
||||||
:permalink_style, :time, :future, :safe, :plugins, :limit_posts,
|
:permalink_style, :time, :future, :safe, :plugins, :limit_posts,
|
||||||
:show_drafts, :keep_files, :baseurl, :data, :file_read_opts, :gems
|
:show_drafts, :keep_files, :baseurl, :data, :file_read_opts, :gems,
|
||||||
|
:plugin_manager
|
||||||
|
|
||||||
attr_accessor :converters, :generators
|
attr_accessor :converters, :generators
|
||||||
|
|
||||||
|
@ -19,9 +20,11 @@ module Jekyll
|
||||||
|
|
||||||
self.source = File.expand_path(config['source'])
|
self.source = File.expand_path(config['source'])
|
||||||
self.dest = File.expand_path(config['destination'])
|
self.dest = File.expand_path(config['destination'])
|
||||||
self.plugins = plugins_path
|
|
||||||
self.permalink_style = config['permalink'].to_sym
|
self.permalink_style = config['permalink'].to_sym
|
||||||
|
|
||||||
|
self.plugin_manager = Jekyll::PluginManager.new(self)
|
||||||
|
self.plugins = plugin_manager.plugins_path
|
||||||
|
|
||||||
self.file_read_opts = {}
|
self.file_read_opts = {}
|
||||||
self.file_read_opts[:encoding] = config['encoding'] if config['encoding']
|
self.file_read_opts[:encoding] = config['encoding'] if config['encoding']
|
||||||
|
|
||||||
|
@ -63,17 +66,7 @@ module Jekyll
|
||||||
def setup
|
def setup
|
||||||
ensure_not_in_dest
|
ensure_not_in_dest
|
||||||
|
|
||||||
# If safe mode is off, load in any Ruby files under the plugins
|
plugin_manager.conscientious_require
|
||||||
# directory.
|
|
||||||
unless safe
|
|
||||||
plugins.each do |plugins|
|
|
||||||
Dir[File.join(plugins, "**/*.rb")].sort.each do |f|
|
|
||||||
require f
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
require_gems
|
|
||||||
|
|
||||||
self.converters = instantiate_subclasses(Jekyll::Converter)
|
self.converters = instantiate_subclasses(Jekyll::Converter)
|
||||||
self.generators = instantiate_subclasses(Jekyll::Generator)
|
self.generators = instantiate_subclasses(Jekyll::Generator)
|
||||||
|
@ -90,33 +83,6 @@ module Jekyll
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def require_gems
|
|
||||||
gems.each do |gem|
|
|
||||||
if plugin_allowed?(gem)
|
|
||||||
require gem
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def plugin_allowed?(gem_name)
|
|
||||||
whitelist.include?(gem_name) || !safe
|
|
||||||
end
|
|
||||||
|
|
||||||
def whitelist
|
|
||||||
@whitelist ||= Array[config['whitelist']].flatten
|
|
||||||
end
|
|
||||||
|
|
||||||
# Internal: Setup the plugin search path
|
|
||||||
#
|
|
||||||
# Returns an Array of plugin search paths
|
|
||||||
def plugins_path
|
|
||||||
if (config['plugins'] == Jekyll::Configuration::DEFAULTS['plugins'])
|
|
||||||
[File.join(source, config['plugins'])]
|
|
||||||
else
|
|
||||||
Array(config['plugins']).map { |d| File.expand_path(d) }
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# Read Site data from disk and load it into internal data structures.
|
# Read Site data from disk and load it into internal data structures.
|
||||||
#
|
#
|
||||||
# Returns nothing.
|
# Returns nothing.
|
||||||
|
|
Loading…
Reference in New Issue