Module: Jekyll::Hooks

Defined in:
lib/jekyll/hooks.rb

Constant Summary collapse

DEFAULT_PRIORITY =
20
PRIORITY_MAP =

compatibility layer for octopress-hooks users

{
  :low => 10,
  :normal => 20,
  :high => 30
}.freeze
NotAvailable =
Class.new(RuntimeError)
Uncallable =
Class.new(RuntimeError)

Class Method Summary collapse

Class Method Details

.insert_hook(owner, event, priority, &block) ⇒ Object



81
82
83
84
# File 'lib/jekyll/hooks.rb', line 81

def self.insert_hook(owner, event, priority, &block)
  @hook_priority[block] = "#{priority}.#{@hook_priority.size}".to_f
  @registry[owner][event] << block
end

.priority_value(priority) ⇒ Object

Ensure the priority is a Fixnum



55
56
57
58
# File 'lib/jekyll/hooks.rb', line 55

def self.priority_value(priority)
  return priority if priority.is_a?(Fixnum)
  PRIORITY_MAP[priority] || DEFAULT_PRIORITY
end

.register(owners, event, priority: DEFAULT_PRIORITY, &block) ⇒ Object

register hook(s) to be called later, public API



48
49
50
51
52
# File 'lib/jekyll/hooks.rb', line 48

def self.register(owners, event, priority: DEFAULT_PRIORITY, &block)
  Array(owners).each do |owner|
    register_one(owner, event, priority_value(priority), &block)
  end
end

.register_one(owner, event, priority, &block) ⇒ Object

register a single hook to be called later, internal API



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/jekyll/hooks.rb', line 61

def self.register_one(owner, event, priority, &block)
  @registry[owner] ||={
    :post_init => [],
    :pre_render => [],
    :post_render => [],
    :post_write => []
  }

  unless @registry[owner][event]
    raise NotAvailable, "Invalid hook. #{owner} supports only the " \
      "following hooks #{@registry[owner].keys.inspect}"
  end

  unless block.respond_to? :call
    raise Uncallable, "Hooks must respond to :call"
  end

  insert_hook owner, event, priority, &block
end

.trigger(owner, event, *args) ⇒ Object

interface for Jekyll core components to trigger hooks



87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/jekyll/hooks.rb', line 87

def self.trigger(owner, event, *args)
  # proceed only if there are hooks to call
  return unless @registry[owner]
  return unless @registry[owner][event]

  # hooks to call for this owner and event
  hooks = @registry[owner][event]

  # 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