lib/jekyll/hooks.rb in jekyll-4.2.0 vs lib/jekyll/hooks.rb in jekyll-4.2.1

- old
+ new

@@ -1,107 +1,107 @@ -# frozen_string_literal: true - -module Jekyll - module Hooks - DEFAULT_PRIORITY = 20 - - # compatibility layer for octopress-hooks users - PRIORITY_MAP = { - :low => 10, - :normal => 20, - :high => 30, - }.freeze - - # initial empty hooks - @registry = { - :site => { - :after_init => [], - :after_reset => [], - :post_read => [], - :pre_render => [], - :post_render => [], - :post_write => [], - }, - :pages => { - :post_init => [], - :pre_render => [], - :post_convert => [], - :post_render => [], - :post_write => [], - }, - :posts => { - :post_init => [], - :pre_render => [], - :post_convert => [], - :post_render => [], - :post_write => [], - }, - :documents => { - :post_init => [], - :pre_render => [], - :post_convert => [], - :post_render => [], - :post_write => [], - }, - :clean => { - :on_obsolete => [], - }, - } - - # map of all hooks and their priorities - @hook_priority = {} - - NotAvailable = Class.new(RuntimeError) - Uncallable = Class.new(RuntimeError) - - # register hook(s) to be called later, public API - def self.register(owners, event, priority: DEFAULT_PRIORITY, &block) - Array(owners).each do |owner| - register_one(owner, event, priority_value(priority), &block) - end - end - - # Ensure the priority is a Fixnum - def self.priority_value(priority) - return priority if priority.is_a?(Integer) - - PRIORITY_MAP[priority] || DEFAULT_PRIORITY - end - - # register a single hook to be called later, internal API - def self.register_one(owner, event, priority, &block) - @registry[owner] ||= { - :post_init => [], - :pre_render => [], - :post_convert => [], - :post_render => [], - :post_write => [], - } - - unless @registry[owner][event] - raise NotAvailable, "Invalid hook. #{owner} supports only the " \ - "following hooks #{@registry[owner].keys.inspect}" - end - - raise Uncallable, "Hooks must respond to :call" unless block.respond_to? :call - - insert_hook owner, event, priority, &block - end - - def self.insert_hook(owner, event, priority, &block) - @hook_priority[block] = [-priority, @hook_priority.size] - @registry[owner][event] << block - end - - # interface for Jekyll core components to trigger hooks - def self.trigger(owner, event, *args) - # proceed only if there are hooks to call - hooks = @registry.dig(owner, event) - return if hooks.nil? || hooks.empty? - - # sort and call hooks according to priority and load order - hooks.sort_by { |h| @hook_priority[h] }.each do |hook| - hook.call(*args) - end - end - end -end +# frozen_string_literal: true + +module Jekyll + module Hooks + DEFAULT_PRIORITY = 20 + + # compatibility layer for octopress-hooks users + PRIORITY_MAP = { + :low => 10, + :normal => 20, + :high => 30, + }.freeze + + # initial empty hooks + @registry = { + :site => { + :after_init => [], + :after_reset => [], + :post_read => [], + :pre_render => [], + :post_render => [], + :post_write => [], + }, + :pages => { + :post_init => [], + :pre_render => [], + :post_convert => [], + :post_render => [], + :post_write => [], + }, + :posts => { + :post_init => [], + :pre_render => [], + :post_convert => [], + :post_render => [], + :post_write => [], + }, + :documents => { + :post_init => [], + :pre_render => [], + :post_convert => [], + :post_render => [], + :post_write => [], + }, + :clean => { + :on_obsolete => [], + }, + } + + # map of all hooks and their priorities + @hook_priority = {} + + NotAvailable = Class.new(RuntimeError) + Uncallable = Class.new(RuntimeError) + + # register hook(s) to be called later, public API + def self.register(owners, event, priority: DEFAULT_PRIORITY, &block) + Array(owners).each do |owner| + register_one(owner, event, priority_value(priority), &block) + end + end + + # Ensure the priority is a Fixnum + def self.priority_value(priority) + return priority if priority.is_a?(Integer) + + PRIORITY_MAP[priority] || DEFAULT_PRIORITY + end + + # register a single hook to be called later, internal API + def self.register_one(owner, event, priority, &block) + @registry[owner] ||= { + :post_init => [], + :pre_render => [], + :post_convert => [], + :post_render => [], + :post_write => [], + } + + unless @registry[owner][event] + raise NotAvailable, "Invalid hook. #{owner} supports only the " \ + "following hooks #{@registry[owner].keys.inspect}" + end + + raise Uncallable, "Hooks must respond to :call" unless block.respond_to? :call + + insert_hook owner, event, priority, &block + end + + def self.insert_hook(owner, event, priority, &block) + @hook_priority[block] = [-priority, @hook_priority.size] + @registry[owner][event] << block + end + + # interface for Jekyll core components to trigger hooks + def self.trigger(owner, event, *args) + # proceed only if there are hooks to call + hooks = @registry.dig(owner, event) + return if hooks.nil? || hooks.empty? + + # sort and call hooks according to priority and load order + hooks.sort_by { |h| @hook_priority[h] }.each do |hook| + hook.call(*args) + end + end + end +end