Skip to content

Commit 6122d5c

Browse files
committed
commonmark renderer: improve escaping.
URL-escape special characters when escape mode is URL, and not otherwise. Entity-escape control characters (< 0x20) in non-literal escape modes.
1 parent becfb75 commit 6122d5c

File tree

1 file changed

+9
-4
lines changed

1 file changed

+9
-4
lines changed

src/commonmark.c

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ static CMARK_INLINE void outc(cmark_renderer *renderer, cmark_escaping escape,
3232
needs_escaping =
3333
c < 0x80 && escape != LITERAL &&
3434
((escape == NORMAL &&
35-
(c == '*' || c == '_' || c == '[' || c == ']' || c == '#' || c == '<' ||
35+
(c < 0x20 ||
36+
c == '*' || c == '_' || c == '[' || c == ']' || c == '#' || c == '<' ||
3637
c == '>' || c == '\\' || c == '`' || c == '!' ||
3738
(c == '&' && cmark_isalpha(nextc)) || (c == '!' && nextc == '[') ||
3839
(renderer->begin_content && (c == '-' || c == '+' || c == '=') &&
@@ -48,14 +49,18 @@ static CMARK_INLINE void outc(cmark_renderer *renderer, cmark_escaping escape,
4849
(c == '`' || c == '<' || c == '>' || c == '"' || c == '\\')));
4950

5051
if (needs_escaping) {
51-
if (cmark_isspace(c)) {
52+
if (escape == URL && cmark_isspace(c)) {
5253
// use percent encoding for spaces
53-
snprintf(encoded, ENCODED_SIZE, "%%%2x", c);
54+
snprintf(encoded, ENCODED_SIZE, "%%%2X", c);
5455
cmark_strbuf_puts(renderer->buffer, encoded);
5556
renderer->column += 3;
56-
} else {
57+
} else if (cmark_ispunct(c)) {
5758
cmark_render_ascii(renderer, "\\");
5859
cmark_render_code_point(renderer, c);
60+
} else { // render as entity
61+
snprintf(encoded, ENCODED_SIZE, "&#%d;", c);
62+
cmark_strbuf_puts(renderer->buffer, encoded);
63+
renderer->column += strlen(encoded);
5964
}
6065
} else {
6166
cmark_render_code_point(renderer, c);

0 commit comments

Comments
 (0)