summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn MacFarlane <jgm@berkeley.edu>2015-08-08 13:10:10 -0700
committerJohn MacFarlane <jgm@berkeley.edu>2015-08-08 13:10:47 -0700
commita4f61e832fa9f99e04d05ab4b4768538ba076c84 (patch)
tree37c52839620de5198487327e2fdfa5823b9c38af
parent2c3612447e35c879ad99e637dd473ec58fde9fd0 (diff)
Treat line ending with EOF as ending with newline.
Closes #71. Added a test to api_test.
-rw-r--r--api_test/main.c9
-rwxr-xr-xsrc/blocks.c4
2 files changed, 13 insertions, 0 deletions
diff --git a/api_test/main.c b/api_test/main.c
index 7c3ac1d..bcfbb6d 100644
--- a/api_test/main.c
+++ b/api_test/main.c
@@ -677,6 +677,7 @@ line_endings(test_batch_runner *runner)
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 const char crlf_lines[] = "line\r\nline\r\n";
html = cmark_markdown_to_html(crlf_lines,
sizeof(crlf_lines) - 1,
@@ -684,6 +685,14 @@ line_endings(test_batch_runner *runner)
STR_EQ(runner, html, "<p>line<br />\nline</p>\n",
"crlf endings with CMARK_OPT_HARDBREAKS");
free(html);
+
+ static const char no_line_ending[] = "```\nline\n```";
+ html = cmark_markdown_to_html(no_line_ending,
+ sizeof(no_line_ending) - 1,
+ CMARK_OPT_DEFAULT);
+ STR_EQ(runner, html, "<pre><code>line\n</code></pre>\n",
+ "fenced code block with no final newline");
+ free(html);
}
static void
diff --git a/src/blocks.c b/src/blocks.c
index f1e3a7a..4432f78 100755
--- a/src/blocks.c
+++ b/src/blocks.c
@@ -598,6 +598,10 @@ static void S_process_line(cmark_parser *parser, const unsigned char *buffer,
} else {
cmark_strbuf_put(parser->curline, buffer, bytes);
}
+ // ensure line ends with a newline:
+ if (!S_is_line_end_char(parser->curline->ptr[bytes - 1])) {
+ cmark_strbuf_putc(parser->curline, '\n');
+ }
parser->offset = 0;
parser->column = 0;
parser->blank = false;