commonmarker 0.23.5 → 0.23.6

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of commonmarker might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: be9868bfb1c9bf09a7f274abf44ef7692be355141e7a4a3d956b3f889869cefd
4
- data.tar.gz: 8b09575b5209fcb2f80919dd46a89de97f52e61fc8f7b2d6d49c2243ff8c18ee
3
+ metadata.gz: cf9a7803972a4a9111e93837c8e47265ba83f10b3abd5cff73ec7375d862ef28
4
+ data.tar.gz: a292683b676b06e8cb4a190e5bb60c5bc3e474c5d3b631701f7fab1f176d9a5f
5
5
  SHA512:
6
- metadata.gz: fffd100b88072cd573d8c3c13a81e437a08b69e48225b7abc2f8d20ffa188b021f1f779dab7d38b85c0d611261db7e4024a47ceeb7f08cba6334d8d5fc3f9e86
7
- data.tar.gz: ee8039d05a8cb7a31803a1da6f4f20ea77e7420a3549e1edcb11190e3f65edbff54ed88707d5576de02b7ae8d1195061e40b75c83ab34357964820bca8b30795
6
+ metadata.gz: '0884ee35781e71e96cbe7b87c4d8e885b13882e8b67fc594fe53a615410a00ed4599d7a99eab9347ca8f272fd93be31b06bea890a7b0c41a1a1407a717e4f3d2'
7
+ data.tar.gz: ee9024ba7ee8b0143185ab41466b00b51349b55b70e12443ee11d68e640591ddab0e8073481e4cc19818fa56f82e1efbd29eaf0690203b4192b9602525169d06
@@ -269,6 +269,22 @@ static cmark_node *match(cmark_syntax_extension *ext, cmark_parser *parser,
269
269
  // inline was finished in inlines.c.
270
270
  }
271
271
 
272
+ static bool validate_protocol(char protocol[], uint8_t *data, int rewind) {
273
+ size_t len = strlen(protocol);
274
+
275
+ // Check that the protocol matches
276
+ for (int i = 1; i <= len; i++) {
277
+ if (data[-rewind - i] != protocol[len - i]) {
278
+ return false;
279
+ }
280
+ }
281
+
282
+ char prev_char = data[-rewind - len - 1];
283
+
284
+ // Make sure the character before the protocol is non-alphanumeric
285
+ return !cmark_isalnum(prev_char);
286
+ }
287
+
272
288
  static void postprocess_text(cmark_parser *parser, cmark_node *text, int offset, int depth) {
273
289
  // postprocess_text can recurse very deeply if there is a very long line of
274
290
  // '@' only. Stop at a reasonable depth to ensure it cannot crash.
@@ -278,6 +294,8 @@ static void postprocess_text(cmark_parser *parser, cmark_node *text, int offset,
278
294
  uint8_t *data = text->as.literal.data,
279
295
  *at;
280
296
  size_t size = text->as.literal.len;
297
+ bool auto_mailto = true;
298
+ bool is_xmpp = false;
281
299
  int rewind, max_rewind,
282
300
  nb = 0, np = 0, ns = 0;
283
301
 
@@ -304,8 +322,18 @@ static void postprocess_text(cmark_parser *parser, cmark_node *text, int offset,
304
322
  if (strchr(".+-_", c) != NULL)
305
323
  continue;
306
324
 
307
- if (c == '/')
308
- ns++;
325
+ if (strchr(":", c) != NULL) {
326
+ if (validate_protocol("mailto:", data, rewind)) {
327
+ auto_mailto = false;
328
+ continue;
329
+ }
330
+
331
+ if (validate_protocol("xmpp:", data, rewind)) {
332
+ auto_mailto = false;
333
+ is_xmpp = true;
334
+ continue;
335
+ }
336
+ }
309
337
 
310
338
  break;
311
339
  }
@@ -325,6 +353,8 @@ static void postprocess_text(cmark_parser *parser, cmark_node *text, int offset,
325
353
  nb++;
326
354
  else if (c == '.' && link_end < size - 1 && cmark_isalnum(data[link_end + 1]))
327
355
  np++;
356
+ else if (c == '/' && is_xmpp)
357
+ continue;
328
358
  else if (c != '-' && c != '_')
329
359
  break;
330
360
  }
@@ -347,7 +377,8 @@ static void postprocess_text(cmark_parser *parser, cmark_node *text, int offset,
347
377
  cmark_node *link_node = cmark_node_new_with_mem(CMARK_NODE_LINK, parser->mem);
348
378
  cmark_strbuf buf;
349
379
  cmark_strbuf_init(parser->mem, &buf, 10);
350
- cmark_strbuf_puts(&buf, "mailto:");
380
+ if (auto_mailto)
381
+ cmark_strbuf_puts(&buf, "mailto:");
351
382
  cmark_strbuf_put(&buf, data - rewind, (bufsize_t)(link_end + rewind));
352
383
  link_node->as.link.url = cmark_chunk_buf_detach(&buf);
353
384
 
@@ -1,7 +1,7 @@
1
1
  #ifndef CMARK_GFM_VERSION_H
2
2
  #define CMARK_GFM_VERSION_H
3
3
 
4
- #define CMARK_GFM_VERSION ((0 << 24) | (29 << 16) | (0 << 8) | 4)
5
- #define CMARK_GFM_VERSION_STRING "0.29.0.gfm.4"
4
+ #define CMARK_GFM_VERSION ((0 << 24) | (29 << 16) | (0 << 8) | 6)
5
+ #define CMARK_GFM_VERSION_STRING "0.29.0.gfm.6"
6
6
 
7
7
  #endif
@@ -41,6 +41,8 @@ typedef struct bracket {
41
41
  bool image;
42
42
  bool active;
43
43
  bool bracket_after;
44
+ bool in_bracket_image0;
45
+ bool in_bracket_image1;
44
46
  } bracket;
45
47
 
46
48
  typedef struct subject{
@@ -516,6 +518,8 @@ static void push_bracket(subject *subj, bool image, cmark_node *inl_text) {
516
518
  bracket *b = (bracket *)subj->mem->calloc(1, sizeof(bracket));
517
519
  if (subj->last_bracket != NULL) {
518
520
  subj->last_bracket->bracket_after = true;
521
+ b->in_bracket_image0 = subj->last_bracket->in_bracket_image0;
522
+ b->in_bracket_image1 = subj->last_bracket->in_bracket_image1;
519
523
  }
520
524
  b->image = image;
521
525
  b->active = true;
@@ -524,6 +528,11 @@ static void push_bracket(subject *subj, bool image, cmark_node *inl_text) {
524
528
  b->previous_delimiter = subj->last_delim;
525
529
  b->position = subj->pos;
526
530
  b->bracket_after = false;
531
+ if (image) {
532
+ b->in_bracket_image1 = true;
533
+ } else {
534
+ b->in_bracket_image0 = true;
535
+ }
527
536
  subj->last_bracket = b;
528
537
  }
529
538
 
@@ -1254,6 +1263,17 @@ match:
1254
1263
  }
1255
1264
  opener = opener->previous;
1256
1265
  }
1266
+ bool in_bracket_image1 = false;
1267
+ if (opener) {
1268
+ in_bracket_image1 = opener->in_bracket_image1;
1269
+ }
1270
+ bracket *opener2 = subj->last_bracket;
1271
+ while (opener2 != opener) {
1272
+ if (opener2->image) {
1273
+ opener2->in_bracket_image1 = in_bracket_image1;
1274
+ }
1275
+ opener2 = opener2->previous;
1276
+ }
1257
1277
  }
1258
1278
 
1259
1279
  return NULL;
@@ -1662,10 +1682,15 @@ cmark_chunk *cmark_inline_parser_get_chunk(cmark_inline_parser *parser) {
1662
1682
  }
1663
1683
 
1664
1684
  int cmark_inline_parser_in_bracket(cmark_inline_parser *parser, int image) {
1665
- for (bracket *b = parser->last_bracket; b; b = b->previous)
1666
- if (b->active && b->image == (image != 0))
1667
- return 1;
1668
- return 0;
1685
+ bracket *b = parser->last_bracket;
1686
+ if (!b) {
1687
+ return 0;
1688
+ }
1689
+ if (image != 0) {
1690
+ return b->in_bracket_image1;
1691
+ } else {
1692
+ return b->in_bracket_image0;
1693
+ }
1669
1694
  }
1670
1695
 
1671
1696
  void cmark_node_unput(cmark_node *node, int n) {
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module CommonMarker
4
- VERSION = "0.23.5"
4
+ VERSION = "0.23.6"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: commonmarker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.23.5
4
+ version: 0.23.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Garen Torikian
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2022-05-31 00:00:00.000000000 Z
12
+ date: 2022-09-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: awesome_print
@@ -255,7 +255,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
255
255
  - !ruby/object:Gem::Version
256
256
  version: '0'
257
257
  requirements: []
258
- rubygems_version: 3.3.13
258
+ rubygems_version: 3.2.15
259
259
  signing_key:
260
260
  specification_version: 4
261
261
  summary: CommonMark parser and renderer. Written in C, wrapped in Ruby.