mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 17:50:22 +00:00
130 lines
3.2 KiB
C
130 lines
3.2 KiB
C
#include <stdio.h>
|
|
#include "ruby.h"
|
|
#include "mkdio.h"
|
|
|
|
static VALUE rb_cRDiscount;
|
|
|
|
static VALUE
|
|
rb_rdiscount_to_html(int argc, VALUE *argv, VALUE self)
|
|
{
|
|
/* grab char pointer to markdown input text */
|
|
char *res;
|
|
int szres;
|
|
VALUE encoding;
|
|
VALUE text = rb_funcall(self, rb_intern("text"), 0);
|
|
VALUE buf = rb_str_buf_new(1024);
|
|
Check_Type(text, T_STRING);
|
|
|
|
int flags = rb_rdiscount__get_flags(self);
|
|
|
|
MMIOT *doc = mkd_string(RSTRING_PTR(text), RSTRING_LEN(text), flags);
|
|
|
|
if ( mkd_compile(doc, flags) ) {
|
|
szres = mkd_document(doc, &res);
|
|
|
|
if ( szres != EOF ) {
|
|
rb_str_cat(buf, res, szres);
|
|
rb_str_cat(buf, "\n", 1);
|
|
}
|
|
}
|
|
mkd_cleanup(doc);
|
|
|
|
|
|
/* force the input encoding */
|
|
if ( rb_respond_to(text, rb_intern("encoding")) ) {
|
|
encoding = rb_funcall(text, rb_intern("encoding"), 0);
|
|
rb_funcall(buf, rb_intern("force_encoding"), 1, encoding);
|
|
}
|
|
|
|
return buf;
|
|
}
|
|
|
|
static VALUE
|
|
rb_rdiscount_toc_content(int argc, VALUE *argv, VALUE self)
|
|
{
|
|
char *res;
|
|
int szres;
|
|
|
|
int flags = rb_rdiscount__get_flags(self);
|
|
|
|
/* grab char pointer to markdown input text */
|
|
VALUE text = rb_funcall(self, rb_intern("text"), 0);
|
|
Check_Type(text, T_STRING);
|
|
|
|
/* allocate a ruby string buffer and wrap it in a stream */
|
|
VALUE buf = rb_str_buf_new(4096);
|
|
|
|
MMIOT *doc = mkd_string(RSTRING_PTR(text), RSTRING_LEN(text), flags);
|
|
|
|
if ( mkd_compile(doc, flags) ) {
|
|
szres = mkd_toc(doc, &res);
|
|
|
|
if ( szres != EOF ) {
|
|
rb_str_cat(buf, res, szres);
|
|
rb_str_cat(buf, "\n", 1);
|
|
}
|
|
}
|
|
mkd_cleanup(doc);
|
|
|
|
return buf;
|
|
}
|
|
|
|
int rb_rdiscount__get_flags(VALUE ruby_obj)
|
|
{
|
|
/* compile flags */
|
|
int flags = MKD_TABSTOP | MKD_NOHEADER;
|
|
|
|
/* smart */
|
|
if ( rb_funcall(ruby_obj, rb_intern("smart"), 0) != Qtrue )
|
|
flags = flags | MKD_NOPANTS;
|
|
|
|
/* filter_html */
|
|
if ( rb_funcall(ruby_obj, rb_intern("filter_html"), 0) == Qtrue )
|
|
flags = flags | MKD_NOHTML;
|
|
|
|
/* generate_toc */
|
|
if ( rb_funcall(ruby_obj, rb_intern("generate_toc"), 0) == Qtrue)
|
|
flags = flags | MKD_TOC;
|
|
|
|
/* no_image */
|
|
if ( rb_funcall(ruby_obj, rb_intern("no_image"), 0) == Qtrue)
|
|
flags = flags | MKD_NOIMAGE;
|
|
|
|
/* no_links */
|
|
if ( rb_funcall(ruby_obj, rb_intern("no_links"), 0) == Qtrue)
|
|
flags = flags | MKD_NOLINKS;
|
|
|
|
/* no_tables */
|
|
if ( rb_funcall(ruby_obj, rb_intern("no_tables"), 0) == Qtrue)
|
|
flags = flags | MKD_NOTABLES;
|
|
|
|
/* strict */
|
|
if ( rb_funcall(ruby_obj, rb_intern("strict"), 0) == Qtrue)
|
|
flags = flags | MKD_STRICT;
|
|
|
|
/* autolink */
|
|
if ( rb_funcall(ruby_obj, rb_intern("autolink"), 0) == Qtrue)
|
|
flags = flags | MKD_AUTOLINK;
|
|
|
|
/* safelink */
|
|
if ( rb_funcall(ruby_obj, rb_intern("safelink"), 0) == Qtrue)
|
|
flags = flags | MKD_SAFELINK;
|
|
|
|
/* no_pseudo_protocols */
|
|
if ( rb_funcall(ruby_obj, rb_intern("no_pseudo_protocols"), 0) == Qtrue)
|
|
flags = flags | MKD_NO_EXT;
|
|
|
|
|
|
return flags;
|
|
}
|
|
|
|
|
|
void Init_rdiscount()
|
|
{
|
|
rb_cRDiscount = rb_define_class("RDiscount", rb_cObject);
|
|
rb_define_method(rb_cRDiscount, "to_html", rb_rdiscount_to_html, -1);
|
|
rb_define_method(rb_cRDiscount, "toc_content", rb_rdiscount_toc_content, -1);
|
|
}
|
|
|
|
/* vim: set ts=4 sw=4: */
|