convert 0.1.0 → 0.1.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.
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