rinku 1.7.3 → 2.0.0
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 +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
|