directory_listing 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/sinatra/directory_listing.rb +82 -34
  3. metadata +25 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6d00948424b8f2e0c6d75a2285b1b3e6805ef790
4
- data.tar.gz: f23432bf5b3a41207e46aa0b0027bd7168caa049
3
+ metadata.gz: fc6e8b90276b6880d8cc5eefca368b999056d6d7
4
+ data.tar.gz: 27e126e7c527ac9e756dc9b2d620b3614ebf9880
5
5
  SHA512:
6
- metadata.gz: bd32a90508a9425edede1ee5ac86d430961300e72f5f122f045b492c322b559bd1bdab41a1dded0ebbe49368f88c3cd5de6a7619c58f0149e8b6edab980d223d
7
- data.tar.gz: c3271f6bb076d059ff678287305c31cb2d0662903628f03ce4e6a0cc6ea5423f268dcc1a033b7455ef43b5915b5d73794a453b69cec97a46f5628447739deca0
6
+ metadata.gz: d2232198ba1bd9c8f62d2af86c23b2581e6bbaffc448fd9c8fd98805601cad2b536e3db4c82c7f7143d3c177e03a43d84cffa9cfecdcef4880b672a7f952a962
7
+ data.tar.gz: 62cbfe05a591976fe342694fd9664de8efa2f8bf16a8d872dd05fba2f42fe4fef060ead3234b690b0bf84529c1b122ae8669ff784a5ae8fbb0bf5f9bebf82012
@@ -5,14 +5,20 @@ require 'pathname'
5
5
  require 'uri'
6
6
  require 'erb'
7
7
 
8
- # = Easy, CSS-styled, Apache-like directory listings for Sinatra.
9
- #
10
- # == Usage
11
- #
12
- # list() will return HTML, so the following is a complete Sinatra
13
- # app that will provide a directory listing of whatever path you navigate to
14
- # and let you view any file that is served directly:
15
- #
8
+ # ### directory_listing: easy, CSS-styled, Apache-like directory listings for Sinatra.
9
+ #
10
+ # ### Build from source:
11
+ #
12
+ # ```bash
13
+ # gem build directory_listing.gemspec
14
+ # sudo gem install ./directory_listing-x.x.x.gem
15
+ # ```
16
+ #
17
+ # ### Usage:
18
+ #
19
+ # ```list()``` will return HTML, so the following is a complete Sinatra app that will provide a directory listing of whatever path you navigate to and let you view any file that is served directly:
20
+ #
21
+ # ```ruby
16
22
  # require 'sinatra'
17
23
  # require 'sinatra/directory_listing'
18
24
  #
@@ -31,49 +37,61 @@ require 'erb'
31
37
  # not_found do
32
38
  # 'Try again.'
33
39
  # end
34
- #
35
- # == Options
40
+ # ```
41
+ #
42
+ # ### Options:
36
43
  #
37
44
  # Options are passed in a hash:
38
45
  #
46
+ # ```ruby
39
47
  # list({
40
48
  # :stylesheet => "stylesheets/styles.css",
41
49
  # :readme => "<a>Welcome!</a>"
42
50
  # })
43
- #
51
+ # ```
52
+ #
44
53
  # Available options:
45
- #
46
- # stylesheet # a stylesheet that will be added to the <head> of the generated directory listing
47
- # readme # an HTML string that will be appended at the footer of the generated directory listing
48
- # should_list_invisibles # whether the directory listing should include invisibles (dotfiles) - true or false, defaults to false
49
- # 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"
50
- # filename_truncate_length # (integer) length to truncate file names to - defaults to 40
51
- #
52
- # == Styling
53
- #
54
- # It's pretty easy to figure out how to style directory_listing by looking at the source, but here are some gotchas:
55
- #
56
- # 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".
57
- #
58
- # You can style the "File" column with this CSS:
59
54
  #
55
+ # - ```stylesheet``` - a stylesheet that will be added to the <head> of the generated directory listing
56
+ # - ```readme``` - an HTML string that will be appended at the footer of the generated directory listing
57
+ # - ```should_list_invisibles``` - whether the directory listing should include invisibles (dotfiles) - true or false, defaults to false
58
+ # - ```last_modified_format``` - [format](http://www.ruby-doc.org/core-2.0/Time.html) for last modified date - defaults to ```%Y-%m-%d %H:%M:%S```
59
+ # - ```filename_truncate_length``` - (integer) length to truncate file names to - defaults to 40
60
+ #
61
+ # ### Styling:
62
+ #
63
+ # It's pretty easy to figure out how to style ```directory_listing``` by looking at the source, but here are some gotchas:
64
+ #
65
+ # - 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```.
66
+ # - You can style the "File" column with this CSS:
67
+ #
68
+ # ```css
60
69
  # table tr > td:first-child {
61
70
  # text-align: left;
62
71
  # }
72
+ # ```
73
+ #
74
+ # - "Last modified" column:
63
75
  #
64
- # Second column:
76
+ # ```css
65
77
  # table tr > td:first-child + td {
66
78
  # text-align: left;
67
79
  # }
80
+ # ```
81
+ #
82
+ # - "Size" column:
68
83
  #
69
- # Third column:
84
+ # ```css
70
85
  # table tr > td:first-child + td + td {
71
86
  # text-align: left;
72
87
  # }
88
+ # ```
73
89
 
74
90
  module Sinatra
75
91
  module Directory_listing
76
92
 
93
+ VERSION = '0.2.2'
94
+
77
95
  ##
78
96
  # erb template for page
79
97
 
@@ -109,7 +127,7 @@ module Sinatra
109
127
 
110
128
  def m_time(file)
111
129
  f = File.join(File.join(settings.public_folder, URI.unescape(request.fullpath)), file)
112
- "\t<td>#{File.mtime(f).strftime $last_modified_format}</td>"
130
+ "\t<td>#{File.mtime(f).strftime($last_modified_format)}</td>"
113
131
  end
114
132
 
115
133
  ##
@@ -126,23 +144,48 @@ module Sinatra
126
144
  end
127
145
 
128
146
  ##
129
- # Get the name of a file.
147
+ # Get the name of the file and its link.
130
148
 
131
149
  def name(file)
150
+
151
+ ##
152
+ # Make sure we're working with an unescaped file name and truncate it.
153
+ # URI.unescape seems to work best to decode uris.
154
+
132
155
  file = URI.unescape(file)
133
- tfile = file.truncate($filename_truncate_length, '...')
134
- if (Pathname.new(URI.unescape(request.path)).cleanpath).eql?((Pathname.new(settings.public_folder)).cleanpath)
156
+ file_truncated = file.truncate($filename_truncate_length, '...')
157
+
158
+ ##
159
+ # If the requested resource is in the root public directory, the link is
160
+ # just the resource itself without the public directory path as well.
161
+
162
+ requested = Pathname.new(URI.unescape(request.path)).cleanpath
163
+ public_folder = Pathname.new(settings.public_folder).cleanpath
164
+ if requested.eql?(public_folder)
135
165
  link = file
136
166
  else
137
167
  link = File.join(request.fullpath, file)
138
168
  end
169
+
170
+ ##
171
+ # Add a class of "dir" to directories and "file" to files.
139
172
 
140
173
  html = ""
141
174
  if File.directory?(File.join(settings.public_folder, link))
142
- html << "\t<td class='dir'><a href='#{link}'>#{tfile}</a></td>"
175
+ html << "\t<td class='dir'>"
143
176
  else
144
- html << "\t<td class='file'><a href='#{link}'>#{tfile}</a></td>"
177
+ html << "\t<td class='file'>"
145
178
  end
179
+
180
+ ##
181
+ # Append the rest of the html.
182
+ #
183
+ # I haven't found a URI escaping library that will handle this
184
+ # gracefully, so for now, we're going to just take care of spaces and
185
+ # apostrophes ourselves.
186
+
187
+ link = link.gsub(" ", "%20").gsub("'", "%27")
188
+ html << "<a href='#{link}'>#{file_truncated}</a></td>"
146
189
  html
147
190
  end
148
191
 
@@ -200,7 +243,12 @@ module Sinatra
200
243
  files = Array.new
201
244
  Dir.foreach(File.join(settings.public_folder, URI.unescape(request.path)), &files.method(:push))
202
245
  if files == [".", ".."]
203
- $files_html << "\t<tr>\n\t\t<th>No files.</th>\n\t\t<th>-</th>\n\t\t<th>-</th>\n\t</tr>"
246
+ $files_html << "
247
+ <tr>
248
+ <th>No files.</th>
249
+ <th>-</th>
250
+ <th>-</th>
251
+ </tr>"
204
252
  else
205
253
  files.sort.each do |file|
206
254
  $files_html << self.wrap(file)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: directory_listing
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Richard Myers
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2013-08-21 00:00:00 Z
12
+ date: 2013-08-23 00:00:00 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: filesize
@@ -31,6 +31,27 @@ dependencies:
31
31
  version: 0.0.4
32
32
  type: :runtime
33
33
  version_requirements: *id002
34
+ - !ruby/object:Gem::Dependency
35
+ name: bundler
36
+ prerelease: false
37
+ requirement: &id003 !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ~>
40
+ - !ruby/object:Gem::Version
41
+ version: "1.3"
42
+ type: :development
43
+ version_requirements: *id003
44
+ - !ruby/object:Gem::Dependency
45
+ name: rake
46
+ prerelease: false
47
+ requirement: &id004 !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - &id005
50
+ - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: "0"
53
+ type: :development
54
+ version_requirements: *id004
34
55
  description: A Sinatra extension for generating easy, CSS-styled, Apache-like directory listings.
35
56
  email: rick.myers@me.com
36
57
  executables: []
@@ -53,13 +74,10 @@ require_paths:
53
74
  - lib
54
75
  required_ruby_version: !ruby/object:Gem::Requirement
55
76
  requirements:
56
- - &id003
57
- - ">="
58
- - !ruby/object:Gem::Version
59
- version: "0"
77
+ - *id005
60
78
  required_rubygems_version: !ruby/object:Gem::Requirement
61
79
  requirements:
62
- - *id003
80
+ - *id005
63
81
  requirements: []
64
82
 
65
83
  rubyforge_project: