Merge pull request #313 from bhollis/sitemap_globs
Sitemap/frontmatter/globbing fixes
This commit is contained in:
commit
d36077f47b
8 changed files with 64 additions and 72 deletions
|
@ -13,6 +13,12 @@ Feature: Custom layouts
|
|||
When I go to "/custom-layout.html"
|
||||
Then I should see "Custom Layout"
|
||||
|
||||
Scenario: Using with_layout block with globs
|
||||
Given "/custom-*" with_layout block has layout "custom"
|
||||
And the Server is running at "custom-layout-app2"
|
||||
When I go to "/custom-layout.html"
|
||||
Then I should see "Custom Layout"
|
||||
|
||||
Scenario: Using custom :layout attribute with folders
|
||||
Given page "/custom-layout-dir/" has layout "custom"
|
||||
And the Server is running at "custom-layout-app2"
|
||||
|
|
|
@ -8,6 +8,7 @@ Feature: Directory Index
|
|||
| needs_index/index.html |
|
||||
| a_folder/needs_index/index.html |
|
||||
| leave_me_alone.html |
|
||||
| wildcard_leave_me_alone.html |
|
||||
| regular/index.html |
|
||||
| .htaccess |
|
||||
Then the following files should not exist:
|
||||
|
@ -15,6 +16,7 @@ Feature: Directory Index
|
|||
| needs_index.html |
|
||||
| a_folder/needs_index.html |
|
||||
| leave_me_alone/index.html |
|
||||
| wildcard_leave_me_alone/index.html |
|
||||
And the file "needs_index/index.html" should contain "Indexable"
|
||||
And the file "a_folder/needs_index/index.html" should contain "Indexable"
|
||||
And the file "leave_me_alone.html" should contain "Stay away"
|
||||
|
|
|
@ -1,2 +1,4 @@
|
|||
activate :directory_indexes
|
||||
page "/leave_me_alone.html", :directory_index => false
|
||||
|
||||
page "/wildcard*", :directory_index => false
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Stay away, wildcards!
|
|
@ -109,16 +109,9 @@ module Middleman::CoreExtensions::FrontMatter
|
|||
|
||||
# Setup ignore callback
|
||||
@app.ignore do |path|
|
||||
p = @app.sitemap.page(path)
|
||||
file_path = p.relative_path
|
||||
|
||||
if !p.proxy? && has_data?(file_path)
|
||||
d = data(file_path)
|
||||
if d && d[0]
|
||||
d[0].has_key?("ignored") && d[0]["ignored"] == true
|
||||
else
|
||||
false
|
||||
end
|
||||
if @app.sitemap.exists?(path)
|
||||
p = @app.sitemap.page(path)
|
||||
!p.proxy? && p.data && p.data["ignored"] == true
|
||||
else
|
||||
false
|
||||
end
|
||||
|
|
|
@ -45,6 +45,9 @@ module Middleman::CoreExtensions::Routing
|
|||
def page(url, opts={}, &block)
|
||||
a_block = block_given? ? block : nil
|
||||
|
||||
# Default layout
|
||||
opts[:layout] = layout if opts[:layout].nil?
|
||||
|
||||
# If the url is a regexp
|
||||
if url.is_a?(Regexp) || url.include?("*")
|
||||
|
||||
|
@ -56,9 +59,6 @@ module Middleman::CoreExtensions::Routing
|
|||
return
|
||||
end
|
||||
|
||||
# Default layout
|
||||
opts[:layout] = layout if opts[:layout].nil?
|
||||
|
||||
# Normalized path
|
||||
url = full_path(url)
|
||||
|
||||
|
@ -79,13 +79,9 @@ module Middleman::CoreExtensions::Routing
|
|||
end
|
||||
end
|
||||
|
||||
# If we have a block or opts
|
||||
if a_block || !opts.empty?
|
||||
|
||||
# Setup a metadata matcher for rendering those options
|
||||
provides_metadata_for_path url do |url|
|
||||
{ :options => opts, :blocks => [a_block] }
|
||||
end
|
||||
# Setup a metadata matcher for rendering those options
|
||||
provides_metadata_for_path url do |url|
|
||||
{ :options => opts, :blocks => [a_block] }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -9,63 +9,49 @@ module Middleman::Extensions
|
|||
|
||||
# Once registered
|
||||
def registered(app)
|
||||
# Include methods
|
||||
app.send :include, InstanceMethods
|
||||
|
||||
app.after_configuration do
|
||||
# Register a reroute transform that turns regular paths into indexed paths
|
||||
sitemap.reroute do |destination, page|
|
||||
new_index_path = "/#{index_file}"
|
||||
frontmatter_ignore = false
|
||||
|
||||
# Check for file and frontmatter
|
||||
d = page.data
|
||||
if !page.data.nil?
|
||||
frontmatter_ignore = d.has_key?("directory_index") && d["directory_index"] == false
|
||||
end
|
||||
|
||||
index_ext = File.extname(index_file)
|
||||
|
||||
# Only reroute if not ignored
|
||||
# Check if it would be pointless to reroute
|
||||
path = page.path
|
||||
if ignored_directory_indexes.include? page
|
||||
destination
|
||||
elsif path == index_file || path.end_with?(new_index_path)
|
||||
destination
|
||||
elsif frontmatter_ignore
|
||||
destination
|
||||
elsif index_ext != File.extname(path)
|
||||
destination
|
||||
else
|
||||
destination.chomp(File.extname(index_file)) + new_index_path
|
||||
page_already_index = path == index_file || path.end_with?(new_index_path)
|
||||
if page_already_index || File.extname(index_file) != File.extname(path)
|
||||
next destination
|
||||
end
|
||||
|
||||
# Check if frontmatter turns directory_index off
|
||||
d = page.data
|
||||
next destination if d && d["directory_index"] == false
|
||||
|
||||
# Check if file metadata (options set by "page" in config.rb) turns directory_index off
|
||||
# TODO: This is crazy - we need a generic way to get metadata for paths
|
||||
metadata_ignore = false
|
||||
provides_metadata_for_path.each do |callback, matcher|
|
||||
if matcher.is_a? Regexp
|
||||
next if !path.match(matcher)
|
||||
elsif matcher.is_a? String
|
||||
next if !File.fnmatch("/" + matcher.sub(%r{^/}, ''), "/#{path}")
|
||||
end
|
||||
|
||||
result = instance_exec(path, &callback)
|
||||
if result[:options] && result[:options][:directory_index] == false
|
||||
metadata_ignore = true
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
next destination if metadata_ignore
|
||||
|
||||
# Not ignored, so reroute
|
||||
destination.chomp(File.extname(index_file)) + new_index_path
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
alias :included :registered
|
||||
end
|
||||
|
||||
module InstanceMethods
|
||||
# A list of pages which will not use directory indexes
|
||||
# @return [Array<Middleman::Sitemap::Page>]
|
||||
def ignored_directory_indexes
|
||||
@_ignored_directory_indexes ||= []
|
||||
end
|
||||
|
||||
# Override the page helper to accept a :directory_index option
|
||||
#
|
||||
# @param [String] url
|
||||
# @param [Hash] options
|
||||
# @return [void]
|
||||
def page(url, options={}, &block)
|
||||
if options.has_key?(:directory_index) && !options["directory_index"]
|
||||
ignored_directory_indexes << sitemap.page(url)
|
||||
else
|
||||
super
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# Register the extension
|
||||
|
|
|
@ -72,16 +72,24 @@ module Middleman::Sitemap
|
|||
# @param [String] target
|
||||
# @return [void]
|
||||
def proxy(path, target)
|
||||
page(path).proxy_to(normalize_path(target))
|
||||
add(path).proxy_to(normalize_path(target))
|
||||
app.cache.remove(:proxied_paths)
|
||||
end
|
||||
|
||||
# Get a page instance for a given path
|
||||
# Add a new page to the sitemap
|
||||
# @param [String] path
|
||||
# @return [Middleman::Sitemap::Page]
|
||||
def add(path)
|
||||
path = normalize_path(path)
|
||||
@pages.fetch(path) { @pages[path] = ::Middleman::Sitemap::Page.new(self, path) }
|
||||
end
|
||||
|
||||
# Get a page instance for a given path, or nil if that page doesn't exist in the sitemap
|
||||
# @param [String] path
|
||||
# @return [Middleman::Sitemap::Page]
|
||||
def page(path)
|
||||
path = normalize_path(path)
|
||||
@pages.fetch(path) { @pages[path] = ::Middleman::Sitemap::Page.new(self, path) }
|
||||
@pages[path]
|
||||
end
|
||||
|
||||
# Find a page given its destination path
|
||||
|
@ -134,9 +142,7 @@ module Middleman::Sitemap
|
|||
return false unless file.include?(prefix)
|
||||
|
||||
path = file.sub(prefix, "")
|
||||
path = extensionless_path(path)
|
||||
|
||||
path
|
||||
extensionless_path(path)
|
||||
end
|
||||
|
||||
# Update or add an on-disk file path
|
||||
|
@ -153,7 +159,7 @@ module Middleman::Sitemap
|
|||
end
|
||||
|
||||
# Add generic path
|
||||
p = page(path)
|
||||
p = add(path)
|
||||
p.source_file = File.expand_path(file, @app.root)
|
||||
p.touch
|
||||
|
||||
|
|
Loading…
Reference in a new issue