1
0
Fork 0
mirror of https://github.com/middleman/middleman.git synced 2022-11-09 12:20:27 -05:00
middleman--middleman/lib/middleman/core_extensions/routing.rb

93 lines
2.6 KiB
Ruby
Raw Normal View History

2011-07-06 13:46:06 -04:00
module Middleman::CoreExtensions::Routing
class << self
def registered(app)
app.extend ClassMethods
app.set :proxied_paths, {}
2011-07-27 17:14:22 -04:00
app.set :excluded_paths, []
app.build_reroute do |destination, request_path|
throw if app.settings.excluded_paths.include?(request_path)
end
# Normalize the path and add index if we're looking at a directory
app.before_processing do
request.path_info = self.class.path_to_index(request.path)
true
end
2011-07-06 13:46:06 -04:00
end
alias :included :registered
end
2011-07-08 18:01:57 -04:00
module ClassMethods
def path_to_index(path)
parts = path ? path.split('/') : []
if parts.last.nil? || parts.last.split('.').length == 1
path = File.join(path, settings.index_file)
end
path.gsub(%r{^/}, '')
end
2011-07-06 13:46:06 -04:00
# Takes a block which allows many pages to have the same layout
# with_layout :admin do
# page "/admin/"
# page "/admin/login.html"
# end
def with_layout(layout_name, &block)
2011-07-08 18:01:57 -04:00
old_layout = settings.layout
2011-07-06 13:46:06 -04:00
2011-07-08 18:01:57 -04:00
set :layout, layout_name
2011-07-06 13:46:06 -04:00
class_eval(&block) if block_given?
ensure
2011-07-08 18:01:57 -04:00
set :layout, old_layout
2011-07-06 13:46:06 -04:00
end
def paths_for_url(url)
url = url.gsub(%r{\/#{settings.index_file}$}, "")
2011-07-06 13:46:06 -04:00
url = url.gsub(%r{(\/)$}, "") if url.length > 1
paths = [url]
paths << "#{url}/" if url.length > 1 && url.split("/").last.split('.').length <= 1
paths << "/#{path_to_index(url)}"
paths
end
2011-07-27 17:14:22 -04:00
# Keep a path from building
def ignore(path)
settings.excluded_paths << paths_for_url(path)
settings.excluded_paths.flatten!
settings.excluded_paths.uniq!
end
# The page method allows the layout to be set on a specific path
# page "/about.html", :layout => false
# page "/", :layout => :homepage_layout
def page(url, options={}, &block)
2011-07-21 19:55:18 -04:00
has_block = block_given?
options[:layout] = settings.layout if options[:layout].nil?
if options.has_key?(:proxy)
settings.proxied_paths[url] = options[:proxy]
2011-07-27 17:14:22 -04:00
if options.has_key?(:ignore) && options[:ignore]
settings.ignore(options[:proxy])
end
else
if options.has_key?(:ignore) && options[:ignore]
settings.ignore(url)
end
end
2011-07-27 17:14:22 -04:00
paths_for_url(url).each do |p|
2011-07-06 13:46:06 -04:00
get(p) do
if settings.proxied_paths.has_key?(url)
request["is_proxy"] = true
request.path_info = settings.proxied_paths[url]
end
2011-07-21 19:55:18 -04:00
instance_eval(&block) if has_block
2011-07-06 13:46:06 -04:00
process_request(options)
end
end
end
end
end