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.
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 (is_boundary_c(fc)) {
370
- sm->b = true;
371
- sm->d = 2;
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
- sm->b = false;
374
- sm->d = 1;
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
- append(sm, true, "<a rel=\"nofollow\" href=\"/users?name=");
378
- append_segment_uri_escaped(sm, sm->a1, sm->a2 - sm->d);
379
- append(sm, true, "\">");
380
- append_c(sm, '@');
381
- append_segment_html_escaped(sm, sm->a1, sm->a2 - sm->d);
382
- append(sm, true, "</a>");
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
- if (sm->b) {
385
- append_c_html_escaped(sm, fc);
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.11
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-02 00:00:00.000000000 Z
11
+ date: 2016-09-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest