summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn MacFarlane <jgm@berkeley.edu>2015-12-28 17:10:46 -0800
committerJohn MacFarlane <jgm@berkeley.edu>2015-12-28 17:10:46 -0800
commitcbc1bb638e14b010371e657c6861e83d99d230e1 (patch)
treec868460e219bc52586055d13517b776cb1ed8840
parent982152041830412fd6c61ba6e4746000709db92c (diff)
Commonmark renderer: ensure that literal characters get escaped
when they're at the beginning of a block, e.g. > \- foo
-rw-r--r--src/commonmark.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/commonmark.c b/src/commonmark.c
index 61ef016..69bd2b1 100644
--- a/src/commonmark.c
+++ b/src/commonmark.c
@@ -31,7 +31,7 @@ static inline void outc(cmark_renderer *renderer, cmark_escaping escape,
(c == '*' || c == '_' || c == '[' || c == ']' || c == '#' || c == '<' ||
c == '>' || c == '\\' || c == '`' || c == '!' ||
(c == '&' && isalpha(nextc)) || (c == '!' && nextc == '[') ||
- (renderer->begin_line && (c == '-' || c == '+' || c == '=')) ||
+ (renderer->begin_content && (c == '-' || c == '+' || c == '=')) ||
((c == '.' || c == ')') &&
isdigit(renderer->buffer->ptr[renderer->buffer->size - 1])))) ||
(escape == URL && (c == '`' || c == '<' || c == '>' || isspace(c) ||
@@ -176,6 +176,7 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node,
case CMARK_NODE_BLOCK_QUOTE:
if (entering) {
LIT("> ");
+ renderer->begin_content = true;
cmark_strbuf_puts(renderer->prefix, "> ");
} else {
cmark_strbuf_truncate(renderer->prefix, renderer->prefix->size - 2);
@@ -214,9 +215,11 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node,
if (entering) {
if (cmark_node_get_list_type(node->parent) == CMARK_BULLET_LIST) {
LIT("* ");
+ renderer->begin_content = true;
cmark_strbuf_puts(renderer->prefix, " ");
} else {
LIT(listmarker);
+ renderer->begin_content = true;
for (i = marker_width; i--;) {
cmark_strbuf_putc(renderer->prefix, ' ');
}
@@ -234,6 +237,7 @@ static int S_render_node(cmark_renderer *renderer, cmark_node *node,
LIT("#");
}
LIT(" ");
+ renderer->begin_content = true;
renderer->no_wrap = true;
} else {
renderer->no_wrap = false;