From 92319ebffcc365d713e0696e945e9b31bfc93524 Mon Sep 17 00:00:00 2001 From: Thomas Reynolds Date: Thu, 5 Jan 2012 21:18:55 -0800 Subject: [PATCH] support glob page instance vars. fixes #230 --- middleman-core/features/dynamic_pages.feature | 22 +++++++++++++++ middleman-core/features/instance_vars.feature | 2 -- .../fixtures/dynamic-pages-app/config.rb | 20 +++++++++++++ .../source/real/index.html.erb | 6 +++- .../middleman-core/core_extensions/routing.rb | 14 +++++----- .../lib/middleman-core/sitemap/page.rb | 28 +++++++++++++------ .../lib/middleman-core/sitemap/template.rb | 21 +++++++++++--- 7 files changed, 90 insertions(+), 23 deletions(-) diff --git a/middleman-core/features/dynamic_pages.feature b/middleman-core/features/dynamic_pages.feature index 956a8fcf..a0d2dffb 100644 --- a/middleman-core/features/dynamic_pages.feature +++ b/middleman-core/features/dynamic_pages.feature @@ -46,23 +46,45 @@ Feature: Dynamic Pages Given the Server is running at "dynamic-pages-app" When I go to "/fake/one.html" Then I should see "I am real: one" + Then I should see "Global: I am one glob" + Then I should see "All: I am all glob" + When I go to "/fake2/one.html" Then I should see "I am real: one" + Then I should see "Global: I am two glob" + Then I should see "All: I am all glob" + When I go to "/fake3/one.html" Then I should see "I am real: one" + Then I should see "Global: I am three glob" + Then I should see "All: I am all glob" + When I go to "/fake4/one.html" Then I should see "I am real: one" + Then I should see "Global: I am four glob" + Then I should see "All: I am all glob" Scenario: Preview proxy with variable two Given the Server is running at "dynamic-pages-app" When I go to "/fake/two.html" Then I should see "I am real: two" + Then I should see "Global: I am one glob" + Then I should see "All: I am all glob" + When I go to "/fake2/two.html" Then I should see "I am real: two" + Then I should see "Global: I am two glob" + Then I should see "All: I am all glob" + When I go to "/fake3/two.html" Then I should see "I am real: two" + Then I should see "Global: I am three glob" + Then I should see "All: I am all glob" + When I go to "/fake4/two.html" Then I should see "I am real: two" + Then I should see "Global: I am four glob" + Then I should see "All: I am all glob" Scenario: Target ignore Given the Server is running at "dynamic-pages-app" diff --git a/middleman-core/features/instance_vars.feature b/middleman-core/features/instance_vars.feature index dd6bcdee..63e5261f 100644 --- a/middleman-core/features/instance_vars.feature +++ b/middleman-core/features/instance_vars.feature @@ -16,5 +16,3 @@ Feature: Instance Vars When I go to "/instance-var-set.html" When I go to "/no-instance-var.html" Then I should see "No var..." - - \ No newline at end of file diff --git a/middleman-core/fixtures/dynamic-pages-app/config.rb b/middleman-core/fixtures/dynamic-pages-app/config.rb index e23f0118..f0b7299d 100644 --- a/middleman-core/fixtures/dynamic-pages-app/config.rb +++ b/middleman-core/fixtures/dynamic-pages-app/config.rb @@ -26,4 +26,24 @@ page "/target_ignore4.html", :proxy => "should_be_ignored8.html", :ignore => tru page "/fake4/#{num}.html", :proxy => "real/index.html" do @num = num end +end + +page "f*/*" do + @all_glob = "I am all glob" +end + +page "fake/*" do + @glob_var = "I am one glob" +end + +page "fake2/*" do + @glob_var = "I am two glob" +end + +page "fake3/*" do + @glob_var = "I am three glob" +end + +page "fake4/*" do + @glob_var = "I am four glob" end \ No newline at end of file diff --git a/middleman-core/fixtures/dynamic-pages-app/source/real/index.html.erb b/middleman-core/fixtures/dynamic-pages-app/source/real/index.html.erb index 190d84ec..6e24c740 100644 --- a/middleman-core/fixtures/dynamic-pages-app/source/real/index.html.erb +++ b/middleman-core/fixtures/dynamic-pages-app/source/real/index.html.erb @@ -2,4 +2,8 @@ layout: false --- -I am real: <%= @num %> \ No newline at end of file +I am real: <%= @num %> + +Global: <%= @glob_var %> + +All: <%= @all_glob %> \ No newline at end of file diff --git a/middleman-core/lib/middleman-core/core_extensions/routing.rb b/middleman-core/lib/middleman-core/core_extensions/routing.rb index 80a9e21e..9be58ea6 100644 --- a/middleman-core/lib/middleman-core/core_extensions/routing.rb +++ b/middleman-core/lib/middleman-core/core_extensions/routing.rb @@ -25,13 +25,15 @@ module Middleman::CoreExtensions::Routing # page "/about.html", :layout => false # page "/", :layout => :homepage_layout def page(url, opts={}, &block) + a_block = block_given? ? block : nil + if url.include?("*") - url = Regexp.new(url.gsub("*", "(.*)").gsub(/^\//, "^")) + url = Regexp.new(url.gsub("*", "(.*?)").gsub(/^\//, "^")) end - if url.is_a?(Regexp) && !opts.empty? + if url.is_a?(Regexp) provides_metadata_for_path url do |url| - { :options => opts } + { :options => opts, :blocks => [a_block] } end return @@ -57,11 +59,9 @@ module Middleman::CoreExtensions::Routing end end - a_block = block_given? ? block : nil if a_block || !opts.empty? - sitemap.page(url) do - template.options = opts - template.blocks = [a_block] + provides_metadata_for_path url do |url| + { :options => opts, :blocks => [a_block] } end end end diff --git a/middleman-core/lib/middleman-core/sitemap/page.rb b/middleman-core/lib/middleman-core/sitemap/page.rb index 5a58ddc5..7717495a 100644 --- a/middleman-core/lib/middleman-core/sitemap/page.rb +++ b/middleman-core/lib/middleman-core/sitemap/page.rb @@ -23,6 +23,14 @@ module Middleman::Sitemap @source_file = src end + def request_path + if proxy? + store.page(proxied_to).path + else + path + end + end + def source_file if proxy? store.page(proxied_to).source_file @@ -83,24 +91,26 @@ module Middleman::Sitemap if proxy? # Forward blocks - forward_blocks = template.blocks.compact - forward_blocks << block if block_given? - store.page(proxied_to).template.render(*args) do - forward_blocks.each do |block| - instance_exec(&block) - end - end + # forward_blocks = template.blocks.compact + # forward_blocks << block if block_given? + t = store.page(proxied_to).template + t.request_path = path + t.render(*args) + # do + # forward_blocks.each do |block| + # instance_exec(&block) + # end + # end elsif !custom_renderer.nil? params = args.dup params << block if block_given? instance_exec(*params, &custom_renderer) else + template.request_path = path template.render(*args, &block) end end - - def directory_index? path.include?(app.index_file) || path =~ /\/$/ || eponymous_directory? end diff --git a/middleman-core/lib/middleman-core/sitemap/template.rb b/middleman-core/lib/middleman-core/sitemap/template.rb index cdabfa46..74dd89c6 100644 --- a/middleman-core/lib/middleman-core/sitemap/template.rb +++ b/middleman-core/lib/middleman-core/sitemap/template.rb @@ -1,7 +1,7 @@ module Middleman::Sitemap class Template - attr_accessor :page, :options, :locals, :blocks#, :dependencies + attr_accessor :page, :options, :locals, :blocks, :request_path def initialize(page) @page = page @@ -36,7 +36,7 @@ module Middleman::Sitemap def metadata metadata = app.cache.fetch(:metadata, source_file) do - data = { :options => {}, :locals => {}, :page => {} } + data = { :options => {}, :locals => {}, :page => {}, :blocks => [] } app.provides_metadata.each do |callback, matcher| next if !matcher.nil? && !source_file.match(matcher) @@ -48,8 +48,17 @@ module Middleman::Sitemap end app.provides_metadata_for_path.each do |callback, matcher| - next if !matcher.nil? && !path.match(matcher) - result = app.instance_exec(path, &callback) + if matcher.is_a? Regexp + next if !self.request_path.match(matcher) + elsif matcher.is_a? String + next if "/#{self.request_path}" != matcher + end + + result = app.instance_exec(self.request_path, &callback) + if result.has_key?(:blocks) + metadata[:blocks] << result[:blocks] + result.delete(:blocks) + end metadata = metadata.deep_merge(result) end @@ -72,6 +81,10 @@ module Middleman::Sitemap app.instance_eval(&block) end + md[:blocks].flatten.compact.each do |block| + app.instance_eval(&block) + end + app.instance_eval(&block) if block_given? result = app.render_template(source_file, locs, opts)