81 lines
2.4 KiB
Ruby
81 lines
2.4 KiB
Ruby
require 'mini_magick'
|
|
|
|
module Jekyll
|
|
module JekyllMinimagick
|
|
|
|
class GeneratedImageFile < Jekyll::StaticFile
|
|
# Initialize a new GeneratedImage.
|
|
# +site+ is the Site
|
|
# +base+ is the String path to the <source>
|
|
# +dir+ is the String path between <source> and the file
|
|
# +name+ is the String filename of the file
|
|
# +preset+ is the Preset hash from the config.
|
|
#
|
|
# Returns <GeneratedImageFile>
|
|
def initialize(site, base, dir, name, preset)
|
|
@site = site
|
|
@base = base
|
|
@dir = dir
|
|
@name = name
|
|
@dst_dir = preset.delete('destination')
|
|
@src_dir = preset.delete('source')
|
|
@commands = preset
|
|
@relative_path = File.join(*[@dir, @name].compact)
|
|
@extname = File.extname(@name)
|
|
end
|
|
|
|
# Obtains source file path by substituting the preset's source directory
|
|
# for the destination directory.
|
|
#
|
|
# Returns source file path.
|
|
def path
|
|
File.join(@base, @dir.sub(@dst_dir, @src_dir), @name)
|
|
end
|
|
|
|
# Use MiniMagick to create a derivative image at the destination
|
|
# specified (if the original is modified).
|
|
# +dest+ is the String path to the destination dir
|
|
#
|
|
# Returns false if the file was not modified since last time (no-op).
|
|
def write(dest)
|
|
dest_path = destination(dest)
|
|
|
|
return false if File.exist? dest_path and !modified?
|
|
self.class.mtimes[path] = mtime
|
|
|
|
FileUtils.mkdir_p(File.dirname(dest_path))
|
|
image = ::MiniMagick::Image.open(path)
|
|
image.combine_options do |c|
|
|
@commands.each_pair do |command, arg|
|
|
c.send command, arg
|
|
end
|
|
end
|
|
image.write dest_path
|
|
|
|
true
|
|
end
|
|
|
|
end
|
|
|
|
class MiniMagickGenerator < Generator
|
|
safe true
|
|
|
|
# Find all image files in the source directories of the presets specified
|
|
# in the site config. Add a GeneratedImageFile to the static_files stack
|
|
# for later processing.
|
|
def generate(site)
|
|
return unless site.config['mini_magick']
|
|
|
|
site.config['mini_magick'].each_pair do |name, preset|
|
|
Dir.chdir preset['source'] do
|
|
Dir.glob(File.join("**", "*.{png,jpg,jpeg,gif}")) do |source|
|
|
site.static_files << GeneratedImageFile.new(site, site.source, preset['destination'], source, preset.clone)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
end
|
|
end
|