diff options
Diffstat (limited to 'html.c')
-rw-r--r-- | html.c | 46 |
1 files changed, 46 insertions, 0 deletions
@@ -156,6 +156,52 @@ ssize_t html_ntxt(const char *txt, size_t len) return slen; } +ssize_t html_ntxt_pre(const char *txt, size_t len) +{ + const char *t = txt; + ssize_t slen; + int prev = 0; + + if (len > SSIZE_MAX) + return -1; + + slen = (ssize_t) len; + while (t && *t && slen--) { + int c = *t; + if (c == '<' || c == '>' || c == '&' || c == ' ' || c == '\t') { + html_raw(txt, t - txt); + if (c == '>') + html(">"); + else if (c == '<') + html("<"); + else if (c == '&') + html("&"); + else if (c == ' ') { + if (!prev || prev == ' ' || prev == '\t') { + html(" "); + /* next byte can be unescaped ' ' */ + c = 160; + } else { + html(" "); + } + } else if (c == '\t') { + html("    " + "    "); + /* next byte can be unescaped ' ' */ + c = 160; + } + txt = t + 1; + } + prev = c; + t++; + } + if (t != txt) + html_raw(txt, t - txt); + return slen; +} + + + void html_attrf(const char *fmt, ...) { va_list ap; |