convert 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/CHANGELOG.md +7 -0
  4. data/Gemfile +9 -0
  5. data/LICENSE +21 -0
  6. data/README.md +131 -0
  7. data/config/boot.rb +6 -0
  8. data/convert.gemspec +25 -0
  9. data/lib/convert.rb +0 -1
  10. data/lib/converters/auto_link.rb +19 -0
  11. data/lib/converters/dailymotion.rb +17 -0
  12. data/lib/converters/decode.rb +7 -0
  13. data/lib/converters/email_escape.rb +20 -0
  14. data/lib/converters/encode.rb +7 -0
  15. data/lib/converters/flickr.rb +23 -0
  16. data/lib/converters/gist.rb +17 -0
  17. data/lib/converters/google_maps.rb +35 -0
  18. data/lib/converters/hashtag.rb +14 -0
  19. data/lib/converters/html_escape.rb +11 -0
  20. data/lib/converters/iframe_embed.rb +10 -0
  21. data/lib/converters/image_tag.rb +9 -0
  22. data/lib/converters/instagram.rb +13 -0
  23. data/lib/converters/kramdown.rb +16 -0
  24. data/lib/converters/liveleak.rb +28 -0
  25. data/lib/converters/markdown.rb +18 -0
  26. data/lib/converters/metacafe.rb +28 -0
  27. data/lib/converters/nokogiri.rb +36 -0
  28. data/lib/converters/redcarpet.rb +10 -0
  29. data/lib/converters/sanitize.rb +13 -0
  30. data/lib/converters/simple_format.rb +9 -0
  31. data/lib/converters/soundcloud.rb +36 -0
  32. data/lib/converters/strip_params.rb +10 -0
  33. data/lib/converters/ted.rb +28 -0
  34. data/lib/converters/twitter.rb +21 -0
  35. data/lib/converters/unescape_html.rb +11 -0
  36. data/lib/converters/video_embed.rb +24 -0
  37. data/lib/converters/vimeo.rb +33 -0
  38. data/lib/converters/vimeo_embed.rb +10 -0
  39. data/lib/converters/worldstar.rb +18 -0
  40. data/lib/converters/youtube.rb +42 -0
  41. data/lib/converters/youtube_embed.rb +10 -0
  42. data/lib/converters/youtube_image.rb +35 -0
  43. data/lib/converters/youtube_js_api.rb +18 -0
  44. data/lib/sanitizers/custom.rb +45 -0
  45. data/lib/sanitizers/full.rb +46 -0
  46. data/lib/sanitizers/linebreaks.rb +12 -0
  47. data/lib/sanitizers/simple.rb +9 -0
  48. data/test.rb +16 -0
  49. metadata +63 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 72a005e6e0d9054fca9044e44f4c96fec4bc065c
4
- data.tar.gz: 4230ed4ec8975ef4fbe04f2994c83d0c989647a0
3
+ metadata.gz: fb05f6e5b1cfcbc5696673f4225795be29d0978a
4
+ data.tar.gz: 04dfaf51cfd169b58171067e83fccf892e2d2419
5
5
  SHA512:
6
- metadata.gz: 4d1422daa89619f9a12b04fb9238c6f16eb90d078ff3290fd50e69651ea276696aa3341eb04c90221b7184319640233eb8b99fee86f4f3fbae91ac348713d834
7
- data.tar.gz: ec167ef74c8b3a5ca614a22c963fa5c1e65ca4f6acc865f61c96a298147a2c0f457e93d613a0e3526a486dcc10b2616290f5f81cd04e715e6fb85e0523db00ac
6
+ metadata.gz: b852bd60f016e79141c7562e63ff96123eb9b122be67ea738420618f726cfce2d56a8583297f26fb709556c66cdde284e8c0a3b9ed223ab03b132e6fed3d39a2
7
+ data.tar.gz: f75962f693314439c7197691d752ea3b7d7412c89441947dd92ad66df934f30c90b86a9d47298bd634c5789d0e7902e7c726707561340166b00eccdd7fda28dd
data/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ .bundle
2
+ Gemfile.lock
data/CHANGELOG.md ADDED
@@ -0,0 +1,7 @@
1
+ **Version 0.1.1** - *2016-05-01*
2
+
3
+ - Fixed gemspec issues
4
+
5
+ **Version 0.1.0** - *2016-04-01*
6
+
7
+ - Renamed html_escape to escape_html
data/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ group :development do
6
+ gem 'rerun'
7
+ gem 'rb-fsevent'
8
+ gem 'terminal-notifier'
9
+ end
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2016 Fugroup
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,131 @@
1
+ # Convert strings and HTML to links and embedded content
2
+
3
+ Convert any string or HTML to links and embedded content from a long list of providers and libraries.
4
+
5
+ ### Installation
6
+ ```
7
+ gem install convert
8
+ ```
9
+ or add to Gemfile.
10
+
11
+ ### Usage
12
+
13
+ ```ruby
14
+ # Require convert if you're not using bundler
15
+ require 'convert'
16
+
17
+ # Run default converters. Pass :converters => [:auto_link, :decode]
18
+ Convert.run('string')
19
+
20
+ # Convert with Nokogiri, used by 'run'
21
+ Convert.nokogiri('HTML string')
22
+
23
+ # URL to HTML link
24
+ Convert.auto_link('https://crowdfundhq.com')
25
+
26
+ # Embed dailymotion videos (https://dailymotion.com)
27
+ Convert.dailymotion('string')
28
+
29
+ # Decode HTML, opposite of above
30
+ Convert.decode('string')
31
+
32
+ # Encode HTML with HTMLEntities
33
+ Convert.encode('string')
34
+
35
+ # Remove embedded videos from emails
36
+ Convert.email_escape('string')
37
+
38
+ # Embed flickr content (https://flickr.com)
39
+ Convert.flickr('string')
40
+
41
+ # Embed a Github gist (https://gist.github.com)
42
+ Convert.gist('string')
43
+
44
+ # Embed classic google maps (https://maps.google.com)
45
+ Convert.google_maps('string')
46
+
47
+ # Twitter or Facebook hastag to HTML link
48
+ Convert.hashtag('#flat')
49
+
50
+ # Escape HTML
51
+ Convert.escape_html('html')
52
+
53
+ # Unescape HTML
54
+ Convert.unescape_html('string')
55
+
56
+ # Embed iframe
57
+ Convert.iframe_embed('https://crowdfundhq.com/campaigns/flatty.embed')
58
+
59
+ # Convert
60
+ Convert.image_tag('https://crowdfundhq.com/logo.png')
61
+
62
+ # URL to Instagram embedded content
63
+ Convert.instagram('string')
64
+
65
+ # String to markdown (https://kramdown.gettalong.org)
66
+ Convert.kramdown('string')
67
+
68
+ # Embed live leak videos
69
+ Convert.liveleak('string')
70
+
71
+ # Embed markdown with Redcarpet
72
+ Convert.redcarpet('string')
73
+
74
+ # Sanitize HTML with the Sanitize gem
75
+ Convert.sanitize('HTML string')
76
+
77
+ # Sanitize config: :custom, :full, :linebreaks, :simple, :restricted, :basic, :relaxed
78
+ # You can add your own config by adding a file like the ones here:
79
+ # https://github.com/fugroup/convert/tree/master/lib/sanitizers
80
+ Convert.sanitize('HTML string', :config => :custom)
81
+
82
+ # Strip parameters from URL
83
+ Convert.strip_params('URL string')
84
+
85
+ # Same as above, a few other options
86
+ Convert.markdown('string')
87
+
88
+ # Embed metacafe content (https://www.metacafe.com)
89
+ Convert.metacafe('string')
90
+
91
+ # New lines to HTML br tags
92
+ Convert.simple_format('string')
93
+
94
+ # Embed Soundcloud music (https://soundcloud.com)
95
+ Convert.soundcloud('string')
96
+
97
+ # Embed TED videos (https://www.ted.com)
98
+ Convert.ted('string')
99
+
100
+ # Twitter embed tweet (https://twitter.com)
101
+ Convert.twitter('string')
102
+
103
+ # Embed Youtube or Vimeo videos from URL
104
+ Convert.video_embed('string')
105
+
106
+ # Embed Vimeo video, full (https://vimeo.com)
107
+ Convert.vimeo('string')
108
+
109
+ # Embed Vimeo video, simple
110
+ Convert.vimeo_embed('string')
111
+
112
+ # Embed worldstar content
113
+ Convert.worldstar('string')
114
+
115
+ # Embed Youtube videos, full (https://youtube.com)
116
+ Convert.youtube('string')
117
+
118
+ # Embed Youtube videos, simple
119
+ Convert.youtube_embed('string')
120
+
121
+ # Embed Youtube image
122
+ Convert.youtube_image('string')
123
+
124
+ # Embed Youtube JS API
125
+ Convert.youtube_js_api('string')
126
+
127
+ ```
128
+
129
+ Created and maintained by [Fugroup Ltd.](https://www.fugroup.net) We are the creators of [CrowdfundHQ.](https://crowdfundhq.com)
130
+
131
+ `@authors: Vidar`
data/config/boot.rb ADDED
@@ -0,0 +1,6 @@
1
+ require 'bundler/setup'
2
+ Bundler.require(:default, :development)
3
+
4
+ MODE = ENV['RACK_ENV'] || 'development'
5
+
6
+ require './lib/convert.rb'
data/convert.gemspec ADDED
@@ -0,0 +1,25 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'convert'
3
+ s.version = '0.1.1'
4
+ s.date = '2017-01-05'
5
+ s.summary = "Convert strings and HTML to links and embedded content"
6
+ s.description = "Easily convert any string and replace with links and embedded content from a long list of providers and libraries."
7
+ s.authors = ["Fugroup Limited"]
8
+
9
+ s.add_runtime_dependency 'redcarpet', '~> 3.4'
10
+ s.add_runtime_dependency 'kramdown', '~> 1.9'
11
+ s.add_runtime_dependency 'rinku', '~> 2.0'
12
+ s.add_runtime_dependency 'sanitize', '~> 4.4'
13
+ s.add_runtime_dependency 'htmlentities', '~> 4.3'
14
+ s.add_runtime_dependency 'nokogiri', '~> 1.6'
15
+ s.add_development_dependency 'futest', '>= 0'
16
+
17
+ s.email = 'mail@fugroup.net'
18
+ s.homepage = 'https://github.com/fugroup/convert'
19
+ s.license = 'MIT'
20
+
21
+ s.require_paths = ['lib']
22
+ s.files = `git ls-files -z`.split("\x0").reject do |f|
23
+ f.match(%r{^(test|spec|features)/})
24
+ end
25
+ end
data/lib/convert.rb CHANGED
@@ -5,7 +5,6 @@ Dir['./lib/converters/*.rb'].each{|f| require f}
5
5
  Dir['./lib/sanitizers/*.rb'].each{|f| require f}
6
6
 
7
7
  # Autoload for faster loading
8
-
9
8
  module Converters
10
9
  autoload :Redcarpet, 'redcarpet'
11
10
  autoload :Kramdown, 'kramdown'
@@ -0,0 +1,19 @@
1
+ module Converters
2
+
3
+ # Convert URL to html link
4
+ def auto_link(string, options = {})
5
+ options = {
6
+ :mode => :all,
7
+ :link_attr => nil,
8
+ :skip_tags => nil,
9
+ :strip => false
10
+ }.merge(options)
11
+
12
+ Rinku.auto_link(string, options[:mode], options[:link_attr], options[:skip_tags]) do |url|
13
+ # Remove query options (default false)
14
+ url = strip_params(url) if options[:strip]
15
+ url
16
+ end
17
+ end
18
+
19
+ end
@@ -0,0 +1,17 @@
1
+ module Converters
2
+
3
+ def dailymotion(string, options = {})
4
+ # http://www.dailymotion.com/video/x3gpxwp_first-person-view-of-a-downhill-ice-cross-course-red-bull-crashed-ice-2015_sport
5
+
6
+ # Original 480 360
7
+ options = {:width => 590, :height => 335}.merge(options)
8
+
9
+ @regex = /http:\/\/www\.dailymotion\.com.*\/video\/(.+)_*/
10
+
11
+ string.gsub(@regex) do
12
+ video_id = $1
13
+ %{<object type="application/x-shockwave-flash" data="http://www.dailymotion.com/swf/#{video_id}&related=0" width="#{options[:width]}" height="#{options[:height]}"><param name="movie" value="http://www.dailymotion.com/swf/#{video_id}&related=0"></param><param name="allowFullScreen" value="true"></param><param name="allowScriptAccess" value="always"></param><a href="http://www.dailymotion.com/video/#{video_id}?embed=1"><img src="http://www.dailymotion.com/thumbnail/video/#{video_id}" width="#{options[:width]}" height="#{options[:height]}"/></a></object>}
14
+ end
15
+ end
16
+
17
+ end
@@ -0,0 +1,7 @@
1
+ module Converters
2
+
3
+ def decode(string, options = {})
4
+ HTMLEntities.new.decode(string)
5
+ end
6
+
7
+ end
@@ -0,0 +1,20 @@
1
+ module Converters
2
+
3
+ # Remove stuff from email body that is going to be stripped anyway.
4
+ def email_escape(string, options = {})
5
+
6
+ # No options at the moment
7
+ options = {}.merge(options)
8
+
9
+ # Youtube videos
10
+ @regex = /<iframe.+src=['"].+\/embed\/(.+)[?].+['"].+iframe>/
11
+ string = string.gsub(@regex, "https://youtu.be/#{'\1'}")
12
+
13
+ # Vimeo videos
14
+ # Example: https://vimeo.com/59437462
15
+ @regex = /<iframe.+src=['"]\/\/player\.vimeo.com\/video\/(.+)[?]{1}.+['"].+iframe>/
16
+ string = string.gsub(@regex, "https://vimeo.com/#{'\1'}")
17
+ string
18
+ end
19
+
20
+ end
@@ -0,0 +1,7 @@
1
+ module Converters
2
+
3
+ def encode(string, options = {})
4
+ HTMLEntities.new.encode(string)
5
+ end
6
+
7
+ end
@@ -0,0 +1,23 @@
1
+ module Converters
2
+
3
+ def flickr(string, options = {})
4
+ # https://www.flickr.com/photos/fotokunstsusanne/23160248869
5
+
6
+ {:maxwidth => nil, :maxheight => nil, :link_options => {}}.merge(options)
7
+ @regex = %r{https?://(www\.)?flickr\.com/photos/[^\s<]*}
8
+
9
+ string.gsub(@regex) do |match|
10
+ params = { :url => match, :format => "json" }
11
+ [:maxwidth, :maxheight].each{|p| params[p] = options[p] unless options[p].nil? or !options[p] > 0}
12
+
13
+ uri = URI("http://www.flickr.com/services/oembed")
14
+ uri.query = URI.encode_www_form(params)
15
+
16
+ response = JSON.parse(Net::HTTP.get(uri))
17
+
18
+ link_options = Array(options[:link_options]).reject { |k,v| v.nil? }.map { |k, v| %{#{k}="#{REXML::Text::normalize(v)}"} }.join(' ')
19
+ %{<a href="#{match}"#{ ' ' + link_options unless link_options.empty? }><img src="#{response["url"]}" alt="#{response["title"]}" title="#{response["title"]}" /></a>}
20
+ end
21
+ end
22
+
23
+ end
@@ -0,0 +1,17 @@
1
+ module Converters
2
+
3
+ def gist(string, options = {})
4
+ # https://gist.github.com/1710276
5
+
6
+ # No options at the moment
7
+ options = {}.merge(options)
8
+
9
+ @regex = %r{https?://gist\.github\.com/(\w+/)?(\d+)}
10
+
11
+ string.gsub(@regex) do
12
+ gist_id = $2
13
+ %{<script src="https://gist.github.com/#{gist_id}.js"></script>}
14
+ end
15
+ end
16
+
17
+ end
@@ -0,0 +1,35 @@
1
+ module Converters
2
+
3
+ def google_maps(string, options = {})
4
+ options = {
5
+ :width => 420,
6
+ :height => 315,
7
+ :style => "color:#000;text-align:left",
8
+ :link_text => "View Larger Map",
9
+ :show_info => true,
10
+ :type => :normal,
11
+ :zoom => 18,
12
+ :more => ''
13
+ }.merge(options)
14
+
15
+ map_type = {:normal => '&t=m', :satellite => '&t=k', :terrain => '&t=p', :hybrid => '&t=h'}
16
+
17
+ @regex = /(https?):\/\/maps\.google\.([a-z\.]+)\/maps\?(.*)/
18
+
19
+ string.gsub(@regex) do
20
+ domain_country = $2
21
+ map_query = $3
22
+ width = options[:width]
23
+ height = options[:height]
24
+ style = options[:style]
25
+ link_text = options[:link_text]
26
+ type = options[:type].to_sym
27
+ map_options = (options[:show_info] ? '' : '&iwloc=near')
28
+ map_options << map_type[type] if map_type.has_key?(type)
29
+ map_options << "&z=#{options[:zoom]}"
30
+ map_options << options[:more]
31
+ %{<iframe width="#{width}" height="#{height}" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="//maps.google.#{domain_country}/maps?f=q&source=s_q&#{map_query}&output=embed#{map_options}"></iframe><br><small><a href="//maps.google.#{domain_country}/maps?f=q&source=embed&#{map_query}" style="#{style}">#{link_text}</a></small>}
32
+ end
33
+ end
34
+
35
+ end
@@ -0,0 +1,14 @@
1
+ module Converters
2
+
3
+ def hashtag(string, options = {})
4
+ options = {:source => :twitter}.merge(options)
5
+ @regex = /#([^\s]+)/
6
+
7
+ if options[:source] == :twitter
8
+ string.gsub(@regex, '<a href="http://twitter.com/search?q=%23\1&f=realtime" class="hashtag" target="_blank">#\1</a>')
9
+ elsif options[:source] == :facebook
10
+ string.gsub(@regex, '<a href="https://www.facebook.com/hashtag/\1" class="hashtag" target="_blank">#\1</a>')
11
+ end
12
+ end
13
+
14
+ end
@@ -0,0 +1,11 @@
1
+ module Converters
2
+
3
+ # Escape html
4
+ def escape_html(string, options = {})
5
+ options = {:map => {'&' => '&amp;', '>' => '&gt;', '<' => '&lt;', '"' => '&quot;' }}.merge(options)
6
+
7
+ @regex = /[&"><]/
8
+ string.gsub(@regex){|m| options[:map][m]}
9
+ end
10
+
11
+ end
@@ -0,0 +1,10 @@
1
+ module Converters
2
+
3
+ # Iframe embed code
4
+ def iframe_embed(url, options = {})
5
+ options = {:width => 231, :height => 436, :scrolling => 'no', :frameborder => 0}.merge(options)
6
+
7
+ %{<iframe frameborder="#{options[:frameborder]}" scrolling="#{options[:scrolling]}" height="#{options[:height]}" width="#{options[:width]}" src="#{url}"></iframe>}
8
+ end
9
+
10
+ end
@@ -0,0 +1,9 @@
1
+ module Converters
2
+
3
+ # Convert image to img html tag
4
+ def image_tag(src, options = {})
5
+ options = {:alt => ''}.merge(options)
6
+ %{<img src="#{src}" alt="#{options[:alt]}">}
7
+ end
8
+
9
+ end
@@ -0,0 +1,13 @@
1
+ module Converters
2
+
3
+ def instagram(string, options = {})
4
+ options = {:height => 714, :width => 616}.merge(options)
5
+ @regex = %r{https?:\/\/(www.)?instagr(am\.com|\.am)/p/.+}
6
+
7
+ string.gsub(@regex) do
8
+ string += '/' unless string.end_with?('/')
9
+ %{<iframe src="#{string}embed" height="#{options[:height]}" width="#{options[:width]}" frameborder="0" scrolling="no"></iframe>}
10
+ end
11
+ end
12
+
13
+ end
@@ -0,0 +1,16 @@
1
+ module Converters
2
+
3
+ def kramdown(string, options = {})
4
+ options = {
5
+ :auto_ids => false,
6
+ :entity_output => :as_char,
7
+ :enable_coderay => true,
8
+ :parse_block_html => true,
9
+ :parse_span_html => true,
10
+ :smart_quotes => ['apos', 'apos', 'quot', 'quot']
11
+ }.merge(options)
12
+
13
+ Kramdown::Document.new(string, options).to_html
14
+ end
15
+
16
+ end
@@ -0,0 +1,28 @@
1
+ module Converters
2
+
3
+ def liveleak(string, options = {})
4
+ options = {
5
+ :width => 420,
6
+ :height => 315,
7
+ :frameborder => 0,
8
+ :wmode => nil,
9
+ :autoplay => false,
10
+ :hide_related => false
11
+ }.merge(options)
12
+
13
+ @regex = %r{http://www\.liveleak\.com/(?:ll_embed|view)\?.=(\w+)}
14
+
15
+ string.gsub(@regex) do
16
+ a = []
17
+ a << "wmode=#{options[:wmode]}" if options[:wmode]
18
+ a << "autoplay=1" if options[:autoplay]
19
+ a << "rel=0" if options[:hide_related]
20
+
21
+ src = "http://www.liveleak.com/ll_embed?f=#{$1}"
22
+ src += "?#{a.join '&'}" unless a.empty?
23
+
24
+ %{<iframe width="#{options[:width]}" height="#{options[:height]}" src="#{src}" frameborder="#{options[:frameborder]}" allowfullscreen></iframe>}
25
+ end
26
+ end
27
+
28
+ end
@@ -0,0 +1,18 @@
1
+ module Converters
2
+
3
+ # Converts the string into html
4
+ def markdown(string, options = {})
5
+ options = {
6
+ :autolink => true,
7
+ :fenced_code_blocks => true,
8
+ :disable_indented_code_blocks => true,
9
+ :no_intra_emphasis => true
10
+ }.merge(options)
11
+
12
+ Redcarpet::Markdown.new(
13
+ Redcarpet::Render::HTML.new(:filter_html => false, :hard_wrap => true),
14
+ options
15
+ ).render(string)
16
+ end
17
+
18
+ end
@@ -0,0 +1,28 @@
1
+ module Converters
2
+
3
+ # Convert metacafe movie URL to embedded html
4
+ def metacafe(string, options = {})
5
+ # Original 440 272
6
+ options = {
7
+ :width => 590,
8
+ :height => 335,
9
+ :show_stats => false,
10
+ :autoplay => false
11
+ }.merge(options)
12
+
13
+ @regex = /http:\/\/www\.metacafe\.com\/watch\/([A-Za-z0-9._%-]*)\/([A-Za-z0-9._%-]*)(\/)?/
14
+
15
+ string.gsub(@regex) do
16
+ metacafe_id = $1
17
+ metacafe_slug = $2
18
+ width = options[:width]
19
+ height = options[:height]
20
+ show_stats = options[:show_stats] ? "showStats=yes" : "showStats=no"
21
+ autoplay = options[:autoplay] ? "autoPlay=yes" : "autoPlay=no"
22
+ flash_vars = [show_stats, autoplay].join("|")
23
+
24
+ %{<div style="background:#000000;width:#{width}px;height:#{height}px"><embed flashVars="playerVars=#{flash_vars}" src="http://www.metacafe.com/fplayer/#{metacafe_id}/#{metacafe_slug}.swf" width="#{width}" height="#{height}" wmode="transparent" allowFullScreen="true" allowScriptAccess="always" name="Metacafe_#{metacafe_id}" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash"></embed></div>}
25
+ end
26
+ end
27
+
28
+ end
@@ -0,0 +1,36 @@
1
+ module Converters
2
+
3
+ SKIP = ['a', 'pre', 'code', 'kbd', 'script', 'iframe', 'img', 'link']
4
+
5
+ # Scan a string with Nokogiri and convert if match string
6
+ def scan(string, options = {})
7
+ return string if options[:converters].empty?
8
+
9
+ doc = Nokogiri::HTML.fragment(string)
10
+
11
+ doc.search('.//text()').each do |el|
12
+ t = el.text
13
+ if t.strip.size > 0
14
+ t = convert(t, options) if convertable?(el)
15
+ end
16
+ el.replace(t)
17
+ end
18
+
19
+ doc.to_html
20
+ end
21
+
22
+ # Loop converters and convert
23
+ def convert(string, options = {})
24
+ options[:converters].each{|c| string = send(c, string)}
25
+ string
26
+ end
27
+
28
+ # Checks if a node is convertable by scanning the parents
29
+ def convertable?(node)
30
+ while(node = node.parent) do
31
+ return false if SKIP.include?(node.name)
32
+ end
33
+ true
34
+ end
35
+
36
+ end
@@ -0,0 +1,10 @@
1
+ module Converters
2
+
3
+ # Markown converter
4
+ def redcarpet(string, options = {})
5
+ options = {:renderer => Redcarpet::Render::HTML, :markdown_options => {}}.merge(options)
6
+
7
+ Redcarpet::Markdown.new(options[:renderer], options[:markdown_options]).render(string)
8
+ end
9
+
10
+ end
@@ -0,0 +1,13 @@
1
+ module Converters
2
+
3
+ CONFIGS = [:custom, :full, :linebreaks, :simple, :restricted, :basic, :relaxed]
4
+
5
+ def sanitize(string, options = {})
6
+ return string if options[:config] == false
7
+ options = {:config => nil}.merge(options)
8
+
9
+ config = Object.const_get("Sanitize::Config::#{options[:config].to_s.upcase}") if CONFIGS.include?(options[:config])
10
+ Sanitize.fragment(string, config || {})
11
+ end
12
+
13
+ end
@@ -0,0 +1,9 @@
1
+ module Converters
2
+
3
+ # Convert newlines to br tags
4
+ def simple_format(string, options = {})
5
+ options = {:config => :simple}.merge(options)
6
+ sanitize(string.gsub(%r{(\r\n|\n|\r)}, '<br>'), options)
7
+ end
8
+
9
+ end
@@ -0,0 +1,36 @@
1
+ module Converters
2
+
3
+ # Convert soundcloud player URL to embedded iframe
4
+ def soundcloud(string, options = {})
5
+ options = {
6
+ :width => '100%',
7
+ :height => 166,
8
+ :auto_play => false,
9
+ :theme_color => '00FF00',
10
+ :color => '915f33',
11
+ :show_comments => false,
12
+ :show_artwork => false
13
+ }.merge(options)
14
+
15
+ @regex = /(https?:\/\/)?(www.)?soundcloud\.com\/\S*/
16
+
17
+ begin
18
+ string.gsub(@regex) do |match|
19
+ new_uri = match.to_s
20
+ new_uri = (new_uri =~ /^https?\:\/\/.*/) ? URI(new_uri) : URI("http://#{new_uri}")
21
+ new_uri.normalize!
22
+ width = options[:width]
23
+ height = options[:height]
24
+ auto_play = options[:auto_play]
25
+ theme_color = options[:theme_color]
26
+ color = options[:color]
27
+ show_artwork = options[:show_artwork]
28
+ show_comments = options[:show_comments]
29
+ %{<iframe width="#{width}" height="#{height}" scrolling="no" frameborder="no" src="http://w.soundcloud.com/player/?url=#{new_uri}&show_artwork=#{show_artwork}&show_comments=#{show_comments}&auto_play=#{auto_play}&color=#{color}&theme_color=#{theme_color}"></iframe> }
30
+ end
31
+ rescue URI::InvalidURIError
32
+ string
33
+ end
34
+ end
35
+
36
+ end
@@ -0,0 +1,10 @@
1
+ module Converters
2
+
3
+ # Remove query params
4
+ def strip_params(url)
5
+ uri = URI.parse(URI.encode(url.strip))
6
+ uri.query = nil
7
+ uri.to_s
8
+ end
9
+
10
+ end
@@ -0,0 +1,28 @@
1
+ module Converters
2
+
3
+ # Convert ted movie URL to embedded iframe
4
+ def ted(string, options = {})
5
+ # Original: 640 360
6
+ options = {
7
+ :width => 590,
8
+ :height => 335,
9
+ :scrolling => 'no',
10
+ :frameborder => 0,
11
+ :allow_full_screen => false
12
+ }.merge(options)
13
+
14
+ @regex = /https?:\/\/(www.|embed.)?ted\.com\/talks\/([A-Za-z0-9._%-]*)\.html((\?|#)\S+)?/
15
+
16
+ string.gsub(@regex) do
17
+ ted_page = $2
18
+ width = options[:width]
19
+ height = options[:height]
20
+ frameborder = options[:frameborder]
21
+ scrolling = options[:scrolling]
22
+ allow_full_screen = options[:allow_full_screen]
23
+
24
+ %{<iframe width="#{width}" height="#{height}" frameborder="#{frameborder}" scrolling="#{scrolling}" src="http://embed.ted.com/talks/#{ted_page}.html"#{allow_full_screen ? ' webkitAllowFullScreen mozallowfullscreen allowFullScreen' : ''}></iframe>}
25
+ end
26
+ end
27
+
28
+ end
@@ -0,0 +1,21 @@
1
+ module Converters
2
+
3
+ # Convert twitter URL to embedded html
4
+ def twitter(string, options = {})
5
+ @regex = %r{(?<!href=")https://twitter\.com(/#!)?/[A-Za-z0-9_]{1,15}/status(es)?/\d+(/?)}
6
+
7
+ string.gsub(@regex) do |match|
8
+ params = {:url => match}.merge(options)
9
+
10
+ uri = URI("https://api.twitter.com/1/statuses/oembed.json")
11
+ uri.query = URI.encode_www_form(params)
12
+
13
+ http = Net::HTTP.new(uri.host, uri.port)
14
+ http.use_ssl = true
15
+
16
+ response = JSON.parse(http.get(uri.request_uri).body)
17
+ response["html"]
18
+ end
19
+ end
20
+
21
+ end
@@ -0,0 +1,11 @@
1
+ module Converters
2
+
3
+ def unescape_html(string, options = {})
4
+ @regex = /(&lt;.*?[a-z]{0,12}?&gt;)+/i
5
+
6
+ string.gsub(@regex) do |tag|
7
+ tag.gsub("&lt;", "<").gsub("&gt;", ">")
8
+ end
9
+ end
10
+
11
+ end
@@ -0,0 +1,24 @@
1
+ module Converters
2
+
3
+ # Vimeo and Youtube embed markdown extension
4
+ def video_embed(string, options = {})
5
+ @regex = /\?\[(youtube|vimeo)\]\(https?:\/\/(www\.)?(vimeo\.com\/|youtu\.be\/|youtube\.com\/watch\?v=)(\S+)\)/
6
+
7
+ string.scan(@regex).each do |type, prefix, url, id|
8
+ r = if('vimeo' == type)
9
+ vimeo_embed(options)
10
+ elsif('youtube' == type)
11
+ youtube_embed(options)
12
+ else
13
+ nil
14
+ end
15
+ # Substitute the original text with the embedded version
16
+ # OLD, optional https not supported:
17
+ # @text.gsub!("?[#{type}](https://#{prefix}#{url}#{id})", r) if r
18
+ x = %r{\?\[#{type}\]\(https?:\/\/#{Regexp.escape(prefix)}#{Regexp.escape(url)}#{id}\)}i
19
+ string.gsub!(x, r) if r
20
+ end
21
+ string
22
+ end
23
+
24
+ end
@@ -0,0 +1,33 @@
1
+ module Converters
2
+
3
+ # Convert vimeo movie URL to embedded iframe
4
+ def vimeo(string, options = {})
5
+ # Original: 440 248
6
+ options = {
7
+ :width => 590,
8
+ :height => 335,
9
+ :show_title => false,
10
+ :show_byline => false,
11
+ :show_portrait => false,
12
+ :allow_fullscreen => true
13
+ }.merge(options)
14
+
15
+ @regex = /https?:\/\/(www.)?vimeo\.com\/([A-Za-z0-9._%-]*)((\?|#)\S+)?/
16
+
17
+ string.gsub(@regex) do
18
+ vimeo_id = $2
19
+ width = options[:width]
20
+ height = options[:height]
21
+ show_title = "title=0" unless options[:show_title]
22
+ show_byline = "byline=0" unless options[:show_byline]
23
+ show_portrait = "portrait=0" unless options[:show_portrait]
24
+ allow_fullscreen = " allowfullscreen" if options[:allow_fullscreen]
25
+ frameborder = options[:frameborder] || 0
26
+ query_string_variables = [show_title, show_byline, show_portrait].compact.join("&")
27
+ query_string = "?" + query_string_variables unless query_string_variables.empty?
28
+
29
+ %{<iframe src="//player.vimeo.com/video/#{vimeo_id}#{query_string}" width="#{width}" height="#{height}" frameborder="#{frameborder}"#{allow_fullscreen}></iframe>}
30
+ end
31
+ end
32
+
33
+ end
@@ -0,0 +1,10 @@
1
+ module Converters
2
+
3
+ # Embed vimeo by id
4
+ def vimeo_embed(string, options = {})
5
+ {:width => 590, :height => 335}.merge(options)
6
+
7
+ %{<iframe src="https://player.vimeo.com/video/#{string}?title=0&byline=0&portrait=0" width="#{options[:width]}" height="#{options[:height]}"></iframe>}
8
+ end
9
+
10
+ end
@@ -0,0 +1,18 @@
1
+ module Converters
2
+
3
+ # Convert worldstar movie URL to embedded html
4
+ def worldstar(string, options = {})
5
+ # Original: 448 374
6
+ options = {:width => 590, :height => 335}.merge(options)
7
+
8
+ @regex = /http:\/\/www\.worldstarhiphop\.com\/videos\/video\.php\?v\=(wshh[A-Za-z0-9]+)/
9
+
10
+ string.gsub(@regex) do
11
+ video_id = $1
12
+ width = options[:width]
13
+ height = options[:height]
14
+ %{<object width="#{width}" height="#{height}"><param name="movie" value="http://www.worldstarhiphop.com/videos/e/16711680/#{video_id}"><param name="allowFullScreen" value="true"></param><embed src="http://www.worldstarhiphop.com/videos/e/16711680/#{video_id}" type="application/x-shockwave-flash" allowFullscreen="true" width="#{width}" height="#{height}"></embed></object>}
15
+ end
16
+ end
17
+
18
+ end
@@ -0,0 +1,42 @@
1
+ module Converters
2
+
3
+ # Convert youtube movie URL to embedded iframe
4
+ def youtube(string, options = {})
5
+ # Original: 420 315
6
+ options = {
7
+ :width => 590,
8
+ :height => 335,
9
+ :frameborder => 0,
10
+ :wmode => 'transparent',
11
+ :autoplay => false,
12
+ :hide_related => true,
13
+ :fs => true,
14
+ :modestbranding => true,
15
+ :allow_fullscreen => true
16
+ }.merge(options)
17
+
18
+ @regex = /(https?:\/\/)?(www.)?(youtube\.com\/watch\?v=|youtu\.be\/|youtube\.com\/watch\?feature=player_embedded&v=)([A-Za-z0-9_-]*)(\&\S+)?(\?\S+)?/
19
+
20
+ string.gsub(@regex) do
21
+ youtube_id = $4
22
+ src = "https://www.youtube.com/embed/#{youtube_id}"
23
+ width = options[:width]
24
+ height = options[:height]
25
+ allow_fullscreen = " allowfullscreen" if options[:allow_fullscreen]
26
+ frameborder = options[:frameborder]
27
+
28
+ a = []
29
+ a << "wmode=#{options[:wmode]}" if options[:wmode]
30
+ a << "autoplay=1" if options[:autoplay]
31
+ a << "rel=0" if options[:hide_related]
32
+ a << "modestbranding=1" if options[:modestbranding]
33
+ a << "fs=1" if options[:fs]
34
+
35
+ src += "?#{a.join '&'}" unless a.empty?
36
+
37
+ %{<iframe width="#{width}" height="#{height}" src="#{src}" frameborder="#{frameborder}"#{allow_fullscreen}></iframe>}
38
+ end
39
+ end
40
+
41
+ end
42
+
@@ -0,0 +1,10 @@
1
+ module Converters
2
+
3
+ # Embed youtube by id
4
+ def youtube_embed(string, options = {})
5
+ options = {:width => 590, :height => 335}.merge(options)
6
+
7
+ %{<iframe src="https://www.youtube.com/embed/#{string}?wmode=transparent&modestbranding=1&fs=1&rel=0" allowfullscreen="1" webkitallowfullscreen="1" mozallowfullscreen="1" width="#{options[:width]}" height="#{options[:height]}" frameborder="0"></iframe>}
8
+ end
9
+
10
+ end
@@ -0,0 +1,35 @@
1
+ module Converters
2
+
3
+ def youtube_image(string, options = {})
4
+ options = {
5
+ :width => 320,
6
+ :height => 315,
7
+ :style => 'medium',
8
+ :target => 'blank',
9
+ :border => '0'
10
+ }.merge(options)
11
+
12
+ styles = {
13
+ 'default' => 'default',
14
+ 'high' => 'hqdefault',
15
+ 'medium' => 'mqdefault',
16
+ 'normal' => 'sddefault',
17
+ 'max' => 'maxresdefault'
18
+ }
19
+
20
+ @regex = /(https?:\/\/)?(www.)?(youtube\.com\/watch\?v=|youtu\.be\/|youtube\.com\/watch\?feature=player_embedded&v=)([A-Za-z0-9_-]*)(\&\S+)?(\?\S+)?/
21
+
22
+ string.gsub(@regex) do
23
+ youtube_id = $4
24
+ video_url = "https://www.youtube.com/watch?v=#{youtube_id}"
25
+ target = options[:target]
26
+ width = options[:width]
27
+ height = options[:height]
28
+ border = options[:border]
29
+ style = styles[options[:style]] rescue styles['default']
30
+ src = "//img.youtube.com/vi/#{youtube_id}/#{style}.jpg"
31
+ %{<div class="thumbnail youtube"><a href="#{video_url}" target="_#{target}"><img src="#{src}" width="#{width}" height="#{height}" border="#{border}"></a></div>}
32
+ end
33
+ end
34
+
35
+ end
@@ -0,0 +1,18 @@
1
+ module Converters
2
+
3
+ def youtube_js_api(string, options = {})
4
+ # Original: 390 250
5
+ options = {:width => 590, :height => 335}.merge(options)
6
+
7
+ @regex = /https?:\/\/(www.)?youtube\.com\/watch\?v=([A-Za-z0-9._%-]*)(\&\S+)?/
8
+
9
+ string.gsub(@regex) do
10
+ youtube_id = $2
11
+ width = options[:width]
12
+ height = options[:height]
13
+
14
+ %{<object width="#{width}" height="#{height}"><param name="movie" value="//www.youtube.com/v/#{youtube_id}?enablejsapi=1&playerapiid=ytplayer"></param><param name="wmode" value="transparent"></param><param name="allowscriptaccess" value="always"></param><embed src="//www.youtube.com/v/#{youtube_id}?enablejsapi=1&playerapiid=ytplayer" type="application/x-shockwave-flash" wmode="transparent" width="#{width}" height="#{height}" allowscriptaccess="always"></embed></object>}
15
+ end
16
+ end
17
+
18
+ end
@@ -0,0 +1,45 @@
1
+ class Sanitize
2
+ module Config
3
+
4
+ CUSTOM = {
5
+ :elements => %w[
6
+ a abbr b blockquote br caption cite code col colgroup dd del div dl
7
+ dt nav em figcaption figure font form h1 h2 h3 h4 h5 h6 hgroup hr i img input ins li label link
8
+ ol p pre s small span strike strong style sub sup table tbody td
9
+ tfoot th thead time tr u ul iframe
10
+ ],
11
+
12
+ :attributes => {
13
+ :all => ['dir', 'lang', 'title', 'class', 'style', 'id'],
14
+ 'a' => ['href', 'target'],
15
+ 'blockquote' => ['cite'],
16
+ 'col' => ['span', 'width'],
17
+ 'colgroup' => ['span', 'width'],
18
+ 'del' => ['cite', 'datetime'],
19
+ 'img' => ['align', 'alt', 'height', 'src', 'width'],
20
+ 'ins' => ['cite', 'datetime'],
21
+ 'input' => ['name','placeholder', 'type', 'value', 'width'],
22
+ 'form' => ['action', 'method', 'name'],
23
+ 'link' => ['href', 'rel', 'type'],
24
+ 'ol' => ['start', 'reversed', 'type'],
25
+ 'q' => ['cite'],
26
+ 'table' => ['summary', 'width'],
27
+ 'td' => ['abbr', 'axis', 'colspan', 'rowspan', 'width'],
28
+ 'th' => ['abbr', 'axis', 'colspan', 'rowspan', 'scope', 'width'],
29
+ 'time' => ['datetime', 'pubdate'],
30
+ 'ul' => ['type'],
31
+ 'iframe' => ['width', 'height', 'src', 'allowFullScreen']
32
+ },
33
+
34
+ :protocols => {
35
+ 'a' => {'href' => ['ftp', 'http', 'https', 'mailto', :relative]},
36
+ 'img' => {'src' => ['http', 'https', :relative]},
37
+ 'ins' => {'cite' => ['http', 'https', :relative]},
38
+ 'q' => {'cite' => ['http', 'https', :relative]}
39
+ },
40
+
41
+ :add_attributes => {}
42
+ }
43
+
44
+ end
45
+ end
@@ -0,0 +1,46 @@
1
+ class Sanitize
2
+ module Config
3
+
4
+ FULL = {
5
+ :elements => %w[
6
+ a abbr b blockquote br caption cite code col colgroup dd del div dl
7
+ dt nav em figcaption figure font form h1 h2 h3 h4 h5 h6 hgroup hr i img input ins li label link
8
+ ol p pre s script small span strike strong style sub sup table tbody td
9
+ tfoot th thead time tr u ul iframe
10
+ ],
11
+
12
+ :attributes => {
13
+ :all => ['dir', 'lang', 'title', 'class', 'style', 'id'],
14
+ 'a' => ['href', 'target'],
15
+ 'blockquote' => ['cite'],
16
+ 'col' => ['span', 'width'],
17
+ 'colgroup' => ['span', 'width'],
18
+ 'del' => ['cite', 'datetime'],
19
+ 'img' => ['align', 'alt', 'height', 'src', 'width'],
20
+ 'ins' => ['cite', 'datetime'],
21
+ 'input' => ['name','placeholder', 'type', 'value', 'width'],
22
+ 'form' => ['action', 'method', 'name'],
23
+ 'link' => ['href', 'rel', 'type'],
24
+ 'ol' => ['start', 'reversed', 'type'],
25
+ 'q' => ['cite'],
26
+ 'table' => ['summary', 'width'],
27
+ 'td' => ['abbr', 'axis', 'colspan', 'rowspan', 'width'],
28
+ 'th' => ['abbr', 'axis', 'colspan', 'rowspan', 'scope', 'width'],
29
+ 'time' => ['datetime', 'pubdate'],
30
+ 'ul' => ['type'],
31
+ 'iframe' => ['width', 'height', 'src', 'allowFullScreen'],
32
+ 'script' => ['src', 'type']
33
+ },
34
+
35
+ :protocols => {
36
+ 'a' => {'href' => ['ftp', 'http', 'https', 'mailto', :relative]},
37
+ 'img' => {'src' => ['http', 'https', :relative]},
38
+ 'ins' => {'cite' => ['http', 'https', :relative]},
39
+ 'q' => {'cite' => ['http', 'https', :relative]}
40
+ },
41
+
42
+ :add_attributes => {}
43
+ }
44
+
45
+ end
46
+ end
@@ -0,0 +1,12 @@
1
+ class Sanitize
2
+ module Config
3
+
4
+ LINEBREAKS = {
5
+ :elements => %w[p br a],
6
+ :attributes => {
7
+ 'a' => ['href']
8
+ }
9
+ }
10
+
11
+ end
12
+ end
@@ -0,0 +1,9 @@
1
+ class Sanitize
2
+ module Config
3
+
4
+ SIMPLE = {
5
+ :elements => %w[br]
6
+ }
7
+
8
+ end
9
+ end
data/test.rb ADDED
@@ -0,0 +1,16 @@
1
+ class Flat
2
+ def initialize
3
+ self.class.t
4
+ end
5
+
6
+ def self.t
7
+ puts "TEEEE"
8
+ end
9
+ end
10
+
11
+ f = Flat.new
12
+
13
+
14
+
15
+
16
+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: convert
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fugroup Limited
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-01-04 00:00:00.000000000 Z
11
+ date: 2017-01-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redcarpet
@@ -94,6 +94,20 @@ dependencies:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
96
  version: '1.6'
97
+ - !ruby/object:Gem::Dependency
98
+ name: futest
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
97
111
  description: Easily convert any string and replace with links and embedded content
98
112
  from a long list of providers and libraries.
99
113
  email: mail@fugroup.net
@@ -101,7 +115,53 @@ executables: []
101
115
  extensions: []
102
116
  extra_rdoc_files: []
103
117
  files:
118
+ - ".gitignore"
119
+ - CHANGELOG.md
120
+ - Gemfile
121
+ - LICENSE
122
+ - README.md
123
+ - config/boot.rb
124
+ - convert.gemspec
104
125
  - lib/convert.rb
126
+ - lib/converters/auto_link.rb
127
+ - lib/converters/dailymotion.rb
128
+ - lib/converters/decode.rb
129
+ - lib/converters/email_escape.rb
130
+ - lib/converters/encode.rb
131
+ - lib/converters/flickr.rb
132
+ - lib/converters/gist.rb
133
+ - lib/converters/google_maps.rb
134
+ - lib/converters/hashtag.rb
135
+ - lib/converters/html_escape.rb
136
+ - lib/converters/iframe_embed.rb
137
+ - lib/converters/image_tag.rb
138
+ - lib/converters/instagram.rb
139
+ - lib/converters/kramdown.rb
140
+ - lib/converters/liveleak.rb
141
+ - lib/converters/markdown.rb
142
+ - lib/converters/metacafe.rb
143
+ - lib/converters/nokogiri.rb
144
+ - lib/converters/redcarpet.rb
145
+ - lib/converters/sanitize.rb
146
+ - lib/converters/simple_format.rb
147
+ - lib/converters/soundcloud.rb
148
+ - lib/converters/strip_params.rb
149
+ - lib/converters/ted.rb
150
+ - lib/converters/twitter.rb
151
+ - lib/converters/unescape_html.rb
152
+ - lib/converters/video_embed.rb
153
+ - lib/converters/vimeo.rb
154
+ - lib/converters/vimeo_embed.rb
155
+ - lib/converters/worldstar.rb
156
+ - lib/converters/youtube.rb
157
+ - lib/converters/youtube_embed.rb
158
+ - lib/converters/youtube_image.rb
159
+ - lib/converters/youtube_js_api.rb
160
+ - lib/sanitizers/custom.rb
161
+ - lib/sanitizers/full.rb
162
+ - lib/sanitizers/linebreaks.rb
163
+ - lib/sanitizers/simple.rb
164
+ - test.rb
105
165
  homepage: https://github.com/fugroup/convert
106
166
  licenses:
107
167
  - MIT
@@ -122,7 +182,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
122
182
  version: '0'
123
183
  requirements: []
124
184
  rubyforge_project:
125
- rubygems_version: 2.5.1
185
+ rubygems_version: 2.6.8
126
186
  signing_key:
127
187
  specification_version: 4
128
188
  summary: Convert strings and HTML to links and embedded content