From e2d583987476f3c199484e8b2f530b92e663f1f2 Mon Sep 17 00:00:00 2001 From: Thomas Reynolds Date: Wed, 7 Dec 2011 21:00:27 -0800 Subject: [PATCH] page helper uses provides_metadata to apply options at last minute to final output path. closes #182 --- lib/middleman/core_extensions/rendering.rb | 8 ++++---- lib/middleman/core_extensions/routing.rb | 12 +++++++++++ lib/middleman/core_extensions/sitemap.rb | 6 ++++++ lib/middleman/sitemap/page.rb | 1 + lib/middleman/sitemap/store.rb | 4 +++- lib/middleman/sitemap/template.rb | 24 +++++++++++++++++----- 6 files changed, 45 insertions(+), 10 deletions(-) diff --git a/lib/middleman/core_extensions/rendering.rb b/lib/middleman/core_extensions/rendering.rb index e5d587df..21e97110 100644 --- a/lib/middleman/core_extensions/rendering.rb +++ b/lib/middleman/core_extensions/rendering.rb @@ -171,11 +171,11 @@ module Middleman::CoreExtensions::Rendering # @private def locate_layout(name, preferred_engine=nil) layout_path = false - + if !preferred_engine.nil? # Check root layout_path, layout_engine = resolve_template(name, :preferred_engine => preferred_engine) - + # Check layouts folder if !layout_path layout_path, layout_engine = resolve_template(File.join("layouts", name.to_s), :preferred_engine => preferred_engine) @@ -229,8 +229,8 @@ module Middleman::CoreExtensions::Rendering found_path = Dir[path_with_ext].find do |path| ::Tilt[path] end - - if found_path || File.exists?(on_disk_path) + + if found_path || (File.exists?(on_disk_path) && !File.directory?(on_disk_path)) engine = found_path ? File.extname(found_path)[1..-1].to_sym : nil [ found_path || on_disk_path, engine ] else diff --git a/lib/middleman/core_extensions/routing.rb b/lib/middleman/core_extensions/routing.rb index f2601951..80a9e21e 100644 --- a/lib/middleman/core_extensions/routing.rb +++ b/lib/middleman/core_extensions/routing.rb @@ -25,6 +25,18 @@ module Middleman::CoreExtensions::Routing # page "/about.html", :layout => false # page "/", :layout => :homepage_layout def page(url, opts={}, &block) + if url.include?("*") + url = Regexp.new(url.gsub("*", "(.*)").gsub(/^\//, "^")) + end + + if url.is_a?(Regexp) && !opts.empty? + provides_metadata_for_path url do |url| + { :options => opts } + end + + return + end + opts[:layout] = layout if opts[:layout].nil? url = full_path(url) diff --git a/lib/middleman/core_extensions/sitemap.rb b/lib/middleman/core_extensions/sitemap.rb index 2fd1dfd6..fd3509b2 100644 --- a/lib/middleman/core_extensions/sitemap.rb +++ b/lib/middleman/core_extensions/sitemap.rb @@ -40,5 +40,11 @@ module Middleman::CoreExtensions::Sitemap @_provides_metadata << [block, matcher] if block_given? @_provides_metadata end + + def provides_metadata_for_path(matcher=nil, &block) + @_provides_metadata_for_path ||= [] + @_provides_metadata_for_path << [block, matcher] if block_given? + @_provides_metadata_for_path + end end end \ No newline at end of file diff --git a/lib/middleman/sitemap/page.rb b/lib/middleman/sitemap/page.rb index a5557bfd..3ca8ff00 100644 --- a/lib/middleman/sitemap/page.rb +++ b/lib/middleman/sitemap/page.rb @@ -69,6 +69,7 @@ module Middleman::Sitemap end def touch + template.touch if template? end def custom_renderer(&block) diff --git a/lib/middleman/sitemap/store.rb b/lib/middleman/sitemap/store.rb index c684eab5..bbb1d7d6 100644 --- a/lib/middleman/sitemap/store.rb +++ b/lib/middleman/sitemap/store.rb @@ -115,7 +115,9 @@ module Middleman::Sitemap # @app.logger.debug :sitemap_update, Time.now, path if @app.logging? # Add generic path - page(path).source_file = File.expand_path(file, @app.root) + p = page(path) + p.source_file = File.expand_path(file, @app.root) + p.touch true end diff --git a/lib/middleman/sitemap/template.rb b/lib/middleman/sitemap/template.rb index 5fd92bfa..31267924 100644 --- a/lib/middleman/sitemap/template.rb +++ b/lib/middleman/sitemap/template.rb @@ -29,17 +29,31 @@ module Middleman::Sitemap def ext page.ext end - + + def touch + app.cache.remove(:metadata, source_file) + end + def metadata - app.cache.fetch(:metadata, source_file) do - metadata = { :options => {}, :locals => {} } + metadata = app.cache.fetch(:metadata, source_file) do + data = { :options => {}, :locals => {} } + app.provides_metadata.each do |callback, matcher| next if !matcher.nil? && !source_file.match(matcher) result = app.instance_exec(source_file, &callback) - metadata = metadata.deep_merge(result) + data = data.deep_merge(result) end - metadata + + data end + + app.provides_metadata_for_path.each do |callback, matcher| + next if !matcher.nil? && !path.match(matcher) + result = app.instance_exec(path, &callback) + metadata = metadata.deep_merge(result) + end + + metadata end def render(opts={}, locs={}, &block)