twitter-text 1.3.0 → 1.3.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.
data/Gemfile.lock CHANGED
@@ -1,35 +1,35 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- twitter-text (1.3.0)
4
+ twitter-text (1.3.1)
5
5
  actionpack
6
6
 
7
7
  GEM
8
8
  remote: http://rubygems.org/
9
9
  specs:
10
10
  abstract (1.0.0)
11
- actionpack (3.0.1)
12
- activemodel (= 3.0.1)
13
- activesupport (= 3.0.1)
11
+ actionpack (3.0.3)
12
+ activemodel (= 3.0.3)
13
+ activesupport (= 3.0.3)
14
14
  builder (~> 2.1.2)
15
15
  erubis (~> 2.6.6)
16
- i18n (~> 0.4.1)
16
+ i18n (~> 0.4)
17
17
  rack (~> 1.2.1)
18
- rack-mount (~> 0.6.12)
19
- rack-test (~> 0.5.4)
18
+ rack-mount (~> 0.6.13)
19
+ rack-test (~> 0.5.6)
20
20
  tzinfo (~> 0.3.23)
21
- activemodel (3.0.1)
22
- activesupport (= 3.0.1)
21
+ activemodel (3.0.3)
22
+ activesupport (= 3.0.3)
23
23
  builder (~> 2.1.2)
24
- i18n (~> 0.4.1)
25
- activesupport (3.0.1)
24
+ i18n (~> 0.4)
25
+ activesupport (3.0.3)
26
26
  builder (2.1.2)
27
27
  diff-lcs (1.1.2)
28
28
  erubis (2.6.6)
29
29
  abstract (>= 1.0.0)
30
- i18n (0.4.2)
31
- nokogiri (1.4.3.1)
32
- nokogiri (1.4.3.1-java)
30
+ i18n (0.5.0)
31
+ nokogiri (1.4.4)
32
+ nokogiri (1.4.4-java)
33
33
  weakling (>= 0.0.3)
34
34
  rack (1.2.1)
35
35
  rack-mount (0.6.13)
@@ -37,14 +37,14 @@ GEM
37
37
  rack-test (0.5.6)
38
38
  rack (>= 1.0)
39
39
  rake (0.8.7)
40
- rspec (2.1.0)
41
- rspec-core (~> 2.1.0)
42
- rspec-expectations (~> 2.1.0)
43
- rspec-mocks (~> 2.1.0)
44
- rspec-core (2.1.0)
45
- rspec-expectations (2.1.0)
40
+ rspec (2.3.0)
41
+ rspec-core (~> 2.3.0)
42
+ rspec-expectations (~> 2.3.0)
43
+ rspec-mocks (~> 2.3.0)
44
+ rspec-core (2.3.1)
45
+ rspec-expectations (2.3.0)
46
46
  diff-lcs (~> 1.1.2)
47
- rspec-mocks (2.1.0)
47
+ rspec-mocks (2.3.0)
48
48
  simplecov (0.3.7)
49
49
  simplecov-html (>= 0.3.7)
50
50
  simplecov-html (0.3.9)
data/lib/autolink.rb CHANGED
@@ -12,6 +12,8 @@ module Twitter
12
12
  DEFAULT_USERNAME_CLASS = "username"
13
13
  # Default CSS class for auto-linked hashtags (along with the url class)
14
14
  DEFAULT_HASHTAG_CLASS = "hashtag"
15
+ # Default target for auto-linked urls (nil will not add a target attribute)
16
+ DEFAULT_TARGET = nil
15
17
  # HTML attribute for robot nofollow behavior (default)
16
18
  HTML_ATTR_NO_FOLLOW = " rel=\"nofollow\""
17
19
 
@@ -42,6 +44,7 @@ module Twitter
42
44
  # <tt>:hashtag_url_base</tt>:: the value for <tt>href</tt> attribute on hashtag links. The <tt>#hashtag</tt> (minus the <tt>#</tt>) will be appended at the end of this.
43
45
  # <tt>:suppress_lists</tt>:: disable auto-linking to lists
44
46
  # <tt>:suppress_no_follow</tt>:: Do not add <tt>rel="nofollow"</tt> to auto-linked items
47
+ # <tt>:target</tt>:: add <tt>target="window_name"</tt> to auto-linked items
45
48
  def auto_link(text, options = {})
46
49
  auto_link_usernames_or_lists(
47
50
  auto_link_urls_custom(
@@ -61,6 +64,7 @@ module Twitter
61
64
  # <tt>:list_url_base</tt>:: the value for <tt>href</tt> attribute on list links. The <tt>@username/list</tt> (minus the <tt>@</tt>) will be appended at the end of this.
62
65
  # <tt>:suppress_lists</tt>:: disable auto-linking to lists
63
66
  # <tt>:suppress_no_follow</tt>:: Do not add <tt>rel="nofollow"</tt> to auto-linked items
67
+ # <tt>:target</tt>:: add <tt>target="window_name"</tt> to auto-linked items
64
68
  def auto_link_usernames_or_lists(text, options = {}) # :yields: list_or_username
65
69
  options = options.dup
66
70
  options[:url_class] ||= DEFAULT_URL_CLASS
@@ -68,8 +72,9 @@ module Twitter
68
72
  options[:username_class] ||= DEFAULT_USERNAME_CLASS
69
73
  options[:username_url_base] ||= "http://twitter.com/"
70
74
  options[:list_url_base] ||= "http://twitter.com/"
71
- extra_html = HTML_ATTR_NO_FOLLOW unless options[:suppress_no_follow]
75
+ options[:target] ||= DEFAULT_TARGET
72
76
 
77
+ extra_html = HTML_ATTR_NO_FOLLOW unless options[:suppress_no_follow]
73
78
  new_text = ""
74
79
 
75
80
  # this -1 flag allows strings ending in ">" to work
@@ -87,7 +92,7 @@ module Twitter
87
92
  # the link is a list
88
93
  chunk = list = "#{user}#{slash_listname}"
89
94
  chunk = yield(list) if block_given?
90
- "#{before}#{at}<a class=\"#{options[:url_class]} #{options[:list_class]}\" href=\"#{html_escape(options[:list_url_base])}#{html_escape(list.downcase)}\"#{extra_html}>#{html_escape(chunk)}</a>"
95
+ "#{before}#{at}<a class=\"#{options[:url_class]} #{options[:list_class]}\" #{target_tag(options)}href=\"#{html_escape(options[:list_url_base])}#{html_escape(list.downcase)}\"#{extra_html}>#{html_escape(chunk)}</a>"
91
96
  else
92
97
  if after =~ Twitter::Regex[:end_screen_name_match]
93
98
  # Followed by something that means we don't autolink
@@ -96,7 +101,7 @@ module Twitter
96
101
  # this is a screen name
97
102
  chunk = user
98
103
  chunk = yield(chunk) if block_given?
99
- "#{before}#{at}<a class=\"#{options[:url_class]} #{options[:username_class]}\" href=\"#{html_escape(options[:username_url_base])}#{html_escape(chunk)}\"#{extra_html}>#{html_escape(chunk)}</a>"
104
+ "#{before}#{at}<a class=\"#{options[:url_class]} #{options[:username_class]}\" #{target_tag(options)}href=\"#{html_escape(options[:username_url_base])}#{html_escape(chunk)}\"#{extra_html}>#{html_escape(chunk)}</a>"
100
105
  end
101
106
  end
102
107
  end
@@ -113,11 +118,13 @@ module Twitter
113
118
  # <tt>:hashtag_class</tt>:: class to add to hashtag <tt><a></tt> tags
114
119
  # <tt>:hashtag_url_base</tt>:: the value for <tt>href</tt> attribute. The hashtag text (minus the <tt>#</tt>) will be appended at the end of this.
115
120
  # <tt>:suppress_no_follow</tt>:: Do not add <tt>rel="nofollow"</tt> to auto-linked items
121
+ # <tt>:target</tt>:: add <tt>target="window_name"</tt> to auto-linked items
116
122
  def auto_link_hashtags(text, options = {}) # :yields: hashtag_text
117
123
  options = options.dup
118
124
  options[:url_class] ||= DEFAULT_URL_CLASS
119
125
  options[:hashtag_class] ||= DEFAULT_HASHTAG_CLASS
120
126
  options[:hashtag_url_base] ||= "http://twitter.com/search?q=%23"
127
+ options[:target] ||= DEFAULT_TARGET
121
128
  extra_html = HTML_ATTR_NO_FOLLOW unless options[:suppress_no_follow]
122
129
 
123
130
  text.gsub(Twitter::Regex[:auto_link_hashtags]) do
@@ -125,7 +132,7 @@ module Twitter
125
132
  hash = $2
126
133
  text = $3
127
134
  text = yield(text) if block_given?
128
- "#{before}<a href=\"#{options[:hashtag_url_base]}#{html_escape(text)}\" title=\"##{html_escape(text)}\" class=\"#{options[:url_class]} #{options[:hashtag_class]}\"#{extra_html}>#{html_escape(hash)}#{html_escape(text)}</a>"
135
+ "#{before}<a href=\"#{options[:hashtag_url_base]}#{html_escape(text)}\" title=\"##{html_escape(text)}\" #{target_tag(options)}class=\"#{options[:url_class]} #{options[:hashtag_class]}\"#{extra_html}>#{html_escape(hash)}#{html_escape(text)}</a>"
129
136
  end
130
137
  end
131
138
 
@@ -148,5 +155,16 @@ module Twitter
148
155
  end
149
156
  end
150
157
 
158
+ private
159
+
160
+ def target_tag(options)
161
+ target_option = options[:target]
162
+ if target_option.blank?
163
+ ""
164
+ else
165
+ "target=\"#{html_escape(target_option)}\""
166
+ end
167
+ end
168
+
151
169
  end
152
170
  end
data/lib/regex.rb CHANGED
@@ -70,7 +70,7 @@ module Twitter
70
70
  )/ix
71
71
  # Valid end-of-path chracters (so /foo. does not gobble the period).
72
72
  # 1. Allow =&# for empty URL parameters and other URL-join artifacts
73
- REGEXEN[:valid_url_path_ending_chars] = /[a-z0-9=_#\/]|#{REGEXEN[:wikipedia_disambiguation]}/io
73
+ REGEXEN[:valid_url_path_ending_chars] = /[a-z0-9=_#\/\+\-]|#{REGEXEN[:wikipedia_disambiguation]}/io
74
74
  REGEXEN[:valid_url_query_chars] = /[a-z0-9!\*'\(\);:&=\+\$\/%#\[\]\-_\.,~]/i
75
75
  REGEXEN[:valid_url_query_ending_chars] = /[a-z0-9_&=#\/]/i
76
76
  REGEXEN[:valid_url] = %r{
@@ -517,6 +517,38 @@ describe Twitter::Autolink do
517
517
 
518
518
  end
519
519
 
520
+ describe "autolinking options" do
521
+ it "should apply :url_class as a CSS class" do
522
+ linked = TestAutolink.new.auto_link("http://example.com/", :url_class => 'myclass')
523
+ linked.should have_autolinked_url('http://example.com/')
524
+ linked.should match(/myclass/)
525
+ end
526
+
527
+ it "should add rel=nofollow by default" do
528
+ linked = TestAutolink.new.auto_link("http://example.com/")
529
+ linked.should have_autolinked_url('http://example.com/')
530
+ linked.should match(/nofollow/)
531
+ end
532
+
533
+ it "should not add rel=nofollow when passed :suppress_no_follow" do
534
+ linked = TestAutolink.new.auto_link("http://example.com/", :suppress_no_follow => true)
535
+ linked.should have_autolinked_url('http://example.com/')
536
+ linked.should_not match(/nofollow/)
537
+ end
538
+
539
+ it "should not add a target attribute by default" do
540
+ linked = TestAutolink.new.auto_link("http://example.com/")
541
+ linked.should have_autolinked_url('http://example.com/')
542
+ linked.should_not match(/target=/)
543
+ end
544
+
545
+ it "should respect the :target option" do
546
+ linked = TestAutolink.new.auto_link("http://example.com/", :target => 'mywindow')
547
+ linked.should have_autolinked_url('http://example.com/')
548
+ linked.should match(/target="mywindow"/)
549
+ end
550
+ end
551
+
520
552
  describe "html_escape" do
521
553
  before do
522
554
  @linker = TestAutolink.new
data/twitter-text.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  spec = Gem::Specification.new do |s|
2
2
  s.name = "twitter-text"
3
- s.version = "1.3.0"
3
+ s.version = "1.3.1"
4
4
  s.authors = ["Matt Sanford", "Patrick Ewing", "Ben Cherry", "Britt Selvitelle", "Raffi Krikorian"]
5
5
  s.email = ["matt@twitter.com", "patrick.henry.ewing@gmail.com", "bcherry@gmail.com", "bs@brittspace.com", "raffi@twitter.com"]
6
6
  s.homepage = "http://twitter.com"
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: twitter-text
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 25
5
5
  prerelease: false
6
6
  segments:
7
7
  - 1
8
8
  - 3
9
- - 0
10
- version: 1.3.0
9
+ - 1
10
+ version: 1.3.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - Matt Sanford
@@ -19,13 +19,11 @@ autorequire:
19
19
  bindir: bin
20
20
  cert_chain: []
21
21
 
22
- date: 2010-12-06 00:00:00 -08:00
22
+ date: 2011-01-06 00:00:00 -08:00
23
23
  default_executable:
24
24
  dependencies:
25
25
  - !ruby/object:Gem::Dependency
26
- name: nokogiri
27
- prerelease: false
28
- requirement: &id001 !ruby/object:Gem::Requirement
26
+ version_requirements: &id001 !ruby/object:Gem::Requirement
29
27
  none: false
30
28
  requirements:
31
29
  - - ">="
@@ -34,12 +32,12 @@ dependencies:
34
32
  segments:
35
33
  - 0
36
34
  version: "0"
35
+ requirement: *id001
36
+ name: nokogiri
37
+ prerelease: false
37
38
  type: :development
38
- version_requirements: *id001
39
39
  - !ruby/object:Gem::Dependency
40
- name: rake
41
- prerelease: false
42
- requirement: &id002 !ruby/object:Gem::Requirement
40
+ version_requirements: &id002 !ruby/object:Gem::Requirement
43
41
  none: false
44
42
  requirements:
45
43
  - - ">="
@@ -48,12 +46,12 @@ dependencies:
48
46
  segments:
49
47
  - 0
50
48
  version: "0"
49
+ requirement: *id002
50
+ name: rake
51
+ prerelease: false
51
52
  type: :development
52
- version_requirements: *id002
53
53
  - !ruby/object:Gem::Dependency
54
- name: rspec
55
- prerelease: false
56
- requirement: &id003 !ruby/object:Gem::Requirement
54
+ version_requirements: &id003 !ruby/object:Gem::Requirement
57
55
  none: false
58
56
  requirements:
59
57
  - - ">="
@@ -62,12 +60,12 @@ dependencies:
62
60
  segments:
63
61
  - 0
64
62
  version: "0"
63
+ requirement: *id003
64
+ name: rspec
65
+ prerelease: false
65
66
  type: :development
66
- version_requirements: *id003
67
67
  - !ruby/object:Gem::Dependency
68
- name: simplecov
69
- prerelease: false
70
- requirement: &id004 !ruby/object:Gem::Requirement
68
+ version_requirements: &id004 !ruby/object:Gem::Requirement
71
69
  none: false
72
70
  requirements:
73
71
  - - ">="
@@ -76,12 +74,12 @@ dependencies:
76
74
  segments:
77
75
  - 0
78
76
  version: "0"
77
+ requirement: *id004
78
+ name: simplecov
79
+ prerelease: false
79
80
  type: :development
80
- version_requirements: *id004
81
81
  - !ruby/object:Gem::Dependency
82
- name: actionpack
83
- prerelease: false
84
- requirement: &id005 !ruby/object:Gem::Requirement
82
+ version_requirements: &id005 !ruby/object:Gem::Requirement
85
83
  none: false
86
84
  requirements:
87
85
  - - ">="
@@ -90,8 +88,10 @@ dependencies:
90
88
  segments:
91
89
  - 0
92
90
  version: "0"
91
+ requirement: *id005
92
+ name: actionpack
93
+ prerelease: false
93
94
  type: :runtime
94
- version_requirements: *id005
95
95
  description: A gem that provides text handling for Twitter
96
96
  email:
97
97
  - matt@twitter.com