Merge pull request #2090 from coreyward/selfish
This commit is contained in:
commit
788a3f7c8d
|
@ -6,8 +6,8 @@ module Jekyll
|
||||||
|
|
||||||
Jekyll.logger.log_level = Jekyll::Stevenson::ERROR if options['quiet']
|
Jekyll.logger.log_level = Jekyll::Stevenson::ERROR if options['quiet']
|
||||||
|
|
||||||
self.build(site, options)
|
build(site, options)
|
||||||
self.watch(site, options) if options['watch']
|
watch(site, options) if options['watch']
|
||||||
end
|
end
|
||||||
|
|
||||||
# Private: Build the site from source into destination.
|
# Private: Build the site from source into destination.
|
||||||
|
@ -22,7 +22,7 @@ module Jekyll
|
||||||
Jekyll.logger.info "Source:", source
|
Jekyll.logger.info "Source:", source
|
||||||
Jekyll.logger.info "Destination:", destination
|
Jekyll.logger.info "Destination:", destination
|
||||||
print Jekyll.logger.formatted_topic "Generating..."
|
print Jekyll.logger.formatted_topic "Generating..."
|
||||||
self.process_site(site)
|
process_site(site)
|
||||||
puts "done."
|
puts "done."
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -52,7 +52,7 @@ module Jekyll
|
||||||
t = Time.now.strftime("%Y-%m-%d %H:%M:%S")
|
t = Time.now.strftime("%Y-%m-%d %H:%M:%S")
|
||||||
n = modified.length + added.length + removed.length
|
n = modified.length + added.length + removed.length
|
||||||
print Jekyll.logger.formatted_topic("Regenerating:") + "#{n} files at #{t} "
|
print Jekyll.logger.formatted_topic("Regenerating:") + "#{n} files at #{t} "
|
||||||
self.process_site(site)
|
process_site(site)
|
||||||
puts "...done."
|
puts "...done."
|
||||||
end
|
end
|
||||||
listener.start
|
listener.start
|
||||||
|
|
|
@ -18,18 +18,18 @@ module Jekyll
|
||||||
module Convertible
|
module Convertible
|
||||||
# Returns the contents as a String.
|
# Returns the contents as a String.
|
||||||
def to_s
|
def to_s
|
||||||
self.content || ''
|
content || ''
|
||||||
end
|
end
|
||||||
|
|
||||||
# Whether the file is published or not, as indicated in YAML front-matter
|
# Whether the file is published or not, as indicated in YAML front-matter
|
||||||
def published?
|
def published?
|
||||||
!(self.data.has_key?('published') && self.data['published'] == false)
|
!(data.has_key?('published') && data['published'] == false)
|
||||||
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)
|
||||||
# and a given param
|
# and a given param
|
||||||
def merged_file_read_opts(opts)
|
def merged_file_read_opts(opts)
|
||||||
(self.site ? self.site.file_read_opts : {}).merge(opts)
|
(site ? site.file_read_opts : {}).merge(opts)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Read the YAML frontmatter.
|
# Read the YAML frontmatter.
|
||||||
|
@ -43,7 +43,7 @@ module Jekyll
|
||||||
begin
|
begin
|
||||||
self.content = File.read(File.join(base, name),
|
self.content = File.read(File.join(base, name),
|
||||||
merged_file_read_opts(opts))
|
merged_file_read_opts(opts))
|
||||||
if self.content =~ /\A(---\s*\n.*?\n?)^(---\s*$\n?)/m
|
if content =~ /\A(---\s*\n.*?\n?)^(---\s*$\n?)/m
|
||||||
self.content = $POSTMATCH
|
self.content = $POSTMATCH
|
||||||
self.data = SafeYAML.load($1)
|
self.data = SafeYAML.load($1)
|
||||||
end
|
end
|
||||||
|
@ -60,10 +60,10 @@ module Jekyll
|
||||||
#
|
#
|
||||||
# Returns nothing.
|
# Returns nothing.
|
||||||
def transform
|
def transform
|
||||||
self.content = converter.convert(self.content)
|
self.content = converter.convert(content)
|
||||||
rescue => e
|
rescue => e
|
||||||
Jekyll.logger.error "Conversion error:", "There was an error converting" +
|
Jekyll.logger.error "Conversion error:", "There was an error converting" +
|
||||||
" '#{self.path}'."
|
" '#{path}'."
|
||||||
raise e
|
raise e
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -72,7 +72,7 @@ module Jekyll
|
||||||
# Returns the String extension for the output file.
|
# Returns the String extension for the output file.
|
||||||
# e.g. ".html" for an HTML output file.
|
# e.g. ".html" for an HTML output file.
|
||||||
def output_ext
|
def output_ext
|
||||||
converter.output_ext(self.ext)
|
converter.output_ext(ext)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Determine which converter to use based on this convertible's
|
# Determine which converter to use based on this convertible's
|
||||||
|
@ -80,7 +80,7 @@ module Jekyll
|
||||||
#
|
#
|
||||||
# Returns the Converter instance.
|
# Returns the Converter instance.
|
||||||
def converter
|
def converter
|
||||||
@converter ||= self.site.converters.find { |c| c.matches(self.ext) }
|
@converter ||= site.converters.find { |c| c.matches(ext) }
|
||||||
end
|
end
|
||||||
|
|
||||||
# Render Liquid in the content
|
# Render Liquid in the content
|
||||||
|
@ -119,16 +119,16 @@ module Jekyll
|
||||||
# Returns nothing
|
# Returns nothing
|
||||||
def render_all_layouts(layouts, payload, info)
|
def render_all_layouts(layouts, payload, info)
|
||||||
# recursively render layouts
|
# recursively render layouts
|
||||||
layout = layouts[self.data["layout"]]
|
layout = layouts[data["layout"]]
|
||||||
used = Set.new([layout])
|
used = Set.new([layout])
|
||||||
|
|
||||||
while layout
|
while layout
|
||||||
payload = payload.deep_merge({"content" => self.output, "page" => layout.data})
|
payload = payload.deep_merge({"content" => output, "page" => layout.data})
|
||||||
|
|
||||||
self.output = self.render_liquid(layout.content,
|
self.output = render_liquid(layout.content,
|
||||||
payload,
|
payload,
|
||||||
info,
|
info,
|
||||||
File.join(self.site.config['layouts'], layout.name))
|
File.join(site.config['layouts'], layout.name))
|
||||||
|
|
||||||
if layout = layouts[layout.data["layout"]]
|
if layout = layouts[layout.data["layout"]]
|
||||||
if used.include?(layout)
|
if used.include?(layout)
|
||||||
|
@ -147,21 +147,19 @@ module Jekyll
|
||||||
#
|
#
|
||||||
# Returns nothing.
|
# Returns nothing.
|
||||||
def do_layout(payload, layouts)
|
def do_layout(payload, layouts)
|
||||||
info = { :filters => [Jekyll::Filters], :registers => { :site => self.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)
|
||||||
payload["highlighter_prefix"] = converter.highlighter_prefix
|
payload["highlighter_prefix"] = converter.highlighter_prefix
|
||||||
payload["highlighter_suffix"] = converter.highlighter_suffix
|
payload["highlighter_suffix"] = converter.highlighter_suffix
|
||||||
|
|
||||||
self.content = self.render_liquid(self.content,
|
self.content = render_liquid(content, payload, info)
|
||||||
payload,
|
transform
|
||||||
info)
|
|
||||||
self.transform
|
|
||||||
|
|
||||||
# output keeps track of what will finally be written
|
# output keeps track of what will finally be written
|
||||||
self.output = self.content
|
self.output = content
|
||||||
|
|
||||||
self.render_all_layouts(layouts, payload, info)
|
render_all_layouts(layouts, payload, info)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Write the generated page file to the destination directory.
|
# Write the generated page file to the destination directory.
|
||||||
|
@ -173,7 +171,7 @@ module Jekyll
|
||||||
path = destination(dest)
|
path = destination(dest)
|
||||||
FileUtils.mkdir_p(File.dirname(path))
|
FileUtils.mkdir_p(File.dirname(path))
|
||||||
File.open(path, 'wb') do |f|
|
File.open(path, 'wb') do |f|
|
||||||
f.write(self.output)
|
f.write(output)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@ module Jekyll
|
||||||
|
|
||||||
attr_accessor :post
|
attr_accessor :post
|
||||||
attr_accessor :content, :output, :ext
|
attr_accessor :content, :output, :ext
|
||||||
|
|
||||||
def_delegator :@post, :site, :site
|
def_delegator :@post, :site, :site
|
||||||
def_delegator :@post, :name, :name
|
def_delegator :@post, :name, :name
|
||||||
def_delegator :@post, :ext, :ext
|
def_delegator :@post, :ext, :ext
|
||||||
|
@ -39,7 +39,7 @@ module Jekyll
|
||||||
end
|
end
|
||||||
|
|
||||||
# 'Path' of the excerpt.
|
# 'Path' of the excerpt.
|
||||||
#
|
#
|
||||||
# Returns the path for the post this excerpt belongs to with #excerpt appended
|
# Returns the path for the post this excerpt belongs to with #excerpt appended
|
||||||
def path
|
def path
|
||||||
File.join(post.path, "#excerpt")
|
File.join(post.path, "#excerpt")
|
||||||
|
@ -47,9 +47,9 @@ module Jekyll
|
||||||
|
|
||||||
# Check if excerpt includes a string
|
# Check if excerpt includes a string
|
||||||
#
|
#
|
||||||
# Returns true if the string passed in
|
# Returns true if the string passed in
|
||||||
def include?(something)
|
def include?(something)
|
||||||
(self.output && self.output.include?(something)) || self.content.include?(something)
|
(output && output.include?(something)) || content.include?(something)
|
||||||
end
|
end
|
||||||
|
|
||||||
# The UID for this post (useful in feeds).
|
# The UID for this post (useful in feeds).
|
||||||
|
@ -61,7 +61,7 @@ module Jekyll
|
||||||
end
|
end
|
||||||
|
|
||||||
def to_s
|
def to_s
|
||||||
self.output || self.content
|
output || content
|
||||||
end
|
end
|
||||||
|
|
||||||
# Returns the shorthand String identifier of this Post.
|
# Returns the shorthand String identifier of this Post.
|
||||||
|
|
|
@ -29,8 +29,8 @@ module Jekyll
|
||||||
|
|
||||||
self.data = {}
|
self.data = {}
|
||||||
|
|
||||||
self.process(name)
|
process(name)
|
||||||
self.read_yaml(base, name)
|
read_yaml(base, name)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Extract information from the layout filename.
|
# Extract information from the layout filename.
|
||||||
|
|
|
@ -28,8 +28,8 @@ module Jekyll
|
||||||
@dir = dir
|
@dir = dir
|
||||||
@name = name
|
@name = name
|
||||||
|
|
||||||
self.process(name)
|
process(name)
|
||||||
self.read_yaml(File.join(base, dir), name)
|
read_yaml(File.join(base, dir), name)
|
||||||
end
|
end
|
||||||
|
|
||||||
# The generated directory into which the page will be placed
|
# The generated directory into which the page will be placed
|
||||||
|
@ -46,11 +46,11 @@ module Jekyll
|
||||||
#
|
#
|
||||||
# Returns the String permalink or nil if none has been set.
|
# Returns the String permalink or nil if none has been set.
|
||||||
def permalink
|
def permalink
|
||||||
return nil if self.data.nil? || self.data['permalink'].nil?
|
return nil if data.nil? || data['permalink'].nil?
|
||||||
if site.config['relative_permalinks']
|
if site.config['relative_permalinks']
|
||||||
File.join(@dir, self.data['permalink'])
|
File.join(@dir, data['permalink'])
|
||||||
else
|
else
|
||||||
self.data['permalink']
|
data['permalink']
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -58,7 +58,7 @@ module Jekyll
|
||||||
#
|
#
|
||||||
# Returns the template String.
|
# Returns the template String.
|
||||||
def template
|
def template
|
||||||
if self.site.permalink_style == :pretty
|
if site.permalink_style == :pretty
|
||||||
if index? && html?
|
if index? && html?
|
||||||
"/:path/"
|
"/:path/"
|
||||||
elsif html?
|
elsif html?
|
||||||
|
@ -87,8 +87,8 @@ module Jekyll
|
||||||
def url_placeholders
|
def url_placeholders
|
||||||
{
|
{
|
||||||
:path => @dir,
|
:path => @dir,
|
||||||
:basename => self.basename,
|
:basename => basename,
|
||||||
:output_ext => self.output_ext
|
:output_ext => output_ext
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -99,7 +99,7 @@ module Jekyll
|
||||||
# Returns nothing.
|
# Returns nothing.
|
||||||
def process(name)
|
def process(name)
|
||||||
self.ext = File.extname(name)
|
self.ext = File.extname(name)
|
||||||
self.basename = name[0 .. -self.ext.length-1]
|
self.basename = name[0 .. -ext.length - 1]
|
||||||
end
|
end
|
||||||
|
|
||||||
# Add any necessary layouts to this post
|
# Add any necessary layouts to this post
|
||||||
|
@ -110,7 +110,7 @@ module Jekyll
|
||||||
# Returns nothing.
|
# Returns nothing.
|
||||||
def render(layouts, site_payload)
|
def render(layouts, site_payload)
|
||||||
payload = {
|
payload = {
|
||||||
"page" => self.to_liquid,
|
"page" => to_liquid,
|
||||||
'paginator' => pager.to_liquid
|
'paginator' => pager.to_liquid
|
||||||
}.deep_merge(site_payload)
|
}.deep_merge(site_payload)
|
||||||
|
|
||||||
|
@ -121,7 +121,7 @@ module Jekyll
|
||||||
#
|
#
|
||||||
# Returns the path to the source file
|
# Returns the path to the source file
|
||||||
def path
|
def path
|
||||||
self.data.fetch('path', self.relative_path.sub(/\A\//, ''))
|
data.fetch('path', relative_path.sub(/\A\//, ''))
|
||||||
end
|
end
|
||||||
|
|
||||||
# The path to the page source file, relative to the site source
|
# The path to the page source file, relative to the site source
|
||||||
|
@ -135,14 +135,14 @@ module Jekyll
|
||||||
#
|
#
|
||||||
# Returns the destination file path String.
|
# Returns the destination file path String.
|
||||||
def destination(dest)
|
def destination(dest)
|
||||||
path = File.join(dest, File.expand_path(self.url, "/"))
|
path = File.join(dest, File.expand_path(url, "/"))
|
||||||
path = File.join(path, "index.html") if self.url =~ /\/$/
|
path = File.join(path, "index.html") if url =~ /\/$/
|
||||||
path
|
path
|
||||||
end
|
end
|
||||||
|
|
||||||
# Returns the object as a debug String.
|
# Returns the object as a debug String.
|
||||||
def inspect
|
def inspect
|
||||||
"#<Jekyll:Page @name=#{self.name.inspect}>"
|
"#<Jekyll:Page @name=#{name.inspect}>"
|
||||||
end
|
end
|
||||||
|
|
||||||
# Returns the Boolean of whether this Page is HTML or not.
|
# Returns the Boolean of whether this Page is HTML or not.
|
||||||
|
|
|
@ -49,30 +49,30 @@ module Jekyll
|
||||||
def initialize(site, source, dir, name)
|
def initialize(site, source, dir, name)
|
||||||
@site = site
|
@site = site
|
||||||
@dir = dir
|
@dir = dir
|
||||||
@base = self.containing_dir(source, dir)
|
@base = containing_dir(source, dir)
|
||||||
@name = name
|
@name = name
|
||||||
|
|
||||||
self.categories = dir.downcase.split('/').reject { |x| x.empty? }
|
self.categories = dir.downcase.split('/').reject { |x| x.empty? }
|
||||||
self.process(name)
|
process(name)
|
||||||
self.read_yaml(@base, name)
|
read_yaml(@base, name)
|
||||||
|
|
||||||
if self.data.has_key?('date')
|
if data.has_key?('date')
|
||||||
self.date = Time.parse(self.data["date"].to_s)
|
self.date = Time.parse(data["date"].to_s)
|
||||||
end
|
end
|
||||||
|
|
||||||
self.populate_categories
|
populate_categories
|
||||||
self.populate_tags
|
populate_tags
|
||||||
end
|
end
|
||||||
|
|
||||||
def populate_categories
|
def populate_categories
|
||||||
if self.categories.empty?
|
if categories.empty?
|
||||||
self.categories = self.data.pluralized_array('category', 'categories').map {|c| c.to_s.downcase}
|
self.categories = data.pluralized_array('category', 'categories').map {|c| c.to_s.downcase}
|
||||||
end
|
end
|
||||||
self.categories.flatten!
|
categories.flatten!
|
||||||
end
|
end
|
||||||
|
|
||||||
def populate_tags
|
def populate_tags
|
||||||
self.tags = self.data.pluralized_array("tag", "tags").flatten
|
self.tags = data.pluralized_array("tag", "tags").flatten
|
||||||
end
|
end
|
||||||
|
|
||||||
# Get the full path to the directory containing the post files
|
# Get the full path to the directory containing the post files
|
||||||
|
@ -88,7 +88,7 @@ module Jekyll
|
||||||
# Returns nothing.
|
# Returns nothing.
|
||||||
def read_yaml(base, name)
|
def read_yaml(base, name)
|
||||||
super(base, name)
|
super(base, name)
|
||||||
self.extracted_excerpt = self.extract_excerpt
|
self.extracted_excerpt = extract_excerpt
|
||||||
end
|
end
|
||||||
|
|
||||||
# The post excerpt. This is either a custom excerpt
|
# The post excerpt. This is either a custom excerpt
|
||||||
|
@ -96,19 +96,19 @@ module Jekyll
|
||||||
#
|
#
|
||||||
# Returns excerpt string.
|
# Returns excerpt string.
|
||||||
def excerpt
|
def excerpt
|
||||||
self.data.fetch('excerpt', self.extracted_excerpt.to_s)
|
data.fetch('excerpt', extracted_excerpt.to_s)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: the Post title, from the YAML Front-Matter or from the slug
|
# Public: the Post title, from the YAML Front-Matter or from the slug
|
||||||
#
|
#
|
||||||
# Returns the post title
|
# Returns the post title
|
||||||
def title
|
def title
|
||||||
self.data.fetch("title", self.titleized_slug)
|
data.fetch("title", titleized_slug)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Turns the post slug into a suitable title
|
# Turns the post slug into a suitable title
|
||||||
def titleized_slug
|
def titleized_slug
|
||||||
self.slug.split('-').select {|w| w.capitalize! || w }.join(' ')
|
slug.split('-').select {|w| w.capitalize! || w }.join(' ')
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: the path to the post relative to the site source,
|
# Public: the path to the post relative to the site source,
|
||||||
|
@ -118,7 +118,7 @@ module Jekyll
|
||||||
#
|
#
|
||||||
# Returns the path to the file relative to the site source
|
# Returns the path to the file relative to the site source
|
||||||
def path
|
def path
|
||||||
self.data.fetch('path', self.relative_path.sub(/\A\//, ''))
|
data.fetch('path', relative_path.sub(/\A\//, ''))
|
||||||
end
|
end
|
||||||
|
|
||||||
# The path to the post source file, relative to the site source
|
# The path to the post source file, relative to the site source
|
||||||
|
@ -172,11 +172,11 @@ module Jekyll
|
||||||
#
|
#
|
||||||
# Returns the String permalink.
|
# Returns the String permalink.
|
||||||
def permalink
|
def permalink
|
||||||
self.data && self.data['permalink']
|
data && data['permalink']
|
||||||
end
|
end
|
||||||
|
|
||||||
def template
|
def template
|
||||||
case self.site.permalink_style
|
case site.permalink_style
|
||||||
when :pretty
|
when :pretty
|
||||||
"/:categories/:year/:month/:day/:title/"
|
"/:categories/:year/:month/:day/:title/"
|
||||||
when :none
|
when :none
|
||||||
|
@ -186,7 +186,7 @@ module Jekyll
|
||||||
when :ordinal
|
when :ordinal
|
||||||
"/:categories/:year/:y_day/:title.html"
|
"/:categories/:year/:y_day/:title.html"
|
||||||
else
|
else
|
||||||
self.site.permalink_style.to_s
|
site.permalink_style.to_s
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -214,7 +214,7 @@ module Jekyll
|
||||||
:categories => (categories || []).map { |c| URI.escape(c.to_s) }.join('/'),
|
:categories => (categories || []).map { |c| URI.escape(c.to_s) }.join('/'),
|
||||||
:short_month => date.strftime("%b"),
|
:short_month => date.strftime("%b"),
|
||||||
:y_day => date.strftime("%j"),
|
:y_day => date.strftime("%j"),
|
||||||
:output_ext => self.output_ext
|
:output_ext => output_ext
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -223,7 +223,7 @@ module Jekyll
|
||||||
#
|
#
|
||||||
# Returns the String UID.
|
# Returns the String UID.
|
||||||
def id
|
def id
|
||||||
File.join(self.dir, self.slug)
|
File.join(dir, slug)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Calculate related posts.
|
# Calculate related posts.
|
||||||
|
@ -243,14 +243,14 @@ module Jekyll
|
||||||
# construct payload
|
# construct payload
|
||||||
payload = {
|
payload = {
|
||||||
"site" => { "related_posts" => related_posts(site_payload["site"]["posts"]) },
|
"site" => { "related_posts" => related_posts(site_payload["site"]["posts"]) },
|
||||||
"page" => self.to_liquid(EXCERPT_ATTRIBUTES_FOR_LIQUID)
|
"page" => to_liquid(EXCERPT_ATTRIBUTES_FOR_LIQUID)
|
||||||
}.deep_merge(site_payload)
|
}.deep_merge(site_payload)
|
||||||
|
|
||||||
if generate_excerpt?
|
if generate_excerpt?
|
||||||
self.extracted_excerpt.do_layout(payload, {})
|
extracted_excerpt.do_layout(payload, {})
|
||||||
end
|
end
|
||||||
|
|
||||||
do_layout(payload.merge({"page" => self.to_liquid}), layouts)
|
do_layout(payload.merge({"page" => to_liquid}), layouts)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Obtain destination path.
|
# Obtain destination path.
|
||||||
|
@ -260,29 +260,29 @@ module Jekyll
|
||||||
# Returns destination file path String.
|
# Returns destination file path String.
|
||||||
def destination(dest)
|
def destination(dest)
|
||||||
# The url needs to be unescaped in order to preserve the correct filename
|
# The url needs to be unescaped in order to preserve the correct filename
|
||||||
path = File.join(dest, File.expand_path(CGI.unescape(self.url), "/"))
|
path = File.join(dest, File.expand_path(CGI.unescape(url), "/"))
|
||||||
path = File.join(path, "index.html") if path[/\.html$/].nil?
|
path = File.join(path, "index.html") if path[/\.html$/].nil?
|
||||||
path
|
path
|
||||||
end
|
end
|
||||||
|
|
||||||
# Returns the shorthand String identifier of this Post.
|
# Returns the shorthand String identifier of this Post.
|
||||||
def inspect
|
def inspect
|
||||||
"<Post: #{self.id}>"
|
"<Post: #{id}>"
|
||||||
end
|
end
|
||||||
|
|
||||||
def next
|
def next
|
||||||
pos = self.site.posts.index {|post| post.equal?(self) }
|
pos = site.posts.index {|post| post.equal?(self) }
|
||||||
if pos && pos < self.site.posts.length-1
|
if pos && pos < site.posts.length - 1
|
||||||
self.site.posts[pos+1]
|
site.posts[pos + 1]
|
||||||
else
|
else
|
||||||
nil
|
nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def previous
|
def previous
|
||||||
pos = self.site.posts.index {|post| post.equal?(self) }
|
pos = site.posts.index {|post| post.equal?(self) }
|
||||||
if pos && pos > 0
|
if pos && pos > 0
|
||||||
self.site.posts[pos-1]
|
site.posts[pos - 1]
|
||||||
else
|
else
|
||||||
nil
|
nil
|
||||||
end
|
end
|
||||||
|
|
|
@ -14,9 +14,9 @@ module Jekyll
|
||||||
end
|
end
|
||||||
|
|
||||||
def build
|
def build
|
||||||
return [] unless self.site.posts.size > 1
|
return [] unless site.posts.size > 1
|
||||||
|
|
||||||
if self.site.lsi
|
if site.lsi
|
||||||
build_index
|
build_index
|
||||||
lsi_related_posts
|
lsi_related_posts
|
||||||
else
|
else
|
||||||
|
@ -30,7 +30,7 @@ module Jekyll
|
||||||
lsi = Classifier::LSI.new(:auto_rebuild => false)
|
lsi = Classifier::LSI.new(:auto_rebuild => false)
|
||||||
display("Populating LSI...")
|
display("Populating LSI...")
|
||||||
|
|
||||||
self.site.posts.each do |x|
|
site.posts.each do |x|
|
||||||
lsi.add_item(x)
|
lsi.add_item(x)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -42,11 +42,11 @@ module Jekyll
|
||||||
end
|
end
|
||||||
|
|
||||||
def lsi_related_posts
|
def lsi_related_posts
|
||||||
self.class.lsi.find_related(post.content, 11) - [self.post]
|
self.class.lsi.find_related(post.content, 11) - [post]
|
||||||
end
|
end
|
||||||
|
|
||||||
def most_recent_posts
|
def most_recent_posts
|
||||||
recent_posts = self.site.posts.reverse - [self.post]
|
recent_posts = site.posts.reverse - [post]
|
||||||
recent_posts.first(10)
|
recent_posts.first(10)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -11,54 +11,50 @@ module Jekyll
|
||||||
#
|
#
|
||||||
# config - A Hash containing site configuration details.
|
# config - A Hash containing site configuration details.
|
||||||
def initialize(config)
|
def initialize(config)
|
||||||
self.config = config.clone
|
self.config = config.clone
|
||||||
|
|
||||||
%w[safe lsi highlighter baseurl exclude include future show_drafts limit_posts keep_files gems].each do |opt|
|
%w[safe lsi highlighter baseurl exclude include future show_drafts limit_posts keep_files gems].each do |opt|
|
||||||
self.send("#{opt}=", config[opt])
|
self.send("#{opt}=", config[opt])
|
||||||
end
|
end
|
||||||
|
|
||||||
self.source = File.expand_path(config['source'])
|
self.source = File.expand_path(config['source'])
|
||||||
self.dest = File.expand_path(config['destination'])
|
self.dest = File.expand_path(config['destination'])
|
||||||
self.plugins = plugins_path
|
self.plugins = plugins_path
|
||||||
self.permalink_style = config['permalink'].to_sym
|
self.permalink_style = config['permalink'].to_sym
|
||||||
|
|
||||||
self.file_read_opts = {}
|
self.file_read_opts = {}
|
||||||
self.file_read_opts[:encoding] = config['encoding'] if config['encoding']
|
self.file_read_opts[:encoding] = config['encoding'] if config['encoding']
|
||||||
|
|
||||||
self.reset
|
reset
|
||||||
self.setup
|
setup
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: Read, process, and write this Site to output.
|
# Public: Read, process, and write this Site to output.
|
||||||
#
|
#
|
||||||
# Returns nothing.
|
# Returns nothing.
|
||||||
def process
|
def process
|
||||||
self.reset
|
reset
|
||||||
self.read
|
read
|
||||||
self.generate
|
generate
|
||||||
self.render
|
render
|
||||||
self.cleanup
|
cleanup
|
||||||
self.write
|
write
|
||||||
end
|
end
|
||||||
|
|
||||||
# Reset Site details.
|
# Reset Site details.
|
||||||
#
|
#
|
||||||
# Returns nothing
|
# Returns nothing
|
||||||
def reset
|
def reset
|
||||||
self.time = if self.config['time']
|
self.time = (config['time'] ? Time.parse(config['time'].to_s) : Time.now)
|
||||||
Time.parse(self.config['time'].to_s)
|
self.layouts = {}
|
||||||
else
|
self.posts = []
|
||||||
Time.now
|
self.pages = []
|
||||||
end
|
self.static_files = []
|
||||||
self.layouts = {}
|
self.categories = Hash.new { |hash, key| hash[key] = [] }
|
||||||
self.posts = []
|
self.tags = Hash.new { |hash, key| hash[key] = [] }
|
||||||
self.pages = []
|
self.data = {}
|
||||||
self.static_files = []
|
|
||||||
self.categories = Hash.new { |hash, key| hash[key] = [] }
|
|
||||||
self.tags = Hash.new { |hash, key| hash[key] = [] }
|
|
||||||
self.data = {}
|
|
||||||
|
|
||||||
if self.limit_posts < 0
|
if limit_posts < 0
|
||||||
raise ArgumentError, "limit_posts must be a non-negative number"
|
raise ArgumentError, "limit_posts must be a non-negative number"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -71,11 +67,11 @@ module Jekyll
|
||||||
|
|
||||||
# If safe mode is off, load in any Ruby files under the plugins
|
# If safe mode is off, load in any Ruby files under the plugins
|
||||||
# directory.
|
# directory.
|
||||||
unless self.safe
|
unless safe
|
||||||
self.plugins.each do |plugins|
|
plugins.each do |plugins|
|
||||||
Dir[File.join(plugins, "**/*.rb")].sort.each do |f|
|
Dir[File.join(plugins, "**/*.rb")].sort.each do |f|
|
||||||
require f
|
require f
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -88,16 +84,16 @@ module Jekyll
|
||||||
# Check that the destination dir isn't the source dir or a directory
|
# Check that the destination dir isn't the source dir or a directory
|
||||||
# parent to the source dir.
|
# parent to the source dir.
|
||||||
def ensure_not_in_dest
|
def ensure_not_in_dest
|
||||||
dest = Pathname.new(self.dest)
|
dest_pathname = Pathname.new(dest)
|
||||||
Pathname.new(self.source).ascend do |path|
|
Pathname.new(source).ascend do |path|
|
||||||
if path == dest
|
if path == dest_pathname
|
||||||
raise FatalException.new "Destination directory cannot be or contain the Source directory."
|
raise FatalException.new "Destination directory cannot be or contain the Source directory."
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def require_gems
|
def require_gems
|
||||||
self.gems.each do |gem|
|
gems.each do |gem|
|
||||||
if plugin_allowed?(gem)
|
if plugin_allowed?(gem)
|
||||||
require gem
|
require gem
|
||||||
end
|
end
|
||||||
|
@ -105,11 +101,11 @@ module Jekyll
|
||||||
end
|
end
|
||||||
|
|
||||||
def plugin_allowed?(gem_name)
|
def plugin_allowed?(gem_name)
|
||||||
whitelist.include?(gem_name) || !self.safe
|
whitelist.include?(gem_name) || !safe
|
||||||
end
|
end
|
||||||
|
|
||||||
def whitelist
|
def whitelist
|
||||||
@whitelist ||= Array[self.config['whitelist']].flatten || []
|
@whitelist ||= Array[config['whitelist']].flatten
|
||||||
end
|
end
|
||||||
|
|
||||||
# Internal: Setup the plugin search path
|
# Internal: Setup the plugin search path
|
||||||
|
@ -117,7 +113,7 @@ module Jekyll
|
||||||
# Returns an Array of plugin search paths
|
# Returns an Array of plugin search paths
|
||||||
def plugins_path
|
def plugins_path
|
||||||
if (config['plugins'] == Jekyll::Configuration::DEFAULTS['plugins'])
|
if (config['plugins'] == Jekyll::Configuration::DEFAULTS['plugins'])
|
||||||
[File.join(self.source, config['plugins'])]
|
[File.join(source, config['plugins'])]
|
||||||
else
|
else
|
||||||
Array(config['plugins']).map { |d| File.expand_path(d) }
|
Array(config['plugins']).map { |d| File.expand_path(d) }
|
||||||
end
|
end
|
||||||
|
@ -128,8 +124,8 @@ module Jekyll
|
||||||
# Returns nothing.
|
# Returns nothing.
|
||||||
def read
|
def read
|
||||||
self.layouts = LayoutReader.new(self).read
|
self.layouts = LayoutReader.new(self).read
|
||||||
self.read_directories
|
read_directories
|
||||||
self.read_data(config['data_source'])
|
read_data(config['data_source'])
|
||||||
end
|
end
|
||||||
|
|
||||||
# Recursively traverse directories to find posts, pages and static files
|
# Recursively traverse directories to find posts, pages and static files
|
||||||
|
@ -140,24 +136,24 @@ module Jekyll
|
||||||
#
|
#
|
||||||
# Returns nothing.
|
# Returns nothing.
|
||||||
def read_directories(dir = '')
|
def read_directories(dir = '')
|
||||||
base = File.join(self.source, dir)
|
base = File.join(source, dir)
|
||||||
entries = Dir.chdir(base) { filter_entries(Dir.entries('.'), base) }
|
entries = Dir.chdir(base) { filter_entries(Dir.entries('.'), base) }
|
||||||
|
|
||||||
self.read_posts(dir)
|
read_posts(dir)
|
||||||
self.read_drafts(dir) if self.show_drafts
|
read_drafts(dir) if show_drafts
|
||||||
self.posts.sort!
|
posts.sort!
|
||||||
limit_posts! if limit_posts > 0 # limit the posts if :limit_posts option is set
|
limit_posts! if limit_posts > 0 # limit the posts if :limit_posts option is set
|
||||||
|
|
||||||
entries.each do |f|
|
entries.each do |f|
|
||||||
f_abs = File.join(base, f)
|
f_abs = File.join(base, f)
|
||||||
if File.directory?(f_abs)
|
if File.directory?(f_abs)
|
||||||
f_rel = File.join(dir, f)
|
f_rel = File.join(dir, f)
|
||||||
read_directories(f_rel) unless self.dest.sub(/\/$/, '') == f_abs
|
read_directories(f_rel) unless dest.sub(/\/$/, '') == f_abs
|
||||||
elsif has_yaml_header?(f_abs)
|
elsif has_yaml_header?(f_abs)
|
||||||
page = Page.new(self, self.source, dir, f)
|
page = Page.new(self, source, dir, f)
|
||||||
pages << page if page.published?
|
pages << page if page.published?
|
||||||
else
|
else
|
||||||
static_files << StaticFile.new(self, self.source, dir, f)
|
static_files << StaticFile.new(self, source, dir, f)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -174,7 +170,7 @@ module Jekyll
|
||||||
posts = read_content(dir, '_posts', Post)
|
posts = read_content(dir, '_posts', Post)
|
||||||
|
|
||||||
posts.each do |post|
|
posts.each do |post|
|
||||||
if post.published? && (self.future || post.date <= self.time)
|
if post.published? && (future || post.date <= time)
|
||||||
aggregate_post_info(post)
|
aggregate_post_info(post)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -196,7 +192,7 @@ module Jekyll
|
||||||
|
|
||||||
def read_content(dir, magic_dir, klass)
|
def read_content(dir, magic_dir, klass)
|
||||||
get_entries(dir, magic_dir).map do |entry|
|
get_entries(dir, magic_dir).map do |entry|
|
||||||
klass.new(self, self.source, dir, entry) if klass.valid?(entry)
|
klass.new(self, source, dir, entry) if klass.valid?(entry)
|
||||||
end.reject do |entry|
|
end.reject do |entry|
|
||||||
entry.nil?
|
entry.nil?
|
||||||
end
|
end
|
||||||
|
@ -206,15 +202,15 @@ module Jekyll
|
||||||
#
|
#
|
||||||
# Returns nothing
|
# Returns nothing
|
||||||
def read_data(dir)
|
def read_data(dir)
|
||||||
base = File.join(self.source, dir)
|
base = File.join(source, dir)
|
||||||
return unless File.directory?(base) && (!self.safe || !File.symlink?(base))
|
return unless File.directory?(base) && (!safe || !File.symlink?(base))
|
||||||
|
|
||||||
entries = Dir.chdir(base) { Dir['*.{yaml,yml}'] }
|
entries = Dir.chdir(base) { Dir['*.{yaml,yml}'] }
|
||||||
entries.delete_if { |e| File.directory?(File.join(base, e)) }
|
entries.delete_if { |e| File.directory?(File.join(base, e)) }
|
||||||
|
|
||||||
entries.each do |entry|
|
entries.each do |entry|
|
||||||
path = File.join(self.source, dir, entry)
|
path = File.join(source, dir, entry)
|
||||||
next if File.symlink?(path) && self.safe
|
next if File.symlink?(path) && safe
|
||||||
|
|
||||||
key = sanitize_filename(File.basename(entry, '.*'))
|
key = sanitize_filename(File.basename(entry, '.*'))
|
||||||
self.data[key] = SafeYAML.load_file(path)
|
self.data[key] = SafeYAML.load_file(path)
|
||||||
|
@ -225,7 +221,7 @@ module Jekyll
|
||||||
#
|
#
|
||||||
# Returns nothing.
|
# Returns nothing.
|
||||||
def generate
|
def generate
|
||||||
self.generators.each do |generator|
|
generators.each do |generator|
|
||||||
generator.generate(self)
|
generator.generate(self)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -237,12 +233,12 @@ module Jekyll
|
||||||
relative_permalinks_deprecation_method
|
relative_permalinks_deprecation_method
|
||||||
|
|
||||||
payload = site_payload
|
payload = site_payload
|
||||||
[self.posts, self.pages].flatten.each do |page_or_post|
|
[posts, pages].flatten.each do |page_or_post|
|
||||||
page_or_post.render(self.layouts, payload)
|
page_or_post.render(layouts, payload)
|
||||||
end
|
end
|
||||||
|
|
||||||
self.categories.values.map { |ps| ps.sort! { |a, b| b <=> a } }
|
categories.values.map { |ps| ps.sort! { |a, b| b <=> a } }
|
||||||
self.tags.values.map { |ps| ps.sort! { |a, b| b <=> a } }
|
tags.values.map { |ps| ps.sort! { |a, b| b <=> a } }
|
||||||
rescue Errno::ENOENT => e
|
rescue Errno::ENOENT => e
|
||||||
# ignore missing layout dir
|
# ignore missing layout dir
|
||||||
end
|
end
|
||||||
|
@ -258,7 +254,7 @@ module Jekyll
|
||||||
#
|
#
|
||||||
# Returns nothing.
|
# Returns nothing.
|
||||||
def write
|
def write
|
||||||
each_site_file { |item| item.write(self.dest) }
|
each_site_file { |item| item.write(dest) }
|
||||||
end
|
end
|
||||||
|
|
||||||
# Construct a Hash of Posts indexed by the specified Post attribute.
|
# Construct a Hash of Posts indexed by the specified Post attribute.
|
||||||
|
@ -277,8 +273,8 @@ module Jekyll
|
||||||
def post_attr_hash(post_attr)
|
def post_attr_hash(post_attr)
|
||||||
# Build a hash map based on the specified post attribute ( post attr =>
|
# Build a hash map based on the specified post attribute ( post attr =>
|
||||||
# array of posts ) then sort each array in reverse order.
|
# array of posts ) then sort each array in reverse order.
|
||||||
hash = Hash.new { |hsh, key| hsh[key] = Array.new }
|
hash = Hash.new { |hash, key| hash[key] = [] }
|
||||||
self.posts.each { |p| p.send(post_attr.to_sym).each { |t| hash[t] << p } }
|
posts.each { |p| p.send(post_attr.to_sym).each { |t| hash[t] << p } }
|
||||||
hash.values.map { |sortme| sortme.sort! { |a, b| b <=> a } }
|
hash.values.map { |sortme| sortme.sort! { |a, b| b <=> a } }
|
||||||
hash
|
hash
|
||||||
end
|
end
|
||||||
|
@ -288,7 +284,7 @@ module Jekyll
|
||||||
#
|
#
|
||||||
# Returns the Hash to be hooked to site.data.
|
# Returns the Hash to be hooked to site.data.
|
||||||
def site_data
|
def site_data
|
||||||
self.config['data'] || self.data
|
config['data'] || data
|
||||||
end
|
end
|
||||||
|
|
||||||
# The Hash payload containing site-wide data.
|
# The Hash payload containing site-wide data.
|
||||||
|
@ -306,12 +302,12 @@ module Jekyll
|
||||||
# See Site#post_attr_hash for type info.
|
# See Site#post_attr_hash for type info.
|
||||||
def site_payload
|
def site_payload
|
||||||
{"jekyll" => { "version" => Jekyll::VERSION },
|
{"jekyll" => { "version" => Jekyll::VERSION },
|
||||||
"site" => self.config.merge({
|
"site" => config.merge({
|
||||||
"time" => self.time,
|
"time" => time,
|
||||||
"posts" => self.posts.sort { |a, b| b <=> a },
|
"posts" => posts.sort { |a, b| b <=> a },
|
||||||
"pages" => self.pages,
|
"pages" => pages,
|
||||||
"static_files" => self.static_files.sort { |a, b| a.relative_path <=> b.relative_path },
|
"static_files" => static_files.sort { |a, b| a.relative_path <=> b.relative_path },
|
||||||
"html_pages" => self.pages.reject { |page| !page.html? },
|
"html_pages" => pages.reject { |page| !page.html? },
|
||||||
"categories" => post_attr_hash('categories'),
|
"categories" => post_attr_hash('categories'),
|
||||||
"tags" => post_attr_hash('tags'),
|
"tags" => post_attr_hash('tags'),
|
||||||
"data" => site_data})}
|
"data" => site_data})}
|
||||||
|
@ -335,7 +331,7 @@ module Jekyll
|
||||||
#
|
#
|
||||||
# Returns the Converter instance implementing the given Converter.
|
# Returns the Converter instance implementing the given Converter.
|
||||||
def getConverterImpl(klass)
|
def getConverterImpl(klass)
|
||||||
matches = self.converters.select { |c| c.class == klass }
|
matches = converters.select { |c| c.class == klass }
|
||||||
if impl = matches.first
|
if impl = matches.first
|
||||||
impl
|
impl
|
||||||
else
|
else
|
||||||
|
@ -352,9 +348,9 @@ module Jekyll
|
||||||
# Returns array of instances of subclasses of parameter
|
# Returns array of instances of subclasses of parameter
|
||||||
def instantiate_subclasses(klass)
|
def instantiate_subclasses(klass)
|
||||||
klass.subclasses.select do |c|
|
klass.subclasses.select do |c|
|
||||||
!self.safe || c.safe
|
!safe || c.safe
|
||||||
end.sort.map do |c|
|
end.sort.map do |c|
|
||||||
c.new(self.config)
|
c.new(config)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -365,7 +361,7 @@ module Jekyll
|
||||||
#
|
#
|
||||||
# Returns the list of entries to process
|
# Returns the list of entries to process
|
||||||
def get_entries(dir, subfolder)
|
def get_entries(dir, subfolder)
|
||||||
base = File.join(self.source, dir, subfolder)
|
base = File.join(source, dir, subfolder)
|
||||||
return [] unless File.exists?(base)
|
return [] unless File.exists?(base)
|
||||||
entries = Dir.chdir(base) { filter_entries(Dir['**/*'], base) }
|
entries = Dir.chdir(base) { filter_entries(Dir['**/*'], base) }
|
||||||
entries.delete_if { |e| File.directory?(File.join(base, e)) }
|
entries.delete_if { |e| File.directory?(File.join(base, e)) }
|
||||||
|
@ -377,9 +373,9 @@ module Jekyll
|
||||||
#
|
#
|
||||||
# Returns nothing
|
# Returns nothing
|
||||||
def aggregate_post_info(post)
|
def aggregate_post_info(post)
|
||||||
self.posts << post
|
posts << post
|
||||||
post.categories.each { |c| self.categories[c] << post }
|
post.categories.each { |c| categories[c] << post }
|
||||||
post.tags.each { |c| self.tags[c] << post }
|
post.tags.each { |c| tags[c] << post }
|
||||||
end
|
end
|
||||||
|
|
||||||
def relative_permalinks_deprecation_method
|
def relative_permalinks_deprecation_method
|
||||||
|
@ -396,7 +392,7 @@ module Jekyll
|
||||||
|
|
||||||
def each_site_file
|
def each_site_file
|
||||||
%w(posts pages static_files).each do |type|
|
%w(posts pages static_files).each do |type|
|
||||||
self.send(type).each do |item|
|
send(type).each do |item|
|
||||||
yield item
|
yield item
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -405,7 +401,7 @@ module Jekyll
|
||||||
private
|
private
|
||||||
|
|
||||||
def has_relative_page?
|
def has_relative_page?
|
||||||
self.pages.any? { |page| page.uses_relative_permalinks }
|
pages.any? { |page| page.uses_relative_permalinks }
|
||||||
end
|
end
|
||||||
|
|
||||||
def has_yaml_header?(file)
|
def has_yaml_header?(file)
|
||||||
|
@ -413,8 +409,8 @@ module Jekyll
|
||||||
end
|
end
|
||||||
|
|
||||||
def limit_posts!
|
def limit_posts!
|
||||||
limit = self.posts.length < limit_posts ? self.posts.length : limit_posts
|
limit = posts.length < limit_posts ? posts.length : limit_posts
|
||||||
self.posts = self.posts[-limit, limit]
|
self.posts = posts[-limit, limit]
|
||||||
end
|
end
|
||||||
|
|
||||||
def site_cleaner
|
def site_cleaner
|
||||||
|
@ -422,9 +418,9 @@ module Jekyll
|
||||||
end
|
end
|
||||||
|
|
||||||
def sanitize_filename(name)
|
def sanitize_filename(name)
|
||||||
name = name.gsub(/[^\w\s_-]+/, '')
|
name.gsub!(/[^\w\s_-]+/, '')
|
||||||
name = name.gsub(/(^|\b\s)\s+($|\s?\b)/, '\\1\\2')
|
name.gsub!(/(^|\b\s)\s+($|\s?\b)/, '\\1\\2')
|
||||||
name = name.gsub(/\s+/, '_')
|
name.gsub(/\s+/, '_')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue