From bf4310697d147623fda2df8719851868ab206375 Mon Sep 17 00:00:00 2001 From: Ben Hollis Date: Thu, 3 Jul 2014 20:41:44 -0700 Subject: [PATCH] Move proxy/ignore/content_type Resource methods into the Resource class --- .../sitemap/extensions/content_type.rb | 16 ---- .../sitemap/extensions/ignores.rb | 22 ----- .../sitemap/extensions/redirects.rb | 9 --- .../sitemap/extensions/request_endpoints.rb | 9 --- .../lib/middleman-core/sitemap/resource.rb | 81 ++++++++++++++++++- 5 files changed, 79 insertions(+), 58 deletions(-) delete mode 100644 middleman-core/lib/middleman-core/sitemap/extensions/content_type.rb diff --git a/middleman-core/lib/middleman-core/sitemap/extensions/content_type.rb b/middleman-core/lib/middleman-core/sitemap/extensions/content_type.rb deleted file mode 100644 index 23325012..00000000 --- a/middleman-core/lib/middleman-core/sitemap/extensions/content_type.rb +++ /dev/null @@ -1,16 +0,0 @@ -require 'rack' - -module Middleman::Sitemap::Extensions - # Content type is implemented as a module so it can be overridden by other sitemap extensions - module ContentType - # The preferred MIME content type for this resource - def content_type - # Allow explcitly setting content type from page/proxy options or frontmatter - meta_type = options[:content_type] - return meta_type if meta_type - - # Look up mime type based on extension - ::Rack::Mime.mime_type(ext, nil) - end - end -end diff --git a/middleman-core/lib/middleman-core/sitemap/extensions/ignores.rb b/middleman-core/lib/middleman-core/sitemap/extensions/ignores.rb index 9ca344a2..b77f0e19 100644 --- a/middleman-core/lib/middleman-core/sitemap/extensions/ignores.rb +++ b/middleman-core/lib/middleman-core/sitemap/extensions/ignores.rb @@ -12,7 +12,6 @@ module Middleman @ignored_callbacks = [] sitemap.define_singleton_method :ignored?, &method(:ignored?) - ::Middleman::Sitemap::Resource.send :include, IgnoreResourceInstanceMethods end # Ignore a path or add an ignore callback @@ -45,27 +44,6 @@ module Middleman @ignored_callbacks.any? { |b| b.call(path_clean) } end end - - # Helpers methods for Resources - module IgnoreResourceInstanceMethods - # Ignore a resource directly, without going through the whole - # ignore filter stuff. - def ignore! - @ignored = true - end - - # Whether the Resource is ignored - # @return [Boolean] - def ignored? - return true if @ignored - - # Ignore based on the source path (without template extensions) - return true if @app.sitemap.ignored?(path) - - # This allows files to be ignored by their source file name (with template extensions) - @app.sitemap.ignored?(source_file.sub("#{@app.source_dir}/", '')) - end - end end end end diff --git a/middleman-core/lib/middleman-core/sitemap/extensions/redirects.rb b/middleman-core/lib/middleman-core/sitemap/extensions/redirects.rb index 3f4dafd1..d6b79045 100644 --- a/middleman-core/lib/middleman-core/sitemap/extensions/redirects.rb +++ b/middleman-core/lib/middleman-core/sitemap/extensions/redirects.rb @@ -75,18 +75,9 @@ module Middleman end end - def binary? - false - end - def ignored? false end - - # rubocop:disable AccessorMethodName - def get_source_file - '' - end end end end diff --git a/middleman-core/lib/middleman-core/sitemap/extensions/request_endpoints.rb b/middleman-core/lib/middleman-core/sitemap/extensions/request_endpoints.rb index 4f5a646e..8d555fa6 100644 --- a/middleman-core/lib/middleman-core/sitemap/extensions/request_endpoints.rb +++ b/middleman-core/lib/middleman-core/sitemap/extensions/request_endpoints.rb @@ -64,18 +64,9 @@ module Middleman return output.call if output end - def binary? - false - end - def ignored? false end - - # rubocop:disable AccessorMethodName - def get_source_file - '' - end end end end diff --git a/middleman-core/lib/middleman-core/sitemap/resource.rb b/middleman-core/lib/middleman-core/sitemap/resource.rb index 3ccc9895..a7bf56e9 100644 --- a/middleman-core/lib/middleman-core/sitemap/resource.rb +++ b/middleman-core/lib/middleman-core/sitemap/resource.rb @@ -1,5 +1,5 @@ +require 'rack/mime' require 'middleman-core/sitemap/extensions/traversal' -require 'middleman-core/sitemap/extensions/content_type' require 'middleman-core/file_renderer' require 'middleman-core/template_renderer' @@ -9,7 +9,6 @@ module Middleman # Sitemap Resource class class Resource include Middleman::Sitemap::Extensions::Traversal - include Middleman::Sitemap::Extensions::ContentType # The source path of this resource (relative to the source directory, # without template extensions) @@ -25,6 +24,18 @@ module Middleman # @return [String] alias_method :request_path, :destination_path + # Get the on-disk source file for this resource + # @return [String] + def source_file + if @source_file + @source_file + elsif proxy? + proxied_to_resource.source_file + else + nil + end + end + # Initialize resource with parent store and URL # @param [Middleman::Sitemap::Store] store # @param [String] path @@ -138,6 +149,72 @@ module Middleman def binary? source_file && ::Middleman::Util.binary?(source_file) end + + # Ignore a resource directly, without going through the whole + # ignore filter stuff. + # @return [void] + def ignore! + @ignored = true + end + + # Whether the Resource is ignored + # @return [Boolean] + def ignored? + return true if @ignored + # Ignore based on the source path (without template extensions) + return true if @app.sitemap.ignored?(path) + # This allows files to be ignored by their source file name (with template extensions) + !proxy? && @app.sitemap.ignored?(source_file.sub("#{@app.source_dir}/", '')) + end + + # The preferred MIME content type for this resource based on extension or metadata + # @return [String] MIME type for this resource + def content_type + mime_type = options[:content_type] || ::Rack::Mime.mime_type(ext, nil) + return mime_type if mime_type + + if proxy? + proxied_to_resource.content_type + else + nil + end + end + + # Whether this page is a proxy + # @return [Boolean] + def proxy? + @proxied_to + end + + # Set this page to proxy to a target path + # @param [String] target + # @return [void] + def proxy_to(target) + target = ::Middleman::Util.normalize_path(target) + raise "You can't proxy #{path} to itself!" if target == path + @proxied_to = target + end + + # The path of the page this page is proxied to, or nil if it's not proxied. + # @return [String] + attr_reader :proxied_to + + # The resource for the page this page is proxied to. Throws an exception + # if there is no resource. + # @return [Sitemap::Resource] + def proxied_to_resource + proxy_resource = @store.find_resource_by_path(proxied_to) + + unless proxy_resource + raise "Path #{path} proxies to unknown file #{proxied_to}:#{@store.resources.map(&:path)}" + end + + if proxy_resource.proxy? + raise "You can't proxy #{path} to #{proxied_to} which is itself a proxy." + end + + proxy_resource + end end end end