static VALUE rb_redcarpet_htmltoc_init(int argc, VALUE *argv, VALUE self) { struct rb_redcarpet_rndr *rndr; unsigned int render_flags = HTML_TOC; VALUE hash, nesting_level = Qnil; Data_Get_Struct(self, struct rb_redcarpet_rndr, rndr); if (rb_scan_args(argc, argv, "01", &hash) == 1) { Check_Type(hash, T_HASH); /* escape_html */ if (rb_hash_aref(hash, CSTR2SYM("escape_html")) == Qtrue) render_flags |= HTML_ESCAPE; /* Nesting level */ nesting_level = rb_hash_aref(hash, CSTR2SYM("nesting_level")); } sdhtml_toc_renderer(&rndr->callbacks, (struct html_renderopt *)&rndr->options.html, render_flags); rb_redcarpet__overload(self, rb_cRenderHTML_TOC); if (!(NIL_P(nesting_level))) rndr->options.html.toc_data.nesting_level = NUM2INT(nesting_level); else rndr->options.html.toc_data.nesting_level = 6; return Qnil; }
static struct sd_markdown* make_custom_renderer(struct module_state* state, const unsigned int renderflags, const unsigned int markdownflags, int toc_renderer) { if(toc_renderer) { sdhtml_toc_renderer(&state->callbacks, (struct html_renderopt *)&state->options); } else { sdhtml_renderer(&state->callbacks, (struct html_renderopt *)&state->options, renderflags); } state->options.html.link_attributes = &snudown_link_attr; state->options.html.html_element_whitelist = html_element_whitelist; state->options.html.html_attr_whitelist = html_attr_whitelist; return sd_markdown_new( markdownflags, 16, 64, &state->callbacks, &state->options ); }
static VALUE rb_redcarpet_htmltoc_init(VALUE self) { struct rb_redcarpet_rndr *rndr; Data_Get_Struct(self, struct rb_redcarpet_rndr, rndr); sdhtml_toc_renderer(&rndr->callbacks, (struct html_renderopt *)&rndr->options.html); rb_redcarpet__overload(self, rb_cRenderHTML_TOC); return Qnil; }
static VALUE rb_redcarpet_htmltoc_init(int argc, VALUE *argv, VALUE self) { struct rb_redcarpet_rndr *rndr; unsigned int render_flags = HTML_TOC; VALUE hash, nesting_level = Qnil; Data_Get_Struct(self, struct rb_redcarpet_rndr, rndr); if (rb_scan_args(argc, argv, "01", &hash) == 1) { Check_Type(hash, T_HASH); /* Give access to the passed options through `@options` */ rb_iv_set(self, "@options", hash); /* escape_html */ if (rb_hash_aref(hash, CSTR2SYM("escape_html")) == Qtrue) render_flags |= HTML_ESCAPE; /* Nesting level */ nesting_level = rb_hash_aref(hash, CSTR2SYM("nesting_level")); } sdhtml_toc_renderer(&rndr->callbacks, (struct html_renderopt *)&rndr->options.html, render_flags); rb_redcarpet__overload(self, rb_cRenderHTML_TOC); /* Check whether we are dealing with a Range object by checking whether the object responds to min and max */ if (rb_respond_to(nesting_level, rb_intern("min")) && rb_respond_to(nesting_level, rb_intern("max"))) { int min = NUM2INT(rb_funcall(nesting_level, rb_intern("min"), 0)); int max = NUM2INT(rb_funcall(nesting_level, rb_intern("max"), 0)); rndr->options.html.toc_data.nesting_bounds[0] = min; rndr->options.html.toc_data.nesting_bounds[1] = max; } else if (FIXNUM_P(nesting_level)) { rndr->options.html.toc_data.nesting_bounds[0] = 1; rndr->options.html.toc_data.nesting_bounds[1] = NUM2INT(nesting_level); } else { rndr->options.html.toc_data.nesting_bounds[0] = 1; rndr->options.html.toc_data.nesting_bounds[1] = 6; } return Qnil; }
static VALUE rb_redcarpet_htmltoc_init(int argc, VALUE *argv, VALUE self) { struct rb_redcarpet_rndr *rndr; int nesting_level = 6; VALUE hash, key = Qnil; Data_Get_Struct(self, struct rb_redcarpet_rndr, rndr); if (rb_scan_args(argc, argv, "01", &hash) == 1) { Check_Type(hash, T_HASH); key = CSTR2SYM("nesting_level"); if (RTEST(rb_hash_aref(hash, key))) { Check_Type(rb_hash_aref(hash, key), T_FIXNUM); nesting_level = NUM2INT(rb_hash_aref(hash, key)); } } sdhtml_toc_renderer(&rndr->callbacks, (struct html_renderopt *)&rndr->options.html, nesting_level); rb_redcarpet__overload(self, rb_cRenderHTML_TOC); return Qnil; }
static Rboolean render_to_html(struct buf *ib, struct buf *ob, SEXP Soptions, SEXP Sextensions) { struct sd_callbacks callbacks; struct html_renderopt renderopt; unsigned int exts=0, options=0; struct sd_markdown *markdown; struct buf *htmlbuf; Rboolean toc = FALSE, smarty = FALSE; /* Marshal extensions */ if (isString(Sextensions)) { int i; for (i = 0; i < LENGTH(Sextensions); i++) { if (strcasecmp(CHAR(STRING_ELT(Sextensions,i)), "NO_INTRA_EMPHASIS") == 0) exts |= MKDEXT_NO_INTRA_EMPHASIS; else if (strcasecmp(CHAR(STRING_ELT(Sextensions,i)), "TABLES") == 0) exts |= MKDEXT_TABLES; else if (strcasecmp(CHAR(STRING_ELT(Sextensions,i)), "FENCED_CODE") == 0) exts |= MKDEXT_FENCED_CODE; else if (strcasecmp(CHAR(STRING_ELT(Sextensions,i)), "AUTOLINK") == 0) exts |= MKDEXT_AUTOLINK; else if (strcasecmp(CHAR(STRING_ELT(Sextensions,i)), "STRIKETHROUGH") == 0) exts |= MKDEXT_STRIKETHROUGH; else if (strcasecmp(CHAR(STRING_ELT(Sextensions,i)), "LAX_SPACING") == 0) exts |= MKDEXT_LAX_SPACING; else if (strcasecmp(CHAR(STRING_ELT(Sextensions,i)), "SPACE_HEADERS") == 0) exts |= MKDEXT_SPACE_HEADERS; else if (strcasecmp(CHAR(STRING_ELT(Sextensions,i)), "SUPERSCRIPT") == 0) exts |= MKDEXT_SUPERSCRIPT; else if (strcasecmp(CHAR(STRING_ELT(Sextensions,i)), "LATEX_MATH") == 0) exts |= MKDEXT_LATEX_MATH; } } /* Marshal HTML options */ if (isString(Soptions)) { int i; for (i = 0; i < LENGTH(Soptions); i++) { if (strcasecmp(CHAR(STRING_ELT(Soptions,i)), "SKIP_HTML") == 0) options |= HTML_SKIP_HTML; else if (strcasecmp(CHAR(STRING_ELT(Soptions,i)), "SKIP_STYLE") == 0) options |= HTML_SKIP_STYLE; else if (strcasecmp(CHAR(STRING_ELT(Soptions,i)), "SKIP_IMAGES") == 0) options |= HTML_SKIP_IMAGES; else if (strcasecmp(CHAR(STRING_ELT(Soptions,i)), "SKIP_LINKS") == 0) options |= HTML_SKIP_LINKS; else if (strcasecmp(CHAR(STRING_ELT(Soptions,i)), "SAFELINK") == 0) options |= HTML_SAFELINK; else if (strcasecmp(CHAR(STRING_ELT(Soptions,i)), "TOC") == 0) { options |= HTML_TOC; toc = TRUE; } else if (strcasecmp(CHAR(STRING_ELT(Soptions,i)), "HARD_WRAP") == 0) options |= HTML_HARD_WRAP; else if (strcasecmp(CHAR(STRING_ELT(Soptions,i)), "USE_XHTML") == 0) options |= HTML_USE_XHTML; else if (strcasecmp(CHAR(STRING_ELT(Soptions,i)), "ESCAPE") == 0) options |= HTML_ESCAPE; else if (strcasecmp(CHAR(STRING_ELT(Soptions,i)), "SMARTYPANTS") == 0) smarty = TRUE; } } htmlbuf = bufnew(OUTPUT_UNIT); if (!htmlbuf) { RMD_WARNING_NOMEM; return FALSE; } if (toc==TRUE) { struct buf *tocbuf = bufnew(OUTPUT_UNIT); if (!tocbuf) { RMD_WARNING_NOMEM; return FALSE; } sdhtml_toc_renderer(&callbacks, &renderopt); markdown = sd_markdown_new(exts,16,&callbacks,(void *)&renderopt); if (!markdown) { RMD_WARNING_NOMEM; return FALSE; } sd_markdown_render(tocbuf, ib->data, ib->size, markdown); sd_markdown_free(markdown); bufputs(htmlbuf,"<div id=\"toc\">\n"); bufputs(htmlbuf,"<div id=\"toc_header\">Table of Contents</div>\n"); bufput(htmlbuf,tocbuf->data,tocbuf->size); bufputs(htmlbuf,"</div>\n"); bufputs(htmlbuf,"\n"); bufrelease(tocbuf); } sdhtml_renderer(&callbacks, &renderopt, options); markdown = sd_markdown_new(exts,16,&callbacks,(void *)&renderopt); if (!markdown) { RMD_WARNING_NOMEM; return FALSE; } sd_markdown_render(htmlbuf, ib->data, ib->size, markdown); sd_markdown_free(markdown); if (smarty==TRUE) { struct buf *smartybuf = bufnew(OUTPUT_UNIT); if (!smartybuf) { RMD_WARNING_NOMEM; return FALSE; } sdhtml_smartypants(smartybuf,htmlbuf->data,htmlbuf->size); bufrelease(htmlbuf); htmlbuf = smartybuf; } bufput(ob,htmlbuf->data,htmlbuf->size); bufrelease(htmlbuf); return TRUE; }