X-Git-Url: https://git.draconx.ca/gitweb/homepage.git/blobdiff_plain/c0c02f966518a01585b1f43bf5bdf35551c70e28..bc4daa2900c702913be7dc3e46441b192f44772a:/layouts/listing.xhtml diff --git a/layouts/listing.xhtml b/layouts/listing.xhtml index aad5608..406e42b 100644 --- a/layouts/listing.xhtml +++ b/layouts/listing.xhtml @@ -30,50 +30,163 @@ files = {} next unless "#{d}/" == mydir if p =~ %r{/$} - sz = Dir.children(File.dirname(rep.raw_path)).length - 1 - type = "DIR" + displaysize = Dir.children(File.dirname(rep.raw_path)).length - 1 + size = displaysize - 1000000 + type = :DIR else - sz = human_filesize(File.size(rep.raw_path)) + size = File.size(rep.raw_path) + displaysize = human_filesize(size) type = nil end files[f] = { - mtime: if t then t.getutc.strftime "%Y-%m-%d %H:%M UTC" end, - size: sz, + sorttime: if t then t.to_f else 0.0 end, + displaytime: if t then t.getutc.strftime "%Y-%m-%d %H:%M UTC" end, + displaysize: displaysize, + size: size, type: type, } end end if @items["#{File.dirname(mydir)}/index.lst"] - files[".."] = { type: "UP" } + files[".."] = { type: :UP } +end + +def render_entry(files, key) + f = files[key] + return <<~EOF + #{if f[:type] + "#{f[:type]}" + end} + #{ + if key == ".." then "[Parent Directory]" else key end + } + #{f[:displaytime]} + #{f[:displaysize]} + EOF end %> +
+ + + + + + + + - + + + + + -<% files.keys.sort{ |a, b| strverscmp(a, b) }.each do |key| %> - - #{parentrow}" end +%> +<% +by_name = files.keys.sort{ |a, b| strverscmp(a, b) } +by_name.each_index do |i| + entry = render_entry(files, by_name[i]) + if i+1 == by_name.length + entry.sub!(%r{(.*)}m, + "\\1") + end +%> + <%= entry %> <% end %> - - - - + + + +<% +def meta_cmp(files, key, a, b) + av, bv = files[a][key], files[b][key] + return av <=> bv if av != bv + return strverscmp(a, b) +end + +by_date = files.keys.sort { |a, b| meta_cmp(files, :sorttime, a, b) } +by_size = files.keys.sort { |a, b| meta_cmp(files, :size, a, b) } + +listnames = [ "namerev", "date", "daterev", "size", "sizerev" ] +lists = [ by_name.reverse, by_date, by_date.reverse, by_size, by_size.reverse ] +if parentrow +%> + <%= parentrow %> +<% +end +evenmap = (0..(lists.length-1)).map { false } +even = false + +while not (elems = lists.map(&:first)).compact.empty? + matches = (0..(lists.length-1)).to_a.keep_if { |x| evenmap[x] == even } + if !matches.empty? + elems = elems.values_at(*matches).compact + mode = elems.group_by{|a| a}.max{|a, b| a[1].length <=> b[1].length}[0] + matches = [] + + lists.each_index do |i| + if evenmap[i] == even and lists[i].first.eql? mode + lists[i].shift + evenmap[i] ^= true + evenmap[i] = nil if lists[i].empty? + + matches << i + end + end +%> + + <%= render_entry(files, mode) %> -<% end %> +<% + else +%> + +<% + end + + even ^= true +end +%> +
NameLast ModifiedSize
+ + + + + + + + + + + + + + + +
-<% if files[key][:type] %> -
- <%= files[key][:type] %> -
+<%= + parentrow = if files[".."] then "#{render_entry(files, "..")}" end + files.delete("..") + if parentrow then "
<%= - if key == ".." then "[Parent Directory]" else key end - %><%= files[key][:mtime] %><%= files[key][:size] %>
+