middleman/middleman-core/lib/middleman-core/extension_manager.rb

96 lines
2.8 KiB
Ruby

module Middleman
class ExtensionManager
extend Forwardable
def_delegator :@app, :logger
def_delegators :@activated, :[], :each
def initialize(app)
@app = app
@activated = {}
::Middleman::Extensions.load_settings(@app)
manager = self
{
before_sitemap: :before_sitemap,
initialized: :before_configuration
}.each do |key, value|
cb = proc { manager.auto_activate(value) }
@app.send(key, &cb)
end
@app.after_configuration_eval(&method(:activate_all))
end
def auto_activate(key)
::Middleman::Extensions.auto_activate(key, @app)
end
# Activate an extension, optionally passing in options.
# This method is typically used from a project's `config.rb`.
#
# @example Activate an extension with no options
# activate :lorem
#
# @example Activate an extension, with options
# activate :minify_javascript, inline: true
#
# @example Use a block to configure extension options
# activate :minify_javascript do |opts|
# opts.ignore += ['*-test.js']
# end
#
# @param [Symbol] ext_name The name of thed extension to activate
# @param [Hash] options Options to pass to the extension
# @yield [Middleman::Configuration::ConfigurationManager] Extension options that can be modified before the extension is initialized.
# @return [void]
def activate(ext_name, options={}, &block)
begin
extension = ::Middleman::Extensions.load(ext_name)
rescue LoadError => e
logger.debug "== Failed Activation `#{ext_name}` : #{e.message}"
return
end
logger.debug "== Activating: #{ext_name}"
if extension.supports_multiple_instances?
@activated[ext_name] ||= {}
key = "instance_#{@activated[ext_name].keys.length}"
@activated[ext_name][key] = extension.new(@app, options, &block)
elsif @activated.key?(ext_name)
raise "#{ext_name} has already been activated and cannot be re-activated."
else
@activated[ext_name] = extension.new(@app, options, &block)
end
end
def activate_all
logger.debug 'Loaded extensions:'
@instances = @activated.each_with_object([]) do |(ext_name, ext), sum|
if ext.is_a?(Hash)
ext.each do |instance_key, instance|
logger.debug "== Extension: #{ext_name} #{instance_key}"
sum << instance
end
else
logger.debug "== Extension: #{ext_name}"
sum << ext
end
end
@instances.each do |ext|
::Middleman::Extension.activated_extension(ext)
end
end
def add_exposed_to_context(context)
@instances.each do |ext|
ext.add_exposed_to_context(context)
end
end
end
end