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 MEMO: color>foreground ( color -- string )
64 color>256color "\e[38;5;%sm" sprintf ;
66 MEMO: 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 ( str style stream -- )
74 stream stream>> :> out
75 style foreground of [ color>foreground out stream-write t ] [ f ] if*
76 style background of [ color>background out stream-write t ] [ f ] if*
77 style font-style of [ font-styles out stream-write t ] [ f ] if*
78 or or [ "\e[0m" out stream-write ] unless
79 str out 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