commit
6358a8f92c
|
@ -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/**/*
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue