From 67aa6f35317fa88c78b5c12d783d809495803150 Mon Sep 17 00:00:00 2001 From: Dan Allen Date: Sun, 3 Jul 2016 18:34:12 -0600 Subject: [PATCH] only register hooks once - only register callbacks for pre_render and post_render hooks once - register callbacks as static methods so they work on any site instance - add test to ensure callbacks are only registered once --- lib/jekyll-asciidoc/converter.rb | 12 ++++++++++-- lib/jekyll-asciidoc/integrator.rb | 10 +++++----- spec/jekyll-asciidoc_spec.rb | 19 +++++++++++++++++++ 3 files changed, 34 insertions(+), 7 deletions(-) diff --git a/lib/jekyll-asciidoc/converter.rb b/lib/jekyll-asciidoc/converter.rb index 8dc9dd0..1490893 100644 --- a/lib/jekyll-asciidoc/converter.rb +++ b/lib/jekyll-asciidoc/converter.rb @@ -137,12 +137,20 @@ def output_ext ext '.html' end + def self.before_render document, payload + (Utils.get_converter document.site).before_render document, payload if Document === document + end + + def self.after_render document + (Utils.get_converter document.site).after_render document if Document === document + end + def before_render document, payload - record_path_info document if Document === document + record_path_info document end def after_render document - clear_path_info if Document === document + clear_path_info end def record_path_info document, opts = {} diff --git a/lib/jekyll-asciidoc/integrator.rb b/lib/jekyll-asciidoc/integrator.rb index 548b554..83c59e3 100644 --- a/lib/jekyll-asciidoc/integrator.rb +++ b/lib/jekyll-asciidoc/integrator.rb @@ -15,11 +15,11 @@ def generate site @converter = converter = (Utils.get_converter site).setup if defined? ::Jekyll::Hooks - before_render_callback = converter.method :before_render - after_render_callback = converter.method :after_render - [:pages, :documents].each do |collection_name| - ::Jekyll::Hooks.register collection_name, :pre_render, &before_render_callback - ::Jekyll::Hooks.register collection_name, :post_render, &after_render_callback + # NOTE the hooks registry is global, so guard against registering hooks again on regenerate + unless Configured === (registry = (hooks = ::Jekyll::Hooks).instance_variable_get :@registry) + hooks.register [:pages, :documents], :pre_render, &(Converter.method :before_render) + hooks.register [:pages, :documents], :post_render, &(Converter.method :after_render) + registry.extend Configured end end diff --git a/spec/jekyll-asciidoc_spec.rb b/spec/jekyll-asciidoc_spec.rb index 6ed8acf..8052933 100644 --- a/spec/jekyll-asciidoc_spec.rb +++ b/spec/jekyll-asciidoc_spec.rb @@ -445,6 +445,25 @@ expect(contents).to match(%(docname=#{::File.basename src_file, '.adoc'})) end end + + it 'should only register pre and post render hooks once', focus: true do + hooks_registry = ::Jekyll::Hooks.instance_variable_get :@registry + after_site_reset = hooks_registry[:site][:after_reset].pop + begin + expect(hooks_registry[:pages][:pre_render].size).to eql(1) + expect(hooks_registry[:pages][:post_render].size).to eql(1) + expect(hooks_registry[:documents][:pre_render].size).to eql(1) + expect(hooks_registry[:documents][:post_render].size).to eql(1) + site.process + expect(hooks_registry).to be_a(::Jekyll::AsciiDoc::Configured) + expect(hooks_registry[:pages][:pre_render].size).to eql(1) + expect(hooks_registry[:pages][:post_render].size).to eql(1) + expect(hooks_registry[:documents][:pre_render].size).to eql(1) + expect(hooks_registry[:documents][:post_render].size).to eql(1) + ensure + hooks_registry[:site][:after_reset] << after_site_reset + end + end if ::Jekyll::MIN_VERSION_3 end describe 'safe mode' do