jekyll-og-image 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rspec_status +7 -5
- data/README.md +22 -2
- data/examples/3.png +0 -0
- data/examples/4.png +0 -0
- data/lib/jekyll_og_image/config.rb +9 -6
- data/lib/jekyll_og_image/element/base.rb +8 -0
- data/lib/jekyll_og_image/element/canvas.rb +13 -2
- data/lib/jekyll_og_image/element/image.rb +2 -10
- data/lib/jekyll_og_image/generator.rb +14 -6
- data/lib/jekyll_og_image/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3d7ab3e37756339d3435bb110e3e612476888bea4ba020115ebc25e45708e9d5
|
4
|
+
data.tar.gz: 2940f89d8f183a158d8cb4da4a0ee5859ae1f414acf272ad5928c7302ad2f494
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 163fc1a8a585391ab60f6e233291497275b2902a0d13e397211af6a610606ad510e33e8d98fbb153ad1ee943cd86d00e5bcf359527a52c51c05bd51b97774a4e
|
7
|
+
data.tar.gz: 946b88643e7b584ab44114e7fc6e94578b53ccfe156c5758b93ae93099b2e442f13edc10c23c5541215ba229fa2b76fa69af8dcb186ef777e5745fb5c48b0573
|
data/.rspec_status
CHANGED
@@ -1,5 +1,7 @@
|
|
1
|
-
example_id
|
2
|
-
|
3
|
-
./spec/
|
4
|
-
./spec/
|
5
|
-
./spec/
|
1
|
+
example_id | status | run_time |
|
2
|
+
---------------------------------------------- | ------ | --------------- |
|
3
|
+
./spec/jekyll_og_image/config_spec.rb[1:1:1:1] | passed | 0.00069 seconds |
|
4
|
+
./spec/jekyll_og_image/config_spec.rb[1:1:2:1] | passed | 0.00014 seconds |
|
5
|
+
./spec/jekyll_og_image/version_spec.rb[1:1] | passed | 0.00031 seconds |
|
6
|
+
./spec/jekyll_og_image_spec.rb[1:1] | passed | 0.26017 seconds |
|
7
|
+
./spec/jekyll_og_image_spec.rb[1:2] | passed | 0.04281 seconds |
|
data/README.md
CHANGED
@@ -61,7 +61,7 @@ og_image:
|
|
61
61
|
|
62
62
|

|
63
63
|
|
64
|
-
### Background Color and Text
|
64
|
+
### Background Color and Text Color
|
65
65
|
|
66
66
|
```yaml
|
67
67
|
og_image:
|
@@ -78,7 +78,7 @@ og_image:
|
|
78
78
|
force: false
|
79
79
|
domain: "igor.works"
|
80
80
|
border_bottom:
|
81
|
-
width:
|
81
|
+
width: 50
|
82
82
|
fill:
|
83
83
|
- "#002B7F"
|
84
84
|
- "#FCD116"
|
@@ -87,6 +87,26 @@ og_image:
|
|
87
87
|
|
88
88
|

|
89
89
|
|
90
|
+
### Background Image
|
91
|
+
|
92
|
+
```yaml
|
93
|
+
og_image:
|
94
|
+
output_dir: "/assets/og"
|
95
|
+
image: "/assets/images/igor.jpeg"
|
96
|
+
canvas:
|
97
|
+
background_image: "/assets/images/bc_3.jpg"
|
98
|
+
header:
|
99
|
+
font_family: "Roboto, Bold"
|
100
|
+
color: "#333333"
|
101
|
+
content:
|
102
|
+
font_family: "Roboto, Bold"
|
103
|
+
color: "#333333"
|
104
|
+
force: false
|
105
|
+
domain: "igor.works"
|
106
|
+
```
|
107
|
+
|
108
|
+

|
109
|
+
|
90
110
|
|
91
111
|
## Contributing
|
92
112
|
|
data/examples/3.png
CHANGED
Binary file
|
data/examples/4.png
ADDED
Binary file
|
@@ -7,7 +7,8 @@ class JekyllOgImage::Config < Anyway::Config
|
|
7
7
|
attr_config force: false
|
8
8
|
attr_config verbose: false
|
9
9
|
attr_config canvas: {
|
10
|
-
background_color: "#FFFFFF"
|
10
|
+
background_color: "#FFFFFF",
|
11
|
+
background_image: nil
|
11
12
|
}
|
12
13
|
attr_config header: {
|
13
14
|
font_family: "Helvetica, Bold",
|
@@ -19,13 +20,11 @@ class JekyllOgImage::Config < Anyway::Config
|
|
19
20
|
}
|
20
21
|
attr_config :image
|
21
22
|
attr_config :domain
|
22
|
-
attr_config border_bottom
|
23
|
-
width: 20,
|
24
|
-
fill: [ "#211F1F", "#F4CBB2", "#AD5C51", "#9CDAF1", "#7DBBE6" ]
|
25
|
-
}
|
23
|
+
attr_config :border_bottom
|
26
24
|
|
27
25
|
coerce_types canvas: {
|
28
|
-
background_color: { type: :string }
|
26
|
+
background_color: { type: :string },
|
27
|
+
background_image: { type: :string }
|
29
28
|
}
|
30
29
|
|
31
30
|
coerce_types header: {
|
@@ -44,4 +43,8 @@ class JekyllOgImage::Config < Anyway::Config
|
|
44
43
|
width: { type: :integer },
|
45
44
|
fill: { type: :string, array: true }
|
46
45
|
}
|
46
|
+
|
47
|
+
def margin_bottom
|
48
|
+
80 + (border_bottom&.fetch("width", 0) || 0)
|
49
|
+
end
|
47
50
|
end
|
@@ -22,6 +22,14 @@ class JekyllOgImage::Element::Base
|
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
+
def calculate_ratio(image, width, height, mode)
|
26
|
+
if mode == :min
|
27
|
+
[ width.to_f / image.width, height.to_f / image.height ].min
|
28
|
+
else
|
29
|
+
[ width.to_f / image.width, height.to_f / image.height ].max
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
25
33
|
def composite_with_gravity(canvas, overlay, x, y)
|
26
34
|
if gravity_nw?
|
27
35
|
canvas.composite(overlay, :over, x: [ x ], y: [ y ]).flatten
|
@@ -3,8 +3,19 @@
|
|
3
3
|
require "vips"
|
4
4
|
|
5
5
|
class JekyllOgImage::Element::Canvas < JekyllOgImage::Element::Base
|
6
|
-
def initialize(width, height,
|
7
|
-
@canvas = Vips::Image.black(width, height).ifthenelse([ 0, 0, 0 ], hex_to_rgb(
|
6
|
+
def initialize(width, height, background_color: "#ffffff", background_image: nil)
|
7
|
+
@canvas = Vips::Image.black(width, height).ifthenelse([ 0, 0, 0 ], hex_to_rgb(background_color))
|
8
|
+
|
9
|
+
if background_image
|
10
|
+
overlay = Vips::Image.new_from_buffer(background_image, "")
|
11
|
+
|
12
|
+
ratio = calculate_ratio(overlay, width, height, :max)
|
13
|
+
overlay = overlay.resize(ratio)
|
14
|
+
|
15
|
+
@canvas = @canvas.composite(overlay, :over, x: [ 0 ], y: [ 0 ]).flatten
|
16
|
+
end
|
17
|
+
|
18
|
+
@canvas
|
8
19
|
end
|
9
20
|
|
10
21
|
def image(source, **opts, &block)
|
@@ -15,13 +15,13 @@ class JekyllOgImage::Element::Image < JekyllOgImage::Element::Base
|
|
15
15
|
image = Vips::Image.new_from_buffer(@source, "")
|
16
16
|
image = round_corners(image) if @radius
|
17
17
|
|
18
|
-
result = block.call(canvas, image) if block_given?
|
19
|
-
|
20
18
|
if @width && @height
|
21
19
|
ratio = calculate_ratio(image, @width, @height, :min)
|
22
20
|
image = image.resize(ratio)
|
23
21
|
end
|
24
22
|
|
23
|
+
result = block.call(canvas, image) if block_given?
|
24
|
+
|
25
25
|
x, y = result ? [ result.fetch(:x, 0), result.fetch(:y, 0) ] : [ 0, 0 ]
|
26
26
|
|
27
27
|
composite_with_gravity(canvas, image, x, y)
|
@@ -53,12 +53,4 @@ class JekyllOgImage::Element::Image < JekyllOgImage::Element::Base
|
|
53
53
|
mask = Vips::Image.new_from_buffer(mask, "")
|
54
54
|
image.bandjoin mask[3]
|
55
55
|
end
|
56
|
-
|
57
|
-
def calculate_ratio(image, width, height, mode)
|
58
|
-
if mode == :min
|
59
|
-
[ width.to_f / image.width, height.to_f / image.height ].min
|
60
|
-
else
|
61
|
-
[ width.to_f / image.width, height.to_f / image.height ].max
|
62
|
-
end
|
63
|
-
end
|
64
56
|
end
|
@@ -35,13 +35,21 @@ class JekyllOgImage::Generator < Jekyll::Generator
|
|
35
35
|
def generate_image_for_post(site, post, path)
|
36
36
|
date = post.date.strftime("%B %d, %Y")
|
37
37
|
|
38
|
+
background_image = if JekyllOgImage.config.canvas["background_image"]
|
39
|
+
File.read(File.join(site.config["source"], JekyllOgImage.config.canvas["background_image"]))
|
40
|
+
end
|
41
|
+
|
38
42
|
canvas = JekyllOgImage::Element::Canvas.new(1200, 600,
|
39
|
-
|
40
|
-
|
41
|
-
|
43
|
+
background_color: JekyllOgImage.config.canvas["background_color"],
|
44
|
+
background_image: background_image
|
45
|
+
)
|
46
|
+
|
47
|
+
if JekyllOgImage.config.border_bottom
|
48
|
+
canvas = canvas.border(JekyllOgImage.config.border_bottom["width"],
|
42
49
|
position: :bottom,
|
43
50
|
fill: JekyllOgImage.config.border_bottom["fill"]
|
44
51
|
)
|
52
|
+
end
|
45
53
|
|
46
54
|
if JekyllOgImage.config.image
|
47
55
|
canvas = canvas.image(
|
@@ -65,7 +73,7 @@ class JekyllOgImage::Generator < Jekyll::Generator
|
|
65
73
|
color: JekyllOgImage.config.content["color"],
|
66
74
|
dpi: 150,
|
67
75
|
font: JekyllOgImage.config.content["font_family"]
|
68
|
-
) { |_canvas, _text| { x: 80, y: post.data["tags"].any? ?
|
76
|
+
) { |_canvas, _text| { x: 80, y: post.data["tags"].any? ? JekyllOgImage.config.margin_bottom + 50 : JekyllOgImage.config.margin_bottom } }
|
69
77
|
|
70
78
|
if post.data["tags"].any?
|
71
79
|
tags = post.data["tags"].map { |tag| "##{tag}" }.join(" ")
|
@@ -75,7 +83,7 @@ class JekyllOgImage::Generator < Jekyll::Generator
|
|
75
83
|
color: JekyllOgImage.config.content["color"],
|
76
84
|
dpi: 150,
|
77
85
|
font: JekyllOgImage.config.content["font_family"]
|
78
|
-
) { |_canvas, _text| { x: 80, y:
|
86
|
+
) { |_canvas, _text| { x: 80, y: JekyllOgImage.config.margin_bottom } }
|
79
87
|
end
|
80
88
|
|
81
89
|
if JekyllOgImage.config.domain
|
@@ -87,7 +95,7 @@ class JekyllOgImage::Generator < Jekyll::Generator
|
|
87
95
|
) do |_canvas, _text|
|
88
96
|
{
|
89
97
|
x: 80,
|
90
|
-
y: post.data["tags"].any? ?
|
98
|
+
y: post.data["tags"].any? ? JekyllOgImage.config.margin_bottom + 50 : JekyllOgImage.config.margin_bottom
|
91
99
|
}
|
92
100
|
end
|
93
101
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jekyll-og-image
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Igor Alexandrov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-02-
|
11
|
+
date: 2024-02-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: jekyll-seo-tag
|
@@ -103,6 +103,7 @@ files:
|
|
103
103
|
- examples/1.png
|
104
104
|
- examples/2.png
|
105
105
|
- examples/3.png
|
106
|
+
- examples/4.png
|
106
107
|
- lib/jekyll-og-image.rb
|
107
108
|
- lib/jekyll_og_image.rb
|
108
109
|
- lib/jekyll_og_image/config.rb
|