middleman/middleman-core/lib/middleman-core/sitemap/extensions/ignores.rb
2014-07-20 18:57:22 -07:00

53 lines
1.7 KiB
Ruby

module Middleman
module Sitemap
module Extensions
# Class to handle managing ignores
class Ignores < Extension
def initialize(app, config={}, &block)
super
@app.add_to_config_context(:ignore, &method(:create_ignore))
@app.define_singleton_method(:ignore, &method(:create_ignore))
# Array of callbacks which can ass ignored
@ignored_callbacks = Set.new
@app.sitemap.define_singleton_method(:ignored?, &method(:ignored?))
end
# Ignore a path or add an ignore callback
# @param [String, Regexp] path Path glob expression, or path regex
# @return [void]
Contract Maybe[Or[String, Regexp]], Proc => Any
def create_ignore(path=nil, &block)
if path.is_a? Regexp
@ignored_callbacks << proc { |p| p =~ path }
elsif path.is_a? String
path_clean = ::Middleman::Util.normalize_path(path)
if path_clean.include?('*') # It's a glob
@ignored_callbacks << proc { |p| File.fnmatch(path_clean, p) }
else
# Add a specific-path ignore unless that path is already covered
return if ignored?(path_clean)
@ignored_callbacks << proc { |p| p == path_clean }
end
elsif block_given?
@ignored_callbacks << block
end
@app.sitemap.invalidate_resources_not_ignored_cache!
end
# Whether a path is ignored
# @param [String] path
# @return [Boolean]
Contract String => Bool
def ignored?(path)
path_clean = ::Middleman::Util.normalize_path(path)
@ignored_callbacks.any? { |b| b.call(path_clean) }
end
end
end
end
end