commonmarker 0.23.4 → 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.

Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +56 -55
  3. data/commonmarker.gemspec +26 -27
  4. data/ext/commonmarker/autolink.c +34 -3
  5. data/ext/commonmarker/cmark-gfm_version.h +2 -2
  6. data/ext/commonmarker/commonmarker.c +1 -0
  7. data/ext/commonmarker/inlines.c +29 -4
  8. data/ext/commonmarker/scanners.c +2438 -2450
  9. data/lib/commonmarker/config.rb +3 -3
  10. data/lib/commonmarker/node/inspect.rb +8 -18
  11. data/lib/commonmarker/node.rb +6 -6
  12. data/lib/commonmarker/renderer/html_renderer.rb +37 -37
  13. data/lib/commonmarker/renderer.rb +5 -5
  14. data/lib/commonmarker/version.rb +1 -1
  15. data/lib/commonmarker.rb +9 -9
  16. metadata +4 -57
  17. data/lib/commonmarker/errors.rb +0 -12
  18. data/test/benchmark.rb +0 -39
  19. data/test/fixtures/curly.md +0 -1
  20. data/test/fixtures/dingus.md +0 -10
  21. data/test/fixtures/strong.md +0 -1
  22. data/test/fixtures/table.md +0 -10
  23. data/test/test_attributes.rb +0 -24
  24. data/test/test_basics.rb +0 -35
  25. data/test/test_commands.rb +0 -72
  26. data/test/test_commonmark.rb +0 -36
  27. data/test/test_doc.rb +0 -130
  28. data/test/test_encoding.rb +0 -23
  29. data/test/test_extensions.rb +0 -116
  30. data/test/test_footnotes.rb +0 -60
  31. data/test/test_gc.rb +0 -47
  32. data/test/test_helper.rb +0 -71
  33. data/test/test_linebreaks.rb +0 -15
  34. data/test/test_maliciousness.rb +0 -262
  35. data/test/test_node.rb +0 -89
  36. data/test/test_options.rb +0 -37
  37. data/test/test_pathological_inputs.rb +0 -94
  38. data/test/test_plaintext.rb +0 -46
  39. data/test/test_renderer.rb +0 -47
  40. data/test/test_smartpunct.rb +0 -27
  41. data/test/test_spec.rb +0 -30
  42. data/test/test_tasklists.rb +0 -43
  43. data/test/test_xml.rb +0 -107
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bc6d71b6e85fb61abc438252b07369d3264982cf8fb327d96e5e8333bb23841e
4
- data.tar.gz: 1911965561ddf20104db09c44c4e5d25f65a277a28b825bc0c03bb172779a623
3
+ metadata.gz: cf9a7803972a4a9111e93837c8e47265ba83f10b3abd5cff73ec7375d862ef28
4
+ data.tar.gz: a292683b676b06e8cb4a190e5bb60c5bc3e474c5d3b631701f7fab1f176d9a5f
5
5
  SHA512:
6
- metadata.gz: 59737cb433c3f4f3d53e06d3466f1f3dcd8a40e201e8b0f26be4d553f45667137e05d980100304e720d0e8fda178da3eaa9e421608cf4e53c6d159ff9261ae3e
7
- data.tar.gz: c3088c3219da29bdb0356f46a5b7a7f2881410c825e101f7ced3964760bfcfcb5cef57e7f3ebf5bd9f686b974ad80887fc93899e616afb211dc0e648d6352cd2
6
+ metadata.gz: '0884ee35781e71e96cbe7b87c4d8e885b13882e8b67fc594fe53a615410a00ed4599d7a99eab9347ca8f272fd93be31b06bea890a7b0c41a1a1407a717e4f3d2'
7
+ data.tar.gz: ee9024ba7ee8b0143185ab41466b00b51349b55b70e12443ee11d68e640591ddab0e8073481e4cc19818fa56f82e1efbd29eaf0690203b4192b9602525169d06
data/Rakefile CHANGED
@@ -1,108 +1,109 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'date'
4
- require 'rake/clean'
5
- require 'rake/extensiontask'
6
- require 'digest/md5'
3
+ require "date"
4
+ require "rake/clean"
5
+ require "rake/extensiontask"
6
+ require "digest/md5"
7
7
 
8
- host_os = RbConfig::CONFIG['host_os']
9
- require 'devkit' if host_os == 'mingw32'
8
+ host_os = RbConfig::CONFIG["host_os"]
9
+ require "devkit" if host_os == "mingw32"
10
10
 
11
11
  task default: [:test]
12
12
 
13
13
  # Gem Spec
14
- gem_spec = Gem::Specification.load('commonmarker.gemspec')
14
+ gem_spec = Gem::Specification.load("commonmarker.gemspec")
15
15
 
16
16
  # Ruby Extension
17
- Rake::ExtensionTask.new('commonmarker', gem_spec) do |ext|
18
- ext.lib_dir = File.join('lib', 'commonmarker')
17
+ Rake::ExtensionTask.new("commonmarker", gem_spec) do |ext|
18
+ ext.lib_dir = File.join("lib", "commonmarker")
19
19
  end
20
20
 
21
21
  # Packaging
22
- require 'bundler/gem_tasks'
22
+ require "bundler/gem_tasks"
23
23
 
24
24
  # Testing
25
- require 'rake/testtask'
25
+ require "rake/testtask"
26
26
 
27
- Rake::TestTask.new('test:unit') do |t|
28
- t.libs << 'lib'
29
- t.libs << 'test'
30
- t.pattern = 'test/test_*.rb'
27
+ Rake::TestTask.new("test:unit") do |t|
28
+ t.libs << "lib"
29
+ t.libs << "test"
30
+ t.pattern = "test/test_*.rb"
31
31
  t.verbose = true
32
32
  t.warning = false
33
33
  end
34
34
 
35
- task 'test:unit' => :compile
35
+ desc "Run unit tests"
36
+ task "test:unit" => :compile
36
37
 
37
- desc 'Run unit and conformance tests'
38
- task test: %w[test:unit]
38
+ desc "Run unit and conformance tests"
39
+ task test: ["test:unit"]
39
40
 
40
- require 'rubocop/rake_task'
41
+ require "rubocop/rake_task"
41
42
 
42
43
  RuboCop::RakeTask.new(:rubocop)
43
44
 
44
- desc 'Run benchmarks'
45
+ desc "Run benchmarks"
45
46
  task :benchmark do
46
- if ENV['FETCH_PROGIT']
47
- `rm -rf test/progit`
48
- `git clone https://github.com/progit/progit.git test/progit`
49
- langs = %w[ar az be ca cs de en eo es es-ni fa fi fr hi hu id it ja ko mk nl no-nb pl pt-br ro ru sr th tr uk vi zh zh-tw]
47
+ if ENV["FETCH_PROGIT"]
48
+ %x(rm -rf test/progit)
49
+ %x(git clone https://github.com/progit/progit.git test/progit)
50
+ langs = ["ar", "az", "be", "ca", "cs", "de", "en", "eo", "es", "es-ni", "fa", "fi", "fr", "hi", "hu", "id", "it", "ja", "ko", "mk", "nl", "no-nb", "pl", "pt-br", "ro", "ru", "sr", "th", "tr", "uk", "vi", "zh", "zh-tw"]
50
51
  langs.each do |lang|
51
- `cat test/progit/#{lang}/*/*.markdown >> test/benchinput.md`
52
+ %x(cat test/progit/#{lang}/*/*.markdown >> test/benchinput.md)
52
53
  end
53
54
  end
54
- $LOAD_PATH.unshift 'lib'
55
- load 'test/benchmark.rb'
55
+ $LOAD_PATH.unshift("lib")
56
+ load "test/benchmark.rb"
56
57
  end
57
58
 
58
- desc 'Match C style of cmark'
59
+ desc "Match C style of cmark"
59
60
  task :format do
60
- sh 'clang-format -style llvm -i ext/commonmarker/*.c ext/commonmarker/*.h'
61
+ sh "clang-format -style llvm -i ext/commonmarker/*.c ext/commonmarker/*.h"
61
62
  end
62
63
 
63
64
  # Documentation
64
- require 'rdoc/task'
65
+ require "rdoc/task"
65
66
 
66
- desc 'Generate API documentation'
67
+ desc "Generate API documentation"
67
68
  RDoc::Task.new do |rd|
68
- rd.rdoc_dir = 'docs'
69
- rd.main = 'README.md'
70
- rd.rdoc_files.include 'README.md', 'lib/**/*.rb', 'ext/commonmarker/commonmarker.c'
71
-
72
- rd.options << '--markup tomdoc'
73
- rd.options << '--inline-source'
74
- rd.options << '--line-numbers'
75
- rd.options << '--all'
76
- rd.options << '--fileboxes'
69
+ rd.rdoc_dir = "docs"
70
+ rd.main = "README.md"
71
+ rd.rdoc_files.include("README.md", "lib/**/*.rb", "ext/commonmarker/commonmarker.c")
72
+
73
+ rd.options << "--markup tomdoc"
74
+ rd.options << "--inline-source"
75
+ rd.options << "--line-numbers"
76
+ rd.options << "--all"
77
+ rd.options << "--fileboxes"
77
78
  end
78
79
 
79
- desc 'Generate the documentation and run a web server'
80
+ desc "Generate the documentation and run a web server"
80
81
  task serve: [:rdoc] do
81
- require 'webrick'
82
+ require "webrick"
82
83
 
83
- puts 'Navigate to http://localhost:3000 to see the docs'
84
+ puts "Navigate to http://localhost:3000 to see the docs"
84
85
 
85
- server = WEBrick::HTTPServer.new Port: 3000
86
- server.mount '/', WEBrick::HTTPServlet::FileHandler, 'docs'
87
- trap('INT') { server.stop }
86
+ server = WEBrick::HTTPServer.new(Port: 3000)
87
+ server.mount("/", WEBrick::HTTPServlet::FileHandler, "docs")
88
+ trap("INT") { server.stop }
88
89
  server.start
89
90
  end
90
91
 
91
- desc 'Generate and publish docs to gh-pages'
92
+ desc "Generate and publish docs to gh-pages"
92
93
  task publish: [:rdoc] do
93
- require 'tmpdir'
94
- require 'shellwords'
94
+ require "tmpdir"
95
+ require "shellwords"
95
96
 
96
97
  Dir.mktmpdir do |tmp|
97
98
  system "mv docs/* #{tmp}"
98
- system 'git checkout origin/gh-pages'
99
- system 'rm -rf *'
99
+ system "git checkout origin/gh-pages"
100
+ system "rm -rf *"
100
101
  system "mv #{tmp}/* ."
101
102
  message = Shellwords.escape("Site updated at #{Time.now.utc}")
102
- system 'git add .'
103
+ system "git add ."
103
104
  system "git commit -am #{message}"
104
- system 'git push origin gh-pages --force'
105
- system 'git checkout master'
106
- system 'echo yolo'
105
+ system "git push origin gh-pages --force"
106
+ system "git checkout master"
107
+ system "echo yolo"
107
108
  end
108
109
  end
data/commonmarker.gemspec CHANGED
@@ -1,39 +1,38 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- lib = File.expand_path('lib', __dir__)
3
+ lib = File.expand_path("lib", __dir__)
4
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
- require 'commonmarker/version'
5
+ require "commonmarker/version"
6
6
 
7
7
  Gem::Specification.new do |s|
8
- s.name = 'commonmarker'
8
+ s.name = "commonmarker"
9
9
  s.version = CommonMarker::VERSION
10
- s.summary = 'CommonMark parser and renderer. Written in C, wrapped in Ruby.'
11
- s.description = 'A fast, safe, extensible parser for CommonMark. This wraps the official libcmark library.'
12
- s.authors = ['Garen Torikian', 'Ashe Connor']
13
- s.homepage = 'https://github.com/gjtorikian/commonmarker'
14
- s.license = 'MIT'
10
+ s.summary = "CommonMark parser and renderer. Written in C, wrapped in Ruby."
11
+ s.description = "A fast, safe, extensible parser for CommonMark. This wraps the official libcmark library."
12
+ s.authors = ["Garen Torikian", "Ashe Connor"]
13
+ s.homepage = "https://github.com/gjtorikian/commonmarker"
14
+ s.license = "MIT"
15
15
 
16
- s.files = %w[LICENSE.txt README.md Rakefile commonmarker.gemspec bin/commonmarker]
17
- s.files += Dir.glob('lib/**/*.rb')
18
- s.files += Dir.glob('ext/commonmarker/*.*')
19
- s.test_files = Dir.glob('test/**/*').reject { |f| f == 'test/benchinput.md' || f.start_with?('test/progit/') }
20
- s.extensions = ['ext/commonmarker/extconf.rb']
16
+ s.files = ["LICENSE.txt", "README.md", "Rakefile", "commonmarker.gemspec", "bin/commonmarker"]
17
+ s.files += Dir.glob("lib/**/*.rb")
18
+ s.files += Dir.glob("ext/commonmarker/*.*")
19
+ s.extensions = ["ext/commonmarker/extconf.rb"]
21
20
 
22
- s.executables = ['commonmarker']
23
- s.require_paths = %w[lib ext]
24
- s.required_ruby_version = ['>= 2.6', '< 4.0']
21
+ s.executables = ["commonmarker"]
22
+ s.require_paths = ["lib", "ext"]
23
+ s.required_ruby_version = [">= 2.6", "< 4.0"]
25
24
 
26
- s.metadata['rubygems_mfa_required'] = 'true'
25
+ s.metadata["rubygems_mfa_required"] = "true"
27
26
 
28
- s.rdoc_options += ['-x', 'ext/commonmarker/cmark/.*']
27
+ s.rdoc_options += ["-x", "ext/commonmarker/cmark/.*"]
29
28
 
30
- s.add_development_dependency 'awesome_print'
31
- s.add_development_dependency 'json', '~> 2.3'
32
- s.add_development_dependency 'minitest', '~> 5.6'
33
- s.add_development_dependency 'minitest-focus', '~> 1.1'
34
- s.add_development_dependency 'rake'
35
- s.add_development_dependency 'rake-compiler', '~> 0.9'
36
- s.add_development_dependency 'rdoc', '~> 6.2'
37
- s.add_development_dependency 'rubocop'
38
- s.add_development_dependency 'rubocop-standard'
29
+ s.add_development_dependency("awesome_print")
30
+ s.add_development_dependency("json", "~> 2.3")
31
+ s.add_development_dependency("minitest", "~> 5.6")
32
+ s.add_development_dependency("minitest-focus", "~> 1.1")
33
+ s.add_development_dependency("rake")
34
+ s.add_development_dependency("rake-compiler", "~> 0.9")
35
+ s.add_development_dependency("rdoc", "~> 6.2")
36
+ s.add_development_dependency("rubocop")
37
+ s.add_development_dependency("rubocop-standard")
39
38
  end
@@ -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) | 3)
5
- #define CMARK_GFM_VERSION_STRING "0.29.0.gfm.3"
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
@@ -1255,6 +1255,7 @@ __attribute__((visibility("default"))) void Init_commonmarker() {
1255
1255
  rb_define_singleton_method(module, "extensions", rb_extensions, 0);
1256
1256
  rb_eNodeError = rb_define_class_under(module, "NodeError", rb_eStandardError);
1257
1257
  rb_cNode = rb_define_class_under(module, "Node", rb_cObject);
1258
+ rb_undef_alloc_func(rb_cNode);
1258
1259
  rb_define_singleton_method(rb_cNode, "markdown_to_html", rb_markdown_to_html,
1259
1260
  3);
1260
1261
  rb_define_singleton_method(rb_cNode, "markdown_to_xml", rb_markdown_to_xml,
@@ -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) {