Browse Source

use a single table cell for adjacent attribute runs provided the background color will be the same; this allows us to avoid special stylesheets for our example programs

tags/v0.99.beta17
Ben Wiley Sittler bsittler 16 years ago
parent
commit
cb49816e2e
1 changed files with 59 additions and 33 deletions
  1. +59
    -33
      caca/codec/export.c

+ 59
- 33
caca/codec/export.c View File

@@ -481,11 +481,11 @@ static void *export_html3(caca_canvas_t const *cv, size_t *bytes)
/* The HTML table markup: less than 1000 bytes /* The HTML table markup: less than 1000 bytes
* A line: 10 chars for "<tr></tr>\n" * A line: 10 chars for "<tr></tr>\n"
* A glyph: up to 44 chars for "<td bgcolor=\"#xxxxxx\"><font color=\"#xxxxxx\">"
* up to 45 chars for "<tt><b><i><u><blink></blink></u></i></b></tt>"
* A glyph: up to 48 chars for "<td bgcolor=\"#xxxxxx\"><tt><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 9 chars for "&#xxxxxx;" (far less for pure ASCII)
* 12 chars for "</font></td>" */
*bytes = 1000 + cv->height * (10 + maxcols * (44 + 45 + 9 + 12));
* 17 chars for "</font></tt></td>" */
*bytes = 1000 + cv->height * (10 + maxcols * (48 + 36 + 9 + 17));
cur = data = malloc(*bytes); cur = data = malloc(*bytes);


cur += sprintf(cur, "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n"); cur += sprintf(cur, "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n");
@@ -500,13 +500,25 @@ static void *export_html3(caca_canvas_t const *cv, size_t *bytes)


for(x = 0; x < cv->width; x += len) for(x = 0; x < cv->width; x += len)
{ {
int i, needfont;
int i, needfont = 0;
int thistab = 0; int thistab = 0;


/* Use colspan option to factor cells with same attributes /* Use colspan option to factor cells with same attributes
* (see below) */ * (see below) */
len = 1; len = 1;
while((x + len < cv->width) && (lineattr[x + len] == lineattr[x]))
while((x + len < cv->width)
&&
(caca_attr_to_ansi_bg(lineattr[x + len])
==
caca_attr_to_ansi_bg(lineattr[x]))
&&
((caca_attr_to_ansi_bg(lineattr[x]) < 0x10)
?
(_caca_attr_to_rgb24bg(lineattr[x + len])
&&
_caca_attr_to_rgb24bg(lineattr[x]))
:
1))
len++; len++;


for(i = 0; i < len; i++) for(i = 0; i < len; i++)
@@ -525,37 +537,47 @@ static void *export_html3(caca_canvas_t const *cv, size_t *bytes)


cur += sprintf(cur, ">"); cur += sprintf(cur, ">");


needfont = caca_attr_to_ansi_fg(lineattr[x]) < 0x10;

if(needfont)
cur += sprintf(cur, "<font color=\"#%.06lx\">", (unsigned long int)
_caca_attr_to_rgb24fg(lineattr[x]));

cur += sprintf(cur, "<tt>"); cur += sprintf(cur, "<tt>");
if(lineattr[x] & CACA_BOLD)
cur += sprintf(cur, "<b>");
if(lineattr[x] & CACA_ITALICS)
cur += sprintf(cur, "<i>");
if(lineattr[x] & CACA_UNDERLINE)
cur += sprintf(cur, "<u>");
if(lineattr[x] & CACA_BLINK)
cur += sprintf(cur, "<blink>");


for(i = 0; i < len; i++) for(i = 0; i < len; i++)
{ {
if((! i) || (lineattr[x + i] != lineattr[x + i - 1]))
{
needfont = caca_attr_to_ansi_fg(lineattr[x + i]) < 0x10;

if(needfont)
cur += sprintf(cur, "<font color=\"#%.06lx\">", (unsigned long int)
_caca_attr_to_rgb24fg(lineattr[x + i]));

if(lineattr[x + i] & CACA_BOLD)
cur += sprintf(cur, "<b>");
if(lineattr[x + i] & CACA_ITALICS)
cur += sprintf(cur, "<i>");
if(lineattr[x + i] & CACA_UNDERLINE)
cur += sprintf(cur, "<u>");
if(lineattr[x + i] & CACA_BLINK)
cur += sprintf(cur, "<blink>");
}

if(linechar[x + i] == CACA_MAGIC_FULLWIDTH) if(linechar[x + i] == CACA_MAGIC_FULLWIDTH)
; ;
else if(linechar[x + i] <= 0x00000020) else if(linechar[x + i] <= 0x00000020)
{ {
/* Control characters and space converted to
* U+00A0 NO-BREAK SPACE, a.k.a. "&nbsp;" in HTML,
* but we use the equivalent numeric character
* reference &#160; so this will work in plain
* XHTML with no DTD too. We also expand tabs
* here, since they are not honored in HTML. */
if(linechar[x + i] == 0x00000009) if(linechar[x + i] == 0x00000009)
{ {
while((x + i + taboff + 1) % 8) while((x + i + taboff + 1) % 8)
{ {
cur += sprintf(cur, "&nbsp;");
cur += sprintf(cur, "&#160;");
taboff ++; taboff ++;
} }
} }
cur += sprintf(cur, "&nbsp;");
cur += sprintf(cur, "&#160;");
} }
else if(linechar[x + i] == '&') else if(linechar[x + i] == '&')
cur += sprintf(cur, "&amp;"); cur += sprintf(cur, "&amp;");
@@ -571,20 +593,24 @@ static void *export_html3(caca_canvas_t const *cv, size_t *bytes)
cur += sprintf(cur, "%c", (uint8_t)linechar[x + i]); cur += sprintf(cur, "%c", (uint8_t)linechar[x + i]);
else else
cur += sprintf(cur, "&#%i;", (unsigned int)linechar[x + i]); cur += sprintf(cur, "&#%i;", (unsigned int)linechar[x + i]);

if (((i + 1) == len) || (lineattr[x + i + 1] != lineattr[x + i]))
{
if(lineattr[x + i] & CACA_BLINK)
cur += sprintf(cur, "</blink>");
if(lineattr[x + i] & CACA_UNDERLINE)
cur += sprintf(cur, "</u>");
if(lineattr[x + i] & CACA_ITALICS)
cur += sprintf(cur, "</i>");
if(lineattr[x + i] & CACA_BOLD)
cur += sprintf(cur, "</b>");

if(needfont)
cur += sprintf(cur, "</font>");
}
} }


if(lineattr[x] & CACA_BLINK)
cur += sprintf(cur, "</blink>");
if(lineattr[x] & CACA_UNDERLINE)
cur += sprintf(cur, "</u>");
if(lineattr[x] & CACA_ITALICS)
cur += sprintf(cur, "</i>");
if(lineattr[x] & CACA_BOLD)
cur += sprintf(cur, "</b>");
cur += sprintf(cur, "</tt>"); cur += sprintf(cur, "</tt>");

if(needfont)
cur += sprintf(cur, "</font>");
cur += sprintf(cur, "</td>"); cur += sprintf(cur, "</td>");
} }
cur += sprintf(cur, "</tr>\n"); cur += sprintf(cur, "</tr>\n");


Loading…
Cancel
Save