string_awesome 0.0.1 → 0.2.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.
- checksums.yaml +4 -4
- data/.travis.yml +4 -0
- data/README.md +153 -3
- data/lib/string_awesome/awesome_methods.rb +111 -100
- data/lib/string_awesome/awesome_regexes.rb +8 -0
- data/lib/string_awesome/version.rb +1 -1
- data/spec/awesome_methods_spec.rb +40 -22
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f24224fff27c945ef52bf8d04e9e4aeb72ac71ce
|
4
|
+
data.tar.gz: 1902cf07e1556874940dc3fda781676e88a25028
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e9290136f50d03073ca5dd70d0029598d73d6793f4cc1bb9b2f935fc56c533d1268e57f4fcb3764460319dc1e3a2ef892e07f67e1216de80f06af9ceec4e623a
|
7
|
+
data.tar.gz: 68d9835ff3e6ae6111abab19c82e12834f1439236d236579b574b58bd871c67320bce53a7cfa72130788c172f7668502399651000f2f8dda5ce4e703b4508657
|
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -1,12 +1,15 @@
|
|
1
1
|
# StringAwesome
|
2
|
+
<a href="https://codeclimate.com/repos/52a6620313d6373dad00a971/feed"><img src="https://codeclimate.com/repos/52a6620313d6373dad00a971/badges/c56ec1b4896feaf32263/gpa.png" /></a>
|
2
3
|
|
3
|
-
|
4
|
+
This gem adds some awesome and easy-to-use extensions to Ruby String class.
|
4
5
|
|
5
6
|
## Installation
|
6
7
|
|
8
|
+
Compatible with Ruby 1.9.3+
|
9
|
+
|
7
10
|
Add this line to your application's Gemfile:
|
8
11
|
|
9
|
-
gem 'string_awesome'
|
12
|
+
gem 'string_awesome', '~> 0.2.1'
|
10
13
|
|
11
14
|
And then execute:
|
12
15
|
|
@@ -18,7 +21,154 @@ Or install it yourself as:
|
|
18
21
|
|
19
22
|
## Usage
|
20
23
|
|
21
|
-
|
24
|
+
### HTML
|
25
|
+
|
26
|
+
#### String#linkify
|
27
|
+
|
28
|
+
Finds URLs in the text and wrap in anchor tag.
|
29
|
+
|
30
|
+
``` ruby
|
31
|
+
'Awesome site: http://foobar.com'.linkify
|
32
|
+
#=> 'Awesome site: <a href="http://foobar.com">http://foobar.com</a>'
|
33
|
+
|
34
|
+
'www.foobar.com'.linkify
|
35
|
+
#=> '<a href="http://www.foobar.com">www.foobar.com</a>'
|
36
|
+
|
37
|
+
'foobar.com'.linkify
|
38
|
+
#=> '<a href="http://foobar.com">foobar.com</a>'
|
39
|
+
|
40
|
+
'Awesome site: http://foobar.com'.linkify(class: 'link', truncate: 10)
|
41
|
+
#=> 'Awesome site: <a href="http://foobar.com" class="link">http://foo...</a>'
|
42
|
+
|
43
|
+
'Awesome site: http://foobar.com'.linkify(class: 'link', target: '_blank')
|
44
|
+
#=> 'Awesome site: <a href="http://foobar.com" class="link" target="_blank">http://foobar.com</a>'
|
45
|
+
|
46
|
+
'Awesome site: http://foobar.com'.linkify(truncate: { length: 10, html_encoded: true })
|
47
|
+
#=> 'Awesome site: <a href="http://foobar.com">http://foo…</a>'
|
48
|
+
```
|
49
|
+
|
50
|
+
#### String#tweetify
|
51
|
+
|
52
|
+
Finds URLs, Twitter handles, hashtags in the text and wrap in anchor tag.
|
53
|
+
|
54
|
+
``` ruby
|
55
|
+
'What about to follow @tiagopog?'.tweetify
|
56
|
+
#=> 'What about to follow <a href="https://twitter.com/tiagopog" target="_blank" class="tt-handle">@tiagopog</a>?'
|
57
|
+
|
58
|
+
"Let's code! #rubyrocks".tweetify
|
59
|
+
#=> "Let's code! <a href=\"https://twitter.com/search?q=%23rubyrocks\" target=\"_blank\" class=\"hashtag\">#rubyrocks</a>"
|
60
|
+
|
61
|
+
'Cool link from @tiagopog! http://foobar.com #rubyrocks'.tweetify(only: [:hashtag])
|
62
|
+
#=> 'Cool link from @tiagopog! http://foobar.com <a href="https://twitter.com/search?q=%23rubyrocks" target="_blank" class="hashtag">#rubyrocks</a>'
|
63
|
+
|
64
|
+
'Cool link from @tiagopog! http://foobar.com #rubyrocks'.tweetify(only: [:hashtag, :tt_handle])
|
65
|
+
#=> 'Cool link from <a href="https://twitter.com/tiagopog" target="_blank" class="tt-handle">@tiagopog</a>! http://foobar.com <a href="https://twitter.com/search?q=%23rubyrocks" target="_blank" class="hashtag">#rubyrocks</a>'
|
66
|
+
```
|
67
|
+
|
68
|
+
#### String#nl2br
|
69
|
+
|
70
|
+
Replaces \n to \<br /\> tags.
|
71
|
+
|
72
|
+
``` ruby
|
73
|
+
"Hello
|
74
|
+
world!".nl2br
|
75
|
+
#=> "Hello <br/ > world!"
|
76
|
+
```
|
77
|
+
|
78
|
+
#### String#strip_tags
|
79
|
+
|
80
|
+
Removes all HTML tags from text.
|
81
|
+
|
82
|
+
``` ruby
|
83
|
+
'<h1><a href="http://somecoolurl.com">Aloha!</a></h1>'.strip_tags
|
84
|
+
#=> 'Aloha!'
|
85
|
+
```
|
86
|
+
|
87
|
+
### Other Cool Features
|
88
|
+
|
89
|
+
#### String#ellipsis
|
90
|
+
|
91
|
+
Appends ellipsis to the text.
|
92
|
+
|
93
|
+
``` ruby
|
94
|
+
'lorem ipsum!'.ellipsis
|
95
|
+
#=> 'lorem...'
|
96
|
+
|
97
|
+
"It's a very loooooong text!".ellipsis 11
|
98
|
+
#=> "It's a very..."
|
99
|
+
|
100
|
+
"It's a very loooooong text!".ellipsis 8, after_a_word: true
|
101
|
+
#=> "It's a..."
|
102
|
+
|
103
|
+
'lorem ipsum'.ellipsis(5, html_encoded: true)
|
104
|
+
#=> 'lorem…'
|
105
|
+
```
|
106
|
+
|
107
|
+
#### String#no_accents
|
108
|
+
|
109
|
+
Removes accents from words in the text.
|
110
|
+
|
111
|
+
``` ruby
|
112
|
+
'lórem ipsùm dólor sìt ãmet!'.no_accents
|
113
|
+
#=> 'lorem ipsum dolor sit amet!'
|
114
|
+
```
|
115
|
+
|
116
|
+
#### String#slug
|
117
|
+
|
118
|
+
Parses the text to a valid format for URLs.
|
119
|
+
|
120
|
+
``` ruby
|
121
|
+
'Lórem IPSUM Dolor?'.slug
|
122
|
+
#=> 'lorem-ipsum-dolor'
|
123
|
+
```
|
124
|
+
|
125
|
+
#### String#to_title
|
126
|
+
|
127
|
+
Converts the string into a title style and prevents other letters in the middle of the word from being uppercase.
|
128
|
+
|
129
|
+
``` ruby
|
130
|
+
'loREm IPsuM DOLOR'.to_title
|
131
|
+
#=> 'Lorem Ipsum Dolor'
|
132
|
+
```
|
133
|
+
|
134
|
+
#### String#reverse_words
|
135
|
+
|
136
|
+
Reverses a string by words, instead of reversing it by characters like the String#reverse.
|
137
|
+
|
138
|
+
``` ruby
|
139
|
+
'lorem ipsum dolor'.reverse_words
|
140
|
+
#=> 'dolor ipsum lorem'
|
141
|
+
```
|
142
|
+
|
143
|
+
#### String#count_words
|
144
|
+
|
145
|
+
Counts how many words there are in the text.
|
146
|
+
|
147
|
+
``` ruby
|
148
|
+
'lorem ipsum dolor'.count_words
|
149
|
+
#=> 3
|
150
|
+
|
151
|
+
'lorem ipsum dolor'.count_words 7 # it will count words until this length: 7
|
152
|
+
#=> 1
|
153
|
+
```
|
154
|
+
|
155
|
+
#### String#first_words
|
156
|
+
|
157
|
+
Returns an Array with the N first words from the text.
|
158
|
+
|
159
|
+
``` ruby
|
160
|
+
'lorem ipsum dolor'.first_words 2
|
161
|
+
#=> 'lorem ipsum'
|
162
|
+
```
|
163
|
+
|
164
|
+
#### String#last_words
|
165
|
+
|
166
|
+
Returns am Array with the N last words from the text.
|
167
|
+
|
168
|
+
``` ruby
|
169
|
+
'lorem ipsum dolor'.last_words 2
|
170
|
+
#=> 'ipsum dolor'
|
171
|
+
```
|
22
172
|
|
23
173
|
## Contributing
|
24
174
|
|
@@ -1,11 +1,12 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
|
2
|
+
require 'string_awesome/awesome_regexes'
|
3
3
|
require 'active_support/inflector'
|
4
4
|
require 'sanitize'
|
5
5
|
|
6
6
|
module StringAwesome
|
7
7
|
# These methods are all included into the String class.
|
8
8
|
module AwesomeMethods
|
9
|
+
include StringAwesome::AwesomeRegexes
|
9
10
|
# Replaces \n to <br /> tags.
|
10
11
|
#
|
11
12
|
# Example:
|
@@ -17,8 +18,8 @@ module StringAwesome
|
|
17
18
|
self.gsub /\n/, '<br />'
|
18
19
|
end
|
19
20
|
|
20
|
-
# Converts the string
|
21
|
-
# letters in the middle of the word from being uppercase.
|
21
|
+
# Converts the string into a title style and prevents
|
22
|
+
# other letters in the middle of the word from being uppercase.
|
22
23
|
#
|
23
24
|
# Example:
|
24
25
|
# >> 'loREm IPsuM DOLOR'.to_title
|
@@ -28,32 +29,27 @@ module StringAwesome
|
|
28
29
|
self.downcase.titleize
|
29
30
|
end
|
30
31
|
|
31
|
-
# Removes HTML tags from text.
|
32
|
+
# Removes all HTML tags from text.
|
32
33
|
#
|
33
34
|
# Example:
|
34
35
|
# >> '<h1><a href="http://somecoolurl.com">Aloha!</a></h1>'.strip_tags
|
35
36
|
# => 'Aloha!'
|
36
|
-
#
|
37
|
-
# Arguments:
|
38
|
-
# allow_whitespace: (Boolean)
|
39
|
-
# - Let it returns the replaced block HTML tags as whitespaces.
|
40
37
|
|
41
|
-
def strip_tags
|
42
|
-
|
43
|
-
allow_whitespace ? str : str.strip
|
38
|
+
def strip_tags
|
39
|
+
Sanitize.clean(self).gsub(/\s+/, ' ').strip
|
44
40
|
end
|
45
41
|
|
46
|
-
#
|
42
|
+
# Removes accents from words in the text.
|
47
43
|
#
|
48
44
|
# Example:
|
49
45
|
# >> 'lórem ipsùm dólor sìt ãmet!'.no_accents
|
50
46
|
# => 'lorem ipsum dolor sit amet!'
|
51
47
|
|
52
48
|
def no_accents
|
53
|
-
self.mb_chars.normalize(:kd).gsub(
|
49
|
+
self.mb_chars.normalize(:kd).gsub(SA_ACCENT_REGEX, '').to_s
|
54
50
|
end
|
55
51
|
|
56
|
-
# Parses text to a valid format for
|
52
|
+
# Parses the text to a valid format for URLs.
|
57
53
|
#
|
58
54
|
# Example:
|
59
55
|
# >> 'Lórem IPSUM Dolor?'.slug
|
@@ -61,65 +57,31 @@ module StringAwesome
|
|
61
57
|
#
|
62
58
|
# Arguments:
|
63
59
|
# downcase: (Boolean)
|
64
|
-
#
|
60
|
+
# - If true, it will force the String to be in downcase.
|
65
61
|
|
66
62
|
def slug(downcase = true)
|
67
|
-
str = self.no_accents.
|
63
|
+
str = self.no_accents.words.join '-'
|
68
64
|
downcase ? str.downcase : str
|
69
65
|
end
|
70
66
|
|
71
|
-
#
|
67
|
+
# Returns an array with all the words from the string.
|
72
68
|
#
|
73
69
|
# Example:
|
74
|
-
# >>
|
75
|
-
# =>
|
76
|
-
# >> "It's a very loooooong text!".ellipsis 8, after_a_word: true
|
77
|
-
# => "It's a..."
|
78
|
-
#
|
79
|
-
# Arguments:
|
80
|
-
# max_length: (Integer)
|
81
|
-
# - Indicates the max length expected, before ellipsis, for the result.
|
82
|
-
# options: (Hash)
|
83
|
-
# - Other options such as:
|
84
|
-
# - :html_encoded - If true, the ellipsis will be displayed in HTML encoded format: ….
|
85
|
-
# - :after_a_word - If true, the ellipsis will be displayed necessarily after a word.
|
70
|
+
# >> 'Lorem! Ipsum dolor, sit amet 2013.'.words
|
71
|
+
# => ['Lorem', 'Ipsum', 'dolor', 'sit', 'amet', '2013']
|
86
72
|
|
87
|
-
def
|
88
|
-
|
89
|
-
|
90
|
-
if length > 1 and max_length <= length
|
91
|
-
# Adjusts the max_length
|
92
|
-
max_length = (length / 2).round if max_length == 0
|
93
|
-
|
94
|
-
# Truncates the text according to the max_length
|
95
|
-
str = self[0...max_length]
|
96
|
-
|
97
|
-
# Defines how the ellipsis will be displayed
|
98
|
-
ellip = options[:html_encoded] == true ? '…' : '...'
|
99
|
-
|
100
|
-
# If ellipsis must be applied after a word
|
101
|
-
if options[:after_a_word] == true
|
102
|
-
words = str.split(/\s/)
|
103
|
-
words = words[0..words.length - 2] if words.length > 1
|
104
|
-
str = words.join(' ')
|
105
|
-
else
|
106
|
-
str = str.gsub(/\s+$/, '')
|
107
|
-
end
|
108
|
-
|
109
|
-
str + ellip
|
110
|
-
else
|
111
|
-
self
|
112
|
-
end
|
73
|
+
def words
|
74
|
+
self.split(/[\s\W]+/)
|
113
75
|
end
|
114
76
|
|
115
|
-
# Reverses a string by words, instead of reversing it by
|
77
|
+
# Reverses a string by words, instead of reversing it by characters.
|
116
78
|
#
|
117
79
|
# Example:
|
118
80
|
# >> 'lorem ipsum dolor'.reverse_words
|
119
81
|
# => 'dolor ipsum lorem'
|
120
82
|
|
121
83
|
def reverse_words
|
122
|
-
self.
|
84
|
+
self.words.reverse.join(' ')
|
123
85
|
end
|
124
86
|
|
125
87
|
# Counts how many words there are in the string limited by the max_length value.
|
@@ -131,20 +93,18 @@ module StringAwesome
|
|
131
93
|
# => 1
|
132
94
|
# Arguments:
|
133
95
|
# max_length: (Integer)
|
134
|
-
#
|
96
|
+
# - References where it will stop counting words in the string.
|
135
97
|
|
136
98
|
def count_words(max_length = nil)
|
137
|
-
# No duplicated whitespaces
|
138
|
-
str = self.gsub(/[\s\W]+/, ' ')
|
139
99
|
# Counts words
|
140
|
-
count = (max_length ?
|
141
|
-
# Checks
|
142
|
-
count -= 1
|
100
|
+
count = (max_length ? self[0...max_length] : self).words.count
|
101
|
+
# Checks if the last word is complete
|
102
|
+
count -= 1 if max_length and self[max_length - 1, 2] =~ /\w{2}/
|
143
103
|
|
144
104
|
count
|
145
105
|
end
|
146
106
|
|
147
|
-
# Returns an Array with the N first words
|
107
|
+
# Returns an Array with the N first words from the text.
|
148
108
|
#
|
149
109
|
# Example:
|
150
110
|
# >> 'lorem ipsum'.first_words
|
@@ -153,14 +113,13 @@ module StringAwesome
|
|
153
113
|
# => 'lorem ipsum'
|
154
114
|
# Arguments:
|
155
115
|
# amount: (Integer)
|
156
|
-
#
|
116
|
+
# - Indicates how many words it expects to ge
|
157
117
|
|
158
118
|
def first_words(amount = nil)
|
159
|
-
|
160
|
-
amount ? words[0...amount] : words
|
119
|
+
amount ? self.words[0...amount] : self.words
|
161
120
|
end
|
162
121
|
|
163
|
-
# Returns the N last words
|
122
|
+
# Returns am Array with the N last words from the text.
|
164
123
|
#
|
165
124
|
# Example:
|
166
125
|
# >> 'lorem ipsum'.last_words
|
@@ -169,14 +128,68 @@ module StringAwesome
|
|
169
128
|
# => 'ipsum dolor'
|
170
129
|
# Arguments:
|
171
130
|
# amount: (Integer)
|
172
|
-
#
|
131
|
+
# - Indicates how many words it expects to ge
|
173
132
|
|
174
133
|
def last_words(amount = nil)
|
175
|
-
words = self.
|
134
|
+
words = self.words.reverse
|
176
135
|
(amount ? words[0...amount] : words).reverse
|
177
136
|
end
|
178
137
|
|
179
|
-
#
|
138
|
+
# Appends ellipsis to the text.
|
139
|
+
#
|
140
|
+
# Example:
|
141
|
+
# >> "It's a very loooooong text!".ellipsis 11
|
142
|
+
# => "It's a very..."
|
143
|
+
# >> "It's a very loooooong text!".ellipsis 8, after_a_word: true
|
144
|
+
# => "It's a..."
|
145
|
+
#
|
146
|
+
# Arguments:
|
147
|
+
# max_length: (Integer)
|
148
|
+
# - Indicates the max length expected, before ellipsis, for the result.
|
149
|
+
# options: (Hash)
|
150
|
+
# - Other options such as:
|
151
|
+
# - :html_encoded - If true, the ellipsis will be displayed in HTML encoded format: ….
|
152
|
+
# - :after_a_word - If true, the ellipsis will be displayed necessarily after a word.
|
153
|
+
|
154
|
+
def ellipsis(max_length = 0, options = {})
|
155
|
+
length = self.length
|
156
|
+
return self if length <= 1 or length < max_length
|
157
|
+
|
158
|
+
# Adjusts the max_length
|
159
|
+
max_length = (length / 2).round if max_length == 0
|
160
|
+
|
161
|
+
# Truncates the string
|
162
|
+
str = self.truncate(max_length, options[:after_a_word]).strip
|
163
|
+
|
164
|
+
# Appends ellipsis
|
165
|
+
str << (options[:html_encoded] == true ? '…' : '...')
|
166
|
+
end
|
167
|
+
|
168
|
+
# Truncates the text.
|
169
|
+
#
|
170
|
+
# Example:
|
171
|
+
# >> "It's a very loooooong text!".truncate 11
|
172
|
+
# => "It's a very"
|
173
|
+
# >> "It's a very loooooong text!".ellipsis 8, true
|
174
|
+
# => "It's a"
|
175
|
+
#
|
176
|
+
# Arguments:
|
177
|
+
# max_length: (Integer)
|
178
|
+
# - Indicates the max length expected, before ellipsis, for the result.
|
179
|
+
# after_a_word: (Boolean)
|
180
|
+
# - If true, the ellipsis will be displayed necessarily after a word.
|
181
|
+
def truncate(length, after_a_word = false)
|
182
|
+
str = self[0...length]
|
183
|
+
|
184
|
+
if after_a_word == true
|
185
|
+
words = str.split(/\s+/)
|
186
|
+
str = words[0..words.length - 2].join(' ')
|
187
|
+
end
|
188
|
+
|
189
|
+
str
|
190
|
+
end
|
191
|
+
|
192
|
+
# Finds URLs in text and wrap in anchor tag.
|
180
193
|
#
|
181
194
|
# Example:
|
182
195
|
# >> 'Awesome site: http://foobar.com'.linkify
|
@@ -186,63 +199,61 @@ module StringAwesome
|
|
186
199
|
# Arguments:
|
187
200
|
# options: (Hash)
|
188
201
|
# - Options for the link tag, such as:
|
189
|
-
# - :truncate - If set, it will truncate the URL displayed in the
|
202
|
+
# - :truncate - If set, it will truncate the URL displayed in the anchor tag
|
190
203
|
# and put an ellipsis according to the given length. It can
|
191
204
|
# be also a Hash of options:
|
192
|
-
# - :length -
|
205
|
+
# - :length - URLs new length.
|
193
206
|
# - :html_encoded - Ellipsis will be displayed as HTML encoded char.
|
194
207
|
# - :class - Value for "class" attribute: <a href="url" class="link">url</a>
|
195
208
|
# - :target - Value for "target" attribute: <a href="url" target="_blank">url</a>
|
196
209
|
|
197
210
|
def linkify(options = {})
|
198
|
-
self.gsub!(
|
199
|
-
displayed = match
|
200
|
-
|
201
|
-
|
202
|
-
if options[:truncate]
|
203
|
-
t = options[:truncate]
|
204
|
-
displayed = t.instance_of?(Hash) ? match.ellipsis(t[:length], html_encoded: t[:html_encoded]) : match.ellipsis(t)
|
205
|
-
end
|
211
|
+
self.gsub!(SA_URL_REGEX) do |match|
|
212
|
+
displayed = _truncate_url match, options[:truncate]
|
213
|
+
|
214
|
+
options.delete :truncate
|
206
215
|
|
207
216
|
# Applies 'class' and 'target' options
|
208
|
-
|
209
|
-
options = ''
|
210
|
-
else
|
211
|
-
options = options.reduce ' ' do |s, v|
|
212
|
-
s << (v[0] == :truncate ? '' : "#{v[0]}=\"#{v[1]}\" ")
|
213
|
-
end.gsub(/\s+$/, '')
|
214
|
-
end
|
217
|
+
options = !options ? '' : options.reduce(' ') { |s, v| s << "#{v[0]}=\"#{v[1]}\" " }
|
215
218
|
|
216
219
|
# Forces the presence of the 'http://'
|
217
|
-
match = "http://#{match}" unless match =~
|
220
|
+
match = "http://#{match}" unless match =~ SA_PROTOCOL_REGEX
|
218
221
|
|
219
|
-
"<a href=\"#{match}\"#{options}>#{displayed}</a>"
|
222
|
+
"<a href=\"#{match}\"#{options.gsub(/\s+$/, '')}>#{displayed}</a>"
|
220
223
|
end
|
221
224
|
self
|
222
225
|
end
|
223
226
|
|
224
|
-
#
|
227
|
+
# Trancutes the URL that will be displayed in the <a> tag
|
228
|
+
#
|
229
|
+
# Arguments:
|
230
|
+
# m: (String)
|
231
|
+
# - Matched URL.
|
232
|
+
# t: (Hash|Integer)
|
233
|
+
# - Where the URL will be truncated.
|
234
|
+
def _truncate_url(m, t)
|
235
|
+
t ? (t.instance_of?(Hash) ? m.ellipsis(t[:length], html_encoded: t[:html_encoded]) : m.ellipsis(t)) : m
|
236
|
+
end
|
237
|
+
|
238
|
+
# Finds URLs, Twitter handles, hashtags in the text and wrap in anchor tag.
|
225
239
|
#
|
226
240
|
# Example:
|
227
|
-
# >> 'What about to follow @tiagopog?'
|
241
|
+
# >> 'What about to follow @tiagopog?'.tweetfy
|
228
242
|
# => 'What about to follow <a href="https://twitter.com/tiagopog" target="_blank" class="tt-handle">@tiagopog</a>?'
|
229
|
-
# >> "Let's code! #rubyrocks"
|
243
|
+
# >> "Let's code! #rubyrocks".tweetfy
|
230
244
|
# => "Let's code! <a href=\"https://twitter.com/search?q=%23rubyrocks\" target=\"_blank\" class=\"hashtag\">#rubyrocks</a>"
|
231
245
|
# Arguments:
|
232
246
|
# options: (Hash)
|
233
|
-
#
|
234
|
-
#
|
247
|
+
# - Options such as:
|
248
|
+
# - :only - Array of Symbols restricting what will be matched on the text.
|
235
249
|
|
236
250
|
def tweetify(options = {})
|
237
251
|
# Applies linkify unless there's some restriction
|
238
252
|
only = options[:only]
|
239
253
|
str = only ? self : self.linkify(class: 'link')
|
240
254
|
|
241
|
-
# Stores the regex in a variable just to make it more readable
|
242
|
-
regex = /(((^#)([a-z0-9\_]+))|(([^a-z0-9\W]|\s)((#)([a-z0-9\_]+))))|(((^@)([a-z0-9\_]+))|(([^a-z0-9\W]|\s)((@)([a-z0-9\_]+))))/i
|
243
|
-
|
244
255
|
# Iterates with the matched expressions
|
245
|
-
str.gsub!(
|
256
|
+
str.gsub!(SA_TWEET_REGEX) do |match|
|
246
257
|
is_hashtag = match =~ /#/
|
247
258
|
|
248
259
|
if only and ([:hashtag, :tt_handle] != only.sort) and ((is_hashtag and !only.include?(:hashtag)) or (!is_hashtag and !only.include?(:tt_handle)))
|
@@ -261,4 +272,4 @@ module StringAwesome
|
|
261
272
|
str
|
262
273
|
end
|
263
274
|
end
|
264
|
-
end
|
275
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
module StringAwesome
|
2
|
+
module AwesomeRegexes
|
3
|
+
SA_ACCENT_REGEX = /[^\x00-\x7F]/n
|
4
|
+
SA_URL_REGEX = /\b(((ht|f)tp[s]?:\/\/)?([a-z0-9]+\.)?(?<!@)([a-z0-9\_\-]+)(\.[a-z]+)+([\?\/\:][a-z0-9_=%&@\?\.\/\-\:\#\(\)]+)?\/?)/i
|
5
|
+
SA_PROTOCOL_REGEX = /(ht|f)tp[s]?/i
|
6
|
+
SA_TWEET_REGEX = /(((^[@#])|([^a-z0-9\W]|\s)([@|#]))([a-z0-9\_]+))/i
|
7
|
+
end
|
8
|
+
end
|
@@ -32,12 +32,8 @@ describe 'String#strip_tags' do
|
|
32
32
|
'<h1><a href="http://somecoolurl.com">Aloha!</a></h1>'.strip_tags.should eq 'Aloha!'
|
33
33
|
end
|
34
34
|
|
35
|
-
it 'should remove
|
36
|
-
'<h1>
|
37
|
-
end
|
38
|
-
|
39
|
-
it 'should not remove the whitespaces that were allocated in place of HTML tags, when required' do
|
40
|
-
'<h1>whitespaces</h1>'.strip_tags(true).should eq ' whitespaces '
|
35
|
+
it 'should remove the whitespaces that were allocated in place of HTML tags' do
|
36
|
+
'<h1>lorem ipsum </h1> dolor'.strip_tags.should eq 'lorem ipsum dolor'
|
41
37
|
end
|
42
38
|
end
|
43
39
|
|
@@ -63,6 +59,19 @@ describe 'String#slug' do
|
|
63
59
|
end
|
64
60
|
end
|
65
61
|
|
62
|
+
#
|
63
|
+
# String#truncate
|
64
|
+
#
|
65
|
+
describe 'String#truncate' do
|
66
|
+
it 'shoud truncate the text' do
|
67
|
+
"It's a very loooooong text!".truncate(11).should eq "It's a very"
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'shoud truncate the text after a word' do
|
71
|
+
"It's a very loooooong text!".truncate(8, true).should eq "It's a"
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
66
75
|
#
|
67
76
|
# String#ellipsis
|
68
77
|
#
|
@@ -83,7 +92,7 @@ describe 'String#ellipsis' do
|
|
83
92
|
'lorem ipsum'.ellipsis.should eq 'lorem...'
|
84
93
|
end
|
85
94
|
|
86
|
-
it
|
95
|
+
it 'should append the HTML encoded ellipsis in the text' do
|
87
96
|
'lorem ipsum'.ellipsis(5, html_encoded: true).should eq 'lorem…'
|
88
97
|
end
|
89
98
|
|
@@ -100,6 +109,15 @@ describe 'String#ellipsis' do
|
|
100
109
|
end
|
101
110
|
end
|
102
111
|
|
112
|
+
#
|
113
|
+
# String#words
|
114
|
+
#
|
115
|
+
describe 'String#words' do
|
116
|
+
it 'should return an array with all the words from the string' do
|
117
|
+
'Lorem! Ipsum dolor, sit amet 2013.'.words.should eq ['Lorem', 'Ipsum', 'dolor', 'sit', 'amet', '2013']
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
103
121
|
#
|
104
122
|
# String#reverse_words
|
105
123
|
#
|
@@ -168,37 +186,37 @@ end
|
|
168
186
|
# String#linkify
|
169
187
|
#
|
170
188
|
describe 'String#linkify' do
|
171
|
-
it
|
189
|
+
it 'should find all the URLs in text and wrap in anchor tags' do
|
172
190
|
str = 'Awesome site: http://foobar.com'
|
173
191
|
this = 'Awesome site: <a href="http://foobar.com">http://foobar.com</a>'
|
174
192
|
str.linkify.should eq this
|
175
193
|
end
|
176
194
|
|
177
|
-
it 'can set the "class" HTML attribute to be applied on the
|
195
|
+
it 'can set the "class" HTML attribute to be applied on the anchor tag' do
|
178
196
|
str = 'Awesome site: http://foobar.com'
|
179
197
|
this = 'Awesome site: <a href="http://foobar.com" class="link">http://foobar.com</a>'
|
180
198
|
str.linkify(class: 'link').should eq this
|
181
199
|
end
|
182
200
|
|
183
|
-
it 'can set the "target" HTML attribute to be applied on the
|
201
|
+
it 'can set the "target" HTML attribute to be applied on the anchor tag' do
|
184
202
|
str = 'Awesome site: http://foobar.com'
|
185
203
|
this = 'Awesome site: <a href="http://foobar.com" target="_blank">http://foobar.com</a>'
|
186
204
|
str.linkify(target: '_blank').should eq this
|
187
205
|
end
|
188
206
|
|
189
|
-
it 'can set the class and target HTML attributes to be applied on the
|
207
|
+
it 'can set the class and target HTML attributes to be applied on the anchor tag' do
|
190
208
|
str = 'Awesome site: http://foobar.com'
|
191
209
|
this = 'Awesome site: <a href="http://foobar.com" class="link" target="_blank">http://foobar.com</a>'
|
192
210
|
str.linkify(class: 'link', target: '_blank').should eq this
|
193
211
|
end
|
194
212
|
|
195
|
-
it 'can truncate the URL displayed whithin the
|
213
|
+
it 'can truncate the URL displayed whithin the anchor tag (Interger param)' do
|
196
214
|
str = 'Awesome site: http://foobar.com'
|
197
215
|
this = 'Awesome site: <a href="http://foobar.com">http://foo...</a>'
|
198
216
|
str.linkify(truncate: 10).should eq this
|
199
217
|
end
|
200
218
|
|
201
|
-
it 'can truncate the URL displayed whithin the
|
219
|
+
it 'can truncate the URL displayed whithin the anchor tag (Hash param)' do
|
202
220
|
str = 'Awesome site: http://foobar.com'
|
203
221
|
this = 'Awesome site: <a href="http://foobar.com">http://foo…</a>'
|
204
222
|
str.linkify(truncate: { length: 10, html_encoded: true }).should eq this
|
@@ -210,11 +228,11 @@ describe 'String#linkify' do
|
|
210
228
|
str.linkify(class: 'link', truncate: 10).should eq this
|
211
229
|
end
|
212
230
|
|
213
|
-
it "matches
|
231
|
+
it "matches URLs without the presence of 'http://' but presenting 'www'" do
|
214
232
|
'www.foobar.com'.linkify.should eq '<a href="http://www.foobar.com">www.foobar.com</a>'
|
215
233
|
end
|
216
234
|
|
217
|
-
it "matches
|
235
|
+
it "matches URLs without the presence of 'http://' and 'www'" do
|
218
236
|
'foobar.com'.linkify.should eq '<a href="http://foobar.com">foobar.com</a>'
|
219
237
|
end
|
220
238
|
end
|
@@ -223,7 +241,7 @@ end
|
|
223
241
|
# String#tweetify
|
224
242
|
#
|
225
243
|
describe 'String#tweetify' do
|
226
|
-
it 'should
|
244
|
+
it 'should find Twitter handles (@username) and wrap them in anchor tags' do
|
227
245
|
str = 'What about to follow @tiagopog?'
|
228
246
|
this = 'What about to follow <a href="https://twitter.com/tiagopog" target="_blank" class="tt-handle">@tiagopog</a>?'
|
229
247
|
str.tweetify.should eq this
|
@@ -234,7 +252,7 @@ describe 'String#tweetify' do
|
|
234
252
|
str.tweetify.should eq str
|
235
253
|
end
|
236
254
|
|
237
|
-
it 'should
|
255
|
+
it 'should find hashtags (#hashtag) and wrap them in anchor tags' do
|
238
256
|
str = "Let's code! #rubyrocks"
|
239
257
|
this = "Let's code! <a href=\"https://twitter.com/search?q=%23rubyrocks\" target=\"_blank\" class=\"hashtag\">#rubyrocks</a>"
|
240
258
|
str.tweetify.should eq this
|
@@ -245,31 +263,31 @@ describe 'String#tweetify' do
|
|
245
263
|
str.tweetify.should eq str
|
246
264
|
end
|
247
265
|
|
248
|
-
it
|
266
|
+
it 'should find URLs and wrap them in anchor tags' do
|
249
267
|
str = 'Tweet some cool link: http://foobar.com'
|
250
268
|
this = 'Tweet some cool link: <a href="http://foobar.com" class="link">http://foobar.com</a>'
|
251
269
|
str.tweetify.should eq this
|
252
270
|
end
|
253
271
|
|
254
|
-
it 'should
|
272
|
+
it 'should find links, Twitter handles, hashtags and wrap them in anchor tags' do
|
255
273
|
str = 'Cool link from @tiagopog! http://foobar.com #rubyrocks'
|
256
274
|
this = 'Cool link from <a href="https://twitter.com/tiagopog" target="_blank" class="tt-handle">@tiagopog</a>! <a href="http://foobar.com" class="link">http://foobar.com</a> <a href="https://twitter.com/search?q=%23rubyrocks" target="_blank" class="hashtag">#rubyrocks</a>'
|
257
275
|
str.tweetify.should eq this
|
258
276
|
end
|
259
277
|
|
260
|
-
it 'should
|
278
|
+
it 'should find only Twitter handles' do
|
261
279
|
str = 'Cool link from @tiagopog! http://foobar.com #rubyrocks'
|
262
280
|
this = 'Cool link from <a href="https://twitter.com/tiagopog" target="_blank" class="tt-handle">@tiagopog</a>! http://foobar.com #rubyrocks'
|
263
281
|
str.tweetify(only: [:tt_handle]).should eq this
|
264
282
|
end
|
265
283
|
|
266
|
-
it 'should
|
284
|
+
it 'should find only hashtags' do
|
267
285
|
str = 'Cool link from @tiagopog! http://foobar.com #rubyrocks'
|
268
286
|
this = 'Cool link from @tiagopog! http://foobar.com <a href="https://twitter.com/search?q=%23rubyrocks" target="_blank" class="hashtag">#rubyrocks</a>'
|
269
287
|
str.tweetify(only: [:hashtag]).should eq this
|
270
288
|
end
|
271
289
|
|
272
|
-
it
|
290
|
+
it 'should not find URLs, just hashtags and Twitter handles' do
|
273
291
|
str = 'Cool link from @tiagopog! http://foobar.com #rubyrocks'
|
274
292
|
this = 'Cool link from <a href="https://twitter.com/tiagopog" target="_blank" class="tt-handle">@tiagopog</a>! http://foobar.com <a href="https://twitter.com/search?q=%23rubyrocks" target="_blank" class="hashtag">#rubyrocks</a>'
|
275
293
|
str.tweetify(only: [:hashtag, :tt_handle]).should eq this
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: string_awesome
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.1
|
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-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -108,12 +108,14 @@ extensions: []
|
|
108
108
|
extra_rdoc_files: []
|
109
109
|
files:
|
110
110
|
- .gitignore
|
111
|
+
- .travis.yml
|
111
112
|
- Gemfile
|
112
113
|
- LICENSE.txt
|
113
114
|
- README.md
|
114
115
|
- Rakefile
|
115
116
|
- lib/string_awesome.rb
|
116
117
|
- lib/string_awesome/awesome_methods.rb
|
118
|
+
- lib/string_awesome/awesome_regexes.rb
|
117
119
|
- lib/string_awesome/version.rb
|
118
120
|
- spec/awesome_methods_spec.rb
|
119
121
|
- spec/spec_helper.rb
|