jekyll-spaceship 0.9.0 → 0.9.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c6ae47db0fb8b3515463a5703cdbfa2c596262066b0af602e3d7f82360872c78
4
- data.tar.gz: 9f4c96c07fe26d5b1e9a44338375a29470d528e2375902d9e7198cfe377d0b26
3
+ metadata.gz: 989c96c9ba4f7b3d1ec891d43022360ab1bea0a4de2956e8a94c24c927df6ca1
4
+ data.tar.gz: 3aa37c0d529d883e2cef637556d65f65d31e9a5c8ee304ca2a2ee01de11ac527
5
5
  SHA512:
6
- metadata.gz: 7a24363b63096f27c60c92aa0ad37561cf230ae6e61c0e49b7c556e9a584c1ffddc388cf3ab3cb424382351d55a30439628f6a909e93aae4cfce51363f8ffd0f
7
- data.tar.gz: 297d038c14a9bdb8b856b414eaefba93232ff82518a3c01eaf97ac98f2dd1792d6d875a140e5f30497dbcb759f4e59a6ea6632c64c186f0acacfb249152b2c3e
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. Video Usage](#5-video-usage)
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 General Video Usage](#general-video-usage)
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
- - video-processor
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
- video-processor:
200
+ media-processor:
198
201
  default:
199
- id: 'video-{id}'
200
- class: 'video'
202
+ id: 'media-{id}'
203
+ class: 'media'
201
204
  width: '100%'
202
205
  height: 350
203
- border: 0
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
  ![Mermaid Diagram](https://user-images.githubusercontent.com/9413601/85282355-2e317300-b4be-11ea-9c30-8f9d61540d14.png)
707
710
 
708
- ### 5. Video Usage
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 way is to extract a frame from the video. To add videos to your markdown files easier I developped this tool for you, and it will parse the video link inside the image block automatically.
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 video links parsing are provided:**
720
+ **For now, these media links parsing are provided:**
715
721
 
716
722
  - Youtube
717
723
  - Vimeo
718
724
  - DailyMotion
719
- - General Video ( mp4 | avi | webm | ogg | ogv | 3gp | flv | mov ... )
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
- ![]({video-link})
735
+ ![]({media-link})
727
736
  ```
728
737
 
729
738
  Reference-style:
@@ -731,10 +740,10 @@ Reference-style:
731
740
  ```markdown
732
741
  ![][{reference}]
733
742
 
734
- [{reference}]: {video-link}
743
+ [{reference}]: {media-link}
735
744
  ```
736
745
 
737
- For configuring video attributes (e.g, width, height), just adding query string to
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
  ![](https://dai.ly/x7tgcev?width=100%&height=400)
768
777
  ```
769
778
 
779
+ #### Spotify Usage
780
+
781
+ ```markdown
782
+ ![](http://open.spotify.com/track/4Dg5moVCTqxAb7Wr8Dq2T5)
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
+ ![](https://soundcloud.com/aviciiofficial/preview-avicii-vs-lenny)
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
  ![](//techslides.com/demos/sample-videos/small.mp4?width=400)
778
803
  ```
779
804
 
805
+ #### General Audio Usage
806
+
807
+ ```markdown
808
+ ![](//www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3)
809
+
810
+ ![](//www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3?autoplay=1&loop=1)
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 `lading` value to `lazy`
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
@@ -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
 
@@ -10,7 +10,7 @@ module Jekyll::Spaceship
10
10
  'plantuml-processor',
11
11
  'mermaid-processor',
12
12
  'polyfill-processor',
13
- 'video-processor',
13
+ 'media-processor',
14
14
  'emoji-processor',
15
15
  'element-processor'
16
16
  ]
@@ -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
+ # ![audio](//www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3)
33
+ # ![audio](//www.expample.com/examples/t-rex-roar.mp3?autoplay=true&loop=true)
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
+ # ![video](//www.html5rocks.com/en/tutorials/video/basics/devstories.webm)
45
+ # ![video](//techslides.com/demos/sample-videos/small.ogv?allow=autoplay)
46
+ # ![video](//techslides.com/demos/sample-videos/small.mp4?width=400)
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
+ # ![youtube](https://www.youtube.com/watch?v=XA2WjJbmmoM "title")
57
+ # ![youtube](http://www.youtube.com/embed/w-m_yZCLF5Q)
58
+ # ![youtube](//youtu.be/mEP3YXaSww8?height=100%&width=400)
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
+ # ![vimeo](https://vimeo.com/263856289)
70
+ # ![vimeo](https://vimeo.com/263856289?height=100%&width=400)
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
+ # ![dailymotion](https://www.dailymotion.com/video/x7tgcev)
82
+ # ![dailymotion](https://dai.ly/x7tgcev?height=100%&width=400)
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
+ # ![spotify](//open.spotify.com/track/4Dg5moVCTqxAb7Wr8Dq2T5)
94
+ # ![spotify](//open.spotify.com/track/37mEkAaqCE7FXMvnlVA8pp?width=400)
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
+ # ![soundcloud](//soundcloud.com/aviciiofficial/preview-avicii-vs-lenny)
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
+ "![\1](#{ref_value})")
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
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Jekyll
4
4
  module Spaceship
5
- VERSION = "0.9.0"
5
+ VERSION = "0.9.1"
6
6
  end
7
7
  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.0
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-01 00:00:00.000000000 Z
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, etc.
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
- # ![video](//www.html5rocks.com/en/tutorials/video/basics/devstories.webm)
30
- # ![video](//techslides.com/demos/sample-videos/small.ogv?allow=autoplay)
31
- # ![video](//techslides.com/demos/sample-videos/small.mp4?width=400)
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
- # ![youtube](https://www.youtube.com/watch?v=XA2WjJbmmoM "title")
41
- # ![youtube](http://www.youtube.com/embed/w-m_yZCLF5Q)
42
- # ![youtube](//youtu.be/mEP3YXaSww8?height=100%&width=400)
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
- # ![vimeo](https://vimeo.com/263856289)
53
- # ![vimeo](https://vimeo.com/263856289?height=100%&width=400)
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
- # ![dailymotion](https://www.dailymotion.com/video/x7tgcev)
64
- # ![dailymotion](https://dai.ly/x7tgcev?height=100%&width=400)
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
- "![\1](#{ref_value})")
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