\n", fp);
fputs("
", fp);
xevents(xw);
}
static void
writeStyle(XtermWidget xw, FILE *fp)
{
TScreen *s = TScreenOf(xw);
fputs(" \n", fp);
xevents(xw);
}
static void
dumpHtmlScreen(XtermWidget xw, FILE *fp)
{
TScreen *s = TScreenOf(xw);
int row;
for (row = s->top_marg; row <= s->bot_marg; ++row) {
dumpHtmlLine(xw, row, fp);
}
}
/*
* Note: initial and final space around values of class and style
* attribute are deliberate. They make it easier for XPath
* to test whether a particular name is among the attributes.
* It allows expressions such as
* [contains(@class, ' ul ')]
* instead of the unwieldy
* [contains(concat(' ', @class, ' '), ' ul ')]
* The ev and od (for even and odd rows) values
* avoid empty values when going back to old fg/bg.
*/
static void
dumpHtmlLine(XtermWidget xw, int row, FILE *fp)
{
TScreen *s = TScreenOf(xw);
char attrs[2][sizeof
""];
int attr_index = 0;
char *attr = &attrs[attr_index][0];
int inx = ROW2INX(s, row);
LineData *ld = getLineData(s, inx);
int col;
if (ld == 0)
return;
for (col = 0; col < MaxCols(s); col++) {
XColor fgcolor, bgcolor;
IChar chr = ld->charData[col];
int slen = 0;
fgcolor.pixel = xw->old_foreground;
bgcolor.pixel = xw->old_background;
#if OPT_ISO_COLORS
if (ld->attribs[col] & FG_COLOR) {
Pixel fg = extract_fg(xw, ld->color[col], ld->attribs[col]);
#if OPT_DIRECT_COLOR
if (ld->attribs[col] & ATR_DIRECT_FG)
fgcolor.pixel = fg;
else
#endif
fgcolor.pixel = s->Acolors[fg].value;
}
if (ld->attribs[col] & BG_COLOR) {
Pixel bg = extract_bg(xw, ld->color[col], ld->attribs[col]);
#if OPT_DIRECT_COLOR
if (ld->attribs[col] & ATR_DIRECT_BG)
bgcolor.pixel = bg;
else
#endif
bgcolor.pixel = s->Acolors[bg].value;
}
#endif
XQueryColor(xw->screen.display, xw->core.colormap, &fgcolor);
XQueryColor(xw->screen.display, xw->core.colormap, &bgcolor);
xevents(xw);
if (ld->attribs[col] & BLINK) {
/* White on red. */
fgcolor.red = fgcolor.green = fgcolor.blue = 65535u;
bgcolor.red = 65535u;
bgcolor.green = bgcolor.blue = 0u;
}
#if OPT_WIDE_ATTRS
if (ld->attribs[col] & ATR_FAINT) {
MakeDim(fgcolor.red);
MakeDim(fgcolor.green);
MakeDim(fgcolor.blue);
}
#endif
if (ld->attribs[col] & INVERSE) {
XColor tmp = fgcolor;
fgcolor = bgcolor;
bgcolor = tmp;
}
slen = sprintf(attr + slen, "", RGBPCT(bgcolor));
if (col == 0) {
fputs(attr, fp);
attr = &attrs[attr_index ^= 1][0];
} else {
if (strcmp(&attrs[0][0], &attrs[1][0])) {
fputs("", fp);
fputs(attr, fp);
attr = &attrs[attr_index ^= 1][0];
}
}
#if OPT_WIDE_CHARS
if (chr > 127) {
/* Ignore hidden characters. */
if (chr != HIDDEN_CHAR) {
Char temp[10];
*convertToUTF8(temp, chr) = 0;
fputs((char *) temp, fp);
}
} else
#endif
switch (chr) {
case 0:
fputc(' ', fp);
break;
case '&':
fputs("&", fp);
break;
case '<':
fputs("<", fp);
break;
case '>':
fputs(">", fp);
break;
case ' ':
fputs("\302\240", fp);
break;
default:
fputc((int) chr, fp);
}
xevents(xw);
}
fprintf(fp, "\n");
xevents(xw);
}
static void
dumpHtmlFooter(XtermWidget xw, FILE *fp)
{
fputs("
\n", fp);
fputs("
\n", fp);
fputs(" \n", fp);
fputs("\n", fp);
xevents(xw);
}
char *
PixelToCSSColor(XtermWidget xw, Pixel p)
{
static char rgb[sizeof "rgb(100.00%, 100.00%, 100.00%)"];
XColor c;
c.pixel = p;
XQueryColor(xw->screen.display, xw->core.colormap, &c);
sprintf(rgb, "rgb(%.2f%%, %.2f%%, %.2f%%)", RGBPCT(c));
return rgb;
}