string_awesome 0.2.1 → 0.2.2
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.
- checksums.yaml +13 -5
- data/README.md +7 -6
- data/Rakefile +4 -0
- data/lib/string_awesome/awesome_methods.rb +40 -21
- data/lib/string_awesome/awesome_regexes.rb +1 -1
- data/lib/string_awesome/version.rb +1 -1
- data/spec/awesome_methods_spec.rb +38 -7
- metadata +11 -11
checksums.yaml
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
NDQyMTRjYWQwMzcxOGRmOTVkNWMyYzU2ODI2NmE5MTZhMTFjNDM1Mw==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
NzYxYjA3Mjc0YmM1OTdmMWRkOTE2NTg1MzNkN2UxMzE3YWJlNDg1Mg==
|
5
7
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
MGZiZjBkOTc2OTdhNjEyYjAxZmNmOGY2MTdiOTQ4YmViN2I4NzUyYjE5ZDQ3
|
10
|
+
MTE5OTZlZDEzYjZjMGYxMDJiMzg2NzBmMzk4YTY1ZDk3YzhjZTczNDg0YTli
|
11
|
+
ZGY3ZWQ2MTE1OWYyYWFjMGM4MTlhNWY2NmJmMDE5NTAzNzQ3YjY=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
NmI5MWVhNzk2MjI5NTVjOWU3NjYxM2Y5MmQ2NjRjNmRkMTA0NDlmZGQ4NDMw
|
14
|
+
MWI1NWM3ZWI1ZDY5OWY2ZTRkOGJlY2U5YzY1YTgwMDI3ZmVhYTE4NmUwZTQx
|
15
|
+
NDZhOThlY2U1ODI1NThkYTc0ZjNlYWI3Y2U5MjhlYjhhMmQ4ZmQ=
|
data/README.md
CHANGED
@@ -1,5 +1,9 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# String Awesome
|
2
|
+
|
3
|
+
[](https://travis-ci.org/tiagopog/string_awesome)
|
4
|
+
[](https://codeclimate.com/repos/52a5452b7e00a4670f00b139/feed)
|
5
|
+
[](https://gemnasium.com/tiagopog/string_awesome)
|
6
|
+
[](http://badge.fury.io/rb/string_awesome)
|
3
7
|
|
4
8
|
This gem adds some awesome and easy-to-use extensions to Ruby String class.
|
5
9
|
|
@@ -9,7 +13,7 @@ Compatible with Ruby 1.9.3+
|
|
9
13
|
|
10
14
|
Add this line to your application's Gemfile:
|
11
15
|
|
12
|
-
gem 'string_awesome'
|
16
|
+
gem 'string_awesome'
|
13
17
|
|
14
18
|
And then execute:
|
15
19
|
|
@@ -34,9 +38,6 @@ Finds URLs in the text and wrap in anchor tag.
|
|
34
38
|
'www.foobar.com'.linkify
|
35
39
|
#=> '<a href="http://www.foobar.com">www.foobar.com</a>'
|
36
40
|
|
37
|
-
'foobar.com'.linkify
|
38
|
-
#=> '<a href="http://foobar.com">foobar.com</a>'
|
39
|
-
|
40
41
|
'Awesome site: http://foobar.com'.linkify(class: 'link', truncate: 10)
|
41
42
|
#=> 'Awesome site: <a href="http://foobar.com" class="link">http://foo...</a>'
|
42
43
|
|
data/Rakefile
CHANGED
@@ -209,20 +209,31 @@ module StringAwesome
|
|
209
209
|
|
210
210
|
def linkify(options = {})
|
211
211
|
self.gsub!(SA_URL_REGEX) do |match|
|
212
|
+
# http://verylongurl...
|
212
213
|
displayed = _truncate_url match, options[:truncate]
|
213
214
|
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
options = !options ? '' : options.reduce(' ') { |s, v| s << "#{v[0]}=\"#{v[1]}\" " }
|
218
|
-
|
215
|
+
# Now that we're done with the 'truncate' option, let's remove it...
|
216
|
+
options.delete(:truncate) unless !options
|
217
|
+
|
219
218
|
# Forces the presence of the 'http://'
|
220
219
|
match = "http://#{match}" unless match =~ SA_PROTOCOL_REGEX
|
221
220
|
|
222
|
-
"<a href=\"#{match}\"#{options
|
221
|
+
"<a href=\"#{match}\"#{_apply_tag_attrs(options)}>#{displayed}</a>"
|
223
222
|
end
|
224
223
|
self
|
225
224
|
end
|
225
|
+
|
226
|
+
# Build attributes from Hash for HTML tag
|
227
|
+
#
|
228
|
+
# Arguments:
|
229
|
+
# options: (Hash)
|
230
|
+
# - Options for the link tag, such as:
|
231
|
+
# - :class - Value for "class" attribute: <a href="url" class="link">url</a>
|
232
|
+
# - :target - Value for "target" attribute: <a href="url" target="_blank">url</a>
|
233
|
+
|
234
|
+
def _apply_tag_attrs(options)
|
235
|
+
options ? options.reduce(' ') { |s, v| s << "#{v[0]}=\"#{v[1]}\" " }.gsub(/\s+$/, '') : ''
|
236
|
+
end
|
226
237
|
|
227
238
|
# Trancutes the URL that will be displayed in the <a> tag
|
228
239
|
#
|
@@ -231,8 +242,9 @@ module StringAwesome
|
|
231
242
|
# - Matched URL.
|
232
243
|
# t: (Hash|Integer)
|
233
244
|
# - Where the URL will be truncated.
|
245
|
+
|
234
246
|
def _truncate_url(m, t)
|
235
|
-
t ? (t.instance_of?(Hash) ? m.ellipsis(t[:length], html_encoded: t[:html_encoded]) : m.ellipsis(t)) : m
|
247
|
+
t ? (t.instance_of?(Hash) ? m.ellipsis(t[:length], html_encoded: t[:html_encoded]) : m.ellipsis(t)) : m
|
236
248
|
end
|
237
249
|
|
238
250
|
# Finds URLs, Twitter handles, hashtags in the text and wrap in anchor tag.
|
@@ -245,31 +257,38 @@ module StringAwesome
|
|
245
257
|
# Arguments:
|
246
258
|
# options: (Hash)
|
247
259
|
# - Options such as:
|
248
|
-
# - :only - Array of Symbols restricting what will be matched
|
260
|
+
# - :only - Array of Symbols restricting what will be matched in the text.
|
249
261
|
|
250
262
|
def tweetify(options = {})
|
251
263
|
# Applies linkify unless there's some restriction
|
252
|
-
|
253
|
-
str = only ? self : self.linkify(class: 'link')
|
264
|
+
str = options[:only] ? self : self.linkify(class: 'link')
|
254
265
|
|
255
266
|
# Iterates with the matched expressions
|
256
267
|
str.gsub!(SA_TWEET_REGEX) do |match|
|
257
268
|
is_hashtag = match =~ /#/
|
258
269
|
|
259
|
-
|
260
|
-
match
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
tag = {
|
265
|
-
href: is_hashtag ? "#{tt_url}search?q=%23#{match.gsub(/#/, '')}" : "#{tt_url}#{match.gsub(/@/, '')}",
|
266
|
-
class: is_hashtag ? 'hashtag' : 'tt-handle'
|
267
|
-
}
|
268
|
-
|
269
|
-
" <a href=\"#{tag[:href]}\" target=\"_blank\" class=\"#{tag[:class]}\">#{match}</a>"
|
270
|
+
unless _restricted?(is_hashtag, options[:only])
|
271
|
+
match = match.strip
|
272
|
+
attrs = is_hashtag ? ['hashtag', "search?q=%23#{match.gsub(/#/, '')}"] : ['tt-handle', "#{match.gsub(/@/, '')}"]
|
273
|
+
attrs = { class: attrs[0], href: attrs[1] }
|
274
|
+
match = " <a href=\"https://twitter.com/#{attrs[:href]}\" target=\"_blank\" class=\"#{attrs[:class]}\">#{match}</a>"
|
270
275
|
end
|
276
|
+
|
277
|
+
match
|
271
278
|
end
|
272
279
|
str
|
273
280
|
end
|
281
|
+
|
282
|
+
# Checks if type (:hashtag or :tt_handle) is allowed to be wrapped in anchor tag.
|
283
|
+
#
|
284
|
+
# Arguments:
|
285
|
+
# is_hashtag: (Boolean)
|
286
|
+
# - Does the string contain '#'?
|
287
|
+
# only: (Array)
|
288
|
+
# - Types allowed: :hashtag, :tt_handle.
|
289
|
+
|
290
|
+
def _restricted?(is_hashtag, only)
|
291
|
+
only and ([:hashtag, :tt_handle] != only.sort) and ((is_hashtag and !only.include?(:hashtag)) or (!is_hashtag and !only.include?(:tt_handle)))
|
292
|
+
end
|
274
293
|
end
|
275
294
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module StringAwesome
|
2
2
|
module AwesomeRegexes
|
3
3
|
SA_ACCENT_REGEX = /[^\x00-\x7F]/n
|
4
|
-
SA_URL_REGEX = /\b(((ht|f)tp[s]?:\/\/)
|
4
|
+
SA_URL_REGEX = /\b((((ht|f)tp[s]?:\/\/)|([a-z0-9]+\.))+(?<!@)([a-z0-9\_\-]+)(\.[a-z]+)+([\?\/\:][a-z0-9_=%&@\?\.\/\-\:\#\(\)]+)?\/?)/i
|
5
5
|
SA_PROTOCOL_REGEX = /(ht|f)tp[s]?/i
|
6
6
|
SA_TWEET_REGEX = /(((^[@#])|([^a-z0-9\W]|\s)([@|#]))([a-z0-9\_]+))/i
|
7
7
|
end
|
@@ -186,12 +186,45 @@ end
|
|
186
186
|
# String#linkify
|
187
187
|
#
|
188
188
|
describe 'String#linkify' do
|
189
|
-
it 'should find all the URLs in text and wrap in anchor tags' do
|
189
|
+
it 'should find all the HTTP URLs in text and wrap in anchor tags' do
|
190
190
|
str = 'Awesome site: http://foobar.com'
|
191
191
|
this = 'Awesome site: <a href="http://foobar.com">http://foobar.com</a>'
|
192
192
|
str.linkify.should eq this
|
193
193
|
end
|
194
194
|
|
195
|
+
it 'should find all the HTTPS URLs in text and wrap in anchor tags' do
|
196
|
+
str = 'Awesome site: https://foobar.com'
|
197
|
+
this = 'Awesome site: <a href="https://foobar.com">https://foobar.com</a>'
|
198
|
+
str.linkify.should eq this
|
199
|
+
end
|
200
|
+
|
201
|
+
it 'should find all the FTP URLs in text and wrap in anchor tags' do
|
202
|
+
str = 'Awesome site: ftp://foobar.com'
|
203
|
+
this = 'Awesome site: <a href="ftp://foobar.com">ftp://foobar.com</a>'
|
204
|
+
str.linkify.should eq this
|
205
|
+
end
|
206
|
+
|
207
|
+
it 'should match http://sub.sub.domain' do
|
208
|
+
url = 'http://www3.blog.foo.bar'
|
209
|
+
str = "Awesome site: #{url}"
|
210
|
+
this = "Awesome site: <a href=\"#{url}\">#{url}</a>"
|
211
|
+
str.linkify.should eq this
|
212
|
+
end
|
213
|
+
|
214
|
+
it 'should match query strings' do
|
215
|
+
url = 'http://www.foobar.com/blog?category_id=54322&itle=lorem-ipsum-dolor'
|
216
|
+
str = "Awesome site: #{url}"
|
217
|
+
this = "Awesome site: <a href=\"#{url}\">#{url}</a>"
|
218
|
+
str.linkify.should eq this
|
219
|
+
end
|
220
|
+
|
221
|
+
it 'should match friendly URLs' do
|
222
|
+
url = 'http://www.foobar.com/blog/tech/lorem-ipsum-dolor'
|
223
|
+
str = "Awesome site: #{url}"
|
224
|
+
this = "Awesome site: <a href=\"#{url}\">#{url}</a>"
|
225
|
+
str.linkify.should eq this
|
226
|
+
end
|
227
|
+
|
195
228
|
it 'can set the "class" HTML attribute to be applied on the anchor tag' do
|
196
229
|
str = 'Awesome site: http://foobar.com'
|
197
230
|
this = 'Awesome site: <a href="http://foobar.com" class="link">http://foobar.com</a>'
|
@@ -232,8 +265,8 @@ describe 'String#linkify' do
|
|
232
265
|
'www.foobar.com'.linkify.should eq '<a href="http://www.foobar.com">www.foobar.com</a>'
|
233
266
|
end
|
234
267
|
|
235
|
-
it "
|
236
|
-
'foobar.com'.linkify.should eq '
|
268
|
+
it "should not match URLs without the presence of 'http://' and 'www'" do
|
269
|
+
'foobar.com'.linkify.should eq 'foobar.com'
|
237
270
|
end
|
238
271
|
end
|
239
272
|
|
@@ -248,8 +281,7 @@ describe 'String#tweetify' do
|
|
248
281
|
end
|
249
282
|
|
250
283
|
it 'should not match foo@bar as being a Twitter handle' do
|
251
|
-
|
252
|
-
str.tweetify.should eq str
|
284
|
+
'foo@bar'.tweetify.should eq 'foo@bar'
|
253
285
|
end
|
254
286
|
|
255
287
|
it 'should find hashtags (#hashtag) and wrap them in anchor tags' do
|
@@ -259,8 +291,7 @@ describe 'String#tweetify' do
|
|
259
291
|
end
|
260
292
|
|
261
293
|
it 'should not match foo#bar as being a hashtag' do
|
262
|
-
|
263
|
-
str.tweetify.should eq str
|
294
|
+
'foo#bar'.tweetify.should eq 'foo#bar'
|
264
295
|
end
|
265
296
|
|
266
297
|
it 'should find URLs and wrap them in anchor tags' do
|
metadata
CHANGED
@@ -1,20 +1,20 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: string_awesome
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tiago Guedes
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-12-
|
11
|
+
date: 2013-12-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - '>='
|
17
|
+
- - ! '>='
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '3.0'
|
20
20
|
- - <
|
@@ -24,7 +24,7 @@ dependencies:
|
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
26
26
|
requirements:
|
27
|
-
- - '>='
|
27
|
+
- - ! '>='
|
28
28
|
- !ruby/object:Gem::Version
|
29
29
|
version: '3.0'
|
30
30
|
- - <
|
@@ -62,14 +62,14 @@ dependencies:
|
|
62
62
|
name: rspec
|
63
63
|
requirement: !ruby/object:Gem::Requirement
|
64
64
|
requirements:
|
65
|
-
- - '>='
|
65
|
+
- - ! '>='
|
66
66
|
- !ruby/object:Gem::Version
|
67
67
|
version: '0'
|
68
68
|
type: :development
|
69
69
|
prerelease: false
|
70
70
|
version_requirements: !ruby/object:Gem::Requirement
|
71
71
|
requirements:
|
72
|
-
- - '>='
|
72
|
+
- - ! '>='
|
73
73
|
- !ruby/object:Gem::Version
|
74
74
|
version: '0'
|
75
75
|
- !ruby/object:Gem::Dependency
|
@@ -90,14 +90,14 @@ dependencies:
|
|
90
90
|
name: rake
|
91
91
|
requirement: !ruby/object:Gem::Requirement
|
92
92
|
requirements:
|
93
|
-
- - '>='
|
93
|
+
- - ! '>='
|
94
94
|
- !ruby/object:Gem::Version
|
95
95
|
version: '0'
|
96
96
|
type: :development
|
97
97
|
prerelease: false
|
98
98
|
version_requirements: !ruby/object:Gem::Requirement
|
99
99
|
requirements:
|
100
|
-
- - '>='
|
100
|
+
- - ! '>='
|
101
101
|
- !ruby/object:Gem::Version
|
102
102
|
version: '0'
|
103
103
|
description: Awesome and easy-to-use extensions to Ruby String class.
|
@@ -130,17 +130,17 @@ require_paths:
|
|
130
130
|
- lib
|
131
131
|
required_ruby_version: !ruby/object:Gem::Requirement
|
132
132
|
requirements:
|
133
|
-
- - '>='
|
133
|
+
- - ! '>='
|
134
134
|
- !ruby/object:Gem::Version
|
135
135
|
version: '0'
|
136
136
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
137
137
|
requirements:
|
138
|
-
- - '>='
|
138
|
+
- - ! '>='
|
139
139
|
- !ruby/object:Gem::Version
|
140
140
|
version: '0'
|
141
141
|
requirements: []
|
142
142
|
rubyforge_project:
|
143
|
-
rubygems_version: 2.1.
|
143
|
+
rubygems_version: 2.1.11
|
144
144
|
signing_key:
|
145
145
|
specification_version: 4
|
146
146
|
summary: Extensions for Ruby String class
|