Fix #555 - Use a better URL parser
This commit is contained in:
parent
c96fd24f48
commit
3202bdd744
1
Gemfile
1
Gemfile
|
@ -35,6 +35,7 @@ gem 'devise-two-factor'
|
||||||
gem 'doorkeeper'
|
gem 'doorkeeper'
|
||||||
gem 'rabl'
|
gem 'rabl'
|
||||||
gem 'rqrcode'
|
gem 'rqrcode'
|
||||||
|
gem 'twitter-text'
|
||||||
gem 'oj'
|
gem 'oj'
|
||||||
gem 'hiredis'
|
gem 'hiredis'
|
||||||
gem 'redis', '~>3.2'
|
gem 'redis', '~>3.2'
|
||||||
|
|
|
@ -422,6 +422,8 @@ GEM
|
||||||
thread_safe (0.3.5)
|
thread_safe (0.3.5)
|
||||||
tilt (2.0.5)
|
tilt (2.0.5)
|
||||||
tins (1.12.0)
|
tins (1.12.0)
|
||||||
|
twitter-text (1.14.5)
|
||||||
|
unf (~> 0.1.0)
|
||||||
tzinfo (1.2.2)
|
tzinfo (1.2.2)
|
||||||
thread_safe (~> 0.1)
|
thread_safe (~> 0.1)
|
||||||
uglifier (3.0.1)
|
uglifier (3.0.1)
|
||||||
|
@ -514,6 +516,7 @@ DEPENDENCIES
|
||||||
simple_form
|
simple_form
|
||||||
simplecov
|
simplecov
|
||||||
statsd-instrument
|
statsd-instrument
|
||||||
|
twitter-text
|
||||||
uglifier (>= 1.3.0)
|
uglifier (>= 1.3.0)
|
||||||
webmock
|
webmock
|
||||||
will_paginate
|
will_paginate
|
||||||
|
|
|
@ -9,6 +9,8 @@ class Formatter
|
||||||
include ActionView::Helpers::TextHelper
|
include ActionView::Helpers::TextHelper
|
||||||
include ActionView::Helpers::SanitizeHelper
|
include ActionView::Helpers::SanitizeHelper
|
||||||
|
|
||||||
|
AUTOLINK_RE = /https?:\/\/([\S]+\.[!#$&-;=?-[\]_a-z~]|%[\w\d]{2}]+[\w])/i
|
||||||
|
|
||||||
def format(status)
|
def format(status)
|
||||||
return reformat(status.content) unless status.local?
|
return reformat(status.content) unless status.local?
|
||||||
|
|
||||||
|
@ -44,9 +46,9 @@ class Formatter
|
||||||
end
|
end
|
||||||
|
|
||||||
def link_urls(html)
|
def link_urls(html)
|
||||||
html.gsub(URI.regexp(%w(http https))) do |match|
|
Twitter::Autolink.auto_link_urls(html, url_target: '_blank',
|
||||||
link_html(match)
|
link_attribute_block: lambda { |_, a| a[:rel] << ' noopener' },
|
||||||
end
|
link_text_block: lambda { |_, text| link_html(text) })
|
||||||
end
|
end
|
||||||
|
|
||||||
def link_mentions(html, mentions)
|
def link_mentions(html, mentions)
|
||||||
|
@ -70,7 +72,7 @@ class Formatter
|
||||||
suffix = url[prefix.length + 30..-1]
|
suffix = url[prefix.length + 30..-1]
|
||||||
cutoff = url[prefix.length..-1].length > 30
|
cutoff = url[prefix.length..-1].length > 30
|
||||||
|
|
||||||
"<a rel=\"nofollow noopener\" target=\"_blank\" href=\"#{url}\"><span class=\"invisible\">#{prefix}</span><span class=\"#{cutoff ? 'ellipsis' : ''}\">#{text}</span><span class=\"invisible\">#{suffix}</span></a>"
|
"<span class=\"invisible\">#{prefix}</span><span class=\"#{cutoff ? 'ellipsis' : ''}\">#{text}</span><span class=\"invisible\">#{suffix}</span>"
|
||||||
end
|
end
|
||||||
|
|
||||||
def hashtag_html(match)
|
def hashtag_html(match)
|
||||||
|
|
|
@ -17,8 +17,38 @@ RSpec.describe Formatter do
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'contains a link' do
|
it 'contains a link' do
|
||||||
expect(subject).to match('<a rel="nofollow noopener" target="_blank" href="http://google.com"><span class="invisible">http://</span><span class="">google.com</span><span class="invisible"></span></a>')
|
expect(subject).to match('<a href="http://google.com" rel="nofollow noopener" target="_blank"><span class="invisible">http://</span><span class="">google.com</span><span class="invisible"></span></a>')
|
||||||
end
|
end
|
||||||
|
|
||||||
|
=begin
|
||||||
|
it 'matches a stand-alone medium URL' do
|
||||||
|
expect(subject.match('https://hackernoon.com/the-power-to-build-communities-a-response-to-mark-zuckerberg-3f2cac9148a4')[0]).to eq 'https://hackernoon.com/the-power-to-build-communities-a-response-to-mark-zuckerberg-3f2cac9148a4'
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'matches a stand-alone google URL' do
|
||||||
|
expect(subject.match('http://google.com')[0]).to eq 'http://google.com'
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'matches a URL without trailing period' do
|
||||||
|
expect(subject.match('http://www.mcmansionhell.com/post/156408871451/50-states-of-mcmansion-hell-scottsdale-arizona. ')[0]).to eq 'http://www.mcmansionhell.com/post/156408871451/50-states-of-mcmansion-hell-scottsdale-arizona'
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'matches a URL without closing paranthesis' do
|
||||||
|
expect(subject.match('(http://google.com/)')[0]).to eq 'http://google.com'
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'matches a URL without exclamation point' do
|
||||||
|
expect(subject.match('http://www.google.com! ')[0]).to eq 'http://www.google.com'
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'matches a URL with a query string' do
|
||||||
|
expect(subject.match('https://www.ruby-toolbox.com/search?utf8=%E2%9C%93&q=autolink')[0]).to eq 'https://www.ruby-toolbox.com/search?utf8=%E2%9C%93&q=autolink'
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'matches a URL with parenthesis in it' do
|
||||||
|
expect(subject.match('https://en.wikipedia.org/wiki/Diaspora_(software)')[0]).to eq 'https://en.wikipedia.org/wiki/Diaspora_(software)'
|
||||||
|
end
|
||||||
|
=end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe '#reformat' do
|
describe '#reformat' do
|
||||||
|
|
Loading…
Reference in New Issue