#3870 trigger hooks by owner symbol

This commit is contained in:
Stephen Crosby 2015-07-27 14:24:37 -07:00
parent 3e29aaf785
commit 7c4f319442
7 changed files with 26 additions and 27 deletions

View File

@ -144,6 +144,15 @@ module Jekyll
end end
end end
# returns the owner symbol for hook triggering
def hook_owner
if is_a?(Post)
:post
elsif is_a?(Page)
:page
end
end
# Determine whether the document is an asset file. # Determine whether the document is an asset file.
# Asset files include CoffeeScript files and Sass/SCSS files. # Asset files include CoffeeScript files and Sass/SCSS files.
# #
@ -236,7 +245,7 @@ module Jekyll
# #
# Returns nothing. # Returns nothing.
def do_layout(payload, layouts) def do_layout(payload, layouts)
Jekyll::Hooks.trigger self, :pre_render, payload Jekyll::Hooks.trigger hook_owner, :pre_render, self, payload
info = { :filters => [Jekyll::Filters], :registers => { :site => site, :page => payload['page'] } } info = { :filters => [Jekyll::Filters], :registers => { :site => site, :page => payload['page'] } }
# render and transform content (this becomes the final content of the object) # render and transform content (this becomes the final content of the object)
@ -250,7 +259,7 @@ module Jekyll
self.output = content self.output = content
render_all_layouts(layouts, payload, info) if place_in_layout? render_all_layouts(layouts, payload, info) if place_in_layout?
Jekyll::Hooks.trigger self, :post_render Jekyll::Hooks.trigger hook_owner, :post_render, self
end end
# Write the generated page file to the destination directory. # Write the generated page file to the destination directory.
@ -264,7 +273,7 @@ module Jekyll
File.open(path, 'wb') do |f| File.open(path, 'wb') do |f|
f.write(output) f.write(output)
end end
Jekyll::Hooks.trigger self, :post_write Jekyll::Hooks.trigger hook_owner, :post_write, self
end end
# Accessor for data properties by Liquid. # Accessor for data properties by Liquid.

View File

@ -190,7 +190,7 @@ module Jekyll
f.write(output) f.write(output)
end end
Jekyll::Hooks.trigger self, :post_write Jekyll::Hooks.trigger :document, :post_write, self
end end
# Returns merged option hash for File.read of self.site (if exists) # Returns merged option hash for File.read of self.site (if exists)

View File

@ -1,13 +1,5 @@
module Jekyll module Jekyll
module Hooks module Hooks
# Helps look up hooks from the registry by owner's class
OWNER_MAP = {
Jekyll::Site => :site,
Jekyll::Page => :page,
Jekyll::Post => :post,
Jekyll::Document => :document,
}.freeze
DEFAULT_PRIORITY = 20 DEFAULT_PRIORITY = 20
# compatibility layer for octopress-hooks users # compatibility layer for octopress-hooks users
@ -88,19 +80,17 @@ module Jekyll
end end
# interface for Jekyll core components to trigger hooks # interface for Jekyll core components to trigger hooks
def self.trigger(instance, event, *args) def self.trigger(owner, event, *args)
owner_symbol = OWNER_MAP[instance.class]
# proceed only if there are hooks to call # proceed only if there are hooks to call
return unless @registry[owner_symbol] return unless @registry[owner]
return unless @registry[owner_symbol][event] return unless @registry[owner][event]
# hooks to call for this owner and event # hooks to call for this owner and event
hooks = @registry[owner_symbol][event] hooks = @registry[owner][event]
# sort and call hooks according to priority and load order # sort and call hooks according to priority and load order
hooks.sort_by { |h| @hook_priority[h] }.each do |hook| hooks.sort_by { |h| @hook_priority[h] }.each do |hook|
hook.call(instance, *args) hook.call(*args)
end end
end end
end end

View File

@ -36,7 +36,7 @@ module Jekyll
site.frontmatter_defaults.find(File.join(dir, name), type, key) site.frontmatter_defaults.find(File.join(dir, name), type, key)
end end
Jekyll::Hooks.trigger self, :post_init Jekyll::Hooks.trigger :page, :post_init, self
end end
# The generated directory into which the page will be placed # The generated directory into which the page will be placed

View File

@ -69,7 +69,7 @@ module Jekyll
populate_categories populate_categories
populate_tags populate_tags
Jekyll::Hooks.trigger self, :post_init Jekyll::Hooks.trigger :post, :post_init, self
end end
def published? def published?

View File

@ -35,7 +35,7 @@ module Jekyll
"page" => document.to_liquid "page" => document.to_liquid
}, site_payload || site.site_payload) }, site_payload || site.site_payload)
Jekyll::Hooks.trigger document, :pre_render, payload Jekyll::Hooks.trigger :document, :pre_render, document, payload
info = { info = {
filters: [Jekyll::Filters], filters: [Jekyll::Filters],

View File

@ -86,7 +86,7 @@ module Jekyll
raise ArgumentError, "limit_posts must be a non-negative number" raise ArgumentError, "limit_posts must be a non-negative number"
end end
Jekyll::Hooks.trigger self, :after_reset Jekyll::Hooks.trigger :site, :after_reset, self
end end
# Load necessary libraries, plugins, converters, and generators. # Load necessary libraries, plugins, converters, and generators.
@ -144,7 +144,7 @@ module Jekyll
def read def read
reader.read reader.read
limit_posts! limit_posts!
Jekyll::Hooks.trigger self, :post_read Jekyll::Hooks.trigger :site, :post_read, self
end end
# Run each of the Generators. # Run each of the Generators.
@ -164,13 +164,13 @@ module Jekyll
payload = site_payload payload = site_payload
Jekyll::Hooks.trigger self, :pre_render, payload Jekyll::Hooks.trigger :site, :pre_render, self, payload
collections.each do |label, collection| collections.each do |label, collection|
collection.docs.each do |document| collection.docs.each do |document|
if regenerator.regenerate?(document) if regenerator.regenerate?(document)
document.output = Jekyll::Renderer.new(self, document, payload).run document.output = Jekyll::Renderer.new(self, document, payload).run
Jekyll::Hooks.trigger document, :post_render Jekyll::Hooks.trigger :document, :post_render, document
end end
end end
end end
@ -199,7 +199,7 @@ module Jekyll
item.write(dest) if regenerator.regenerate?(item) item.write(dest) if regenerator.regenerate?(item)
} }
regenerator.write_metadata regenerator.write_metadata
Jekyll::Hooks.trigger self, :post_write Jekyll::Hooks.trigger :site, :post_write, self
end end
# Construct a Hash of Posts indexed by the specified Post attribute. # Construct a Hash of Posts indexed by the specified Post attribute.