diff --git a/lib/jekyll/responsive_image.rb b/lib/jekyll/responsive_image.rb index 6d0dcf5..06fd05c 100644 --- a/lib/jekyll/responsive_image.rb +++ b/lib/jekyll/responsive_image.rb @@ -7,6 +7,7 @@ require 'rmagick' require 'jekyll/responsive_image/version' require 'jekyll/responsive_image/defaults' require 'jekyll/responsive_image/utils' +require 'jekyll/responsive_image/render_cache' require 'jekyll/responsive_image/image_processor' require 'jekyll/responsive_image/resize_handler' require 'jekyll/responsive_image/common' diff --git a/lib/jekyll/responsive_image/block.rb b/lib/jekyll/responsive_image/block.rb index 65ba9a6..7c01bf9 100644 --- a/lib/jekyll/responsive_image/block.rb +++ b/lib/jekyll/responsive_image/block.rb @@ -4,20 +4,30 @@ module Jekyll include Jekyll::ResponsiveImage::Common def render(context) - site = context.registers[:site] - config = make_config(site) - attributes = YAML.load(super) - image_template = attributes['template'] || config['template'] - image = ImageProcessor.process(attributes['path'], config) - attributes['original'] = image[:original] - attributes['resized'] = image[:resized] + cache_key = attributes.to_s + result = attributes['cache'] ? RenderCache.get(cache_key) : nil - partial = File.read(image_template) - template = Liquid::Template.parse(partial) + if result.nil? + site = context.registers[:site] + config = make_config(site) - template.render!(attributes.merge(site.site_payload)) + image_template = attributes['template'] || config['template'] + + image = ImageProcessor.process(attributes['path'], config) + attributes['original'] = image[:original] + attributes['resized'] = image[:resized] + + partial = File.read(image_template) + template = Liquid::Template.parse(partial) + + result = template.render!(attributes.merge(site.site_payload)) + + RenderCache.set(cache_key, result) + end + + result end end end diff --git a/lib/jekyll/responsive_image/render_cache.rb b/lib/jekyll/responsive_image/render_cache.rb new file mode 100644 index 0000000..6de1768 --- /dev/null +++ b/lib/jekyll/responsive_image/render_cache.rb @@ -0,0 +1,21 @@ +module Jekyll + class ResponsiveImage + class RenderCache + attr_accessor :store + + class << self + def store + @store ||= {} + end + + def get(key) + store[key] + end + + def set(key, val) + store[key] = val + end + end + end + end +end diff --git a/lib/jekyll/responsive_image/tag.rb b/lib/jekyll/responsive_image/tag.rb index 714dc60..f601aca 100644 --- a/lib/jekyll/responsive_image/tag.rb +++ b/lib/jekyll/responsive_image/tag.rb @@ -15,19 +15,28 @@ module Jekyll end def render(context) - site = context.registers[:site] - config = make_config(site) + cache_key = @attributes.to_s + result = @attributes['cache'] ? RenderCache.get(cache_key) : nil - image = ImageProcessor.process(@attributes['path'], config) - @attributes['original'] = image[:original] - @attributes['resized'] = image[:resized] + if result.nil? + site = context.registers[:site] + config = make_config(site) - image_template = @attributes['template'] || config['template'] + image = ImageProcessor.process(@attributes['path'], config) + @attributes['original'] = image[:original] + @attributes['resized'] = image[:resized] - partial = File.read(image_template) - template = Liquid::Template.parse(partial) + image_template = @attributes['template'] || config['template'] - template.render!(@attributes.merge(site.site_payload)) + partial = File.read(image_template) + template = Liquid::Template.parse(partial) + + result = template.render!(@attributes.merge(site.site_payload)) + + RenderCache.set(cache_key, result) + end + + result end end end