class JekyllIncludeCache::Tag
def self.digest_cache
def self.digest_cache @digest_cache ||= {} end
def digest(path_hash, params_hash)
def digest(path_hash, params_hash) md5 = Digest::MD5.new md5.update path_hash.to_s md5.update params_hash.to_s md5.hexdigest end
def key(path, params)
def key(path, params) path_hash = path.hash params_hash = quick_hash(params) self.class.digest_cache[path_hash] ||= {} self.class.digest_cache[path_hash][params_hash] ||= digest(path_hash, params_hash) end
def path(context)
def path(context) site = context.registers[:site] file = render_variable(context) || @file locate_include_file(context, file, site.safe) end
def quick_hash(params)
def quick_hash(params) return params.hash unless params md5 = Digest::MD5.new params.sort.each do |_, value| # Using the fact that Jekyll documents don't change during a build. # Instead of calculating the hash of an entire document (expensive!) # we just use its object id. if value.is_a? Jekyll::Drops::Drop md5.update value.object_id.to_s else md5.update value.hash.to_s end end md5.hexdigest end
def render(context)
def render(context) path = path(context) params = parse_params(context) if @params key = key(path, params) return unless path if JekyllIncludeCache.cache.key?(key) Jekyll.logger.debug "Include cache hit:", path JekyllIncludeCache.cache[key] else Jekyll.logger.debug "Include cache miss:", path JekyllIncludeCache.cache[key] = super end end