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;
}