module Bridgetown::Hooks
Constants
- DEFAULT_PRIORITY
- HookRegistration
- NotAvailable
- PRIORITY_MAP
compatibility layer for octopress-hooks users
- Uncallable
Public Class Methods
clear_reloadable_hooks()
click to toggle source
# File lib/bridgetown-core/hooks.rb, line 95 def self.clear_reloadable_hooks Bridgetown.logger.debug("Clearing reloadable hooks") @registry.each_value do |hooks| hooks.delete_if(&:reloadable) end end
prioritized_hooks(hooks)
click to toggle source
# File lib/bridgetown-core/hooks.rb, line 89 def self.prioritized_hooks(hooks) # sort hooks according to priority and load order grouped_hooks = hooks.group_by(&:priority) grouped_hooks.keys.sort.reverse.map { |priority| grouped_hooks[priority] }.flatten end
priority_value(priority)
click to toggle source
Ensure the priority is a Fixnum
# File lib/bridgetown-core/hooks.rb, line 34 def self.priority_value(priority) return priority if priority.is_a?(Integer) PRIORITY_MAP[priority] || DEFAULT_PRIORITY end
register(owners, event, priority: DEFAULT_PRIORITY, reloadable: true, &block)
click to toggle source
register hook(s) to be called later
# File lib/bridgetown-core/hooks.rb, line 41 def self.register(owners, event, priority: DEFAULT_PRIORITY, reloadable: true, &block) Array(owners).each do |owner| register_one(owner, event, priority: priority, reloadable: reloadable, &block) end end
register_one(owner, event, priority: DEFAULT_PRIORITY, reloadable: true, &block)
click to toggle source
register a single hook to be called later
# File lib/bridgetown-core/hooks.rb, line 48 def self.register_one(owner, event, priority: DEFAULT_PRIORITY, reloadable: true, &block) @registry[owner] ||= [] raise Uncallable, "Hooks must respond to :call" unless block.respond_to? :call @registry[owner] << HookRegistration.new( owner: owner, event: event, priority: priority_value(priority), reloadable: reloadable, block: block ) if ENV["BRIDGETOWN_LOG_LEVEL"] == "debug" if Bridgetown.respond_to?(:logger) Bridgetown.logger.debug("Registering hook:", @registry[owner].last.to_s) else p "Registering hook:", @registry[owner].last.to_s end end block end
remove_hook(owner, _event, block)
click to toggle source
# File lib/bridgetown-core/hooks.rb, line 71 def self.remove_hook(owner, _event, block) @registry[owner].delete_if { |item| item.block == block } end
trigger(owner, event, *args)
click to toggle source
# File lib/bridgetown-core/hooks.rb, line 75 def self.trigger(owner, event, *args) # proceed only if there are hooks to call hooks = @registry[owner]&.select { |item| item.event == event } return if hooks.nil? || hooks.empty? prioritized_hooks(hooks).each do |hook| if ENV["BRIDGETOWN_LOG_LEVEL"] == "debug" hook_info = args[0]&.respond_to?(:url) ? args[0].relative_path : hook.block Bridgetown.logger.debug("Triggering hook:", "#{owner}:#{event} for #{hook_info}") end hook.block.call(*args) end end