1 ! Copyright (C) 2012 John Benediktsson
2 ! See http://factorcode.org/license.txt for BSD license
4 USING: accessors arrays assocs destructors environment
5 formatting io io.streams.escape-codes io.streams.string
6 io.styles kernel math math.functions math.vectors namespaces
7 ranges sequences strings strings.tables ;
9 IN: io.streams.256color
13 CONSTANT: intensities { 0x00 0x5F 0x87 0xAF 0xD7 0xFF }
15 CONSTANT: 256colors H{
17 ! System colors (8 colors)
27 ! "Bright" version of 8 colors
35 { { 255 255 255 } 15 }
42 i 36 * j 6 * + k + 16 +
49 ! Add the Grayscale colors
50 0x08 0xee 10 <range> [
51 [ dup dup 3array ] dip 232 + swap
55 : color>rgb ( color -- rgb )
56 [ red>> ] [ green>> ] [ blue>> ] tri
57 [ 255 * round >integer ] tri@ 3array ;
59 : color>256color ( color -- 256color )
60 color>rgb '[ _ distance ]
61 256colors [ keys swap infimum-by ] [ at ] bi ;
63 : color>foreground ( color -- string )
64 color>256color "\e[38;5;%sm" sprintf ;
66 : color>background ( color -- string )
67 color>256color "\e[48;5;%sm" sprintf ;
69 TUPLE: 256color < filter-writer ;
71 C: <256color> 256color
73 M: 256color stream-format
75 [ foreground of [ color>foreground ] [ "" ] if* ]
76 [ background of [ color>background ] [ "" ] if* ]
77 [ font-style of [ font-styles ] [ "" ] if* ]
78 tri 3append [ "\e[0m" surround ] unless-empty
79 ] dip stream>> stream-write ;
81 M: 256color make-span-stream
82 swap <style-stream> <ignore-close-stream> ;
84 M: 256color make-block-stream
85 swap <style-stream> <ignore-close-stream> ;
87 ! FIXME: color codes take up formatting space
89 M: 256color stream-write-table
92 [ [ stream>> >string ] map ] map format-table
93 [ nl ] [ write ] interleave
94 ] with-output-stream* ;
96 M: 256color make-cell-stream
97 2drop <string-writer> <256color> ;
99 M: 256color dispose drop ;
103 : 256color-terminal? ( -- ? )
104 "TERM" os-env "-256color" tail? ;
106 : with-256color ( quot -- )
107 output-stream get <256color> swap with-output-stream* ; inline