Hex Artifact Content
Not logged in

Artifact ed4dbc52ea956374725d97527628158bcf360ff1:


0000: 3b 3b 3b 3b 20 66 6d 74 2d 63 6f 6c 6f 72 2e 73  ;;;; fmt-color.s
0010: 63 6d 20 2d 2d 20 63 6f 6c 6f 72 65 64 20 6f 75  cm -- colored ou
0020: 74 70 75 74 0a 3b 3b 0a 3b 3b 20 43 6f 70 79 72  tput.;;.;; Copyr
0030: 69 67 68 74 20 28 63 29 20 32 30 30 36 2d 32 30  ight (c) 2006-20
0040: 30 37 20 41 6c 65 78 20 53 68 69 6e 6e 2e 20 20  07 Alex Shinn.  
0050: 41 6c 6c 20 72 69 67 68 74 73 20 72 65 73 65 72  All rights reser
0060: 76 65 64 2e 0a 3b 3b 20 42 53 44 2d 73 74 79 6c  ved..;; BSD-styl
0070: 65 20 6c 69 63 65 6e 73 65 3a 20 68 74 74 70 3a  e license: http:
0080: 2f 2f 73 79 6e 74 68 63 6f 64 65 2e 63 6f 6d 2f  //synthcode.com/
0090: 6c 69 63 65 6e 73 65 2e 74 78 74 0a 0a 28 64 65  license.txt..(de
00a0: 66 69 6e 65 20 28 66 6d 74 2d 63 6f 6c 6f 72 20  fine (fmt-color 
00b0: 73 74 29 20 28 66 6d 74 2d 72 65 66 20 73 74 20  st) (fmt-ref st 
00c0: 27 63 6f 6c 6f 72 29 29 0a 28 64 65 66 69 6e 65  'color)).(define
00d0: 20 28 66 6d 74 2d 69 6e 2d 68 74 6d 6c 3f 20 73   (fmt-in-html? s
00e0: 74 29 20 28 66 6d 74 2d 72 65 66 20 73 74 20 27  t) (fmt-ref st '
00f0: 69 6e 2d 68 74 6d 6c 3f 29 29 0a 28 64 65 66 69  in-html?)).(defi
0100: 6e 65 20 28 66 6d 74 2d 75 73 65 2d 68 74 6d 6c  ne (fmt-use-html
0110: 2d 66 6f 6e 74 3f 20 73 74 29 20 28 66 6d 74 2d  -font? st) (fmt-
0120: 72 65 66 20 73 74 20 27 75 73 65 2d 68 74 6d 6c  ref st 'use-html
0130: 2d 66 6f 6e 74 3f 29 29 0a 0a 28 64 65 66 69 6e  -font?))..(defin
0140: 65 20 28 63 6f 6c 6f 72 2d 3e 61 6e 73 69 20 78  e (color->ansi x
0150: 29 0a 20 20 28 69 66 20 28 6e 75 6d 62 65 72 3f  ).  (if (number?
0160: 20 78 29 0a 20 20 20 20 20 20 28 6c 65 74 20 28   x).      (let (
0170: 28 72 20 28 61 72 69 74 68 6d 65 74 69 63 2d 73  (r (arithmetic-s
0180: 68 69 66 74 20 78 20 2d 31 36 29 29 0a 20 20 20  hift x -16)).   
0190: 20 20 20 20 20 20 20 20 20 28 67 20 28 62 69 74           (g (bit
01a0: 77 69 73 65 2d 61 6e 64 20 28 61 72 69 74 68 6d  wise-and (arithm
01b0: 65 74 69 63 2d 73 68 69 66 74 20 78 20 2d 38 29  etic-shift x -8)
01c0: 20 23 78 46 46 29 29 0a 20 20 20 20 20 20 20 20   #xFF)).        
01d0: 20 20 20 20 28 62 20 28 62 69 74 77 69 73 65 2d      (b (bitwise-
01e0: 61 6e 64 20 78 20 23 78 46 46 29 29 29 0a 20 20  and x #xFF))).  
01f0: 20 20 20 20 20 20 3b 3b 20 6a 75 73 74 20 70 69        ;; just pi
0200: 63 6b 73 20 74 68 65 20 68 69 67 68 65 73 74 20  cks the highest 
0210: 63 6f 6c 6f 72 20 76 61 6c 75 65 20 2d 20 6e 65  color value - ne
0220: 65 64 20 74 6f 20 64 65 74 65 63 74 20 62 6c 65  ed to detect ble
0230: 6e 64 73 0a 20 20 20 20 20 20 20 20 28 63 6f 6c  nds.        (col
0240: 6f 72 2d 3e 61 6e 73 69 0a 20 20 20 20 20 20 20  or->ansi.       
0250: 20 20 28 63 6f 6e 64 0a 20 20 20 20 20 20 20 20    (cond.        
0260: 20 20 20 28 28 3e 20 72 20 67 29 20 28 69 66 20     ((> r g) (if 
0270: 28 3e 20 72 20 62 29 20 27 72 65 64 20 27 62 6c  (> r b) 'red 'bl
0280: 75 65 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  ue)).           
0290: 28 28 3e 20 67 20 62 29 20 27 67 72 65 65 6e 29  ((> g b) 'green)
02a0: 0a 20 20 20 20 20 20 20 20 20 20 20 28 65 6c 73  .           (els
02b0: 65 20 27 62 6c 75 65 29 29 29 29 0a 20 20 20 20  e 'blue)))).    
02c0: 20 20 28 63 61 73 65 20 78 0a 20 20 20 20 20 20    (case x.      
02d0: 20 20 28 28 62 6f 6c 64 29 20 22 31 22 29 0a 20    ((bold) "1"). 
02e0: 20 20 20 20 20 20 20 28 28 64 61 72 6b 29 20 22         ((dark) "
02f0: 32 22 29 0a 20 20 20 20 20 20 20 20 28 28 75 6e  2").        ((un
0300: 64 65 72 6c 69 6e 65 29 20 22 34 22 29 0a 20 20  derline) "4").  
0310: 20 20 20 20 20 20 28 28 62 6c 61 63 6b 29 20 22        ((black) "
0320: 33 30 22 29 0a 20 20 20 20 20 20 20 20 28 28 72  30").        ((r
0330: 65 64 29 20 22 33 31 22 29 0a 20 20 20 20 20 20  ed) "31").      
0340: 20 20 28 28 67 72 65 65 6e 29 20 22 33 32 22 29    ((green) "32")
0350: 0a 20 20 20 20 20 20 20 20 28 28 79 65 6c 6c 6f  .        ((yello
0360: 77 29 20 22 33 33 22 29 0a 20 20 20 20 20 20 20  w) "33").       
0370: 20 28 28 62 6c 75 65 29 20 22 33 34 22 29 0a 20   ((blue) "34"). 
0380: 20 20 20 20 20 20 20 28 28 6d 61 67 65 6e 74 61         ((magenta
0390: 29 20 22 33 35 22 29 0a 20 20 20 20 20 20 20 20  ) "35").        
03a0: 28 28 63 79 61 6e 29 20 22 33 36 22 29 0a 20 20  ((cyan) "36").  
03b0: 20 20 20 20 20 20 28 28 77 68 69 74 65 29 20 22        ((white) "
03c0: 33 37 22 29 0a 20 20 20 20 20 20 20 20 28 65 6c  37").        (el
03d0: 73 65 20 22 30 22 29 29 29 29 0a 0a 28 64 65 66  se "0"))))..(def
03e0: 69 6e 65 20 28 61 6e 73 69 2d 65 73 63 61 70 65  ine (ansi-escape
03f0: 20 63 6f 6c 6f 72 29 0a 20 20 28 63 61 74 20 28   color).  (cat (
0400: 69 6e 74 65 67 65 72 2d 3e 63 68 61 72 20 32 37  integer->char 27
0410: 29 20 22 5b 22 20 28 63 6f 6c 6f 72 2d 3e 61 6e  ) "[" (color->an
0420: 73 69 20 63 6f 6c 6f 72 29 20 22 6d 22 29 29 0a  si color) "m")).
0430: 0a 28 64 65 66 69 6e 65 20 28 66 6d 74 2d 69 6e  .(define (fmt-in
0440: 2d 68 74 6d 6c 20 2e 20 61 72 67 73 29 0a 20 20  -html . args).  
0450: 28 66 6d 74 2d 6c 65 74 20 27 69 6e 2d 68 74 6d  (fmt-let 'in-htm
0460: 6c 3f 20 23 74 20 28 61 70 70 6c 79 2d 63 61 74  l? #t (apply-cat
0470: 20 61 72 67 73 29 29 29 0a 0a 28 64 65 66 69 6e   args)))..(defin
0480: 65 20 28 66 6d 74 2d 63 6f 6c 6f 72 65 64 20 63  e (fmt-colored c
0490: 6f 6c 6f 72 20 2e 20 61 72 67 73 29 0a 20 20 28  olor . args).  (
04a0: 66 6d 74 2d 69 66 20 66 6d 74 2d 69 6e 2d 68 74  fmt-if fmt-in-ht
04b0: 6d 6c 3f 0a 20 20 20 20 20 20 20 20 20 20 28 63  ml?.          (c
04c0: 6f 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ond.            
04d0: 28 28 65 71 3f 20 63 6f 6c 6f 72 20 27 62 6f 6c  ((eq? color 'bol
04e0: 64 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d).             
04f0: 28 63 61 74 20 22 3c 62 3e 22 20 28 61 70 70 6c  (cat "<b>" (appl
0500: 79 2d 63 61 74 20 61 72 67 73 29 20 22 3c 2f 62  y-cat args) "</b
0510: 3e 22 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  >")).           
0520: 20 28 28 65 71 3f 20 63 6f 6c 6f 72 20 27 75 6e   ((eq? color 'un
0530: 64 65 72 6c 69 6e 65 29 0a 20 20 20 20 20 20 20  derline).       
0540: 20 20 20 20 20 20 28 63 61 74 20 22 3c 75 3e 22        (cat "<u>"
0550: 20 28 61 70 70 6c 79 2d 63 61 74 20 61 72 67 73   (apply-cat args
0560: 29 20 22 3c 2f 75 3e 22 29 29 0a 20 20 20 20 20  ) "</u>")).     
0570: 20 20 20 20 20 20 20 28 65 6c 73 65 0a 20 20 20         (else.   
0580: 20 20 20 20 20 20 20 20 20 20 28 6c 65 74 20 28            (let (
0590: 28 63 6e 61 6d 65 20 28 69 66 20 28 6e 75 6d 62  (cname (if (numb
05a0: 65 72 3f 20 63 6f 6c 6f 72 29 20 28 63 61 74 20  er? color) (cat 
05b0: 22 23 22 20 63 6f 6c 6f 72 29 20 63 6f 6c 6f 72  "#" color) color
05c0: 29 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))).            
05d0: 20 20 20 28 66 6d 74 2d 69 66 20 66 6d 74 2d 75     (fmt-if fmt-u
05e0: 73 65 2d 68 74 6d 6c 2d 66 6f 6e 74 3f 0a 20 20  se-html-font?.  
05f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0600: 20 20 20 20 20 28 63 61 74 20 22 3c 66 6f 6e 74       (cat "<font
0610: 20 63 6f 6c 6f 72 3d 5c 22 22 20 63 6e 61 6d 65   color=\"" cname
0620: 20 22 5c 22 3e 22 20 28 61 70 70 6c 79 2d 63 61   "\">" (apply-ca
0630: 74 20 61 72 67 73 29 0a 20 20 20 20 20 20 20 20  t args).        
0640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0650: 20 20 20 20 22 3c 2f 66 6f 6e 74 3e 22 29 0a 20      "</font>"). 
0660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0670: 20 20 20 20 20 20 28 63 61 74 20 22 3c 73 70 61        (cat "<spa
0680: 6e 20 73 74 79 6c 65 3d 63 6f 6c 6f 72 3a 5c 22  n style=color:\"
0690: 22 20 63 6e 61 6d 65 20 22 5c 22 3e 22 0a 20 20  " cname "\">".  
06a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06b0: 20 20 20 20 20 20 20 20 20 20 28 61 70 70 6c 79            (apply
06c0: 2d 63 61 74 20 61 72 67 73 29 20 22 3c 2f 73 70  -cat args) "</sp
06d0: 61 6e 3e 22 29 29 29 29 29 0a 20 20 20 20 20 20  an>"))))).      
06e0: 20 20 20 20 28 6c 61 6d 62 64 61 20 28 73 74 29      (lambda (st)
06f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 6c 65  .            (le
0700: 74 20 28 28 6f 6c 64 2d 63 6f 6c 6f 72 20 28 66  t ((old-color (f
0710: 6d 74 2d 63 6f 6c 6f 72 20 73 74 29 29 29 0a 20  mt-color st))). 
0720: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 66               ((f
0730: 6d 74 2d 6c 65 74 20 27 63 6f 6c 6f 72 20 63 6f  mt-let 'color co
0740: 6c 6f 72 0a 20 20 20 20 20 20 20 20 20 20 20 20  lor.            
0750: 20 20 20 20 20 20 20 20 20 20 20 20 28 63 61 74              (cat
0760: 20 28 61 6e 73 69 2d 65 73 63 61 70 65 20 63 6f   (ansi-escape co
0770: 6c 6f 72 29 0a 20 20 20 20 20 20 20 20 20 20 20  lor).           
0780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0790: 20 20 28 61 70 70 6c 79 2d 63 61 74 20 61 72 67    (apply-cat arg
07a0: 73 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s).             
07b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07c0: 28 69 66 20 28 6f 72 20 28 6d 65 6d 76 20 63 6f  (if (or (memv co
07d0: 6c 6f 72 20 27 28 62 6f 6c 64 20 75 6e 64 65 72  lor '(bold under
07e0: 6c 69 6e 65 29 29 0a 20 20 20 20 20 20 20 20 20  line)).         
07f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0800: 20 20 20 20 20 20 20 20 20 20 20 20 28 6d 65 6d              (mem
0810: 76 20 6f 6c 64 2d 63 6f 6c 6f 72 20 27 28 62 6f  v old-color '(bo
0820: 6c 64 20 75 6e 64 65 72 6c 69 6e 65 29 29 29 0a  ld underline))).
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0850: 20 28 61 6e 73 69 2d 65 73 63 61 70 65 20 27 72   (ansi-escape 'r
0860: 65 73 65 74 29 0a 20 20 20 20 20 20 20 20 20 20  eset).          
0870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0880: 20 20 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28         (lambda (
0890: 73 74 29 20 73 74 29 29 0a 20 20 20 20 20 20 20  st) st)).       
08a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08b0: 20 20 20 20 20 20 28 61 6e 73 69 2d 65 73 63 61        (ansi-esca
08c0: 70 65 20 6f 6c 64 2d 63 6f 6c 6f 72 29 29 29 0a  pe old-color))).
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
08e0: 74 29 29 29 29 29 0a 0a 28 64 65 66 69 6e 65 20  t)))))..(define 
08f0: 28 66 6d 74 2d 72 65 64 20 2e 20 61 72 67 73 29  (fmt-red . args)
0900: 20 28 66 6d 74 2d 63 6f 6c 6f 72 65 64 20 27 72   (fmt-colored 'r
0910: 65 64 20 28 61 70 70 6c 79 2d 63 61 74 20 61 72  ed (apply-cat ar
0920: 67 73 29 29 29 0a 28 64 65 66 69 6e 65 20 28 66  gs))).(define (f
0930: 6d 74 2d 62 6c 75 65 20 2e 20 61 72 67 73 29 20  mt-blue . args) 
0940: 28 66 6d 74 2d 63 6f 6c 6f 72 65 64 20 27 62 6c  (fmt-colored 'bl
0950: 75 65 20 28 61 70 70 6c 79 2d 63 61 74 20 61 72  ue (apply-cat ar
0960: 67 73 29 29 29 0a 28 64 65 66 69 6e 65 20 28 66  gs))).(define (f
0970: 6d 74 2d 67 72 65 65 6e 20 2e 20 61 72 67 73 29  mt-green . args)
0980: 20 28 66 6d 74 2d 63 6f 6c 6f 72 65 64 20 27 67   (fmt-colored 'g
0990: 72 65 65 6e 20 28 61 70 70 6c 79 2d 63 61 74 20  reen (apply-cat 
09a0: 61 72 67 73 29 29 29 0a 28 64 65 66 69 6e 65 20  args))).(define 
09b0: 28 66 6d 74 2d 63 79 61 6e 20 2e 20 61 72 67 73  (fmt-cyan . args
09c0: 29 20 28 66 6d 74 2d 63 6f 6c 6f 72 65 64 20 27  ) (fmt-colored '
09d0: 63 79 61 6e 20 28 61 70 70 6c 79 2d 63 61 74 20  cyan (apply-cat 
09e0: 61 72 67 73 29 29 29 0a 28 64 65 66 69 6e 65 20  args))).(define 
09f0: 28 66 6d 74 2d 79 65 6c 6c 6f 77 20 2e 20 61 72  (fmt-yellow . ar
0a00: 67 73 29 20 28 66 6d 74 2d 63 6f 6c 6f 72 65 64  gs) (fmt-colored
0a10: 20 27 79 65 6c 6c 6f 77 20 28 61 70 70 6c 79 2d   'yellow (apply-
0a20: 63 61 74 20 61 72 67 73 29 29 29 0a 28 64 65 66  cat args))).(def
0a30: 69 6e 65 20 28 66 6d 74 2d 6d 61 67 65 6e 74 61  ine (fmt-magenta
0a40: 20 2e 20 61 72 67 73 29 20 28 66 6d 74 2d 63 6f   . args) (fmt-co
0a50: 6c 6f 72 65 64 20 27 6d 61 67 65 6e 74 61 20 28  lored 'magenta (
0a60: 61 70 70 6c 79 2d 63 61 74 20 61 72 67 73 29 29  apply-cat args))
0a70: 29 0a 28 64 65 66 69 6e 65 20 28 66 6d 74 2d 77  ).(define (fmt-w
0a80: 68 69 74 65 20 2e 20 61 72 67 73 29 20 28 66 6d  hite . args) (fm
0a90: 74 2d 63 6f 6c 6f 72 65 64 20 27 77 68 69 74 65  t-colored 'white
0aa0: 20 28 61 70 70 6c 79 2d 63 61 74 20 61 72 67 73   (apply-cat args
0ab0: 29 29 29 0a 28 64 65 66 69 6e 65 20 28 66 6d 74  ))).(define (fmt
0ac0: 2d 62 6c 61 63 6b 20 2e 20 61 72 67 73 29 20 28  -black . args) (
0ad0: 66 6d 74 2d 63 6f 6c 6f 72 65 64 20 27 62 6c 61  fmt-colored 'bla
0ae0: 63 6b 20 28 61 70 70 6c 79 2d 63 61 74 20 61 72  ck (apply-cat ar
0af0: 67 73 29 29 29 0a 28 64 65 66 69 6e 65 20 28 66  gs))).(define (f
0b00: 6d 74 2d 62 6f 6c 64 20 2e 20 61 72 67 73 29 20  mt-bold . args) 
0b10: 28 66 6d 74 2d 63 6f 6c 6f 72 65 64 20 27 62 6f  (fmt-colored 'bo
0b20: 6c 64 20 28 61 70 70 6c 79 2d 63 61 74 20 61 72  ld (apply-cat ar
0b30: 67 73 29 29 29 0a 28 64 65 66 69 6e 65 20 28 66  gs))).(define (f
0b40: 6d 74 2d 75 6e 64 65 72 6c 69 6e 65 20 2e 20 61  mt-underline . a
0b50: 72 67 73 29 20 28 66 6d 74 2d 63 6f 6c 6f 72 65  rgs) (fmt-colore
0b60: 64 20 27 75 6e 64 65 72 6c 69 6e 65 20 28 61 70  d 'underline (ap
0b70: 70 6c 79 2d 63 61 74 20 61 72 67 73 29 29 29 0a  ply-cat args))).
0b80: 0a                                               .