class Redcarpet::Markdown - redcarpet-3.3.4 Documentation

# class Redcarpet::Markdown

### Attributes

renderer[R]

### Public Class Methods

new(p1, p2 = v2) click to toggle source

    static VALUE rb_redcarpet_md__new(int argc, VALUE *argv, VALUE klass)
    {
            VALUE rb_markdown, rb_rndr, hash;
            unsigned int extensions = 0;

            struct rb_redcarpet_rndr *rndr;
            struct sd_markdown *markdown;

            if (rb_scan_args(argc, argv, "11", &rb_rndr, &hash) == 2)
                    rb_redcarpet_md_flags(hash, &extensions);

            if (rb_obj_is_kind_of(rb_rndr, rb_cClass))
                    rb_rndr = rb_funcall(rb_rndr, rb_intern("new"), 0);

            if (!rb_obj_is_kind_of(rb_rndr, rb_cRenderBase))
                    rb_raise(rb_eTypeError, "Invalid Renderer instance given");

            Data_Get_Struct(rb_rndr, struct rb_redcarpet_rndr, rndr);

            markdown = sd_markdown_new(extensions, 16, &rndr->callbacks, &rndr->options);
            if (!markdown)
                    rb_raise(rb_eRuntimeError, "Failed to create new Renderer class");

            rb_markdown = Data_Wrap_Struct(klass, NULL, rb_redcarpet_md__free, markdown);
            rb_iv_set(rb_markdown, "@renderer", rb_rndr);

            return rb_markdown;
    }

### Public Instance Methods

render(p1) click to toggle source

    static VALUE rb_redcarpet_md_render(VALUE self, VALUE text)
    {
            VALUE rb_rndr;
            struct buf *output_buf;
            struct sd_markdown *markdown;

            Check_Type(text, T_STRING);

            rb_rndr = rb_iv_get(self, "@renderer");
            Data_Get_Struct(self, struct sd_markdown, markdown);

            if (rb_respond_to(rb_rndr, rb_intern("preprocess")))
                    text = rb_funcall(rb_rndr, rb_intern("preprocess"), 1, text);
            if (NIL_P(text))
                    return Qnil;

            struct rb_redcarpet_rndr *renderer;
            Data_Get_Struct(rb_rndr, struct rb_redcarpet_rndr, renderer);
            renderer->options.active_enc = rb_enc_get(text);

            /* initialize buffers */
            output_buf = bufnew(128);

            /* render the magic */
            sd_markdown_render(
                    output_buf,
                    (const uint8_t*)RSTRING_PTR(text),
                    RSTRING_LEN(text),
                    markdown);

            /* build the Ruby string */
            text = rb_enc_str_new((const char*)output_buf->data, output_buf->size, rb_enc_get(text));

            bufrelease(output_buf);

            if (rb_respond_to(rb_rndr, rb_intern("postprocess")))
                    text = rb_funcall(rb_rndr, rb_intern("postprocess"), 1, text);

            return text;
    }