commonmarker 0.23.1 → 0.23.5
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.
Potentially problematic release.
This version of commonmarker might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Rakefile +56 -55
- data/bin/commonmarker +2 -7
- data/commonmarker.gemspec +27 -26
- data/ext/commonmarker/blocks.c +13 -2
- data/ext/commonmarker/cmark-gfm_version.h +2 -2
- data/ext/commonmarker/commonmark.c +14 -4
- data/ext/commonmarker/commonmarker.c +30 -44
- data/ext/commonmarker/ext_scanners.c +360 -640
- data/ext/commonmarker/footnotes.c +23 -0
- data/ext/commonmarker/footnotes.h +2 -0
- data/ext/commonmarker/html.c +40 -19
- data/ext/commonmarker/inlines.c +69 -11
- data/ext/commonmarker/node.h +7 -0
- data/ext/commonmarker/scanners.c +2438 -2450
- data/ext/commonmarker/table.c +98 -53
- data/lib/commonmarker/config.rb +1 -1
- data/lib/commonmarker/node/inspect.rb +8 -18
- data/lib/commonmarker/node.rb +6 -6
- data/lib/commonmarker/renderer/html_renderer.rb +37 -37
- data/lib/commonmarker/renderer.rb +5 -5
- data/lib/commonmarker/version.rb +1 -1
- data/lib/commonmarker.rb +9 -11
- metadata +6 -57
- data/test/benchmark.rb +0 -32
- data/test/fixtures/curly.md +0 -1
- data/test/fixtures/dingus.md +0 -10
- data/test/fixtures/strong.md +0 -1
- data/test/fixtures/table.md +0 -10
- data/test/test_attributes.rb +0 -24
- data/test/test_basics.rb +0 -35
- data/test/test_commands.rb +0 -72
- data/test/test_commonmark.rb +0 -36
- data/test/test_doc.rb +0 -130
- data/test/test_encoding.rb +0 -23
- data/test/test_extensions.rb +0 -116
- data/test/test_footnotes.rb +0 -48
- data/test/test_gc.rb +0 -47
- data/test/test_helper.rb +0 -71
- data/test/test_linebreaks.rb +0 -15
- data/test/test_maliciousness.rb +0 -262
- data/test/test_node.rb +0 -89
- data/test/test_options.rb +0 -37
- data/test/test_pathological_inputs.rb +0 -94
- data/test/test_plaintext.rb +0 -46
- data/test/test_renderer.rb +0 -47
- data/test/test_smartpunct.rb +0 -27
- data/test/test_spec.rb +0 -30
- data/test/test_tasklists.rb +0 -43
- data/test/test_xml.rb +0 -107
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: be9868bfb1c9bf09a7f274abf44ef7692be355141e7a4a3d956b3f889869cefd
         | 
| 4 | 
            +
              data.tar.gz: 8b09575b5209fcb2f80919dd46a89de97f52e61fc8f7b2d6d49c2243ff8c18ee
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 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  | 
| 4 | 
            -
            require  | 
| 5 | 
            -
            require  | 
| 6 | 
            -
            require  | 
| 3 | 
            +
            require "date"
         | 
| 4 | 
            +
            require "rake/clean"
         | 
| 5 | 
            +
            require "rake/extensiontask"
         | 
| 6 | 
            +
            require "digest/md5"
         | 
| 7 7 |  | 
| 8 | 
            -
            host_os = RbConfig::CONFIG[ | 
| 9 | 
            -
            require  | 
| 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( | 
| 14 | 
            +
            gem_spec = Gem::Specification.load("commonmarker.gemspec")
         | 
| 15 15 |  | 
| 16 16 | 
             
            # Ruby Extension
         | 
| 17 | 
            -
            Rake::ExtensionTask.new( | 
| 18 | 
            -
              ext.lib_dir = File.join( | 
| 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  | 
| 22 | 
            +
            require "bundler/gem_tasks"
         | 
| 23 23 |  | 
| 24 24 | 
             
            # Testing
         | 
| 25 | 
            -
            require  | 
| 25 | 
            +
            require "rake/testtask"
         | 
| 26 26 |  | 
| 27 | 
            -
            Rake::TestTask.new( | 
| 28 | 
            -
              t.libs <<  | 
| 29 | 
            -
              t.libs <<  | 
| 30 | 
            -
              t.pattern =  | 
| 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 | 
            -
             | 
| 35 | 
            +
            desc "Run unit tests"
         | 
| 36 | 
            +
            task "test:unit" => :compile
         | 
| 36 37 |  | 
| 37 | 
            -
            desc  | 
| 38 | 
            -
            task test:  | 
| 38 | 
            +
            desc "Run unit and conformance tests"
         | 
| 39 | 
            +
            task test: ["test:unit"]
         | 
| 39 40 |  | 
| 40 | 
            -
            require  | 
| 41 | 
            +
            require "rubocop/rake_task"
         | 
| 41 42 |  | 
| 42 43 | 
             
            RuboCop::RakeTask.new(:rubocop)
         | 
| 43 44 |  | 
| 44 | 
            -
            desc  | 
| 45 | 
            +
            desc "Run benchmarks"
         | 
| 45 46 | 
             
            task :benchmark do
         | 
| 46 | 
            -
              if ENV[ | 
| 47 | 
            -
                 | 
| 48 | 
            -
                 | 
| 49 | 
            -
                langs =  | 
| 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 | 
            -
                   | 
| 52 | 
            +
                  %x(cat test/progit/#{lang}/*/*.markdown >> test/benchinput.md)
         | 
| 52 53 | 
             
                end
         | 
| 53 54 | 
             
              end
         | 
| 54 | 
            -
              $LOAD_PATH.unshift | 
| 55 | 
            -
              load  | 
| 55 | 
            +
              $LOAD_PATH.unshift("lib")
         | 
| 56 | 
            +
              load "test/benchmark.rb"
         | 
| 56 57 | 
             
            end
         | 
| 57 58 |  | 
| 58 | 
            -
            desc  | 
| 59 | 
            +
            desc "Match C style of cmark"
         | 
| 59 60 | 
             
            task :format do
         | 
| 60 | 
            -
              sh  | 
| 61 | 
            +
              sh "clang-format -style llvm -i ext/commonmarker/*.c ext/commonmarker/*.h"
         | 
| 61 62 | 
             
            end
         | 
| 62 63 |  | 
| 63 64 | 
             
            # Documentation
         | 
| 64 | 
            -
            require  | 
| 65 | 
            +
            require "rdoc/task"
         | 
| 65 66 |  | 
| 66 | 
            -
            desc  | 
| 67 | 
            +
            desc "Generate API documentation"
         | 
| 67 68 | 
             
            RDoc::Task.new do |rd|
         | 
| 68 | 
            -
              rd.rdoc_dir =  | 
| 69 | 
            -
              rd.main     =  | 
| 70 | 
            -
              rd.rdoc_files.include | 
| 71 | 
            -
             | 
| 72 | 
            -
              rd.options <<  | 
| 73 | 
            -
              rd.options <<  | 
| 74 | 
            -
              rd.options <<  | 
| 75 | 
            -
              rd.options <<  | 
| 76 | 
            -
              rd.options <<  | 
| 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  | 
| 80 | 
            +
            desc "Generate the documentation and run a web server"
         | 
| 80 81 | 
             
            task serve: [:rdoc] do
         | 
| 81 | 
            -
              require  | 
| 82 | 
            +
              require "webrick"
         | 
| 82 83 |  | 
| 83 | 
            -
              puts  | 
| 84 | 
            +
              puts "Navigate to http://localhost:3000 to see the docs"
         | 
| 84 85 |  | 
| 85 | 
            -
              server = WEBrick::HTTPServer.new | 
| 86 | 
            -
              server.mount | 
| 87 | 
            -
              trap( | 
| 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  | 
| 92 | 
            +
            desc "Generate and publish docs to gh-pages"
         | 
| 92 93 | 
             
            task publish: [:rdoc] do
         | 
| 93 | 
            -
              require  | 
| 94 | 
            -
              require  | 
| 94 | 
            +
              require "tmpdir"
         | 
| 95 | 
            +
              require "shellwords"
         | 
| 95 96 |  | 
| 96 97 | 
             
              Dir.mktmpdir do |tmp|
         | 
| 97 98 | 
             
                system "mv docs/* #{tmp}"
         | 
| 98 | 
            -
                system  | 
| 99 | 
            -
                system  | 
| 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  | 
| 103 | 
            +
                system "git add ."
         | 
| 103 104 | 
             
                system "git commit -am #{message}"
         | 
| 104 | 
            -
                system  | 
| 105 | 
            -
                system  | 
| 106 | 
            -
                system  | 
| 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 =  | 
| 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( | 
| 3 | 
            +
            lib = File.expand_path("lib", __dir__)
         | 
| 4 4 | 
             
            $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
         | 
| 5 | 
            -
            require  | 
| 5 | 
            +
            require "commonmarker/version"
         | 
| 6 6 |  | 
| 7 7 | 
             
            Gem::Specification.new do |s|
         | 
| 8 | 
            -
              s.name =  | 
| 8 | 
            +
              s.name = "commonmarker"
         | 
| 9 9 | 
             
              s.version = CommonMarker::VERSION
         | 
| 10 | 
            -
              s.summary =  | 
| 11 | 
            -
              s.description =  | 
| 12 | 
            -
              s.authors = [ | 
| 13 | 
            -
              s.homepage =  | 
| 14 | 
            -
              s.license =  | 
| 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         =  | 
| 17 | 
            -
              s.files        += Dir.glob( | 
| 18 | 
            -
              s.files        += Dir.glob( | 
| 19 | 
            -
              s. | 
| 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 = [ | 
| 23 | 
            -
              s.require_paths =  | 
| 24 | 
            -
              s.required_ruby_version = [ | 
| 21 | 
            +
              s.executables = ["commonmarker"]
         | 
| 22 | 
            +
              s.require_paths = ["lib", "ext"]
         | 
| 23 | 
            +
              s.required_ruby_version = [">= 2.6", "< 4.0"]
         | 
| 25 24 |  | 
| 26 | 
            -
              s. | 
| 25 | 
            +
              s.metadata["rubygems_mfa_required"] = "true"
         | 
| 27 26 |  | 
| 28 | 
            -
              s. | 
| 29 | 
            -
             | 
| 30 | 
            -
              s.add_development_dependency | 
| 31 | 
            -
              s.add_development_dependency | 
| 32 | 
            -
              s.add_development_dependency  | 
| 33 | 
            -
              s.add_development_dependency | 
| 34 | 
            -
              s.add_development_dependency | 
| 35 | 
            -
              s.add_development_dependency  | 
| 36 | 
            -
              s.add_development_dependency  | 
| 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
         | 
    
        data/ext/commonmarker/blocks.c
    CHANGED
    
    | @@ -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) |  | 
| 5 | 
            -
            #define CMARK_GFM_VERSION_STRING "0.29.0.gfm. | 
| 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 | 
            -
             | 
| 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 | 
            -
             | 
| 490 | 
            -
                   | 
| 491 | 
            -
                   | 
| 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 | 
| 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 | 
            -
               | 
| 123 | 
            +
              FIXNUM_P(rb_options);
         | 
| 124 | 
            +
              options = FIX2INT(rb_options);
         | 
| 125 | 
            +
             | 
| 125 126 | 
             
              Check_Type(rb_extensions, T_ARRAY);
         | 
| 126 127 |  | 
| 127 | 
            -
               | 
| 128 | 
            -
              extensions_len = RARRAY_LEN(rb_extensions);
         | 
| 128 | 
            +
              cmark_parser *parser = cmark_parser_new(options);
         | 
| 129 129 |  | 
| 130 | 
            -
               | 
| 131 | 
            -
             | 
| 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 * | 
| 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 | 
            -
               | 
| 161 | 
            +
              Check_Type(rb_text, T_STRING);
         | 
| 168 162 |  | 
| 169 | 
            -
               | 
| 170 | 
            -
              len = RSTRING_LEN(rb_text);
         | 
| 163 | 
            +
              parser = prepare_parser(rb_options, rb_extensions);
         | 
| 171 164 |  | 
| 172 | 
            -
              cmark_parser_feed(parser,  | 
| 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 | 
            -
                 | 
| 169 | 
            +
                cmark_parser_free(parser);
         | 
| 176 170 | 
             
                rb_raise(rb_eNodeError, "error parsing document");
         | 
| 177 171 | 
             
              }
         | 
| 178 172 |  | 
| 179 | 
            -
               | 
| 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 | 
            -
               | 
| 184 | 
            -
               | 
| 175 | 
            +
              cmark_parser_free(parser);
         | 
| 176 | 
            +
              cmark_node_free(doc);
         | 
| 185 177 |  | 
| 186 | 
            -
              return  | 
| 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 * | 
| 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 | 
            -
               | 
| 190 | 
            +
              Check_Type(rb_text, T_STRING);
         | 
| 202 191 |  | 
| 203 | 
            -
               | 
| 204 | 
            -
              len = RSTRING_LEN(rb_text);
         | 
| 192 | 
            +
              parser = prepare_parser(rb_options, rb_extensions);
         | 
| 205 193 |  | 
| 206 | 
            -
              cmark_parser_feed(parser,  | 
| 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 | 
            -
                 | 
| 198 | 
            +
                cmark_parser_free(parser);
         | 
| 210 199 | 
             
                rb_raise(rb_eNodeError, "error parsing document");
         | 
| 211 200 | 
             
              }
         | 
| 212 201 |  | 
| 213 | 
            -
               | 
| 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 | 
            -
               | 
| 218 | 
            -
               | 
| 204 | 
            +
              cmark_parser_free(parser);
         | 
| 205 | 
            +
              cmark_node_free(doc);
         | 
| 219 206 |  | 
| 220 | 
            -
              return  | 
| 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 | 
| 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 | 
| 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,
         |