jekyll-spaceship 0.9.0 → 0.9.1
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 +52 -18
- data/jekyll-spaceship.gemspec +1 -1
- data/lib/jekyll-spaceship/cores/config.rb +1 -1
- data/lib/jekyll-spaceship/processors/media-processor.rb +234 -0
- data/lib/jekyll-spaceship/version.rb +1 -1
- metadata +5 -4
- data/lib/jekyll-spaceship/processors/video-processor.rb +0 -139
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 989c96c9ba4f7b3d1ec891d43022360ab1bea0a4de2956e8a94c24c927df6ca1
|
4
|
+
data.tar.gz: 3aa37c0d529d883e2cef637556d65f65d31e9a5c8ee304ca2a2ee01de11ac527
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a7bbab4048b639e86cf01e88132c4b9de13acf9651667bcefc15eaaae6c57a3663b69498ebf6172037268ecb63a456a8cf53c751036717f471a8e060a7b5a14b
|
7
|
+
data.tar.gz: 56aab57a999fd3604f1b95475662478c8520ab703a9ae2405f863072c92c012cb1dec094814d17d6e1696ce2d3eea7fb0987e78a77a6c7a8465b95db61826702
|
data/README.md
CHANGED
@@ -107,11 +107,14 @@ Spaceship is a minimalistic, powerful and extremely customizable [Jekyll](https:
|
|
107
107
|
- [2.2 How to use?](#22-how-to-use)
|
108
108
|
- [3. PlantUML Usage](#3-plantuml-usage)
|
109
109
|
- [4. Mermaid Usage](#4-mermaid-usage)
|
110
|
-
- [5.
|
110
|
+
- [5. Media Usage](#5-media-usage)
|
111
111
|
- [5.1 Youtube Usage](#youtube-usage)
|
112
112
|
- [5.2 Vimeo Usage](#vimeo-usage)
|
113
113
|
- [5.3 DailyMotion Usage](#dailymotion-usage)
|
114
|
-
- [5.4
|
114
|
+
- [5.4 Spotify Usage](#spotify-usage)
|
115
|
+
- [5.5 SoundCloud Usage](#soundcloud-usage)
|
116
|
+
- [5.6 General Video Usage](#general-video-usage)
|
117
|
+
- [5.7 General Audio Usage](#general-audio-usage)
|
115
118
|
- [6. Hybrid HTML with Markdown](#6-hybrid-html-with-markdown)
|
116
119
|
- [7. Markdown Polyfill](#7-markdown-polyfill)
|
117
120
|
- [7.1 Escape Ordered List](#71-escape-ordered-list)
|
@@ -162,7 +165,7 @@ jekyll-spaceship:
|
|
162
165
|
- plantuml-processor
|
163
166
|
- mermaid-processor
|
164
167
|
- polyfill-processor
|
165
|
-
-
|
168
|
+
- media-processor
|
166
169
|
- emoji-processor
|
167
170
|
- element-processor
|
168
171
|
mathjax-processor:
|
@@ -194,14 +197,14 @@ jekyll-spaceship:
|
|
194
197
|
config:
|
195
198
|
theme: default
|
196
199
|
src: https://mermaid.ink/svg/
|
197
|
-
|
200
|
+
media-processor:
|
198
201
|
default:
|
199
|
-
id: '
|
200
|
-
class: '
|
202
|
+
id: 'media-{id}'
|
203
|
+
class: 'media'
|
201
204
|
width: '100%'
|
202
205
|
height: 350
|
203
|
-
|
204
|
-
style: 'max-width: 600px'
|
206
|
+
frameborder: 0
|
207
|
+
style: 'max-width: 600px; outline: none;'
|
205
208
|
allow: 'encrypted-media; picture-in-picture'
|
206
209
|
emoji-processor:
|
207
210
|
css:
|
@@ -705,25 +708,31 @@ Code above would be parsed as:
|
|
705
708
|
|
706
709
|

|
707
710
|
|
708
|
-
### 5.
|
711
|
+
### 5. Media Usage
|
709
712
|
|
710
|
-
How often did you find yourself googling "**How to embed a video in markdown?**"
|
713
|
+
How often did you find yourself googling "**How to embed a video/audio in markdown?**"
|
711
714
|
|
712
|
-
While its not possible to embed a video in markdown, the best and easiest
|
715
|
+
While its not possible to embed a video/audio in markdown, the best and easiest
|
716
|
+
way is to extract a frame from the video/audio. To add videos/audios to your
|
717
|
+
markdown files easier I developped this tool for you, and it will parse the
|
718
|
+
video/audio link inside the image block automatically.
|
713
719
|
|
714
|
-
**For now, these
|
720
|
+
**For now, these media links parsing are provided:**
|
715
721
|
|
716
722
|
- Youtube
|
717
723
|
- Vimeo
|
718
724
|
- DailyMotion
|
719
|
-
-
|
725
|
+
- Spotify
|
726
|
+
- SoundCloud
|
727
|
+
- General Video ( mp4 | avi | ogg | ogv | webm | 3gp | flv | mov ... )
|
728
|
+
- General Audio ( mp3 | wav | ogg | mid | midi | aac | wma ... )
|
720
729
|
|
721
|
-
There are two ways to embed a video in your Jekyll blog page:
|
730
|
+
There are two ways to embed a video/audio in your Jekyll blog page:
|
722
731
|
|
723
732
|
Inline-style:
|
724
733
|
|
725
734
|
```markdown
|
726
|
-

|
727
736
|
```
|
728
737
|
|
729
738
|
Reference-style:
|
@@ -731,10 +740,10 @@ Reference-style:
|
|
731
740
|
```markdown
|
732
741
|
![][{reference}]
|
733
742
|
|
734
|
-
[{reference}]: {
|
743
|
+
[{reference}]: {media-link}
|
735
744
|
```
|
736
745
|
|
737
|
-
For configuring
|
746
|
+
For configuring media attributes (e.g, width, height), just adding query string to
|
738
747
|
the link as below:
|
739
748
|
|
740
749
|
```markdown
|
@@ -767,6 +776,22 @@ the link as below:
|
|
767
776
|

|
768
777
|
```
|
769
778
|
|
779
|
+
#### Spotify Usage
|
780
|
+
|
781
|
+
```markdown
|
782
|
+

|
783
|
+
```
|
784
|
+
|
785
|
+
<image width="600" src="https://user-images.githubusercontent.com/9413601/89762618-5d11b000-db23-11ea-81db-35cc3682b234.png">
|
786
|
+
|
787
|
+
#### SoundCloud Usage
|
788
|
+
|
789
|
+
```markdown
|
790
|
+

|
791
|
+
```
|
792
|
+
|
793
|
+
<image width="600" src="https://user-images.githubusercontent.com/9413601/89762969-1c666680-db24-11ea-97e3-4340f7fac7ac.png">
|
794
|
+
|
770
795
|
#### General Video Usage
|
771
796
|
|
772
797
|
```markdown
|
@@ -777,6 +802,15 @@ the link as below:
|
|
777
802
|

|
778
803
|
```
|
779
804
|
|
805
|
+
#### General Audio Usage
|
806
|
+
|
807
|
+
```markdown
|
808
|
+

|
809
|
+
|
810
|
+

|
811
|
+
```
|
812
|
+
|
813
|
+
<image width="300" src="https://user-images.githubusercontent.com/9413601/89762143-68181080-db22-11ea-8467-e8b2a8a96ae5.png">
|
780
814
|
|
781
815
|
### 6. Hybrid HTML with Markdown
|
782
816
|
|
@@ -950,7 +984,7 @@ jekyll-spaceship:
|
|
950
984
|
css:
|
951
985
|
- a: # Replce all `a` tags
|
952
986
|
props: #
|
953
|
-
loading: lazy # Replace `
|
987
|
+
loading: lazy # Replace `loading` value to `lazy`
|
954
988
|
```
|
955
989
|
|
956
990
|
In case you want to prevent loading some images/iframes lazily, add
|
data/jekyll-spaceship.gemspec
CHANGED
@@ -9,7 +9,7 @@ Gem::Specification.new do |spec|
|
|
9
9
|
spec.version = Jekyll::Spaceship::VERSION
|
10
10
|
spec.authors = ["jeffreytse"]
|
11
11
|
spec.email = ["jeffreytse.mail@gmail.com"]
|
12
|
-
spec.summary = "A Jekyll plugin to provide powerful supports for table, mathjax, plantuml, mermaid, emoji, video, youtube, vimeo, dailymotion, etc."
|
12
|
+
spec.summary = "A Jekyll plugin to provide powerful supports for table, mathjax, plantuml, mermaid, emoji, video, audio, youtube, vimeo, dailymotion, spotify, soundcloud, etc."
|
13
13
|
spec.homepage = "https://github.com/jeffreytse/jekyll-spaceship"
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
@@ -0,0 +1,234 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'uri'
|
4
|
+
|
5
|
+
module Jekyll::Spaceship
|
6
|
+
class MediaProcessor < Processor
|
7
|
+
def self.config
|
8
|
+
{
|
9
|
+
'default' => {
|
10
|
+
'id' => 'media-{id}',
|
11
|
+
'class' => 'media',
|
12
|
+
'width' => '100%',
|
13
|
+
'height' => 350,
|
14
|
+
'frameborder' => 0,
|
15
|
+
'style' => 'max-width: 600px;outline: none',
|
16
|
+
'allow' => 'encrypted-media; picture-in-picture'
|
17
|
+
}
|
18
|
+
}
|
19
|
+
end
|
20
|
+
|
21
|
+
def on_handle_markdown(content)
|
22
|
+
content = handle_normal_audio(content)
|
23
|
+
content = handle_normal_video(content)
|
24
|
+
content = handle_youtube(content)
|
25
|
+
content = handle_vimeo(content)
|
26
|
+
content = handle_dailymotion(content)
|
27
|
+
content = handle_spotify(content)
|
28
|
+
content = handle_soundcloud(content)
|
29
|
+
end
|
30
|
+
|
31
|
+
# Examples:
|
32
|
+
# 
|
33
|
+
# 
|
34
|
+
def handle_normal_audio(content)
|
35
|
+
handle_media(content, {
|
36
|
+
media_type: 'audio',
|
37
|
+
host: '(https?:)?\\/\\/.*\\/',
|
38
|
+
id: '(.+?\\.(mp3|wav|ogg|mid|midi|aac|wma))',
|
39
|
+
})
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
# Examples:
|
44
|
+
# 
|
45
|
+
# 
|
46
|
+
# 
|
47
|
+
def handle_normal_video(content)
|
48
|
+
handle_media(content, {
|
49
|
+
media_type: 'iframe',
|
50
|
+
host: '(https?:)?\\/\\/.*\\/',
|
51
|
+
id: '(.+?\\.(avi|mp4|webm|ogg|ogv|flv|mkv|mov|wmv|3gp|rmvb|asf))'
|
52
|
+
})
|
53
|
+
end
|
54
|
+
|
55
|
+
# Examples:
|
56
|
+
# 
|
57
|
+
# 
|
58
|
+
# 
|
59
|
+
def handle_youtube(content)
|
60
|
+
handle_media(content, {
|
61
|
+
media_type: 'iframe',
|
62
|
+
host: '(https?:)?\\/\\/.*youtu.*',
|
63
|
+
id: '(?<=\\?v\\=|embed\\/|\\.be\\/)([a-zA-Z0-9\\_\\-]+)',
|
64
|
+
base_url: "https://www.youtube.com/embed/"
|
65
|
+
})
|
66
|
+
end
|
67
|
+
|
68
|
+
# Examples:
|
69
|
+
# 
|
70
|
+
# 
|
71
|
+
def handle_vimeo(content)
|
72
|
+
handle_media(content, {
|
73
|
+
media_type: 'iframe',
|
74
|
+
host: '(https?:)?\\/\\/vimeo\\.com\\/',
|
75
|
+
id: '([0-9]+)',
|
76
|
+
base_url: "https://player.vimeo.com/video/"
|
77
|
+
})
|
78
|
+
end
|
79
|
+
|
80
|
+
# Examples:
|
81
|
+
# 
|
82
|
+
# 
|
83
|
+
def handle_dailymotion(content)
|
84
|
+
handle_media(content, {
|
85
|
+
media_type: 'iframe',
|
86
|
+
host: '(https?:)?\\/\\/.*dai.?ly.*',
|
87
|
+
id: '(?<=video\\/|\\/)([a-zA-Z0-9\\_\\-]+)',
|
88
|
+
base_url: "https://www.dailymotion.com/embed/video/"
|
89
|
+
})
|
90
|
+
end
|
91
|
+
|
92
|
+
# Examples:
|
93
|
+
# 
|
94
|
+
# 
|
95
|
+
def handle_spotify(content)
|
96
|
+
handle_media(content, {
|
97
|
+
media_type: 'iframe',
|
98
|
+
host: '(https?:)?\\/\\/open\\.spotify\\.com\\/track\\/',
|
99
|
+
id: '(?<=track\\/)([a-zA-Z0-9\\_\\-]+)',
|
100
|
+
base_url: "https://open.spotify.com/embed/track/",
|
101
|
+
height: 80
|
102
|
+
})
|
103
|
+
end
|
104
|
+
|
105
|
+
# Examples:
|
106
|
+
# 
|
107
|
+
def handle_soundcloud(content)
|
108
|
+
handle_media(content, {
|
109
|
+
media_type: 'iframe',
|
110
|
+
id_from: 'html',
|
111
|
+
host: '(https?:)?\\/\\/soundcloud\\.com\\/.+\\/[^\\?]+',
|
112
|
+
id: '(?<=soundcloud:\\/\\/sounds:)([0-9]+)',
|
113
|
+
base_url: "https://w.soundcloud.com/player/?url="\
|
114
|
+
"https%3A//api.soundcloud.com/tracks/",
|
115
|
+
height: 125,
|
116
|
+
})
|
117
|
+
end
|
118
|
+
|
119
|
+
def handle_media(content, data)
|
120
|
+
host = data[:host]
|
121
|
+
return content if content.sub(/#{host}/, '').nil?
|
122
|
+
|
123
|
+
media_type = data[:media_type]
|
124
|
+
base_url = data[:base_url]
|
125
|
+
id = data[:id_from] === 'html' ? '()' : data[:id]
|
126
|
+
url = "(#{host}#{id}\\S*)"
|
127
|
+
title = '("(.*)".*){0,1}'
|
128
|
+
|
129
|
+
# pre-handle reference-style links
|
130
|
+
regex = /(\[(.*)\]:\s*(#{url}\s*#{title}))/
|
131
|
+
content.scan regex do |match_data|
|
132
|
+
match = match_data[0]
|
133
|
+
ref_name = match_data[1]
|
134
|
+
ref_value = match_data[2]
|
135
|
+
content = content.gsub(match, '')
|
136
|
+
.gsub(/\!\[(.*)\]\s*\[#{ref_name}\]/,
|
137
|
+
"")
|
138
|
+
end
|
139
|
+
|
140
|
+
# handle inline-style links
|
141
|
+
regex = /(\!\[(.*)\]\(.*#{url}\s*#{title}\))/
|
142
|
+
content.scan regex do |match_data|
|
143
|
+
url = match_data[2]
|
144
|
+
id = data[:id_from] === 'html' \
|
145
|
+
? get_id_from_html(url, data[:id]) \
|
146
|
+
: match_data[4]
|
147
|
+
title = match_data[6]
|
148
|
+
qs = url.match(/(?<=\?)(\S*?)$/)
|
149
|
+
qs = Hash[URI.decode_www_form(qs.to_s)].reject do |k, v|
|
150
|
+
next true if v == id or v == ''
|
151
|
+
end
|
152
|
+
|
153
|
+
cfg = self.config['default'].clone
|
154
|
+
cfg['id'] = qs['id'] || cfg['id']
|
155
|
+
cfg['class'] = qs['class'] || cfg['class']
|
156
|
+
cfg['style'] = qs['style'] || cfg['style']
|
157
|
+
cfg['id'] = cfg['id'].gsub('{id}', id)
|
158
|
+
cfg['class'] = cfg['class'].gsub('{id}', id)
|
159
|
+
|
160
|
+
cfg['src'] = URI(base_url ? "#{base_url}#{id}" : url).tap do |v|
|
161
|
+
v.query = URI.encode_www_form(qs) if qs.size > 0
|
162
|
+
end
|
163
|
+
|
164
|
+
case media_type
|
165
|
+
when 'audio'
|
166
|
+
cfg['autoplay'] = qs['autoplay'] || data[:autoplay] || cfg['autoplay']
|
167
|
+
cfg['loop'] = qs['loop'] || data[:loop] || cfg['loop']
|
168
|
+
cfg['style'] += ';display: none;' if qs['hidden']
|
169
|
+
content = handle_audio(content, { target: match_data[0], cfg: cfg })
|
170
|
+
when 'iframe'
|
171
|
+
cfg['title'] = title
|
172
|
+
cfg['width'] = qs['width'] || data[:width] || cfg['width']
|
173
|
+
cfg['height'] = qs['height'] || data[:height] || cfg['height']
|
174
|
+
cfg['frameborder'] = qs['frameborder'] || cfg['frameborder']
|
175
|
+
cfg['allow'] ||= cfg['allow']
|
176
|
+
content = handle_iframe(content, { target: match_data[0], cfg: cfg })
|
177
|
+
end
|
178
|
+
self.handled = true
|
179
|
+
end
|
180
|
+
content
|
181
|
+
end
|
182
|
+
|
183
|
+
def handle_audio(content, data)
|
184
|
+
cfg = data[:cfg]
|
185
|
+
html = "<audio"\
|
186
|
+
" id=\"#{cfg['id']}\""\
|
187
|
+
" class=\"#{cfg['class']}\""\
|
188
|
+
" #{cfg['autoplay'] ? 'autoplay' : ''}"\
|
189
|
+
" #{cfg['loop'] ? 'loop' : ''}"\
|
190
|
+
" src=\"#{cfg['src']}\""\
|
191
|
+
" style=\"#{cfg['style']}\""\
|
192
|
+
" controls>" \
|
193
|
+
"<p> Your browser doesn't support HTML5 audio."\
|
194
|
+
" Here is a <a href=\"#{cfg['src']}\">link to download the audio</a>"\
|
195
|
+
"instead. </p>"\
|
196
|
+
"</audio>"
|
197
|
+
content.gsub(data[:target], html)
|
198
|
+
end
|
199
|
+
|
200
|
+
def handle_iframe(content, data)
|
201
|
+
cfg = data[:cfg]
|
202
|
+
html = "<iframe"\
|
203
|
+
" id=\"#{cfg['id']}\""\
|
204
|
+
" class=\"#{cfg['class']}\""\
|
205
|
+
" src=\"#{cfg['src']}\""\
|
206
|
+
" title=\"#{cfg['title']}\""\
|
207
|
+
" width=\"#{cfg['width']}\""\
|
208
|
+
" height=\"#{cfg['height']}\""\
|
209
|
+
" style=\"#{cfg['style']}\""\
|
210
|
+
" allow=\"#{cfg['allow']}\""\
|
211
|
+
" frameborder=\"#{cfg['frameborder']}\""\
|
212
|
+
" allowfullscreen>"\
|
213
|
+
"</iframe>"
|
214
|
+
content.gsub(data[:target], html)
|
215
|
+
end
|
216
|
+
|
217
|
+
def get_id_from_html(url, pattern)
|
218
|
+
id = ''
|
219
|
+
begin
|
220
|
+
url = 'https:' + url if url.start_with? '//'
|
221
|
+
res = Net::HTTP.get_response URI(url)
|
222
|
+
raise res.body unless res.is_a?(Net::HTTPSuccess)
|
223
|
+
res.body.match pattern do |match_data|
|
224
|
+
id = match_data[0]
|
225
|
+
break
|
226
|
+
end
|
227
|
+
rescue StandardError => msg
|
228
|
+
data = url
|
229
|
+
logger.log msg
|
230
|
+
end
|
231
|
+
id
|
232
|
+
end
|
233
|
+
end
|
234
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jekyll-spaceship
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- jeffreytse
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-08-
|
11
|
+
date: 2020-08-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: jekyll
|
@@ -140,11 +140,11 @@ files:
|
|
140
140
|
- lib/jekyll-spaceship/processors/element-processor.rb
|
141
141
|
- lib/jekyll-spaceship/processors/emoji-processor.rb
|
142
142
|
- lib/jekyll-spaceship/processors/mathjax-processor.rb
|
143
|
+
- lib/jekyll-spaceship/processors/media-processor.rb
|
143
144
|
- lib/jekyll-spaceship/processors/mermaid-processor.rb
|
144
145
|
- lib/jekyll-spaceship/processors/plantuml-processor.rb
|
145
146
|
- lib/jekyll-spaceship/processors/polyfill-processor.rb
|
146
147
|
- lib/jekyll-spaceship/processors/table-processor.rb
|
147
|
-
- lib/jekyll-spaceship/processors/video-processor.rb
|
148
148
|
- lib/jekyll-spaceship/utils/.keep
|
149
149
|
- lib/jekyll-spaceship/version.rb
|
150
150
|
- logos/jekyll-spaceship-logo.png
|
@@ -173,5 +173,6 @@ rubygems_version: 3.0.8
|
|
173
173
|
signing_key:
|
174
174
|
specification_version: 4
|
175
175
|
summary: A Jekyll plugin to provide powerful supports for table, mathjax, plantuml,
|
176
|
-
mermaid, emoji, video, youtube, vimeo, dailymotion,
|
176
|
+
mermaid, emoji, video, audio, youtube, vimeo, dailymotion, spotify, soundcloud,
|
177
|
+
etc.
|
177
178
|
test_files: []
|
@@ -1,139 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'uri'
|
4
|
-
|
5
|
-
module Jekyll::Spaceship
|
6
|
-
class VideoProcessor < Processor
|
7
|
-
def self.config
|
8
|
-
{
|
9
|
-
'default' => {
|
10
|
-
'id' => 'video-{id}',
|
11
|
-
'class' => 'video',
|
12
|
-
'width' => '100%',
|
13
|
-
'height' => 350,
|
14
|
-
'border' => 0,
|
15
|
-
'style' => 'max-width: 600px',
|
16
|
-
'allow' => 'encrypted-media; picture-in-picture',
|
17
|
-
}
|
18
|
-
}
|
19
|
-
end
|
20
|
-
|
21
|
-
def on_handle_markdown(content)
|
22
|
-
content = handle_normal_video(content)
|
23
|
-
content = handle_youtube(content)
|
24
|
-
content = handle_vimeo(content)
|
25
|
-
content = handle_dailymotion(content)
|
26
|
-
end
|
27
|
-
|
28
|
-
# Examples:
|
29
|
-
# 
|
30
|
-
# 
|
31
|
-
# 
|
32
|
-
def handle_normal_video(content)
|
33
|
-
handle_video(content, {
|
34
|
-
host: '(https?:)?\\/\\/.*\\/',
|
35
|
-
id: '(.+?\\.(avi|mp4|webm|ogg|ogv|flv|mkv|mov|wmv|3gp|rmvb|asf))',
|
36
|
-
})
|
37
|
-
end
|
38
|
-
|
39
|
-
# Examples:
|
40
|
-
# 
|
41
|
-
# 
|
42
|
-
# 
|
43
|
-
def handle_youtube(content)
|
44
|
-
handle_video(content, {
|
45
|
-
host: '(https?:)?\\/\\/.*youtu.*',
|
46
|
-
id: '(?<=\\?v\\=|embed\\/|\\.be\\/)([a-zA-Z0-9\\_\\-]+)',
|
47
|
-
iframe_url: "https://www.youtube.com/embed/"
|
48
|
-
})
|
49
|
-
end
|
50
|
-
|
51
|
-
# Examples:
|
52
|
-
# 
|
53
|
-
# 
|
54
|
-
def handle_vimeo(content)
|
55
|
-
handle_video(content, {
|
56
|
-
host: '(https?:)?\\/\\/vimeo\\.com\\/',
|
57
|
-
id: '([0-9]+)',
|
58
|
-
iframe_url: "https://player.vimeo.com/video/"
|
59
|
-
})
|
60
|
-
end
|
61
|
-
|
62
|
-
# Examples:
|
63
|
-
# 
|
64
|
-
# 
|
65
|
-
def handle_dailymotion(content)
|
66
|
-
handle_video(content, {
|
67
|
-
host: '(https?:)?\\/\\/.*dai.?ly.*',
|
68
|
-
id: '(?<=video\\/|\\/)([a-zA-Z0-9\\_\\-]+)',
|
69
|
-
iframe_url: "https://www.dailymotion.com/embed/video/"
|
70
|
-
})
|
71
|
-
end
|
72
|
-
|
73
|
-
def handle_video(content, data)
|
74
|
-
host = data[:host]
|
75
|
-
return content if content.sub(/#{host}/, '').nil?
|
76
|
-
|
77
|
-
iframe_url = data[:iframe_url]
|
78
|
-
id = data[:id]
|
79
|
-
url = "(#{host}#{id}\\S*)"
|
80
|
-
title = '("(.*)".*){0,1}'
|
81
|
-
|
82
|
-
# pre-handle reference-style links
|
83
|
-
regex = /(\[(.*)\]:\s*(#{url}\s*#{title}))/
|
84
|
-
content.scan regex do |match_data|
|
85
|
-
match = match_data[0]
|
86
|
-
ref_name = match_data[1]
|
87
|
-
ref_value = match_data[2]
|
88
|
-
content = content.gsub(match, '')
|
89
|
-
.gsub(/\!\[(.*)\]\s*\[#{ref_name}\]/,
|
90
|
-
"")
|
91
|
-
end
|
92
|
-
|
93
|
-
# handle inline-style links
|
94
|
-
regex = /(\!\[(.*)\]\(.*#{url}\s*#{title}\))/
|
95
|
-
content.scan regex do |match_data|
|
96
|
-
url = match_data[2]
|
97
|
-
id = match_data[4]
|
98
|
-
title = match_data[6]
|
99
|
-
qs = url.match(/(?<=\?)(\S*?)$/)
|
100
|
-
qs = Hash[URI.decode_www_form(qs.to_s)].reject do |k, v|
|
101
|
-
next true if v == id or v == ''
|
102
|
-
end
|
103
|
-
|
104
|
-
default = self.config['default']
|
105
|
-
css_id = qs['id'] || default['id']
|
106
|
-
css_class = qs['class'] || default['class']
|
107
|
-
width = qs['width'] || data[:width] || default['width']
|
108
|
-
height = qs['height'] || data[:height] || default['height']
|
109
|
-
frameborder = qs['frameborder'] || default['border']
|
110
|
-
style = qs['style'] || default['style']
|
111
|
-
allow = qs['allow'] || default['allow']
|
112
|
-
|
113
|
-
css_id = css_id.gsub('{id}', id)
|
114
|
-
css_class = css_class.gsub('{id}', id)
|
115
|
-
|
116
|
-
url = URI(iframe_url ? "#{iframe_url}#{id}" : url).tap do |v|
|
117
|
-
v.query = URI.encode_www_form(qs) if qs.size > 0
|
118
|
-
end
|
119
|
-
|
120
|
-
html = "<iframe"\
|
121
|
-
" id=\"#{css_id}\""\
|
122
|
-
" class=\"#{css_class}\""\
|
123
|
-
" src=\"#{url}\""\
|
124
|
-
" title=\"#{title}\""\
|
125
|
-
" width=\"#{width}\""\
|
126
|
-
" height=\"#{height}\""\
|
127
|
-
" style=\"#{style}\""\
|
128
|
-
" allow=\"#{allow}\""\
|
129
|
-
" frameborder=\"#{frameborder}\""\
|
130
|
-
" allowfullscreen>" \
|
131
|
-
"</iframe>"
|
132
|
-
|
133
|
-
content = content.gsub(match_data[0], html)
|
134
|
-
self.handled = true
|
135
|
-
end
|
136
|
-
content
|
137
|
-
end
|
138
|
-
end
|
139
|
-
end
|