zendesk-rinku 1.7.0 → 1.7.2.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 +8 -8
- data/Rakefile +6 -4
- data/ext/rinku/autolink.c +21 -11
- data/ext/rinku/rinku.c +19 -11
- data/lib/rinku.rb +1 -1
- data/rinku.gemspec +2 -2
- data/test/autolink_test.rb +25 -2
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
OTBhY2IxNDFiMWFkOGQxMzUzMjQ4MjlkYmMzZWI4MjhiODYwNGI3OQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
OTQ1M2Y3MjE0Nzc5ODdjNmZjODVkYmVhMzdlNzc5OTlkZDUzOTA0OA==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
ODg4NDIxOGZjNjJkMDc2ODFmODFkZTNlNGVmZDQ1YjkyYTg4ZGY1ZDM2NTM1
|
10
|
+
ZWE1ZjViMTJlNWVjOWU1YjVhOWRkZWJjNGY1ZWFhMzg3M2E4MzRkOGRkMjI4
|
11
|
+
NmVlOTJmNjg5ZDkxNWQ4MTFkOTkwODk3OTQwYjdhYjYwYzZmNWQ=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
YmQ1MjBkNWYzMWQ4NWU4MDI4NDg3ZmRiNDhlMTMwNzFjN2E3MTE4NjdhMDhm
|
14
|
+
MGE2MDhkZjdmYTZjZGM5N2RmOGMwZmU3ZGFmYmFkN2ZhZmE2Yzg2YTNhZDRm
|
15
|
+
ZDk2M2RlN2IyMjkwY2UzZTE2ZDgxYzViMTZlZWQxOTZlMDhkYjY=
|
data/Rakefile
CHANGED
@@ -50,7 +50,7 @@ file package('.gem') => %w[pkg/ rinku.gemspec] + $spec.files do |f|
|
|
50
50
|
end
|
51
51
|
|
52
52
|
# GEMSPEC HELPERS ==========================================================
|
53
|
-
task :gather => 'sundown
|
53
|
+
task :gather => 'sundown:checkout' do |t|
|
54
54
|
files =
|
55
55
|
FileList[
|
56
56
|
'sundown/src/{buffer,autolink}.h',
|
@@ -61,7 +61,9 @@ task :gather => 'sundown/src/autolink.h' do |t|
|
|
61
61
|
:verbose => true
|
62
62
|
end
|
63
63
|
|
64
|
-
|
65
|
-
|
66
|
-
|
64
|
+
task 'sundown:checkout' do |t|
|
65
|
+
unless File.exists?('sundown/src/markdown.h')
|
66
|
+
sh 'git submodule init'
|
67
|
+
sh 'git submodule update'
|
68
|
+
end
|
67
69
|
end
|
data/ext/rinku/autolink.c
CHANGED
@@ -20,7 +20,18 @@
|
|
20
20
|
#include <string.h>
|
21
21
|
#include <stdlib.h>
|
22
22
|
#include <stdio.h>
|
23
|
+
#include "ruby.h"
|
24
|
+
|
25
|
+
#ifdef HAVE_RUBY_ENCODING_H
|
26
|
+
#include <ruby/encoding.h>
|
27
|
+
#define isalnum(s) rb_isalnum(s)
|
28
|
+
#define isspace(s) rb_isspace(s)
|
29
|
+
#define isalpha(s) rb_isalpha(s)
|
30
|
+
#define ispunct(s) rb_ispunct(s)
|
31
|
+
#else
|
23
32
|
#include <ctype.h>
|
33
|
+
#endif
|
34
|
+
|
24
35
|
|
25
36
|
#if defined(_WIN32)
|
26
37
|
#define strncasecmp _strnicmp
|
@@ -49,7 +60,7 @@ sd_autolink_issafe(const uint8_t *link, size_t link_len)
|
|
49
60
|
}
|
50
61
|
|
51
62
|
static size_t
|
52
|
-
autolink_delim(uint8_t *data, size_t link_end, size_t
|
63
|
+
autolink_delim(uint8_t *data, size_t link_end, size_t max_rewind, size_t size)
|
53
64
|
{
|
54
65
|
uint8_t cclose, copen = 0;
|
55
66
|
size_t i;
|
@@ -163,13 +174,13 @@ sd_autolink__www(
|
|
163
174
|
size_t *rewind_p,
|
164
175
|
struct buf *link,
|
165
176
|
uint8_t *data,
|
166
|
-
size_t
|
177
|
+
size_t max_rewind,
|
167
178
|
size_t size,
|
168
179
|
unsigned int flags)
|
169
180
|
{
|
170
181
|
size_t link_end;
|
171
182
|
|
172
|
-
if (
|
183
|
+
if (max_rewind > 0 && !ispunct(data[-1]) && !isspace(data[-1]))
|
173
184
|
return 0;
|
174
185
|
|
175
186
|
if (size < 4 || memcmp(data, "www.", strlen("www.")) != 0)
|
@@ -183,7 +194,7 @@ sd_autolink__www(
|
|
183
194
|
while (link_end < size && !isspace(data[link_end]))
|
184
195
|
link_end++;
|
185
196
|
|
186
|
-
link_end = autolink_delim(data, link_end,
|
197
|
+
link_end = autolink_delim(data, link_end, max_rewind, size);
|
187
198
|
|
188
199
|
if (link_end == 0)
|
189
200
|
return 0;
|
@@ -199,14 +210,14 @@ sd_autolink__email(
|
|
199
210
|
size_t *rewind_p,
|
200
211
|
struct buf *link,
|
201
212
|
uint8_t *data,
|
202
|
-
size_t
|
213
|
+
size_t max_rewind,
|
203
214
|
size_t size,
|
204
215
|
unsigned int flags)
|
205
216
|
{
|
206
217
|
size_t link_end, rewind;
|
207
218
|
int nb = 0, np = 0;
|
208
219
|
|
209
|
-
for (rewind = 0; rewind <
|
220
|
+
for (rewind = 0; rewind < max_rewind; ++rewind) {
|
210
221
|
uint8_t c = data[-rewind - 1];
|
211
222
|
|
212
223
|
if (isalnum(c))
|
@@ -238,7 +249,7 @@ sd_autolink__email(
|
|
238
249
|
if (link_end < 2 || nb != 1 || np == 0)
|
239
250
|
return 0;
|
240
251
|
|
241
|
-
link_end = autolink_delim(data, link_end,
|
252
|
+
link_end = autolink_delim(data, link_end, max_rewind, size);
|
242
253
|
|
243
254
|
if (link_end == 0)
|
244
255
|
return 0;
|
@@ -254,7 +265,7 @@ sd_autolink__url(
|
|
254
265
|
size_t *rewind_p,
|
255
266
|
struct buf *link,
|
256
267
|
uint8_t *data,
|
257
|
-
size_t
|
268
|
+
size_t max_rewind,
|
258
269
|
size_t size,
|
259
270
|
unsigned int flags)
|
260
271
|
{
|
@@ -263,7 +274,7 @@ sd_autolink__url(
|
|
263
274
|
if (size < 4 || data[1] != '/' || data[2] != '/')
|
264
275
|
return 0;
|
265
276
|
|
266
|
-
while (rewind <
|
277
|
+
while (rewind < max_rewind && isalpha(data[-rewind - 1]))
|
267
278
|
rewind++;
|
268
279
|
|
269
280
|
if (!sd_autolink_issafe(data - rewind, size + rewind))
|
@@ -283,7 +294,7 @@ sd_autolink__url(
|
|
283
294
|
while (link_end < size && !isspace(data[link_end]))
|
284
295
|
link_end++;
|
285
296
|
|
286
|
-
link_end = autolink_delim(data, link_end,
|
297
|
+
link_end = autolink_delim(data, link_end, max_rewind, size);
|
287
298
|
|
288
299
|
if (link_end == 0)
|
289
300
|
return 0;
|
@@ -293,4 +304,3 @@ sd_autolink__url(
|
|
293
304
|
|
294
305
|
return link_end;
|
295
306
|
}
|
296
|
-
|
data/ext/rinku/rinku.c
CHANGED
@@ -24,6 +24,8 @@
|
|
24
24
|
#include <ruby/encoding.h>
|
25
25
|
#else
|
26
26
|
#define rb_enc_copy(dst, src)
|
27
|
+
#define rb_enc_set_index(str, idx)
|
28
|
+
#define rb_enc_get_index(str) 1
|
27
29
|
#endif
|
28
30
|
|
29
31
|
#include "autolink.h"
|
@@ -74,7 +76,7 @@ static const char *g_hrefs[] = {
|
|
74
76
|
};
|
75
77
|
|
76
78
|
static void
|
77
|
-
autolink__print(struct buf *ob, const struct buf *link, void *payload)
|
79
|
+
autolink__print(struct buf *ob, const struct buf *link, void *payload, int enc_index)
|
78
80
|
{
|
79
81
|
bufput(ob, link->data, link->size);
|
80
82
|
}
|
@@ -191,10 +193,11 @@ rinku_autolink(
|
|
191
193
|
unsigned int flags,
|
192
194
|
const char *link_attr,
|
193
195
|
const char **skip_tags,
|
194
|
-
void (*link_text_cb)(struct buf *ob, const struct buf *link, void *payload),
|
196
|
+
void (*link_text_cb)(struct buf *ob, const struct buf *link, void *payload, int enc_index),
|
197
|
+
int enc_index,
|
195
198
|
void *payload)
|
196
199
|
{
|
197
|
-
size_t i, end;
|
200
|
+
size_t i, end, last_link_found = 0;
|
198
201
|
struct buf *link = bufnew(16);
|
199
202
|
char active_chars[256];
|
200
203
|
void (*link_url_cb)(struct buf *, const struct buf *, void *);
|
@@ -249,8 +252,11 @@ rinku_autolink(
|
|
249
252
|
}
|
250
253
|
|
251
254
|
link->size = 0;
|
255
|
+
|
252
256
|
link_end = g_callbacks[(int)action](
|
253
|
-
&rewind, link, (uint8_t *)text + end,
|
257
|
+
&rewind, link, (uint8_t *)text + end,
|
258
|
+
end - last_link_found,
|
259
|
+
size - end, flags);
|
254
260
|
|
255
261
|
/* print the link */
|
256
262
|
if (link_end > 0) {
|
@@ -267,12 +273,12 @@ rinku_autolink(
|
|
267
273
|
BUFPUTSL(ob, "\">");
|
268
274
|
}
|
269
275
|
|
270
|
-
link_text_cb(ob, link, payload);
|
276
|
+
link_text_cb(ob, link, payload, enc_index);
|
271
277
|
BUFPUTSL(ob, "</a>");
|
272
278
|
|
273
279
|
link_count++;
|
274
280
|
i = end + link_end;
|
275
|
-
end = i;
|
281
|
+
last_link_found = end = i;
|
276
282
|
} else {
|
277
283
|
end = end + 1;
|
278
284
|
}
|
@@ -287,10 +293,11 @@ rinku_autolink(
|
|
287
293
|
* Ruby code
|
288
294
|
*/
|
289
295
|
static void
|
290
|
-
autolink_callback(struct buf *link_text, const struct buf *link, void *block)
|
296
|
+
autolink_callback(struct buf *link_text, const struct buf *link, void *block, int enc_index)
|
291
297
|
{
|
292
298
|
VALUE rb_link, rb_link_text;
|
293
299
|
rb_link = rb_str_new(link->data, link->size);
|
300
|
+
rb_enc_set_index(rb_link, enc_index);
|
294
301
|
rb_link_text = rb_funcall((VALUE)block, rb_intern("call"), 1, rb_link);
|
295
302
|
Check_Type(rb_link_text, T_STRING);
|
296
303
|
bufput(link_text, RSTRING_PTR(rb_link_text), RSTRING_LEN(rb_link_text));
|
@@ -346,8 +353,8 @@ const char **rinku_load_tags(VALUE rb_skip)
|
|
346
353
|
* HTML, Rinku is smart enough to skip the links that are already enclosed in `<a>`
|
347
354
|
* tags.`
|
348
355
|
*
|
349
|
-
* - `mode` is a symbol, either `:all`, `:urls` or `:email_addresses`,
|
350
|
-
* which specifies which kind of links will be auto-linked.
|
356
|
+
* - `mode` is a symbol, either `:all`, `:urls` or `:email_addresses`,
|
357
|
+
* which specifies which kind of links will be auto-linked.
|
351
358
|
*
|
352
359
|
* - `link_attr` is a string containing the link attributes for each link that
|
353
360
|
* will be generated. These attributes are not sanitized and will be include as-is
|
@@ -392,7 +399,7 @@ rb_rinku_autolink(int argc, VALUE *argv, VALUE self)
|
|
392
399
|
ID mode_sym;
|
393
400
|
|
394
401
|
rb_scan_args(argc, argv, "14&", &rb_text, &rb_mode,
|
395
|
-
&rb_html, &rb_skip, &rb_flags, &rb_block);
|
402
|
+
&rb_html, &rb_skip, &rb_flags, &rb_block);
|
396
403
|
|
397
404
|
Check_Type(rb_text, T_STRING);
|
398
405
|
|
@@ -434,6 +441,7 @@ rb_rinku_autolink(int argc, VALUE *argv, VALUE self)
|
|
434
441
|
rb_raise(rb_eTypeError,
|
435
442
|
"Invalid linking mode (possible values are :all, :urls, :email_addresses)");
|
436
443
|
|
444
|
+
|
437
445
|
count = rinku_autolink(
|
438
446
|
output_buf,
|
439
447
|
RSTRING_PTR(rb_text),
|
@@ -443,6 +451,7 @@ rb_rinku_autolink(int argc, VALUE *argv, VALUE self)
|
|
443
451
|
link_attr,
|
444
452
|
skip_tags,
|
445
453
|
RTEST(rb_block) ? &autolink_callback : NULL,
|
454
|
+
rb_enc_get_index(rb_text),
|
446
455
|
(void*)rb_block);
|
447
456
|
|
448
457
|
if (count == 0)
|
@@ -465,4 +474,3 @@ void RUBY_EXPORT Init_rinku()
|
|
465
474
|
rb_define_method(rb_mRinku, "auto_link", rb_rinku_autolink, -1);
|
466
475
|
rb_define_const(rb_mRinku, "AUTOLINK_SHORT_DOMAINS", INT2FIX(SD_AUTOLINK_SHORT_DOMAINS));
|
467
476
|
}
|
468
|
-
|
data/lib/rinku.rb
CHANGED
data/rinku.gemspec
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = 'zendesk-rinku'
|
5
|
-
s.version = '1.7.
|
5
|
+
s.version = '1.7.2.1'
|
6
6
|
s.summary = "Mostly autolinking"
|
7
7
|
s.description = <<-EOF
|
8
8
|
A fast and very smart autolinking library that
|
@@ -12,7 +12,7 @@ Gem::Specification.new do |s|
|
|
12
12
|
EOF
|
13
13
|
s.email = 'shajith@zendesk.com'
|
14
14
|
s.homepage = 'http://github.com/shajith/rinku'
|
15
|
-
s.authors = ["
|
15
|
+
s.authors = ["Vicent Marti", "Shajith Chacko"]
|
16
16
|
# = MANIFEST =
|
17
17
|
s.files = %w[
|
18
18
|
COPYING
|
data/test/autolink_test.rb
CHANGED
@@ -15,6 +15,10 @@ class RedcarpetAutolinkTest < Test::Unit::TestCase
|
|
15
15
|
assert_equal expected, Rinku.auto_link(url)
|
16
16
|
end
|
17
17
|
|
18
|
+
def test_segfault
|
19
|
+
Rinku.auto_link("a+b@d.com+e@f.com", mode=:all)
|
20
|
+
end
|
21
|
+
|
18
22
|
def test_escapes_quotes
|
19
23
|
assert_linked %(<a href="http://website.com/"onmouseover=document.body.style.backgroundColor="pink";//">http://website.com/"onmouseover=document.body.style.backgroundColor="pink";//</a>),
|
20
24
|
%(http://website.com/"onmouseover=document.body.style.backgroundColor="pink";//)
|
@@ -32,7 +36,7 @@ class RedcarpetAutolinkTest < Test::Unit::TestCase
|
|
32
36
|
Rinku.skip_tags = nil
|
33
37
|
assert_not_equal Rinku.auto_link(url), url
|
34
38
|
end
|
35
|
-
|
39
|
+
|
36
40
|
def test_auto_link_with_single_trailing_punctuation_and_space
|
37
41
|
url = "http://www.youtube.com"
|
38
42
|
url_result = generate_result(url)
|
@@ -138,7 +142,7 @@ This is just a test. <a href="http://www.pokemon.com">http://www.pokemon.com</a>
|
|
138
142
|
url2 = "http://www.ruby-doc.org/core/Bar.html"
|
139
143
|
|
140
144
|
assert_equal %(<p><a href="#{url1}">#{url1}</a><br /><a href="#{url2}">#{url2}</a><br /></p>), Rinku.auto_link("<p>#{url1}<br />#{url2}<br /></p>")
|
141
|
-
end
|
145
|
+
end
|
142
146
|
|
143
147
|
def test_block
|
144
148
|
link = Rinku.auto_link("Find ur favorite pokeman @ http://www.pokemon.com") do |url|
|
@@ -149,6 +153,12 @@ This is just a test. <a href="http://www.pokemon.com">http://www.pokemon.com</a>
|
|
149
153
|
assert_equal link, "Find ur favorite pokeman @ <a href=\"http://www.pokemon.com\">POKEMAN WEBSITE</a>"
|
150
154
|
end
|
151
155
|
|
156
|
+
def test_links_with_cyrillic_x
|
157
|
+
url = "http://example.com/х"
|
158
|
+
|
159
|
+
assert_linked "<a href=\"#{url}\">#{url}</a>", url
|
160
|
+
end
|
161
|
+
|
152
162
|
def test_autolink_works
|
153
163
|
url = "http://example.com/"
|
154
164
|
assert_linked "<a href=\"#{url}\">#{url}</a>", url
|
@@ -285,6 +295,19 @@ This is just a test. <a href="http://www.pokemon.com">http://www.pokemon.com</a>
|
|
285
295
|
ret = Rinku.auto_link str
|
286
296
|
assert_equal str.encoding, ret.encoding
|
287
297
|
end
|
298
|
+
|
299
|
+
def test_block_encoding
|
300
|
+
url = "http://example.com/х"
|
301
|
+
assert_equal "UTF-8", url.encoding.to_s
|
302
|
+
|
303
|
+
link = Rinku.auto_link(url) do |u|
|
304
|
+
assert_equal "UTF-8", u.encoding.to_s
|
305
|
+
u
|
306
|
+
end
|
307
|
+
|
308
|
+
assert_equal link.encoding.to_s, "UTF-8"
|
309
|
+
end
|
310
|
+
|
288
311
|
end
|
289
312
|
|
290
313
|
def generate_result(link_text, href = nil)
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zendesk-rinku
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.7.
|
4
|
+
version: 1.7.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
- Shajith Chacko
|
8
7
|
- Vicent Marti
|
8
|
+
- Shajith Chacko
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-04-01 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: ! " A fast and very smart autolinking library that\n acts as a
|
15
15
|
drop-in replacement for Rails `auto_link`\n\n This is just a fork of vmg's lib
|