string_awesome 0.0.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 5d675469875aea4b7c4d6530e3047ab432fc6ce2
4
+ data.tar.gz: ecd620e210b9b26361c81d6db69bc20318edd2b2
5
+ SHA512:
6
+ metadata.gz: eb4a11e17dad5c39df691c91b6b43c50a385236495df4d2d768b56dc538d4f7b79b4565b9262e69360469e7961ef60b8b5f991051c577b2e90bbe6b07a17fb0c
7
+ data.tar.gz: 5901dc93bee876e56ef2c15a45f84aee79da423d72df5340480f7798dcda1f812315819e3d6d0e353197ad2bce4d80abdf4d22dfaa96d8070ec59ee9887fbbf0
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ .rspec
7
+ Gemfile.lock
8
+ InstalledFiles
9
+ _yardoc
10
+ coverage
11
+ doc/
12
+ lib/bundler/man
13
+ pkg
14
+ rdoc
15
+ spec/reports
16
+ test/tmp
17
+ test/version_tmp
18
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in string_awesome.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Tiago Guedes
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # StringAwesome
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'string_awesome'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install string_awesome
18
+
19
+ ## Usage
20
+
21
+ TODO: Write usage instructions here
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,264 @@
1
+ # coding: utf-8
2
+
3
+ require 'active_support/inflector'
4
+ require 'sanitize'
5
+
6
+ module StringAwesome
7
+ # These methods are all included into the String class.
8
+ module AwesomeMethods
9
+ # Replaces \n to <br /> tags.
10
+ #
11
+ # Example:
12
+ # >> "Hello
13
+ # world!".nl2br
14
+ # => "Hello <br/ > world!"
15
+
16
+ def nl2br
17
+ self.gsub /\n/, '<br />'
18
+ end
19
+
20
+ # Converts the string to the title style and prevents other
21
+ # letters in the middle of the word from being uppercase.
22
+ #
23
+ # Example:
24
+ # >> 'loREm IPsuM DOLOR'.to_title
25
+ # => 'Lorem Ipsum Dolor'
26
+
27
+ def to_title
28
+ self.downcase.titleize
29
+ end
30
+
31
+ # Removes HTML tags from text.
32
+ #
33
+ # Example:
34
+ # >> '<h1><a href="http://somecoolurl.com">Aloha!</a></h1>'.strip_tags
35
+ # => 'Aloha!'
36
+ #
37
+ # Arguments:
38
+ # allow_whitespace: (Boolean)
39
+ # - Let it returns the replaced block HTML tags as whitespaces.
40
+
41
+ def strip_tags(allow_whitespace = false)
42
+ str = Sanitize.clean self
43
+ allow_whitespace ? str : str.strip
44
+ end
45
+
46
+ # Remove accents from words in the text.
47
+ #
48
+ # Example:
49
+ # >> 'lórem ipsùm dólor sìt ãmet!'.no_accents
50
+ # => 'lorem ipsum dolor sit amet!'
51
+
52
+ def no_accents
53
+ self.mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/n, '').to_s
54
+ end
55
+
56
+ # Parses text to a valid format for URL's.
57
+ #
58
+ # Example:
59
+ # >> 'Lórem IPSUM Dolor?'.slug
60
+ # => 'lorem-ipsum-dolor'
61
+ #
62
+ # Arguments:
63
+ # downcase: (Boolean)
64
+ # - If true, it will force the String to be in downcase.
65
+
66
+ def slug(downcase = true)
67
+ str = self.no_accents.gsub(/\W|_/, '-').gsub(/[-]{2,}/, '-').gsub(/^-|-$/, '').to_s
68
+ downcase ? str.downcase : str
69
+ end
70
+
71
+ # Append ellipsis to the text.
72
+ #
73
+ # Example:
74
+ # >> "It's a very loooooong text!".ellipsis 11
75
+ # => "It's a very..."
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: &hellip;.
85
+ # - :after_a_word - If true, the ellipsis will be displayed necessarily after a word.
86
+
87
+ def ellipsis(max_length = 0, options = {})
88
+ length = self.length
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 ? '&hellip;' : '...'
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
113
+ end
114
+
115
+ # Reverses a string by words, instead of reversing it by every character (String#reverse).
116
+ #
117
+ # Example:
118
+ # >> 'lorem ipsum dolor'.reverse_words
119
+ # => 'dolor ipsum lorem'
120
+
121
+ def reverse_words
122
+ self.split(/\s/).reverse.join(' ')
123
+ end
124
+
125
+ # Counts how many words there are in the string limited by the max_length value.
126
+ #
127
+ # Example:
128
+ # >> 'lorem ipsum dolor'.count_words
129
+ # => 3
130
+ # >> 'lorem ipsum dolor'.count_words 7
131
+ # => 1
132
+ # Arguments:
133
+ # max_length: (Integer)
134
+ # - References where it will stop counting words in the string.
135
+
136
+ def count_words(max_length = nil)
137
+ # No duplicated whitespaces
138
+ str = self.gsub(/[\s\W]+/, ' ')
139
+ # Counts words
140
+ count = (max_length ? str[0...max_length] : str).split(/\s/).count
141
+ # Checks whether the last word is really a word (must be followed by a whitespace)
142
+ count -= 1 unless !max_length or (str[max_length - 1] =~ /\s/) or (!(str[max_length - 1] =~ /\W/) and (str[max_length] =~ /\s/))
143
+
144
+ count
145
+ end
146
+
147
+ # Returns an Array with the N first words of a string.
148
+ #
149
+ # Example:
150
+ # >> 'lorem ipsum'.first_words
151
+ # => 'lorem ipsum'
152
+ # >> 'lorem ipsum dolor'.first_words 2
153
+ # => 'lorem ipsum'
154
+ # Arguments:
155
+ # amount: (Integer)
156
+ # - Indicates how many words it expects to ge
157
+
158
+ def first_words(amount = nil)
159
+ words = self.split(/[\s\W]+/)
160
+ amount ? words[0...amount] : words
161
+ end
162
+
163
+ # Returns the N last words of a string.
164
+ #
165
+ # Example:
166
+ # >> 'lorem ipsum'.last_words
167
+ # => 'lorem ipsum'
168
+ # >> 'lorem ipsum dolor'.last_words 2
169
+ # => 'ipsum dolor'
170
+ # Arguments:
171
+ # amount: (Integer)
172
+ # - Indicates how many words it expects to ge
173
+
174
+ def last_words(amount = nil)
175
+ words = self.split(/[\s\W]+/).reverse
176
+ (amount ? words[0...amount] : words).reverse
177
+ end
178
+
179
+ # Replaces all URL's in the text with HTML link tags
180
+ #
181
+ # Example:
182
+ # >> 'Awesome site: http://foobar.com'.linkify
183
+ # => 'Awesome site: <a href="http://foobar.com">http://foobar.com</a>'
184
+ # >> 'Awesome site: http://foobar.com'.linkify(class: 'link', truncate: 10)
185
+ # => 'Awesome site: <a href="http://foobar.com" class="link">http://foo...</a>'
186
+ # Arguments:
187
+ # options: (Hash)
188
+ # - Options for the link tag, such as:
189
+ # - :truncate - If set, it will truncate the URL displayed in the link tag
190
+ # and put an ellipsis according to the given length. It can
191
+ # be also a Hash of options:
192
+ # - :length - URL's new length.
193
+ # - :html_encoded - Ellipsis will be displayed as HTML encoded char.
194
+ # - :class - Value for "class" attribute: <a href="url" class="link">url</a>
195
+ # - :target - Value for "target" attribute: <a href="url" target="_blank">url</a>
196
+
197
+ def linkify(options = {})
198
+ self.gsub!(/\b(((ht|f)tp[s]?:\/\/)?([a-z0-9]+\.)?(?<!@)([a-z0-9\_\-]+)(\.[a-z]+)+([\?\/\:][a-z0-9_=%&@\?\.\/\-\:\#\(\)]+)?\/?)/i) do
199
+ displayed = match = $1
200
+
201
+ # Truncates the URL
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
206
+
207
+ # Applies 'class' and 'target' options
208
+ if !options
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
215
+
216
+ # Forces the presence of the 'http://'
217
+ match = "http://#{match}" unless match =~ /(ht|f)tp[s]?/i
218
+
219
+ "<a href=\"#{match}\"#{options}>#{displayed}</a>"
220
+ end
221
+ self
222
+ end
223
+
224
+ # Matches URL's, Twitter handles and hashtags putting them into HTML link tags.
225
+ #
226
+ # Example:
227
+ # >> 'What about to follow @tiagopog?'
228
+ # => 'What about to follow <a href="https://twitter.com/tiagopog" target="_blank" class="tt-handle">@tiagopog</a>?'
229
+ # >> "Let's code! #rubyrocks"
230
+ # => "Let's code! <a href=\"https://twitter.com/search?q=%23rubyrocks\" target=\"_blank\" class=\"hashtag\">#rubyrocks</a>"
231
+ # Arguments:
232
+ # options: (Hash)
233
+ # - Options such as:
234
+ # - :only - Array of Symbols restricting what will be matched on the text.
235
+
236
+ def tweetify(options = {})
237
+ # Applies linkify unless there's some restriction
238
+ only = options[:only]
239
+ str = only ? self : self.linkify(class: 'link')
240
+
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
+ # Iterates with the matched expressions
245
+ str.gsub!(regex) do |match|
246
+ is_hashtag = match =~ /#/
247
+
248
+ if only and ([:hashtag, :tt_handle] != only.sort) and ((is_hashtag and !only.include?(:hashtag)) or (!is_hashtag and !only.include?(:tt_handle)))
249
+ match
250
+ else
251
+ match = match.strip
252
+ tt_url = 'https://twitter.com/'
253
+ tag = {
254
+ href: is_hashtag ? "#{tt_url}search?q=%23#{match.gsub(/#/, '')}" : "#{tt_url}#{match.gsub(/@/, '')}",
255
+ class: is_hashtag ? 'hashtag' : 'tt-handle'
256
+ }
257
+
258
+ " <a href=\"#{tag[:href]}\" target=\"_blank\" class=\"#{tag[:class]}\">#{match}</a>"
259
+ end
260
+ end
261
+ str
262
+ end
263
+ end
264
+ end
@@ -0,0 +1,3 @@
1
+ module StringAwesome
2
+ VERSION = '0.0.1'
3
+ end
@@ -0,0 +1,5 @@
1
+ # coding: utf-8
2
+
3
+ require 'string_awesome/awesome_methods'
4
+
5
+ String.send :include, StringAwesome::AwesomeMethods
@@ -0,0 +1,277 @@
1
+ # coding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ #
6
+ # String#nl2br
7
+ #
8
+ describe 'String#nl2br' do
9
+ it 'should replace "\n" to "<br />"' do
10
+ "break\nrow".nl2br.should eq 'break<br />row'
11
+ end
12
+
13
+ it 'should not replace "\n" to "<br />" when "\n" is literal' do
14
+ "\\no break row".nl2br.should_not eq '<br />o break row'
15
+ end
16
+ end
17
+
18
+ #
19
+ # String#to_title
20
+ #
21
+ describe 'String#to_title' do
22
+ it 'should format the text properly to looks like a title' do
23
+ "here's aN AWEsome TiTle!".to_title.should eq "Here's An Awesome Title!"
24
+ end
25
+ end
26
+
27
+ #
28
+ # String#strip_tags
29
+ #
30
+ describe 'String#strip_tags' do
31
+ it 'should remove any HTML tag from a given text' do
32
+ '<h1><a href="http://somecoolurl.com">Aloha!</a></h1>'.strip_tags.should eq 'Aloha!'
33
+ end
34
+
35
+ it 'should remove by default the whitespaces that were allocated in place of HTML tags' do
36
+ '<h1>no whitespaces</h1>'.strip_tags.should eq 'no whitespaces'
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 '
41
+ end
42
+ end
43
+
44
+ #
45
+ # String#no_accents
46
+ #
47
+ describe 'String#no_accents' do
48
+ it 'should remove accents from words in the text' do
49
+ 'lórem ipsùm dólor sìt ãmet!'.no_accents.should eq 'lorem ipsum dolor sit amet!'
50
+ end
51
+ end
52
+
53
+ #
54
+ # String#slug
55
+ #
56
+ describe 'String#slug' do
57
+ it 'should parse the text to an URL valid format, downcase by default' do
58
+ 'Lorem IPSUM Dolor?'.slug.should eq 'lorem-ipsum-dolor'
59
+ end
60
+
61
+ it 'should parse the text to an URL valid format without forcing it to downcase' do
62
+ 'Lorem Ipsum Dolor 2013!'.slug(false).should eq 'Lorem-Ipsum-Dolor-2013'
63
+ end
64
+ end
65
+
66
+ #
67
+ # String#ellipsis
68
+ #
69
+ describe 'String#ellipsis' do
70
+ it "shoud not append ellipsis when String's length is less then 2" do
71
+ 'l'.ellipsis.should eq 'l'
72
+ end
73
+
74
+ it "shoud not have the max_length value greater than text's length" do
75
+ 'foo'.ellipsis(10).should eq 'foo'
76
+ end
77
+
78
+ it "should append ellipsis in the text's half length (default behaviour)" do
79
+ 'lorem ipsum!'.ellipsis.should eq 'lorem...'
80
+ end
81
+
82
+ it "should append ellipsis in the text's rounded half length when the number of characters is odd (default behaviour)" do
83
+ 'lorem ipsum'.ellipsis.should eq 'lorem...'
84
+ end
85
+
86
+ it "should append the HTML encoded ellipsis in the text" do
87
+ 'lorem ipsum'.ellipsis(5, html_encoded: true).should eq 'lorem&hellip;'
88
+ end
89
+
90
+ it "should not append the HTML encoded ellipsis in the text when it's not required" do
91
+ 'lorem ipsum'.ellipsis(5, html_encoded: false).should_not eq 'lorem&hellip;'
92
+ end
93
+
94
+ it 'should append ellipsis after a word' do
95
+ 'lorem ipsum dolor'.ellipsis(14, after_a_word: true).should eq 'lorem ipsum...'
96
+ end
97
+
98
+ it 'should append the HTML encoded ellipsis after a word' do
99
+ 'lorem ipsum dolor'.ellipsis(13, html_encoded: true, after_a_word: true).should eq 'lorem ipsum&hellip;'
100
+ end
101
+ end
102
+
103
+ #
104
+ # String#reverse_words
105
+ #
106
+ describe 'String#reverse_words' do
107
+ it 'should reverse a string by words' do
108
+ 'lorem ipsum dolor'.reverse_words.should eq 'dolor ipsum lorem'
109
+ end
110
+ end
111
+
112
+ #
113
+ # String#count_words
114
+ #
115
+ describe 'String#count_words' do
116
+ it 'should count how many words there are in the string' do
117
+ 'lorem ipsum dolor'.count_words.should eq 3
118
+ end
119
+
120
+ it 'should count how many words there are in the string limited by the max_length value (whitespace test)' do
121
+ 'lorem ipsum dolor'.count_words(6).should eq 1
122
+ end
123
+
124
+ it 'should count how many words there are in the string limited by the max_length value (splitted word, test 1)' do
125
+ 'lorem ipsum dolor'.count_words(7).should eq 1
126
+ end
127
+
128
+ it 'should count how many words there are in the string limited by the max_length value (splitted word, test 2)' do
129
+ 'lorem ipsum dolor'.count_words(8).should eq 1
130
+ end
131
+
132
+ it 'should not condiser a non-word character (!) as a word' do
133
+ 'lorem ipsum ! dolor'.count_words.should eq 3
134
+ end
135
+
136
+ it 'should not condiser a non-word character (!) as a word' do
137
+ 'lorem ipsum ! dolor'.count_words(13).should eq 2
138
+ end
139
+ end
140
+
141
+ #
142
+ # String#first_words
143
+ #
144
+ describe 'String#first_words' do
145
+ it 'should return all the words when the amount is not passed' do
146
+ 'lorem ipsum dolor'.first_words.should eq ['lorem', 'ipsum', 'dolor']
147
+ end
148
+
149
+ it 'should return only the 2 first words (Array)' do
150
+ 'lorem. ! ipsum dolor'.first_words(2).should eq ['lorem', 'ipsum']
151
+ end
152
+ end
153
+
154
+ #
155
+ # String#last_words
156
+ #
157
+ describe 'String#last_words' do
158
+ it 'should return all the words when the amount is not passed' do
159
+ 'lorem ipsum dolor'.last_words.should eq ['lorem', 'ipsum', 'dolor']
160
+ end
161
+
162
+ it 'should return only the 2 last words (Array)' do
163
+ 'lorem. ! ipsum dolor'.first_words(2).should eq ['lorem', 'ipsum']
164
+ end
165
+ end
166
+
167
+ #
168
+ # String#linkify
169
+ #
170
+ describe 'String#linkify' do
171
+ it "should replace all the URL's in the text with HTML link tags" do
172
+ str = 'Awesome site: http://foobar.com'
173
+ this = 'Awesome site: <a href="http://foobar.com">http://foobar.com</a>'
174
+ str.linkify.should eq this
175
+ end
176
+
177
+ it 'can set the "class" HTML attribute to be applied on the link tag' do
178
+ str = 'Awesome site: http://foobar.com'
179
+ this = 'Awesome site: <a href="http://foobar.com" class="link">http://foobar.com</a>'
180
+ str.linkify(class: 'link').should eq this
181
+ end
182
+
183
+ it 'can set the "target" HTML attribute to be applied on the link tag' do
184
+ str = 'Awesome site: http://foobar.com'
185
+ this = 'Awesome site: <a href="http://foobar.com" target="_blank">http://foobar.com</a>'
186
+ str.linkify(target: '_blank').should eq this
187
+ end
188
+
189
+ it 'can set the class and target HTML attributes to be applied on the link tag' do
190
+ str = 'Awesome site: http://foobar.com'
191
+ this = 'Awesome site: <a href="http://foobar.com" class="link" target="_blank">http://foobar.com</a>'
192
+ str.linkify(class: 'link', target: '_blank').should eq this
193
+ end
194
+
195
+ it 'can truncate the URL displayed whithin the link tag (Interger param)' do
196
+ str = 'Awesome site: http://foobar.com'
197
+ this = 'Awesome site: <a href="http://foobar.com">http://foo...</a>'
198
+ str.linkify(truncate: 10).should eq this
199
+ end
200
+
201
+ it 'can truncate the URL displayed whithin the link tag (Hash param)' do
202
+ str = 'Awesome site: http://foobar.com'
203
+ this = 'Awesome site: <a href="http://foobar.com">http://foo&hellip;</a>'
204
+ str.linkify(truncate: { length: 10, html_encoded: true }).should eq this
205
+ end
206
+
207
+ it 'can set HTML attributes and truncate the URL' do
208
+ str = 'Awesome site: http://foobar.com'
209
+ this = 'Awesome site: <a href="http://foobar.com" class="link">http://foo...</a>'
210
+ str.linkify(class: 'link', truncate: 10).should eq this
211
+ end
212
+
213
+ it "matches URL's without the presence of 'http://' but presenting 'www'" do
214
+ 'www.foobar.com'.linkify.should eq '<a href="http://www.foobar.com">www.foobar.com</a>'
215
+ end
216
+
217
+ it "matches URL's without the presence of 'http://' and 'www'" do
218
+ 'foobar.com'.linkify.should eq '<a href="http://foobar.com">foobar.com</a>'
219
+ end
220
+ end
221
+
222
+ #
223
+ # String#tweetify
224
+ #
225
+ describe 'String#tweetify' do
226
+ it 'should match Twitter handles (@username) and replace them into HTML link tags' do
227
+ str = 'What about to follow @tiagopog?'
228
+ this = 'What about to follow <a href="https://twitter.com/tiagopog" target="_blank" class="tt-handle">@tiagopog</a>?'
229
+ str.tweetify.should eq this
230
+ end
231
+
232
+ it 'should not match foo@bar as being a Twitter handle' do
233
+ str = 'foo@bar'
234
+ str.tweetify.should eq str
235
+ end
236
+
237
+ it 'should match hashtags (#hashtag) and replace them into HTML link tags' do
238
+ str = "Let's code! #rubyrocks"
239
+ this = "Let's code! <a href=\"https://twitter.com/search?q=%23rubyrocks\" target=\"_blank\" class=\"hashtag\">#rubyrocks</a>"
240
+ str.tweetify.should eq this
241
+ end
242
+
243
+ it 'should not match foo#bar as being a hashtag' do
244
+ str = 'foo#bar'
245
+ str.tweetify.should eq str
246
+ end
247
+
248
+ it "should match URL's and replace them into HTML link tags" do
249
+ str = 'Tweet some cool link: http://foobar.com'
250
+ this = 'Tweet some cool link: <a href="http://foobar.com" class="link">http://foobar.com</a>'
251
+ str.tweetify.should eq this
252
+ end
253
+
254
+ it 'should match links, Twitter handles, hashtags and replace them into HTML link tags' do
255
+ str = 'Cool link from @tiagopog! http://foobar.com #rubyrocks'
256
+ 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
+ str.tweetify.should eq this
258
+ end
259
+
260
+ it 'should match only Twitter handles' do
261
+ str = 'Cool link from @tiagopog! http://foobar.com #rubyrocks'
262
+ this = 'Cool link from <a href="https://twitter.com/tiagopog" target="_blank" class="tt-handle">@tiagopog</a>! http://foobar.com #rubyrocks'
263
+ str.tweetify(only: [:tt_handle]).should eq this
264
+ end
265
+
266
+ it 'should match only hashtags' do
267
+ str = 'Cool link from @tiagopog! http://foobar.com #rubyrocks'
268
+ this = 'Cool link from @tiagopog! http://foobar.com <a href="https://twitter.com/search?q=%23rubyrocks" target="_blank" class="hashtag">#rubyrocks</a>'
269
+ str.tweetify(only: [:hashtag]).should eq this
270
+ end
271
+
272
+ it "should not match URL's, just hashtags and Twitter handles" do
273
+ str = 'Cool link from @tiagopog! http://foobar.com #rubyrocks'
274
+ 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
+ str.tweetify(only: [:hashtag, :tt_handle]).should eq this
276
+ end
277
+ end
@@ -0,0 +1,7 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'active_support/inflector'
4
+ require 'sanitize'
5
+ require 'escape_utils'
6
+
7
+ require 'string_awesome'
@@ -0,0 +1,28 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'string_awesome/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'string_awesome'
8
+ spec.version = StringAwesome::VERSION
9
+ spec.authors = ['Tiago Guedes']
10
+ spec.email = ['tiagopog@gmail.com']
11
+ spec.description = %q{Awesome and easy-to-use extensions to Ruby String class.}
12
+ spec.summary = %q{Extensions for Ruby String class}
13
+ spec.homepage = 'https://github.com/tiagopog/string_awesome'
14
+ spec.license = 'MIT'
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ['lib']
20
+
21
+ spec.add_runtime_dependency 'activesupport', ['>= 3.0', '< 5.0']
22
+ spec.add_runtime_dependency 'sanitize', '~> 2.0'
23
+
24
+ spec.add_development_dependency 'escape_utils', '~> 1.0'
25
+ spec.add_development_dependency 'rspec'
26
+ spec.add_development_dependency 'bundler', '~> 1.3'
27
+ spec.add_development_dependency 'rake'
28
+ end
metadata ADDED
@@ -0,0 +1,147 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: string_awesome
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Tiago Guedes
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-12-08 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '3.0'
20
+ - - <
21
+ - !ruby/object:Gem::Version
22
+ version: '5.0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '3.0'
30
+ - - <
31
+ - !ruby/object:Gem::Version
32
+ version: '5.0'
33
+ - !ruby/object:Gem::Dependency
34
+ name: sanitize
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ~>
38
+ - !ruby/object:Gem::Version
39
+ version: '2.0'
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ~>
45
+ - !ruby/object:Gem::Version
46
+ version: '2.0'
47
+ - !ruby/object:Gem::Dependency
48
+ name: escape_utils
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: '1.0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ~>
59
+ - !ruby/object:Gem::Version
60
+ version: '1.0'
61
+ - !ruby/object:Gem::Dependency
62
+ name: rspec
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - '>='
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - '>='
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: bundler
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ~>
80
+ - !ruby/object:Gem::Version
81
+ version: '1.3'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ~>
87
+ - !ruby/object:Gem::Version
88
+ version: '1.3'
89
+ - !ruby/object:Gem::Dependency
90
+ name: rake
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - '>='
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - '>='
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ description: Awesome and easy-to-use extensions to Ruby String class.
104
+ email:
105
+ - tiagopog@gmail.com
106
+ executables: []
107
+ extensions: []
108
+ extra_rdoc_files: []
109
+ files:
110
+ - .gitignore
111
+ - Gemfile
112
+ - LICENSE.txt
113
+ - README.md
114
+ - Rakefile
115
+ - lib/string_awesome.rb
116
+ - lib/string_awesome/awesome_methods.rb
117
+ - lib/string_awesome/version.rb
118
+ - spec/awesome_methods_spec.rb
119
+ - spec/spec_helper.rb
120
+ - string_awesome.gemspec
121
+ homepage: https://github.com/tiagopog/string_awesome
122
+ licenses:
123
+ - MIT
124
+ metadata: {}
125
+ post_install_message:
126
+ rdoc_options: []
127
+ require_paths:
128
+ - lib
129
+ required_ruby_version: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - '>='
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ required_rubygems_version: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - '>='
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ requirements: []
140
+ rubyforge_project:
141
+ rubygems_version: 2.1.5
142
+ signing_key:
143
+ specification_version: 4
144
+ summary: Extensions for Ruby String class
145
+ test_files:
146
+ - spec/awesome_methods_spec.rb
147
+ - spec/spec_helper.rb