Make a ProxyResource which extends Resource, rather than injecting methods into Resource
This commit is contained in:
parent
6bb9673630
commit
1bd7dab1a3
|
@ -52,7 +52,7 @@ module Middleman::CoreExtensions
|
||||||
|
|
||||||
resource.add_metadata options: opts, page: fmdata
|
resource.add_metadata options: opts, page: fmdata
|
||||||
|
|
||||||
resource.ignore! if ignored == true && !resource.proxy?
|
resource.ignore! if ignored == true && !resource.is_a?(::Middleman::Sitemap::ProxyResource)
|
||||||
|
|
||||||
# TODO: Save new template here somewhere?
|
# TODO: Save new template here somewhere?
|
||||||
end
|
end
|
||||||
|
|
|
@ -162,8 +162,7 @@ class Middleman::CoreExtensions::Internationalization < ::Middleman::Extension
|
||||||
|
|
||||||
path = path.sub(options[:templates_dir] + '/', '')
|
path = path.sub(options[:templates_dir] + '/', '')
|
||||||
|
|
||||||
p = ::Middleman::Sitemap::Resource.new(app.sitemap, path)
|
p = ::Middleman::Sitemap::ProxyResource.new(app.sitemap, path, source_path)
|
||||||
p.proxy_to(source_path)
|
|
||||||
p.add_metadata locals: { lang: lang, page_id: path }, options: { lang: lang }
|
p.add_metadata locals: { lang: lang, page_id: path }, options: { lang: lang }
|
||||||
|
|
||||||
::I18n.locale = old_locale
|
::I18n.locale = old_locale
|
||||||
|
|
|
@ -58,10 +58,12 @@ module Middleman
|
||||||
# @return [Boolean]
|
# @return [Boolean]
|
||||||
def ignored?
|
def ignored?
|
||||||
return true if @ignored
|
return true if @ignored
|
||||||
|
|
||||||
# Ignore based on the source path (without template extensions)
|
# Ignore based on the source path (without template extensions)
|
||||||
return true if @app.sitemap.ignored?(path)
|
return true if @app.sitemap.ignored?(path)
|
||||||
|
|
||||||
# This allows files to be ignored by their source file name (with template extensions)
|
# This allows files to be ignored by their source file name (with template extensions)
|
||||||
!proxy? && @app.sitemap.ignored?(source_file.sub("#{@app.source_dir}/", ''))
|
@app.sitemap.ignored?(source_file.sub("#{@app.source_dir}/", ''))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -10,8 +10,6 @@ module Middleman
|
||||||
@app.define_singleton_method(:proxy, &method(:create_proxy))
|
@app.define_singleton_method(:proxy, &method(:create_proxy))
|
||||||
|
|
||||||
@proxy_configs = Set.new
|
@proxy_configs = Set.new
|
||||||
|
|
||||||
::Middleman::Sitemap::Resource.send :include, ProxyResourceInstanceMethods
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# Setup a proxy from a path to a target
|
# Setup a proxy from a path to a target
|
||||||
|
@ -43,11 +41,11 @@ module Middleman
|
||||||
# @return [void]
|
# @return [void]
|
||||||
def manipulate_resource_list(resources)
|
def manipulate_resource_list(resources)
|
||||||
resources + @proxy_configs.map do |config|
|
resources + @proxy_configs.map do |config|
|
||||||
p = ::Middleman::Sitemap::Resource.new(
|
p = ProxyResource.new(
|
||||||
@app.sitemap,
|
@app.sitemap,
|
||||||
config.path
|
config.path,
|
||||||
|
config.target
|
||||||
)
|
)
|
||||||
p.proxy_to(config.target)
|
|
||||||
|
|
||||||
p.add_metadata(config.metadata)
|
p.add_metadata(config.metadata)
|
||||||
p
|
p
|
||||||
|
@ -89,63 +87,59 @@ module Middleman
|
||||||
path.hash
|
path.hash
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
module ProxyResourceInstanceMethods
|
|
||||||
# Whether this page is a proxy
|
|
||||||
# @return [Boolean]
|
|
||||||
def proxy?
|
|
||||||
@proxied_to
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# Set this page to proxy to a target path
|
class ProxyResource < ::Middleman::Sitemap::Resource
|
||||||
# @param [String] target
|
# Initialize resource with parent store and URL
|
||||||
# @return [void]
|
# @param [Middleman::Sitemap::Store] store
|
||||||
def proxy_to(target)
|
# @param [String] path
|
||||||
|
# @param [String] source_file
|
||||||
|
def initialize(store, path, target)
|
||||||
|
super(store, path)
|
||||||
|
|
||||||
target = ::Middleman::Util.normalize_path(target)
|
target = ::Middleman::Util.normalize_path(target)
|
||||||
raise "You can't proxy #{path} to itself!" if target == path
|
raise "You can't proxy #{path} to itself!" if target == path
|
||||||
@proxied_to = target
|
@target = target
|
||||||
end
|
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
|
# The resource for the page this page is proxied to. Throws an exception
|
||||||
# if there is no resource.
|
# if there is no resource.
|
||||||
# @return [Sitemap::Resource]
|
# @return [Sitemap::Resource]
|
||||||
def proxied_to_resource
|
def target_resource
|
||||||
proxy_resource = @store.find_resource_by_path(proxied_to)
|
resource = @store.find_resource_by_path(@target)
|
||||||
|
|
||||||
unless proxy_resource
|
unless resource
|
||||||
raise "Path #{path} proxies to unknown file #{proxied_to}:#{@store.resources.map(&:path)}"
|
raise "Path #{path} proxies to unknown file #{@target}:#{@store.resources.map(&:path)}"
|
||||||
end
|
end
|
||||||
|
|
||||||
if proxy_resource.proxy?
|
if resource.is_a? ProxyResource
|
||||||
raise "You can't proxy #{path} to #{proxied_to} which is itself a proxy."
|
raise "You can't proxy #{path} to #{@target} which is itself a proxy."
|
||||||
end
|
end
|
||||||
|
|
||||||
proxy_resource
|
resource
|
||||||
end
|
end
|
||||||
|
|
||||||
# rubocop:disable AccessorMethodName
|
# rubocop:disable AccessorMethodName
|
||||||
def get_source_file
|
def get_source_file
|
||||||
if proxy?
|
target_resource.source_file
|
||||||
proxied_to_resource.source_file
|
|
||||||
else
|
|
||||||
super
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def content_type
|
def content_type
|
||||||
mime_type = super
|
mime_type = super
|
||||||
return mime_type if mime_type
|
return mime_type if mime_type
|
||||||
|
|
||||||
if proxy?
|
target_resource.content_type
|
||||||
proxied_to_resource.content_type
|
|
||||||
else
|
|
||||||
nil
|
|
||||||
end
|
|
||||||
end
|
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)
|
||||||
|
|
||||||
|
false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -2,12 +2,14 @@ require 'middleman-core/sitemap/extensions/traversal'
|
||||||
require 'middleman-core/sitemap/extensions/content_type'
|
require 'middleman-core/sitemap/extensions/content_type'
|
||||||
require 'middleman-core/file_renderer'
|
require 'middleman-core/file_renderer'
|
||||||
require 'middleman-core/template_renderer'
|
require 'middleman-core/template_renderer'
|
||||||
|
require 'hamster/immutable'
|
||||||
|
|
||||||
module Middleman
|
module Middleman
|
||||||
# Sitemap namespace
|
# Sitemap namespace
|
||||||
module Sitemap
|
module Sitemap
|
||||||
# Sitemap Resource class
|
# Sitemap Resource class
|
||||||
class Resource
|
class Resource
|
||||||
|
# include ::Hamster::Immutable
|
||||||
include Middleman::Sitemap::Extensions::Traversal
|
include Middleman::Sitemap::Extensions::Traversal
|
||||||
include Middleman::Sitemap::Extensions::ContentType
|
include Middleman::Sitemap::Extensions::ContentType
|
||||||
|
|
||||||
|
@ -25,13 +27,6 @@ module Middleman
|
||||||
# @return [String]
|
# @return [String]
|
||||||
alias_method :request_path, :destination_path
|
alias_method :request_path, :destination_path
|
||||||
|
|
||||||
# Set the on-disk source file for this resource
|
|
||||||
# @return [String]
|
|
||||||
def source_file
|
|
||||||
# TODO: Make this work when get_source_file doesn't exist
|
|
||||||
@source_file || get_source_file
|
|
||||||
end
|
|
||||||
|
|
||||||
# Initialize resource with parent store and URL
|
# Initialize resource with parent store and URL
|
||||||
# @param [Middleman::Sitemap::Store] store
|
# @param [Middleman::Sitemap::Store] store
|
||||||
# @param [String] path
|
# @param [String] path
|
||||||
|
@ -50,6 +45,13 @@ module Middleman
|
||||||
@metadata = { options: {}, locals: {}, page: {} }
|
@metadata = { options: {}, locals: {}, page: {} }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Set the on-disk source file for this resource
|
||||||
|
# @return [String]
|
||||||
|
def source_file
|
||||||
|
# TODO: Make this work when get_source_file doesn't exist
|
||||||
|
@source_file || get_source_file
|
||||||
|
end
|
||||||
|
|
||||||
# Whether this resource has a template file
|
# Whether this resource has a template file
|
||||||
# @return [Boolean]
|
# @return [Boolean]
|
||||||
def template?
|
def template?
|
||||||
|
|
Loading…
Reference in a new issue