@@ -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