class Gollum::FileView
FileView requires that:
- All files in root dir are processed first - Then all the folders are sorted and processed
Public Class Methods
new(pages, options = {})
click to toggle source
common use cases: set pages to wiki.pages and show_all to false set pages to wiki.pages + wiki.files and show_all to true
# File lib/gollum-lib/file_view.rb, line 10 def initialize(pages, options = {}) @pages = pages @show_all = options[:show_all] || false @checked = options[:collapse_tree] ? '' : "checked" end
Public Instance Methods
delete_file(url, valid_page)
click to toggle source
# File lib/gollum-lib/file_view.rb, line 26 def delete_file(url, valid_page) %Q(<form method="POST" action="/deleteFile/#{url}" onsubmit="return confirm('Do you really want to delete the file #{url}?');"><button type="submit" name="delete" value="true"></button></form>) end
enclose_tree(string)
click to toggle source
# File lib/gollum-lib/file_view.rb, line 16 def enclose_tree(string) %Q(<ol class="tree">\n) + string + %Q(</ol>) end
end_folder()
click to toggle source
# File lib/gollum-lib/file_view.rb, line 42 def end_folder "</ol></li>\n" end
new_folder(folder_path)
click to toggle source
# File lib/gollum-lib/file_view.rb, line 30 def new_folder(folder_path) new_sub_folder folder_path end
new_page(page)
click to toggle source
# File lib/gollum-lib/file_view.rb, line 20 def new_page(page) name = page.name url, valid_page = url_for_page page %Q( <li class="file"><a href="#{url}"><span class="icon"></span>#{name}</a>#{valid_page ? "" : delete_file(url, valid_page)}</li>) end
new_sub_folder(path)
click to toggle source
# File lib/gollum-lib/file_view.rb, line 34 def new_sub_folder(path) <<-HTML <li> <label>#{path}</label> <input type="checkbox" #{@checked} /> <ol> HTML end
render_files()
click to toggle source
# File lib/gollum-lib/file_view.rb, line 63 def render_files html = '' count = @pages.size folder_start = -1 # Process all pages until folders start count.times do |index| page = @pages[index] path = page.path unless path.include? '/' # Page processed (not contained in a folder) html += new_page page else # Folders start at the next index folder_start = index break # Pages finished, move on to folders end end # If there are no folders, then we're done. return enclose_tree(html) if folder_start <= -1 # Handle special case of only one folder. if (count - folder_start == 1) page = @pages[folder_start] html += <<-HTML <li> <label>#{::File.dirname(page.path)}</label> <input type="checkbox" #{@checked} /> <ol> #{new_page page} </ol> </li> HTML return enclose_tree html end sorted_folders = [] (folder_start).upto count - 1 do |index| sorted_folders += [[@pages[index].path, index]] end # http://stackoverflow.com/questions/3482814/sorting-list-of-string-paths-in-vb-net sorted_folders.sort! do |first, second| a = first[0] b = second[0] # use :: operator because gollum defines its own conflicting File class dir_compare = ::File.dirname(a) <=> ::File.dirname(b) # Sort based on directory name unless they're equal (0) in # which case sort based on file name. if dir_compare == 0 ::File.basename(a) <=> ::File.basename(b) else dir_compare end end # keep track of folder depth, 0 = at root. cwd_array = [] changed = false # process rest of folders (0...sorted_folders.size).each do |i| page = @pages[sorted_folders[i][1]] path = page.path folder = ::File.dirname path tmp_array = folder.split '/' (0...tmp_array.size).each do |index| if cwd_array[index].nil? || changed html += new_sub_folder tmp_array[index] next end if cwd_array[index] != tmp_array[index] changed = true (cwd_array.size - index).times do html += end_folder end html += new_sub_folder tmp_array[index] end end html += new_page page cwd_array = tmp_array changed = false end # return the completed html enclose_tree html end
url_for_page(page)
click to toggle source
# File lib/gollum-lib/file_view.rb, line 46 def url_for_page(page) url = '' valid_page_name = false if @show_all # Remove ext for valid pages. filename = page.filename valid_page_name = Page::valid_page_name?(filename) filename = valid_page_name ? filename.chomp(::File.extname(filename)) : filename url = ::File.join(::File.dirname(page.path), filename) else url = ::File.join(::File.dirname(page.path), page.filename_stripped) end url = url[2..-1] if url[0, 2] == './' return url, valid_page_name end