middleman/middleman-core/lib/middleman-core/core_extensions/routing.rb
2014-01-03 15:49:54 -08:00

76 lines
2.1 KiB
Ruby

# Routing extension
module Middleman
module CoreExtensions
module Routing
# Sandboxed layout to implement temporary overriding of layout.
class LayoutBlock
attr_reader :scope
def initialize(scope, layout_name)
@scope = scope
@layout_name = layout_name
end
def page(url, opts={})
opts[:layout] ||= @layout_name
@scope.page(url, opts)
end
delegate :proxy, :to => :scope
end
# Takes a block which allows many pages to have the same layout
#
# with_layout :admin do
# page "/admin/"
# page "/admin/login.html"
# end
#
# @param [String, Symbol] layout_name
# @return [void]
def with_layout(layout_name, &block)
LayoutBlock.new(self, layout_name).instance_eval(&block)
end
# The page method allows the layout to be set on a specific path
#
# page "/about.html", :layout => false
# page "/", :layout => :homepage_layout
#
# @param [String] url
# @param [Hash] opts
# @return [void]
def page(url, opts={})
options = opts.dup
# Default layout
options[:layout] = @app.config[:layout] if options[:layout].nil?
metadata = { :options => options, :locals => options.delete(:locals) || {} }
# If the url is a regexp
unless url.is_a?(Regexp) || url.include?('*')
# Normalized path
url = '/' + Middleman::Util.normalize_path(url)
if url.end_with?('/') || File.directory?(File.join(@app.source_dir, url))
url = File.join(url, @app.config[:index_file])
end
# Setup proxy
if target = options.delete(:proxy)
# TODO: deprecate proxy through page?
@app.proxy(url, target, opts.dup)
return
elsif options.delete(:ignore)
# TODO: deprecate ignore through page?
@app.ignore(url)
end
end
# Setup a metadata matcher for rendering those options
@app.sitemap.provides_metadata_for_path(url) { |_| metadata }
end
end
end
end