URI:
       lang_ansi.st - enscript - GNU Enscript
  HTML git clone git://thinkerwim.org/enscript.git
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       lang_ansi.st (3308B)
       ---
            1 /*
            2  * Definitions for the ANSI color tty outputs.
            3  * Author: Bill Petheram <petheram@acm.org>
            4  *           Markku Rossi <mtr@iki.fi>
            5  */
            6 
            7 state lang_ansi
            8 {
            9   BEGIN {
           10     /* The current face as an ANSI str. */
           11     ansi_face_str = 0;
           12 
           13     ansi_face_stack = list();
           14     ansi_face_stack_pos = 0;
           15 
           16     ansi_color_table = list();
           17     ansi_color_table_size = 0;
           18 
           19     sub ansi_define_color(ansi, r, g, b)
           20       {
           21         ansi_color_table[ansi_color_table_size] = list(ansi, r, g, b);
           22         ansi_color_table_size = ansi_color_table_size + 1;
           23       }
           24 
           25     ansi_define_color(30, 0,   0,   0);         /* black */
           26     ansi_define_color(31, 205, 0,   0);         /* red3 */
           27     ansi_define_color(32, 0,   205, 0);          /* green3 */
           28     ansi_define_color(33, 205, 205, 0);                /* yellow3 */
           29     ansi_define_color(34, 0,   0,   205);        /* blue3 */
           30     ansi_define_color(35, 205, 0,   205);        /* magenta3 */
           31     ansi_define_color(36, 0,   205, 205);        /* cyan3 */
           32     ansi_define_color(37, 229, 229, 229);        /* gray90 */
           33 
           34     ansi_define_color(90, 77,  77,  77);         /* gray30 */
           35     ansi_define_color(91, 255, 0,   0);         /* red */
           36     ansi_define_color(92, 0,   255, 0);          /* green */
           37     ansi_define_color(93, 255, 255, 0);                /* yellow */
           38     ansi_define_color(94, 0,   0,   255);        /* blue */
           39     ansi_define_color(95, 255, 0,   255);        /* magenta */
           40     ansi_define_color(96, 0,   255, 255);        /* cyan */
           41     ansi_define_color(97, 255, 255, 255);        /* white */
           42 
           43     sub ansi_count_delta(a, b)
           44       {
           45         local delta = a - b;
           46 
           47         if (delta < 0)
           48           delta = 0 - delta;
           49 
           50         return delta * delta;
           51       }
           52 
           53     sub ansi_count_color_delta(ansi_color, r, g, b)
           54       {
           55         local delta = 0;
           56 
           57         delta += ansi_count_delta(ansi_color[1], r);
           58         delta += ansi_count_delta(ansi_color[2], g);
           59         delta += ansi_count_delta(ansi_color[3], b);
           60 
           61         return delta;
           62       }
           63 
           64     sub map_color(r, g, b)
           65       {
           66         local i, min = 65536, min_color = 0, delta;
           67 
           68         for (i = 0; i < ansi_color_table_size; i++)
           69           {
           70             delta = ansi_count_color_delta(ansi_color_table[i], r, g, b);
           71             if (delta < min)
           72               {
           73                 min_color = ansi_color_table[i][0];
           74                 min = delta;
           75               }
           76           }
           77         if (min > 16384)
           78           /* Don't accept too bad matches. */
           79           min_color = 0;
           80 
           81         return min_color;
           82       }
           83 
           84     LANGUAGE_SPECIALS = /\n/;
           85 
           86     sub language_print(str)
           87       {
           88         if (ansi_face_str)
           89           str = regsuball(str, /\n/, concat("\033[0m\n", ansi_face_str));
           90 
           91         print(str);
           92       }
           93 
           94     sub header()
           95       {
           96       }
           97 
           98     sub trailer()
           99       {
          100         print("\033[0m");
          101       }
          102 
          103     sub ansi_set_face(face)
          104       {
          105         local b = "", i = "", fg ="", bg = "";
          106 
          107         if (face[boldp])
          108           b = ";1";
          109         if (face[italicp])
          110           i = ";4";
          111         if (face[fg_color])
          112           fg = concat(";", string(face[fg_color]));
          113         if (face[bg_color])
          114           bg = concat(";", string(face[bg_color] + 10));
          115 
          116         ansi_face_str = concat("\033[0", b, i, fg, bg, "m");
          117 
          118         print(ansi_face_str);
          119       }
          120 
          121     sub face_on(face)
          122       {
          123         ansi_face_stack[ansi_face_stack_pos++] = face;
          124         ansi_set_face(face);
          125       }
          126 
          127     sub face_off(face)
          128       {
          129         if (ansi_face_stack_pos > 0)
          130           /* Just to make sure that we don't fail on some broken
          131              highlighting rules.  */
          132           ansi_face_stack_pos--;
          133 
          134         if (ansi_face_stack_pos == 0)
          135           {
          136             print("\033[0m");
          137             ansi_face_str = 0;
          138           }
          139         else
          140           ansi_set_face(ansi_face_stack[ansi_face_stack_pos - 1]);
          141       }
          142 
          143     return;
          144   }
          145 }
          146 
          147 
          148 /*
          149 Local variables:
          150 mode: c
          151 End:
          152 */