commonmarker 0.23.1 → 0.23.5

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 (50) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +56 -55
  3. data/bin/commonmarker +2 -7
  4. data/commonmarker.gemspec +27 -26
  5. data/ext/commonmarker/blocks.c +13 -2
  6. data/ext/commonmarker/cmark-gfm_version.h +2 -2
  7. data/ext/commonmarker/commonmark.c +14 -4
  8. data/ext/commonmarker/commonmarker.c +30 -44
  9. data/ext/commonmarker/ext_scanners.c +360 -640
  10. data/ext/commonmarker/footnotes.c +23 -0
  11. data/ext/commonmarker/footnotes.h +2 -0
  12. data/ext/commonmarker/html.c +40 -19
  13. data/ext/commonmarker/inlines.c +69 -11
  14. data/ext/commonmarker/node.h +7 -0
  15. data/ext/commonmarker/scanners.c +2438 -2450
  16. data/ext/commonmarker/table.c +98 -53
  17. data/lib/commonmarker/config.rb +1 -1
  18. data/lib/commonmarker/node/inspect.rb +8 -18
  19. data/lib/commonmarker/node.rb +6 -6
  20. data/lib/commonmarker/renderer/html_renderer.rb +37 -37
  21. data/lib/commonmarker/renderer.rb +5 -5
  22. data/lib/commonmarker/version.rb +1 -1
  23. data/lib/commonmarker.rb +9 -11
  24. metadata +6 -57
  25. data/test/benchmark.rb +0 -32
  26. data/test/fixtures/curly.md +0 -1
  27. data/test/fixtures/dingus.md +0 -10
  28. data/test/fixtures/strong.md +0 -1
  29. data/test/fixtures/table.md +0 -10
  30. data/test/test_attributes.rb +0 -24
  31. data/test/test_basics.rb +0 -35
  32. data/test/test_commands.rb +0 -72
  33. data/test/test_commonmark.rb +0 -36
  34. data/test/test_doc.rb +0 -130
  35. data/test/test_encoding.rb +0 -23
  36. data/test/test_extensions.rb +0 -116
  37. data/test/test_footnotes.rb +0 -48
  38. data/test/test_gc.rb +0 -47
  39. data/test/test_helper.rb +0 -71
  40. data/test/test_linebreaks.rb +0 -15
  41. data/test/test_maliciousness.rb +0 -262
  42. data/test/test_node.rb +0 -89
  43. data/test/test_options.rb +0 -37
  44. data/test/test_pathological_inputs.rb +0 -94
  45. data/test/test_plaintext.rb +0 -46
  46. data/test/test_renderer.rb +0 -47
  47. data/test/test_smartpunct.rb +0 -27
  48. data/test/test_spec.rb +0 -30
  49. data/test/test_tasklists.rb +0 -43
  50. data/test/test_xml.rb +0 -107
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1f620ec82d102c4726e551911d21a5d87e7185010ba711f6ddc35495184c90ba
4
- data.tar.gz: cf14b3a68481564facd7fbb46c90c822757d168db7eb41786b3a2d0ee3173e66
3
+ metadata.gz: be9868bfb1c9bf09a7f274abf44ef7692be355141e7a4a3d956b3f889869cefd
4
+ data.tar.gz: 8b09575b5209fcb2f80919dd46a89de97f52e61fc8f7b2d6d49c2243ff8c18ee
5
5
  SHA512:
6
- metadata.gz: 6a4d50388ad098dd9ccfd7e733e9a1274841e4b5d929d76e4f2e75ec10c55889ee85ef55afdb5ef5665214e6abde73e75bcd647fd2a53c6aa985a9396922992b
7
- data.tar.gz: a1e587570999fbc0c5f6423f7dcf375a8b2ffee2339939e2ca80807b5950c042656a498ea4acfaf3b60ba45d14fdc8f4655a0a936a06d966a89d3f9133a32188
6
+ metadata.gz: fffd100b88072cd573d8c3c13a81e437a08b69e48225b7abc2f8d20ffa188b021f1f779dab7d38b85c0d611261db7e4024a47ceeb7f08cba6334d8d5fc3f9e86
7
+ data.tar.gz: ee8039d05a8cb7a31803a1da6f4f20ea77e7420a3549e1edcb11190e3f65edbff54ed88707d5576de02b7ae8d1195061e40b75c83ab34357964820bca8b30795
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/bin/commonmarker CHANGED
@@ -2,7 +2,6 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require 'optparse'
5
- require 'ostruct'
6
5
 
7
6
  $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib')
8
7
  require 'commonmarker'
@@ -11,17 +10,13 @@ root = File.expand_path('..', __dir__)
11
10
  $LOAD_PATH.unshift File.expand_path('lib', root)
12
11
 
13
12
  def parse_options
14
- options = OpenStruct.new
13
+ options = Struct.new(:active_extensions, :active_parse_options, :active_render_options, :output_format, :renderer)
14
+ .new([], [:DEFAULT], [:DEFAULT], :html)
15
15
  extensions = CommonMarker.extensions
16
16
  parse_options = CommonMarker::Config::OPTS.fetch(:parse)
17
17
  render_options = CommonMarker::Config::OPTS.fetch(:render)
18
18
  format_options = CommonMarker::Config::OPTS.fetch(:format)
19
19
 
20
- options.active_extensions = []
21
- options.active_parse_options = [:DEFAULT]
22
- options.active_render_options = [:DEFAULT]
23
- options.output_format = :html
24
-
25
20
  option_parser = OptionParser.new do |opts|
26
21
  opts.banner = 'Usage: commonmarker [--html-renderer] [--extension=EXTENSION]'
27
22
  opts.separator ' [--to=FORMAT]'
data/commonmarker.gemspec CHANGED
@@ -1,37 +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.rdoc_options += ['-x', 'ext/commonmarker/cmark/.*']
25
+ s.metadata["rubygems_mfa_required"] = "true"
27
26
 
28
- s.add_development_dependency 'awesome_print'
29
- s.add_development_dependency 'json', '~> 2.3'
30
- s.add_development_dependency 'minitest', '~> 5.6'
31
- s.add_development_dependency 'minitest-focus', '~> 1.1'
32
- s.add_development_dependency 'rake'
33
- s.add_development_dependency 'rake-compiler', '~> 0.9'
34
- s.add_development_dependency 'rdoc', '~> 6.2'
35
- s.add_development_dependency 'rubocop'
36
- s.add_development_dependency 'rubocop-standard'
27
+ s.rdoc_options += ["-x", "ext/commonmarker/cmark/.*"]
28
+
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")
37
38
  end
@@ -468,7 +468,6 @@ static void process_footnotes(cmark_parser *parser) {
468
468
  while ((ev_type = cmark_iter_next(iter)) != CMARK_EVENT_DONE) {
469
469
  cur = cmark_iter_get_node(iter);
470
470
  if (ev_type == CMARK_EVENT_EXIT && cur->type == CMARK_NODE_FOOTNOTE_DEFINITION) {
471
- cmark_node_unlink(cur);
472
471
  cmark_footnote_create(map, cur);
473
472
  }
474
473
  }
@@ -485,6 +484,15 @@ static void process_footnotes(cmark_parser *parser) {
485
484
  if (!footnote->ix)
486
485
  footnote->ix = ++ix;
487
486
 
487
+ // store a reference to this footnote reference's footnote definition
488
+ // this is used by renderers when generating label ids
489
+ cur->parent_footnote_def = footnote->node;
490
+
491
+ // keep track of a) count of how many times this footnote def has been
492
+ // referenced, and b) which reference index this footnote ref is at.
493
+ // this is used by renderers when generating links and backreferences.
494
+ cur->footnote.ref_ix = ++footnote->node->footnote.def_count;
495
+
488
496
  char n[32];
489
497
  snprintf(n, sizeof(n), "%d", footnote->ix);
490
498
  cmark_chunk_free(parser->mem, &cur->as.literal);
@@ -515,13 +523,16 @@ static void process_footnotes(cmark_parser *parser) {
515
523
  qsort(map->sorted, map->size, sizeof(cmark_map_entry *), sort_footnote_by_ix);
516
524
  for (unsigned int i = 0; i < map->size; ++i) {
517
525
  cmark_footnote *footnote = (cmark_footnote *)map->sorted[i];
518
- if (!footnote->ix)
526
+ if (!footnote->ix) {
527
+ cmark_node_unlink(footnote->node);
519
528
  continue;
529
+ }
520
530
  cmark_node_append_child(parser->root, footnote->node);
521
531
  footnote->node = NULL;
522
532
  }
523
533
  }
524
534
 
535
+ cmark_unlink_footnotes_map(map);
525
536
  cmark_map_free(map);
526
537
  }
527
538
 
@@ -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) | 0)
5
- #define CMARK_GFM_VERSION_STRING "0.29.0.gfm.0"
4
+ #define CMARK_GFM_VERSION ((0 << 24) | (29 << 16) | (0 << 8) | 4)
5
+ #define CMARK_GFM_VERSION_STRING "0.29.0.gfm.4"
6
6
 
7
7
  #endif
@@ -477,7 +477,13 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node,
477
477
  case CMARK_NODE_FOOTNOTE_REFERENCE:
478
478
  if (entering) {
479
479
  LIT("[^");
480
- OUT(cmark_chunk_to_cstr(renderer->mem, &node->as.literal), false, LITERAL);
480
+
481
+ char *footnote_label = renderer->mem->calloc(node->parent_footnote_def->as.literal.len + 1, sizeof(char));
482
+ memmove(footnote_label, node->parent_footnote_def->as.literal.data, node->parent_footnote_def->as.literal.len);
483
+
484
+ OUT(footnote_label, false, LITERAL);
485
+ renderer->mem->free(footnote_label);
486
+
481
487
  LIT("]");
482
488
  }
483
489
  break;
@@ -486,9 +492,13 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node,
486
492
  if (entering) {
487
493
  renderer->footnote_ix += 1;
488
494
  LIT("[^");
489
- char n[32];
490
- snprintf(n, sizeof(n), "%d", renderer->footnote_ix);
491
- OUT(n, false, LITERAL);
495
+
496
+ char *footnote_label = renderer->mem->calloc(node->as.literal.len + 1, sizeof(char));
497
+ memmove(footnote_label, node->as.literal.data, node->as.literal.len);
498
+
499
+ OUT(footnote_label, false, LITERAL);
500
+ renderer->mem->free(footnote_label);
501
+
492
502
  LIT("]:\n");
493
503
 
494
504
  cmark_strbuf_puts(renderer->prefix, " ");
@@ -115,25 +115,23 @@ static void rb_parent_removed(VALUE val) {
115
115
  RDATA(val)->dfree = rb_free_c_struct;
116
116
  }
117
117
 
118
- static cmark_parser *prepare_parser(VALUE rb_options, VALUE rb_extensions, cmark_mem *mem) {
118
+ static cmark_parser *prepare_parser(VALUE rb_options, VALUE rb_extensions) {
119
119
  int options;
120
- int extensions_len;
121
120
  VALUE rb_ext_name;
122
121
  int i;
123
122
 
124
- Check_Type(rb_options, T_FIXNUM);
123
+ FIXNUM_P(rb_options);
124
+ options = FIX2INT(rb_options);
125
+
125
126
  Check_Type(rb_extensions, T_ARRAY);
126
127
 
127
- options = FIX2INT(rb_options);
128
- extensions_len = RARRAY_LEN(rb_extensions);
128
+ cmark_parser *parser = cmark_parser_new(options);
129
129
 
130
- cmark_parser *parser = cmark_parser_new_with_mem(options, mem);
131
- for (i = 0; i < extensions_len; ++i) {
132
- rb_ext_name = RARRAY_PTR(rb_extensions)[i];
130
+ for (i = 0; i < RARRAY_LEN(rb_extensions); ++i) {
131
+ rb_ext_name = rb_ary_entry(rb_extensions, i);
133
132
 
134
133
  if (!SYMBOL_P(rb_ext_name)) {
135
134
  cmark_parser_free(parser);
136
- cmark_arena_reset();
137
135
  rb_raise(rb_eTypeError, "extension names should be Symbols; got a %"PRIsVALUE"", rb_obj_class(rb_ext_name));
138
136
  }
139
137
 
@@ -142,7 +140,6 @@ static cmark_parser *prepare_parser(VALUE rb_options, VALUE rb_extensions, cmark
142
140
 
143
141
  if (!syntax_extension) {
144
142
  cmark_parser_free(parser);
145
- cmark_arena_reset();
146
143
  rb_raise(rb_eArgError, "extension %s not found", rb_id2name(SYM2ID(rb_ext_name)));
147
144
  }
148
145
 
@@ -157,33 +154,28 @@ static cmark_parser *prepare_parser(VALUE rb_options, VALUE rb_extensions, cmark
157
154
  *
158
155
  */
159
156
  static VALUE rb_markdown_to_html(VALUE self, VALUE rb_text, VALUE rb_options, VALUE rb_extensions) {
160
- char *str, *html;
161
- int len;
157
+ char *html;
162
158
  cmark_parser *parser;
163
159
  cmark_node *doc;
164
- Check_Type(rb_text, T_STRING);
165
- Check_Type(rb_options, T_FIXNUM);
166
160
 
167
- parser = prepare_parser(rb_options, rb_extensions, cmark_get_arena_mem_allocator());
161
+ Check_Type(rb_text, T_STRING);
168
162
 
169
- str = (char *)RSTRING_PTR(rb_text);
170
- len = RSTRING_LEN(rb_text);
163
+ parser = prepare_parser(rb_options, rb_extensions);
171
164
 
172
- cmark_parser_feed(parser, str, len);
165
+ cmark_parser_feed(parser, StringValuePtr(rb_text), RSTRING_LEN(rb_text));
173
166
  doc = cmark_parser_finish(parser);
167
+
174
168
  if (doc == NULL) {
175
- cmark_arena_reset();
169
+ cmark_parser_free(parser);
176
170
  rb_raise(rb_eNodeError, "error parsing document");
177
171
  }
178
172
 
179
- cmark_mem *default_mem = cmark_get_default_mem_allocator();
180
- html = cmark_render_html_with_mem(doc, FIX2INT(rb_options), parser->syntax_extensions, default_mem);
181
- cmark_arena_reset();
173
+ html = cmark_render_html(doc, parser->options, parser->syntax_extensions);
182
174
 
183
- VALUE ruby_html = rb_str_new2(html);
184
- default_mem->free(html);
175
+ cmark_parser_free(parser);
176
+ cmark_node_free(doc);
185
177
 
186
- return ruby_html;
178
+ return rb_utf8_str_new_cstr(html);
187
179
  }
188
180
 
189
181
  /*
@@ -191,33 +183,28 @@ static VALUE rb_markdown_to_html(VALUE self, VALUE rb_text, VALUE rb_options, VA
191
183
  *
192
184
  */
193
185
  static VALUE rb_markdown_to_xml(VALUE self, VALUE rb_text, VALUE rb_options, VALUE rb_extensions) {
194
- char *str, *xml;
195
- int len;
186
+ char *xml;
196
187
  cmark_parser *parser;
197
188
  cmark_node *doc;
198
- Check_Type(rb_text, T_STRING);
199
- Check_Type(rb_options, T_FIXNUM);
200
189
 
201
- parser = prepare_parser(rb_options, rb_extensions, cmark_get_arena_mem_allocator());
190
+ Check_Type(rb_text, T_STRING);
202
191
 
203
- str = (char *)RSTRING_PTR(rb_text);
204
- len = RSTRING_LEN(rb_text);
192
+ parser = prepare_parser(rb_options, rb_extensions);
205
193
 
206
- cmark_parser_feed(parser, str, len);
194
+ cmark_parser_feed(parser, StringValuePtr(rb_text), RSTRING_LEN(rb_text));
207
195
  doc = cmark_parser_finish(parser);
196
+
208
197
  if (doc == NULL) {
209
- cmark_arena_reset();
198
+ cmark_parser_free(parser);
210
199
  rb_raise(rb_eNodeError, "error parsing document");
211
200
  }
212
201
 
213
- cmark_mem *default_mem = cmark_get_default_mem_allocator();
214
- xml = cmark_render_xml_with_mem(doc, FIX2INT(rb_options), default_mem);
215
- cmark_arena_reset();
202
+ xml = cmark_render_xml(doc, parser->options);
216
203
 
217
- VALUE ruby_xml = rb_str_new2(xml);
218
- default_mem->free(xml);
204
+ cmark_parser_free(parser);
205
+ cmark_node_free(doc);
219
206
 
220
- return ruby_xml;
207
+ return rb_utf8_str_new_cstr(xml);
221
208
  }
222
209
 
223
210
  /*
@@ -308,18 +295,17 @@ static VALUE rb_node_new(VALUE self, VALUE type) {
308
295
  static VALUE rb_parse_document(VALUE self, VALUE rb_text, VALUE rb_len,
309
296
  VALUE rb_options, VALUE rb_extensions) {
310
297
  char *text;
311
- int len, options;
298
+ int len;
312
299
  cmark_parser *parser;
313
300
  cmark_node *doc;
314
301
  Check_Type(rb_text, T_STRING);
315
302
  Check_Type(rb_len, T_FIXNUM);
316
303
  Check_Type(rb_options, T_FIXNUM);
317
304
 
318
- parser = prepare_parser(rb_options, rb_extensions, cmark_get_default_mem_allocator());
305
+ parser = prepare_parser(rb_options, rb_extensions);
319
306
 
320
307
  text = (char *)RSTRING_PTR(rb_text);
321
308
  len = FIX2INT(rb_len);
322
- options = FIX2INT(rb_options);
323
309
 
324
310
  cmark_parser_feed(parser, text, len);
325
311
  doc = cmark_parser_finish(parser);
@@ -614,7 +600,6 @@ static VALUE rb_render_html(VALUE self, VALUE rb_options, VALUE rb_extensions) {
614
600
  */
615
601
  static VALUE rb_render_xml(VALUE self, VALUE rb_options) {
616
602
  int options;
617
- int i;
618
603
  cmark_node *node;
619
604
  Check_Type(rb_options, T_FIXNUM);
620
605
 
@@ -1270,6 +1255,7 @@ __attribute__((visibility("default"))) void Init_commonmarker() {
1270
1255
  rb_define_singleton_method(module, "extensions", rb_extensions, 0);
1271
1256
  rb_eNodeError = rb_define_class_under(module, "NodeError", rb_eStandardError);
1272
1257
  rb_cNode = rb_define_class_under(module, "Node", rb_cObject);
1258
+ rb_undef_alloc_func(rb_cNode);
1273
1259
  rb_define_singleton_method(rb_cNode, "markdown_to_html", rb_markdown_to_html,
1274
1260
  3);
1275
1261
  rb_define_singleton_method(rb_cNode, "markdown_to_xml", rb_markdown_to_xml,