middleman/lib/middleman/core_extensions/features.rb

125 lines
3.4 KiB
Ruby
Raw Normal View History

# Middleman provides an extension API which allows you to hook into the
# lifecycle of a page request, or static build, and manipulate the output.
# Internal to Middleman, these extensions are called "features," but we use
# the exact same API as is made available to the public.
#
# A Middleman extension looks like this:
#
# module MyExtension
# class << self
# def registered(app)
# # My Code
# end
# end
# end
#
# In your `config.rb`, you must load your extension (if it is not defined in
# that file) and call `activate`.
#
# require "my_extension"
# activate MyExtension
#
# This will call the `registered` method in your extension and provide you
2011-10-04 02:09:27 +02:00
# with the `app` parameter which is a Middleman::Base context. From here
# you can choose to respond to requests for certain paths or simply attach
# Rack middleware to the stack.
#
# The built-in features cover a wide range of functions. Some provide helper
# methods to use in your views. Some modify the output on-the-fly. And some
# apply computationally-intensive changes to your final build files.
module Middleman::CoreExtensions::Features
class << self
2011-11-18 04:56:55 +01:00
def included(app)
# app.set :default_features, []
2011-11-09 00:45:22 +01:00
app.define_hook :after_configuration
app.define_hook :before_configuration
app.define_hook :build_config
app.define_hook :development_config
app.extend ClassMethods
2011-11-18 04:56:55 +01:00
app.send :include, InstanceMethods
end
end
module ClassMethods
def configure(env, &block)
send("#{env}_config", &block)
end
2011-11-18 04:56:55 +01:00
def extensions
@extensions ||= []
end
def register(*new_extensions)
@extensions ||= []
@extensions += new_extensions
new_extensions.each do |extension|
extend extension
extension.registered(self) if extension.respond_to?(:registered)
end
end
end
module InstanceMethods
# This method is available in the project's `config.rb`.
# It takes a underscore-separated symbol, finds the appropriate
# feature module and includes it.
#
# activate :lorem
#
# Alternatively, you can pass in a Middleman feature module directly.
#
# activate MyFeatureModule
def activate(feature)
if feature.is_a? Symbol
feature = feature.to_s
end
if feature.is_a? String
feature = feature.camelize
2011-11-18 04:56:55 +01:00
feature = ::Middleman::Features.const_get(feature)
end
2011-11-08 07:34:02 +01:00
puts "== Activating: #{feature}" if logging?
2011-11-18 04:56:55 +01:00
self.class.register feature
end
def configure(env, &block)
self.class.configure(env, &block)
end
# Load features before starting server
2011-11-18 04:56:55 +01:00
def initialize
super
run_hook :before_configuration
# Check for and evaluate local configuration
2011-11-21 06:21:19 +01:00
local_config = File.join(root, "config.rb")
if File.exists? local_config
2011-11-08 07:34:02 +01:00
puts "== Reading: Local config" if logging?
2011-11-18 09:34:56 +01:00
instance_eval File.read(local_config)
end
run_hook :build_config if build?
run_hook :development_config if development?
2011-11-18 04:56:55 +01:00
run_hook :after_configuration
# Add in defaults
default_features.each do |ext|
2011-11-18 04:56:55 +01:00
# activate ext
end
if logging?
self.class.extensions.each do |ext|
2011-11-08 07:34:02 +01:00
puts "== Extension: #{ext}"
end
end
run_hook :ready
end
end
end