markdown_videos 0.1.1 → 1.0.0

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
  !binary "U0hBMQ==":
3
- metadata.gz: bca9063d5eb7dd88466325ac8100073c5111e805
4
- data.tar.gz: d2a304156bb0a6a24753a98ca4e810353d72d9e7
3
+ metadata.gz: b322a4f32f6b252011b2d3f74c86bbdc11ca30b0
4
+ data.tar.gz: a1a965e73e842d1e1e873ea3646d69e21e09dbc6
5
5
  SHA512:
6
- metadata.gz: a0da59e38bf6f22c6ae1ae9d1c4b29160f39cb124f61edb8549587c87aabb13bac1e9aae8dcc5182907f736e14b067e51971b2a40a4f458eac6ad8211172231f
7
- data.tar.gz: b4388cf7f60178543d928c332da087ce20f3fe030d52f1608ba7341ff2e864014e29e1a077d5448998ccb7786ca06ce418ea9731ed05474048ca4f26c2692bb2
6
+ metadata.gz: 7c7b519ac8d8995cc303ec22de89f2e83acbb6e29364905f5d8967538f09370a08c998c6221499831f1eb180265c77a95896b9d6703a35fbbbca3772838c5177
7
+ data.tar.gz: e03271030f4aa77d050533300d4a8ee503ec08c44aa8a777b9619d85e638a21a57e0f65f21a13ca9bc2362912fd189dd2295ba202a88730b5ca9eb4dbbf727c4
@@ -1,5 +1,5 @@
1
- require "markdown_videos/renderer"
2
1
  require "markdown_videos/services"
2
+ require "markdown_videos/renderer"
3
3
  require "markdown_videos/configuration"
4
4
 
5
5
  module MarkdownVideos
@@ -3,9 +3,9 @@ module MarkdownVideos
3
3
  class Configuration
4
4
 
5
5
  attr_accessor :wrapper,
6
- :classname
6
+ :class_name
7
7
 
8
- # if defined, needs to contain `%s` where HTML markup should be included
8
+ # if defined, needs to contain `%s` where rendered HTML element should be included
9
9
  # e.g.: WRAPPER = '<p class="embed-responsive embed-responsive-16by9">%s</p>'.freeze
10
10
  def wrapper
11
11
  @wrapper || nil
@@ -16,9 +16,9 @@ module MarkdownVideos
16
16
  @wrapper = wrapper
17
17
  end
18
18
 
19
- # extra classname(s) added to embed HTML markup
20
- def classname
21
- @classname || nil
19
+ # extra class_name(s) added to embed HTML element
20
+ def class_name
21
+ @class_name || nil
22
22
  end
23
23
 
24
24
  end
@@ -4,51 +4,37 @@ module MarkdownVideos
4
4
 
5
5
  class Renderer
6
6
 
7
- def initialize(string, options = {})
8
- @string = string
7
+ attr_reader :markdown_text
8
+
9
+ def initialize(markdown_text, options = {})
10
+ @markdown_text = markdown_text
9
11
  @options = {
10
12
  wrapper: MarkdownVideos.defaults.wrapper,
11
- classname: MarkdownVideos.defaults.classname
13
+ class_name: MarkdownVideos.defaults.class_name
12
14
  }.merge(options || {})
13
15
  end
14
16
 
15
17
  def render
16
- MarkdownVideos::SERVICES.keys.each do |service|
17
- @string = render_service(service)
18
- end
19
- @string
20
- end
18
+ @markdown_text.gsub(/!\[([^\]]*)\]\(([^)]+)\)/) do
19
+ rendered = nil
20
+ match_data = Regexp.last_match
21
+ markdown = {
22
+ alt_text: match_data[1],
23
+ url: match_data[2]
24
+ }
21
25
 
22
- private
26
+ service_class = find_service_for(markdown[:url])
23
27
 
24
- def render_service(service)
25
- values = MarkdownVideos::SERVICES[service]
26
- @string.gsub(values[:regexp]) do |match|
27
- match_data = Regexp.last_match
28
- id = match_data[3]
29
- title = match_data[1]
30
- url = Addressable::URI.parse(match_data[2])
31
- url_parameters = url.query_values || {}
32
-
33
- html_markup = sprintf(values[:markup],
34
- CGI::escapeHTML(title),
35
- service_url(service, id, url_parameters),
36
- @options[:classname].nil? ? "" : " class=\"#{@options[:classname]}\"")
37
-
38
- if @options[:wrapper].nil?
39
- html_markup
28
+ if service_class
29
+ service_class.new(markdown[:alt_text], markdown[:url], @options).render
40
30
  else
41
- sprintf(@options[:wrapper], html_markup)
31
+ match_data.string
42
32
  end
43
33
  end
44
34
  end
45
35
 
46
- def service_url(service, id, url_parameters = {})
47
- url = sprintf(MarkdownVideos::SERVICES[service][:url], id)
48
- uri = Addressable::URI.parse(url)
49
- url_parameters.select! { |k, v| MarkdownVideos::SERVICES[service][:url_parameters].include?(k.to_sym) && (!v.nil? || !v.empty?) } if url_parameters
50
- uri.query_values = url_parameters unless url_parameters.nil? || url_parameters.empty?
51
- uri.to_s
36
+ def find_service_for(url)
37
+ MarkdownVideos::SERVICES.find { |service_class| service_class.support(url) }
52
38
  end
53
39
 
54
40
  end
@@ -0,0 +1,137 @@
1
+ module MarkdownVideos
2
+ module Services
3
+
4
+ class ServiceBase
5
+
6
+ attr_accessor :resource_id,
7
+ :alt_text,
8
+ :markdown_url,
9
+ :markdown_url_data,
10
+ :width,
11
+ :height,
12
+ :wrapper,
13
+ :class_name
14
+
15
+ def self.support(markdown_url)
16
+ markdown_url =~ regexp
17
+ end
18
+
19
+ # URL matcher
20
+ def self.regexp
21
+ raise NotImplementedError "#{self.class} should implement #regexp method"
22
+ end
23
+
24
+
25
+ def initialize(alt_text, markdown_url, options)
26
+ @alt_text = alt_text
27
+ @markdown_url = markdown_url
28
+ options.each { |option, value| self.send("#{option}=", value) }
29
+ end
30
+
31
+ # URL to be consumed by #to_html
32
+ def url
33
+ raise NotImplementedError "#{self.class} should implement #url method"
34
+ end
35
+
36
+ # List of authorized url parameters
37
+ #
38
+ # @return [Array<Symbol>] e.g.: [:start]
39
+ def url_parameters
40
+ []
41
+ end
42
+
43
+ def width
44
+ @width || 500
45
+ end
46
+
47
+ def height
48
+ @height || 281
49
+ end
50
+
51
+ # @return [String] escaped alternative text given through markdown syntax
52
+ def alt_text
53
+ CGI::escapeHTML(@alt_text)
54
+ end
55
+
56
+ # @return [String] resource ID of the service resource rendered base on given URL
57
+ def resource_id
58
+ @resource_id ||= markdown_url_data[2]
59
+ end
60
+
61
+ # @return [MatchData] match data from matching URL to service regexp
62
+ def markdown_url_data
63
+ @markdown_url_data ||= self.class.regexp.match(markdown_url)
64
+ end
65
+
66
+ # @return [String] service URL to be consumed by #to_html
67
+ def service_url
68
+ given_url = Addressable::URI.parse(markdown_url)
69
+ given_url_parameters = given_url.query_values || {}
70
+ given_url_parameters.select! { |attribute, value| url_parameters.include?(attribute.to_sym) && (!value.nil? || !value.empty?) }
71
+
72
+ service_url = Addressable::URI.parse(url)
73
+ service_url.query_values = given_url_parameters unless given_url_parameters.nil? || given_url_parameters.empty?
74
+ service_url.to_s
75
+ end
76
+
77
+ # Default HTML rendering
78
+ #
79
+ # @retun [String] markup to render
80
+ def to_html
81
+ "<iframe #{html_dom_properties}></iframe>"
82
+ end
83
+
84
+ # Renders the set of HTML attributes
85
+ #
86
+ # @return [String] string of dom properties
87
+ def html_dom_properties
88
+ html_attributes.map { |k, v| render_param(k, v) }.compact.join(" ")
89
+ end
90
+
91
+ # Default set of HTML attributes for default iframe element
92
+ #
93
+ # @return [Hash]
94
+ def html_attributes
95
+ {
96
+ title: alt_text,
97
+ src: service_url,
98
+ width: width,
99
+ height: height,
100
+ class: class_name,
101
+ frameborder: "0",
102
+ webkitallowfullscreen: true,
103
+ mozallowfullscreen: true,
104
+ allowfullscreen: true
105
+ }
106
+ end
107
+
108
+ def render
109
+ if wrapper
110
+ sprintf(wrapper, to_html)
111
+ else
112
+ to_html
113
+ end
114
+ end
115
+
116
+ private
117
+
118
+ # Renders HTML5 attribute, meant to be used with `Hash.map`
119
+ #
120
+ # @param attribute [Symbol, String]
121
+ # @param value [true, String, false] `true` if you want only the attribute. `false`, `nil` or empty String to skip attribute
122
+ #
123
+ # @return [String] attribute="value"
124
+ def render_param(attribute, value)
125
+ if value == true
126
+ attribute.to_s
127
+ elsif !value || value.to_s.empty?
128
+ nil
129
+ else
130
+ "#{attribute}=\"#{value}\""
131
+ end
132
+ end
133
+
134
+ end
135
+ end
136
+
137
+ end
@@ -0,0 +1,15 @@
1
+ module MarkdownVideos::Services
2
+
3
+ class VimeoService < ServiceBase
4
+
5
+ def self.regexp
6
+ /(https?:\/\/(?:(?:player\.)?vimeo.com\/(?:video\/)?)([0-9]{4,16})\??([\w\-\=]+)?)/
7
+ end
8
+
9
+ def url
10
+ "https://player.vimeo.com/video/#{resource_id}"
11
+ end
12
+
13
+ end
14
+
15
+ end
@@ -0,0 +1,27 @@
1
+ module MarkdownVideos::Services
2
+
3
+ class YoutubeService < ServiceBase
4
+
5
+ def self.regexp
6
+ /(https?:\/\/(?:youtu.be\/|www.youtube.com\/(?:watch\?v=|embed\/))([\w\-]{4,16})\??([\w\-\=]+)?)/
7
+ end
8
+
9
+ def width
10
+ 560
11
+ end
12
+
13
+ def height
14
+ 315
15
+ end
16
+
17
+ def url
18
+ "https://www.youtube.com/embed/#{resource_id}"
19
+ end
20
+
21
+ def url_parameters
22
+ [:start]
23
+ end
24
+
25
+ end
26
+
27
+ end
@@ -1,33 +1,21 @@
1
1
  module MarkdownVideos
2
2
 
3
- #
4
- # Supported services list
5
- #
6
- # regexp: Regexp must capture in 1) title, 2) full url and 3) video id
7
- # markup: HTML markup rendered with first %s being altertive text and second %s being the video URL (iFrame src)
8
- # and third %s being class attribute declaration location (make sure there is only one space after, not before)
9
- # url: URL of service included in the markup, with first %s corresponding to video's ID
10
- # url_parameters: List of authorized URL parameters
11
- #
3
+ # This file `require` the ServiceBase class
4
+ # and all `_service` files present in services folder
12
5
 
13
- SERVICES = {
6
+ require_relative "services/service_base"
14
7
 
15
- # http://rubular.com/r/8Xb4s9ukXy
16
- youtube: {
17
- regexp: /!\[([^\]]*)\]\((https?:\/\/(?:youtu.be\/|www.youtube.com\/(?:watch\?v=|embed\/))([\w\-]{4,16})\??([\w\-\=]+)?)\)/,
18
- markup: '<iframe width="560" height="315" title="%s" src="%s"%s frameborder="0" allowfullscreen></iframe>',
19
- url: "https://www.youtube.com/embed/%s",
20
- url_parameters: [:start]
21
- },
8
+ Dir[File.expand_path("../services/*_service.rb", __FILE__)].each do |path|
9
+ require path
10
+ end
22
11
 
23
- # http://rubular.com/r/Upo2dmGbIJ
24
- vimeo: {
25
- regexp: /!\[([^\]]*)\]\((https?:\/\/(?:(?:player\.)?vimeo.com\/(?:video\/)?)([0-9]{4,16})\??([\w\-\=]+)?)\)/,
26
- markup: '<iframe title="%s" src="%s" width="500" height="281"%s frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>',
27
- url: "https://player.vimeo.com/video/%s",
28
- url_parameters: []
29
- }
12
+ # Build a static list of available Service classes
13
+ service_classes = MarkdownVideos::Services.constants.select do |class_name|
14
+ MarkdownVideos::Services.const_get(class_name).is_a?(Class) && class_name =~ /Service$/
15
+ end
30
16
 
31
- }.freeze
17
+ SERVICES = service_classes.map do |class_name|
18
+ Object.const_get("MarkdownVideos::Services::#{class_name}")
19
+ end
32
20
 
33
21
  end
@@ -1,3 +1,3 @@
1
1
  module MarkdownVideos
2
- VERSION = "0.1.1".freeze
2
+ VERSION = "1.0.0".freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: markdown_videos
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Capripot
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-14 00:00:00.000000000 Z
11
+ date: 2016-03-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: addressable
@@ -52,7 +52,7 @@ dependencies:
52
52
  - - ~>
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.4'
55
- description: Markdown syntax video parser
55
+ description: Markdown syntax parser to render embed services
56
56
  email: capripot@gmail.com
57
57
  executables: []
58
58
  extensions: []
@@ -63,6 +63,9 @@ files:
63
63
  - lib/markdown_videos/configuration.rb
64
64
  - lib/markdown_videos/renderer.rb
65
65
  - lib/markdown_videos/services.rb
66
+ - lib/markdown_videos/services/service_base.rb
67
+ - lib/markdown_videos/services/vimeo_service.rb
68
+ - lib/markdown_videos/services/youtube_service.rb
66
69
  - lib/markdown_videos/version.rb
67
70
  homepage: https://github.com/capripot/markdown_videos
68
71
  licenses:
@@ -76,7 +79,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
76
79
  requirements:
77
80
  - - ! '>='
78
81
  - !ruby/object:Gem::Version
79
- version: '2.0'
82
+ version: '2.1'
80
83
  required_rubygems_version: !ruby/object:Gem::Requirement
81
84
  requirements:
82
85
  - - ! '>='
@@ -88,6 +91,6 @@ rubygems_version: 2.2.3
88
91
  signing_key:
89
92
  specification_version: 4
90
93
  summary: A gem that provides ability to parse any string containing image markdown
91
- syntax into appropriate video HTML embed based on URL.
94
+ syntax into appropriate HTML embed service based on URL.
92
95
  test_files: []
93
96
  has_rdoc: false