Merge pull request #5026 from ayastreb/utils

Merge pull request 5026
This commit is contained in:
jekyllbot 2016-06-22 10:05:59 -07:00 committed by GitHub
commit 6358a8f92c
2 changed files with 52 additions and 32 deletions

View File

@ -10,7 +10,6 @@ AllCops:
- lib/jekyll/document.rb - lib/jekyll/document.rb
- lib/jekyll/regenerator.rb - lib/jekyll/regenerator.rb
- lib/jekyll/renderer.rb - lib/jekyll/renderer.rb
- lib/jekyll/utils.rb
- bin/**/* - bin/**/*
- benchmark/**/* - benchmark/**/*
- script/**/* - script/**/*

View File

@ -2,27 +2,25 @@
module Jekyll module Jekyll
module Utils module Utils
extend self extend self
autoload :Platforms, 'jekyll/utils/platforms' autoload :Platforms, "jekyll/utils/platforms"
autoload :Ansi, "jekyll/utils/ansi" autoload :Ansi, "jekyll/utils/ansi"
# Constants for use in #slugify # Constants for use in #slugify
SLUGIFY_MODES = %w(raw default pretty) SLUGIFY_MODES = %w(raw default pretty).freeze
SLUGIFY_RAW_REGEXP = Regexp.new('\\s+').freeze SLUGIFY_RAW_REGEXP = Regexp.new('\\s+').freeze
SLUGIFY_DEFAULT_REGEXP = Regexp.new('[^[:alnum:]]+').freeze SLUGIFY_DEFAULT_REGEXP = Regexp.new("[^[:alnum:]]+").freeze
SLUGIFY_PRETTY_REGEXP = Regexp.new("[^[:alnum:]._~!$&'()+,;=@]+").freeze SLUGIFY_PRETTY_REGEXP = Regexp.new("[^[:alnum:]._~!$&'()+,;=@]+").freeze
# Takes an indented string and removes the preceding spaces on each line # Takes an indented string and removes the preceding spaces on each line
def strip_heredoc(str) def strip_heredoc(str)
str.gsub(/^[ \t]{#{(str.scan(/^[ \t]*(?=\S)/).min || "").size}}/, "") str.gsub(%r!^[ \t]{#{(str.scan(%r!^[ \t]*(?=\S)!).min || "").size}}!, "")
end end
# Takes a slug and turns it into a simple title. # Takes a slug and turns it into a simple title.
def titleize_slug(slug) def titleize_slug(slug)
slug.split("-").map! do |val| slug.split("-").map!(&:capitalize).join(" ")
val.capitalize
end.join(" ")
end end
# Non-destructive version of deep_merge_hashes! See that method. # Non-destructive version of deep_merge_hashes! See that method.
@ -42,21 +40,9 @@ module Jekyll
# #
# Thanks to whoever made it. # Thanks to whoever made it.
def deep_merge_hashes!(target, overwrite) def deep_merge_hashes!(target, overwrite)
target.merge!(overwrite) do |key, old_val, new_val| merge_values(target, overwrite)
if new_val.nil? merge_default_proc(target, overwrite)
old_val duplicate_frozen_values(target)
else
mergable?(old_val) && mergable?(new_val) ? deep_merge_hashes(old_val, new_val) : new_val
end
end
if target.respond_to?(:default_proc) && overwrite.respond_to?(:default_proc) && target.default_proc.nil?
target.default_proc = overwrite.default_proc
end
target.each do |key, val|
target[key] = val.dup if val.frozen? && duplicable?(val)
end
target target
end end
@ -84,7 +70,9 @@ module Jekyll
# Returns an array # Returns an array
def pluralized_array_from_hash(hash, singular_key, plural_key) def pluralized_array_from_hash(hash, singular_key, plural_key)
[].tap do |array| [].tap do |array|
array << (value_from_singular_key(hash, singular_key) || value_from_plural_key(hash, plural_key)) value = value_from_singular_key(hash, singular_key)
value ||= value_from_plural_key(hash, plural_key)
array << value
end.flatten.compact end.flatten.compact
end end
@ -146,11 +134,13 @@ module Jekyll
# Determines whether a given file has # Determines whether a given file has
# #
# Returns true if the YAML front matter is present. # Returns true if the YAML front matter is present.
# rubocop: disable PredicateName
def has_yaml_header?(file) def has_yaml_header?(file)
!!(File.open(file, 'rb') { |f| f.readline } =~ /\A---\s*\r?\n/) !!(File.open(file, "rb", &:readline) =~ %r!\A---\s*\r?\n!)
rescue EOFError rescue EOFError
false false
end end
# rubocop: enable PredicateName
# Slugify a filename or title. # Slugify a filename or title.
# #
@ -185,7 +175,7 @@ module Jekyll
# #
# Returns the slugified string. # Returns the slugified string.
def slugify(string, mode: nil, cased: false) def slugify(string, mode: nil, cased: false)
mode ||= 'default' mode ||= "default"
return nil if string.nil? return nil if string.nil?
unless SLUGIFY_MODES.include?(mode) unless SLUGIFY_MODES.include?(mode)
@ -195,21 +185,21 @@ module Jekyll
# Replace each character sequence with a hyphen # Replace each character sequence with a hyphen
re = re =
case mode case mode
when 'raw' when "raw"
SLUGIFY_RAW_REGEXP SLUGIFY_RAW_REGEXP
when 'default' when "default"
SLUGIFY_DEFAULT_REGEXP SLUGIFY_DEFAULT_REGEXP
when 'pretty' when "pretty"
# "._~!$&'()+,;=@" is human readable (not URI-escaped) in URL # "._~!$&'()+,;=@" is human readable (not URI-escaped) in URL
# and is allowed in both extN and NTFS. # and is allowed in both extN and NTFS.
SLUGIFY_PRETTY_REGEXP SLUGIFY_PRETTY_REGEXP
end end
# Strip according to the mode # Strip according to the mode
slug = string.gsub(re, '-') slug = string.gsub(re, "-")
# Remove leading/trailing hyphen # Remove leading/trailing hyphen
slug.gsub!(/^\-|\-$/i, '') slug.gsub!(%r!^\-|\-$!i, "")
slug.downcase! unless cased slug.downcase! unless cased
slug slug
@ -280,7 +270,7 @@ module Jekyll
# Returns matched pathes # Returns matched pathes
def safe_glob(dir, patterns, flags = 0) def safe_glob(dir, patterns, flags = 0)
return [] unless Dir.exist?(dir) return [] unless Dir.exist?(dir)
pattern = File.join(Array patterns) pattern = File.join(Array(patterns))
return [dir] if pattern.empty? return [dir] if pattern.empty?
Dir.chdir(dir) do Dir.chdir(dir) do
Dir.glob(pattern, flags).map { |f| File.join(dir, f) } Dir.glob(pattern, flags).map { |f| File.join(dir, f) }
@ -297,5 +287,36 @@ module Jekyll
merged merged
end end
private
def merge_values(target, overwrite)
target.merge!(overwrite) do |_key, old_val, new_val|
if new_val.nil?
old_val
elsif mergable?(old_val) && mergable?(new_val)
deep_merge_hashes(old_val, new_val)
else
new_val
end
end
end
private
def merge_default_proc(target, overwrite)
if default_proc?(target) && default_proc?(overwrite) && target.default_proc.nil?
target.default_proc = overwrite.default_proc
end
end
private
def default_proc?(object)
object.respond_to?(:default_proc)
end
private
def duplicate_frozen_values(target)
target.each do |key, val|
target[key] = val.dup if val.frozen? && duplicable?(val)
end
end
end end
end end