jekyll-favicon 0.2.5 → 1.0.0.pre.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.devcontainer/Dockerfile +20 -0
- data/.devcontainer/devcontainer.json +35 -0
- data/.github/ISSUE_TEMPLATE/bug_report.md +10 -13
- data/.github/PULL_REQUEST_TEMPLATE.md +11 -9
- data/.github/workflows/gem-push.yml +40 -0
- data/.github/workflows/test.yml +38 -0
- data/.gitignore +5 -0
- data/CHANGELOG.md +44 -0
- data/Gemfile +2 -0
- data/README.md +86 -20
- data/Rakefile +9 -7
- data/bin/console +1 -0
- data/config/jekyll/favicon.yml +115 -0
- data/config/jekyll/favicon/static_file.yml +3 -0
- data/config/jekyll/favicon/static_file/convertible.yml +42 -0
- data/config/jekyll/favicon/static_file/mutable.yml +22 -0
- data/config/jekyll/favicon/static_file/referenceable.yml +15 -0
- data/config/jekyll/favicon/static_file/sourceable.yml +3 -0
- data/config/jekyll/favicon/static_file/taggable.yml +22 -0
- data/gemfiles/jekyll36.gemfile +6 -0
- data/gemfiles/jekyll37.gemfile +6 -0
- data/gemfiles/jekyll38.gemfile +6 -0
- data/gemfiles/jekyll39.gemfile +6 -0
- data/gemfiles/jekyll40.gemfile +6 -0
- data/gemfiles/jekyll41.gemfile +6 -0
- data/gemfiles/jekyll42.gemfile +6 -0
- data/jekyll-favicon.gemspec +9 -9
- data/lib/jekyll-favicon.rb +7 -14
- data/lib/jekyll/favicon.rb +19 -13
- data/lib/jekyll/favicon/configuration.rb +73 -0
- data/lib/jekyll/favicon/configuration/defaults.rb +49 -0
- data/lib/jekyll/favicon/generator.rb +11 -74
- data/lib/jekyll/favicon/hooks.rb +12 -10
- data/lib/jekyll/favicon/static_data_file.rb +17 -0
- data/lib/jekyll/favicon/static_file.rb +97 -0
- data/lib/jekyll/favicon/static_file/convertible.rb +118 -0
- data/lib/jekyll/favicon/static_file/mutable.rb +81 -0
- data/lib/jekyll/favicon/static_file/referenceable.rb +22 -0
- data/lib/jekyll/favicon/static_file/sourceable.rb +73 -0
- data/lib/jekyll/favicon/static_file/taggable.rb +59 -0
- data/lib/jekyll/favicon/static_graphic_file.rb +21 -0
- data/lib/jekyll/favicon/tag.rb +14 -16
- data/lib/jekyll/favicon/utils.rb +24 -0
- data/lib/jekyll/favicon/utils/configuration/compact.rb +61 -0
- data/lib/jekyll/favicon/utils/configuration/merge.rb +63 -0
- data/lib/jekyll/favicon/utils/configuration/patch.rb +48 -0
- data/lib/jekyll/favicon/utils/convert.rb +42 -0
- data/lib/jekyll/favicon/utils/tag.rb +54 -0
- data/lib/jekyll/favicon/version.rb +3 -1
- metadata +71 -66
- data/.rubocop.yml +0 -5
- data/.travis.yml +0 -21
- data/Gemfile.lock +0 -97
- data/lib/browserconfig.rb +0 -54
- data/lib/hash.rb +0 -12
- data/lib/image.rb +0 -33
- data/lib/jekyll/favicon/config/defaults.yml +0 -54
- data/lib/jekyll/favicon/icon.rb +0 -74
- data/lib/jekyll/favicon/metadata.rb +0 -12
- data/lib/jekyll/favicon/templates/chrome.html.erb +0 -5
- data/lib/jekyll/favicon/templates/classic.html.erb +0 -8
- data/lib/jekyll/favicon/templates/ie.html.erb +0 -4
- data/lib/jekyll/favicon/templates/safari.html.erb +0 -8
- data/lib/string.rb +0 -14
- data/lib/webmanifest.rb +0 -30
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'jekyll/favicon/configuration/defaults'
|
4
|
+
|
5
|
+
module Jekyll
|
6
|
+
module Favicon
|
7
|
+
class StaticFile < Jekyll::StaticFile
|
8
|
+
# Add reference to a static file
|
9
|
+
module Referenceable
|
10
|
+
include Configuration::Defaults
|
11
|
+
|
12
|
+
def referenceable?
|
13
|
+
refer.any?
|
14
|
+
end
|
15
|
+
|
16
|
+
def refer
|
17
|
+
patch spec.fetch('refer', [])
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'jekyll/favicon/configuration/defaults'
|
4
|
+
require 'jekyll/favicon/utils'
|
5
|
+
|
6
|
+
module Jekyll
|
7
|
+
module Favicon
|
8
|
+
class StaticFile < Jekyll::StaticFile
|
9
|
+
# Add source to a static file
|
10
|
+
module Sourceable
|
11
|
+
include Configuration::Defaults
|
12
|
+
|
13
|
+
def sourceable?
|
14
|
+
source.any? && File.file?(path)
|
15
|
+
end
|
16
|
+
|
17
|
+
def source
|
18
|
+
Utils.merge sourceable_defaults, source_site, source_asset
|
19
|
+
end
|
20
|
+
|
21
|
+
# overrides Jekyll::StaticFile method
|
22
|
+
def path
|
23
|
+
File.join(*[@base, source_relative_path].compact)
|
24
|
+
end
|
25
|
+
|
26
|
+
def source_relative_path
|
27
|
+
source_relative_pathname.to_s
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.source_normalize(options)
|
31
|
+
case options
|
32
|
+
when String
|
33
|
+
source_dir, source_name = File.split options
|
34
|
+
{ 'dir' => source_dir, 'name' => source_name }
|
35
|
+
when Hash
|
36
|
+
Utils.compact options
|
37
|
+
else {}
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.source_filter(options)
|
42
|
+
options.fetch 'source', {}
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def source_relative_pathname
|
48
|
+
Pathname.new(source['dir'])
|
49
|
+
.join(source['name'])
|
50
|
+
.cleanpath
|
51
|
+
end
|
52
|
+
|
53
|
+
def source_defaults
|
54
|
+
sourceable_defaults
|
55
|
+
end
|
56
|
+
|
57
|
+
def source_site
|
58
|
+
site_config = Configuration.merged @site
|
59
|
+
config = Sourceable.source_filter site_config
|
60
|
+
Sourceable.source_normalize config
|
61
|
+
end
|
62
|
+
|
63
|
+
def source_spec
|
64
|
+
Sourceable.source_filter spec
|
65
|
+
end
|
66
|
+
|
67
|
+
def source_asset
|
68
|
+
Sourceable.source_normalize source_spec
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rexml/document'
|
4
|
+
require 'jekyll/favicon/configuration/defaults'
|
5
|
+
require 'jekyll/favicon/utils'
|
6
|
+
|
7
|
+
module Jekyll
|
8
|
+
module Favicon
|
9
|
+
class StaticFile < Jekyll::StaticFile
|
10
|
+
# Add tags to favicon's static files
|
11
|
+
module Taggable
|
12
|
+
include Configuration::Defaults
|
13
|
+
|
14
|
+
def taggable?
|
15
|
+
tags.any?
|
16
|
+
end
|
17
|
+
|
18
|
+
def tags
|
19
|
+
tag_spec.collect do |options|
|
20
|
+
tag_name, tag_options = options.first
|
21
|
+
tag_defaults = taggable_defaults[tag_name]
|
22
|
+
tag_attributes = tag_defaults.merge tag_options
|
23
|
+
tag_build tag_name, patch(tag_attributes)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def tag_spec
|
30
|
+
spec.fetch 'tag', []
|
31
|
+
end
|
32
|
+
|
33
|
+
# :reek:UtilityFunction
|
34
|
+
def tag_build(name, attributes = {})
|
35
|
+
config = attributes.transform_keys { |key| "_#{key}" }
|
36
|
+
Jekyll::Favicon::Utils.build_element name, nil, config
|
37
|
+
end
|
38
|
+
|
39
|
+
def mimetype
|
40
|
+
mappings = {
|
41
|
+
'.ico' => 'image/x-icon',
|
42
|
+
'.png' => 'image/png',
|
43
|
+
'.svg' => 'image/svg+xml'
|
44
|
+
}
|
45
|
+
mappings[extname]
|
46
|
+
end
|
47
|
+
|
48
|
+
def taggable_patch(configuration)
|
49
|
+
Favicon::Utils.patch configuration do |value|
|
50
|
+
case value
|
51
|
+
when :mime then mimetype
|
52
|
+
else value
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'jekyll/favicon/static_file'
|
4
|
+
require 'jekyll/favicon/static_file/convertible'
|
5
|
+
|
6
|
+
module Jekyll
|
7
|
+
module Favicon
|
8
|
+
# Favicon::StaticFile subclass
|
9
|
+
class StaticGraphicFile < StaticFile
|
10
|
+
include StaticFile::Convertible
|
11
|
+
|
12
|
+
def generable?
|
13
|
+
convertible? && super
|
14
|
+
end
|
15
|
+
|
16
|
+
def patch(configuration)
|
17
|
+
convertible_patch super(configuration)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/jekyll/favicon/tag.rb
CHANGED
@@ -1,23 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'liquid'
|
4
|
+
require 'jekyll/favicon/static_file'
|
5
|
+
|
1
6
|
module Jekyll
|
2
7
|
module Favicon
|
3
|
-
# New `favicon` tag
|
8
|
+
# New `favicon` tag include html tags on templates
|
4
9
|
class Tag < Liquid::Tag
|
5
|
-
|
6
|
-
super
|
7
|
-
@text = text
|
8
|
-
end
|
9
|
-
|
10
|
+
# :reek:UtilityFunction
|
10
11
|
def render(context)
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
end
|
19
|
-
foot = '<!-- End Jekyll Favicon tag -->'
|
20
|
-
[head, body.join("\n"), foot].join("\n")
|
12
|
+
context.registers[:site]
|
13
|
+
.static_files
|
14
|
+
.select { |static_file| static_file.is_a? StaticFile }
|
15
|
+
.select(&:taggable?)
|
16
|
+
.collect(&:tags)
|
17
|
+
.flatten
|
18
|
+
.join("\n")
|
21
19
|
end
|
22
20
|
end
|
23
21
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'jekyll/favicon/utils/configuration/compact'
|
4
|
+
require 'jekyll/favicon/utils/configuration/merge'
|
5
|
+
require 'jekyll/favicon/utils/configuration/patch'
|
6
|
+
require 'jekyll/favicon/utils/convert'
|
7
|
+
require 'jekyll/favicon/utils/tag'
|
8
|
+
|
9
|
+
module Jekyll
|
10
|
+
module Favicon
|
11
|
+
# Favicon utils functions
|
12
|
+
module Utils
|
13
|
+
include Configuration::Compact
|
14
|
+
include Configuration::Merge
|
15
|
+
include Configuration::Patch
|
16
|
+
include Convert
|
17
|
+
include Tag
|
18
|
+
|
19
|
+
def self.except(hash, *keys)
|
20
|
+
hash.reject { |key, _| keys.include? key }
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Jekyll
|
4
|
+
module Favicon
|
5
|
+
module Utils
|
6
|
+
module Configuration
|
7
|
+
# Favicon configuration compact logic
|
8
|
+
module Compact
|
9
|
+
def self.included(klass)
|
10
|
+
klass.extend(ClassMethods)
|
11
|
+
end
|
12
|
+
|
13
|
+
# Nil and empty remove from configurations
|
14
|
+
module ClassMethods
|
15
|
+
def compact(compactable)
|
16
|
+
case compactable
|
17
|
+
when Hash, Array
|
18
|
+
compact_deep(compactable) || compactable.class[]
|
19
|
+
else
|
20
|
+
compactable
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def compact_deep(compactable)
|
27
|
+
case compactable
|
28
|
+
when Hash then compact_hash compactable
|
29
|
+
when Array then compact_array compactable
|
30
|
+
else compactable
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def compact_hash(hash)
|
35
|
+
compacted_hash = hash.each_with_object({}) do |(key, value), memo|
|
36
|
+
next unless (compacted = compact_deep(value))
|
37
|
+
|
38
|
+
memo[key] = compacted
|
39
|
+
end
|
40
|
+
compact_shallow compacted_hash
|
41
|
+
end
|
42
|
+
|
43
|
+
def compact_array(array)
|
44
|
+
compacted_array = array.each_with_object([]) do |value, memo|
|
45
|
+
next unless (compacted = compact_deep(value))
|
46
|
+
|
47
|
+
memo << compacted
|
48
|
+
end
|
49
|
+
compact_shallow compacted_array
|
50
|
+
end
|
51
|
+
|
52
|
+
# :reek:UtilityFunction
|
53
|
+
def compact_shallow(compactable)
|
54
|
+
compactable.empty? ? nil : compactable.compact
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Jekyll
|
4
|
+
module Favicon
|
5
|
+
module Utils
|
6
|
+
module Configuration
|
7
|
+
# Favicon configuration merge logic
|
8
|
+
module Merge
|
9
|
+
def self.included(klass)
|
10
|
+
klass.extend(ClassMethods)
|
11
|
+
end
|
12
|
+
|
13
|
+
# Merge configurations
|
14
|
+
module ClassMethods
|
15
|
+
def merge(left = nil, *right_and_or_rest)
|
16
|
+
return left if right_and_or_rest.empty?
|
17
|
+
|
18
|
+
right, *rest = right_and_or_rest
|
19
|
+
merged = merge_pair left, right
|
20
|
+
return merged if rest.empty?
|
21
|
+
|
22
|
+
merge(merged, *rest)
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def merge_pair(left, right)
|
28
|
+
return right if !left || !right || !left.instance_of?(right.class)
|
29
|
+
|
30
|
+
case right
|
31
|
+
when Hash then merge_pair_hash left, right
|
32
|
+
when Array then merge_pair_array left, right
|
33
|
+
else right
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def merge_pair_hash(left_hash, right_hash)
|
38
|
+
left_hash.merge(right_hash) do |_, left_value, right_value|
|
39
|
+
merge left_value, right_value
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def merge_pair_array(left_array, right_array)
|
44
|
+
joint_array = left_array + right_array
|
45
|
+
joint_array.group_by { |map| merge_group map }
|
46
|
+
.collect { |group, values| merge_collect group, values }
|
47
|
+
.flatten
|
48
|
+
end
|
49
|
+
|
50
|
+
# :reek:UtilityFunction
|
51
|
+
def merge_group(map, keys = %w[name dir])
|
52
|
+
map.is_a?(Hash) ? map.values_at(*keys) : []
|
53
|
+
end
|
54
|
+
|
55
|
+
def merge_collect(group, values)
|
56
|
+
group.first ? merge(*values) : values
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Jekyll
|
4
|
+
module Favicon
|
5
|
+
module Utils
|
6
|
+
module Configuration
|
7
|
+
# Favicon configuration patch logic
|
8
|
+
module Patch
|
9
|
+
def self.included(klass)
|
10
|
+
klass.extend(ClassMethods)
|
11
|
+
end
|
12
|
+
|
13
|
+
# Patch configuration with the block provided
|
14
|
+
module ClassMethods
|
15
|
+
def patch(value_or_values, &block)
|
16
|
+
patch_method = case value_or_values
|
17
|
+
when Array then :patch_array
|
18
|
+
when Hash then :patch_hash
|
19
|
+
when Symbol, String then :patch_value
|
20
|
+
else return value_or_values
|
21
|
+
end
|
22
|
+
send patch_method, value_or_values, &block
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def patch_array(values, &block)
|
28
|
+
values.collect { |value| patch value, &block }
|
29
|
+
end
|
30
|
+
|
31
|
+
def patch_hash(values, &block)
|
32
|
+
values.transform_values { |value| patch value, &block }
|
33
|
+
end
|
34
|
+
|
35
|
+
def patch_value(value, &block)
|
36
|
+
block.call patch_value_string_symbol(value)
|
37
|
+
end
|
38
|
+
|
39
|
+
# :reek:UtilityFunction
|
40
|
+
def patch_value_string_symbol(value)
|
41
|
+
value.to_s.start_with?(':') ? value[1..-1].to_sym : value
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'mini_magick'
|
4
|
+
|
5
|
+
module Jekyll
|
6
|
+
module Favicon
|
7
|
+
module Utils
|
8
|
+
# Favicon convert for include
|
9
|
+
module Convert
|
10
|
+
def self.included(klass)
|
11
|
+
klass.extend(ClassMethods)
|
12
|
+
end
|
13
|
+
|
14
|
+
# Favicon convert utils functions
|
15
|
+
module ClassMethods
|
16
|
+
def convert(input, output, options = {})
|
17
|
+
MiniMagick::Tool::Convert.new do |convert|
|
18
|
+
convert.flatten
|
19
|
+
convert_options(convert, options) << input << output
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def convert_options(convert, options = {})
|
26
|
+
priorities = %w[resize scale]
|
27
|
+
convert_apply convert, options.slice(*priorities)
|
28
|
+
common_options = options.reject { |key| priorities.include? key }
|
29
|
+
convert_apply convert, common_options
|
30
|
+
end
|
31
|
+
|
32
|
+
# :reek:UtilityFunction
|
33
|
+
def convert_apply(convert, options = {})
|
34
|
+
options.each_with_object(convert) do |(option, value), memo|
|
35
|
+
memo.send option.to_sym, value
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|