gallerize-cli 0.2.2 → 0.3.0
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.
- checksums.yaml +4 -4
- data/.gitignore +2 -4
- data/Gemfile +2 -2
- data/{assets/css → app/assets/images}/blank.gif +0 -0
- data/{assets/css → app/assets/images}/fancybox_loading.gif +0 -0
- data/{assets/css → app/assets/images}/fancybox_loading@2x.gif +0 -0
- data/{assets/css → app/assets/images}/fancybox_overlay.png +0 -0
- data/{assets/css → app/assets/images}/fancybox_sprite.png +0 -0
- data/{assets/css → app/assets/images}/fancybox_sprite@2x.png +0 -0
- data/{assets/js → app/assets/javascripts/plugins}/jquery-1.10.1.min.js +0 -0
- data/{assets/js → app/assets/javascripts/plugins}/jquery.fancybox.js +0 -0
- data/app/assets/javascripts/ready.js +14 -0
- data/app/assets/stylesheets/_gallerize.scss +144 -0
- data/app/assets/stylesheets/_jquery.fancybox.scss +273 -0
- data/app/assets/stylesheets/styles.scss +2 -0
- data/app/config/gallerize_cli.yml +28 -0
- data/app/templates/layout.html.haml +37 -0
- data/bin/{gallerize → gallerize_cli} +5 -2
- data/gallerize-cli.gemspec +15 -15
- data/lib/gallerize_cli/directory.rb +113 -0
- data/lib/gallerize_cli/image/version.rb +99 -0
- data/lib/gallerize_cli/image.rb +87 -0
- data/lib/gallerize_cli/render.rb +70 -0
- data/lib/gallerize_cli.rb +42 -0
- data/readme.md +35 -0
- metadata +35 -34
- data/Gemfile.lock +0 -37
- data/README.md +0 -50
- data/assets/css/jquery.fancybox.css +0 -274
- data/assets/css/styles.css +0 -76
- data/assets/js/imagesloaded.js +0 -7
- data/assets/js/jquery.masonry.js +0 -9
- data/config/global.yml.example +0 -10
- data/lib/gallerize/output_dir.rb +0 -44
- data/lib/gallerize/source_dir.rb +0 -17
- data/lib/gallerize.rb +0 -210
- data/templates/layout.html.erb +0 -59
@@ -0,0 +1,28 @@
|
|
1
|
+
site_title: Gallerize Title
|
2
|
+
site_url: '.'
|
3
|
+
output_path: gallerize
|
4
|
+
|
5
|
+
images_per_page: 40
|
6
|
+
|
7
|
+
file_patterns:
|
8
|
+
- "*.jpg"
|
9
|
+
- "*.png"
|
10
|
+
- "*.gif"
|
11
|
+
|
12
|
+
versions:
|
13
|
+
thumb:
|
14
|
+
width: 400
|
15
|
+
height: 250
|
16
|
+
approach: crop
|
17
|
+
|
18
|
+
large:
|
19
|
+
width: 1000
|
20
|
+
height: 800
|
21
|
+
approach: resize
|
22
|
+
|
23
|
+
parallel:
|
24
|
+
in_processes: 6
|
25
|
+
|
26
|
+
image_attributes:
|
27
|
+
example.jpg:
|
28
|
+
title: The Title
|
@@ -0,0 +1,37 @@
|
|
1
|
+
!!!
|
2
|
+
%html{"xml:lang" => "en", :xmlns => "http://www.w3.org/1999/xhtml"}
|
3
|
+
%head
|
4
|
+
%meta{:content => "text/html;charset=UTF-8", "http-equiv" => "Content-Type"}/
|
5
|
+
%meta{:content => "noindex", :name => "robots"}/
|
6
|
+
%meta{:content => "noindex", :name => "googlebot"}/
|
7
|
+
|
8
|
+
%script{src: javascripts_min_path, type: 'text/javascript'}
|
9
|
+
%link{href: stylesheets_min_path, media: 'screen', rel: 'stylesheet', type: 'text/css'}
|
10
|
+
|
11
|
+
%meta{:content => "width=device-width, user-scalable=no", :name => "viewport"}/
|
12
|
+
|
13
|
+
%title= config.site_title
|
14
|
+
|
15
|
+
%body
|
16
|
+
%h1.page-title= config.site_title
|
17
|
+
#images-container
|
18
|
+
- if total_pages > 1
|
19
|
+
.navigation
|
20
|
+
%ul
|
21
|
+
%li{class: "#{'active' if current_page == 1}"}
|
22
|
+
%a{href: site_url('index.html')} 1
|
23
|
+
- total_pages.times do |i|
|
24
|
+
%li{class: "#{'active' if current_page == i + 2}"}
|
25
|
+
%a{href: site_url("page-#{i + 2}.html")}= i + 2
|
26
|
+
|
27
|
+
.images
|
28
|
+
- images.each do |image|
|
29
|
+
.image
|
30
|
+
.image-inner
|
31
|
+
- title = capture_haml do
|
32
|
+
%a.original-link{href: image.original_url, target: :blank } Download Full Resolution
|
33
|
+
%a.image-link.fancybox{rel: 'group', href: image.large_url, title: title, data: {original: image.original_url} }
|
34
|
+
%img{src: image.thumb_url }
|
35
|
+
.image-title
|
36
|
+
%a.original-link{href: image.original_url, target: :blank }
|
37
|
+
= image.attributes['title'] || image.name
|
@@ -1,8 +1,11 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# encoding: UTF-8
|
3
3
|
require "pathname"
|
4
|
-
|
5
4
|
bin_file = Pathname.new(__FILE__).realpath
|
5
|
+
|
6
|
+
# add self to libpath
|
6
7
|
$:.unshift File.expand_path("../../lib", bin_file)
|
7
8
|
|
8
|
-
require '
|
9
|
+
require 'gallerize_cli'
|
10
|
+
|
11
|
+
GallerizeCli.perform
|
data/gallerize-cli.gemspec
CHANGED
@@ -1,26 +1,26 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
$:.push File.expand_path("../lib", __FILE__)
|
3
|
-
require "
|
3
|
+
require "gallerize_cli"
|
4
4
|
|
5
5
|
Gem::Specification.new do |s|
|
6
|
-
s.name
|
7
|
-
s.version
|
8
|
-
s.authors
|
9
|
-
s.email
|
10
|
-
s.homepage
|
11
|
-
s.license
|
12
|
-
s.summary
|
6
|
+
s.name = "gallerize-cli"
|
7
|
+
s.version = GallerizeCli::VERSION
|
8
|
+
s.authors = ["Blake Hilscher"]
|
9
|
+
s.email = ["blake@hilscher.ca"]
|
10
|
+
s.homepage = "http://blake.hilscher.ca/"
|
11
|
+
s.license = "MIT"
|
12
|
+
s.summary = "Generate a static gallery from a folder of images."
|
13
13
|
s.description = "https://github.com/blakehilscher/gallerize"
|
14
14
|
|
15
|
-
s.files
|
16
|
-
s.test_files
|
17
|
-
s.executables
|
15
|
+
s.files = `git ls-files`.split("\n")
|
16
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
17
|
+
s.executables = ["gallerize_cli"]
|
18
18
|
s.require_paths = ["lib"]
|
19
19
|
|
20
|
-
s.add_runtime_dependency
|
21
|
-
s.add_runtime_dependency
|
22
|
-
s.add_runtime_dependency
|
23
|
-
s.add_runtime_dependency
|
20
|
+
s.add_runtime_dependency 'mini_magick', '3.7.0'
|
21
|
+
s.add_runtime_dependency 'parallel', '1.0.0'
|
22
|
+
s.add_runtime_dependency 'sass', '3.4.7'
|
23
|
+
s.add_runtime_dependency 'uglifier'
|
24
24
|
|
25
25
|
s.add_development_dependency "pry", "~> 0.9"
|
26
26
|
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'gallerize_cli/image'
|
3
|
+
require 'sass'
|
4
|
+
require 'sass/engine'
|
5
|
+
require 'uglifier'
|
6
|
+
require 'parallel'
|
7
|
+
|
8
|
+
module GallerizeCli
|
9
|
+
class Directory
|
10
|
+
include FileUtils::Verbose
|
11
|
+
|
12
|
+
attr_reader :root_path
|
13
|
+
|
14
|
+
def initialize(path)
|
15
|
+
@root_path = File.expand_path(path)
|
16
|
+
end
|
17
|
+
|
18
|
+
def process
|
19
|
+
install
|
20
|
+
Parallel.each(images, in_processes: config.parallel['in_processes']) do |image|
|
21
|
+
image.process
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def total_images_count
|
26
|
+
images.count
|
27
|
+
end
|
28
|
+
|
29
|
+
def images
|
30
|
+
@images ||= load_images
|
31
|
+
end
|
32
|
+
|
33
|
+
def config
|
34
|
+
@config ||= OpenStruct.new(YAML.load(File.read(File.join(app_install_path, 'config/gallerize_cli.yml'))))
|
35
|
+
end
|
36
|
+
|
37
|
+
def assets_path
|
38
|
+
@assets_path ||= File.join(output_path, 'assets')
|
39
|
+
end
|
40
|
+
|
41
|
+
def images_path
|
42
|
+
@images_path ||= File.join(output_path, 'images')
|
43
|
+
end
|
44
|
+
|
45
|
+
def output_path
|
46
|
+
@output_path ||= File.expand_path(config.output_path)
|
47
|
+
end
|
48
|
+
|
49
|
+
def app_install_path
|
50
|
+
File.join(root_path, '.gallerize_cli')
|
51
|
+
end
|
52
|
+
|
53
|
+
def javascripts_min_path
|
54
|
+
@javascripts_min_path ||= compile_javascripts.gsub(output_path, config.site_url)
|
55
|
+
end
|
56
|
+
|
57
|
+
def stylesheets_min_path
|
58
|
+
@stylesheets_min_path ||= compile_stylesheets.gsub(output_path, config.site_url)
|
59
|
+
end
|
60
|
+
|
61
|
+
private
|
62
|
+
|
63
|
+
def compile_javascripts
|
64
|
+
# compile files
|
65
|
+
load_path = File.join(app_install_path, 'assets/javascripts')
|
66
|
+
output = Dir.glob(File.join(load_path, '**/*.js')).collect do |js_file|
|
67
|
+
Uglifier.new.compile(File.read(js_file))
|
68
|
+
end.join
|
69
|
+
# write minified file
|
70
|
+
output_file = File.join(assets_path, "gallerize_cli-#{Digest::MD5.hexdigest(output)}.min.js")
|
71
|
+
GallerizeCli.logger.debug("generated #{output_file}")
|
72
|
+
File.write(output_file, output)
|
73
|
+
output_file
|
74
|
+
end
|
75
|
+
|
76
|
+
def compile_stylesheets
|
77
|
+
# configure load_paths
|
78
|
+
load_path = File.join(app_install_path, 'assets/stylesheets')
|
79
|
+
# this is undefined for some unknown reason
|
80
|
+
Sass.define_singleton_method(:load_paths) { [load_path] }
|
81
|
+
# compile styles.scss
|
82
|
+
scss_file = File.join(load_path, 'styles.scss')
|
83
|
+
source = File.read(scss_file)
|
84
|
+
output = Sass::Engine.new(source, style: :compressed, syntax: :scss).render
|
85
|
+
# write new file
|
86
|
+
output_file = File.join(assets_path, "gallerize_cli-#{Digest::MD5.hexdigest(output)}.min.css")
|
87
|
+
GallerizeCli.logger.debug("generated #{output_file}")
|
88
|
+
File.write(output_file, output)
|
89
|
+
output_file
|
90
|
+
end
|
91
|
+
|
92
|
+
def load_images
|
93
|
+
output = []
|
94
|
+
Dir.chdir(root_path) do
|
95
|
+
config.file_patterns.each do |file_pattern|
|
96
|
+
Dir.glob(file_pattern) do |file_path|
|
97
|
+
output << GallerizeCli::Image.new(self, file_path)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
output
|
102
|
+
end
|
103
|
+
|
104
|
+
def install
|
105
|
+
cp_r(GallerizeCli.app_source_path, app_install_path) unless Dir.exists?(app_install_path)
|
106
|
+
mkdir_p(output_path) unless Dir.exists?(output_path)
|
107
|
+
mkdir_p(images_path) unless Dir.exists?(images_path)
|
108
|
+
mkdir_p(assets_path) unless Dir.exists?(assets_path)
|
109
|
+
cp_r(File.join(app_install_path, 'assets/images'), File.join(assets_path))
|
110
|
+
end
|
111
|
+
|
112
|
+
end
|
113
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
require 'mini_magick'
|
2
|
+
require 'exifr'
|
3
|
+
|
4
|
+
module GallerizeCli
|
5
|
+
class Image
|
6
|
+
class Version
|
7
|
+
include FileUtils::Verbose
|
8
|
+
|
9
|
+
attr_accessor :image, :name, :options
|
10
|
+
|
11
|
+
def initialize(image, name, options)
|
12
|
+
@image = image
|
13
|
+
@name = name
|
14
|
+
@options = OpenStruct.new(options)
|
15
|
+
@valid = true
|
16
|
+
end
|
17
|
+
|
18
|
+
def process
|
19
|
+
generate
|
20
|
+
end
|
21
|
+
|
22
|
+
def url
|
23
|
+
file_path.to_s.gsub(image.directory.output_path, config.site_url)
|
24
|
+
end
|
25
|
+
|
26
|
+
def file_path
|
27
|
+
@file_path ||= load_file_path
|
28
|
+
end
|
29
|
+
|
30
|
+
def width
|
31
|
+
options.width.to_i
|
32
|
+
end
|
33
|
+
|
34
|
+
def height
|
35
|
+
options.height.to_i
|
36
|
+
end
|
37
|
+
|
38
|
+
def valid?
|
39
|
+
!!@valid
|
40
|
+
end
|
41
|
+
|
42
|
+
def config
|
43
|
+
image.config
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def generate
|
49
|
+
# do we have width and height?
|
50
|
+
if width <= 0 || height <= 0
|
51
|
+
GallerizeCli.logger.debug "version: #{name} is missing width: #{width} or height: #{height}"
|
52
|
+
|
53
|
+
elsif !File.exists?(file_path)
|
54
|
+
GallerizeCli.logger.debug "generating #{options.approach} #{file_path}"
|
55
|
+
# open it up
|
56
|
+
mini_image = MiniMagick::Image.open(image.file_path)
|
57
|
+
mini_image.auto_orient
|
58
|
+
if options.approach == 'crop'
|
59
|
+
crop(mini_image, width, height)
|
60
|
+
else
|
61
|
+
resize(mini_image, width, height)
|
62
|
+
end
|
63
|
+
# landscape?
|
64
|
+
mini_image.write file_path
|
65
|
+
end
|
66
|
+
rescue => err
|
67
|
+
@valid = false
|
68
|
+
GallerizeCli.logger.debug "#{err} image.file_name: #{image.file_name} name: #{name} options: #{options}"
|
69
|
+
end
|
70
|
+
|
71
|
+
def resize(mini_image, width, height)
|
72
|
+
if mini_image[:width] > mini_image[:height]
|
73
|
+
mini_image.resize "#{width}x#{height}>"
|
74
|
+
else
|
75
|
+
# portrait
|
76
|
+
mini_image.resize "#{height}x#{width.to_i * 1.25}"
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def crop(mini_image, width, height)
|
81
|
+
max = width > height ? width : height
|
82
|
+
if mini_image[:width] > mini_image[:height]
|
83
|
+
resize(mini_image, max * 2, height)
|
84
|
+
else
|
85
|
+
resize(mini_image, width, max * 2)
|
86
|
+
end
|
87
|
+
|
88
|
+
mini_image.crop "#{width}x#{height}+0+0"
|
89
|
+
end
|
90
|
+
|
91
|
+
def load_file_path
|
92
|
+
path = File.join(image.directory.images_path, name)
|
93
|
+
mkdir_p(path) unless Dir.exists?(path)
|
94
|
+
File.join(path, image.file_name)
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'gallerize_cli/image/version'
|
2
|
+
|
3
|
+
module GallerizeCli
|
4
|
+
class Image
|
5
|
+
include FileUtils::Verbose
|
6
|
+
|
7
|
+
attr_reader :directory, :file_path, :versions
|
8
|
+
|
9
|
+
class << self
|
10
|
+
|
11
|
+
def generate_version_method(name)
|
12
|
+
unless public_method_defined?("#{name}_url")
|
13
|
+
define_method("#{name}_url") { self.versions[name].url }
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
def attributes
|
20
|
+
@attributes ||= fetch_attributes
|
21
|
+
end
|
22
|
+
|
23
|
+
def original_url
|
24
|
+
destination = File.join(directory.images_path, file_name)
|
25
|
+
cp(file_path, destination) unless File.exists?(destination)
|
26
|
+
destination.gsub(directory.output_path, config.site_url)
|
27
|
+
end
|
28
|
+
|
29
|
+
def initialize(directory, file_path)
|
30
|
+
@success = true
|
31
|
+
@directory = directory
|
32
|
+
@file_path = file_path
|
33
|
+
generate_version_methods
|
34
|
+
end
|
35
|
+
|
36
|
+
def process
|
37
|
+
versions.each { |name, version| version.process }
|
38
|
+
end
|
39
|
+
|
40
|
+
def name
|
41
|
+
return @name if defined?(@name)
|
42
|
+
parts = file_name.split('.')
|
43
|
+
parts.pop
|
44
|
+
@name = parts.join('.')
|
45
|
+
end
|
46
|
+
|
47
|
+
def file_name
|
48
|
+
@file_name ||= File.basename(file_path)
|
49
|
+
end
|
50
|
+
|
51
|
+
def config
|
52
|
+
directory.config
|
53
|
+
end
|
54
|
+
|
55
|
+
def versions
|
56
|
+
@versions ||= config.versions.inject({}) do |hash, (version_name, options)|
|
57
|
+
hash[version_name] = GallerizeCli::Image::Version.new(self, version_name, options)
|
58
|
+
hash
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def valid?
|
63
|
+
versions.collect(&:valid?).include?(false)
|
64
|
+
end
|
65
|
+
|
66
|
+
private
|
67
|
+
|
68
|
+
def fetch_attributes
|
69
|
+
hash = {}
|
70
|
+
if config.image_attributes.is_a?(Hash)
|
71
|
+
hash = config.image_attributes[file_name] || {}
|
72
|
+
end
|
73
|
+
OpenStruct.new(hash)
|
74
|
+
end
|
75
|
+
|
76
|
+
def generate_version_methods
|
77
|
+
versions.each do |name, version|
|
78
|
+
self.class.generate_version_method(name)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def success?
|
83
|
+
@success
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'haml'
|
2
|
+
require 'forwardable'
|
3
|
+
|
4
|
+
module GallerizeCli
|
5
|
+
class Render
|
6
|
+
|
7
|
+
attr_accessor :directory
|
8
|
+
|
9
|
+
def initialize(directory)
|
10
|
+
@directory = directory
|
11
|
+
end
|
12
|
+
|
13
|
+
def perform
|
14
|
+
index = 1
|
15
|
+
directory.images.each_slice(directory.config.images_per_page) do |images|
|
16
|
+
file = File.join(directory.output_path, 'index.html')
|
17
|
+
file = File.join(directory.output_path, "page-#{index}.html") if index != 1
|
18
|
+
View.new(directory, file, {images: images, page_index: index}).render
|
19
|
+
index += 1
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def output_file
|
24
|
+
File.join(directory.output_path, 'index.html')
|
25
|
+
end
|
26
|
+
|
27
|
+
class View
|
28
|
+
extend Forwardable
|
29
|
+
|
30
|
+
attr_reader :directory, :file_path, :locals
|
31
|
+
|
32
|
+
def_delegators :@directory, :javascripts_min_path, :stylesheets_min_path, :config, :total_images_count
|
33
|
+
|
34
|
+
def initialize(directory, file_path, locals={})
|
35
|
+
@directory = directory
|
36
|
+
@file_path = file_path
|
37
|
+
@locals = locals
|
38
|
+
end
|
39
|
+
|
40
|
+
def render
|
41
|
+
GallerizeCli.logger.debug("generate #{file_path}")
|
42
|
+
File.write(file_path, Haml::Engine.new(template).render(self, locals))
|
43
|
+
end
|
44
|
+
|
45
|
+
def site_url(path=nil)
|
46
|
+
File.join(config.site_url, path)
|
47
|
+
end
|
48
|
+
|
49
|
+
def current_page
|
50
|
+
(locals[:page_index] + 1 / directory.config.images_per_page)
|
51
|
+
end
|
52
|
+
|
53
|
+
def total_pages
|
54
|
+
directory.total_images_count / directory.config.images_per_page
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def template
|
60
|
+
@template ||= File.read(File.join(templates_path, 'layout.html.haml'))
|
61
|
+
end
|
62
|
+
|
63
|
+
def templates_path
|
64
|
+
@templates_path ||= File.join(directory.app_install_path, 'templates')
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
end
|