17 "github.com/wsxiaoys/terminal/color"
20 /* holds our palette, or 16 ANSI colors (8 normal colors + bright complements)
21 and two foreground/background colors. colors are 3 byte arrays (RGB) */
22 type ktPalette struct {
52 /* the default "control" ANSI color set (boring) */
53 var ansiColors = ktPalette {
55 black : [3]byte {0,0,0},
56 bblack : [3]byte {128,128,128},
58 red : [3]byte {128,0,0},
59 bred : [3]byte {255,0,0},
61 green : [3]byte {0,128,0},
62 bgreen : [3]byte {0,255,0},
64 yellow : [3]byte {128,128,0},
65 byellow : [3]byte {255,255,0},
67 blue : [3]byte {0,0,128},
68 bblue : [3]byte {0,0,255},
70 purple : [3]byte {128,0,128},
71 bpurple : [3]byte {255,0,255},
73 cyan : [3]byte {0,128,128},
74 bcyan : [3]byte {0,255,255},
76 white : [3]byte {128,128,128},
77 bwhite : [3]byte {255,255,255},
80 bg : [3]byte {255,255,255},
83 /* lets get our money's worth out of this utf-8 crap */
87 /* parses a colorfile, returns palette struct. given a nil file pointer,
88 returns standard ANSI color set (our "control") */
89 func parseColors(colorfile *os.File) (pal ktPalette, err error) {
91 if colorfile == nil { return ansiColors, nil }
96 scanner := bufio.NewScanner(colorfile)
99 if strings.Contains(scanner.Text(), "color") &&
100 !strings.Contains(scanner.Text(), "!") {
103 cur := strings.Replace(scanner.Text(), " ", "", -1)
104 split := strings.Split(cur, ":")
105 hexColor := strings.Replace(split[1], "#", "", -1)
106 coNumStr := strings.Replace(split[0], "URxvt*color", "", -1)
108 r, err := strconv.ParseUint(hexColor[0:2], 16, 8); e.Consume(err)
109 g, err := strconv.ParseUint(hexColor[2:4], 16, 8); e.Consume(err)
110 b, err := strconv.ParseUint(hexColor[4:], 16, 8); e.Consume(err)
112 colorNo, err := strconv.Atoi(coNumStr); e.Consume(err)
115 return ktPalette{}, e.err
119 case 0: ret.black[0] = byte(r); ret.black[1] = byte(g); ret.black[2] = byte(b)
120 case 1: ret.red[0] = byte(r); ret.red[1] = byte(g); ret.red[2] = byte(b)
121 case 2: ret.green[0] = byte(r); ret.green[1] = byte(g); ret.green[2] = byte(b)
122 case 3: ret.yellow[0] = byte(r); ret.yellow[1] = byte(g); ret.yellow[2] = byte(b)
123 case 4: ret.blue[0] = byte(r); ret.blue[1] = byte(g); ret.blue[2] = byte(b)
124 case 5: ret.purple[0] = byte(r); ret.purple[1] = byte(g); ret.purple[2] = byte(b)
125 case 6: ret.cyan[0] = byte(r); ret.cyan[1] = byte(g); ret.cyan[2] = byte(b)
126 case 7: ret.white[0] = byte(r); ret.white[1] = byte(g); ret.white[2] = byte(b)
127 case 8: ret.bblack[0] = byte(r); ret.bblack[1] = byte(g); ret.bblack[2] = byte(b)
128 case 9: ret.bred[0] = byte(r); ret.bred[1] = byte(g); ret.bred[2] = byte(b)
129 case 10: ret.bgreen[0] = byte(r); ret.bgreen[1] = byte(g); ret.bgreen[2] = byte(b)
130 case 11: ret.byellow[0] = byte(r); ret.byellow[1] = byte(g); ret.byellow[2] = byte(b)
131 case 12: ret.bblue[0] = byte(r); ret.bblue[1] = byte(g); ret.bblue[2] = byte(b)
132 case 13: ret.bpurple[0] = byte(r); ret.bpurple[1] = byte(g); ret.bpurple[2] = byte(b)
133 case 14: ret.bcyan[0] = byte(r); ret.bcyan[1] = byte(g); ret.bcyan[2] = byte(b)
134 case 15: ret.bwhite[0] = byte(r); ret.bwhite[1] = byte(g); ret.bwhite[2] = byte(b)
137 } else if strings.Contains(scanner.Text(), "background") {
139 hex := strings.Split(scanner.Text(), "#")
142 r, err := strconv.ParseUint(het[0:2], 16, 8); e.Consume(err)
143 g, err := strconv.ParseUint(het[2:4], 16, 8); e.Consume(err)
144 b, err := strconv.ParseUint(het[4:], 16, 8); e.Consume(err)
147 return ktPalette{}, e.err
154 } else if strings.Contains(scanner.Text(), "foreground") {
156 hex := strings.Split(scanner.Text(), "#")
159 r, err := strconv.ParseUint(het[0:2], 16, 8); e.Consume(err)
160 g, err := strconv.ParseUint(het[2:4], 16, 8); e.Consume(err)
161 b, err := strconv.ParseUint(het[4:], 16, 8); e.Consume(err)
164 return ktPalette{}, e.err
176 func ktInit(dirPrepend string, port int, colorfilePath string) error {
178 color.Print("@yparsing colorfile :: @{|}")
179 file, err := os.Open(colorfilePath)
181 color.Printf("@r[%s]@{|} - bad colorfile path\n", xM)
182 return fmt.Errorf("%s\n", "bad colorfile path")
185 pal, err := parseColors(file)
188 color.Printf("@r[%s]@{|} - malformed colorfile [%s]\n", xM, err)
189 return fmt.Errorf("%s\n", "malformed colorfile")
192 color.Printf("@g[%s]@{|}\n", checkM)
194 if pal == ansiColors {}
196 color.Printf("@yverifying & preprocessing colorsets@{|} :: @y[SKIP]\n")
197 color.Printf("@ygenerating transpositional colorspace@{|} :: @y[SKIP]\n")
199 color.Printf("@ystarting httpd on port @b%d@{|} :: ", port)
200 http.HandleFunc("/kt/", transposePage)
202 var portString string
203 fmt.Sprintf(portString, ":%d", port)
204 err = http.ListenAndServe(portString, nil)
207 color.Printf("@r[%s]@{-} - run me as root!\n", xM)
208 return fmt.Errorf("%s\n", "failed to start httpd")
211 color.Printf("@g[%s]@{-}\n", checkM)
216 func transposePage(writer http.ResponseWriter, req *http.Request) {
218 fqdn := req.URL.Path[4:]
219 targetURL := fmt.Sprintf("http://%s", fqdn)
221 resp, err := http.Get(targetURL)
224 io.WriteString(writer, "failed to get that page! -kt\n")
225 io.WriteString(writer, targetURL)
229 var s scanner.Scanner
238 err := ktInit("kolors", 999, "/home/kremlin/.Xresources")
243 type errConsumer struct {
247 func (e *errConsumer) Consume(err error) {
248 if e.err == nil && err != nil {