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 "xxxxx;", far less for pure ASCII
+ * up to 10 chars for "xxxxxx;", 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, "\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, "");
}