directory_listing 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/lib/directory_listing.rb +70 -86
  2. metadata +1 -1
@@ -1,29 +1,30 @@
1
1
  require 'truncate'
2
2
  require 'filesize'
3
+ require 'pathname'
3
4
 
4
5
  # = Easy Apache-style directory listings for Sinatra.
5
6
  #
6
7
  # == Usage
7
8
  #
8
- # Directory_listing will return HTML, so the following is a complete Sinatra
9
- # app that will provide a directory listing of whatever path you navigate to:
9
+ # Directory_listing.list will return HTML, so the following is a complete Sinatra
10
+ # app that will provide a directory listing of whatever path you navigate to
11
+ # and let you view any file that is served directly:
10
12
  #
11
13
  # require 'directory_listing
12
14
  #
13
15
  # get '*' do |path|
14
- # if File.exist?(File.join(settings.public_folder, path))
15
- # "#{Directory_listing.list(
16
- # :directory => path,
17
- # :sinatra_public => settings.public_folder,
18
- # :stylesheet => "stylesheets/styles.css",
19
- # :should_list_invisibles => "no",
20
- # :last_modified_format => "%Y-%m-%d %H:%M:%S",
21
- # :dir_html_style => "bold",
22
- # :regfile_html_style => "none",
23
- # :filename_truncate_length => 40)}"
24
- # else
25
- # not_found
26
- # end
16
+ # if File.exist?(File.join(settings.public_folder, path))
17
+ # if File.directory?(File.join(settings.public_folder, path))
18
+ # "#{Directory_listing.list(
19
+ # :directory => path,
20
+ # :sinatra_public => settings.public_folder,
21
+ # )}"
22
+ # else
23
+ # send_file File.join(settings.public_folder, path)
24
+ # end
25
+ # else
26
+ # not_found
27
+ # end
27
28
  # end
28
29
  #
29
30
  # not_found do
@@ -39,9 +40,31 @@ require 'filesize'
39
40
  # stylesheet # pass a stylesheet to style the page with
40
41
  # should_list_invisibles # should the directory listing include invisibles (dotfiles) - "yes" or "no"
41
42
  # last_modified_format # format for last modified date (http://www.ruby-doc.org/core-2.0/Time.html) - defaults to "%Y-%m-%d %H:%M:%S"
42
- # dir_html_style # html style for directories - "bold", "italic", "underline", or "none" - defaults to "bold"
43
- # regfile_html_style # html style for regular files - "bold", "italic", "underline", or "none" - defaults to "none"
44
43
  # filename_truncate_length # (integer) length to truncate file names to - defaults to 40
44
+ #
45
+ # == Styling
46
+ #
47
+ # It's pretty easy to figure out how to style directory_listing by looking at the source.
48
+ #
49
+ # Some gotchas:
50
+ #
51
+ # Every item listed is a <td> element in a table. Directories will have a class of "dir" and regular files will have a class of "file".
52
+ #
53
+ # You can style the "File" column with this CSS:
54
+ #
55
+ # table tr > td:first-child {
56
+ # text-align: left;
57
+ # }
58
+ #
59
+ # Second column:
60
+ # table tr > td:first-child + td {
61
+ # text-align: left;
62
+ # }
63
+ #
64
+ # Third column:
65
+ # table tr > td:first-child + td + td {
66
+ # text-align: left;
67
+ # }
45
68
 
46
69
  module Directory_listing
47
70
  @@options = {}
@@ -57,8 +80,9 @@ module Directory_listing
57
80
  def self.list(options)
58
81
  options = @@options.merge options
59
82
  raise(ArgumentError, ":directory is required") unless options[:directory]
60
- raise(ArgumentError, ":sinatra_public is required") unless options[:sinatra_public]
61
- dir = File.join(options[:sinatra_public], options[:directory])
83
+ raise(ArgumentError, ":sinatra_public is required") unless options[:sinatra_public]
84
+ pub = options[:sinatra_public]
85
+ dir = File.join(pub, options[:directory])
62
86
 
63
87
  if options[:should_list_invisibles]
64
88
  $should_list_invisibles = options[:should_list_invisibles]
@@ -70,111 +94,71 @@ module Directory_listing
70
94
  else
71
95
  $last_modified_format = "%Y-%m-%d %H:%M:%S"
72
96
  end
73
- if options[:dir_html_style]
74
- $dir_html_style = options[:dir_html_style]
75
- else
76
- $dir_html_style = "bold"
77
- end
78
- if options[:regfile_html_style]
79
- $regfile_html_style = options[:regfile_html_style]
80
- else
81
- $regfile_html_style = "none"
82
- end
83
97
  if options[:filename_truncate_length]
84
98
  $filename_truncate_length = options[:filename_truncate_length]
85
99
  else
86
100
  $filename_truncate_length = 40
87
101
  end
88
102
 
89
- html = "<html>\n<head>"
103
+ html = "<html>\n<head>\n"
90
104
  if options[:stylesheet]
91
- html << "<link rel=\"stylesheet\" type=\"text/css\" href=\"/#{options[:stylesheet].sub(/^[\/]*/,"")}\">"
105
+ html << "<link rel=\"stylesheet\" type=\"text/css\" href=\"/#{options[:stylesheet].sub(/^[\/]*/,"")}\">\n"
92
106
  end
93
- html << "</head>\n<body>"
94
- html << "<h1>Index of #{options[:directory]}</h1>"
95
- html << "<table>"
96
- html << "<tr>\n<th>File</th>\n<th>Last modified</th>\n<th>Size</th>\n</tr>"
107
+ html << "</head>\n<body>\n"
108
+ html << "<h1>Index of #{options[:directory]}</h1>\n"
109
+ html << "<table>\n"
110
+ html << "\t<tr>\n\t\t<th>File</th>\n\t\t<th>Last modified</th>\n\t\t<th>Size</th>\n\t</tr>"
97
111
  files = Array.new
98
112
  Dir.foreach(dir, &files.method(:push))
99
113
  files.sort.each do |file|
100
- html << wrap(file, dir)
114
+ html << wrap(file, dir, pub)
101
115
  end
102
- html << "</table>"
103
- html << "</html>\n</body>"
116
+ html << "\n</table>\n"
117
+ html << "</body>\n</html>\n"
104
118
  "#{html}"
105
119
  end
106
120
 
107
121
  private
108
122
 
109
123
  def self.m_time(file, dir)
110
- time = "#{File.mtime(File.join(dir, file)).strftime $last_modified_format}"
124
+ time = "\t<td>#{File.mtime(File.join(dir, file)).strftime $last_modified_format}</td>"
111
125
  end
112
126
 
113
127
  def self.size(file, dir)
114
128
  if File.directory?(File.join(dir, file))
115
- "-"
129
+ "\t<td>-</td>"
116
130
  else
117
131
  size = Filesize.from("#{File.stat(File.join(dir, file)).size} B").pretty
118
- "#{size}"
132
+ "\t<td>#{size}</td>"
119
133
  end
120
134
  end
121
135
 
122
- def self.name(file, dir)
123
- html = pre_dir = post_dir = pre_reg = post_reg = ""
136
+ def self.name(file, dir, pub)
124
137
  tfile = file.truncate($filename_truncate_length, '...')
125
-
126
- case $dir_html_style
127
- when "bold"
128
- pre_dir = "<b>"
129
- post_dir = "</b>"
130
- when "italic"
131
- pre_dir = "<i>"
132
- post_dir = "</i>"
133
- when "underline"
134
- pre_dir = "<u>"
135
- post_dir = "</u>"
136
- else
137
- pre_dir = "<b>"
138
- post_dir = "</b>"
139
- end
140
- case $regfile_html_style
141
- when "bold"
142
- pre_reg = "<b>"
143
- post_reg = "</b>"
144
- when "italic"
145
- pre_reg = "<i>"
146
- post_reg = "</i>"
147
- when "underline"
148
- pre_reg = "<u>"
149
- post_reg = "</u>"
150
- else
151
- pre_reg = ""
152
- post_reg = ""
153
- end
154
-
138
+ link = Pathname.new(File.join(dir, file)).relative_path_from(Pathname.new(pub))
139
+
140
+ html = ""
155
141
  if File.directory?(File.join(dir, file))
156
- html << "<a href='#{file}'>#{pre_dir}#{tfile}#{post_dir}</a>"
142
+ html << "\t<td class='dir'><a href='#{link}'>#{tfile}</a></td>"
157
143
  else
158
- html << "#{pre_reg}#{tfile}#{post_reg}"
144
+ html << "\t<td class='file'><a href='#{link}'>#{tfile}</td>"
159
145
  end
160
146
  "#{html}"
161
147
  end
162
148
 
163
- def self.wrap(file, dir)
149
+ def self.wrap(file, dir, pub)
164
150
  wrapped = ""
165
151
  if $should_list_invisibles == "yes"
166
- wrapped << "<tr>
167
- <td>#{name(file, dir)}</td>
168
- <td>#{m_time(file, dir)}</td>
169
- <td>#{size(file, dir)}</td>
170
- </tr>"
152
+ wrapped << "\n\t<tr>
153
+ #{name(file, dir, pub)}
154
+ #{m_time(file, dir)}
155
+ #{size(file, dir)}\n\t</tr>"
171
156
  else
172
157
  if file[0] != "."
173
- wrapped << "<tr>
174
- <td>#{name(file, dir)}</td>
175
- <td>#{m_time(file, dir)}</td>
176
- <td>#{size(file, dir)}</td>
177
- </tr>"
158
+ wrapped << "\n\t<tr>
159
+ #{name(file, dir, pub)}
160
+ #{m_time(file, dir)}
161
+ #{size(file, dir)}\n\t</tr>"
178
162
  end
179
163
  end
180
164
  "#{wrapped}"
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: directory_listing
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.2
5
+ version: 0.0.3
6
6
  platform: ruby
7
7
  authors:
8
8
  - Richard Myers