dtext_rb 1.0.11 → 1.0.12
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 +4 -4
- data/VERSION +1 -1
- data/dtext_rb.gemspec +3 -3
- data/ext/dtext/dtext.c +211 -179
- data/ext/dtext/dtext.rl +35 -17
- data/test/dtext_test.rb +3 -1
- metadata +2 -2
data/ext/dtext/dtext.rl
CHANGED
@@ -26,6 +26,7 @@ typedef struct StateMachine {
|
|
26
26
|
const char * b2;
|
27
27
|
bool f_inline;
|
28
28
|
bool f_strip;
|
29
|
+
bool f_mentions;
|
29
30
|
bool list_mode;
|
30
31
|
bool header_mode;
|
31
32
|
GString * output;
|
@@ -321,7 +322,7 @@ inline := |*
|
|
321
322
|
append(sm, true, "<a href=\"");
|
322
323
|
append_segment_html_escaped(sm, sm->b1, sm->b2 - sm->d);
|
323
324
|
append(sm, true, "\">");
|
324
|
-
link_content_sm = parse_helper(sm->a1, sm->a2 - sm->a1, false, true);
|
325
|
+
link_content_sm = parse_helper(sm->a1, sm->a2 - sm->a1, false, true, false);
|
325
326
|
append(sm, true, link_content_sm->output->str);
|
326
327
|
free_machine(link_content_sm);
|
327
328
|
link_content_sm = NULL;
|
@@ -366,23 +367,30 @@ inline := |*
|
|
366
367
|
};
|
367
368
|
|
368
369
|
mention => {
|
369
|
-
if (
|
370
|
-
|
371
|
-
sm
|
370
|
+
if (!sm->f_mentions || (sm->a1 > sm->pb && sm->a1 - 1 > sm->pb && sm->a1[-2] != ' ' && sm->a1[-2] != '\r' && sm->a1[-2] != '\n')) {
|
371
|
+
// handle emails
|
372
|
+
append_c(sm, '@');
|
373
|
+
append_segment_html_escaped(sm, sm->a1, sm->a2 - 1);
|
374
|
+
|
372
375
|
} else {
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
+
if (is_boundary_c(fc)) {
|
377
|
+
sm->b = true;
|
378
|
+
sm->d = 2;
|
379
|
+
} else {
|
380
|
+
sm->b = false;
|
381
|
+
sm->d = 1;
|
382
|
+
}
|
376
383
|
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
384
|
+
append(sm, true, "<a rel=\"nofollow\" href=\"/users?name=");
|
385
|
+
append_segment_uri_escaped(sm, sm->a1, sm->a2 - sm->d);
|
386
|
+
append(sm, true, "\">");
|
387
|
+
append_c(sm, '@');
|
388
|
+
append_segment_html_escaped(sm, sm->a1, sm->a2 - sm->d);
|
389
|
+
append(sm, true, "</a>");
|
383
390
|
|
384
|
-
|
385
|
-
|
391
|
+
if (sm->b) {
|
392
|
+
append_c_html_escaped(sm, fc);
|
393
|
+
}
|
386
394
|
}
|
387
395
|
};
|
388
396
|
|
@@ -807,6 +815,7 @@ main := |*
|
|
807
815
|
header_with_id => {
|
808
816
|
char header = *sm->a1;
|
809
817
|
GString * id_name = g_string_new_len(sm->b1, sm->b2 - sm->b1);
|
818
|
+
id_name = g_string_prepend(id_name, "dtext-");
|
810
819
|
|
811
820
|
if (sm->f_inline) {
|
812
821
|
header = '6';
|
@@ -1338,6 +1347,7 @@ static void init_machine(StateMachine * sm, const char * src, size_t len) {
|
|
1338
1347
|
sm->b2 = NULL;
|
1339
1348
|
sm->f_inline = false;
|
1340
1349
|
sm->f_strip = false;
|
1350
|
+
sm->f_mentions = true;
|
1341
1351
|
sm->stack = g_array_sized_new(FALSE, TRUE, sizeof(int), 16);
|
1342
1352
|
sm->dstack = g_queue_new();
|
1343
1353
|
sm->list_nest = 0;
|
@@ -1355,7 +1365,7 @@ static void free_machine(StateMachine * sm) {
|
|
1355
1365
|
g_free(sm);
|
1356
1366
|
}
|
1357
1367
|
|
1358
|
-
static StateMachine * parse_helper(const char * src, size_t len, bool f_strip, bool f_inline) {
|
1368
|
+
static StateMachine * parse_helper(const char * src, size_t len, bool f_strip, bool f_inline, bool f_mentions) {
|
1359
1369
|
StateMachine * sm = NULL;
|
1360
1370
|
StateMachine * link_content_sm = NULL;
|
1361
1371
|
|
@@ -1363,6 +1373,7 @@ static StateMachine * parse_helper(const char * src, size_t len, bool f_strip, b
|
|
1363
1373
|
init_machine(sm, src, len);
|
1364
1374
|
sm->f_strip = f_strip;
|
1365
1375
|
sm->f_inline = f_inline;
|
1376
|
+
sm->f_mentions = f_mentions;
|
1366
1377
|
|
1367
1378
|
%% write init;
|
1368
1379
|
%% write exec;
|
@@ -1378,11 +1389,13 @@ static VALUE parse(int argc, VALUE * argv, VALUE self) {
|
|
1378
1389
|
VALUE options;
|
1379
1390
|
VALUE opt_inline;
|
1380
1391
|
VALUE opt_strip;
|
1392
|
+
VALUE opt_mentions;
|
1381
1393
|
VALUE ret;
|
1382
1394
|
rb_encoding * encoding = NULL;
|
1383
1395
|
StateMachine * sm = NULL;
|
1384
1396
|
bool f_strip = false;
|
1385
1397
|
bool f_inline = false;
|
1398
|
+
bool f_mentions = true;
|
1386
1399
|
|
1387
1400
|
g_debug("start\n");
|
1388
1401
|
|
@@ -1412,10 +1425,15 @@ static VALUE parse(int argc, VALUE * argv, VALUE self) {
|
|
1412
1425
|
if (RTEST(opt_inline)) {
|
1413
1426
|
f_inline = true;
|
1414
1427
|
}
|
1428
|
+
|
1429
|
+
opt_mentions = rb_hash_aref(options, ID2SYM(rb_intern("disable_mentions")));
|
1430
|
+
if (RTEST(opt_mentions)) {
|
1431
|
+
f_mentions = false;
|
1432
|
+
}
|
1415
1433
|
}
|
1416
1434
|
}
|
1417
1435
|
|
1418
|
-
sm = parse_helper(RSTRING_PTR(input0), RSTRING_LEN(input0), f_strip, f_inline);
|
1436
|
+
sm = parse_helper(RSTRING_PTR(input0), RSTRING_LEN(input0), f_strip, f_inline, f_mentions);
|
1419
1437
|
|
1420
1438
|
encoding = rb_enc_find("utf-8");
|
1421
1439
|
ret = rb_enc_str_new(sm->output->str, sm->output->len, encoding);
|
data/test/dtext_test.rb
CHANGED
@@ -10,7 +10,9 @@ class DTextTest < Minitest::Test
|
|
10
10
|
assert_parse('<p><a rel="nofollow" href="/users?name=bob">@bob</a></p>', "@bob")
|
11
11
|
assert_parse('<p>hi <a rel="nofollow" href="/users?name=bob">@bob</a></p>', "hi @bob")
|
12
12
|
assert_parse('<p>this is not @.@ @_@ <a rel="nofollow" href="/users?name=bob">@bob</a></p>', "this is not @.@ @_@ @bob")
|
13
|
+
assert_parse('<p>this is an email@address.com and should not trigger</p>', "this is an email@address.com and should not trigger")
|
13
14
|
assert_parse('<p>multiple <a rel="nofollow" href="/users?name=bob">@bob</a> <a rel="nofollow" href="/users?name=anna">@anna</a></p>', "multiple @bob @anna")
|
15
|
+
assert_equal('<p>hi @bob</p>', DTextRagel.parse("hi @bob", :disable_mentions => true))
|
14
16
|
end
|
15
17
|
|
16
18
|
def test_sanitize_heart
|
@@ -83,7 +85,7 @@ class DTextTest < Minitest::Test
|
|
83
85
|
end
|
84
86
|
|
85
87
|
def test_headers_with_ids
|
86
|
-
assert_parse("<h1 id=\"blah-blah\">header</h1>", "h1#blah-blah. header")
|
88
|
+
assert_parse("<h1 id=\"dtext-blah-blah\">header</h1>", "h1#blah-blah. header")
|
87
89
|
end
|
88
90
|
|
89
91
|
def test_headers_with_ids_with_quote
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dtext_rb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.12
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- r888888888
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-09-
|
11
|
+
date: 2016-09-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|