175 lines
5.4 KiB
Ruby
175 lines
5.4 KiB
Ruby
require 'exifr'
|
|
require 'rmagick'
|
|
include Magick
|
|
include FileUtils
|
|
|
|
$image_extensions = [".png", ".jpg", ".jpeg", ".gif"]
|
|
|
|
module Jekyll
|
|
class GalleryFile < StaticFile
|
|
def write(dest)
|
|
return false
|
|
end
|
|
end
|
|
|
|
class GalleryIndex < Page
|
|
def initialize(site, base, dir, galleries)
|
|
@site = site
|
|
@base = base
|
|
@dir = dir.gsub("source/", "")
|
|
@name = "index.html"
|
|
config = site.config["gallery"] || {}
|
|
|
|
self.process(@name)
|
|
self.read_yaml(File.join(base, "_layouts"), "gallery_index.html")
|
|
self.data["title"] = config["title"]
|
|
self.data["galleries"] = []
|
|
|
|
sort_field = config["sort_field"]
|
|
galleries.sort! {|a,b| b.data[sort_field] <=> a.data[sort_field]}
|
|
|
|
if config["sort_reverse"]
|
|
galleries.reverse!
|
|
end
|
|
|
|
galleries.each {|gallery|
|
|
unless gallery.hidden
|
|
self.data["galleries"].push(gallery.data)
|
|
end
|
|
}
|
|
end
|
|
end
|
|
|
|
class GalleryPage < Page
|
|
attr_reader :hidden
|
|
|
|
def initialize(site, base, dir, gallery_name)
|
|
@site = site
|
|
@base = base
|
|
@dest_dir = dir.gsub("source/", "")
|
|
@dir = @dest_dir
|
|
@name = "index.html"
|
|
@images = []
|
|
@hidden = false
|
|
|
|
config = site.config["gallery"] || {}
|
|
gallery_config = {}
|
|
max_size_x = 400
|
|
max_size_y = 400
|
|
symlink = config["symlink"] || false
|
|
scale_method = config["scale_method"] || "fit"
|
|
begin
|
|
max_size_x = config["thumbnail_size"]["x"]
|
|
rescue
|
|
end
|
|
begin
|
|
max_size_y = config["thumbnail_size"]["y"]
|
|
rescue
|
|
end
|
|
begin
|
|
gallery_config = config["galleries"][gallery_name] || {}
|
|
rescue
|
|
end
|
|
self.process(@name)
|
|
self.read_yaml(File.join(base, "_layouts"), "gallery_page.html")
|
|
self.data["gallery"] = gallery_name
|
|
gallery_name = gallery_name.gsub("_", " ").gsub(/\w+/) {|word| word.capitalize}
|
|
begin
|
|
gallery_name = gallery_config["name"] || gallery_name
|
|
rescue
|
|
end
|
|
self.data["date"] = gallery_config["date"]
|
|
self.data["name"] = gallery_name
|
|
self.data["title"] = "#{gallery_name}"
|
|
thumbs_dir = File.join(site.dest, @dest_dir, "thumbs")
|
|
begin
|
|
@hidden = gallery_config["hidden"] || false
|
|
rescue
|
|
end
|
|
if @hidden
|
|
self.data["sitemap"] = false
|
|
end
|
|
|
|
FileUtils.mkdir_p(thumbs_dir, :mode => 0755)
|
|
Dir.foreach(dir) do |image|
|
|
next if image.chars.first == "."
|
|
next unless image.downcase().end_with?(*$image_extensions)
|
|
@site.static_files << GalleryFile.new(site, base, File.join(@dest_dir, "thumbs"), image)
|
|
image_path = File.join(dir, image)
|
|
|
|
if symlink
|
|
link_src = site.in_source_dir(image_path)
|
|
link_dest = site.in_dest_dir(image_path)
|
|
@site.static_files.delete_if { |sf|
|
|
sf.relative_path == "/" + image_path
|
|
}
|
|
@site.static_files << GalleryFile.new(site, base, dir, image)
|
|
if File.exists?(link_dest) or File.symlink?(link_dest)
|
|
if not File.symlink?(link_dest)
|
|
puts "#{link_dest} exists but is not a symlink. Deleting."
|
|
File.delete(link_dest)
|
|
elsif File.readlink(link_dest) != link_src
|
|
puts "#{link_dest} points to the wrong file. Deleting."
|
|
File.delete(link_dest)
|
|
end
|
|
end
|
|
if not File.exists?(link_dest) and not File.symlink?(link_dest)
|
|
puts "Symlinking #{link_src} -> #{link_dest}"
|
|
File.symlink(link_src, link_dest)
|
|
end
|
|
end
|
|
thumb_path = File.join(thumbs_dir, image)
|
|
if File.file?(thumb_path) == false or File.mtime(image_path) > File.mtime(thumb_path)
|
|
begin
|
|
m_image = ImageList.new(image_path)
|
|
m_image.send("resize_to_#{scale_method}!", max_size_x, max_size_y)
|
|
puts "Writing thumbnail to #{thumb_path}"
|
|
m_image.write(thumb_path) { self.quality = 60 }
|
|
rescue e
|
|
puts "Error generating thumbnail for #{image_path}: #{e}"
|
|
puts e.backtrace
|
|
end
|
|
GC.start
|
|
end
|
|
img = Magick::Image.read(thumb_path).first
|
|
width = img.columns
|
|
@images.push([image, width])
|
|
end
|
|
|
|
site.static_files = @site.static_files
|
|
self.data["images"] = @images
|
|
self.data["best_image"] = gallery_config["best_image"]
|
|
self.data["blur_image"] = gallery_config["blur_image"] || gallery_config["best_image"]
|
|
end
|
|
end
|
|
|
|
class GalleryGenerator < Generator
|
|
safe true
|
|
|
|
def generate(site)
|
|
config = site.config["gallery"] || {}
|
|
dir = config["dir"] || "photos"
|
|
galleries = []
|
|
begin
|
|
Dir.foreach(dir) do |gallery_dir|
|
|
gallery_path = File.join(dir, gallery_dir)
|
|
if File.directory?(gallery_path) and gallery_dir.chars.first != "."
|
|
gallery = GalleryPage.new(site, site.source, gallery_path, gallery_dir)
|
|
gallery.render(site.layouts, site.site_payload)
|
|
gallery.write(site.dest)
|
|
site.pages << gallery
|
|
galleries << gallery
|
|
end
|
|
end
|
|
rescue Exception => e
|
|
puts "Error generating galleries: #{e}"
|
|
puts e.backtrace
|
|
end
|
|
|
|
gallery_index = GalleryIndex.new(site, site.source, dir, galleries)
|
|
gallery_index.render(site.layouts, site.site_payload)
|
|
gallery_index.write(site.dest)
|
|
site.pages << gallery_index
|
|
end
|
|
end
|
|
end |