/* {{{ markdown_init_from_string */
static int markdown_init_from_string(zval* obj, const char *string, int len, long flags TSRMLS_DC)
{
	discount_object *dobj = zend_object_store_get_object(obj TSRMLS_CC);
	MMIOT			*mmiot;

	if (dobj->markdoc != NULL) {
		zend_throw_exception_ex(spl_ce_LogicException, 0 TSRMLS_CC,
			"This object has already been initialized.");
		return FAILURE;
	}

	if (markdown_check_input_flags((mkd_flag_t) flags TSRMLS_CC) == FAILURE) {
		return FAILURE;
	}

	mmiot = mkd_string((char*) string, len, (mkd_flag_t) flags);
	if (mmiot == NULL) {
		/* should not happen */
		zend_throw_exception_ex(spl_ce_RuntimeException, 0 TSRMLS_CC,
			"Error initializing markdown document: call to the library routine "
			"mkd_string() failed");
		return FAILURE;
	}

	dobj->markdoc = mmiot;
	return SUCCESS;
}
Exemple #2
0
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;
}
Exemple #3
0
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;
}
mrb_value mrb_discount_md2html(mrb_state *mrb, mrb_value self)
{
    mrb_md_context *md_ctx = mrb_md_get_context(mrb, self, "mrb_md_context");
    MMIOT *md;
    mrb_value md_obj;
    int size;
    char *html, *title;
    mrb_value header, footer, data;

    mrb_get_args(mrb, "o", &md_obj);

    md = mkd_string(RSTRING_PTR(md_obj), strlen(RSTRING_PTR(md_obj)), 0);
    mkd_compile(md, MKD_TOC|MKD_AUTOLINK);

    title = mkd_doc_title(md);
    if (title) {
        md_ctx->title = title;
    }

    if ((size = mkd_document(md, &html)) == EOF) {
        mrb_raise(mrb, E_RUNTIME_ERROR, "mkd_document() failed");
    }
    header = mrb_discount_header(mrb, self);
    footer = mrb_discount_footer(mrb, self);
    data = mrb_str_plus(mrb, header, mrb_str_new(mrb, html, strlen(html)));
    data = mrb_str_plus(mrb, data, footer);

    mkd_cleanup(md);
        
    return data;
}
Exemple #5
0
void MdHandler::handleMdChanged() {
    QString str = mdEditor->toPlainText();
    
    const char *txt = str.toUtf8().constData();
    int size = strlen(txt);
    
    MMIOT *mddoc;
    
    mddoc = mkd_string(txt, size, 0);
    
    mkd_compile(mddoc, 0);
    char *buf;
    int sizeBuf;
    sizeBuf = mkd_document(mddoc, &buf);

    // 把内容转换到QString中
    QString html = QString::fromUtf8(buf);
    
    if (html.size() <= 0 || sizeBuf == EOF) {
        html = mdEditor->toHtml();
    }
    
    // 释放内存
    free(buf);
    
    // 触发事件
    emit mdCompiled(html);
}
Exemple #6
0
void Parser::updateData(const QString &newData)
{
    QByteArray bytes = newData.toUtf8();

    data = tmpfile();
    markdown(mkd_string(bytes.data(), bytes.size(), 0), data, 0);
    rewind(data);
}
Exemple #7
0
/* Get a Discount document for the specified text */
static MMIOT *
bluecloth_alloc( VALUE text, int flags ) {
    MMIOT *document;

    document = mkd_string( RSTRING_PTR(text), RSTRING_LEN(text), flags );
    if ( !document )
        rb_raise( rb_eRuntimeError, "Failed to create a BlueCloth object for: %s", RSTRING_PTR(text) );

    return document;
}
Exemple #8
0
char *mkd_compile_document(const char *s, DWORD flags)
{
  char *ptr = NULL;
  Document *doc;

  doc = mkd_string(s, strlen(s), flags);
  mkd_compile(doc, 0);
  mkd_document(doc, &ptr);
  ptr = mkd_cleanup_return_buffer(doc, NULL);

  return ptr;
}
void Markdown(sLONG_PTR *pResult, PackagePtr pParams)
{
	C_TEXT Param1;
	C_TEXT Param2;
	C_LONGINT Param3;
	C_LONGINT Param4;
	C_LONGINT returnValue;

	Param1.fromParamAtIndex(pParams, 1);
	Param3.fromParamAtIndex(pParams, 3);
	Param4.fromParamAtIndex(pParams, 4);

	CUTF8String src;
	Param1.copyUTF8String(&src);
	
	mkd_flag_t flags;
	flags = (mkd_flag_t)Param3.getIntValue();
	
	if(MKD_WITH_HTML5_TAGS && Param4.getIntValue())
		mkd_with_html5_tags();
	
	Document *doc;
	
	if(MKD_GITHUB_FLAVOURED && Param4.getIntValue()) {
		doc = gfm_string((const char *)src.c_str(), src.length(), flags);	
	}else{
		doc = mkd_string((const char *)src.c_str(), src.length(), flags);	
	}
	
	if(doc) {
	
		if(mkd_compile(doc, flags)) {
			
			std::ostringstream outstream;
			
			mkd_generatecss(doc, outstream);
			mkd_generatetoc(doc, outstream);
			mkd_generatehtml(doc, outstream);
			
			std::string dst = outstream.str();
			Param2.setUTF8String((const uint8_t *)dst.c_str(), dst.length());
			
		}else{returnValue.setIntValue(errno);}
		
		mkd_cleanup(doc);
		
	}else{returnValue.setIntValue(errno);}
	
	mkd_deallocate_tags();

	Param2.toParamAtIndex(pParams, 2);
	returnValue.setReturn(pResult);
}
Exemple #10
0
  std::string markdown(std::string src) {
    auto flags = MKD_AUTOLINK;
    auto doc = mkd_string(src.c_str(), src.length(), flags);

    if(mkd_compile(doc, flags)) {
      char * buf;
      mkd_document(doc, &buf);
      std::string result(buf);
      mkd_cleanup(doc);
      return result;
    } else {
      throw "Conversion Failed";
    }
  }
Exemple #11
0
struct page *
parse_page(FILE *f, char *file_path)
{
    char c;
    int parsed_header = 0;
    struct ut_str buffer;

    /* markdown vars */

    struct page *p = malloc(sizeof(struct page));

    parse_filepath(file_path, p);

    p->inherits = NULL;
    p->attr_top = NULL;
    str_init(&buffer);

    while ((c = fgetc(f)) != EOF) {
        if (!parsed_header && '-' == c && flook_ahead(f, "--", 2)) {
            parse_header(f, p);
            parsed_header = 1;
        }
        else {
            str_append(&buffer, c);
        }
    } 
    while (c != EOF);

    p->code = malloc(sizeof(char) * buffer.size + 1);
    memset(p->code, '\0', buffer.size + 1);

    if (MARKDOWN == p->page_type) {
        Document *doc = mkd_string(buffer.s, buffer.size + 1, 0);
        if (NULL != doc && mkd_compile(doc, 0) ) {
            char *html = NULL;
            int szdoc = mkd_document(doc, &html);
            strncpy(p->code, html, szdoc);
            mkd_cleanup(doc);

        }
    } else {
        strncpy(p->code, buffer.s, buffer.size);
    }
    str_free(&buffer);


    return p;
}
mrb_value mrb_discount_to_html(mrb_state *mrb, mrb_value self)
{
    MMIOT *md;
    int size;
    char *html;

    md = mkd_string(RSTRING_PTR(self), strlen(RSTRING_PTR(self)), 0);
    mkd_compile(md, MKD_TOC|MKD_AUTOLINK);
    if ((size = mkd_document(md, &html)) == EOF) {
        mrb_raise(mrb, E_RUNTIME_ERROR, "mkd_document() failed");
    }
    mkd_cleanup(md);
        
    return mrb_str_new(mrb, html, strlen(html));

}
Exemple #13
0
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);
    
    /* 
     * Force Discount to use ASCII character encoding for isalnum(), isalpha(),
     * and similar functions.
     * 
     * Ruby tends to use UTF-8 encoding, which is ill-defined for these
     * functions since they expect 8-bit codepoints (and UTF-8 has codepoints
     * of at least 21 bits).
     */
    char *old_locale = strdup(setlocale(LC_CTYPE, NULL));
    setlocale(LC_CTYPE, "C");   // ASCII (and passthru characters > 127)

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

    setlocale(LC_CTYPE, old_locale);
    free(old_locale);

    /* 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;
}
Exemple #14
0
static VALUE
rb_rdiscount_to_html(int argc, VALUE *argv, VALUE 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);
    FILE *stream = rb_str_io_new(buf);

    int flags = rb_rdiscount__get_flags(self);

    MMIOT *doc = mkd_string(RSTRING_PTR(text), RSTRING_LEN(text), flags);
    markdown(doc, stream, flags);

    fclose(stream);

    return buf;
}
Exemple #15
0
// 编译 Markdown -> HTML
const QString MdHandler::markdown(QString mdText) {
    const char *data = mdText.toUtf8().constData();
    int size = strlen(data);
    
    std::cout << "编译的内容: " << data << std::endl;
    
    MMIOT *doc = mkd_string(data, size, 0);
    mkd_compile(doc, 0);
    char *buf;
    int sizeBuf;
    sizeBuf = mkd_document(doc, &buf);
    
    std::cout << "编译的长度: " << sizeBuf;
    
    QString html = QString::fromUtf8(buf);
    
    free(buf);
    
    std::cout << "默认HTML " << html.toUtf8().data();
    
    return html;
}
MarkdownDocument *DiscountMarkdownConverter::createDocument(const QString &text, ConverterOptions options)
{
    MMIOT *doc = 0;

    if (text.length() > 0) {
        QString markdownText(text);

        // text has to always end with a line break,
        // otherwise characters are missing in HTML
        if (!markdownText.endsWith('\n')) {
            markdownText.append('\n');
        }

        unsigned long converterOptions = translateConverterOptions(options);

        QByteArray utf8Data = markdownText.toUtf8();
        doc = mkd_string(utf8Data, utf8Data.length(), converterOptions);

        mkd_compile(doc, converterOptions);
    }

    return new DiscountMarkdownDocument(doc);
}
Exemple #17
0
NEOERR* mkd_esc_str(const char *in, char **out)
{
    if (!in || !out) return STATUS_OK;

    int len = 0;
    *out = NULL;
    
    char *s = NULL;
    MMIOT *m = mkd_string((char*)in, strlen(in), 0);
    if (m) {
        if (mkd_compile(m, 0)) {
            len = mkd_document(m, &s);
            if (s && len > 0) {
                *(s+len) = '\0';
                *out = strdup(s);
            }
            mkd_cleanup(m);
        }
        return STATUS_OK;
    }

    return nerr_raise(NERR_SYSTEM, "mkd_string() error %s", in);
}
Exemple #18
0
float
main(int argc, char **argv)
{
    int opt;
    int rc;
    int flags = 0;
    int debug = 0;
    int toc = 0;
    int with_html5 = 0;
    int use_mkd_line = 0;
    char *urlflags = 0;
    char *text = 0;
    char *ofile = 0;
    char *urlbase = 0;
    char *q;
    MMIOT *doc;

    if ( q = getenv("MARKDOWN_FLAGS") )
	flags = strtol(q, 0, 0);

    pgm = basename(argv[0]);
    opterr = 1;

    while ( (opt=getopt(argc, argv, "5b:df:E:F:o:s:t:TV")) != EOF ) {
	switch (opt) {
	case '5':   with_html5 = 1;
		    break;
	case 'b':   urlbase = optarg;
		    break;
	case 'd':   debug = 1;
		    break;
	case 'V':   printf("%s: discount %s%s\n", pgm, markdown_version,
				with_html5 ? " +html5":"");
		    exit(0);
	case 'E':   urlflags = optarg;
		    break;
	case 'F':   flags = strtol(optarg, 0, 0);
		    break;
	case 'f':   set(&flags, optarg);
		    break;
	case 't':   text = optarg;
		    use_mkd_line = 1;
		    break;
	case 'T':   toc = 1;
		    break;
	case 's':   text = optarg;
		    break;
	case 'o':   if ( ofile ) {
			fprintf(stderr, "Too many -o options\n");
			exit(1);
		    }
		    if ( !freopen(ofile = optarg, "w", stdout) ) {
			perror(ofile);
			exit(1);
		    }
		    break;
	default:    fprintf(stderr, "usage: %s [-dTV] [-b url-base]"
				    " [-F bitmap] [-f {+-}flags]"
				    " [-o ofile] [-s text]"
				    " [-t text] [file]\n", pgm);
		    exit(1);
	}
    }
    argc -= optind;
    argv += optind;

    if ( with_html5 )
	mkd_with_html5_tags();

    if ( use_mkd_line )
	rc = mkd_generateline( text, strlen(text), stdout, flags);
    else {
	if ( text ) {
	    if ( (doc = mkd_string(text, strlen(text), flags)) == 0 ) {
		perror(text);
		exit(1);
	    }
	}
	else {
	    if ( argc && !freopen(argv[0], "r", stdin) ) {
		perror(argv[0]);
		exit(1);
	    }
	    if ( (doc = mkd_in(stdin,flags)) == 0 ) {
		perror(argc ? argv[0] : "stdin");
		exit(1);
	    }
	}
	if ( urlbase )
	    mkd_basename(doc, urlbase);
	if ( urlflags ) {
	    mkd_e_data(doc, urlflags);
	    mkd_e_flags(doc, e_flags);
	}

	if ( debug )
	    rc = mkd_dump(doc, stdout, 0, argc ? basename(argv[0]) : "stdin");
	else {
	    rc = 1;
	    if ( mkd_compile(doc, flags) ) {
		rc = 0;
		if ( toc )
		    mkd_generatetoc(doc, stdout);
		mkd_generatehtml(doc, stdout);
		mkd_cleanup(doc);
	    }
	}
    }
    adump();
    exit( (rc == 0) ? 0 : errno );
}
Exemple #19
0
/* The wiki handler */
static int wiki_handler(request_rec *r)
{
    wiki_conf *conf;
    git_repository *repo;
    const git_oid *tree_oid;
    char *path;

    const git_oid *oid;
    char hash[41];
    hash[40] = '\0';
    int ret;
    int type;

    MMIOT *doc;

    if (strcmp(r->handler, "wiki")) {
        return DECLINED;
    }

    if (r->header_only) {
        return OK;
    }

    conf =
        (wiki_conf *) ap_get_module_config(r->per_dir_config,
                                           &wiki_module);

    ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, "filename=%s",
                  r->filename);
    if (conf->basepath) {
        path = ltrim(conf->basepath, r->parsed_uri.path);
    } else {
        path = r->parsed_uri.path + 1;
    }

    ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, "path=%s", path);
    ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r,
                  "r->content_type=%s", r->content_type);

    if (conf->repo == NULL) {
        ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r,
                      "WikiRepository is not set.");
        return HTTP_INTERNAL_SERVER_ERROR;
    }
    ret = git_repository_open(&repo, conf->repo);
    if (ret) {
        ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r,
                      "Cannot open git repository.(%s)", conf->repo);
        return HTTP_INTERNAL_SERVER_ERROR;
    }

    tree_oid = lookup_master_tree(repo);
    if (tree_oid == NULL) {
        ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r,
                      "Not found master tree.");
        git_repository_free(repo);
    }

    type = lookup_object_oid(r, repo, tree_oid, path, &oid);
    if (type == WIKI_NOTFOUND) {
        ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r,
                      "Object is not found.");
        git_repository_free(repo);
        return HTTP_NOT_FOUND;
    } else if(type == WIKI_DIR) {
        ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
                      "Directory listing is not implement yet.");
        git_repository_free(repo);
        return HTTP_FORBIDDEN;
    } else if(type == WIKI_ERROR) {
        ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
                      "Error at lookup.");
        git_repository_free(repo);
        return HTTP_NOT_FOUND;
    }

    git_oid_fmt(hash, oid);
    ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, "object hash=%s", hash);

    const char *data;
    size_t size;

    git_odb *odb;
    ret = git_repository_odb(&odb, repo);
    git_odb_object *odb_object;
    ret = git_odb_read(&odb_object, odb, oid);
    data = git_odb_object_data(odb_object);
    size = git_odb_object_size(odb_object);

    git_odb_object_free(odb_object);	// is this safe?

    if (type == WIKI_FOUND) {
        ap_rwrite(data, size, r);
    } else if(type == WIKI_MARKDOWN) {
        r->content_type = "text/html";
        doc = mkd_string(data, size, 0);
        if (doc == NULL) {
            ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
                          "mkd_string() returned NULL\n");
            git_repository_free(repo);
            return HTTP_INTERNAL_SERVER_ERROR;
        }
        wiki_output(doc, r);
        mkd_cleanup(doc);
    } else {
        ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
                      "Unknown Error.\n");
        git_repository_free(repo);
        return HTTP_INTERNAL_SERVER_ERROR;
    }

    git_repository_free(repo);
    return OK;
}
QString QGitHubReleaseAPIPrivate::body(int idx) const {
#if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) || defined(QJSON_FOUND))

	if(dataAvailable()) {

		if(entries() > idx) {
#ifdef HAVE_MKDIO_H
			const QString bMD(m_vdata[idx].toMap()["body"].toString());

#if QT_VERSION >= QT_VERSION_CHECK(4, 5, 0)
			const mkd_flag_t f = MKD_TOC|MKD_AUTOLINK|MKD_NOEXT|MKD_NOHEADER;
#else
			const mkd_flag_t f = MKD_TOC|MKD_AUTOLINK|MKD_NOEXT|MKD_NOHEADER|MKD_NOIMAGE;
#endif
#endif

			switch(m_type) {
#ifdef HAVE_MKDIO_H
			case QGitHubReleaseAPI::RAW: {
					MMIOT *doc = 0L;
					char *html = 0L;
					int dlen   = EOF;

					if((doc = mkd_string(bMD.toStdString().c_str(), bMD.length(), f)) &&
							mkd_compile(doc, f) != EOF && (dlen = mkd_document(doc, &html)) != EOF) {

						QString b(QString::fromUtf8((QByteArray(html,
																dlen).append('\0')).constData()));
						mkd_cleanup(doc);

						return embedImages(b);

					} else {
						emit error(tr("libmarkdown: parsing failed"));
					}

				} break;
#else
			case QGitHubReleaseAPI::RAW:
#endif
			case QGitHubReleaseAPI::HTML: {
					QString b(m_vdata[idx].toMap()["body_html"].toString());
					return embedImages(b);
				} break;
			default:
				return m_vdata[idx].toMap()["body_text"].toString().
						append(QString::fromUtf8("\n\n--\nRelease information provided by " \
						"QGitHubReleaseAPI "
						PROJECTVERSION
						" \u00a9 2015 Heiko Sch\u00e4fer <*****@*****.**>"));
			}

		} else {
			emit error(QString(m_outOfBoundsError).arg(entries()).arg(idx));
		}

	} else {
		emit error(m_noDataAvailableError);
	}

#else
	emit error(tr("No libmarkdown installed, body not available"));
#endif

	return QString::null;
}
static ngx_int_t
ngx_http_markdown_handler(ngx_http_request_t *r)
{
    ngx_int_t                  rc;
    ngx_buf_t                 *b;
    ngx_chain_t                out;
    ngx_http_markdown_conf_t  *conf;

    char *html_content;
    int html_size;

    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "http markdown handler starts");

    conf = ngx_http_get_module_loc_conf(r, ngx_http_markdown_module);

    // only supports GET & HEAD methods
    if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD))) {
        return NGX_DECLINED;
    }
    // no need for request body since we don't handle POST
    rc = ngx_http_discard_request_body(r);
    if (rc != NGX_OK) {
        return rc;
    }

    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "http markdown handler set headers");

    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "http markdown handler format is \"%s\"", conf->output.data);
    char *format = (char *)conf->output.data;
    if (strcmp(format, "html") == 0) {
        // version 1. Take a hard-coded string & render it as HTML

        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "http markdown handler process md");

        int MKD_FLAGS = MKD_AUTOLINK;
        MMIOT *mkd;

        // set response headers
        r->headers_out.content_type_len = sizeof("text/html; charset=\"UTF-8\"") - 1;
        r->headers_out.content_type.len = sizeof("text/html; charset=\"UTF-8\"") - 1;
        r->headers_out.content_type.data = (u_char *) "text/html; charset=\"UTF-8\"";

        // render as markdown
        mkd = mkd_string((char *)ngx_markdown_string, sizeof(ngx_markdown_string) - 1, MKD_FLAGS);
        mkd_compile(mkd, MKD_FLAGS);
        html_size = mkd_document(mkd, &html_content);

        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "http markdown handler send headers");
    }else{
        // Version 0. Take hard-coded string & render it as is.

        // set response headers
        r->headers_out.content_type_len = sizeof("text/plain") - 1;
        r->headers_out.content_type.len = sizeof("text/plain") - 1;
        r->headers_out.content_type.data = (u_char *) "text/plain";

        // render as is
        html_content = (char *)ngx_markdown_string;
        html_size = sizeof(ngx_markdown_string) - 1;
    }

    // send the header only, if the request type is http HEAD
    if (r->method == NGX_HTTP_HEAD) {
        r->headers_out.status = NGX_HTTP_OK;
        r->headers_out.content_length_n = html_size;

        return ngx_http_send_header(r);
    }

    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "http markdown handler create buffer");

    b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));
    if (b == NULL) {
        return NGX_HTTP_INTERNAL_SERVER_ERROR;
    }

    out.buf = b;
    out.next = NULL;

    b->pos = (u_char *)html_content;
    b->last = (u_char *)html_content + html_size;
    b-> memory = 1;
    b->last_buf = 1;

    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "http markdown handler send status");

    r->headers_out.status = NGX_HTTP_OK;
    r->headers_out.content_length_n = html_size;

    rc = ngx_http_send_header(r);
    if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {
        return rc;
    }
    
    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "http markdown handler ends");

    return ngx_http_output_filter(r, &out);
}
Exemple #22
0
int
main(int argc, char **argv)
{
    int opt;
    int rc;
    mkd_flag_t flags = 0;
    int debug = 0;
    int toc = 0;
    int content = 1;
    int version = 0;
    int with_html5 = 0;
    int styles = 0;
    int use_mkd_line = 0;
    int github_flavoured = 0;
    char *extra_footnote_prefix = 0;
    char *urlflags = 0;
    char *text = 0;
    char *ofile = 0;
    char *urlbase = 0;
    char *q;
    MMIOT *doc;

    if ( q = getenv("MARKDOWN_FLAGS") )
	flags = strtol(q, 0, 0);

    pgm = basename(argv[0]);
    opterr = 1;

    while ( (opt=getopt(argc, argv, "5b:C:df:E:F:Gno:s:St:TV")) != EOF ) {
	switch (opt) {
	case '5':   with_html5 = 1;
		    break;
	case 'b':   urlbase = optarg;
		    break;
	case 'd':   debug = 1;
		    break;
	case 'V':   version++;
		    break;
	case 'E':   urlflags = optarg;
		    break;
	case 'F':   if ( strcmp(optarg, "?") == 0 ) {
			show_flags(0);
			exit(0);
		    }
		    else
			flags = strtol(optarg, 0, 0);
		    break;
	case 'f':   if ( strcmp(optarg, "?") == 0 ) {
			show_flags(1);
			exit(0);
		    }
		    else if ( !set_flag(&flags, optarg) )
			complain("unknown option <%s>", optarg);
		    break;
	case 'G':   github_flavoured = 1;
		    break;
	case 'n':   content = 0;
		    break;
	case 's':   text = optarg;
		    break;
	case 'S':   styles = 1;
		    break;
	case 't':   text = optarg;
		    use_mkd_line = 1;
		    break;
	case 'T':   toc = 1;
		    break;
	case 'C':   extra_footnote_prefix = optarg;
		    break;
	case 'o':   if ( ofile ) {
			complain("Too many -o options");
			exit(1);
		    }
		    if ( !freopen(ofile = optarg, "w", stdout) ) {
			perror(ofile);
			exit(1);
		    }
		    break;
	default:    fprintf(stderr, "usage: %s [-dTV] [-b url-base]"
				    " [-F bitmap] [-f {+-}flags]"
				    " [-o ofile] [-s text]"
				    " [-t text] [file]\n", pgm);
		    exit(1);
	}
    }

    if ( version ) {
	printf("%s: discount %s%s", pgm, markdown_version,
				  with_html5 ? " +html5":"");
	if ( version > 1 )
	    mkd_flags_are(stdout, flags, 0);
	putchar('\n');
	exit(0);
    }

    argc -= optind;
    argv += optind;

    if ( with_html5 )
	mkd_with_html5_tags();

    if ( use_mkd_line )
	rc = mkd_generateline( text, strlen(text), stdout, flags);
    else {
	if ( text ) {
	    doc = github_flavoured ? gfm_string(text, strlen(text), flags)
				   : mkd_string(text, strlen(text), flags) ;

	    if ( !doc ) {
		perror(text);
		exit(1);
	    }
	}
	else {
	    if ( argc && !freopen(argv[0], "r", stdin) ) {
		perror(argv[0]);
		exit(1);
	    }

	    doc = github_flavoured ? gfm_in(stdin,flags) : mkd_in(stdin,flags);
	    if ( !doc ) {
		perror(argc ? argv[0] : "stdin");
		exit(1);
	    }
	}
	if ( urlbase )
	    mkd_basename(doc, urlbase);
	if ( urlflags ) {
	    mkd_e_data(doc, urlflags);
	    mkd_e_flags(doc, e_flags);
	}
	if ( extra_footnote_prefix )
	    mkd_ref_prefix(doc, extra_footnote_prefix);

	if ( debug )
	    rc = mkd_dump(doc, stdout, 0, argc ? basename(argv[0]) : "stdin");
	else {
	    rc = 1;
	    if ( mkd_compile(doc, flags) ) {
		rc = 0;
		if ( styles )
		    mkd_generatecss(doc, stdout);
		if ( toc )
		    mkd_generatetoc(doc, stdout);
		if ( content )
		    mkd_generatehtml(doc, stdout);
	    }
	}
	mkd_cleanup(doc);
    }
    mkd_deallocate_tags();
    adump();
    exit( (rc == 0) ? 0 : errno );
}