Fix the thumbnailer.

This commit is contained in:
Jakub Stastny aka botanicus 2011-08-16 12:17:19 -07:00
parent 58321ef82b
commit 96fa313ccc
3 changed files with 30 additions and 33 deletions

View file

@ -43,12 +43,11 @@ rules.rules.each do |klass, files|
if File.binread(file).match(/^-{3,5}\s*$/) # TODO: this should be a filter or lazy-loaded
puts "~ Read #{file} with parse"
raw_item = Ace::RawItem.new(file).tap(&:parse)
item = klass.create(raw_item.metadata, raw_item.content)
item = klass.create(raw_item.metadata, raw_item.content, file)
else
puts "~ Read #{file} without parse"
item = klass.create(Hash.new, File.read(file))
item = klass.create(Hash.new, File.read(file), file)
end
item.original_path = file
end
end

View file

@ -37,6 +37,11 @@ module Ace
self.content = pieces[2..-1].join.strip
end
set_timestamps_in_metadata
end
private
def set_timestamps_in_metadata
self.metadata[:created_at] ||= File.ctime(self.path)
self.metadata[:updated_at] ||= File.mtime(self.path)
end
@ -89,16 +94,17 @@ module Ace
self.after_filters << filter.new(*args)
end
def self.create(metadata, content)
self.new(metadata, content).tap(&:register)
def self.create(*args)
self.new(*args).tap(&:register)
end
# Content can be anything, not just a string.
attr_accessor :metadata, :content
attr_accessor :original_path
def initialize(metadata, content)
@metadata = metadata
@content = content
def initialize(metadata, content, original_path)
@metadata = metadata
@content = content
@original_path = original_path
end
def config

View file

@ -3,9 +3,9 @@
require "ace/filters"
require "nokogiri"
# <thumbnail src="assets/img/motivation-sheet.jpg" />
# <thumbnail src="assets/img/motivation-sheet.jpg" size="550" />
# <thumbnail src="assets/img/motivation-sheet.jpg" size="550x20" />
# <thumbnail src="/assets/img/motivation-sheet.jpg" />
# <thumbnail src="/assets/img/motivation-sheet.jpg" size="550" />
# <thumbnail src="/assets/img/motivation-sheet.jpg" size="550x20" />
# TODO:
# class Post < Ace::Item
@ -14,24 +14,15 @@ require "nokogiri"
module Ace
class ImageThumbnailerFilter < Filter
def thumb_path(file_name)
@file_name ||= file_name
@thumb_path ||= file_name.gsub(/content\/(.+)\.([^\.]*)$/, 'output/\1_thumb.\2')
def to_thumb(path)
path.to_s.sub(/\.(\w+)$/, '_thumb.\1')
end
def thumb_server_path
@thumb_path.sub("content", "")
end
def original_image_server_path
@file_name.sub("content", "")
end
def thumbnail_nodeset(file_name, doc)
def thumbnail_nodeset(link, doc)
link = Nokogiri::XML::Node.new("a", doc)
image = Nokogiri::XML::Node.new("img", doc)
link.set_attribute("href", original_image_server_path)
image.set_attribute("src", thumb_server_path)
link.set_attribute("href", link)
image.set_attribute("src", to_thumb(link))
image.parent = link
return link
end
@ -40,22 +31,23 @@ module Ace
puts "~ [THUMB] #{item.original_path}"
doc = Nokogiri::HTML(content)
doc.css("thumbnail").each do |thumb|
original_file = "content/#{thumb[:src]}"
generate_thumbnail(original_file, thumb[:size] || 550)
thumb.replace(thumbnail_nodeset(original_file, doc))
original_image_path = "content" + thumb[:src]
thumbnail_path = to_thumb("output" + thumb[:src])
generate_thumbnail(original_image_path, thumbnail_path, thumb[:src], thumb[:size] || 550)
thumb.replace(thumbnail_nodeset(thumb[:src], doc))
end
doc.to_s
end
private
def generate_thumbnail(file_name, size)
unless File.exist?(thumb_path(file_name))
command = "convert #{file_name} -resize #{size} #{thumb_path(file_name)}"
def generate_thumbnail(original_path, thumbnail_path, link, size)
unless File.exist?(thumbnail_path)
command = "convert #{original_path} -resize #{size} #{thumbnail_path}"
warn "~ $ #{command}"
system(command)
raise "Error when converting image '#{file_name}'" if $?.to_i != 0
raise "Error when converting image '#{original_path}'" if $?.to_i != 0
else
warn "~ File #{thumb_path(file_name)} already exists."
warn "~ File #{thumbnail_path} already exists."
end
end
end