photos.kameronkenny.com/_plugins/gallery-generator.rb

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