@@ -32,7 +32,8 @@ static CMARK_INLINE void outc(cmark_renderer *renderer, cmark_escaping escape,
32
32
needs_escaping =
33
33
c < 0x80 && escape != LITERAL &&
34
34
((escape == NORMAL &&
35
- (c == '*' || c == '_' || c == '[' || c == ']' || c == '#' || c == '<' ||
35
+ (c < 0x20 ||
36
+ c == '*' || c == '_' || c == '[' || c == ']' || c == '#' || c == '<' ||
36
37
c == '>' || c == '\\' || c == '`' || c == '!' ||
37
38
(c == '&' && cmark_isalpha (nextc )) || (c == '!' && nextc == '[' ) ||
38
39
(renderer -> begin_content && (c == '-' || c == '+' || c == '=' ) &&
@@ -48,14 +49,18 @@ static CMARK_INLINE void outc(cmark_renderer *renderer, cmark_escaping escape,
48
49
(c == '`' || c == '<' || c == '>' || c == '"' || c == '\\' )));
49
50
50
51
if (needs_escaping ) {
51
- if (cmark_isspace (c )) {
52
+ if (escape == URL && cmark_isspace (c )) {
52
53
// use percent encoding for spaces
53
- snprintf (encoded , ENCODED_SIZE , "%%%2x " , c );
54
+ snprintf (encoded , ENCODED_SIZE , "%%%2X " , c );
54
55
cmark_strbuf_puts (renderer -> buffer , encoded );
55
56
renderer -> column += 3 ;
56
- } else {
57
+ } else if ( cmark_ispunct ( c )) {
57
58
cmark_render_ascii (renderer , "\\" );
58
59
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 );
59
64
}
60
65
} else {
61
66
cmark_render_code_point (renderer , c );
0 commit comments