/* * html.c: * * Copyright (c) 2008 James McKenzie , * All rights reserved. * */ static char rcsid[] = "$Id$"; /* * $Log$ * Revision 1.15 2008/03/07 13:16:02 james * *** empty log message *** * * Revision 1.14 2008/03/07 12:37:04 james * *** empty log message *** * * Revision 1.13 2008/03/06 16:49:39 james * *** empty log message *** * * Revision 1.12 2008/03/06 16:49:05 james * *** empty log message *** * * Revision 1.11 2008/03/03 06:04:42 james * *** empty log message *** * * Revision 1.10 2008/03/02 10:37:56 james * *** empty log message *** * * Revision 1.9 2008/02/27 09:42:22 james * *** empty log message *** * * Revision 1.8 2008/02/27 01:52:38 james * *** empty log message *** * * Revision 1.7 2008/02/27 01:52:08 james * *** empty log message *** * * Revision 1.6 2008/02/20 23:42:05 staffcvs * *** empty log message *** * * Revision 1.5 2008/02/20 23:31:48 staffcvs * *** empty log message *** * * Revision 1.4 2008/02/20 22:54:22 staffcvs * *** empty log message *** * * Revision 1.3 2008/02/20 20:16:07 james * *** empty log message *** * * Revision 1.2 2008/02/04 02:05:06 james * *** empty log message *** * * Revision 1.1 2008/02/03 23:31:25 james * *** empty log message *** * */ #include "project.h" #define V(i) (((i)==0)?0x80:(((i)==1)?0xc0:0xff)) #define COLOR(r,g,b,i) ((((r)?(V(i)):0) << 0)| (((g)?(V(i)):0) << 8)| (((b)?(V(i)):0) << 16)) static int colormap[] = { [CRT_COLOR_BLACK] = COLOR (0, 0, 0, 0), [CRT_COLOR_RED] = COLOR (0, 0, 1, 0), [CRT_COLOR_GREEN] = COLOR (0, 1, 0, 0), [CRT_COLOR_YELLOW] = COLOR (0, 1, 1, 0), [CRT_COLOR_BLUE] = COLOR (1, 0, 0, 0), [CRT_COLOR_MAGENTA] = COLOR (1, 0, 1, 0), [CRT_COLOR_CYAN] = COLOR (1, 1, 0, 0), [CRT_COLOR_WHITE] = COLOR (1, 1, 1, 1), [CRT_COLOR_BLACK | CRT_COLOR_INTENSITY] = COLOR (1, 1, 1, 0), [CRT_COLOR_RED | CRT_COLOR_INTENSITY] = COLOR (0, 0, 1, 2), [CRT_COLOR_GREEN | CRT_COLOR_INTENSITY] = COLOR (0, 1, 0, 2), [CRT_COLOR_YELLOW | CRT_COLOR_INTENSITY] = COLOR (0, 1, 1, 2), [CRT_COLOR_BLUE | CRT_COLOR_INTENSITY] = COLOR (1, 0, 0, 2), [CRT_COLOR_MAGENTA | CRT_COLOR_INTENSITY] = COLOR (1, 0, 1, 2), [CRT_COLOR_CYAN | CRT_COLOR_INTENSITY] = COLOR (1, 1, 0, 2), [CRT_COLOR_WHITE | CRT_COLOR_INTENSITY] = COLOR (1, 1, 1, 2), }; static void html_entity (FILE * f, int c) { switch (c) { case 32: fprintf (f, " "); break; case 38: fprintf (f, "&"); break; case 60: fprintf (f, "<"); break; case 62: fprintf (f, ">"); break; default: if ((c >= 32) && (c < 127)) { fputc (c, f); } else if (c > 127) { fprintf (f, "&#x%04x;", c); } else { fputc (' ', f); } } } static void html_render (FILE * f, CRT_CA c) { int fg, bg; if (c.attr & CRT_ATTR_REVERSE) { fg = CRT_COLOR_BG (c.color); bg = CRT_COLOR_FG (c.color); } else { fg = CRT_COLOR_FG (c.color); bg = CRT_COLOR_BG (c.color); if (c.attr & CRT_ATTR_BOLD) fg |= CRT_COLOR_INTENSITY; } #ifdef CSS fprintf (f, "", colormap[fg], colormap[bg]); #else fprintf (f, "", colormap[bg], colormap[fg]); fprintf (f, ""); #endif if (c.attr & CRT_ATTR_UNDERLINE) fprintf (f, "
    "); if (c.attr & CRT_ATTR_BOLD) fprintf (f, ""); html_entity (f, c.chr); if (c.attr & CRT_ATTR_BOLD) fprintf (f, ""); if (c.attr & CRT_ATTR_UNDERLINE) fprintf (f, "
"); if (c.attr & CRT_ATTR_REVERSE) { fprintf (f, "
"); } #ifdef CSS fprintf (f, "
"); #else fprintf (f, ""); fprintf (f, ""); #endif } static void html_draw (FILE * f, CRT * c) { CRT_Pos p; int o; #ifdef CSS fprintf (f, "
");
#else
  fprintf (f, "\n");
#endif
  for (p.y = 0; p.y < c->size.y; ++p.y) {
    o = CRT_ADDR (p.y, 0);
#ifndef CSS
    fprintf (f, "");
#endif
    for (p.x = 0; p.x < c->size.x; ++p.x, ++o) {
      html_render (f, c->screen[o]);
    }
#ifdef CSS
    fprintf (f, "\n");
#else
    fprintf (f, "\n");
#endif
  }
#ifdef CSS
  fprintf (f, "\n");
#else
  fprintf (f, "
"); #endif } static int html_one_shot (ANSI * a, CRT * c) { html_draw (a->file, c); return 0; } static void ansi_free (ANSI * a) { free (a); } ANSI * ansi_new_html (FILE * f) { ANSI *ret; ret = xmalloc (sizeof (ANSI)); memset (ret, 0, sizeof (ANSI)); ret->file = f; ret->close = ansi_free; ret->one_shot = html_one_shot; return ret; }