gallerby 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.gitignore +23 -0
- data/LICENSE +20 -0
- data/README.md +61 -0
- data/Rakefile +55 -0
- data/VERSION +1 -0
- data/bin/gallerby +77 -0
- data/gallerby.gemspec +82 -0
- data/lib/gallerby.rb +139 -0
- data/lib/shared/assets/css/lightbox.css +27 -0
- data/lib/shared/assets/img/bullet.gif +0 -0
- data/lib/shared/assets/img/close.gif +0 -0
- data/lib/shared/assets/img/closelabel.gif +0 -0
- data/lib/shared/assets/img/donate-button.gif +0 -0
- data/lib/shared/assets/img/download-icon.gif +0 -0
- data/lib/shared/assets/img/loading.gif +0 -0
- data/lib/shared/assets/img/nextlabel.gif +0 -0
- data/lib/shared/assets/img/prevlabel.gif +0 -0
- data/lib/shared/assets/js/builder.js +136 -0
- data/lib/shared/assets/js/effects.js +1122 -0
- data/lib/shared/assets/js/lightbox.js +497 -0
- data/lib/shared/assets/js/prototype.js +4221 -0
- data/lib/shared/assets/js/scriptaculous.js +58 -0
- data/lib/shared/templates/gallerby.haml +26 -0
- data/lib/shared/templates/gallerby.sass +59 -0
- data/test/helper.rb +10 -0
- data/test/test_gallerby.rb +7 -0
- metadata +141 -0
data/.document
ADDED
data/.gitignore
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2009 Waine Kerr
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
gallerby
|
2
|
+
========
|
3
|
+
|
4
|
+
Think about a dead-simple static gallery generator, with nothing except pictures, thumbnails, previews. A kind of server directory listing for pictures. Enter Gallerby!
|
5
|
+
|
6
|
+
An example of a gallerby-generated gallery can be found [here]("http://wainekerr.github.com/gallerby").
|
7
|
+
|
8
|
+
## Installation
|
9
|
+
|
10
|
+
Classic!
|
11
|
+
|
12
|
+
`(sudo) gem install gallerby`
|
13
|
+
|
14
|
+
## Usage
|
15
|
+
|
16
|
+
Before building your gallery, you have to respect this kind of "directory model" :
|
17
|
+
|
18
|
+
name_of_my_gallery/ <---- This is where you gallery will reside.
|
19
|
+
originals/ <---- This is where you have to put your pictures.
|
20
|
+
thumbnails/ <---- This is where Gallerby will create thumbnails for you.
|
21
|
+
previews/ <---- This is where Gallerby will store "middle-sized" versions of your pictures for Lightbox.
|
22
|
+
|
23
|
+
When your directory is ready :
|
24
|
+
|
25
|
+
`gallerby -d directory_of_my_gallery`
|
26
|
+
|
27
|
+
Wait, and tada!
|
28
|
+
|
29
|
+
## Moar Usage
|
30
|
+
|
31
|
+
If I was an asshole, i'd say you to RTFM. So :
|
32
|
+
|
33
|
+
$ gallerby -h
|
34
|
+
gallerby - frakin' dead simple gallery generator
|
35
|
+
|
36
|
+
Usage: gallerby -d [directory] [options]
|
37
|
+
|
38
|
+
Options are:
|
39
|
+
-d, --directory DIRECTORY Directory of the Gallery
|
40
|
+
-n, --name [NAME] Name (optional, default to directory)
|
41
|
+
-s, --summary [SUMMARY] Summary (optional, default empty)
|
42
|
+
-p, --per-page [PER_PAGE] Pictures to display per page (default is 20)
|
43
|
+
-h, --help RTFM, dude!
|
44
|
+
|
45
|
+
## Updating
|
46
|
+
|
47
|
+
You can re-run `gallerby` to an existing gallery. It'll skip thumbnails & previews creation if files already exists.
|
48
|
+
|
49
|
+
Currently, no parameters are stored (like custom name, description, pictures per page). It's planned.
|
50
|
+
|
51
|
+
## Copyright
|
52
|
+
|
53
|
+
Copyright (c) 2010 Waine Kerr.
|
54
|
+
|
55
|
+
Released under the terms of the MIT license, see LICENSE for details.
|
56
|
+
|
57
|
+
Please note that other software is included in gallerby and may be released under others licenses:
|
58
|
+
|
59
|
+
* [Prototype]("http://github.com/sstephenson/prototype"), Copyright (c) 2005-2010 Sam Stephenson
|
60
|
+
* [script.aculo.us]("http://github.com/madrobby/scriptaculous"), Copyright (c) 2005-2010 Thomas Fuchs
|
61
|
+
* [Lightbox]("http://huddletogether.com/projects/lightbox2"), by Lokesh Dhakar
|
data/Rakefile
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'jeweler'
|
6
|
+
Jeweler::Tasks.new do |gem|
|
7
|
+
gem.name = "gallerby"
|
8
|
+
gem.summary = %Q{Think about a webserver directory-listing for pictures.}
|
9
|
+
gem.description = %Q{Think about a dead-simple static gallery generator, with nothing except pictures, thumbnails, previews. A kind of server directory listing for pictures. Enter Gallerby!}
|
10
|
+
gem.email = "wk@heldscalla.org"
|
11
|
+
gem.homepage = "http://github.com/wainekerr/gallerby"
|
12
|
+
gem.authors = ["Waine Kerr"]
|
13
|
+
gem.executables = %w(gallerby)
|
14
|
+
gem.add_dependency "mini_magick", ">= 2.0.0"
|
15
|
+
gem.add_dependency "haml", ">= 3.0.17"
|
16
|
+
gem.add_development_dependency "thoughtbot-shoulda", ">= 0"
|
17
|
+
gem.add_development_dependency "yard", ">= 0"
|
18
|
+
end
|
19
|
+
Jeweler::GemcutterTasks.new
|
20
|
+
rescue LoadError
|
21
|
+
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
22
|
+
end
|
23
|
+
|
24
|
+
require 'rake/testtask'
|
25
|
+
Rake::TestTask.new(:test) do |test|
|
26
|
+
test.libs << 'lib' << 'test'
|
27
|
+
test.pattern = 'test/**/test_*.rb'
|
28
|
+
test.verbose = true
|
29
|
+
end
|
30
|
+
|
31
|
+
begin
|
32
|
+
require 'rcov/rcovtask'
|
33
|
+
Rcov::RcovTask.new do |test|
|
34
|
+
test.libs << 'test'
|
35
|
+
test.pattern = 'test/**/test_*.rb'
|
36
|
+
test.verbose = true
|
37
|
+
end
|
38
|
+
rescue LoadError
|
39
|
+
task :rcov do
|
40
|
+
abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
task :test => :check_dependencies
|
45
|
+
|
46
|
+
task :default => :test
|
47
|
+
|
48
|
+
begin
|
49
|
+
require 'yard'
|
50
|
+
YARD::Rake::YardocTask.new
|
51
|
+
rescue LoadError
|
52
|
+
task :yardoc do
|
53
|
+
abort "YARD is not available. In order to run yardoc, you must: sudo gem install yard"
|
54
|
+
end
|
55
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1.0
|
data/bin/gallerby
ADDED
@@ -0,0 +1,77 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# Runner for Gallerby
|
4
|
+
|
5
|
+
require 'ostruct'
|
6
|
+
require 'optparse'
|
7
|
+
require 'optparse/time'
|
8
|
+
|
9
|
+
lib_dir = File.dirname(__FILE__) + '/../lib/'
|
10
|
+
require File.dirname(__FILE__) + '/../lib/gallerby'
|
11
|
+
|
12
|
+
options = {:per_page=>20}
|
13
|
+
|
14
|
+
optparse = OptionParser.new do |opts|
|
15
|
+
opts.banner = <<BANNER
|
16
|
+
gallerby - frakin' dead simple gallery generator
|
17
|
+
|
18
|
+
Usage: #{File.basename($0)} -d [directory] [options]
|
19
|
+
|
20
|
+
Options are:
|
21
|
+
BANNER
|
22
|
+
|
23
|
+
opts.on_tail('-h', '--help', 'RTFM, dude!') do
|
24
|
+
puts opts
|
25
|
+
exit 1
|
26
|
+
end
|
27
|
+
|
28
|
+
opts.on('-d DIRECTORY', '--directory DIRECTORY', "Directory of the Gallery") do |f|
|
29
|
+
options[:directory] = f
|
30
|
+
end
|
31
|
+
|
32
|
+
opts.on('-n', '--name [NAME]', 'Name (optional, default to directory)') do |f|
|
33
|
+
options[:name] = f || options[:directory]
|
34
|
+
end
|
35
|
+
|
36
|
+
opts.on('-s', '--summary [SUMMARY]', 'Summary (optional, default empty)') do |f|
|
37
|
+
options[:summary] = f || ""
|
38
|
+
end
|
39
|
+
|
40
|
+
opts.on('-p', '--per-page [PER_PAGE]', Integer, 'Pictures to display per page (default is 20)') do |f|
|
41
|
+
options[:per_page] = f || 20
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
begin # From http://stackoverflow.com/questions/1541294/how-do-you-specify-a-required-switch-not-argument-with-ruby-optionparser/2149183#2149183
|
46
|
+
optparse.parse!
|
47
|
+
mandatory = [:directory]
|
48
|
+
missing = mandatory.select{ |param| options[param].nil? }
|
49
|
+
if not missing.empty?
|
50
|
+
puts optparse
|
51
|
+
exit 1
|
52
|
+
end
|
53
|
+
rescue OptionParser::InvalidOption, OptionParser::MissingArgument
|
54
|
+
puts optparse
|
55
|
+
exit 1
|
56
|
+
end
|
57
|
+
|
58
|
+
begin
|
59
|
+
g = Gallerby.new(options[:directory], options[:per_page], options[:name], options[:summary])
|
60
|
+
g.verify_directory_structure
|
61
|
+
g.scan_pictures
|
62
|
+
puts "[WARNING ] Found 0 pictures in #{g.originals}. Your gallery will be empty!" if g.pictures.size == 0
|
63
|
+
g.map_pages
|
64
|
+
puts "[INFO ] Your gallery will have #{g.pictures.size} pictures in #{g.pages.size} pages."
|
65
|
+
print "[BUILDING] Thumbnails: " ; STDOUT.flush
|
66
|
+
g.build_thumbnails
|
67
|
+
print "[BUILDING] Previews: " ; STDOUT.flush
|
68
|
+
g.build_previews
|
69
|
+
puts "[INFO ] Copying assets and building CSS to #{g.directory}/assets"
|
70
|
+
g.copy_and_build_assets
|
71
|
+
print "[BUILDING] HTML: " ; STDOUT.flush
|
72
|
+
g.build_gallery
|
73
|
+
puts "[HOORAY ] Your gallery have been successfully builded. Enjoy \\o/"
|
74
|
+
rescue
|
75
|
+
puts "[OH NOES ] #{$!}"
|
76
|
+
exit 1
|
77
|
+
end
|
data/gallerby.gemspec
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{gallerby}
|
8
|
+
s.version = "0.1.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Waine Kerr"]
|
12
|
+
s.date = %q{2010-08-22}
|
13
|
+
s.default_executable = %q{gallerby}
|
14
|
+
s.description = %q{Think about a dead-simple static gallery generator, with nothing except pictures, thumbnails, previews. A kind of server directory listing for pictures. Enter Gallerby!}
|
15
|
+
s.email = %q{wk@heldscalla.org}
|
16
|
+
s.executables = ["gallerby"]
|
17
|
+
s.extra_rdoc_files = [
|
18
|
+
"LICENSE",
|
19
|
+
"README.md"
|
20
|
+
]
|
21
|
+
s.files = [
|
22
|
+
".document",
|
23
|
+
".gitignore",
|
24
|
+
"LICENSE",
|
25
|
+
"README.md",
|
26
|
+
"Rakefile",
|
27
|
+
"VERSION",
|
28
|
+
"bin/gallerby",
|
29
|
+
"gallerby.gemspec",
|
30
|
+
"lib/gallerby.rb",
|
31
|
+
"lib/shared/assets/css/lightbox.css",
|
32
|
+
"lib/shared/assets/img/bullet.gif",
|
33
|
+
"lib/shared/assets/img/close.gif",
|
34
|
+
"lib/shared/assets/img/closelabel.gif",
|
35
|
+
"lib/shared/assets/img/donate-button.gif",
|
36
|
+
"lib/shared/assets/img/download-icon.gif",
|
37
|
+
"lib/shared/assets/img/loading.gif",
|
38
|
+
"lib/shared/assets/img/nextlabel.gif",
|
39
|
+
"lib/shared/assets/img/prevlabel.gif",
|
40
|
+
"lib/shared/assets/js/builder.js",
|
41
|
+
"lib/shared/assets/js/effects.js",
|
42
|
+
"lib/shared/assets/js/lightbox.js",
|
43
|
+
"lib/shared/assets/js/prototype.js",
|
44
|
+
"lib/shared/assets/js/scriptaculous.js",
|
45
|
+
"lib/shared/templates/gallerby.haml",
|
46
|
+
"lib/shared/templates/gallerby.sass",
|
47
|
+
"test/helper.rb",
|
48
|
+
"test/test_gallerby.rb"
|
49
|
+
]
|
50
|
+
s.homepage = %q{http://github.com/wainekerr/gallerby}
|
51
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
52
|
+
s.require_paths = ["lib"]
|
53
|
+
s.rubygems_version = %q{1.3.6}
|
54
|
+
s.summary = %q{Think about a webserver directory-listing for pictures.}
|
55
|
+
s.test_files = [
|
56
|
+
"test/helper.rb",
|
57
|
+
"test/test_gallerby.rb"
|
58
|
+
]
|
59
|
+
|
60
|
+
if s.respond_to? :specification_version then
|
61
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
62
|
+
s.specification_version = 3
|
63
|
+
|
64
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
65
|
+
s.add_runtime_dependency(%q<mini_magick>, [">= 2.0.0"])
|
66
|
+
s.add_runtime_dependency(%q<haml>, [">= 3.0.17"])
|
67
|
+
s.add_development_dependency(%q<thoughtbot-shoulda>, [">= 0"])
|
68
|
+
s.add_development_dependency(%q<yard>, [">= 0"])
|
69
|
+
else
|
70
|
+
s.add_dependency(%q<mini_magick>, [">= 2.0.0"])
|
71
|
+
s.add_dependency(%q<haml>, [">= 3.0.17"])
|
72
|
+
s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
|
73
|
+
s.add_dependency(%q<yard>, [">= 0"])
|
74
|
+
end
|
75
|
+
else
|
76
|
+
s.add_dependency(%q<mini_magick>, [">= 2.0.0"])
|
77
|
+
s.add_dependency(%q<haml>, [">= 3.0.17"])
|
78
|
+
s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
|
79
|
+
s.add_dependency(%q<yard>, [">= 0"])
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
data/lib/gallerby.rb
ADDED
@@ -0,0 +1,139 @@
|
|
1
|
+
%w{fileutils mini_magick haml sass}.each {|r| require r }
|
2
|
+
|
3
|
+
class Gallerby
|
4
|
+
PICTURES_MATCHER = "*.{jpg,jpeg,JPG,JPEG,gif,GIF,png,PNG}"
|
5
|
+
SHARED_PATH = File.expand_path('../shared', __FILE__)
|
6
|
+
HAML_OPTS = {:format => :html5, :escape_html => true}
|
7
|
+
SASS_OPTS = {}
|
8
|
+
attr_accessor :directory, :name, :pictures, :originals, :pages, :description, :pages_links
|
9
|
+
|
10
|
+
# Well... initialize the Gallerby.
|
11
|
+
#
|
12
|
+
# @param [String] directory string of the gallery root directory
|
13
|
+
# @param [optional, Integer] per_page number of pictures to display per page
|
14
|
+
# @param [optional, String] name custom name for the gallery (default is the directory)
|
15
|
+
# @param [optional, String] description description for the gallery (default is nothing)
|
16
|
+
# @raise [RuntimeError] if gallery directory don't exists or don't match the required structure.
|
17
|
+
def initialize(directory, per_page=20, name=nil, description=nil)
|
18
|
+
@directory, @per_page, @name, @description = directory, per_page, name, description
|
19
|
+
@thumbs, @previews, @originals = "#{@directory}/thumbnails", "#{@directory}/previews", "#{@directory}/originals"
|
20
|
+
raise "Directory #{@directory} don't exists." unless File.exists?(@directory)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Verify if the directory structure match the gallerby requirements. See the README for more information
|
24
|
+
#
|
25
|
+
# @return [TrueClass, FalseClass]
|
26
|
+
def verify_directory_structure
|
27
|
+
raise "Thumbnails directory (#{@thumbs}) don't exist." unless File.exists?(@thumbs)
|
28
|
+
raise "Previews directory (#{@previews}) don't exist." unless File.exists?(@previews)
|
29
|
+
raise "Originals directory (#{@originals}) don't exist." unless File.exists?(@originals)
|
30
|
+
end
|
31
|
+
|
32
|
+
# Scan for pictures in the original directory.
|
33
|
+
# @returns [Array] Filenames of the pictures
|
34
|
+
def scan_pictures
|
35
|
+
@pictures = Dir["#{@originals}/#{PICTURES_MATCHER}"]
|
36
|
+
end
|
37
|
+
|
38
|
+
# Map pages/pictures for pagination purposes
|
39
|
+
#
|
40
|
+
# @returns [Hash] Pages ID & Pictures associated to the page.
|
41
|
+
def map_pages
|
42
|
+
@pages = {}
|
43
|
+
page_id = 0
|
44
|
+
pict_count = 0
|
45
|
+
page_pictures = []
|
46
|
+
|
47
|
+
@pictures.each do |picture|
|
48
|
+
if pict_count == @per_page
|
49
|
+
@pages[page_id] = page_pictures
|
50
|
+
page_pictures = []
|
51
|
+
page_id += 1
|
52
|
+
pict_count = 0
|
53
|
+
end
|
54
|
+
page_pictures << picture
|
55
|
+
pict_count += 1
|
56
|
+
end
|
57
|
+
|
58
|
+
@pages
|
59
|
+
end
|
60
|
+
|
61
|
+
# Build the thumbnails
|
62
|
+
#
|
63
|
+
# @see Gallerby#the_rezise_machine
|
64
|
+
def build_thumbnails(size="200x200", verbose=true)
|
65
|
+
the_resize_machine(@pictures, @thumbs, size, verbose)
|
66
|
+
end
|
67
|
+
|
68
|
+
# Build the previews
|
69
|
+
#
|
70
|
+
# @see Gallerby#the_rezise_machine
|
71
|
+
def build_previews(size="900x780", verbose=true)
|
72
|
+
the_resize_machine(@pictures, @previews, size, verbose)
|
73
|
+
end
|
74
|
+
|
75
|
+
# Copy the assets (JS, CSS and images) to the gallery directory, and build the CSS.
|
76
|
+
def copy_and_build_assets
|
77
|
+
FileUtils.cp_r("#{SHARED_PATH}/assets", @directory)
|
78
|
+
sass = Sass::Engine.new(File.read("#{SHARED_PATH}/templates/gallerby.sass"), SASS_OPTS).to_css
|
79
|
+
File.open("#{@directory}/assets/css/gallerby.css", 'w') {|f| f.write(sass) }
|
80
|
+
end
|
81
|
+
|
82
|
+
# Build all HTML pages of the gallery.
|
83
|
+
#
|
84
|
+
# @see Gallerby#build_page
|
85
|
+
def build_gallery(verbose=true)
|
86
|
+
@pages_links = {}
|
87
|
+
@pages.each do |page_id,pictures|
|
88
|
+
page_name = page_id==0 ? "index" : "page#{page_id}"
|
89
|
+
build_page(page_id, page_name, pictures)
|
90
|
+
(print "." ; STDOUT.flush) if verbose
|
91
|
+
end
|
92
|
+
(print " OK!\n" ; STDOUT.flush) if verbose
|
93
|
+
end
|
94
|
+
|
95
|
+
# Helper to build the navigations links
|
96
|
+
def navigation_links(current_page)
|
97
|
+
links = "Pages: "
|
98
|
+
@pages.keys.sort.each do |pid|
|
99
|
+
page_link = pid==0 ? "index.html" : "page#{pid}.html"
|
100
|
+
extra_html = pid==current_page ? " class='selected'" : ""
|
101
|
+
links << "<a href='#{page_link}' title='Page #{pid+1}'#{extra_html}>#{pid+1}</a> "
|
102
|
+
end
|
103
|
+
links
|
104
|
+
end
|
105
|
+
|
106
|
+
private
|
107
|
+
# Build a page of the gallery.
|
108
|
+
#
|
109
|
+
# @params [Integer] pid ID of the page
|
110
|
+
# @params [String] pname Name of the page (index or pageID)
|
111
|
+
# @picts [Array] Array of pictures path
|
112
|
+
def build_page(pid, pname, picts)
|
113
|
+
page_pictures = []
|
114
|
+
picts.each {|pict| page_pictures << pict.gsub("#{@originals}/", '') }
|
115
|
+
locals = {:gallery => self, :pid => pid, :pname => pname, :pictures => page_pictures}
|
116
|
+
haml = Haml::Engine.new(File.read("#{SHARED_PATH}/templates/gallerby.haml"), HAML_OPTS).render(Object.new, locals)
|
117
|
+
File.open("#{@directory}/#{pname}.html", 'w') {|f| f.write(haml) }
|
118
|
+
end
|
119
|
+
|
120
|
+
# Resize an Array of pictures
|
121
|
+
#
|
122
|
+
# @params [Array] pictures Array of pictures path
|
123
|
+
# @params [String] save_path in which directory to save the picture
|
124
|
+
# @params [String] size Size to use for rezising.
|
125
|
+
# @params [Boolean] verbose Enable verbose or not (useful for `gallerby` binary)
|
126
|
+
def the_resize_machine(pictures, save_path, size, verbose)
|
127
|
+
pictures.each do |picture|
|
128
|
+
read_from = "#{picture}"
|
129
|
+
write_to = "#{save_path}#{picture.gsub(@originals, '')}"
|
130
|
+
unless File.exists?(write_to)
|
131
|
+
magick = MiniMagick::Image.from_file(read_from)
|
132
|
+
magick.resize(size)
|
133
|
+
magick.write(write_to)
|
134
|
+
(print "." ; STDOUT.flush) if verbose
|
135
|
+
end
|
136
|
+
end
|
137
|
+
(print " OK!\n" ; STDOUT.flush) if verbose
|
138
|
+
end
|
139
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
#lightbox{ position: absolute; left: 0; width: 100%; z-index: 100; text-align: center; line-height: 0;}
|
2
|
+
#lightbox img{ width: auto; height: auto;}
|
3
|
+
#lightbox a img{ border: none; }
|
4
|
+
|
5
|
+
#outerImageContainer{ position: relative; background-color: #fff; width: 250px; height: 250px; margin: 0 auto; }
|
6
|
+
#imageContainer{ padding: 10px; }
|
7
|
+
|
8
|
+
#loading{ position: absolute; top: 40%; left: 0%; height: 25%; width: 100%; text-align: center; line-height: 0; }
|
9
|
+
#hoverNav{ position: absolute; top: 0; left: 0; height: 100%; width: 100%; z-index: 10; }
|
10
|
+
#imageContainer>#hoverNav{ left: 0;}
|
11
|
+
#hoverNav a{ outline: none;}
|
12
|
+
|
13
|
+
#prevLink, #nextLink{ width: 49%; height: 100%; background-image: url(data:image/gif;base64,AAAA); /* Trick IE into showing hover */ display: block; }
|
14
|
+
#prevLink { left: 0; float: left;}
|
15
|
+
#nextLink { right: 0; float: right;}
|
16
|
+
#prevLink:hover, #prevLink:visited:hover { background: url(../img/prevlabel.gif) left 15% no-repeat; }
|
17
|
+
#nextLink:hover, #nextLink:visited:hover { background: url(../img/nextlabel.gif) right 15% no-repeat; }
|
18
|
+
|
19
|
+
#imageDataContainer{ font: 10px Verdana, Helvetica, sans-serif; background-color: #fff; margin: 0 auto; line-height: 1.4em; overflow: auto; width: 100% ; }
|
20
|
+
|
21
|
+
#imageData{ padding:0 10px; color: #666; }
|
22
|
+
#imageData #imageDetails{ width: 70%; float: left; text-align: left; }
|
23
|
+
#imageData #caption{ font-weight: bold; }
|
24
|
+
#imageData #numberDisplay{ display: block; clear: left; padding-bottom: 1.0em; }
|
25
|
+
#imageData #bottomNavClose{ width: 66px; float: right; padding-bottom: 0.7em; outline: none;}
|
26
|
+
|
27
|
+
#overlay{ position: absolute; top: 0; left: 0; z-index: 90; width: 100%; height: 500px; background-color: #000; }
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,136 @@
|
|
1
|
+
// script.aculo.us builder.js v1.8.1, Thu Jan 03 22:07:12 -0500 2008
|
2
|
+
|
3
|
+
// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
|
4
|
+
//
|
5
|
+
// script.aculo.us is freely distributable under the terms of an MIT-style license.
|
6
|
+
// For details, see the script.aculo.us web site: http://script.aculo.us/
|
7
|
+
|
8
|
+
var Builder = {
|
9
|
+
NODEMAP: {
|
10
|
+
AREA: 'map',
|
11
|
+
CAPTION: 'table',
|
12
|
+
COL: 'table',
|
13
|
+
COLGROUP: 'table',
|
14
|
+
LEGEND: 'fieldset',
|
15
|
+
OPTGROUP: 'select',
|
16
|
+
OPTION: 'select',
|
17
|
+
PARAM: 'object',
|
18
|
+
TBODY: 'table',
|
19
|
+
TD: 'table',
|
20
|
+
TFOOT: 'table',
|
21
|
+
TH: 'table',
|
22
|
+
THEAD: 'table',
|
23
|
+
TR: 'table'
|
24
|
+
},
|
25
|
+
// note: For Firefox < 1.5, OPTION and OPTGROUP tags are currently broken,
|
26
|
+
// due to a Firefox bug
|
27
|
+
node: function(elementName) {
|
28
|
+
elementName = elementName.toUpperCase();
|
29
|
+
|
30
|
+
// try innerHTML approach
|
31
|
+
var parentTag = this.NODEMAP[elementName] || 'div';
|
32
|
+
var parentElement = document.createElement(parentTag);
|
33
|
+
try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
|
34
|
+
parentElement.innerHTML = "<" + elementName + "></" + elementName + ">";
|
35
|
+
} catch(e) {}
|
36
|
+
var element = parentElement.firstChild || null;
|
37
|
+
|
38
|
+
// see if browser added wrapping tags
|
39
|
+
if(element && (element.tagName.toUpperCase() != elementName))
|
40
|
+
element = element.getElementsByTagName(elementName)[0];
|
41
|
+
|
42
|
+
// fallback to createElement approach
|
43
|
+
if(!element) element = document.createElement(elementName);
|
44
|
+
|
45
|
+
// abort if nothing could be created
|
46
|
+
if(!element) return;
|
47
|
+
|
48
|
+
// attributes (or text)
|
49
|
+
if(arguments[1])
|
50
|
+
if(this._isStringOrNumber(arguments[1]) ||
|
51
|
+
(arguments[1] instanceof Array) ||
|
52
|
+
arguments[1].tagName) {
|
53
|
+
this._children(element, arguments[1]);
|
54
|
+
} else {
|
55
|
+
var attrs = this._attributes(arguments[1]);
|
56
|
+
if(attrs.length) {
|
57
|
+
try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
|
58
|
+
parentElement.innerHTML = "<" +elementName + " " +
|
59
|
+
attrs + "></" + elementName + ">";
|
60
|
+
} catch(e) {}
|
61
|
+
element = parentElement.firstChild || null;
|
62
|
+
// workaround firefox 1.0.X bug
|
63
|
+
if(!element) {
|
64
|
+
element = document.createElement(elementName);
|
65
|
+
for(attr in arguments[1])
|
66
|
+
element[attr == 'class' ? 'className' : attr] = arguments[1][attr];
|
67
|
+
}
|
68
|
+
if(element.tagName.toUpperCase() != elementName)
|
69
|
+
element = parentElement.getElementsByTagName(elementName)[0];
|
70
|
+
}
|
71
|
+
}
|
72
|
+
|
73
|
+
// text, or array of children
|
74
|
+
if(arguments[2])
|
75
|
+
this._children(element, arguments[2]);
|
76
|
+
|
77
|
+
return element;
|
78
|
+
},
|
79
|
+
_text: function(text) {
|
80
|
+
return document.createTextNode(text);
|
81
|
+
},
|
82
|
+
|
83
|
+
ATTR_MAP: {
|
84
|
+
'className': 'class',
|
85
|
+
'htmlFor': 'for'
|
86
|
+
},
|
87
|
+
|
88
|
+
_attributes: function(attributes) {
|
89
|
+
var attrs = [];
|
90
|
+
for(attribute in attributes)
|
91
|
+
attrs.push((attribute in this.ATTR_MAP ? this.ATTR_MAP[attribute] : attribute) +
|
92
|
+
'="' + attributes[attribute].toString().escapeHTML().gsub(/"/,'"') + '"');
|
93
|
+
return attrs.join(" ");
|
94
|
+
},
|
95
|
+
_children: function(element, children) {
|
96
|
+
if(children.tagName) {
|
97
|
+
element.appendChild(children);
|
98
|
+
return;
|
99
|
+
}
|
100
|
+
if(typeof children=='object') { // array can hold nodes and text
|
101
|
+
children.flatten().each( function(e) {
|
102
|
+
if(typeof e=='object')
|
103
|
+
element.appendChild(e)
|
104
|
+
else
|
105
|
+
if(Builder._isStringOrNumber(e))
|
106
|
+
element.appendChild(Builder._text(e));
|
107
|
+
});
|
108
|
+
} else
|
109
|
+
if(Builder._isStringOrNumber(children))
|
110
|
+
element.appendChild(Builder._text(children));
|
111
|
+
},
|
112
|
+
_isStringOrNumber: function(param) {
|
113
|
+
return(typeof param=='string' || typeof param=='number');
|
114
|
+
},
|
115
|
+
build: function(html) {
|
116
|
+
var element = this.node('div');
|
117
|
+
$(element).update(html.strip());
|
118
|
+
return element.down();
|
119
|
+
},
|
120
|
+
dump: function(scope) {
|
121
|
+
if(typeof scope != 'object' && typeof scope != 'function') scope = window; //global scope
|
122
|
+
|
123
|
+
var tags = ("A ABBR ACRONYM ADDRESS APPLET AREA B BASE BASEFONT BDO BIG BLOCKQUOTE BODY " +
|
124
|
+
"BR BUTTON CAPTION CENTER CITE CODE COL COLGROUP DD DEL DFN DIR DIV DL DT EM FIELDSET " +
|
125
|
+
"FONT FORM FRAME FRAMESET H1 H2 H3 H4 H5 H6 HEAD HR HTML I IFRAME IMG INPUT INS ISINDEX "+
|
126
|
+
"KBD LABEL LEGEND LI LINK MAP MENU META NOFRAMES NOSCRIPT OBJECT OL OPTGROUP OPTION P "+
|
127
|
+
"PARAM PRE Q S SAMP SCRIPT SELECT SMALL SPAN STRIKE STRONG STYLE SUB SUP TABLE TBODY TD "+
|
128
|
+
"TEXTAREA TFOOT TH THEAD TITLE TR TT U UL VAR").split(/\s+/);
|
129
|
+
|
130
|
+
tags.each( function(tag){
|
131
|
+
scope[tag] = function() {
|
132
|
+
return Builder.node.apply(Builder, [tag].concat($A(arguments)));
|
133
|
+
}
|
134
|
+
});
|
135
|
+
}
|
136
|
+
}
|