|
|
@@ -459,45 +459,70 @@ static void *export_html3(caca_canvas_t const *cv, size_t *bytes) |
|
|
|
{ |
|
|
|
char *data, *cur; |
|
|
|
int x, y, len; |
|
|
|
int maxcols; |
|
|
|
|
|
|
|
/* The HTML table markup: less than 1000 bytes |
|
|
|
* A line: 10 chars for "<tr></tr>\n" |
|
|
|
* A glyph: 40 chars for "<td bgcolor=#xxxxxx><font color=#xxxxxx>" |
|
|
|
* up to 36 chars for "<b><i><u><blink></blink></u></i></b>" |
|
|
|
* up to 9 chars for "&#xxxxxx;", far less for pure ASCII |
|
|
|
* up to 48 chars for "&#xxxxxx;", or " " (\t); far less for pure ASCII |
|
|
|
* 12 chars for "</font></td>" */ |
|
|
|
*bytes = 1000 + cv->height * (10 + cv->width * (40 + 36 + 9 + 12)); |
|
|
|
*bytes = 1000 + cv->height * (10 + cv->width * (40 + 36 + 48 + 12)); |
|
|
|
cur = data = malloc(*bytes); |
|
|
|
|
|
|
|
/* Table */ |
|
|
|
maxcols = 0; |
|
|
|
for(y = 0; y < cv->height; y++) |
|
|
|
{ |
|
|
|
uint32_t *linechar = cv->chars + y * cv->width; |
|
|
|
int cols = 0; |
|
|
|
|
|
|
|
for(x = 0; x < cv->width; x++) |
|
|
|
{ |
|
|
|
if(linechar[x] == 0x00000009) |
|
|
|
while((cols + 1) % 8) |
|
|
|
cols ++; |
|
|
|
cols ++; |
|
|
|
} |
|
|
|
if (cols > maxcols) |
|
|
|
maxcols = cols; |
|
|
|
} |
|
|
|
|
|
|
|
cur += sprintf(cur, "<table cols='%d' cellpadding='0' cellspacing='0'>\n", |
|
|
|
cv->height); |
|
|
|
maxcols); |
|
|
|
|
|
|
|
for(y = 0; y < cv->height; y++) |
|
|
|
{ |
|
|
|
uint32_t *lineattr = cv->attrs + y * cv->width; |
|
|
|
uint32_t *linechar = cv->chars + y * cv->width; |
|
|
|
int taboff = 0; |
|
|
|
|
|
|
|
cur += sprintf(cur, "<tr>"); |
|
|
|
|
|
|
|
for(x = 0; x < cv->width; x += len) |
|
|
|
{ |
|
|
|
int i, needfont; |
|
|
|
int thistab = 0; |
|
|
|
|
|
|
|
/* Use colspan option to factor cells with same attributes |
|
|
|
* (see below) */ |
|
|
|
len = 1; |
|
|
|
while(x + len < cv->width && lineattr[x + len] == lineattr[x]) |
|
|
|
while((x + len < cv->width) && (lineattr[x + len] == lineattr[x])) |
|
|
|
len++; |
|
|
|
|
|
|
|
for(i = 0; i < len; i++) |
|
|
|
if(linechar[x + i] == 0x00000009) |
|
|
|
while((x + i + taboff + thistab + 1) % 8) |
|
|
|
thistab ++; |
|
|
|
|
|
|
|
cur += sprintf(cur, "<td"); |
|
|
|
|
|
|
|
if(caca_attr_to_ansi_fg(lineattr[x]) < 0x10) |
|
|
|
cur += sprintf(cur, " bgcolor=#%.06lx", (unsigned long int) |
|
|
|
_caca_attr_to_rgb24bg(lineattr[x])); |
|
|
|
|
|
|
|
if(len > 1) |
|
|
|
cur += sprintf(cur, " colspan=%d", len); |
|
|
|
if((len + thistab) > 1) |
|
|
|
cur += sprintf(cur, " colspan=%d", len + thistab); |
|
|
|
|
|
|
|
cur += sprintf(cur, ">"); |
|
|
|
|
|
|
@@ -521,7 +546,17 @@ static void *export_html3(caca_canvas_t const *cv, size_t *bytes) |
|
|
|
if(linechar[x + i] == CACA_MAGIC_FULLWIDTH) |
|
|
|
; |
|
|
|
else if(linechar[x + i] <= 0x00000020) |
|
|
|
{ |
|
|
|
if(linechar[x + i] == 0x00000009) |
|
|
|
{ |
|
|
|
while((x + i + taboff + 1) % 8) |
|
|
|
{ |
|
|
|
cur += sprintf(cur, " "); |
|
|
|
taboff ++; |
|
|
|
} |
|
|
|
} |
|
|
|
cur += sprintf(cur, " "); |
|
|
|
} |
|
|
|
else if(linechar[x + i] < 0x00000080) |
|
|
|
cur += sprintf(cur, "%c", (uint8_t)linechar[x + i]); |
|
|
|
else |
|
|
|