class ActionView::OptimizedFileSystemResolver
:nodoc:
An Optimized resolver for Rails’ most common case.
def build_regex(path, details)
def build_regex(path, details) query = Regexp.escape(File.join(@path, path)) exts = EXTENSIONS.map do |ext, prefix| match = if ext == :variants && details[ext] == :any ".*?" else arr = details[ext].compact arr.uniq! arr.map! { |e| Regexp.escape(e) } arr.join("|") end prefix = Regexp.escape(prefix) "(#{prefix}(?<#{ext}>#{match}))?" end.join %r{\A#{query}#{exts}\z} end
def find_candidate_template_paths(path)
def find_candidate_template_paths(path) # Instead of checking for every possible path, as our other globs would # do, scan the directory for files with the right prefix. query = "#{escape_entry(File.join(@path, path))}*" Dir[query].reject do |filename| File.directory?(filename) end end
def find_template_paths_from_details(path, details)
def find_template_paths_from_details(path, details) if path.name.include?(".") # Fall back to the unoptimized resolver, which will warn return super end candidates = find_candidate_template_paths(path) regex = build_regex(path, details) candidates.uniq.reject do |filename| # This regex match does double duty of finding only files which match # details (instead of just matching the prefix) and also filtering for # case-insensitive file systems. !regex.match?(filename) || File.directory?(filename) end.sort_by do |filename| # Because we scanned the directory, instead of checking for files # one-by-one, they will be returned in an arbitrary order. # We can use the matches found by the regex and sort by their index in # details. match = filename.match(regex) EXTENSIONS.keys.map do |ext| if ext == :variants && details[ext] == :any match[ext].nil? ? 0 : 1 elsif match[ext].nil? # No match should be last details[ext].length else found = match[ext].to_sym details[ext].index(found) end end end end
def initialize(path)
An Optimized resolver for Rails' most common case.
def initialize(path) super(path) end