jekyll-embed-urls 0.5.3 → 0.5.7
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/_includes/fallback.html +2 -2
- data/_includes/ogp.html +2 -2
- data/lib/jekyll/embed/cache.rb +1 -1
- data/lib/jekyll/embed/content.rb +10 -3
- data/lib/jekyll/embed.rb +48 -20
- metadata +24 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '009ec95cb733855d621b7b063e4922c79873296fdebd99f16ad6f2856854a7af'
|
4
|
+
data.tar.gz: e56ca532db963a099a4c4c6950c4382ca25d83c5102703b8bf2d66fd98d8f2a9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d60e0cfb3395976201a2b9b4174aaf1b888ef88fede4c802302002787471a0d8268c89d8d1cb447fa24bcebee7ac5f4ce83865b5770e0fe5ca38cd93ebb7e8e4
|
7
|
+
data.tar.gz: 4310e1aa4409b2724e8dfc9b68ecc96e4eabe83709a19cb7e5d3745a895b9e7bb32af78dece340f6c4e37807813582cdb07517253a40f739c7206db03db606f3
|
data/_includes/fallback.html
CHANGED
@@ -6,8 +6,8 @@
|
|
6
6
|
<img src="{{ page.image | uri_escape }}" class="img-fluid" />
|
7
7
|
{%- endif -%}
|
8
8
|
|
9
|
-
<h1>{{ page.title }}</h1>
|
10
|
-
<p class="lead">{{ page.description }}</p>
|
9
|
+
<h1>{{ page.title | escape_once }}</h1>
|
10
|
+
<p class="lead">{{ page.description | escape_once }}</p>
|
11
11
|
<p>
|
12
12
|
<small>
|
13
13
|
<a href="{{ page.url | uri_escape }}">{{ page.url }}</a>
|
data/_includes/ogp.html
CHANGED
@@ -9,8 +9,8 @@
|
|
9
9
|
<audio class="img-fluid" src="{{ page.audio | uri_escape }}"/>
|
10
10
|
{%- endif -%}
|
11
11
|
|
12
|
-
<h1>{{ page.title }}</h1>
|
13
|
-
<p class="lead">{{ page.description }}</p>
|
12
|
+
<h1>{{ page.title | escape_once }}</h1>
|
13
|
+
<p class="lead">{{ page.description | escape_once }}</p>
|
14
14
|
<p>
|
15
15
|
<small>
|
16
16
|
<a href="{{ page.url | uri_escape }}">{{ page.url }}</a>
|
data/lib/jekyll/embed/cache.rb
CHANGED
data/lib/jekyll/embed/content.rb
CHANGED
@@ -5,15 +5,22 @@ require 'cgi'
|
|
5
5
|
module Jekyll
|
6
6
|
class Embed
|
7
7
|
class Content
|
8
|
-
URL_RE =
|
8
|
+
URL_RE = %r{(<p[^>]*>[\s\n]*(<a[^>]*>)?[\s\n]*(https?://[^<\s\n]+)[\s\n]*(</a>)?[\s\n]*</p>)}m.freeze
|
9
9
|
|
10
10
|
class << self
|
11
11
|
# Find URLs on paragraphs. We do it after rendering because
|
12
12
|
# sometimes we use HTML instead of pure Markdown and this way we
|
13
13
|
# catch both.
|
14
14
|
def embed!(content)
|
15
|
-
content.gsub!(URL_RE) do |
|
16
|
-
|
15
|
+
content.gsub!(URL_RE) do |match|
|
16
|
+
url = CGI.unescapeHTML(Regexp.last_match(3))
|
17
|
+
embed = Jekyll::Embed.embed url
|
18
|
+
|
19
|
+
if embed == url
|
20
|
+
match
|
21
|
+
else
|
22
|
+
embed
|
23
|
+
end
|
17
24
|
end
|
18
25
|
end
|
19
26
|
end
|
data/lib/jekyll/embed.rb
CHANGED
@@ -13,7 +13,7 @@ require_relative 'embed/cache'
|
|
13
13
|
if Gem::Version.new(Jekyll::VERSION) >= Gem::Version.new('4.2.0')
|
14
14
|
require_relative 'embed/content'
|
15
15
|
else
|
16
|
-
Jekyll.logger.warn
|
16
|
+
Jekyll.logger.warn 'Upgrade to Jekyll >= 4.2.0 to embed URLs in content'
|
17
17
|
end
|
18
18
|
|
19
19
|
OEmbed::Providers.register_all
|
@@ -57,7 +57,8 @@ module Jekyll
|
|
57
57
|
|
58
58
|
# Directive from Feature Policy
|
59
59
|
# @see {https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Feature-Policy#directives}
|
60
|
-
DIRECTIVES = %w[accelerometer ambient-light-sensor autoplay battery camera display-capture document-domain
|
60
|
+
DIRECTIVES = %w[accelerometer ambient-light-sensor autoplay battery camera display-capture document-domain
|
61
|
+
encrypted-media execution-while-not-rendered execution-while-out-of-viewport fullscreen gamepad geolocation gyroscope layout-animations legacy-image-formats magnetometer microphone midi navigation-override oversized-images payment picture-in-picture publickey-credentials-get speaker-selection sync-xhr usb screen-wake-lock web-share xr-spatial-tracking].freeze
|
61
62
|
|
62
63
|
# Templates
|
63
64
|
INCLUDE_OGP = '{% include ogp.html site=site page=page %}'
|
@@ -84,13 +85,13 @@ module Jekyll
|
|
84
85
|
'rel' => %w[noopener noreferrer],
|
85
86
|
'target' => '_blank'
|
86
87
|
}
|
87
|
-
}
|
88
|
+
}.freeze
|
88
89
|
|
89
90
|
class << self
|
90
91
|
def site
|
91
92
|
unless @site
|
92
93
|
raise Jekyll::Errors::InvalidConfigurationError,
|
93
|
-
|
94
|
+
'Site is missing, configure with `Jekyll::Embed.site = site`'
|
94
95
|
end
|
95
96
|
|
96
97
|
@site
|
@@ -101,7 +102,7 @@ module Jekyll
|
|
101
102
|
# @param [Jekyll::Site]
|
102
103
|
# @return [Jekyll::Site]
|
103
104
|
def site=(site)
|
104
|
-
raise ArgumentError,
|
105
|
+
raise ArgumentError, 'Site must be a Jekyll::Site' unless site.is_a? Jekyll::Site
|
105
106
|
|
106
107
|
@site = site
|
107
108
|
|
@@ -130,15 +131,15 @@ module Jekyll
|
|
130
131
|
def reset
|
131
132
|
@allow_same_origin =
|
132
133
|
@cache =
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
134
|
+
@config =
|
135
|
+
@fallback_template =
|
136
|
+
@get_cache =
|
137
|
+
@http_client =
|
138
|
+
@info =
|
139
|
+
@ogp_template =
|
140
|
+
@payload =
|
141
|
+
@value_for_attr =
|
142
|
+
nil
|
142
143
|
end
|
143
144
|
|
144
145
|
# Render the URL as HTML
|
@@ -160,7 +161,7 @@ module Jekyll
|
|
160
161
|
# TODO: Use Addressable
|
161
162
|
URI.parse url
|
162
163
|
|
163
|
-
oembed(url) || ogp(url) || fallback(url)
|
164
|
+
oembed(url) || ogp(url) || fallback(url) || url
|
164
165
|
rescue URI::Error
|
165
166
|
Jekyll.logger.warn "#{url.inspect} is not a valid URL"
|
166
167
|
|
@@ -170,7 +171,9 @@ module Jekyll
|
|
170
171
|
# @return [Hash]
|
171
172
|
def config
|
172
173
|
@config ||= Jekyll::Utils.deep_merge_hashes(DEFAULT_CONFIG, (site.config['embed'] || {})).tap do |c|
|
173
|
-
c['attributes']['allow'].concat (DIRECTIVES - c.dig('attributes', 'allow').join.split(';').map
|
174
|
+
c['attributes']['allow'].concat (DIRECTIVES - c.dig('attributes', 'allow').join.split(';').map do |s|
|
175
|
+
s.split(' ').first
|
176
|
+
end).join(" 'none';|").split('|')
|
174
177
|
end
|
175
178
|
end
|
176
179
|
|
@@ -197,8 +200,23 @@ module Jekyll
|
|
197
200
|
def ogp(url)
|
198
201
|
cache.getset("ogp+#{url}") do
|
199
202
|
ogp = OGP::OpenGraph.new get(url).body
|
203
|
+
page = {
|
204
|
+
locale: ogp.locales.first,
|
205
|
+
title: ogp.title,
|
206
|
+
url: ogp.url,
|
207
|
+
description: ogp.description,
|
208
|
+
type: ogp.type,
|
209
|
+
data: ogp.data
|
210
|
+
}.transform_keys(&:to_s)
|
211
|
+
|
212
|
+
%w[image video audio].each do |attr|
|
213
|
+
page[attr] = ogp.public_send(:"#{attr}s").find do |a|
|
214
|
+
http? a.url
|
215
|
+
end&.url
|
216
|
+
end
|
217
|
+
|
200
218
|
context = info.dup
|
201
|
-
context[:registers][:page] = payload['page'] =
|
219
|
+
context[:registers][:page] = payload['page'] = page
|
202
220
|
|
203
221
|
cleanup ogp_template.render!(payload, context), url
|
204
222
|
end
|
@@ -328,8 +346,8 @@ module Jekyll
|
|
328
346
|
@value_for_attr ||= {}
|
329
347
|
@value_for_attr[attr] ||=
|
330
348
|
case (value = config.dig('attributes', attr))
|
331
|
-
|
332
|
-
|
349
|
+
when String then value
|
350
|
+
when Array then value.join(' ')
|
333
351
|
end
|
334
352
|
end
|
335
353
|
|
@@ -340,7 +358,7 @@ module Jekyll
|
|
340
358
|
# @return [String]
|
341
359
|
def allow_same_origin(url)
|
342
360
|
unless site.config['url']
|
343
|
-
Jekyll.logger.warn
|
361
|
+
Jekyll.logger.warn 'Add url to _config.yml to determine if the site can embed itself'
|
344
362
|
return ' allow-same-origin'
|
345
363
|
end
|
346
364
|
|
@@ -355,6 +373,16 @@ module Jekyll
|
|
355
373
|
def payload
|
356
374
|
@payload ||= site.site_payload
|
357
375
|
end
|
376
|
+
|
377
|
+
# Discover if a string is a valid HTTP URL
|
378
|
+
#
|
379
|
+
# @param :url [String]
|
380
|
+
# @return [Boolean]
|
381
|
+
def http?(url)
|
382
|
+
url.start_with?('http') && URI.parse(url).is_a?(URI::HTTP)
|
383
|
+
rescue URI::Error
|
384
|
+
false
|
385
|
+
end
|
358
386
|
end
|
359
387
|
end
|
360
388
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jekyll-embed-urls
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- f
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-04-
|
11
|
+
date: 2022-04-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: jekyll
|
@@ -58,14 +58,20 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
61
|
+
version: 0.5.0
|
62
|
+
- - "<"
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: '0.6'
|
62
65
|
type: :runtime
|
63
66
|
prerelease: false
|
64
67
|
version_requirements: !ruby/object:Gem::Requirement
|
65
68
|
requirements:
|
66
69
|
- - "~>"
|
67
70
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
71
|
+
version: 0.5.0
|
72
|
+
- - "<"
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '0.6'
|
69
75
|
- !ruby/object:Gem::Dependency
|
70
76
|
name: faraday
|
71
77
|
requirement: !ruby/object:Gem::Requirement
|
@@ -122,6 +128,20 @@ dependencies:
|
|
122
128
|
- - "~>"
|
123
129
|
- !ruby/object:Gem::Version
|
124
130
|
version: '0'
|
131
|
+
- !ruby/object:Gem::Dependency
|
132
|
+
name: rubocop
|
133
|
+
requirement: !ruby/object:Gem::Requirement
|
134
|
+
requirements:
|
135
|
+
- - ">="
|
136
|
+
- !ruby/object:Gem::Version
|
137
|
+
version: '0'
|
138
|
+
type: :development
|
139
|
+
prerelease: false
|
140
|
+
version_requirements: !ruby/object:Gem::Requirement
|
141
|
+
requirements:
|
142
|
+
- - ">="
|
143
|
+
- !ruby/object:Gem::Version
|
144
|
+
version: '0'
|
125
145
|
description: Replaces URLs for their previsualization in Jekyll posts
|
126
146
|
email:
|
127
147
|
- f@sutty.nl
|