directory_listing 0.0.1

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 (2) hide show
  1. data/lib/directory_listing.rb +177 -0
  2. metadata +75 -0
@@ -0,0 +1,177 @@
1
+ require 'truncate'
2
+ require 'filesize'
3
+
4
+ # = Easy Apache-style directory listings for Sinatra.
5
+ #
6
+ # == Usage
7
+ #
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:
10
+ #
11
+ # require 'directory_listing
12
+ #
13
+ # 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
+ # :should_list_invisibles => "no",
19
+ # :last_modified_format => "%Y-%m-%d %H:%M:%S",
20
+ # :dir_html_style => "bold",
21
+ # :regfile_html_style => "none",
22
+ # :filename_truncate_length => 40)}"
23
+ # else
24
+ # not_found
25
+ # end
26
+ # end
27
+ #
28
+ # not_found do
29
+ # 'Try again.'
30
+ # end
31
+ #
32
+ # Any option key may be omitted except for :directory and :sinatra_public. Explanations of options are below.
33
+ #
34
+ # == Options
35
+ #
36
+ # directory # the directory to list
37
+ # sinatra_public # sinatra's public folder - your public folder (and the default) is likely "settings.public_folder"
38
+ # should_list_invisibles # should the directory listing include invisibles (dotfiles) - "yes" or "no"
39
+ # 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"
40
+ # dir_html_style # html style for directories - "bold", "italic", "underline", or "none" - defaults to "bold"
41
+ # regfile_html_style # html style for regular files - "bold", "italic", "underline", or "none" - defaults to "none"
42
+ # filename_truncate_length # (integer) length to truncate file names to - defaults to 40
43
+
44
+ module Directory_listing
45
+ @@options = {}
46
+
47
+ def self.options=(value)
48
+ @@options = value
49
+ end
50
+
51
+ def self.options()
52
+ @@options
53
+ end
54
+
55
+ def self.list(options)
56
+ options = @@options.merge options
57
+ raise(ArgumentError, ":directory is required") unless options[:directory]
58
+ raise(ArgumentError, ":sinatra_public is required") unless options[:sinatra_public]
59
+ dir = File.join(options[:sinatra_public], options[:directory])
60
+
61
+ if options[:should_list_invisibles]
62
+ $should_list_invisibles = options[:should_list_invisibles]
63
+ else
64
+ $should_list_invisibles = "no"
65
+ end
66
+ if options[:last_modified_format]
67
+ $last_modified_format = options[:last_modified_format]
68
+ else
69
+ $last_modified_format = "%Y-%m-%d %H:%M:%S"
70
+ end
71
+ if options[:dir_html_style]
72
+ $dir_html_style = options[:dir_html_style]
73
+ else
74
+ $dir_html_style = "bold"
75
+ end
76
+ if options[:regfile_html_style]
77
+ $regfile_html_style = options[:regfile_html_style]
78
+ else
79
+ $regfile_html_style = "none"
80
+ end
81
+ if options[:filename_truncate_length]
82
+ $filename_truncate_length = options[:filename_truncate_length]
83
+ else
84
+ $filename_truncate_length = 40
85
+ end
86
+
87
+ html = "<html>\n<body>"
88
+ html << "<h1>Index of #{options[:directory]}</h1>"
89
+ html << "<table>"
90
+ html << "<tr>\n<th>File</th>\n<th>Last modified</th>\n<th>Size</th>\n</tr>"
91
+ files = Array.new
92
+ Dir.foreach(dir, &files.method(:push))
93
+ files.sort.each do |file|
94
+ html << wrap(file, dir)
95
+ end
96
+ html << "</table>"
97
+ html << "</html>\n</body>"
98
+ "#{html}"
99
+ end
100
+
101
+ private
102
+
103
+ def self.m_time(file, dir)
104
+ time = "#{File.mtime(File.join(dir, file)).strftime $last_modified_format}"
105
+ end
106
+
107
+ def self.size(file, dir)
108
+ if File.directory?(File.join(dir, file))
109
+ "-"
110
+ else
111
+ size = Filesize.from("#{File.stat(File.join(dir, file)).size} B").pretty
112
+ "#{size}"
113
+ end
114
+ end
115
+
116
+ def self.name(file, dir)
117
+ html = pre_dir = post_dir = pre_reg = post_reg = ""
118
+ tfile = file.truncate($filename_truncate_length, '...')
119
+
120
+ case $dir_html_style
121
+ when "bold"
122
+ pre_dir = "<b>"
123
+ post_dir = "</b>"
124
+ when "italic"
125
+ pre_dir = "<i>"
126
+ post_dir = "</i>"
127
+ when "underline"
128
+ pre_dir = "<u>"
129
+ post_dir = "</u>"
130
+ else
131
+ pre_dir = "<b>"
132
+ post_dir = "</b>"
133
+ end
134
+ case $regfile_html_style
135
+ when "bold"
136
+ pre_reg = "<b>"
137
+ post_reg = "</b>"
138
+ when "italic"
139
+ pre_reg = "<i>"
140
+ post_reg = "</i>"
141
+ when "underline"
142
+ pre_reg = "<u>"
143
+ post_reg = "</u>"
144
+ else
145
+ pre_reg = ""
146
+ post_reg = ""
147
+ end
148
+
149
+ if File.directory?(File.join(dir, file))
150
+ html << "<a href='#{file}'>#{pre_dir}#{tfile}#{post_dir}</a>"
151
+ else
152
+ html << "#{pre_reg}#{tfile}#{post_reg}"
153
+ end
154
+ "#{html}"
155
+ end
156
+
157
+ def self.wrap(file, dir)
158
+ wrapped = ""
159
+ if $should_list_invisibles == "yes"
160
+ wrapped << "<tr>
161
+ <td>#{name(file, dir)}</td>
162
+ <td>#{m_time(file, dir)}</td>
163
+ <td>#{size(file, dir)}</td>
164
+ </tr>"
165
+ else
166
+ if file[0] != "."
167
+ wrapped << "<tr>
168
+ <td>#{name(file, dir)}</td>
169
+ <td>#{m_time(file, dir)}</td>
170
+ <td>#{size(file, dir)}</td>
171
+ </tr>"
172
+ end
173
+ end
174
+ "#{wrapped}"
175
+ end
176
+
177
+ end
metadata ADDED
@@ -0,0 +1,75 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: directory_listing
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.0.1
6
+ platform: ruby
7
+ authors:
8
+ - Richard Myers
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2013-06-24 00:00:00 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: filesize
17
+ prerelease: false
18
+ requirement: &id001 !ruby/object:Gem::Requirement
19
+ none: false
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 0.0.2
24
+ type: :runtime
25
+ version_requirements: *id001
26
+ - !ruby/object:Gem::Dependency
27
+ name: truncate
28
+ prerelease: false
29
+ requirement: &id002 !ruby/object:Gem::Requirement
30
+ none: false
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: 0.0.4
35
+ type: :runtime
36
+ version_requirements: *id002
37
+ description: A gem to use with Sinatra for generating Apache-style directory listings.
38
+ email: rick.myers@me.com
39
+ executables: []
40
+
41
+ extensions: []
42
+
43
+ extra_rdoc_files: []
44
+
45
+ files:
46
+ - lib/directory_listing.rb
47
+ homepage: https://rubygems.org/gems/directory_listing
48
+ licenses: []
49
+
50
+ post_install_message:
51
+ rdoc_options: []
52
+
53
+ require_paths:
54
+ - lib
55
+ required_ruby_version: !ruby/object:Gem::Requirement
56
+ none: false
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: "0"
61
+ required_rubygems_version: !ruby/object:Gem::Requirement
62
+ none: false
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: "0"
67
+ requirements: []
68
+
69
+ rubyforge_project:
70
+ rubygems_version: 1.8.23
71
+ signing_key:
72
+ specification_version: 3
73
+ summary: Easy Apache-style directory listings for Sinatra.
74
+ test_files: []
75
+