diff options
Diffstat (limited to 'app/models/wiki_directory.rb')
-rw-r--r-- | app/models/wiki_directory.rb | 60 |
1 files changed, 37 insertions, 23 deletions
diff --git a/app/models/wiki_directory.rb b/app/models/wiki_directory.rb index 76fe664f23d..e57d186a3e3 100644 --- a/app/models/wiki_directory.rb +++ b/app/models/wiki_directory.rb @@ -7,34 +7,48 @@ class WikiDirectory validates :slug, presence: true alias_method :to_param, :slug - # Groups a list of wiki pages into a nested collection of WikiPage and WikiDirectory objects, - # preserving the order of the passed pages. - # - # Returns an array with all entries for the toplevel directory. - # - # @param [Array<WikiPage>] pages - # @return [Array<WikiPage, WikiDirectory>] - # - def self.group_pages(pages) - # Build a hash to map paths to created WikiDirectory objects, - # and recursively create them for each level of the path. - # For the toplevel directory we use '' as path, as that's what WikiPage#directory returns. - directories = Hash.new do |_, path| - directories[path] = new(path).tap do |directory| - if path.present? - parent = File.dirname(path) - parent = '' if parent == '.' - directories[parent].entries << directory - directories[parent].entries.delete_if { |item| item.is_a?(WikiPage) && item.slug == directory.slug } + class << self + # Groups a list of wiki pages into a nested collection of WikiPage and WikiDirectory objects, + # preserving the order of the passed pages. + # + # Returns an array with all entries for the toplevel directory. + # + # @param [Array<WikiPage>] pages + # @return [Array<WikiPage, WikiDirectory>] + # + def group_pages(pages) + # Build a hash to map paths to created WikiDirectory objects, + # and recursively create them for each level of the path. + # For the toplevel directory we use '' as path, as that's what WikiPage#directory returns. + directories = Hash.new do |_, path| + directories[path] = new(path).tap do |directory| + if path.present? + parent = File.dirname(path) + parent = '' if parent == '.' + directories[parent].entries << directory + directories[parent].entries.delete_if do |item| + item.is_a?(WikiPage) && item.slug.casecmp?(directory.slug) + end + end end end - end - pages.each do |page| - directories[page.directory].entries << page + pages.each do |page| + next unless directory_for_page?(directories[page.directory], page) + + directories[page.directory].entries << page + end + + directories[''].entries end - directories[''].entries + private + + def directory_for_page?(directory, page) + directory.entries.none? do |item| + item.is_a?(WikiDirectory) && item.slug.casecmp?(page.slug) + end + end end def initialize(slug, entries = []) |