From d32f8eb7f88ffe5983e119aac96af11bd6b70497 Mon Sep 17 00:00:00 2001 From: Ben Wiley Sittler Date: Mon, 3 Nov 2008 18:16:38 +0000 Subject: [PATCH] fix foreground-color and quoting bugs in the "html" exporter; also, the output is now labelled as XHTML 1.0 Strict, since it does conform to that DTD. also removed spurious cellpadding and cellspacing from
markup. also handle non-characters by conversion to replacement character, and handle more control characters by conversion to no-break space. finally, switch from   to the equivalent   so that a non-validating XML parser (which is most of them) can correctly parse this document. --- caca/codec/export.c | 52 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 43 insertions(+), 9 deletions(-) diff --git a/caca/codec/export.c b/caca/codec/export.c index 790846a..f375d9c 100644 --- a/caca/codec/export.c +++ b/caca/codec/export.c @@ -382,18 +382,22 @@ static void *export_html(caca_canvas_t const *cv, size_t *bytes) * A line: 7 chars for "
\n" * A glyph: 47 chars for "" * 83 chars for ";font-weight..." - * up to 9 chars for "&#xxxxxx;", far less for pure ASCII + * up to 10 chars for "&#xxxxxxx;", far less for pure ASCII * 7 chars for "" */ - *bytes = 1000 + cv->height * (7 + cv->width * (47 + 83 + 9 + 7)); + *bytes = 1000 + cv->height * (7 + cv->width * (47 + 83 + 10 + 7)); cur = data = malloc(*bytes); /* HTML header */ - cur += sprintf(cur, "\n"); + + cur += sprintf(cur, "\n"); + cur += sprintf(cur, ""); + cur += sprintf(cur, "\n"); cur += sprintf(cur, "Generated by libcaca %s\n", caca_get_version()); cur += sprintf(cur, "\n"); - cur += sprintf(cur, "
\n", + cur += sprintf(cur, "
\n", "font-family: monospace, fixed; font-weight: bold;"); for(y = 0; y < cv->height; y++) @@ -404,7 +408,7 @@ static void *export_html(caca_canvas_t const *cv, size_t *bytes) for(x = 0; x < cv->width; x += len) { cur += sprintf(cur, "= 0x0000007f) + && + (linechar[x + len] <= 0x000000a0))) + { + /* Control characters and space converted to + * U+00A0 NO-BREAK SPACE, a.k.a. " " in HTML, + * but we use the equivalent numeric character + * reference   so this will work in plain + * XHTML with no DTD too. */ + cur += sprintf(cur, " "); + } + else if(linechar[x + len] == '&') + cur += sprintf(cur, "&"); + else if(linechar[x + len] == '<') + cur += sprintf(cur, "<"); + else if(linechar[x + len] == '>') + cur += sprintf(cur, ">"); + else if(linechar[x + len] == '\"') + cur += sprintf(cur, """); + else if(linechar[x + len] == '\'') + cur += sprintf(cur, "'"); else if(linechar[x + len] < 0x00000080) cur += sprintf(cur, "%c", (uint8_t)linechar[x + len]); + else if((linechar[x + len] <= 0x0010fffd) + && + ((linechar[x + len] & 0x0000fffe) != 0x0000fffe) + && + ((linechar[x + len] < 0x0000d800) + || + (linechar[x + len] > 0x0000dfff))) + cur += sprintf(cur, "&#%i;", (unsigned int)linechar[x + len]); else - cur += sprintf(cur, "&#%i;", - (unsigned int)linechar[x + len]); + /* non-character codepoints become U+FFFD + * REPLACEMENT CHARACTER */ + cur += sprintf(cur, "&#%i;", (unsigned int)0x0000fffd); } cur += sprintf(cur, ""); }