jekyll-linkpreview 0.6.0.rc1 → 0.7.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/.github/workflows/release.yaml +7 -1
- data/.github/workflows/test.yaml +28 -2
- data/Gemfile +9 -0
- data/README.md +42 -16
- data/jekyll-linkpreview.gemspec +0 -1
- data/lib/jekyll-linkpreview/version.rb +1 -1
- data/lib/jekyll-linkpreview.rb +72 -84
- metadata +4 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3644c879680eba2cb17840f40258ec2adeb0493505ca28572cdcadcc72c87ced
|
4
|
+
data.tar.gz: 3925c9a5330bc589b239908cde01dc6be7493d05d35bf6bf2f8e52e3538b643a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4246f72fc2c59ad23149b2c187864533f0fe85e09d1ca7f84feef875ad2404e6861aa6a37255f3ec3e76d2edff367fb5a6061d3f8c497c117edbdafba9801a5f
|
7
|
+
data.tar.gz: 689f9e31a23fb6846db6cb4854adabc464a890816418a988a1732d5cc9b4e34bc7df143774ec274e693d66f51d9af5d41b52ec731b8d3dab980afcd816378e0c
|
@@ -15,6 +15,9 @@ jobs:
|
|
15
15
|
uses: actions/checkout@v3
|
16
16
|
with:
|
17
17
|
fetch-depth: 2
|
18
|
+
# See https://github.com/actions/runner-images/issues/6775.
|
19
|
+
- name: Suppress 'detected dubious ownership' error.
|
20
|
+
run: git config --global --add safe.directory ${GITHUB_WORKSPACE}
|
18
21
|
- id: check-release
|
19
22
|
name: Decide whether to release
|
20
23
|
run: |
|
@@ -34,6 +37,9 @@ jobs:
|
|
34
37
|
steps:
|
35
38
|
- name: Checkout
|
36
39
|
uses: actions/checkout@v3
|
40
|
+
# See https://github.com/actions/runner-images/issues/6775.
|
41
|
+
- name: Suppress 'detected dubious ownership' error.
|
42
|
+
run: git config --global --add safe.directory ${GITHUB_WORKSPACE}
|
37
43
|
- env:
|
38
44
|
RUBYGEMS_API_KEY: ${{ secrets.RUBYGEMS_API_KEY }}
|
39
45
|
name: Set credentials for RubyGems
|
@@ -43,7 +49,7 @@ jobs:
|
|
43
49
|
chmod 0600 ~/.gem/credentials
|
44
50
|
- name: Configure git
|
45
51
|
run: |
|
46
|
-
git config --global user.email "yusuke.nishioka.0713@gmail
|
52
|
+
git config --global user.email "yusuke.nishioka.0713@gmail.com"
|
47
53
|
git config --global user.name "Yusuke Nishioka"
|
48
54
|
- name: Install dependencies
|
49
55
|
run: bundle install
|
data/.github/workflows/test.yaml
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
name: Test
|
2
|
-
on:
|
2
|
+
on:
|
3
|
+
pull_request:
|
4
|
+
branches:
|
5
|
+
- master
|
6
|
+
push:
|
7
|
+
branches:
|
8
|
+
- master
|
3
9
|
jobs:
|
4
10
|
test:
|
5
11
|
container:
|
@@ -7,7 +13,7 @@ jobs:
|
|
7
13
|
runs-on: ubuntu-latest
|
8
14
|
strategy:
|
9
15
|
matrix:
|
10
|
-
ruby: ["2.7", "3.1"]
|
16
|
+
ruby: ["2.7", "3.1", "3.2"]
|
11
17
|
appraisal:
|
12
18
|
- jekyll-35
|
13
19
|
- jekyll-36
|
@@ -28,9 +34,29 @@ jobs:
|
|
28
34
|
appraisal: jekyll-37
|
29
35
|
- ruby: "3.1"
|
30
36
|
appraisal: jekyll-38
|
37
|
+
- ruby: "3.2"
|
38
|
+
appraisal: jekyll-35
|
39
|
+
- ruby: "3.2"
|
40
|
+
appraisal: jekyll-36
|
41
|
+
- ruby: "3.2"
|
42
|
+
appraisal: jekyll-37
|
43
|
+
- ruby: "3.2"
|
44
|
+
appraisal: jekyll-38
|
31
45
|
steps:
|
32
46
|
- name: Checkout
|
33
47
|
uses: actions/checkout@v3
|
48
|
+
# See https://github.com/actions/runner-images/issues/6775.
|
49
|
+
- name: Suppress 'detected dubious ownership' error
|
50
|
+
run: git config --global --add safe.directory ${GITHUB_WORKSPACE}
|
51
|
+
- if: matrix.ruby == '2.7'
|
52
|
+
name: Update RubyGems version
|
53
|
+
# sass-embedded 1.57.1, which is one of dependencies of jekyll-sass-converter 3.0,
|
54
|
+
# requires rubygems version >= 3.3.22
|
55
|
+
# (see https://jekyllrb.com/news/2022/12/21/jekyll-sass-converter-3.0-released/
|
56
|
+
# for the jekyll-sass-converter 3.0 release).
|
57
|
+
# Just running `gem update --system` upgrades rubygems version to '>= 2.4',
|
58
|
+
# which appraisal 2.4.1 can't work with.
|
59
|
+
run: gem update --system 3.3.22
|
34
60
|
- name: Install dependencies
|
35
61
|
run: bundle install
|
36
62
|
- name: Install dependencies for each appraisal
|
data/Gemfile
CHANGED
@@ -2,3 +2,12 @@ source "https://rubygems.org"
|
|
2
2
|
|
3
3
|
# Specify your gem's dependencies in jekyll-linkpreview.gemspec
|
4
4
|
gemspec
|
5
|
+
|
6
|
+
# The issue that appraisal 2.4.1 can't work with bundler >= 2.4 was solved
|
7
|
+
# (see https://github.com/thoughtbot/appraisal/issues/199 for details),
|
8
|
+
# but a new version has not been released yet as of Apr 2023.
|
9
|
+
# As it's not possible to install a gem from a git repository in the gemspec file,
|
10
|
+
# appraisal is being installed in Gemfile.
|
11
|
+
group :development do
|
12
|
+
gem 'appraisal', git: 'https://github.com/thoughtbot/appraisal'
|
13
|
+
end
|
data/README.md
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# Jekyll::Linkpreview
|
2
2
|
|
3
|
-
[](https://github.com/ysk24ok/jekyll-linkpreview/actions/workflows/test.yaml)
|
4
|
+
[](https://github.com/ysk24ok/jekyll-linkpreview/actions/workflows/release.yaml)
|
4
5
|
|
5
6
|
Jekyll plugin to generate link preview by `{% linkpreview %}` tag. The plugin fetches [Open Graph protocol](http://ogp.me/) metadata of the designated page to generate preview. The og properties are saved as JSON for caching and it is used when rebuilding the site.
|
6
7
|
|
@@ -49,28 +50,53 @@ You can override the default templates used for generating previews, both in cas
|
|
49
50
|
|
50
51
|
### Template for pages where Open Graph protocol metadata exists
|
51
52
|
|
52
|
-
|
53
|
+
1. Place `linkpreview.html` file inside `_includes/` folder of your Jekyll site (`_includes/linkpreview.html`)
|
53
54
|
* The folder is the same one you would store files for use with `{% include fragment.html %}` tag.
|
54
55
|
Therefore, it *must* be under the [site's source](https://jekyllrb.com/docs/configuration/options/).
|
55
56
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
57
|
+
2. Use built-in variables to extract data which you would like to render. Available variables are:
|
58
|
+
* basic metadata
|
59
|
+
* `{{ title }}` for `og:title`
|
60
|
+
* `{{ type }}` for `og:type`
|
61
|
+
* `{{ image }}` for `og:image`
|
62
|
+
* `{{ url }}` for `og:url`
|
63
|
+
* optional metadata
|
64
|
+
* `{{ description }}` for `og:description`
|
65
|
+
* `{{ determiner }}` for `og:determiner`
|
66
|
+
* `{{ locale }}` for `og:locale`
|
67
|
+
* `{{ locale_alternate }}` for `og:locale:alternate`
|
68
|
+
* `{{ site_name }}` for `og:site_name`
|
69
|
+
* image
|
70
|
+
* `{{ image }}` for `og:image`
|
71
|
+
* `{{ image_secure_url }}` for `og:image:secure_url`
|
72
|
+
* `{{ image_type }}` for `og:image:type`
|
73
|
+
* `{{ image_width }}` for `og:image:width`
|
74
|
+
* `{{ image_height }}` for `og:image:height`
|
75
|
+
* `{{ image_alt }}` for `og:image:alt`
|
76
|
+
* video
|
77
|
+
* `{{ video }}` for `og:video`
|
78
|
+
* `{{ video_secure_url }}` for `og:video:secure_url`
|
79
|
+
* `{{ video_type }}` for `og:video:type`
|
80
|
+
* `{{ video_width }}` for `og:video:width`
|
81
|
+
* `{{ video_height }}` for `og:video:height`
|
82
|
+
* audio
|
83
|
+
* `{{ audio }}` for `og:audio`
|
84
|
+
* `{{ audio_secure_url }}` for `og:audio:secure_url`
|
85
|
+
* `{{ audio_type }}` for `og:audio:type`
|
86
|
+
* non og metadata
|
87
|
+
* `{{ domain }}`
|
62
88
|
|
63
89
|
### Template for pages where Open Graph protocol metadata does not exist
|
64
90
|
|
65
91
|
1. Place `linkpreview_nog.html` file inside `_includes/` folder of your Jekyll site (`_includes/linkpreview_nog.html`)
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
92
|
+
* The folder is the same one you would store files for use with `{% include fragment.html %}` tag.
|
93
|
+
Therefore, it *must* be under the [site's source](https://jekyllrb.com/docs/configuration/options/).
|
94
|
+
|
95
|
+
2. Use built-in variables to extract data which you would like to render. Available variables are:
|
96
|
+
* `{{ title }}`
|
97
|
+
* `{{ url }}`
|
98
|
+
* `{{ description }}`
|
99
|
+
* `{{ domain }}`
|
74
100
|
|
75
101
|
## Development
|
76
102
|
|
data/jekyll-linkpreview.gemspec
CHANGED
@@ -24,6 +24,5 @@ Gem::Specification.new do |spec|
|
|
24
24
|
spec.add_development_dependency "rake", "~> 12.3.3"
|
25
25
|
spec.add_development_dependency "rspec", "~> 3.0"
|
26
26
|
spec.add_development_dependency "rspec-parameterized", "~> 0.5.2"
|
27
|
-
spec.add_development_dependency "appraisal", "~> 2.2.0"
|
28
27
|
spec.add_development_dependency "wwtd", "~> 1.4.1"
|
29
28
|
end
|
data/lib/jekyll-linkpreview.rb
CHANGED
@@ -7,61 +7,81 @@ require "jekyll-linkpreview/version"
|
|
7
7
|
|
8
8
|
module Jekyll
|
9
9
|
module Linkpreview
|
10
|
-
class
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
@title = title
|
15
|
-
@url = url
|
16
|
-
@image = image
|
17
|
-
@description = description
|
18
|
-
@domain = domain
|
10
|
+
class Properties
|
11
|
+
def initialize(properties, template_file)
|
12
|
+
@properties = properties
|
13
|
+
@template_file = template_file
|
19
14
|
end
|
20
15
|
|
21
16
|
def to_hash()
|
22
|
-
|
23
|
-
'title' => @title,
|
24
|
-
'url' => @url,
|
25
|
-
'image' => @image,
|
26
|
-
'description' => @description,
|
27
|
-
'domain' => @domain,
|
28
|
-
}
|
17
|
+
@properties
|
29
18
|
end
|
30
19
|
|
31
20
|
def to_hash_for_custom_template()
|
32
|
-
{
|
33
|
-
|
34
|
-
|
35
|
-
'
|
36
|
-
'
|
37
|
-
'link_domain' => @domain
|
21
|
+
hash_for_custom_template = {}
|
22
|
+
@properties.each{ |key, value|
|
23
|
+
hash_for_custom_template[key] = value
|
24
|
+
# NOTE: 'link_*' variables will be deleted in v1.0.0.
|
25
|
+
hash_for_custom_template['link_' + key] = value
|
38
26
|
}
|
27
|
+
hash_for_custom_template
|
39
28
|
end
|
40
29
|
|
41
30
|
def template_file()
|
42
|
-
|
31
|
+
@template_file
|
43
32
|
end
|
44
33
|
end
|
45
34
|
|
46
35
|
class OpenGraphPropertiesFactory
|
36
|
+
@@template_file = 'linkpreview.html'
|
37
|
+
|
38
|
+
def self.template_file
|
39
|
+
@@template_file
|
40
|
+
end
|
41
|
+
|
47
42
|
def from_page(page)
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
43
|
+
properties = page.meta_tags['property']
|
44
|
+
og_properties = {
|
45
|
+
# basic metadata (https://ogp.me/#metadata)
|
46
|
+
'title' => get_property(properties, 'og:title'),
|
47
|
+
'type' => get_property(properties, 'og:type'),
|
48
|
+
'url' => get_property(properties, 'og:url'),
|
49
|
+
'image' => convert_to_absolute_url(get_property(properties, 'og:image'), page.root_url),
|
50
|
+
# optional metadata (https://ogp.me/#optional)
|
51
|
+
## image
|
52
|
+
'image_secure_url' => convert_to_absolute_url(get_property(properties, 'og:image:secure_url'), page.root_url),
|
53
|
+
'image_type' => get_property(properties, 'og:image:type'),
|
54
|
+
'image_width' => get_property(properties, 'og:image:width'),
|
55
|
+
'image_height' => get_property(properties, 'og:image:height'),
|
56
|
+
'image_alt' => get_property(properties, 'og:image:alt'),
|
57
|
+
## video
|
58
|
+
'video' => convert_to_absolute_url(get_property(properties, 'og:video'), page.root_url),
|
59
|
+
'video_secure_url' => convert_to_absolute_url(get_property(properties, 'og:video:secure_url'), page.root_url),
|
60
|
+
'video_type' => get_property(properties, 'og:video:type'),
|
61
|
+
'video_width' => get_property(properties, 'og:video:width'),
|
62
|
+
'video_height' => get_property(properties, 'og:video:height'),
|
63
|
+
## audio
|
64
|
+
'audio' => convert_to_absolute_url(get_property(properties, 'og:audio'), page.root_url),
|
65
|
+
'audio_secure_url' => convert_to_absolute_url(get_property(properties, 'og:audio:secure_url'), page.root_url),
|
66
|
+
'audio_type' => get_property(properties, 'og:audio:type'),
|
67
|
+
## other optional metadata
|
68
|
+
'description' => get_property(properties, 'og:description'),
|
69
|
+
'determiner' => get_property(properties, 'og:determiner'),
|
70
|
+
'locale' => get_property(properties, 'og:locale'),
|
71
|
+
'locale_alternate' => get_property(properties, 'og:locale:alternate'),
|
72
|
+
'site_name' => get_property(properties, 'og:site_name'),
|
73
|
+
# not defined in OGP
|
74
|
+
'domain' => page.host,
|
75
|
+
}
|
76
|
+
Properties.new(og_properties, @@template_file)
|
56
77
|
end
|
57
78
|
|
58
79
|
def from_hash(hash)
|
59
|
-
|
60
|
-
hash['title'], hash['url'], hash['image'], hash['description'], hash['domain'])
|
80
|
+
Properties.new(hash, @@template_file)
|
61
81
|
end
|
62
82
|
|
63
83
|
private
|
64
|
-
def
|
84
|
+
def get_property(properties, key)
|
65
85
|
if !properties.key? key then
|
66
86
|
return nil
|
67
87
|
end
|
@@ -81,57 +101,24 @@ module Jekyll
|
|
81
101
|
end
|
82
102
|
end
|
83
103
|
|
84
|
-
class
|
104
|
+
class NonOpenGraphPropertiesFactory
|
85
105
|
@@template_file = 'linkpreview_nog.html'
|
86
106
|
|
87
|
-
def
|
88
|
-
@title = title
|
89
|
-
@url = url
|
90
|
-
@description = description
|
91
|
-
@domain = domain
|
92
|
-
end
|
93
|
-
|
94
|
-
def to_hash()
|
95
|
-
{
|
96
|
-
'title' => @title,
|
97
|
-
'url' => @url,
|
98
|
-
'description' => @description,
|
99
|
-
'domain' => @domain,
|
100
|
-
}
|
101
|
-
end
|
102
|
-
|
103
|
-
def to_hash_for_custom_template()
|
104
|
-
{
|
105
|
-
'link_title' => @title,
|
106
|
-
'link_url' => @url,
|
107
|
-
'link_description' => @description,
|
108
|
-
'link_domain' => @domain
|
109
|
-
}
|
110
|
-
end
|
111
|
-
|
112
|
-
def template_file()
|
107
|
+
def self.template_file
|
113
108
|
@@template_file
|
114
109
|
end
|
115
|
-
end
|
116
110
|
|
117
|
-
class NonOpenGraphPropertiesFactory
|
118
111
|
def from_page(page)
|
119
|
-
|
120
|
-
|
112
|
+
Properties.new({
|
113
|
+
'title' => page.best_title,
|
114
|
+
'url' => page.url,
|
115
|
+
'description' => page.best_description,
|
116
|
+
'domain' => page.host,
|
117
|
+
}, @@template_file)
|
121
118
|
end
|
122
119
|
|
123
120
|
def from_hash(hash)
|
124
|
-
|
125
|
-
hash['title'], hash['url'], hash['description'], hash['domain'])
|
126
|
-
end
|
127
|
-
|
128
|
-
private
|
129
|
-
def get_description(page)
|
130
|
-
if !page.parsed.xpath('//p[normalize-space()]').empty? then
|
131
|
-
return page.parsed.xpath('//p[normalize-space()]').map(&:text).first[0..180] + "..."
|
132
|
-
else
|
133
|
-
return "..."
|
134
|
-
end
|
121
|
+
Properties.new(hash, @@template_file)
|
135
122
|
end
|
136
123
|
end
|
137
124
|
|
@@ -158,7 +145,7 @@ module Jekyll
|
|
158
145
|
end
|
159
146
|
page = fetch(url)
|
160
147
|
properties = create_properties_from_page(page)
|
161
|
-
if Dir.
|
148
|
+
if Dir.exist?(@@cache_dir) then
|
162
149
|
save_cache_file(cache_filepath, properties)
|
163
150
|
else
|
164
151
|
# TODO: This message will be shown at all linkprevew tag
|
@@ -189,7 +176,9 @@ module Jekyll
|
|
189
176
|
|
190
177
|
private
|
191
178
|
def create_properties_from_page(page)
|
192
|
-
if
|
179
|
+
if !%w[og:title og:type og:url og:image].all? { |required_tag|
|
180
|
+
page.meta_tags['property'].include?(required_tag)
|
181
|
+
}
|
193
182
|
factory = NonOpenGraphPropertiesFactory.new
|
194
183
|
else
|
195
184
|
factory = OpenGraphPropertiesFactory.new
|
@@ -239,16 +228,15 @@ module Jekyll
|
|
239
228
|
image_html = ""
|
240
229
|
if image then
|
241
230
|
image_html = <<-EOS
|
242
|
-
<div class="jekyll-linkpreview-image">
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
</div>
|
231
|
+
<div class="jekyll-linkpreview-image">
|
232
|
+
<a href="#{url}" target="_blank">
|
233
|
+
<img src="#{image}" />
|
234
|
+
</a>
|
235
|
+
</div>
|
247
236
|
EOS
|
248
237
|
end
|
249
238
|
html = <<-EOS
|
250
239
|
<div class="jekyll-linkpreview-wrapper">
|
251
|
-
<p><a href="#{url}" target="_blank">#{url}</a></p>
|
252
240
|
<div class="jekyll-linkpreview-wrapper-inner">
|
253
241
|
<div class="jekyll-linkpreview-content">
|
254
242
|
#{image_html}
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jekyll-linkpreview
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yusuke Nishioka
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-05-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: jekyll
|
@@ -100,20 +100,6 @@ dependencies:
|
|
100
100
|
- - "~>"
|
101
101
|
- !ruby/object:Gem::Version
|
102
102
|
version: 0.5.2
|
103
|
-
- !ruby/object:Gem::Dependency
|
104
|
-
name: appraisal
|
105
|
-
requirement: !ruby/object:Gem::Requirement
|
106
|
-
requirements:
|
107
|
-
- - "~>"
|
108
|
-
- !ruby/object:Gem::Version
|
109
|
-
version: 2.2.0
|
110
|
-
type: :development
|
111
|
-
prerelease: false
|
112
|
-
version_requirements: !ruby/object:Gem::Requirement
|
113
|
-
requirements:
|
114
|
-
- - "~>"
|
115
|
-
- !ruby/object:Gem::Version
|
116
|
-
version: 2.2.0
|
117
103
|
- !ruby/object:Gem::Dependency
|
118
104
|
name: wwtd
|
119
105
|
requirement: !ruby/object:Gem::Requirement
|
@@ -166,9 +152,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
166
152
|
version: '0'
|
167
153
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
168
154
|
requirements:
|
169
|
-
- - "
|
155
|
+
- - ">="
|
170
156
|
- !ruby/object:Gem::Version
|
171
|
-
version:
|
157
|
+
version: '0'
|
172
158
|
requirements: []
|
173
159
|
rubygems_version: 3.3.26
|
174
160
|
signing_key:
|