/* * markdown: convert a single markdown document into html */ /* * Copyright (C) 2007 David L Parsons. * The redistribution terms are provided in the COPYRIGHT file that must * be distributed with this source code. */ #include #include #include #include #include #include #include #include #include "config.h" #include "amalloc.h" #include "pgm_options.h" #include "tags.h" #include "gethopt.h" #if HAVE_LIBGEN_H #include #endif #ifndef HAVE_BASENAME #include char* basename(char *p) { char *ret = strrchr(p, '/'); return ret ? (1+ret) : p; } #endif char *pgm = "markdown"; char * e_flags(const char *text, const int size, void *context) { return (char*)context; } void complain(char *fmt, ...) { va_list ptr; fprintf(stderr, "%s: ", pgm); va_start(ptr, fmt); vfprintf(stderr, fmt, ptr); va_end(ptr); fputc('\n', stderr); fflush(stderr); } char * anchor_format(char *input, void *ctx) { int i, j, size; char* ret; if ( !input ) return NULL; size = strlen(input); ret = malloc(1+size); if ( !ret ) return NULL; while ( size && isspace(input[size-1]) ) --size; for ( j=i=0; i < size; i++ ) { if (isalnum(input[i]) || strchr("-_+", input[i]) ) ret[j++] = input[i]; else if ( input[i] == ' ' ) ret[j++] = '-'; } ret[j++] = 0; return ret; } void free_it(char *object, void *ctx) { if ( object ) free(object); } char * external_codefmt(char *src, int len, char *lang) { int extra = 0; int i, x; char *res; if ( lang == 0 ) lang = "generic_code"; for ( i=0; i < len; i++) { if ( src[i] == '&' ) extra += 5; else if ( src[i] == '<' || src[i] == '>' ) extra += 4; } /* 80 characters for the format wrappers */ if ( (res = malloc(len+extra+80+strlen(lang))) ==0 ) /* out of memory? drat! */ return 0; sprintf(res, "
\n", lang);
    x = strlen(res);
    for ( i=0; i < len; i++ ) {
	switch (src[i]) {
	case '&':   strcpy(&src[x], "&");
		    x += 5 /*strlen(&)*/ ;
		    break;
	case '<':   strcpy(&src[x], "<");
		    x += 4 /*strlen(<)*/ ;
		    break;
	case '>':   strcpy(&src[x], ">");
		    x += 4 /*strlen(>)*/ ;
		    break;
	default:    res[x++] = src[i];
		    break;
	}
    }
    strcpy(&res[x], "
\n"); return res; } struct h_opt opts[] = { { 0, "html5", '5', 0, "recognise html5 block elements" }, { 0, "base", 'b', "url-base", "URL prefix" }, { 0, "debug", 'd', 0, "debugging" }, { 0, "version",'V', 0, "show version info" }, { 0, 0, 'E', "flags", "url flags" }, { 0, 0, 'F', "bitmap", "set/show hex flags" }, { 0, 0, 'f', "{+-}flags", "set/show named flags" }, { 0, 0, 'G', 0, "github flavoured markdown" }, { 0, 0, 'n', 0, "don't write generated html" }, { 0, 0, 's', "text", "format `text`" }, { 0, "style", 'S', 0, "output