rinku 2.0.0 → 2.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 07c65aa1e4fe77d917eeeb0d4ab03889f5b72443
4
- data.tar.gz: 2e77157e5b959fbda3660e0676d20686e59bd469
3
+ metadata.gz: 2982203836f1449fe5344a32f7ab1782f3cb4cc7
4
+ data.tar.gz: 8461bfe12528f128cba4e81e9fb8f64e9903e6e5
5
5
  SHA512:
6
- metadata.gz: e4c692320131620c6b1398a0d8784091bd1952660bfb1ab14ec7ee32fd115f7c0a39a6faddd924045f4085ee91a1062b67cd6a0600df768a7ccb092a1083e772
7
- data.tar.gz: bc6774b49bb020deaa479ce8145c881e49e037c1539924e3f4cd2a0e8e0e1fb9871356b848e8090d3f3d79239131b0c4d7d6c8afdad117e0dd35edcbe1b5fa14
6
+ metadata.gz: 3587f9e83406d7829cdbec671980536803f3b9e0ed87e6daf8e21389dad8d2cc521d49527b602e3ccaa7e40f3c41ef365ba4bbb42a0b69d6ed7c412bbdd914f3
7
+ data.tar.gz: 68aa755836af8269edc44bcd4ae8134abe6a3bd7836140218f4bd618069f22ad16ff78c6814610f2525ca5f64cfac8657e2021c0ee238e1ba5d319e6efeb728c
data/COPYING CHANGED
@@ -1,3 +1,5 @@
1
+ ISC License
2
+
1
3
  Copyright (c) 2011, Vicent Marti
2
4
 
3
5
  Permission to use, copy, modify, and distribute this software for any
@@ -1,6 +1,9 @@
1
1
  Rinku does linking
2
2
  ==================
3
3
 
4
+ [![Build Status](https://travis-ci.org/vmg/rinku.svg?branch=master)](https://travis-ci.org/vmg/rinku)
5
+ [![Dependency Status](https://www.versioneye.com/ruby/rinku/badge.svg)](https://www.versioneye.com/ruby/rinku)
6
+
4
7
  Rinku is a Ruby library that does autolinking.
5
8
  It parses text and turns anything that remotely resembles a link into an HTML link,
6
9
  just like the Ruby on Rails `auto_link` method -- but it's about 20 times faster,
@@ -91,6 +94,12 @@ choose to use Rinku instead.
91
94
 
92
95
  ~~~~ruby
93
96
  require 'rails_rinku'
97
+ include ActionView::Helpers::TextHelper
98
+ post_body = "Welcome to my new blog at http://www.myblog.com/."
99
+ auto_link(post_body, :html => { :target => '_blank' }) do |text|
100
+ truncate(text, :length => 15)
101
+ end
102
+ # => "Welcome to my new blog at <a href=\"http://www.myblog.com/\" target=\"_blank\">http://www.m...</a>."
94
103
  ~~~~
95
104
 
96
105
  The `rails_rinku` package monkeypatches Rails with an `auto_link` method that
data/Rakefile CHANGED
@@ -1,50 +1,12 @@
1
- require 'date'
2
- require 'rake/clean'
1
+ require 'bundler/setup'
2
+ require 'bundler/gem_tasks'
3
3
  require 'rake/extensiontask'
4
- require 'digest/md5'
5
-
6
- task :default => :test
7
-
8
- # ==========================================================
9
- # Ruby Extension
10
- # ==========================================================
11
-
12
- Rake::ExtensionTask.new('rinku')
13
-
14
- # ==========================================================
15
- # Testing
16
- # ==========================================================
17
-
18
4
  require 'rake/testtask'
19
- Rake::TestTask.new('test') do |t|
20
- t.test_files = FileList['test/*_test.rb']
21
- t.ruby_opts += ['-rubygems'] if defined? Gem
22
- end
23
- task 'test' => [:compile]
24
5
 
25
- # PACKAGING =================================================================
6
+ task default: :test
26
7
 
27
- require 'rubygems'
28
- $spec = eval(File.read('rinku.gemspec'))
8
+ Rake::ExtensionTask.new('rinku') # defines compile task
29
9
 
30
- def package(ext='')
31
- "pkg/rinku-#{$spec.version}" + ext
32
- end
33
-
34
- desc 'Build packages'
35
- task :package => package('.gem')
36
-
37
- desc 'Build and install as local gem'
38
- task :install => package('.gem') do
39
- sh "gem install #{package('.gem')}"
40
- end
41
-
42
- desc 'Update the gemspec'
43
- task :update_gem => file('rinku.gemspec')
44
-
45
- directory 'pkg/'
46
-
47
- file package('.gem') => %w[pkg/ rinku.gemspec] + $spec.files do |f|
48
- sh "gem build rinku.gemspec"
49
- mv File.basename(f.name), f.name
10
+ Rake::TestTask.new(test: :compile) do |t|
11
+ t.test_files = FileList['test/*_test.rb']
50
12
  end
@@ -99,14 +99,10 @@ autolink_delim(const uint8_t *data, struct autolink_pos *link)
99
99
  }
100
100
 
101
101
  if (copen != 0) {
102
- size_t closing = 0;
103
- size_t opening = 0;
104
- size_t i = link->start;
105
-
106
- /* Try to close the final punctuation sign in this same line;
107
- * if we managed to close it outside of the URL, that means that it's
108
- * not part of the URL. If it closes inside the URL, that means it
109
- * is part of the URL.
102
+ /* Try to close the final punctuation sign in this link; if
103
+ * there's more closing than opening punctuation symbols in the
104
+ * URL, we conservatively remove one closing punctuation from
105
+ * the end of the URL.
110
106
  *
111
107
  * Examples:
112
108
  *
@@ -117,12 +113,16 @@ autolink_delim(const uint8_t *data, struct autolink_pos *link)
117
113
  * => http://www.pokemon.com/Pikachu_(Electric)
118
114
  *
119
115
  * foo http://www.pokemon.com/Pikachu_(Electric)) bar
120
- * => http://www.pokemon.com/Pikachu_(Electric))
116
+ * => http://www.pokemon.com/Pikachu_(Electric)
121
117
  *
122
118
  * (foo http://www.pokemon.com/Pikachu_(Electric)) bar
123
- * => foo http://www.pokemon.com/Pikachu_(Electric)
119
+ * => http://www.pokemon.com/Pikachu_(Electric)
124
120
  */
125
121
 
122
+ size_t closing = 0;
123
+ size_t opening = 0;
124
+ size_t i = link->start;
125
+
126
126
  while (i < link->end) {
127
127
  if (data[i] == copen)
128
128
  opening++;
@@ -132,13 +132,32 @@ autolink_delim(const uint8_t *data, struct autolink_pos *link)
132
132
  i++;
133
133
  }
134
134
 
135
- if (closing != opening)
135
+ if (closing > opening)
136
136
  link->end--;
137
137
  }
138
138
 
139
139
  return true;
140
140
  }
141
141
 
142
+ static bool
143
+ autolink_delim_iter(const uint8_t *data, struct autolink_pos *link)
144
+ {
145
+ size_t prev_link_end;
146
+ int iterations = 0;
147
+
148
+ while(link->end != 0) {
149
+ prev_link_end = link->end;
150
+ if (!autolink_delim(data, link))
151
+ return false;
152
+ if (prev_link_end == link->end || iterations > 5) {
153
+ break;
154
+ }
155
+ iterations++;
156
+ }
157
+
158
+ return true;
159
+ }
160
+
142
161
  static bool
143
162
  check_domain(const uint8_t *data, size_t size,
144
163
  struct autolink_pos *link, bool allow_short)
@@ -198,7 +217,7 @@ autolink__www(
198
217
  return false;
199
218
 
200
219
  link->end = utf8proc_find_space(data, link->end, size);
201
- return autolink_delim(data, link);
220
+ return autolink_delim_iter(data, link);
202
221
  }
203
222
 
204
223
  bool
@@ -244,7 +263,7 @@ autolink__email(
244
263
  break;
245
264
  }
246
265
 
247
- if ((link->end - pos) < 2 || nb != 1 || np == 0)
266
+ if ((link->end - pos) < 2 || nb != 1 || np == 0 || (np == 1 && data[link->end - 1] == '.'))
248
267
  return false;
249
268
 
250
269
  return autolink_delim(data, link);
@@ -278,5 +297,5 @@ autolink__url(
278
297
  if (!autolink_issafe(data + link->start, size - link->start))
279
298
  return false;
280
299
 
281
- return autolink_delim(data, link);
300
+ return autolink_delim_iter(data, link);
282
301
  }
@@ -1,5 +1,5 @@
1
1
  module Rinku
2
- VERSION = "1.7.3"
2
+ VERSION = "2.0.2"
3
3
 
4
4
  class << self
5
5
  attr_accessor :skip_tags
@@ -1,8 +1,6 @@
1
- # encoding: UTF-8
2
-
3
1
  Gem::Specification.new do |s|
4
2
  s.name = 'rinku'
5
- s.version = '2.0.0'
3
+ s.version = '2.0.2'
6
4
  s.summary = "Mostly autolinking"
7
5
  s.description = <<-EOF
8
6
  A fast and very smart autolinking library that
@@ -11,6 +9,7 @@ Gem::Specification.new do |s|
11
9
  s.email = 'vicent@github.com'
12
10
  s.homepage = 'https://github.com/vmg/rinku'
13
11
  s.authors = ["Vicent Marti"]
12
+ s.license = 'ISC'
14
13
  # = MANIFEST =
15
14
  s.files = %w[
16
15
  COPYING
@@ -39,5 +38,7 @@ Gem::Specification.new do |s|
39
38
 
40
39
  s.add_development_dependency "rake"
41
40
  s.add_development_dependency "rake-compiler"
42
- s.add_development_dependency "minitest"
41
+ s.add_development_dependency "minitest", ">= 5.0"
42
+
43
+ s.required_ruby_version = '>= 2.0.0'
43
44
  end
@@ -1,6 +1,5 @@
1
- # encoding: utf-8
2
- rootdir = File.dirname(File.dirname(__FILE__))
3
- $LOAD_PATH.unshift "#{rootdir}/lib"
1
+ require 'bundler/setup'
2
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
4
3
 
5
4
  require 'minitest/autorun'
6
5
  require 'cgi'
@@ -10,7 +9,7 @@ require 'rinku'
10
9
  class RinkuAutoLinkTest < Minitest::Test
11
10
  def generate_result(link_text, href = nil)
12
11
  href ||= link_text
13
- href = "http://" + href unless href =~ %r{\A\w+://}
12
+ href = "http://" + href unless href =~ %r{\A(\w+://|mailto:)}
14
13
  %{<a href="#{CGI.escapeHTML href}">#{CGI.escapeHTML link_text}</a>}
15
14
  end
16
15
 
@@ -363,6 +362,13 @@ This is just a test. <a href="http://www.pokemon.com">http://www.pokemon.com</a>
363
362
  assert_linked "email#{NBSP}<a href=\"mailto:#{email_raw}\">#{email_raw}</a>", "email#{NBSP}#{email_raw}"
364
363
  end
365
364
 
365
+ def test_identifies_unicode_spaces
366
+ assert_linked(
367
+ %{This is just a test. <a href="http://www.pokemon.com">http://www.pokemon.com</a>\u202F\u2028\u2001},
368
+ "This is just a test. http://www.pokemon.com\u202F\u2028\u2001"
369
+ )
370
+ end
371
+
366
372
  def test_www_is_case_insensitive
367
373
  url = "www.reddit.com"
368
374
  assert_linked generate_result(url), url
@@ -376,4 +382,34 @@ This is just a test. <a href="http://www.pokemon.com">http://www.pokemon.com</a>
376
382
  url = "WwW.reddit.CoM"
377
383
  assert_linked generate_result(url), url
378
384
  end
385
+
386
+ def test_non_emails_ending_in_periods
387
+ assert_linked "abc/def@ghi.", "abc/def@ghi."
388
+ assert_linked "abc/def@ghi. ", "abc/def@ghi. "
389
+ assert_linked "abc/def@ghi. x", "abc/def@ghi. x"
390
+ assert_linked "abc/def@ghi.< x", "abc/def@ghi.< x"
391
+ assert_linked "abc/<a href=\"mailto:def@ghi.x\">def@ghi.x</a>", "abc/def@ghi.x"
392
+ assert_linked "abc/<a href=\"mailto:def@ghi.x\">def@ghi.x</a>. a", "abc/def@ghi.x. a"
393
+ end
394
+
395
+ def test_urls_with_entities_and_parens
396
+ assert_linked "&lt;<a href=\"http://www.google.com\">http://www.google.com</a>&gt;", "&lt;http://www.google.com&gt;"
397
+
398
+ assert_linked "&lt;<a href=\"http://www.google.com\">http://www.google.com</a>&gt;)", "&lt;http://www.google.com&gt;)"
399
+
400
+ # this produces invalid output, but limits how much work we will do
401
+ assert_linked "&lt;<a href=\"http://www.google.com&gt;\">http://www.google.com&gt;</a>)&lt;)&lt;)&lt;)&lt;)&lt;)&lt;)", "&lt;http://www.google.com&gt;)&lt;)&lt;)&lt;)&lt;)&lt;)&lt;)"
402
+
403
+ url = "http://pokemon.com/bulbasaur"
404
+ assert_linked "URL is #{generate_result(url)}.", "URL is #{url}."
405
+ assert_linked "(URL is #{generate_result(url)}.)", "(URL is #{url}.)"
406
+
407
+ url = "www.pokemon.com/bulbasaur"
408
+ assert_linked "URL is #{generate_result(url)}.", "URL is #{url}."
409
+ assert_linked "(URL is #{generate_result(url)}.)", "(URL is #{url}.)"
410
+
411
+ url = "abc@xyz.com"
412
+ assert_linked "URL is #{generate_result(url, "mailto:#{url}")}.", "URL is #{url}."
413
+ assert_linked "(URL is #{generate_result(url, "mailto:#{url}")}.)", "(URL is #{url}.)"
414
+ end
379
415
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rinku
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vicent Marti
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-05-19 00:00:00.000000000 Z
11
+ date: 2016-10-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '0'
47
+ version: '5.0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '0'
54
+ version: '5.0'
55
55
  description: |2
56
56
  A fast and very smart autolinking library that
57
57
  acts as a drop-in replacement for Rails `auto_link`
@@ -80,7 +80,8 @@ files:
80
80
  - rinku.gemspec
81
81
  - test/autolink_test.rb
82
82
  homepage: https://github.com/vmg/rinku
83
- licenses: []
83
+ licenses:
84
+ - ISC
84
85
  metadata: {}
85
86
  post_install_message:
86
87
  rdoc_options: []
@@ -90,7 +91,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
90
91
  requirements:
91
92
  - - ">="
92
93
  - !ruby/object:Gem::Version
93
- version: '0'
94
+ version: 2.0.0
94
95
  required_rubygems_version: !ruby/object:Gem::Requirement
95
96
  requirements:
96
97
  - - ">="
@@ -98,7 +99,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
98
99
  version: '0'
99
100
  requirements: []
100
101
  rubyforge_project:
101
- rubygems_version: 2.2.5
102
+ rubygems_version: 2.5.1
102
103
  signing_key:
103
104
  specification_version: 4
104
105
  summary: Mostly autolinking