jekyll-og-image 1.0.3 → 1.0.4
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/README.md +2 -0
- data/examples/1.png +0 -0
- data/lib/jekyll_og_image/config.rb +3 -0
- data/lib/jekyll_og_image/element/base.rb +8 -0
- data/lib/jekyll_og_image/element/canvas.rb +43 -0
- data/lib/jekyll_og_image/element/image.rb +43 -21
- data/lib/jekyll_og_image/element/text.rb +0 -8
- data/lib/jekyll_og_image/generator.rb +32 -21
- data/lib/jekyll_og_image/version.rb +1 -1
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: eeccdc0ae99d37ef260733506fbad4ebf5c60f925cdb2514acb91dcb346d1673
|
4
|
+
data.tar.gz: b8b291f97eddc6a0be9dc080d2f999be0bb027224bf5bf2953f941a89491b63a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b15a8205247be628cf982c6efb8f9127cd0ba2eb1d2421e7f7f702802e4960a14317612cfffa010d41972e1b2ba2671eae82f19092552f93b71003995096a21a
|
7
|
+
data.tar.gz: 47b2a2845a7e6bd2a25ef2f249af3fcd1e78adf9179366680e173fc0228aaa5e564be2f5935a0752b3c2c5dd8061b6b17959d7f592fa50ca08d54006baca272c
|
data/README.md
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
A Jekyll plugin to automatically generate open graph images for posts.
|
4
4
|
|
5
|
+
[](https://badge.fury.io/rb/jekyll-og-image)
|
5
6
|
[](https://github.com/igor-alexandrov/jekyll-og-image/actions/workflows/lint.yml)
|
6
7
|
[](https://github.com/igor-alexandrov/jekyll-og-image/actions/workflows/specs.yml)
|
7
8
|
|
@@ -46,6 +47,7 @@ og_image:
|
|
46
47
|
```yaml
|
47
48
|
og_image:
|
48
49
|
output_dir: "assets/images/og"
|
50
|
+
image: "/assets/images/igor.jpeg"
|
49
51
|
domain: "igor.works"
|
50
52
|
border_bottom:
|
51
53
|
width: 20
|
data/examples/1.png
CHANGED
Binary file
|
@@ -5,12 +5,15 @@ require "anyway_config"
|
|
5
5
|
class JekyllOgImage::Config < Anyway::Config
|
6
6
|
attr_config output_dir: "assets/images/og"
|
7
7
|
attr_config force: false
|
8
|
+
attr_config :image
|
8
9
|
attr_config :domain
|
9
10
|
attr_config border_bottom: {
|
10
11
|
width: 20,
|
11
12
|
fill: [ "#211F1F", "#F4CBB2", "#AD5C51", "#9CDAF1", "#7DBBE6" ]
|
12
13
|
}
|
13
14
|
|
15
|
+
coerce_types image: { type: :string }
|
16
|
+
|
14
17
|
coerce_types border_bottom: {
|
15
18
|
width: { type: :integer },
|
16
19
|
fill: { type: :string, array: true }
|
@@ -1,6 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
class JekyllOgImage::Element::Base
|
4
|
+
VALID_GRAVITY = %i[nw ne sw se].freeze
|
5
|
+
|
4
6
|
private
|
5
7
|
|
6
8
|
def hex_to_rgb(input)
|
@@ -13,4 +15,10 @@ class JekyllOgImage::Element::Base
|
|
13
15
|
raise ArgumentError, "Unknown input #{input.inspect}"
|
14
16
|
end
|
15
17
|
end
|
18
|
+
|
19
|
+
def validate_gravity!
|
20
|
+
unless VALID_GRAVITY.include?(@gravity)
|
21
|
+
raise ArgumentError, "Invalid gravity: #{@gravity.inspect}"
|
22
|
+
end
|
23
|
+
end
|
16
24
|
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "vips"
|
4
|
+
|
5
|
+
class JekyllOgImage::Element::Canvas < JekyllOgImage::Element::Base
|
6
|
+
def initialize(width, height, color: "#ffffff")
|
7
|
+
@canvas = Vips::Image.black(width, height).ifthenelse([ 0, 0, 0 ], hex_to_rgb(color))
|
8
|
+
end
|
9
|
+
|
10
|
+
def image(source, **opts, &block)
|
11
|
+
image = JekyllOgImage::Element::Image.new(
|
12
|
+
@canvas, source, **opts
|
13
|
+
)
|
14
|
+
|
15
|
+
@canvas = image.apply(&block)
|
16
|
+
|
17
|
+
self
|
18
|
+
end
|
19
|
+
|
20
|
+
def text(message, **opts, &block)
|
21
|
+
text = JekyllOgImage::Element::Text.new(
|
22
|
+
@canvas, message, **opts
|
23
|
+
)
|
24
|
+
|
25
|
+
@canvas = text.apply(&block)
|
26
|
+
|
27
|
+
self
|
28
|
+
end
|
29
|
+
|
30
|
+
def border(width, position: :bottom, fill: "#000000")
|
31
|
+
@canvas = JekyllOgImage::Element::Border.new(
|
32
|
+
@canvas, width,
|
33
|
+
position: position,
|
34
|
+
fill: fill
|
35
|
+
).apply
|
36
|
+
|
37
|
+
self
|
38
|
+
end
|
39
|
+
|
40
|
+
def save(filename)
|
41
|
+
@canvas.write_to_file(filename)
|
42
|
+
end
|
43
|
+
end
|
@@ -1,33 +1,55 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "vips"
|
4
|
-
|
5
3
|
class JekyllOgImage::Element::Image < JekyllOgImage::Element::Base
|
6
|
-
def initialize(
|
7
|
-
@canvas =
|
4
|
+
def initialize(canvas, source, gravity: :nw, width:, height:)
|
5
|
+
@canvas = canvas
|
6
|
+
@gravity = gravity
|
7
|
+
@source = source
|
8
|
+
@width = width
|
9
|
+
@height = height
|
10
|
+
|
11
|
+
validate_gravity!
|
8
12
|
end
|
9
13
|
|
10
|
-
def
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
14
|
+
def apply(&block)
|
15
|
+
image = Vips::Image.new_from_buffer(@source, "")
|
16
|
+
result = block.call(@canvas, image) if block_given?
|
17
|
+
|
18
|
+
if @width && @height
|
19
|
+
ratio = calculate_ratio(image, @width, @height, :min)
|
20
|
+
image = image.resize(ratio)
|
21
|
+
end
|
22
|
+
|
23
|
+
x, y = result ? [ result.fetch(:x, 0), result.fetch(:y, 0) ] : [ 0, 0 ]
|
24
|
+
|
25
|
+
if gravity_nw?
|
26
|
+
@canvas.composite(image, :over, x: [ x ], y: [ y ]).flatten
|
27
|
+
elsif gravity_ne?
|
28
|
+
x = @canvas.width - image.width - x
|
29
|
+
@canvas.composite(image, :over, x: [ x ], y: [ y ]).flatten
|
30
|
+
elsif gravity_sw?
|
31
|
+
y = @canvas.height - image.height - y
|
32
|
+
@canvas.composite(image, :over, x: [ x ], y: [ y ]).flatten
|
33
|
+
elsif gravity_se?
|
34
|
+
x = @canvas.width - image.width - x
|
35
|
+
y = @canvas.height - image.height - y
|
36
|
+
@canvas.composite(image, :over, x: [ x ], y: [ y ]).flatten
|
37
|
+
end
|
18
38
|
end
|
19
39
|
|
20
|
-
|
21
|
-
@canvas = JekyllOgImage::Element::Border.new(
|
22
|
-
@canvas, width,
|
23
|
-
position: position,
|
24
|
-
fill: fill
|
25
|
-
).apply
|
40
|
+
private
|
26
41
|
|
27
|
-
|
42
|
+
VALID_GRAVITY.each do |gravity|
|
43
|
+
define_method("gravity_#{gravity}?") do
|
44
|
+
@gravity == gravity
|
45
|
+
end
|
28
46
|
end
|
29
47
|
|
30
|
-
def
|
31
|
-
|
48
|
+
def calculate_ratio(image, width, height, mode)
|
49
|
+
if mode == :min
|
50
|
+
[ width.to_f / image.width, height.to_f / image.height ].min
|
51
|
+
else
|
52
|
+
[ width.to_f / image.width, height.to_f / image.height ].max
|
53
|
+
end
|
32
54
|
end
|
33
55
|
end
|
@@ -1,8 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
class JekyllOgImage::Element::Text < JekyllOgImage::Element::Base
|
4
|
-
VALID_GRAVITY = %i[nw ne sw se].freeze
|
5
|
-
|
6
4
|
def initialize(canvas, message, gravity: :nw, width: nil, dpi: nil, color: "#000000", font: nil)
|
7
5
|
@canvas = canvas
|
8
6
|
@gravity = gravity
|
@@ -49,10 +47,4 @@ class JekyllOgImage::Element::Text < JekyllOgImage::Element::Base
|
|
49
47
|
@gravity == gravity
|
50
48
|
end
|
51
49
|
end
|
52
|
-
|
53
|
-
def validate_gravity!
|
54
|
-
unless VALID_GRAVITY.include?(@gravity)
|
55
|
-
raise ArgumentError, "Invalid gravity: #{@gravity.inspect}"
|
56
|
-
end
|
57
|
-
end
|
58
50
|
end
|
@@ -35,37 +35,48 @@ 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
|
-
|
38
|
+
canvas = JekyllOgImage::Element::Canvas.new(1200, 600)
|
39
39
|
.border(JekyllOgImage.config.border_bottom["width"],
|
40
40
|
position: :bottom,
|
41
41
|
fill: JekyllOgImage.config.border_bottom["fill"]
|
42
42
|
)
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
43
|
+
|
44
|
+
if JekyllOgImage.config.image
|
45
|
+
canvas = canvas.image(
|
46
|
+
File.read(File.join(site.config["source"], JekyllOgImage.config.image)),
|
47
|
+
gravity: :ne,
|
48
|
+
width: 150,
|
49
|
+
height: 150
|
50
|
+
) { |_canvas, _text| { x: 80, y: 100 } }
|
51
|
+
end
|
52
|
+
|
53
|
+
canvas = canvas.text(post.data["title"],
|
54
|
+
width: JekyllOgImage.config.image ? 870 : 1040,
|
55
|
+
color: "#2f313d",
|
56
|
+
dpi: 400,
|
57
|
+
font: "Helvetica, Bold"
|
58
|
+
) { |_canvas, _text| { x: 80, y: 100 } }
|
59
|
+
|
60
|
+
canvas = canvas.text(date,
|
61
|
+
gravity: :sw,
|
62
|
+
color: "#535358",
|
63
|
+
dpi: 150,
|
64
|
+
font: "Helvetica, Regular"
|
65
|
+
) { |_canvas, _text| { x: 80, y: post.data["tags"].any? ? 150 : 100 } }
|
55
66
|
|
56
67
|
if post.data["tags"].any?
|
57
68
|
tags = post.data["tags"].map { |tag| "##{tag}" }.join(" ")
|
58
69
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
70
|
+
canvas = canvas.text(tags,
|
71
|
+
gravity: :sw,
|
72
|
+
color: "#535358",
|
73
|
+
dpi: 150,
|
74
|
+
font: "Helvetica, Regular"
|
75
|
+
) { |_canvas, _text| { x: 80, y: 100 } }
|
65
76
|
end
|
66
77
|
|
67
78
|
if JekyllOgImage.config.domain
|
68
|
-
|
79
|
+
canvas = canvas.text(JekyllOgImage.config.domain, gravity: :se, color: "#535358", dpi: 150, font: "Helvetica, Regular") do |_canvas, _text|
|
69
80
|
{
|
70
81
|
x: 80,
|
71
82
|
y: post.data["tags"].any? ? 150 : 100
|
@@ -73,6 +84,6 @@ class JekyllOgImage::Generator < Jekyll::Generator
|
|
73
84
|
end
|
74
85
|
end
|
75
86
|
|
76
|
-
|
87
|
+
canvas.save(path)
|
77
88
|
end
|
78
89
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jekyll-og-image
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Igor Alexandrov
|
@@ -108,6 +108,7 @@ files:
|
|
108
108
|
- lib/jekyll_og_image/config.rb
|
109
109
|
- lib/jekyll_og_image/element/base.rb
|
110
110
|
- lib/jekyll_og_image/element/border.rb
|
111
|
+
- lib/jekyll_og_image/element/canvas.rb
|
111
112
|
- lib/jekyll_og_image/element/image.rb
|
112
113
|
- lib/jekyll_og_image/element/text.rb
|
113
114
|
- lib/jekyll_og_image/generator.rb
|