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

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 38
def end_folder
  "</ol></li>\n"
end
new_folder(folder_path) click to toggle source
# File lib/gollum-lib/file_view.rb, line 26
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  = url_for_page page
  %Q(  <li class="file"><a href="#{url}"><span class="icon"></span>#{name}</a></li>)
end
new_sub_folder(path) click to toggle source
# File lib/gollum-lib/file_view.rb, line 30
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 57
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 42
def url_for_page(page)
  url = ''
  if @show_all
    # Remove ext for valid pages.
    filename = page.filename
    filename = Page::valid_page_name?(filename) ? 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] == './'
  url
end