# Nick's web site: imgresize filter. Helper for resizing images during site # compilations for thumbnails, etc. # # Copyright © 2016, 2020 Nick Bowler # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . class ImgResize < Nanoc::Filter identifier :imgresize type :binary def fetch_from_cache(filename, params) return unless params[:cache] cachefile = File.join(@config[:output_dir], params[:cache]) begin s = File.stat(cachefile) rescue Errno::ENOENT return end return unless s.mtime >= File.stat(filename).mtime begin File.link(cachefile, output_filename) rescue FileUtils.copy_file(cachefile, output_filename) end return true end def run(filename, params = {}) w = if params[:width] then params[:width].to_i end h = if params[:height] then params[:height].to_i end scale = [w, h && "x", h].join args = ["-scale", scale, filename] case filename when /\.jpg$/ args << "-quality" << "85" end args << output_filename unless fetch_from_cache(filename, params) system('gm', 'convert', *args) end end end