Ignore:
Timestamp:
Nov 2, 2008, 6:38:37 PM (11 years ago)
Author:
bsittler
Message:

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcaca/trunk/caca/codec/export.c

    r3184 r3209  
    482482    /* The HTML table markup: less than 1000 bytes
    483483     * A line: 10 chars for "<tr></tr>\n"
    484      * A glyph: up to 44 chars for "<td bgcolor=\"#xxxxxx\"><font color=\"#xxxxxx\">"
    485      *          up to 45 chars for "<tt><b><i><u><blink></blink></u></i></b></tt>"
     484     * A glyph: up to 48 chars for "<td bgcolor=\"#xxxxxx\"><tt><font color=\"#xxxxxx\">"
     485     *          up to 36 chars for "<b><i><u><blink></blink></u></i></b>"
    486486     *          up to 9 chars for "&#xxxxxx;" (far less for pure ASCII)
    487      *          12 chars for "</font></td>" */
    488     *bytes = 1000 + cv->height * (10 + maxcols * (44 + 45 + 9 + 12));
     487     *          17 chars for "</font></tt></td>" */
     488    *bytes = 1000 + cv->height * (10 + maxcols * (48 + 36 + 9 + 17));
    489489    cur = data = malloc(*bytes);
    490490
     
    501501        for(x = 0; x < cv->width; x += len)
    502502        {
    503             int i, needfont;
     503            int i, needfont = 0;
    504504            int thistab = 0;
    505505
     
    507507             * (see below) */
    508508            len = 1;
    509             while((x + len < cv->width) && (lineattr[x + len] == lineattr[x]))
     509            while((x + len < cv->width)
     510                  &&
     511                  (caca_attr_to_ansi_bg(lineattr[x + len])
     512                   ==
     513                   caca_attr_to_ansi_bg(lineattr[x]))
     514                  &&
     515                  ((caca_attr_to_ansi_bg(lineattr[x]) < 0x10)
     516                   ?
     517                   (_caca_attr_to_rgb24bg(lineattr[x + len])
     518                    &&
     519                    _caca_attr_to_rgb24bg(lineattr[x]))
     520                   :
     521                   1))
    510522                len++;
    511523
     
    526538            cur += sprintf(cur, ">");
    527539
    528             needfont = caca_attr_to_ansi_fg(lineattr[x]) < 0x10;
    529 
    530             if(needfont)
    531                 cur += sprintf(cur, "<font color=\"#%.06lx\">", (unsigned long int)
    532                                _caca_attr_to_rgb24fg(lineattr[x]));
    533 
    534540            cur += sprintf(cur, "<tt>");
    535             if(lineattr[x] & CACA_BOLD)
    536                 cur += sprintf(cur, "<b>");
    537             if(lineattr[x] & CACA_ITALICS)
    538                 cur += sprintf(cur, "<i>");
    539             if(lineattr[x] & CACA_UNDERLINE)
    540                 cur += sprintf(cur, "<u>");
    541             if(lineattr[x] & CACA_BLINK)
    542                 cur += sprintf(cur, "<blink>");
    543541
    544542            for(i = 0; i < len; i++)
    545543            {
     544                if((! i) || (lineattr[x + i] != lineattr[x + i - 1]))
     545                {
     546                    needfont = caca_attr_to_ansi_fg(lineattr[x + i]) < 0x10;
     547
     548                    if(needfont)
     549                        cur += sprintf(cur, "<font color=\"#%.06lx\">", (unsigned long int)
     550                                       _caca_attr_to_rgb24fg(lineattr[x + i]));
     551
     552                    if(lineattr[x + i] & CACA_BOLD)
     553                        cur += sprintf(cur, "<b>");
     554                    if(lineattr[x + i] & CACA_ITALICS)
     555                        cur += sprintf(cur, "<i>");
     556                    if(lineattr[x + i] & CACA_UNDERLINE)
     557                        cur += sprintf(cur, "<u>");
     558                    if(lineattr[x + i] & CACA_BLINK)
     559                        cur += sprintf(cur, "<blink>");
     560                }
     561
    546562                if(linechar[x + i] == CACA_MAGIC_FULLWIDTH)
    547563                    ;
    548564                else if(linechar[x + i] <= 0x00000020)
    549565                {
     566                    /* Control characters and space converted to
     567                     * U+00A0 NO-BREAK SPACE, a.k.a. "&nbsp;" in HTML,
     568                     * but we use the equivalent numeric character
     569                     * reference &#160; so this will work in plain
     570                     * XHTML with no DTD too. We also expand tabs
     571                     * here, since they are not honored in HTML. */
    550572                    if(linechar[x + i] == 0x00000009)
    551573                    {
    552574                        while((x + i + taboff + 1) % 8)
    553575                        {
    554                             cur += sprintf(cur, "&nbsp;");
     576                            cur += sprintf(cur, "&#160;");
    555577                            taboff ++;
    556578                        }
    557579                    }
    558                     cur += sprintf(cur, "&nbsp;");
     580                    cur += sprintf(cur, "&#160;");
    559581                }
    560582                else if(linechar[x + i] == '&')
     
    572594                else
    573595                    cur += sprintf(cur, "&#%i;", (unsigned int)linechar[x + i]);
     596
     597                if (((i + 1) == len) || (lineattr[x + i + 1] != lineattr[x + i]))
     598                {
     599                    if(lineattr[x + i] & CACA_BLINK)
     600                        cur += sprintf(cur, "</blink>");
     601                    if(lineattr[x + i] & CACA_UNDERLINE)
     602                        cur += sprintf(cur, "</u>");
     603                    if(lineattr[x + i] & CACA_ITALICS)
     604                        cur += sprintf(cur, "</i>");
     605                    if(lineattr[x + i] & CACA_BOLD)
     606                        cur += sprintf(cur, "</b>");
     607
     608                    if(needfont)
     609                        cur += sprintf(cur, "</font>");
     610                }
    574611            }
    575612
    576             if(lineattr[x] & CACA_BLINK)
    577                 cur += sprintf(cur, "</blink>");
    578             if(lineattr[x] & CACA_UNDERLINE)
    579                 cur += sprintf(cur, "</u>");
    580             if(lineattr[x] & CACA_ITALICS)
    581                 cur += sprintf(cur, "</i>");
    582             if(lineattr[x] & CACA_BOLD)
    583                 cur += sprintf(cur, "</b>");
    584613            cur += sprintf(cur, "</tt>");
    585 
    586             if(needfont)
    587                 cur += sprintf(cur, "</font>");
    588614            cur += sprintf(cur, "</td>");
    589615        }
Note: See TracChangeset for help on using the changeset viewer.