From 6a2d153c3df600bf43d278eda15ac0efb9f45c17 Mon Sep 17 00:00:00 2001 From: Adam Hamsik Date: Tue, 17 Jul 2012 10:34:11 +0200 Subject: [PATCH] Add support for multi-level directory setups, where files are under multiple directories. Generate HTML for them properly. --- lib/gollum/file_view.rb | 66 ++++++++++++++++------------------------- 1 file changed, 26 insertions(+), 40 deletions(-) diff --git a/lib/gollum/file_view.rb b/lib/gollum/file_view.rb index 032d6028..6474b66b 100644 --- a/lib/gollum/file_view.rb +++ b/lib/gollum/file_view.rb @@ -19,16 +19,15 @@ module Gollum %Q(
  • #{name}
  • \n) end - def new_folder page - new_sub_folder ::File.dirname(page.path), page.name, page.filename_stripped + def new_folder folder_path + new_sub_folder folder_path end - def new_sub_folder path, name, url + def new_sub_folder path <<-HTML
    1. -
    2. #{name}
    3. HTML end @@ -62,6 +61,8 @@ module Gollum # If there are no folders, then we're done. return enclose_tree(html) if folder_start <= -1 + puts "!>> folder_start = #{folder_start}, count = #{count}" + # Handle special case of only one folder. if (count - folder_start == 1) page = @pages[ folder_start ] @@ -81,6 +82,7 @@ module Gollum sorted_folders = [] (folder_start).upto count - 1 do | index | + puts "!>>sorted_folders => #{@pages[ index ].path} " sorted_folders += [[ @pages[ index ].path, index ]] end @@ -101,54 +103,38 @@ module Gollum end end - # Process first folder - page = @pages[ sorted_folders[ 0 ][1] ] - html += new_folder page - - last_folder = ::File.dirname page.path # define last_folder - # keep track of folder depth, 0 = at root. - depth = 0 + cwd_array = [] + changed = false # process rest of folders - 1.upto(sorted_folders.size - 1) do | index | + 0.upto(sorted_folders.size - 1) do | index | page = @pages[ sorted_folders[ index ][1] ] path = page.path folder = ::File.dirname path - if last_folder == folder - # same folder - html += new_page page - elsif folder.include?('/') - # check if we're going up or down a depth level - if last_folder.scan('/').size > folder.scan('/').size - # end tag for 1 subfolder & 1 parent folder - # so emit 2 end tags - 2.times { html += end_folder; } - depth -= 1 - else - depth += 1 - end + tmp_array = folder.split('/') - # subfolder - html += new_sub_folder ::File.dirname(page.path).split('/').last, page.name, page.filename_stripped - else - # depth+1 because we need an additional end_folder - (depth+1).times { html += end_folder; } - depth = 0 - # New root folder - html += new_folder page + 0.upto(tmp_array.size - 1) do |index| + if cwd_array[index].nil? or changed then + html += new_sub_folder tmp_array[index] + next + end + + if cwd_array[index] != tmp_array[index] then + changed = true + index.upto(cwd_array.size - 1) do |i| + html += end_folder + end + html += new_sub_folder tmp_array[index] + end end - last_folder = folder + html += new_page page + cwd_array = tmp_array + changed = false end - # Process last folder's ending tags. - (depth+1).times { - depth.times { html += end_folder; } - depth = 0 - } - # return the completed html enclose_tree html end # end render_files