static ERL_NIF_TERM to_html_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { ErlNifBinary markdown_binary; ErlNifBinary output_binary; char *html; size_t html_len; int options = 0; if (argc != 1) { return enif_make_badarg(env); } if(!enif_inspect_binary(env, argv[0], &markdown_binary)){ return enif_make_badarg(env); } if (markdown_binary.size <= 0){ const char *empty_string = ""; const int empty_len = strlen(empty_string); enif_alloc_binary(empty_len, &output_binary); strncpy((char*)output_binary.data, empty_string, empty_len); return enif_make_binary(env, &output_binary); } html = cmark_markdown_to_html((const char *)markdown_binary.data, markdown_binary.size, options); html_len = strlen(html); enif_release_binary(&markdown_binary); enif_alloc_binary(html_len, &output_binary); strncpy((char*)output_binary.data, html, html_len); return enif_make_binary(env, &output_binary); };
static void test_md_to_html(test_batch_runner *runner, const char *markdown, const char *expected_html, const char *msg) { char *html = cmark_markdown_to_html(markdown, strlen(markdown)); STR_EQ(runner, html, expected_html, msg); free(html); }
MarkdownToHtml::MarkdownToHtmlResult MarkdownToHtml::translateCommonMarkToHtml(MarkdownType type, const char *data, const int length, std::string &outHtml) { char *result = cmark_markdown_to_html(data, length, CMARK_OPT_DEFAULT); outHtml.append(result); free(result); return SUCCESS; }
static void line_endings(test_batch_runner *runner) { // Test list with different line endings static const char list_with_endings[] = "- a\n- b\r\n- c\r- d"; char *html = cmark_markdown_to_html(list_with_endings, sizeof(list_with_endings) - 1, CMARK_OPT_DEFAULT); STR_EQ(runner, html, "<ul>\n<li>a</li>\n<li>b</li>\n<li>c</li>\n<li>d</li>\n</ul>\n", "list with different line endings"); free(html); }
static void utf8(test_batch_runner *runner) { // Ranges test_char(runner, 1, "\x01", "valid utf8 01"); test_char(runner, 1, "\x7F", "valid utf8 7F"); test_char(runner, 0, "\x80", "invalid utf8 80"); test_char(runner, 0, "\xBF", "invalid utf8 BF"); test_char(runner, 0, "\xC0\x80", "invalid utf8 C080"); test_char(runner, 0, "\xC1\xBF", "invalid utf8 C1BF"); test_char(runner, 1, "\xC2\x80", "valid utf8 C280"); test_char(runner, 1, "\xDF\xBF", "valid utf8 DFBF"); test_char(runner, 0, "\xE0\x80\x80", "invalid utf8 E08080"); test_char(runner, 0, "\xE0\x9F\xBF", "invalid utf8 E09FBF"); test_char(runner, 1, "\xE0\xA0\x80", "valid utf8 E0A080"); test_char(runner, 1, "\xED\x9F\xBF", "valid utf8 ED9FBF"); test_char(runner, 0, "\xED\xA0\x80", "invalid utf8 EDA080"); test_char(runner, 0, "\xED\xBF\xBF", "invalid utf8 EDBFBF"); test_char(runner, 0, "\xF0\x80\x80\x80", "invalid utf8 F0808080"); test_char(runner, 0, "\xF0\x8F\xBF\xBF", "invalid utf8 F08FBFBF"); test_char(runner, 1, "\xF0\x90\x80\x80", "valid utf8 F0908080"); test_char(runner, 1, "\xF4\x8F\xBF\xBF", "valid utf8 F48FBFBF"); test_char(runner, 0, "\xF4\x90\x80\x80", "invalid utf8 F4908080"); test_char(runner, 0, "\xF7\xBF\xBF\xBF", "invalid utf8 F7BFBFBF"); test_char(runner, 0, "\xF8", "invalid utf8 F8"); test_char(runner, 0, "\xFF", "invalid utf8 FF"); // Incomplete byte sequences at end of input test_incomplete_char(runner, "\xE0\xA0", "invalid utf8 E0A0"); test_incomplete_char(runner, "\xF0\x90\x80", "invalid utf8 F09080"); // Invalid continuation bytes test_continuation_byte(runner, "\xC2\x80"); test_continuation_byte(runner, "\xE0\xA0\x80"); test_continuation_byte(runner, "\xF0\x90\x80\x80"); // Test string containing null character static const char string_with_null[] = "((((\0))))"; char *html = cmark_markdown_to_html(string_with_null, sizeof(string_with_null) - 1, CMARK_OPT_DEFAULT); STR_EQ(runner, html, "<p>((((" UTF8_REPL "))))</p>\n", "utf8 with U+0000"); free(html); }
static void test_continuation_byte(test_batch_runner *runner, const char *utf8) { int len = strlen(utf8); for (int pos = 1; pos < len; ++pos) { char buf[20]; sprintf(buf, "((((%s))))", utf8); buf[4+pos] = '\x20'; char expected[50]; strcpy(expected, "<p>((((" UTF8_REPL "\x20"); for (int i = pos + 1; i < len; ++i) { strcat(expected, UTF8_REPL); } strcat(expected, "))))</p>\n"); char *html = cmark_markdown_to_html(buf, strlen(buf)); STR_EQ(runner, html, expected, "invalid utf8 continuation byte %d/%d", pos, len); free(html); } }