jekyll-og-image 1.0.5 → 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9fc4622681cf9b4953d6cbd7de3b661ebd217de44c08205656e395386b14e4c9
4
- data.tar.gz: 26b864c6981a1b353de1e8e97de690870e2f2d9c531d56dac1bf97bc2efc0cde
3
+ metadata.gz: 3d7ab3e37756339d3435bb110e3e612476888bea4ba020115ebc25e45708e9d5
4
+ data.tar.gz: 2940f89d8f183a158d8cb4da4a0ee5859ae1f414acf272ad5928c7302ad2f494
5
5
  SHA512:
6
- metadata.gz: 7285bbd3562d0e2fa67a1f92c639d2ffa505e73d0d6b58c705217e8e7eefbb5930b9c01fec2c5d267f3448cd012e76ed5f2748b639d62bde290d796ab87d31d8
7
- data.tar.gz: beb92471fe217bc7c105fb3924940fee58031306cf628aac36ff8a4b61841ebaee406c8a85ce6aa903563fe3ca8dd489d68d0b3018f9797e77cb76da209d08ef
6
+ metadata.gz: 163fc1a8a585391ab60f6e233291497275b2902a0d13e397211af6a610606ad510e33e8d98fbb153ad1ee943cd86d00e5bcf359527a52c51c05bd51b97774a4e
7
+ data.tar.gz: 946b88643e7b584ab44114e7fc6e94578b53ccfe156c5758b93ae93099b2e442f13edc10c23c5541215ba229fa2b76fa69af8dcb186ef777e5745fb5c48b0573
data/.rspec_status CHANGED
@@ -1,5 +1,7 @@
1
- example_id | status | run_time |
2
- ----------------------------------- | ------ | --------------- |
3
- ./spec/jekyll_og_image_spec.rb[1:1] | passed | 0.01883 seconds |
4
- ./spec/jekyll_og_image_spec.rb[1:2] | passed | 0.31382 seconds |
5
- ./spec/jekyll_og_image_spec.rb[1:3] | passed | 0.07861 seconds |
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,6 +61,51 @@ og_image:
61
61
 
62
62
  ![Example 1](examples/1.png)
63
63
 
64
+ ### Background Color and Text Color
65
+
66
+ ```yaml
67
+ og_image:
68
+ output_dir: "/assets/og"
69
+ image: "/assets/images/igor.jpeg"
70
+ canvas:
71
+ background_color: "#F9E065"
72
+ header:
73
+ font_family: "Roboto, Bold"
74
+ color: "#333333"
75
+ content:
76
+ font_family: "Roboto, Regular"
77
+ color: "#333333"
78
+ force: false
79
+ domain: "igor.works"
80
+ border_bottom:
81
+ width: 50
82
+ fill:
83
+ - "#002B7F"
84
+ - "#FCD116"
85
+ - "#CE1126"
86
+ ```
87
+
88
+ ![Example 3](examples/3.png)
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
+ ![Example 4](examples/4.png)
64
109
 
65
110
 
66
111
  ## Contributing
data/examples/3.png ADDED
Binary file
data/examples/4.png ADDED
Binary file
@@ -5,11 +5,36 @@ 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 verbose: false
9
+ attr_config canvas: {
10
+ background_color: "#FFFFFF",
11
+ background_image: nil
12
+ }
13
+ attr_config header: {
14
+ font_family: "Helvetica, Bold",
15
+ color: "#2f313d"
16
+ }
17
+ attr_config content: {
18
+ font_family: "Helvetica, Regular",
19
+ color: "#535358"
20
+ }
8
21
  attr_config :image
9
22
  attr_config :domain
10
- attr_config border_bottom: {
11
- width: 20,
12
- fill: [ "#211F1F", "#F4CBB2", "#AD5C51", "#9CDAF1", "#7DBBE6" ]
23
+ attr_config :border_bottom
24
+
25
+ coerce_types canvas: {
26
+ background_color: { type: :string },
27
+ background_image: { type: :string }
28
+ }
29
+
30
+ coerce_types header: {
31
+ font_family: { type: :string },
32
+ color: { type: :string }
33
+ }
34
+
35
+ coerce_types content: {
36
+ font_family: { type: :string },
37
+ color: { type: :string }
13
38
  }
14
39
 
15
40
  coerce_types image: { type: :string }
@@ -18,4 +43,8 @@ class JekyllOgImage::Config < Anyway::Config
18
43
  width: { type: :integer },
19
44
  fill: { type: :string, array: true }
20
45
  }
46
+
47
+ def margin_bottom
48
+ 80 + (border_bottom&.fetch("width", 0) || 0)
49
+ end
21
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, color: "#ffffff")
7
- @canvas = Vips::Image.black(width, height).ifthenelse([ 0, 0, 0 ], hex_to_rgb(color))
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
@@ -15,10 +15,10 @@ class JekyllOgImage::Generator < Jekyll::Generator
15
15
  path = File.join(site.config["source"], base_path, "#{post.data['slug']}.png")
16
16
 
17
17
  if !File.exist?(path) || JekyllOgImage.config.force?
18
- Jekyll.logger.info "Jekyll Og Image:", "Generating image #{path}"
18
+ Jekyll.logger.info "Jekyll Og Image:", "Generating image #{path}" if JekyllOgImage.config.verbose?
19
19
  generate_image_for_post(site, post, path)
20
20
  else
21
- Jekyll.logger.info "Jekyll Og Image:", "Skipping image generation #{path} as it already exists."
21
+ Jekyll.logger.info "Jekyll Og Image:", "Skipping image generation #{path} as it already exists." if JekyllOgImage.config.verbose?
22
22
  end
23
23
 
24
24
  post.data["image"] ||= {
@@ -35,11 +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
- canvas = JekyllOgImage::Element::Canvas.new(1200, 600)
39
- .border(JekyllOgImage.config.border_bottom["width"],
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
+
42
+ canvas = JekyllOgImage::Element::Canvas.new(1200, 600,
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"],
40
49
  position: :bottom,
41
50
  fill: JekyllOgImage.config.border_bottom["fill"]
42
51
  )
52
+ end
43
53
 
44
54
  if JekyllOgImage.config.image
45
55
  canvas = canvas.image(
@@ -53,34 +63,39 @@ class JekyllOgImage::Generator < Jekyll::Generator
53
63
 
54
64
  canvas = canvas.text(post.data["title"],
55
65
  width: JekyllOgImage.config.image ? 870 : 1040,
56
- color: "#2f313d",
66
+ color: JekyllOgImage.config.header["color"],
57
67
  dpi: 400,
58
- font: "Helvetica, Bold"
68
+ font: JekyllOgImage.config.header["font_family"]
59
69
  ) { |_canvas, _text| { x: 80, y: 100 } }
60
70
 
61
71
  canvas = canvas.text(date,
62
72
  gravity: :sw,
63
- color: "#535358",
73
+ color: JekyllOgImage.config.content["color"],
64
74
  dpi: 150,
65
- font: "Helvetica, Regular"
66
- ) { |_canvas, _text| { x: 80, y: post.data["tags"].any? ? 150 : 100 } }
75
+ font: JekyllOgImage.config.content["font_family"]
76
+ ) { |_canvas, _text| { x: 80, y: post.data["tags"].any? ? JekyllOgImage.config.margin_bottom + 50 : JekyllOgImage.config.margin_bottom } }
67
77
 
68
78
  if post.data["tags"].any?
69
79
  tags = post.data["tags"].map { |tag| "##{tag}" }.join(" ")
70
80
 
71
81
  canvas = canvas.text(tags,
72
82
  gravity: :sw,
73
- color: "#535358",
83
+ color: JekyllOgImage.config.content["color"],
74
84
  dpi: 150,
75
- font: "Helvetica, Regular"
76
- ) { |_canvas, _text| { x: 80, y: 100 } }
85
+ font: JekyllOgImage.config.content["font_family"]
86
+ ) { |_canvas, _text| { x: 80, y: JekyllOgImage.config.margin_bottom } }
77
87
  end
78
88
 
79
89
  if JekyllOgImage.config.domain
80
- canvas = canvas.text(JekyllOgImage.config.domain, gravity: :se, color: "#535358", dpi: 150, font: "Helvetica, Regular") do |_canvas, _text|
90
+ canvas = canvas.text(JekyllOgImage.config.domain,
91
+ gravity: :se,
92
+ color: JekyllOgImage.config.content["color"],
93
+ dpi: 150,
94
+ font: JekyllOgImage.config.content["font_family"]
95
+ ) do |_canvas, _text|
81
96
  {
82
97
  x: 80,
83
- y: post.data["tags"].any? ? 150 : 100
98
+ y: post.data["tags"].any? ? JekyllOgImage.config.margin_bottom + 50 : JekyllOgImage.config.margin_bottom
84
99
  }
85
100
  end
86
101
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module JekyllOgImage
4
- VERSION = "1.0.5"
4
+ VERSION = "1.2.0"
5
5
  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.0.5
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Igor Alexandrov
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-02-06 00:00:00.000000000 Z
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
@@ -86,7 +86,7 @@ dependencies:
86
86
  - - "<"
87
87
  - !ruby/object:Gem::Version
88
88
  version: '5.0'
89
- description:
89
+ description:
90
90
  email:
91
91
  - igor.alexandrov@gmail.com
92
92
  executables: []
@@ -102,7 +102,8 @@ files:
102
102
  - Rakefile
103
103
  - examples/1.png
104
104
  - examples/2.png
105
- - jekyll-og-image.gemspec
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
@@ -118,7 +119,7 @@ licenses:
118
119
  - MIT
119
120
  metadata:
120
121
  homepage_uri: https://github.com/igor-alexandrov/jekyll-og-image
121
- post_install_message:
122
+ post_install_message:
122
123
  rdoc_options: []
123
124
  require_paths:
124
125
  - lib
@@ -133,8 +134,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
133
134
  - !ruby/object:Gem::Version
134
135
  version: '0'
135
136
  requirements: []
136
- rubygems_version: 3.5.4
137
- signing_key:
137
+ rubygems_version: 3.5.3
138
+ signing_key:
138
139
  specification_version: 4
139
140
  summary: Jekyll plugin to generate GitHub-style open graph images
140
141
  test_files: []
@@ -1,34 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "lib/jekyll_og_image/version"
4
-
5
- Gem::Specification.new do |spec|
6
- spec.name = "jekyll-og-image"
7
- spec.version = JekyllOgImage::VERSION
8
- spec.authors = [ "Igor Alexandrov" ]
9
- spec.email = [ "igor.alexandrov@gmail.com" ]
10
-
11
- spec.summary = "Jekyll plugin to generate GitHub-style open graph images"
12
- spec.homepage = "https://github.com/igor-alexandrov/jekyll-og-image"
13
- spec.license = "MIT"
14
- spec.required_ruby_version = ">= 3.2.0"
15
-
16
- spec.metadata["homepage_uri"] = spec.homepage
17
-
18
- # Specify which files should be added to the gem when it is released.
19
- # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
20
- spec.files = Dir.chdir(__dir__) do
21
- `git ls-files -z`.split("\x0").reject do |f|
22
- (File.expand_path(f) == __FILE__) ||
23
- f.start_with?(*%w[bin/ test/ spec/ features/ .git .github appveyor Gemfile])
24
- end
25
- end
26
-
27
- spec.require_paths = [ "lib" ]
28
-
29
- spec.add_dependency "jekyll-seo-tag", "~> 2.8"
30
- spec.add_dependency "zeitwerk", "~> 2.6"
31
- spec.add_dependency "anyway_config", "~> 2.6"
32
- spec.add_dependency "ruby-vips", "~> 2.2.0"
33
- spec.add_runtime_dependency "jekyll", ">= 3.4", "< 5.0"
34
- end