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: */
 |