rinku 1.7.3 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Rakefile +0 -19
- data/ext/rinku/autolink.c +114 -127
- data/ext/rinku/autolink.h +22 -16
- data/ext/rinku/rinku.c +34 -252
- data/ext/rinku/rinku.h +23 -5
- data/ext/rinku/rinku_rb.c +239 -0
- data/ext/rinku/utf8.c +187 -0
- data/ext/rinku/utf8.h +34 -0
- data/lib/rinku.rb +6 -2
- data/rinku.gemspec +12 -5
- data/test/autolink_test.rb +96 -18
- metadata +60 -16
data/ext/rinku/utf8.c
ADDED
@@ -0,0 +1,187 @@
|
|
1
|
+
#include <stdlib.h>
|
2
|
+
#include <stdint.h>
|
3
|
+
#include <assert.h>
|
4
|
+
#include <stdbool.h>
|
5
|
+
|
6
|
+
#include "utf8.h"
|
7
|
+
|
8
|
+
/** 1 = space, 2 = punct, 3 = digit, 4 = alpha, 0 = other
|
9
|
+
*/
|
10
|
+
static const uint8_t ctype_class[256] = {
|
11
|
+
/* 0 1 2 3 4 5 6 7 8 9 a b c d e f */
|
12
|
+
/* 0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0,
|
13
|
+
/* 1 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
14
|
+
/* 2 */ 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
15
|
+
/* 3 */ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2,
|
16
|
+
/* 4 */ 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
|
17
|
+
/* 5 */ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2,
|
18
|
+
/* 6 */ 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
|
19
|
+
/* 7 */ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 0,
|
20
|
+
/* 8 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
21
|
+
/* 9 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
22
|
+
/* a */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
23
|
+
/* b */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
24
|
+
/* c */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
25
|
+
/* d */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
26
|
+
/* e */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
27
|
+
/* f */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
28
|
+
|
29
|
+
bool rinku_isspace(char c) { return ctype_class[(uint8_t)c] == 1; }
|
30
|
+
bool rinku_ispunct(char c) { return ctype_class[(uint8_t)c] == 2; }
|
31
|
+
bool rinku_isdigit(char c) { return ctype_class[(uint8_t)c] == 3; }
|
32
|
+
bool rinku_isalpha(char c) { return ctype_class[(uint8_t)c] == 4; }
|
33
|
+
bool rinku_isalnum(char c)
|
34
|
+
{
|
35
|
+
uint8_t cls = ctype_class[(uint8_t)c];
|
36
|
+
return (cls == 3 || cls == 4);
|
37
|
+
}
|
38
|
+
|
39
|
+
static const int8_t utf8proc_utf8class[256] = {
|
40
|
+
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
41
|
+
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
42
|
+
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
43
|
+
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
44
|
+
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
45
|
+
1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
46
|
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
47
|
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
48
|
+
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
49
|
+
2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
|
50
|
+
4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0};
|
51
|
+
|
52
|
+
static int32_t read_cp(const uint8_t *str, int8_t length)
|
53
|
+
{
|
54
|
+
switch (length) {
|
55
|
+
case 1:
|
56
|
+
return str[0];
|
57
|
+
case 2:
|
58
|
+
return ((str[0] & 0x1F) << 6) + (str[1] & 0x3F);
|
59
|
+
case 3:
|
60
|
+
return ((str[0] & 0x0F) << 12) + ((str[1] & 0x3F) << 6) +
|
61
|
+
(str[2] & 0x3F);
|
62
|
+
case 4:
|
63
|
+
return ((str[0] & 0x07) << 18) + ((str[1] & 0x3F) << 12) +
|
64
|
+
((str[2] & 0x3F) << 6) + (str[3] & 0x3F);
|
65
|
+
default:
|
66
|
+
return 0xFFFD; // replacement character
|
67
|
+
}
|
68
|
+
}
|
69
|
+
|
70
|
+
int32_t utf8proc_next(const uint8_t *str, size_t *pos)
|
71
|
+
{
|
72
|
+
const size_t p = *pos;
|
73
|
+
const int8_t length = utf8proc_utf8class[str[p]];
|
74
|
+
(*pos) += length;
|
75
|
+
return read_cp(str + p, length);
|
76
|
+
}
|
77
|
+
|
78
|
+
size_t utf8proc_find_space(const uint8_t *str, size_t pos, size_t size)
|
79
|
+
{
|
80
|
+
while (pos < size) {
|
81
|
+
const size_t last = pos;
|
82
|
+
int32_t uc = utf8proc_next(str, &pos);
|
83
|
+
if (utf8proc_is_space(uc))
|
84
|
+
return last;
|
85
|
+
}
|
86
|
+
return size;
|
87
|
+
}
|
88
|
+
|
89
|
+
int32_t utf8proc_rewind(const uint8_t *data, size_t pos)
|
90
|
+
{
|
91
|
+
int8_t length = 0;
|
92
|
+
|
93
|
+
if (!pos)
|
94
|
+
return 0x0;
|
95
|
+
|
96
|
+
if ((data[pos - 1] & 0xC0) == 0x0)
|
97
|
+
return data[pos - 1];
|
98
|
+
|
99
|
+
if (pos > 1 && utf8proc_utf8class[data[pos - 2]] == 2)
|
100
|
+
length = 2;
|
101
|
+
else if (pos > 2 && utf8proc_utf8class[data[pos - 3]] == 3)
|
102
|
+
length = 3;
|
103
|
+
else if (pos > 3 && utf8proc_utf8class[data[pos - 4]] == 4)
|
104
|
+
length = 4;
|
105
|
+
|
106
|
+
return read_cp(&data[pos - length], length);
|
107
|
+
}
|
108
|
+
|
109
|
+
bool utf8proc_is_space(int32_t uc)
|
110
|
+
{
|
111
|
+
return (uc == 9 || uc == 10 || uc == 12 || uc == 13 ||
|
112
|
+
uc == 32 || uc == 160 || uc == 5760 ||
|
113
|
+
(uc >= 8192 && uc <= 8202) || uc == 8239 ||
|
114
|
+
uc == 8287 || uc == 12288);
|
115
|
+
}
|
116
|
+
|
117
|
+
bool utf8proc_is_punctuation(int32_t uc)
|
118
|
+
{
|
119
|
+
if (uc < 128)
|
120
|
+
return rinku_ispunct(uc);
|
121
|
+
|
122
|
+
return
|
123
|
+
(uc == 161 || uc == 167 || uc == 171 || uc == 182 ||
|
124
|
+
uc == 183 || uc == 187 || uc == 191 || uc == 894 ||
|
125
|
+
uc == 903 || (uc >= 1370 && uc <= 1375) || uc == 1417 ||
|
126
|
+
uc == 1418 || uc == 1470 || uc == 1472 || uc == 1475 ||
|
127
|
+
uc == 1478 || uc == 1523 || uc == 1524 || uc == 1545 ||
|
128
|
+
uc == 1546 || uc == 1548 || uc == 1549 || uc == 1563 ||
|
129
|
+
uc == 1566 || uc == 1567 || (uc >= 1642 && uc <= 1645) ||
|
130
|
+
uc == 1748 || (uc >= 1792 && uc <= 1805) ||
|
131
|
+
(uc >= 2039 && uc <= 2041) || (uc >= 2096 && uc <= 2110) ||
|
132
|
+
uc == 2142 || uc == 2404 || uc == 2405 || uc == 2416 ||
|
133
|
+
uc == 2800 || uc == 3572 || uc == 3663 || uc == 3674 ||
|
134
|
+
uc == 3675 || (uc >= 3844 && uc <= 3858) || uc == 3860 ||
|
135
|
+
(uc >= 3898 && uc <= 3901) || uc == 3973 ||
|
136
|
+
(uc >= 4048 && uc <= 4052) || uc == 4057 || uc == 4058 ||
|
137
|
+
(uc >= 4170 && uc <= 4175) || uc == 4347 ||
|
138
|
+
(uc >= 4960 && uc <= 4968) || uc == 5120 || uc == 5741 ||
|
139
|
+
uc == 5742 || uc == 5787 || uc == 5788 ||
|
140
|
+
(uc >= 5867 && uc <= 5869) || uc == 5941 || uc == 5942 ||
|
141
|
+
(uc >= 6100 && uc <= 6102) || (uc >= 6104 && uc <= 6106) ||
|
142
|
+
(uc >= 6144 && uc <= 6154) || uc == 6468 || uc == 6469 ||
|
143
|
+
uc == 6686 || uc == 6687 || (uc >= 6816 && uc <= 6822) ||
|
144
|
+
(uc >= 6824 && uc <= 6829) || (uc >= 7002 && uc <= 7008) ||
|
145
|
+
(uc >= 7164 && uc <= 7167) || (uc >= 7227 && uc <= 7231) ||
|
146
|
+
uc == 7294 || uc == 7295 || (uc >= 7360 && uc <= 7367) ||
|
147
|
+
uc == 7379 || (uc >= 8208 && uc <= 8231) ||
|
148
|
+
(uc >= 8240 && uc <= 8259) || (uc >= 8261 && uc <= 8273) ||
|
149
|
+
(uc >= 8275 && uc <= 8286) || uc == 8317 || uc == 8318 ||
|
150
|
+
uc == 8333 || uc == 8334 || (uc >= 8968 && uc <= 8971) ||
|
151
|
+
uc == 9001 || uc == 9002 || (uc >= 10088 && uc <= 10101) ||
|
152
|
+
uc == 10181 || uc == 10182 || (uc >= 10214 && uc <= 10223) ||
|
153
|
+
(uc >= 10627 && uc <= 10648) || (uc >= 10712 && uc <= 10715) ||
|
154
|
+
uc == 10748 || uc == 10749 || (uc >= 11513 && uc <= 11516) ||
|
155
|
+
uc == 11518 || uc == 11519 || uc == 11632 ||
|
156
|
+
(uc >= 11776 && uc <= 11822) || (uc >= 11824 && uc <= 11842) ||
|
157
|
+
(uc >= 12289 && uc <= 12291) || (uc >= 12296 && uc <= 12305) ||
|
158
|
+
(uc >= 12308 && uc <= 12319) || uc == 12336 || uc == 12349 ||
|
159
|
+
uc == 12448 || uc == 12539 || uc == 42238 || uc == 42239 ||
|
160
|
+
(uc >= 42509 && uc <= 42511) || uc == 42611 || uc == 42622 ||
|
161
|
+
(uc >= 42738 && uc <= 42743) || (uc >= 43124 && uc <= 43127) ||
|
162
|
+
uc == 43214 || uc == 43215 || (uc >= 43256 && uc <= 43258) ||
|
163
|
+
uc == 43310 || uc == 43311 || uc == 43359 ||
|
164
|
+
(uc >= 43457 && uc <= 43469) || uc == 43486 || uc == 43487 ||
|
165
|
+
(uc >= 43612 && uc <= 43615) || uc == 43742 || uc == 43743 ||
|
166
|
+
uc == 43760 || uc == 43761 || uc == 44011 || uc == 64830 ||
|
167
|
+
uc == 64831 || (uc >= 65040 && uc <= 65049) ||
|
168
|
+
(uc >= 65072 && uc <= 65106) || (uc >= 65108 && uc <= 65121) ||
|
169
|
+
uc == 65123 || uc == 65128 || uc == 65130 || uc == 65131 ||
|
170
|
+
(uc >= 65281 && uc <= 65283) || (uc >= 65285 && uc <= 65290) ||
|
171
|
+
(uc >= 65292 && uc <= 65295) || uc == 65306 || uc == 65307 ||
|
172
|
+
uc == 65311 || uc == 65312 || (uc >= 65339 && uc <= 65341) ||
|
173
|
+
uc == 65343 || uc == 65371 || uc == 65373 ||
|
174
|
+
(uc >= 65375 && uc <= 65381) || (uc >= 65792 && uc <= 65794) ||
|
175
|
+
uc == 66463 || uc == 66512 || uc == 66927 || uc == 67671 ||
|
176
|
+
uc == 67871 || uc == 67903 || (uc >= 68176 && uc <= 68184) ||
|
177
|
+
uc == 68223 || (uc >= 68336 && uc <= 68342) ||
|
178
|
+
(uc >= 68409 && uc <= 68415) || (uc >= 68505 && uc <= 68508) ||
|
179
|
+
(uc >= 69703 && uc <= 69709) || uc == 69819 || uc == 69820 ||
|
180
|
+
(uc >= 69822 && uc <= 69825) || (uc >= 69952 && uc <= 69955) ||
|
181
|
+
uc == 70004 || uc == 70005 || (uc >= 70085 && uc <= 70088) ||
|
182
|
+
uc == 70093 || (uc >= 70200 && uc <= 70205) || uc == 70854 ||
|
183
|
+
(uc >= 71105 && uc <= 71113) || (uc >= 71233 && uc <= 71235) ||
|
184
|
+
(uc >= 74864 && uc <= 74868) || uc == 92782 || uc == 92783 ||
|
185
|
+
uc == 92917 || (uc >= 92983 && uc <= 92987) || uc == 92996 ||
|
186
|
+
uc == 113823);
|
187
|
+
}
|
data/ext/rinku/utf8.h
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright (c) 2016, GitHub, Inc
|
3
|
+
*
|
4
|
+
* Permission to use, copy, modify, and distribute this software for any
|
5
|
+
* purpose with or without fee is hereby granted, provided that the above
|
6
|
+
* copyright notice and this permission notice appear in all copies.
|
7
|
+
*
|
8
|
+
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
9
|
+
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
10
|
+
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
11
|
+
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
12
|
+
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
13
|
+
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
14
|
+
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
15
|
+
*/
|
16
|
+
#ifndef RINKU_UTF8_H
|
17
|
+
#define RINKU_UTF8_H
|
18
|
+
|
19
|
+
#include <stdint.h>
|
20
|
+
#include <stdbool.h>
|
21
|
+
|
22
|
+
bool rinku_isspace(char c);
|
23
|
+
bool rinku_ispunct(char c);
|
24
|
+
bool rinku_isdigit(char c);
|
25
|
+
bool rinku_isalpha(char c);
|
26
|
+
bool rinku_isalnum(char c);
|
27
|
+
|
28
|
+
int32_t utf8proc_rewind(const uint8_t *data, size_t pos);
|
29
|
+
size_t utf8proc_find_space(const uint8_t *str, size_t pos, size_t size);
|
30
|
+
|
31
|
+
bool utf8proc_is_space(int32_t uc);
|
32
|
+
bool utf8proc_is_punctuation(int32_t uc);
|
33
|
+
|
34
|
+
#endif
|
data/lib/rinku.rb
CHANGED
data/rinku.gemspec
CHANGED
@@ -2,29 +2,32 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = 'rinku'
|
5
|
-
s.version = '
|
5
|
+
s.version = '2.0.0'
|
6
6
|
s.summary = "Mostly autolinking"
|
7
7
|
s.description = <<-EOF
|
8
8
|
A fast and very smart autolinking library that
|
9
9
|
acts as a drop-in replacement for Rails `auto_link`
|
10
10
|
EOF
|
11
11
|
s.email = 'vicent@github.com'
|
12
|
-
s.homepage = '
|
12
|
+
s.homepage = 'https://github.com/vmg/rinku'
|
13
13
|
s.authors = ["Vicent Marti"]
|
14
14
|
# = MANIFEST =
|
15
15
|
s.files = %w[
|
16
16
|
COPYING
|
17
17
|
README.markdown
|
18
18
|
Rakefile
|
19
|
-
ext/rinku/rinku.c
|
20
|
-
ext/rinku/rinku.h
|
21
19
|
ext/rinku/autolink.c
|
22
20
|
ext/rinku/autolink.h
|
23
21
|
ext/rinku/buffer.c
|
24
22
|
ext/rinku/buffer.h
|
25
23
|
ext/rinku/extconf.rb
|
26
|
-
|
24
|
+
ext/rinku/rinku.c
|
25
|
+
ext/rinku/rinku.h
|
26
|
+
ext/rinku/rinku_rb.c
|
27
|
+
ext/rinku/utf8.c
|
28
|
+
ext/rinku/utf8.h
|
27
29
|
lib/rails_rinku.rb
|
30
|
+
lib/rinku.rb
|
28
31
|
rinku.gemspec
|
29
32
|
test/autolink_test.rb
|
30
33
|
]
|
@@ -33,4 +36,8 @@ Gem::Specification.new do |s|
|
|
33
36
|
s.extra_rdoc_files = ["COPYING"]
|
34
37
|
s.extensions = ["ext/rinku/extconf.rb"]
|
35
38
|
s.require_paths = ["lib"]
|
39
|
+
|
40
|
+
s.add_development_dependency "rake"
|
41
|
+
s.add_development_dependency "rake-compiler"
|
42
|
+
s.add_development_dependency "minitest"
|
36
43
|
end
|
data/test/autolink_test.rb
CHANGED
@@ -2,21 +2,24 @@
|
|
2
2
|
rootdir = File.dirname(File.dirname(__FILE__))
|
3
3
|
$LOAD_PATH.unshift "#{rootdir}/lib"
|
4
4
|
|
5
|
-
require '
|
5
|
+
require 'minitest/autorun'
|
6
6
|
require 'cgi'
|
7
7
|
require 'uri'
|
8
8
|
require 'rinku'
|
9
9
|
|
10
|
-
class
|
11
|
-
|
12
|
-
|
10
|
+
class RinkuAutoLinkTest < Minitest::Test
|
11
|
+
def generate_result(link_text, href = nil)
|
12
|
+
href ||= link_text
|
13
|
+
href = "http://" + href unless href =~ %r{\A\w+://}
|
14
|
+
%{<a href="#{CGI.escapeHTML href}">#{CGI.escapeHTML link_text}</a>}
|
15
|
+
end
|
13
16
|
|
14
17
|
def assert_linked(expected, url)
|
15
18
|
assert_equal expected, Rinku.auto_link(url)
|
16
19
|
end
|
17
20
|
|
18
21
|
def test_segfault
|
19
|
-
Rinku.auto_link("a+b@d.com+e@f.com",
|
22
|
+
Rinku.auto_link("a+b@d.com+e@f.com", :all)
|
20
23
|
end
|
21
24
|
|
22
25
|
def test_escapes_quotes
|
@@ -34,7 +37,7 @@ class RedcarpetAutolinkTest < Test::Unit::TestCase
|
|
34
37
|
assert_equal Rinku.auto_link(url), url
|
35
38
|
|
36
39
|
Rinku.skip_tags = nil
|
37
|
-
|
40
|
+
refute_equal Rinku.auto_link(url), url
|
38
41
|
end
|
39
42
|
|
40
43
|
def test_auto_link_with_single_trailing_punctuation_and_space
|
@@ -46,6 +49,11 @@ class RedcarpetAutolinkTest < Test::Unit::TestCase
|
|
46
49
|
end
|
47
50
|
end
|
48
51
|
|
52
|
+
def test_terminates_on_ampersand
|
53
|
+
url = "http://example.com"
|
54
|
+
assert_linked "hello '<a href=\"#{url}\">#{url}</a>' hello", "hello '#{url}' hello"
|
55
|
+
end
|
56
|
+
|
49
57
|
def test_does_not_segfault
|
50
58
|
assert_linked "< this is just a test", "< this is just a test"
|
51
59
|
end
|
@@ -227,7 +235,6 @@ This is just a test. <a href="http://www.pokemon.com">http://www.pokemon.com</a>
|
|
227
235
|
email2_result = %{<a href="mailto:#{email2_raw}">#{email2_raw}</a>}
|
228
236
|
link_raw = 'http://www.rubyonrails.com'
|
229
237
|
link_result = %{<a href="#{link_raw}">#{link_raw}</a>}
|
230
|
-
link_result_with_options = %{<a href="#{link_raw}" target="_blank">#{link_raw}</a>}
|
231
238
|
link2_raw = 'www.rubyonrails.com'
|
232
239
|
link2_result = %{<a href="http://#{link2_raw}">#{link2_raw}</a>}
|
233
240
|
link3_raw = 'http://manuals.ruby-on-rails.com/read/chapter.need_a-period/103#page281'
|
@@ -279,23 +286,94 @@ This is just a test. <a href="http://www.pokemon.com">http://www.pokemon.com</a>
|
|
279
286
|
assert_linked '<a href="http://www.rubyonrails.com">Ruby On Rails</a>', '<a href="http://www.rubyonrails.com">Ruby On Rails</a>'
|
280
287
|
end
|
281
288
|
|
282
|
-
|
283
|
-
|
284
|
-
|
289
|
+
def test_copies_source_encoding
|
290
|
+
str = "http://www.bash.org"
|
291
|
+
|
292
|
+
ret = Rinku.auto_link str
|
293
|
+
assert_equal str.encoding, ret.encoding
|
294
|
+
|
295
|
+
str.encode! 'binary'
|
296
|
+
|
297
|
+
ret = Rinku.auto_link str
|
298
|
+
assert_equal str.encoding, ret.encoding
|
299
|
+
end
|
300
|
+
|
301
|
+
def test_valid_encodings_are_generated
|
302
|
+
str = "<a href='http://gi.co'>gi.co</a>\xC2\xA0r"
|
303
|
+
assert_equal Encoding::UTF_8, str.encoding
|
304
|
+
|
305
|
+
res = Rinku.auto_link(str)
|
306
|
+
assert_equal Encoding::UTF_8, res.encoding
|
307
|
+
assert res.valid_encoding?
|
308
|
+
end
|
309
|
+
|
310
|
+
def test_polish_wikipedia_haha
|
311
|
+
url = "https://pl.wikipedia.org/wiki/Komisja_śledcza_do_zbadania_sprawy_zarzutu_nielegalnego_wywierania_wpływu_na_funkcjonariuszy_policji,_służb_specjalnych,_prokuratorów_i_osoby_pełniące_funkcje_w_organach_wymiaru_sprawiedliwości"
|
312
|
+
input = "A wikipedia link (#{url})"
|
313
|
+
expected = "A wikipedia link (<a href=\"#{url}\">#{url}</a>)"
|
285
314
|
|
286
|
-
|
287
|
-
|
315
|
+
assert_linked expected, input
|
316
|
+
end
|
288
317
|
|
289
|
-
|
318
|
+
def test_only_valid_encodings_are_accepted
|
319
|
+
str = "this is invalid \xA0 utf8"
|
320
|
+
assert_equal Encoding::UTF_8, str.encoding
|
321
|
+
assert !str.valid_encoding?
|
290
322
|
|
291
|
-
|
292
|
-
|
323
|
+
assert_raises ArgumentError do
|
324
|
+
Rinku.auto_link(str)
|
293
325
|
end
|
294
326
|
end
|
295
327
|
|
296
|
-
|
297
|
-
|
298
|
-
|
328
|
+
NBSP = "\xC2\xA0".freeze
|
329
|
+
|
330
|
+
def test_the_famous_nbsp
|
331
|
+
input = "at http://google.com/#{NBSP};"
|
332
|
+
expected = "at <a href=\"http://google.com/\">http://google.com/</a>#{NBSP};"
|
333
|
+
assert_linked expected, input
|
334
|
+
end
|
335
|
+
|
336
|
+
def test_does_not_include_trailing_nonbreaking_spaces
|
337
|
+
url = "http://example.com/"
|
338
|
+
assert_linked "<a href=\"#{url}\">#{url}</a>#{NBSP}and", "#{url}#{NBSP}and"
|
339
|
+
end
|
340
|
+
|
341
|
+
def test_identifies_preceeding_nonbreaking_spaces
|
342
|
+
url = "http://example.com/"
|
343
|
+
assert_linked "#{NBSP}<a href=\"#{url}\">#{url}</a> and", "#{NBSP}#{url} and"
|
299
344
|
end
|
300
345
|
|
346
|
+
def test_urls_with_2_wide_UTF8_characters
|
347
|
+
url = "http://example.com/?foo=¥&bar=1"
|
348
|
+
assert_linked "<a href=\"#{url}\">#{url}</a> and", "#{url} and"
|
349
|
+
end
|
350
|
+
|
351
|
+
def test_urls_with_4_wide_UTF8_characters
|
352
|
+
url = "http://example.com/?foo=&bar=1"
|
353
|
+
assert_linked "<a href=\"#{url}\">#{url}</a> and", "#{url} and"
|
354
|
+
end
|
355
|
+
|
356
|
+
def test_handles_urls_with_emoji_properly
|
357
|
+
url = "http://foo.com/💖a"
|
358
|
+
assert_linked "<a href=\"#{url}\">#{url}</a> and", "#{url} and"
|
359
|
+
end
|
360
|
+
|
361
|
+
def test_identifies_nonbreaking_spaces_preceeding_emails
|
362
|
+
email_raw = 'david@loudthinking.com'
|
363
|
+
assert_linked "email#{NBSP}<a href=\"mailto:#{email_raw}\">#{email_raw}</a>", "email#{NBSP}#{email_raw}"
|
364
|
+
end
|
365
|
+
|
366
|
+
def test_www_is_case_insensitive
|
367
|
+
url = "www.reddit.com"
|
368
|
+
assert_linked generate_result(url), url
|
369
|
+
|
370
|
+
url = "WWW.REDDIT.COM"
|
371
|
+
assert_linked generate_result(url), url
|
372
|
+
|
373
|
+
url = "Www.reddit.Com"
|
374
|
+
assert_linked generate_result(url), url
|
375
|
+
|
376
|
+
url = "WwW.reddit.CoM"
|
377
|
+
assert_linked generate_result(url), url
|
378
|
+
end
|
301
379
|
end
|
metadata
CHANGED
@@ -1,18 +1,60 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rinku
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
5
|
-
prerelease:
|
4
|
+
version: 2.0.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Vicent Marti
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
13
|
-
dependencies:
|
14
|
-
|
15
|
-
|
11
|
+
date: 2016-05-19 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rake
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake-compiler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: minitest
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
description: |2
|
56
|
+
A fast and very smart autolinking library that
|
57
|
+
acts as a drop-in replacement for Rails `auto_link`
|
16
58
|
email: vicent@github.com
|
17
59
|
executables: []
|
18
60
|
extensions:
|
@@ -23,40 +65,42 @@ files:
|
|
23
65
|
- COPYING
|
24
66
|
- README.markdown
|
25
67
|
- Rakefile
|
26
|
-
- ext/rinku/rinku.c
|
27
|
-
- ext/rinku/rinku.h
|
28
68
|
- ext/rinku/autolink.c
|
29
69
|
- ext/rinku/autolink.h
|
30
70
|
- ext/rinku/buffer.c
|
31
71
|
- ext/rinku/buffer.h
|
32
72
|
- ext/rinku/extconf.rb
|
33
|
-
-
|
73
|
+
- ext/rinku/rinku.c
|
74
|
+
- ext/rinku/rinku.h
|
75
|
+
- ext/rinku/rinku_rb.c
|
76
|
+
- ext/rinku/utf8.c
|
77
|
+
- ext/rinku/utf8.h
|
34
78
|
- lib/rails_rinku.rb
|
79
|
+
- lib/rinku.rb
|
35
80
|
- rinku.gemspec
|
36
81
|
- test/autolink_test.rb
|
37
|
-
homepage:
|
82
|
+
homepage: https://github.com/vmg/rinku
|
38
83
|
licenses: []
|
84
|
+
metadata: {}
|
39
85
|
post_install_message:
|
40
86
|
rdoc_options: []
|
41
87
|
require_paths:
|
42
88
|
- lib
|
43
89
|
required_ruby_version: !ruby/object:Gem::Requirement
|
44
|
-
none: false
|
45
90
|
requirements:
|
46
|
-
- -
|
91
|
+
- - ">="
|
47
92
|
- !ruby/object:Gem::Version
|
48
93
|
version: '0'
|
49
94
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
50
|
-
none: false
|
51
95
|
requirements:
|
52
|
-
- -
|
96
|
+
- - ">="
|
53
97
|
- !ruby/object:Gem::Version
|
54
98
|
version: '0'
|
55
99
|
requirements: []
|
56
100
|
rubyforge_project:
|
57
|
-
rubygems_version:
|
101
|
+
rubygems_version: 2.2.5
|
58
102
|
signing_key:
|
59
|
-
specification_version:
|
103
|
+
specification_version: 4
|
60
104
|
summary: Mostly autolinking
|
61
105
|
test_files:
|
62
106
|
- test/autolink_test.rb
|