diff --git a/src/inlines.c b/src/inlines.c
index db48258..817a9d3 100644
--- a/src/inlines.c
+++ b/src/inlines.c
@@ -37,6 +37,7 @@ static int writecodespan(char *data, int i, size_t len, FILE *out);
static int writelink(char *data, int i, size_t len, FILE *out);
static int writeimage(char *data, int i, size_t len, FILE *out);
static int writeautolink(char *data, int i, size_t len, FILE *out);
+static int writehardbreak(char *data, int i, size_t len, FILE *out);
static int getlinkinfo(char *data, int i, size_t len,
int *textstart, int *textend,
int *titlestart, int *titleend,
@@ -60,6 +61,8 @@ void writedata(char *data, size_t len, FILE *out) {
goto special;
if ((newi = writeautolink(data, i, len, out)) >= 0)
goto special;
+ if ((newi = writehardbreak(data, i, len, out)) >= 0)
+ goto special;
if (data[i] == '\\') {
if (strchr(punctuation, data[i + 1]) == NULL)
writechescape('\\', out);
@@ -180,6 +183,25 @@ static int writeautolink(char *data, int i, size_t len, FILE *out) {
return i;
}
+static int writehardbreak(char *data, int i, size_t len, FILE *out) {
+ const char *endcode = " \n";
+ const int codelen = strlen(endcode);
+ if (data[i] == '\\') {
+ if (++i >= len)
+ return -1;
+ if (data[i++] != '\n')
+ return -1;
+ fputs("
", out);
+ return i;
+ }
+ if (i + codelen >= len)
+ return -1;
+ if (memcmp(data + i, endcode, codelen) != 0)
+ return -1;
+ fputs("
", out);
+ return i + codelen;
+}
+
static int getlinkinfo(char *data, int i, size_t len,
int *textstart, int *textend,
int *titlestart, int *titleend,
diff --git a/src/template.c b/src/template.c
index 39e9b94..efee686 100644
--- a/src/template.c
+++ b/src/template.c
@@ -147,7 +147,7 @@ static int parseline(char *line, struct parsestate *currstate, FILE *out) {
currstate->prev.type = PLAIN;
}
else
- appendcharstring(currstate->para, ' ');
+ appendcharstring(currstate->para, '\n');
appendstrstring(currstate->para, realcontent(line, &type));
break;
/* According to the commonmark spec, this markdown: