redcarpet 3.4.0 → 3.5.0
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 redcarpet might be problematic. Click here for more details.
- checksums.yaml +5 -5
- data/Gemfile +2 -2
- data/README.markdown +24 -23
- data/ext/redcarpet/autolink.c +0 -1
- data/ext/redcarpet/buffer.h +0 -1
- data/ext/redcarpet/houdini_html_e.c +0 -1
- data/ext/redcarpet/html.c +8 -5
- data/ext/redcarpet/html.h +1 -2
- data/ext/redcarpet/html_smartypants.c +17 -2
- data/ext/redcarpet/rc_markdown.c +12 -3
- data/ext/redcarpet/rc_render.c +20 -6
- data/lib/redcarpet.rb +1 -1
- data/lib/redcarpet/compat.rb +0 -2
- data/lib/redcarpet/render_strip.rb +1 -1
- data/redcarpet.gemspec +5 -5
- data/test/custom_render_test.rb +10 -0
- data/test/html_render_test.rb +9 -3
- data/test/html_toc_render_test.rb +31 -1
- data/test/redcarpet_bin_test.rb +2 -2
- data/test/smarty_html_test.rb +6 -0
- data/test/stripdown_render_test.rb +8 -0
- metadata +9 -10
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 | 
            -
             | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 2 | 
            +
            SHA256:
         | 
| 3 | 
            +
              metadata.gz: 0ab6ed54cafc5edbbd785307a772251508fe1a8c9d739e7b28a6f1b89e162dfb
         | 
| 4 | 
            +
              data.tar.gz: b6a8579180b8933a1181be7aeaf4e544e1161499dac1f4fb1c5f34f61585b971
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: bc2a7f4ceab2736677752bde915f9090cabad682cfc71fc680958852d71ae18bc902d8a71ba47453adf689b41e87413bee3d766a8470d333654b6808f5b96b09
         | 
| 7 | 
            +
              data.tar.gz: e2fb9c0596683da9b2b6c24597a58ebe2b62e958c1f21173a733d0344b6e671b78fedfc2171d7b5c3a1b945a7e0d355329a2d60aeadfe79616dc730d22904816
         | 
    
        data/Gemfile
    CHANGED
    
    
    
        data/README.markdown
    CHANGED
    
    | @@ -3,6 +3,7 @@ Redcarpet is written with sugar, spice and everything nice | |
| 3 3 |  | 
| 4 4 | 
             
            [](https://travis-ci.org/vmg/redcarpet)
         | 
| 5 5 | 
             
            [](https://www.versioneye.com/ruby/redcarpet)
         | 
| 6 | 
            +
            [](https://www.codetriage.com/vmg/redcarpet)
         | 
| 6 7 |  | 
| 7 8 | 
             
            Redcarpet is a Ruby library for Markdown processing that smells like
         | 
| 8 9 | 
             
            butterflies and popcorn.
         | 
| @@ -45,10 +46,10 @@ output. | |
| 45 46 | 
             
            The `Redcarpet::Markdown` object is encouraged to be instantiated once with the
         | 
| 46 47 | 
             
            required settings, and reused between parses.
         | 
| 47 48 |  | 
| 48 | 
            -
             | 
| 49 | 
            +
            ~~~~ ruby
         | 
| 49 50 | 
             
            # Initializes a Markdown parser
         | 
| 50 51 | 
             
            markdown = Redcarpet::Markdown.new(renderer, extensions = {})
         | 
| 51 | 
            -
             | 
| 52 | 
            +
            ~~~~
         | 
| 52 53 |  | 
| 53 54 | 
             
            Here, the `renderer` variable refers to a renderer object, inheriting
         | 
| 54 55 | 
             
            from `Redcarpet::Render::Base`. If the given object has not been
         | 
| @@ -59,10 +60,10 @@ Unlike in the RedCloth API, the text to render is passed as an argument | |
| 59 60 | 
             
            and not stored inside the `Markdown` instance, to encourage reusability.
         | 
| 60 61 | 
             
            Example:
         | 
| 61 62 |  | 
| 62 | 
            -
             | 
| 63 | 
            +
            ~~~~ ruby
         | 
| 63 64 | 
             
            markdown.render("This is *bongos*, indeed.")
         | 
| 64 65 | 
             
            # => "<p>This is <em>bongos</em>, indeed.</p>"
         | 
| 65 | 
            -
             | 
| 66 | 
            +
            ~~~~
         | 
| 66 67 |  | 
| 67 68 | 
             
            You can also specify a hash containing the Markdown extensions which the
         | 
| 68 69 | 
             
            parser will identify. The following extensions are accepted:
         | 
| @@ -119,9 +120,9 @@ within the document (e.g. `[^1]: This is a footnote.`). | |
| 119 120 |  | 
| 120 121 | 
             
            Example:
         | 
| 121 122 |  | 
| 122 | 
            -
             | 
| 123 | 
            +
            ~~~~ ruby
         | 
| 123 124 | 
             
            markdown = Redcarpet::Markdown.new(Redcarpet::Render::HTML, autolink: true, tables: true)
         | 
| 124 | 
            -
             | 
| 125 | 
            +
            ~~~~
         | 
| 125 126 |  | 
| 126 127 | 
             
            Darling, I packed you a couple renderers for lunch
         | 
| 127 128 | 
             
            --------------------------------------------------
         | 
| @@ -136,9 +137,9 @@ All the rendering flags that previously applied only to HTML output have | |
| 136 137 | 
             
            now been moved to the `Redcarpet::Render::HTML` class, and may be enabled when
         | 
| 137 138 | 
             
            instantiating the renderer:
         | 
| 138 139 |  | 
| 139 | 
            -
             | 
| 140 | 
            +
            ~~~~ ruby
         | 
| 140 141 | 
             
            Redcarpet::Render::HTML.new(render_options = {})
         | 
| 141 | 
            -
             | 
| 142 | 
            +
            ~~~~
         | 
| 142 143 |  | 
| 143 144 | 
             
            Initializes an HTML renderer. The following flags are available:
         | 
| 144 145 |  | 
| @@ -172,9 +173,9 @@ Markdown document had newlines (by default, Markdown ignores these newlines). | |
| 172 173 |  | 
| 173 174 | 
             
            Example:
         | 
| 174 175 |  | 
| 175 | 
            -
             | 
| 176 | 
            +
            ~~~~ ruby
         | 
| 176 177 | 
             
            renderer = Redcarpet::Render::HTML.new(no_links: true, hard_wrap: true)
         | 
| 177 | 
            -
             | 
| 178 | 
            +
            ~~~~
         | 
| 178 179 |  | 
| 179 180 |  | 
| 180 181 | 
             
            The `HTML` renderer has an alternate version, `Redcarpet::Render::HTML_TOC`,
         | 
| @@ -182,8 +183,8 @@ which will output a table of contents in HTML based on the headers of the | |
| 182 183 | 
             
            Markdown document.
         | 
| 183 184 |  | 
| 184 185 | 
             
            When instantiating this render object, you can optionally pass a `nesting_level`
         | 
| 185 | 
            -
            option which takes an integer and allows you to make it render only | 
| 186 | 
            -
             | 
| 186 | 
            +
            option which takes an integer or a range and allows you to make it render only
         | 
| 187 | 
            +
            headers at certain levels.
         | 
| 187 188 |  | 
| 188 189 | 
             
            Redcarpet also includes a plaintext renderer, `Redcarpet::Render::StripDown`, that
         | 
| 189 190 | 
             
            strips out all the formatting:
         | 
| @@ -205,7 +206,7 @@ And you can even cook your own | |
| 205 206 | 
             
            Custom renderers are created by inheriting from an existing renderer. The
         | 
| 206 207 | 
             
            built-in renderers, `HTML` and `XHTML` may be extended as such:
         | 
| 207 208 |  | 
| 208 | 
            -
             | 
| 209 | 
            +
            ~~~~ ruby
         | 
| 209 210 | 
             
            # Create a custom renderer that sets a custom class for block-quotes.
         | 
| 210 211 | 
             
            class CustomRender < Redcarpet::Render::HTML
         | 
| 211 212 | 
             
              def block_quote(quote)
         | 
| @@ -213,18 +214,18 @@ class CustomRender < Redcarpet::Render::HTML | |
| 213 214 | 
             
              end
         | 
| 214 215 | 
             
            end
         | 
| 215 216 |  | 
| 216 | 
            -
            markdown = Redcarpet::Markdown.new( | 
| 217 | 
            -
             | 
| 217 | 
            +
            markdown = Redcarpet::Markdown.new(CustomRender, fenced_code_blocks: true)
         | 
| 218 | 
            +
            ~~~~
         | 
| 218 219 |  | 
| 219 220 | 
             
            But new renderers can also be created from scratch by extending the abstract
         | 
| 220 221 | 
             
            base class `Redcarpet::Render::Base` (see `lib/redcarpet/render_man.rb` for
         | 
| 221 222 | 
             
            an example implementation of a Manpage renderer):
         | 
| 222 223 |  | 
| 223 | 
            -
             | 
| 224 | 
            +
            ~~~~ ruby
         | 
| 224 225 | 
             
            class ManPage < Redcarpet::Render::Base
         | 
| 225 226 | 
             
              # you get the drill -- keep going from here
         | 
| 226 227 | 
             
            end
         | 
| 227 | 
            -
             | 
| 228 | 
            +
            ~~~~
         | 
| 228 229 |  | 
| 229 230 | 
             
            The following instance methods may be implemented by the renderer:
         | 
| 230 231 |  | 
| @@ -312,7 +313,7 @@ or after the rendering process begins: | |
| 312 313 | 
             
            * postprocess(full_document)
         | 
| 313 314 |  | 
| 314 315 | 
             
            You can look at
         | 
| 315 | 
            -
            ["How to extend the Redcarpet 2 Markdown library?"](http://dev.af83.com/2012/02/27/howto-extend-the-redcarpet2-markdown-lib.html)
         | 
| 316 | 
            +
            ["How to extend the Redcarpet 2 Markdown library?"](https://web.archive.org/web/20170505231254/http://dev.af83.com/2012/02/27/howto-extend-the-redcarpet2-markdown-lib.html)
         | 
| 316 317 | 
             
            for some more explanations.
         | 
| 317 318 |  | 
| 318 319 | 
             
            Also, now our Pants are much smarter
         | 
| @@ -337,7 +338,7 @@ end | |
| 337 338 |  | 
| 338 339 | 
             
            # Standalone
         | 
| 339 340 | 
             
            Redcarpet::Render::SmartyPants.render("<p>Oh SmartyPants, you're so crazy...</p>")
         | 
| 340 | 
            -
             | 
| 341 | 
            +
            ~~~~
         | 
| 341 342 |  | 
| 342 343 | 
             
            SmartyPants works on top of already-rendered HTML, and will ignore replacements
         | 
| 343 344 | 
             
            inside the content of HTML tags and inside specific HTML blocks such as
         | 
| @@ -362,16 +363,16 @@ renderer-independent, the results will be completely unreliable! | |
| 362 363 | 
             
            Still, if major forces (let's say, tornadoes or other natural disasters) force you
         | 
| 363 364 | 
             
            to keep a Markdown-compatibility layer, Redcarpet also supports this:
         | 
| 364 365 |  | 
| 365 | 
            -
             | 
| 366 | 
            +
            ~~~~ ruby
         | 
| 366 367 | 
             
            require 'redcarpet/compat'
         | 
| 367 | 
            -
             | 
| 368 | 
            +
            ~~~~
         | 
| 368 369 |  | 
| 369 370 | 
             
            Requiring the compatibility library will declare a `Markdown` class with the
         | 
| 370 371 | 
             
            classical RedCloth API, e.g.
         | 
| 371 372 |  | 
| 372 | 
            -
             | 
| 373 | 
            +
            ~~~~ ruby
         | 
| 373 374 | 
             
            Markdown.new('this is my text').to_html
         | 
| 374 | 
            -
             | 
| 375 | 
            +
            ~~~~
         | 
| 375 376 |  | 
| 376 377 | 
             
            This class renders 100% standards compliant Markdown with 0 extensions. Nada.
         | 
| 377 378 | 
             
            Don't even try to enable extensions with a compatibility layer, because
         | 
    
        data/ext/redcarpet/autolink.c
    CHANGED
    
    
    
        data/ext/redcarpet/buffer.h
    CHANGED
    
    
    
        data/ext/redcarpet/html.c
    CHANGED
    
    | @@ -326,7 +326,8 @@ rndr_header(struct buf *ob, const struct buf *text, int level, void *opaque) | |
| 326 326 | 
             
            	if (ob->size)
         | 
| 327 327 | 
             
            		bufputc(ob, '\n');
         | 
| 328 328 |  | 
| 329 | 
            -
            	if ((options->flags & HTML_TOC) &&  | 
| 329 | 
            +
            	if ((options->flags & HTML_TOC) && level >= options->toc_data.nesting_bounds[0] &&
         | 
| 330 | 
            +
            	     level <= options->toc_data.nesting_bounds[1]) {
         | 
| 330 331 | 
             
            		bufprintf(ob, "<h%d id=\"", level);
         | 
| 331 332 | 
             
            		rndr_header_anchor(ob, text);
         | 
| 332 333 | 
             
            		BUFPUTSL(ob, "\">");
         | 
| @@ -655,7 +656,7 @@ rndr_footnote_def(struct buf *ob, const struct buf *text, unsigned int num, void | |
| 655 656 | 
             
            	bufprintf(ob, "\n<li id=\"fn%d\">\n", num);
         | 
| 656 657 | 
             
            	if (pfound) {
         | 
| 657 658 | 
             
            		bufput(ob, text->data, i);
         | 
| 658 | 
            -
            		bufprintf(ob, " <a href=\"#fnref%d\" | 
| 659 | 
            +
            		bufprintf(ob, " <a href=\"#fnref%d\">↩</a>", num);
         | 
| 659 660 | 
             
            		bufput(ob, text->data + i, text->size - i);
         | 
| 660 661 | 
             
            	} else if (text) {
         | 
| 661 662 | 
             
            		bufput(ob, text->data, text->size);
         | 
| @@ -666,7 +667,7 @@ rndr_footnote_def(struct buf *ob, const struct buf *text, unsigned int num, void | |
| 666 667 | 
             
            static int
         | 
| 667 668 | 
             
            rndr_footnote_ref(struct buf *ob, unsigned int num, void *opaque)
         | 
| 668 669 | 
             
            {
         | 
| 669 | 
            -
            	bufprintf(ob, "<sup id=\"fnref%d\"><a href=\"#fn%d\" | 
| 670 | 
            +
            	bufprintf(ob, "<sup id=\"fnref%d\"><a href=\"#fn%d\">%d</a></sup>", num, num, num);
         | 
| 670 671 | 
             
            	return 1;
         | 
| 671 672 | 
             
            }
         | 
| 672 673 |  | 
| @@ -675,7 +676,8 @@ toc_header(struct buf *ob, const struct buf *text, int level, void *opaque) | |
| 675 676 | 
             
            {
         | 
| 676 677 | 
             
            	struct html_renderopt *options = opaque;
         | 
| 677 678 |  | 
| 678 | 
            -
            	if (level  | 
| 679 | 
            +
            	if (level >= options->toc_data.nesting_bounds[0] &&
         | 
| 680 | 
            +
            	    level <= options->toc_data.nesting_bounds[1]) {
         | 
| 679 681 | 
             
            		/* set the level offset if this is the first header
         | 
| 680 682 | 
             
            		 * we're parsing for the document */
         | 
| 681 683 | 
             
            		if (options->toc_data.current_level == 0)
         | 
| @@ -824,7 +826,8 @@ sdhtml_renderer(struct sd_callbacks *callbacks, struct html_renderopt *options, | |
| 824 826 | 
             
            	/* Prepare the options pointer */
         | 
| 825 827 | 
             
            	memset(options, 0x0, sizeof(struct html_renderopt));
         | 
| 826 828 | 
             
            	options->flags = render_flags;
         | 
| 827 | 
            -
            	options->toc_data. | 
| 829 | 
            +
            	options->toc_data.nesting_bounds[0] = 1;
         | 
| 830 | 
            +
            	options->toc_data.nesting_bounds[1] = 6;
         | 
| 828 831 |  | 
| 829 832 | 
             
            	/* Prepare the callbacks */
         | 
| 830 833 | 
             
            	memcpy(callbacks, &cb_default, sizeof(struct sd_callbacks));
         | 
    
        data/ext/redcarpet/html.h
    CHANGED
    
    | @@ -35,7 +35,7 @@ struct html_renderopt { | |
| 35 35 | 
             
            	struct {
         | 
| 36 36 | 
             
            		int current_level;
         | 
| 37 37 | 
             
            		int level_offset;
         | 
| 38 | 
            -
            		int  | 
| 38 | 
            +
            		int nesting_bounds[2];
         | 
| 39 39 | 
             
            	} toc_data;
         | 
| 40 40 |  | 
| 41 41 | 
             
            	unsigned int flags;
         | 
| @@ -81,4 +81,3 @@ sdhtml_smartypants(struct buf *ob, const uint8_t *text, size_t size); | |
| 81 81 | 
             
            #endif
         | 
| 82 82 |  | 
| 83 83 | 
             
            #endif
         | 
| 84 | 
            -
             | 
| @@ -341,6 +341,7 @@ smartypants_cb__ltag(struct buf *ob, struct smartypants_data *smrt, uint8_t prev | |
| 341 341 | 
             
            	};
         | 
| 342 342 | 
             
            	static const size_t skip_tags_count = 8;
         | 
| 343 343 |  | 
| 344 | 
            +
            	size_t next_to_closing_a = 0;
         | 
| 344 345 | 
             
            	size_t tag, i = 0;
         | 
| 345 346 |  | 
| 346 347 | 
             
            	while (i < size && text[i] != '>')
         | 
| @@ -369,7 +370,23 @@ smartypants_cb__ltag(struct buf *ob, struct smartypants_data *smrt, uint8_t prev | |
| 369 370 | 
             
            			i++;
         | 
| 370 371 | 
             
            	}
         | 
| 371 372 |  | 
| 373 | 
            +
            	if (sdhtml_is_tag(text, size, "a") == HTML_TAG_CLOSE) {
         | 
| 374 | 
            +
            		while (i < size && text[i] != '>')
         | 
| 375 | 
            +
            			i++;
         | 
| 376 | 
            +
             | 
| 377 | 
            +
            		next_to_closing_a = 1;
         | 
| 378 | 
            +
            	}
         | 
| 379 | 
            +
             | 
| 372 380 | 
             
            	bufput(ob, text, i + 1);
         | 
| 381 | 
            +
             | 
| 382 | 
            +
            	// Pretty tricky: since people may refer to something or someone
         | 
| 383 | 
            +
            	// with a link but use the possessive form right after it, we need
         | 
| 384 | 
            +
            	// to check whether a single quote is next to a closing "</a"> tag.
         | 
| 385 | 
            +
            	if (next_to_closing_a && strncmp("'", text+(i+1), 5) == 0) {
         | 
| 386 | 
            +
            		bufput(ob, "’", 7);
         | 
| 387 | 
            +
            		i += 5;
         | 
| 388 | 
            +
            	}
         | 
| 389 | 
            +
             | 
| 373 390 | 
             
            	return i;
         | 
| 374 391 | 
             
            }
         | 
| 375 392 |  | 
| @@ -453,5 +470,3 @@ sdhtml_smartypants(struct buf *ob, const uint8_t *text, size_t size) | |
| 453 470 | 
             
            		}
         | 
| 454 471 | 
             
            	}
         | 
| 455 472 | 
             
            }
         | 
| 456 | 
            -
             | 
| 457 | 
            -
             | 
    
        data/ext/redcarpet/rc_markdown.c
    CHANGED
    
    | @@ -24,6 +24,7 @@ | |
| 24 24 |  | 
| 25 25 | 
             
            VALUE rb_mRedcarpet;
         | 
| 26 26 | 
             
            VALUE rb_cMarkdown;
         | 
| 27 | 
            +
            VALUE rb_cRenderHTML_TOC;
         | 
| 27 28 |  | 
| 28 29 | 
             
            extern VALUE rb_cRenderBase;
         | 
| 29 30 |  | 
| @@ -101,12 +102,21 @@ static VALUE rb_redcarpet_md__new(int argc, VALUE *argv, VALUE klass) | |
| 101 102 | 
             
            	if (!rb_obj_is_kind_of(rb_rndr, rb_cRenderBase))
         | 
| 102 103 | 
             
            		rb_raise(rb_eTypeError, "Invalid Renderer instance given");
         | 
| 103 104 |  | 
| 105 | 
            +
            	/**
         | 
| 106 | 
            +
            	 * Automatically enable the `fenced_code_blocks` option if
         | 
| 107 | 
            +
            	 * given a kind of `HTML_TOC` object since many languages
         | 
| 108 | 
            +
            	 * like Ruby use the sharp to comment code so these comments
         | 
| 109 | 
            +
            	 * would be processed as titles.
         | 
| 110 | 
            +
            	 */
         | 
| 111 | 
            +
            	if (rb_obj_is_kind_of(rb_rndr, rb_cRenderHTML_TOC))
         | 
| 112 | 
            +
            		extensions |= MKDEXT_FENCED_CODE;
         | 
| 113 | 
            +
             | 
| 104 114 | 
             
            	Data_Get_Struct(rb_rndr, struct rb_redcarpet_rndr, rndr);
         | 
| 105 115 |  | 
| 106 116 | 
             
            	/* Merge the current options in the @options hash */
         | 
| 107 117 | 
             
            	if (hash != Qnil) {
         | 
| 108 | 
            -
            		rndr_options = rb_iv_get(rb_rndr, "@options");
         | 
| 109 | 
            -
            		 | 
| 118 | 
            +
            		rndr_options = rb_funcall(rb_iv_get(rb_rndr, "@options"), rb_intern("merge"), 1, hash);
         | 
| 119 | 
            +
            		rb_iv_set(rb_rndr, "@options", rndr_options);
         | 
| 110 120 | 
             
            	}
         | 
| 111 121 |  | 
| 112 122 | 
             
            	markdown = sd_markdown_new(extensions, 16, &rndr->callbacks, &rndr->options);
         | 
| @@ -171,4 +181,3 @@ void Init_redcarpet() | |
| 171 181 |  | 
| 172 182 | 
             
            	Init_redcarpet_rndr();
         | 
| 173 183 | 
             
            }
         | 
| 174 | 
            -
             | 
    
        data/ext/redcarpet/rc_render.c
    CHANGED
    
    | @@ -40,10 +40,10 @@ | |
| 40 40 | 
             
            }
         | 
| 41 41 |  | 
| 42 42 | 
             
            extern VALUE rb_mRedcarpet;
         | 
| 43 | 
            +
            extern VALUE rb_cRenderHTML_TOC;
         | 
| 43 44 | 
             
            VALUE rb_mRender;
         | 
| 44 45 | 
             
            VALUE rb_cRenderBase;
         | 
| 45 46 | 
             
            VALUE rb_cRenderHTML;
         | 
| 46 | 
            -
            VALUE rb_cRenderHTML_TOC;
         | 
| 47 47 | 
             
            VALUE rb_mSmartyPants;
         | 
| 48 48 |  | 
| 49 49 | 
             
            #define buf2str(t) ((t) ? rb_enc_str_new((const char*)(t)->data, (t)->size, opt->active_enc) : Qnil)
         | 
| @@ -390,6 +390,7 @@ static VALUE rb_redcarpet_rbase_alloc(VALUE klass) | |
| 390 390 | 
             
            static void rb_redcarpet__overload(VALUE self, VALUE base_class)
         | 
| 391 391 | 
             
            {
         | 
| 392 392 | 
             
            	struct rb_redcarpet_rndr *rndr;
         | 
| 393 | 
            +
            	VALUE options_ivar;
         | 
| 393 394 |  | 
| 394 395 | 
             
            	Data_Get_Struct(self, struct rb_redcarpet_rndr, rndr);
         | 
| 395 396 | 
             
            	rndr->options.self = self;
         | 
| @@ -411,7 +412,8 @@ static void rb_redcarpet__overload(VALUE self, VALUE base_class) | |
| 411 412 | 
             
            		}
         | 
| 412 413 | 
             
            	}
         | 
| 413 414 |  | 
| 414 | 
            -
            	 | 
| 415 | 
            +
            	options_ivar = rb_attr_get(self, rb_intern("@options"));
         | 
| 416 | 
            +
            	if (options_ivar == Qundef || options_ivar == Qnil)
         | 
| 415 417 | 
             
            		rb_iv_set(self, "@options", rb_hash_new());
         | 
| 416 418 | 
             
            }
         | 
| 417 419 |  | 
| @@ -511,10 +513,22 @@ static VALUE rb_redcarpet_htmltoc_init(int argc, VALUE *argv, VALUE self) | |
| 511 513 | 
             
            	sdhtml_toc_renderer(&rndr->callbacks, (struct html_renderopt *)&rndr->options.html, render_flags);
         | 
| 512 514 | 
             
            	rb_redcarpet__overload(self, rb_cRenderHTML_TOC);
         | 
| 513 515 |  | 
| 514 | 
            -
            	 | 
| 515 | 
            -
             | 
| 516 | 
            -
            	 | 
| 517 | 
            -
             | 
| 516 | 
            +
            	/* Check whether we are dealing with a Range object by
         | 
| 517 | 
            +
            	   checking whether the object responds to min and max */
         | 
| 518 | 
            +
            	if (rb_respond_to(nesting_level, rb_intern("min")) &&
         | 
| 519 | 
            +
            	    rb_respond_to(nesting_level, rb_intern("max"))) {
         | 
| 520 | 
            +
            		int min = NUM2INT(rb_funcall(nesting_level, rb_intern("min"), 0));
         | 
| 521 | 
            +
            		int max = NUM2INT(rb_funcall(nesting_level, rb_intern("max"), 0));
         | 
| 522 | 
            +
             | 
| 523 | 
            +
            		rndr->options.html.toc_data.nesting_bounds[0] = min;
         | 
| 524 | 
            +
            		rndr->options.html.toc_data.nesting_bounds[1] = max;
         | 
| 525 | 
            +
            	} else if (FIXNUM_P(nesting_level)) {
         | 
| 526 | 
            +
            		rndr->options.html.toc_data.nesting_bounds[0] = 1;
         | 
| 527 | 
            +
            		rndr->options.html.toc_data.nesting_bounds[1] = NUM2INT(nesting_level);
         | 
| 528 | 
            +
            	} else {
         | 
| 529 | 
            +
            		rndr->options.html.toc_data.nesting_bounds[0] = 1;
         | 
| 530 | 
            +
            		rndr->options.html.toc_data.nesting_bounds[1] = 6;
         | 
| 531 | 
            +
            	}
         | 
| 518 532 |  | 
| 519 533 | 
             
            	return Qnil;
         | 
| 520 534 | 
             
            }
         | 
    
        data/lib/redcarpet.rb
    CHANGED
    
    
    
        data/lib/redcarpet/compat.rb
    CHANGED
    
    
| @@ -13,7 +13,7 @@ module Redcarpet | |
| 13 13 | 
             
                    :autolink, :codespan, :double_emphasis,
         | 
| 14 14 | 
             
                    :emphasis, :underline, :raw_html,
         | 
| 15 15 | 
             
                    :triple_emphasis, :strikethrough,
         | 
| 16 | 
            -
                    :superscript, :highlight,
         | 
| 16 | 
            +
                    :superscript, :highlight, :quote,
         | 
| 17 17 |  | 
| 18 18 | 
             
                    # footnotes
         | 
| 19 19 | 
             
                    :footnotes, :footnote_def, :footnote_ref,
         | 
    
        data/redcarpet.gemspec
    CHANGED
    
    | @@ -1,10 +1,10 @@ | |
| 1 1 | 
             
            # encoding: utf-8
         | 
| 2 2 | 
             
            Gem::Specification.new do |s|
         | 
| 3 3 | 
             
              s.name = 'redcarpet'
         | 
| 4 | 
            -
              s.version = '3. | 
| 4 | 
            +
              s.version = '3.5.0'
         | 
| 5 5 | 
             
              s.summary = "Markdown that smells nice"
         | 
| 6 6 | 
             
              s.description = 'A fast, safe and extensible Markdown to (X)HTML parser'
         | 
| 7 | 
            -
              s.date = ' | 
| 7 | 
            +
              s.date = '2019-07-29'
         | 
| 8 8 | 
             
              s.email = 'vicent@github.com'
         | 
| 9 9 | 
             
              s.homepage = 'http://github.com/vmg/redcarpet'
         | 
| 10 10 | 
             
              s.authors = ["Natacha Porté", "Vicent Martí"]
         | 
| @@ -65,7 +65,7 @@ Gem::Specification.new do |s| | |
| 65 65 | 
             
              s.executables = ["redcarpet"]
         | 
| 66 66 | 
             
              s.require_paths = ["lib"]
         | 
| 67 67 |  | 
| 68 | 
            -
              s.add_development_dependency "rake", "~>  | 
| 69 | 
            -
              s.add_development_dependency "rake-compiler", "~> 0. | 
| 70 | 
            -
              s.add_development_dependency "test-unit", "~> 3. | 
| 68 | 
            +
              s.add_development_dependency "rake", "~> 12.2.1"
         | 
| 69 | 
            +
              s.add_development_dependency "rake-compiler", "~> 1.0.3"
         | 
| 70 | 
            +
              s.add_development_dependency "test-unit", "~> 3.2.3"
         | 
| 71 71 | 
             
            end
         | 
    
        data/test/custom_render_test.rb
    CHANGED
    
    | @@ -36,6 +36,16 @@ class CustomRenderTest < Redcarpet::TestCase | |
| 36 36 | 
             
                assert_match "no_intra_emphasis", output
         | 
| 37 37 | 
             
              end
         | 
| 38 38 |  | 
| 39 | 
            +
              def test_original_options_hash_is_not_mutated
         | 
| 40 | 
            +
                options = { with_toc_data: true }
         | 
| 41 | 
            +
                render  = SimpleRender.new(options)
         | 
| 42 | 
            +
                parser  = Redcarpet::Markdown.new(render, tables: true)
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                computed_options = render.instance_variable_get(:"@options")
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                refute_equal computed_options.object_id, options.object_id
         | 
| 47 | 
            +
              end
         | 
| 48 | 
            +
             | 
| 39 49 | 
             
              class NilPreprocessRenderer < Redcarpet::Render::HTML
         | 
| 40 50 | 
             
                def preprocess(fulldoc)
         | 
| 41 51 | 
             
                  nil
         | 
    
        data/test/html_render_test.rb
    CHANGED
    
    | @@ -140,14 +140,14 @@ class HTMLRenderTest < Redcarpet::TestCase | |
| 140 140 | 
             
                Markdown
         | 
| 141 141 |  | 
| 142 142 | 
             
                html = <<-HTML.chomp.strip_heredoc
         | 
| 143 | 
            -
                  <p>This is a footnote.<sup id="fnref1"><a href="#fn1" | 
| 143 | 
            +
                  <p>This is a footnote.<sup id="fnref1"><a href="#fn1">1</a></sup></p>
         | 
| 144 144 |  | 
| 145 145 | 
             
                  <div class="footnotes">
         | 
| 146 146 | 
             
                  <hr>
         | 
| 147 147 | 
             
                  <ol>
         | 
| 148 148 |  | 
| 149 149 | 
             
                  <li id="fn1">
         | 
| 150 | 
            -
                  <p>It provides additional information. <a href="#fnref1" | 
| 150 | 
            +
                  <p>It provides additional information. <a href="#fnref1">↩</a></p>
         | 
| 151 151 | 
             
                  </li>
         | 
| 152 152 |  | 
| 153 153 | 
             
                  </ol>
         | 
| @@ -254,7 +254,13 @@ class HTMLRenderTest < Redcarpet::TestCase | |
| 254 254 |  | 
| 255 255 | 
             
              def test_utf8_only_header_anchors
         | 
| 256 256 | 
             
                markdown = "# 見出し"
         | 
| 257 | 
            -
                 | 
| 257 | 
            +
                if 1.size == 4 # 32-bit architecture
         | 
| 258 | 
            +
                  html = "<h1 id=\"part-a194139f\">見出し</h1>"
         | 
| 259 | 
            +
                elsif 1.size == 8 # 64-bit architecture
         | 
| 260 | 
            +
                  html = "<h1 id=\"part-37870bfa194139f\">見出し</h1>"
         | 
| 261 | 
            +
                else
         | 
| 262 | 
            +
                  raise "unknown integer size"
         | 
| 263 | 
            +
                end
         | 
| 258 264 |  | 
| 259 265 | 
             
                assert_equal html, render(markdown, with: [:with_toc_data])
         | 
| 260 266 | 
             
              end
         | 
| @@ -33,6 +33,20 @@ class HTMLTOCRenderTest < Redcarpet::TestCase | |
| 33 33 | 
             
                assert !output.include?("A sub-sub title")
         | 
| 34 34 | 
             
              end
         | 
| 35 35 |  | 
| 36 | 
            +
              def test_granular_toc_render_with_range
         | 
| 37 | 
            +
                output = render(@markdown, with: { nesting_level: 2..5 }).strip
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                assert output.start_with?("<ul>")
         | 
| 40 | 
            +
                assert output.end_with?("</ul>")
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                assert output.match("Another one")
         | 
| 43 | 
            +
                assert output.match("A sub-sub-title")
         | 
| 44 | 
            +
                assert output.match("見出し")
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                refute output.match("A title")
         | 
| 47 | 
            +
                refute output.match("A really tiny title")
         | 
| 48 | 
            +
              end
         | 
| 49 | 
            +
             | 
| 36 50 | 
             
              def test_toc_heading_id
         | 
| 37 51 | 
             
                output = render(@markdown)
         | 
| 38 52 |  | 
| @@ -40,7 +54,8 @@ class HTMLTOCRenderTest < Redcarpet::TestCase | |
| 40 54 | 
             
                assert_match /a-nice-subtitle/, output
         | 
| 41 55 | 
             
                assert_match /another-one/, output
         | 
| 42 56 | 
             
                assert_match /a-sub-sub-title/, output
         | 
| 43 | 
            -
                 | 
| 57 | 
            +
                # the part number length varies depending on architecture (32b or 64b)
         | 
| 58 | 
            +
                assert_match /part-(37870bf)?a194139f/, output
         | 
| 44 59 | 
             
              end
         | 
| 45 60 |  | 
| 46 61 | 
             
              def test_toc_heading_with_hyphen_and_equal
         | 
| @@ -79,4 +94,19 @@ class HTMLTOCRenderTest < Redcarpet::TestCase | |
| 79 94 | 
             
                assert_match "<strong>", output
         | 
| 80 95 | 
             
                assert_no_match %r{<strong>}, output
         | 
| 81 96 | 
             
              end
         | 
| 97 | 
            +
             | 
| 98 | 
            +
              def test_ignoring_fenced_code_blocks_comments
         | 
| 99 | 
            +
                markdown = <<-Markdown.strip_heredoc
         | 
| 100 | 
            +
                # Hello world !
         | 
| 101 | 
            +
             | 
| 102 | 
            +
                ~~~ruby
         | 
| 103 | 
            +
                # This is a comment
         | 
| 104 | 
            +
                ~~~
         | 
| 105 | 
            +
                Markdown
         | 
| 106 | 
            +
             | 
| 107 | 
            +
                output = render(markdown)
         | 
| 108 | 
            +
             | 
| 109 | 
            +
                assert output.match("Hello world")
         | 
| 110 | 
            +
                refute output.match("This is a comment")
         | 
| 111 | 
            +
              end
         | 
| 82 112 | 
             
            end
         | 
    
        data/test/redcarpet_bin_test.rb
    CHANGED
    
    | @@ -64,8 +64,8 @@ class RedcarpetBinTest < Redcarpet::TestCase | |
| 64 64 |  | 
| 65 65 | 
             
              def run_bin(*args)
         | 
| 66 66 | 
             
                bin_path = File.expand_path('../../bin/redcarpet', __FILE__)
         | 
| 67 | 
            -
                ruby =  | 
| 68 | 
            -
                IO.popen("#{ruby}#{bin_path} #{args.join(" ")}") do |stream|
         | 
| 67 | 
            +
                ruby = RbConfig.ruby
         | 
| 68 | 
            +
                IO.popen("#{ruby} #{bin_path} #{args.join(" ")}") do |stream|
         | 
| 69 69 | 
             
                  @output = stream.read
         | 
| 70 70 | 
             
                end
         | 
| 71 71 | 
             
              end
         | 
    
        data/test/smarty_html_test.rb
    CHANGED
    
    | @@ -42,4 +42,10 @@ class SmartyHTMLTest < Redcarpet::TestCase | |
| 42 42 | 
             
                expected = "It's a test of "code""
         | 
| 43 43 | 
             
                assert rd.include?(expected), "\"#{rd}\" should contain \"#{expected}\""
         | 
| 44 44 | 
             
              end
         | 
| 45 | 
            +
             | 
| 46 | 
            +
              def test_that_smartyhtml_ignores_links_for_single_quotes
         | 
| 47 | 
            +
                output = render("[John](link)'s cat")
         | 
| 48 | 
            +
                expected = %(<p><a href="link">John</a>’s cat</p>)
         | 
| 49 | 
            +
                assert_equal expected, output
         | 
| 50 | 
            +
              end
         | 
| 45 51 | 
             
            end
         | 
| @@ -58,4 +58,12 @@ class StripDownRender < Redcarpet::TestCase | |
| 58 58 |  | 
| 59 59 | 
             
                assert_equal expected, output
         | 
| 60 60 | 
             
              end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
              def test_with_quote_option_enabled
         | 
| 63 | 
            +
                markdown = %(A common idiom is "Hello world")
         | 
| 64 | 
            +
                expected = %(A common idiom is Hello world)
         | 
| 65 | 
            +
                output   = render(markdown, with: [:quote])
         | 
| 66 | 
            +
             | 
| 67 | 
            +
                assert_equal expected, output
         | 
| 68 | 
            +
              end
         | 
| 61 69 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: redcarpet
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 3. | 
| 4 | 
            +
              version: 3.5.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Natacha Porté
         | 
| @@ -9,7 +9,7 @@ authors: | |
| 9 9 | 
             
            autorequire: 
         | 
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date:  | 
| 12 | 
            +
            date: 2019-07-29 00:00:00.000000000 Z
         | 
| 13 13 | 
             
            dependencies:
         | 
| 14 14 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 15 | 
             
              name: rake
         | 
| @@ -17,42 +17,42 @@ dependencies: | |
| 17 17 | 
             
                requirements:
         | 
| 18 18 | 
             
                - - "~>"
         | 
| 19 19 | 
             
                  - !ruby/object:Gem::Version
         | 
| 20 | 
            -
                    version:  | 
| 20 | 
            +
                    version: 12.2.1
         | 
| 21 21 | 
             
              type: :development
         | 
| 22 22 | 
             
              prerelease: false
         | 
| 23 23 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 24 24 | 
             
                requirements:
         | 
| 25 25 | 
             
                - - "~>"
         | 
| 26 26 | 
             
                  - !ruby/object:Gem::Version
         | 
| 27 | 
            -
                    version:  | 
| 27 | 
            +
                    version: 12.2.1
         | 
| 28 28 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 29 29 | 
             
              name: rake-compiler
         | 
| 30 30 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 31 31 | 
             
                requirements:
         | 
| 32 32 | 
             
                - - "~>"
         | 
| 33 33 | 
             
                  - !ruby/object:Gem::Version
         | 
| 34 | 
            -
                    version: 0. | 
| 34 | 
            +
                    version: 1.0.3
         | 
| 35 35 | 
             
              type: :development
         | 
| 36 36 | 
             
              prerelease: false
         | 
| 37 37 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 38 38 | 
             
                requirements:
         | 
| 39 39 | 
             
                - - "~>"
         | 
| 40 40 | 
             
                  - !ruby/object:Gem::Version
         | 
| 41 | 
            -
                    version: 0. | 
| 41 | 
            +
                    version: 1.0.3
         | 
| 42 42 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 43 43 | 
             
              name: test-unit
         | 
| 44 44 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 45 45 | 
             
                requirements:
         | 
| 46 46 | 
             
                - - "~>"
         | 
| 47 47 | 
             
                  - !ruby/object:Gem::Version
         | 
| 48 | 
            -
                    version: 3. | 
| 48 | 
            +
                    version: 3.2.3
         | 
| 49 49 | 
             
              type: :development
         | 
| 50 50 | 
             
              prerelease: false
         | 
| 51 51 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 52 52 | 
             
                requirements:
         | 
| 53 53 | 
             
                - - "~>"
         | 
| 54 54 | 
             
                  - !ruby/object:Gem::Version
         | 
| 55 | 
            -
                    version: 3. | 
| 55 | 
            +
                    version: 3.2.3
         | 
| 56 56 | 
             
            description: A fast, safe and extensible Markdown to (X)HTML parser
         | 
| 57 57 | 
             
            email: vicent@github.com
         | 
| 58 58 | 
             
            executables:
         | 
| @@ -126,8 +126,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 126 126 | 
             
                - !ruby/object:Gem::Version
         | 
| 127 127 | 
             
                  version: '0'
         | 
| 128 128 | 
             
            requirements: []
         | 
| 129 | 
            -
             | 
| 130 | 
            -
            rubygems_version: 2.5.2
         | 
| 129 | 
            +
            rubygems_version: 3.0.3
         | 
| 131 130 | 
             
            signing_key: 
         | 
| 132 131 | 
             
            specification_version: 4
         | 
| 133 132 | 
             
            summary: Markdown that smells nice
         |