1//
2// Copyright (c) 2016-2019 The Aurora Authors. All rights reserved.
3// This program is free software. It comes without any warranty,
4// to the extent permitted by applicable law. You can redistribute
5// it and/or modify it under the terms of the Do What The Fuck You
6// Want To Public License, Version 2, as published by Sam Hocevar.
7// See LICENSE file for more details or see below.
8//
9
10//
11//        DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
12//                    Version 2, December 2004
13//
14// Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
15//
16// Everyone is permitted to copy and distribute verbatim or modified
17// copies of this license document, and changing it is allowed as long
18// as the name is changed.
19//
20//            DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
21//   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
22//
23//  0. You just DO WHAT THE FUCK YOU WANT TO.
24//
25
26// Package aurora implements ANSI-colors
27package aurora
28
29import (
30	"fmt"
31)
32
33// An Aurora implements colorizer interface.
34// It also can be a non-colorizer
35type Aurora interface {
36
37	// Reset wraps given argument returning Value
38	// without formats and colors.
39	Reset(arg interface{}) Value
40
41	//
42	// Formats
43	//
44	//
45	// Bold or increased intensity (1).
46	Bold(arg interface{}) Value
47	// Faint, decreased intensity (2).
48	Faint(arg interface{}) Value
49	//
50	// DoublyUnderline or Bold off, double-underline
51	// per ECMA-48 (21).
52	DoublyUnderline(arg interface{}) Value
53	// Fraktur, rarely supported (20).
54	Fraktur(arg interface{}) Value
55	//
56	// Italic, not widely supported, sometimes
57	// treated as inverse (3).
58	Italic(arg interface{}) Value
59	// Underline (4).
60	Underline(arg interface{}) Value
61	//
62	// SlowBlink, blinking less than 150
63	// per minute (5).
64	SlowBlink(arg interface{}) Value
65	// RapidBlink, blinking 150+ per minute,
66	// not widely supported (6).
67	RapidBlink(arg interface{}) Value
68	// Blink is alias for the SlowBlink.
69	Blink(arg interface{}) Value
70	//
71	// Reverse video, swap foreground and
72	// background colors (7).
73	Reverse(arg interface{}) Value
74	// Inverse is alias for the Reverse
75	Inverse(arg interface{}) Value
76	//
77	// Conceal, hidden, not widely supported (8).
78	Conceal(arg interface{}) Value
79	// Hidden is alias for the Conceal
80	Hidden(arg interface{}) Value
81	//
82	// CrossedOut, characters legible, but
83	// marked for deletion (9).
84	CrossedOut(arg interface{}) Value
85	// StrikeThrough is alias for the CrossedOut.
86	StrikeThrough(arg interface{}) Value
87	//
88	// Framed (51).
89	Framed(arg interface{}) Value
90	// Encircled (52).
91	Encircled(arg interface{}) Value
92	//
93	// Overlined (53).
94	Overlined(arg interface{}) Value
95
96	//
97	// Foreground colors
98	//
99	//
100	// Black foreground color (30)
101	Black(arg interface{}) Value
102	// Red foreground color (31)
103	Red(arg interface{}) Value
104	// Green foreground color (32)
105	Green(arg interface{}) Value
106	// Yellow foreground color (33)
107	Yellow(arg interface{}) Value
108	// Brown foreground color (33)
109	//
110	// Deprecated: use Yellow instead, following specification
111	Brown(arg interface{}) Value
112	// Blue foreground color (34)
113	Blue(arg interface{}) Value
114	// Magenta foreground color (35)
115	Magenta(arg interface{}) Value
116	// Cyan foreground color (36)
117	Cyan(arg interface{}) Value
118	// White foreground color (37)
119	White(arg interface{}) Value
120	//
121	// Bright foreground colors
122	//
123	// BrightBlack foreground color (90)
124	BrightBlack(arg interface{}) Value
125	// BrightRed foreground color (91)
126	BrightRed(arg interface{}) Value
127	// BrightGreen foreground color (92)
128	BrightGreen(arg interface{}) Value
129	// BrightYellow foreground color (93)
130	BrightYellow(arg interface{}) Value
131	// BrightBlue foreground color (94)
132	BrightBlue(arg interface{}) Value
133	// BrightMagenta foreground color (95)
134	BrightMagenta(arg interface{}) Value
135	// BrightCyan foreground color (96)
136	BrightCyan(arg interface{}) Value
137	// BrightWhite foreground color (97)
138	BrightWhite(arg interface{}) Value
139	//
140	// Other
141	//
142	// Index of pre-defined 8-bit foreground color
143	// from 0 to 255 (38;5;n).
144	//
145	//       0-  7:  standard colors (as in ESC [ 30–37 m)
146	//       8- 15:  high intensity colors (as in ESC [ 90–97 m)
147	//      16-231:  6 × 6 × 6 cube (216 colors): 16 + 36 × r + 6 × g + b (0 ≤ r, g, b ≤ 5)
148	//     232-255:  grayscale from black to white in 24 steps
149	//
150	Index(n uint8, arg interface{}) Value
151	// Gray from 0 to 23.
152	Gray(n uint8, arg interface{}) Value
153
154	//
155	// Background colors
156	//
157	//
158	// BgBlack background color (40)
159	BgBlack(arg interface{}) Value
160	// BgRed background color (41)
161	BgRed(arg interface{}) Value
162	// BgGreen background color (42)
163	BgGreen(arg interface{}) Value
164	// BgYellow background color (43)
165	BgYellow(arg interface{}) Value
166	// BgBrown background color (43)
167	//
168	// Deprecated: use BgYellow instead, following specification
169	BgBrown(arg interface{}) Value
170	// BgBlue background color (44)
171	BgBlue(arg interface{}) Value
172	// BgMagenta background color (45)
173	BgMagenta(arg interface{}) Value
174	// BgCyan background color (46)
175	BgCyan(arg interface{}) Value
176	// BgWhite background color (47)
177	BgWhite(arg interface{}) Value
178	//
179	// Bright background colors
180	//
181	// BgBrightBlack background color (100)
182	BgBrightBlack(arg interface{}) Value
183	// BgBrightRed background color (101)
184	BgBrightRed(arg interface{}) Value
185	// BgBrightGreen background color (102)
186	BgBrightGreen(arg interface{}) Value
187	// BgBrightYellow background color (103)
188	BgBrightYellow(arg interface{}) Value
189	// BgBrightBlue background color (104)
190	BgBrightBlue(arg interface{}) Value
191	// BgBrightMagenta background color (105)
192	BgBrightMagenta(arg interface{}) Value
193	// BgBrightCyan background color (106)
194	BgBrightCyan(arg interface{}) Value
195	// BgBrightWhite background color (107)
196	BgBrightWhite(arg interface{}) Value
197	//
198	// Other
199	//
200	// BgIndex of 8-bit pre-defined background color
201	// from 0 to 255 (48;5;n).
202	//
203	//       0-  7:  standard colors (as in ESC [ 40–47 m)
204	//       8- 15:  high intensity colors (as in ESC [100–107 m)
205	//      16-231:  6 × 6 × 6 cube (216 colors): 16 + 36 × r + 6 × g + b (0 ≤ r, g, b ≤ 5)
206	//     232-255:  grayscale from black to white in 24 steps
207	//
208	BgIndex(n uint8, arg interface{}) Value
209	// BgGray from 0 to 23.
210	BgGray(n uint8, arg interface{}) Value
211
212	//
213	// Special
214	//
215	// Colorize removes existing colors and
216	// formats of the argument and applies given.
217	Colorize(arg interface{}, color Color) Value
218
219	//
220	// Support methods
221	//
222	// Sprintf allows to use colored format.
223	Sprintf(format interface{}, args ...interface{}) string
224}
225
226// NewAurora returns a new Aurora interface that
227// will support or not support colors depending
228// the enableColors argument
229func NewAurora(enableColors bool) Aurora {
230	if enableColors {
231		return aurora{}
232	}
233	return auroraClear{}
234}
235
236// no colors
237
238type auroraClear struct{}
239
240func (auroraClear) Reset(arg interface{}) Value { return valueClear{arg} }
241
242func (auroraClear) Bold(arg interface{}) Value {
243	return valueClear{arg}
244}
245
246func (auroraClear) Faint(arg interface{}) Value {
247	return valueClear{arg}
248}
249
250func (auroraClear) DoublyUnderline(arg interface{}) Value {
251	return valueClear{arg}
252}
253
254func (auroraClear) Fraktur(arg interface{}) Value {
255	return valueClear{arg}
256}
257
258func (auroraClear) Italic(arg interface{}) Value {
259	return valueClear{arg}
260}
261
262func (auroraClear) Underline(arg interface{}) Value {
263	return valueClear{arg}
264}
265
266func (auroraClear) SlowBlink(arg interface{}) Value {
267	return valueClear{arg}
268}
269
270func (auroraClear) RapidBlink(arg interface{}) Value {
271	return valueClear{arg}
272}
273
274func (auroraClear) Blink(arg interface{}) Value {
275	return valueClear{arg}
276}
277
278func (auroraClear) Reverse(arg interface{}) Value {
279	return valueClear{arg}
280}
281
282func (auroraClear) Inverse(arg interface{}) Value {
283	return valueClear{arg}
284}
285
286func (auroraClear) Conceal(arg interface{}) Value {
287	return valueClear{arg}
288}
289
290func (auroraClear) Hidden(arg interface{}) Value {
291	return valueClear{arg}
292}
293
294func (auroraClear) CrossedOut(arg interface{}) Value {
295	return valueClear{arg}
296}
297
298func (auroraClear) StrikeThrough(arg interface{}) Value {
299	return valueClear{arg}
300}
301
302func (auroraClear) Framed(arg interface{}) Value {
303	return valueClear{arg}
304}
305
306func (auroraClear) Encircled(arg interface{}) Value {
307	return valueClear{arg}
308}
309
310func (auroraClear) Overlined(arg interface{}) Value {
311	return valueClear{arg}
312}
313
314func (auroraClear) Black(arg interface{}) Value {
315	return valueClear{arg}
316}
317
318func (auroraClear) Red(arg interface{}) Value {
319	return valueClear{arg}
320}
321
322func (auroraClear) Green(arg interface{}) Value {
323	return valueClear{arg}
324}
325
326func (auroraClear) Yellow(arg interface{}) Value {
327	return valueClear{arg}
328}
329
330func (auroraClear) Brown(arg interface{}) Value {
331	return valueClear{arg}
332}
333
334func (auroraClear) Blue(arg interface{}) Value {
335	return valueClear{arg}
336}
337
338func (auroraClear) Magenta(arg interface{}) Value {
339	return valueClear{arg}
340}
341
342func (auroraClear) Cyan(arg interface{}) Value {
343	return valueClear{arg}
344}
345
346func (auroraClear) White(arg interface{}) Value {
347	return valueClear{arg}
348}
349
350func (auroraClear) BrightBlack(arg interface{}) Value {
351	return valueClear{arg}
352}
353
354func (auroraClear) BrightRed(arg interface{}) Value {
355	return valueClear{arg}
356}
357
358func (auroraClear) BrightGreen(arg interface{}) Value {
359	return valueClear{arg}
360}
361
362func (auroraClear) BrightYellow(arg interface{}) Value {
363	return valueClear{arg}
364}
365
366func (auroraClear) BrightBlue(arg interface{}) Value {
367	return valueClear{arg}
368}
369
370func (auroraClear) BrightMagenta(arg interface{}) Value {
371	return valueClear{arg}
372}
373
374func (auroraClear) BrightCyan(arg interface{}) Value {
375	return valueClear{arg}
376}
377
378func (auroraClear) BrightWhite(arg interface{}) Value {
379	return valueClear{arg}
380}
381
382func (auroraClear) Index(_ uint8, arg interface{}) Value {
383	return valueClear{arg}
384}
385
386func (auroraClear) Gray(_ uint8, arg interface{}) Value {
387	return valueClear{arg}
388}
389
390func (auroraClear) BgBlack(arg interface{}) Value {
391	return valueClear{arg}
392}
393
394func (auroraClear) BgRed(arg interface{}) Value {
395	return valueClear{arg}
396}
397
398func (auroraClear) BgGreen(arg interface{}) Value {
399	return valueClear{arg}
400}
401
402func (auroraClear) BgYellow(arg interface{}) Value {
403	return valueClear{arg}
404}
405
406func (auroraClear) BgBrown(arg interface{}) Value {
407	return valueClear{arg}
408}
409
410func (auroraClear) BgBlue(arg interface{}) Value {
411	return valueClear{arg}
412}
413
414func (auroraClear) BgMagenta(arg interface{}) Value {
415	return valueClear{arg}
416}
417
418func (auroraClear) BgCyan(arg interface{}) Value {
419	return valueClear{arg}
420}
421
422func (auroraClear) BgWhite(arg interface{}) Value {
423	return valueClear{arg}
424}
425
426func (auroraClear) BgBrightBlack(arg interface{}) Value {
427	return valueClear{arg}
428}
429
430func (auroraClear) BgBrightRed(arg interface{}) Value {
431	return valueClear{arg}
432}
433
434func (auroraClear) BgBrightGreen(arg interface{}) Value {
435	return valueClear{arg}
436}
437
438func (auroraClear) BgBrightYellow(arg interface{}) Value {
439	return valueClear{arg}
440}
441
442func (auroraClear) BgBrightBlue(arg interface{}) Value {
443	return valueClear{arg}
444}
445
446func (auroraClear) BgBrightMagenta(arg interface{}) Value {
447	return valueClear{arg}
448}
449
450func (auroraClear) BgBrightCyan(arg interface{}) Value {
451	return valueClear{arg}
452}
453
454func (auroraClear) BgBrightWhite(arg interface{}) Value {
455	return valueClear{arg}
456}
457
458func (auroraClear) BgIndex(_ uint8, arg interface{}) Value {
459	return valueClear{arg}
460}
461
462func (auroraClear) BgGray(_ uint8, arg interface{}) Value {
463	return valueClear{arg}
464}
465
466func (auroraClear) Colorize(arg interface{}, _ Color) Value {
467	return valueClear{arg}
468}
469
470func (auroraClear) Sprintf(format interface{}, args ...interface{}) string {
471	if str, ok := format.(string); ok {
472		return fmt.Sprintf(str, args...)
473	}
474	return fmt.Sprintf(fmt.Sprint(format), args...)
475}
476
477// colorized
478
479type aurora struct{}
480
481func (aurora) Reset(arg interface{}) Value {
482	return Reset(arg)
483}
484
485func (aurora) Bold(arg interface{}) Value {
486	return Bold(arg)
487}
488
489func (aurora) Faint(arg interface{}) Value {
490	return Faint(arg)
491}
492
493func (aurora) DoublyUnderline(arg interface{}) Value {
494	return DoublyUnderline(arg)
495}
496
497func (aurora) Fraktur(arg interface{}) Value {
498	return Fraktur(arg)
499}
500
501func (aurora) Italic(arg interface{}) Value {
502	return Italic(arg)
503}
504
505func (aurora) Underline(arg interface{}) Value {
506	return Underline(arg)
507}
508
509func (aurora) SlowBlink(arg interface{}) Value {
510	return SlowBlink(arg)
511}
512
513func (aurora) RapidBlink(arg interface{}) Value {
514	return RapidBlink(arg)
515}
516
517func (aurora) Blink(arg interface{}) Value {
518	return Blink(arg)
519}
520
521func (aurora) Reverse(arg interface{}) Value {
522	return Reverse(arg)
523}
524
525func (aurora) Inverse(arg interface{}) Value {
526	return Inverse(arg)
527}
528
529func (aurora) Conceal(arg interface{}) Value {
530	return Conceal(arg)
531}
532
533func (aurora) Hidden(arg interface{}) Value {
534	return Hidden(arg)
535}
536
537func (aurora) CrossedOut(arg interface{}) Value {
538	return CrossedOut(arg)
539}
540
541func (aurora) StrikeThrough(arg interface{}) Value {
542	return StrikeThrough(arg)
543}
544
545func (aurora) Framed(arg interface{}) Value {
546	return Framed(arg)
547}
548
549func (aurora) Encircled(arg interface{}) Value {
550	return Encircled(arg)
551}
552
553func (aurora) Overlined(arg interface{}) Value {
554	return Overlined(arg)
555}
556
557func (aurora) Black(arg interface{}) Value {
558	return Black(arg)
559}
560
561func (aurora) Red(arg interface{}) Value {
562	return Red(arg)
563}
564
565func (aurora) Green(arg interface{}) Value {
566	return Green(arg)
567}
568
569func (aurora) Yellow(arg interface{}) Value {
570	return Yellow(arg)
571}
572
573func (aurora) Brown(arg interface{}) Value {
574	return Brown(arg)
575}
576
577func (aurora) Blue(arg interface{}) Value {
578	return Blue(arg)
579}
580
581func (aurora) Magenta(arg interface{}) Value {
582	return Magenta(arg)
583}
584
585func (aurora) Cyan(arg interface{}) Value {
586	return Cyan(arg)
587}
588
589func (aurora) White(arg interface{}) Value {
590	return White(arg)
591}
592
593func (aurora) BrightBlack(arg interface{}) Value {
594	return BrightBlack(arg)
595}
596
597func (aurora) BrightRed(arg interface{}) Value {
598	return BrightRed(arg)
599}
600
601func (aurora) BrightGreen(arg interface{}) Value {
602	return BrightGreen(arg)
603}
604
605func (aurora) BrightYellow(arg interface{}) Value {
606	return BrightYellow(arg)
607}
608
609func (aurora) BrightBlue(arg interface{}) Value {
610	return BrightBlue(arg)
611}
612
613func (aurora) BrightMagenta(arg interface{}) Value {
614	return BrightMagenta(arg)
615}
616
617func (aurora) BrightCyan(arg interface{}) Value {
618	return BrightCyan(arg)
619}
620
621func (aurora) BrightWhite(arg interface{}) Value {
622	return BrightWhite(arg)
623}
624
625func (aurora) Index(index uint8, arg interface{}) Value {
626	return Index(index, arg)
627}
628
629func (aurora) Gray(n uint8, arg interface{}) Value {
630	return Gray(n, arg)
631}
632
633func (aurora) BgBlack(arg interface{}) Value {
634	return BgBlack(arg)
635}
636
637func (aurora) BgRed(arg interface{}) Value {
638	return BgRed(arg)
639}
640
641func (aurora) BgGreen(arg interface{}) Value {
642	return BgGreen(arg)
643}
644
645func (aurora) BgYellow(arg interface{}) Value {
646	return BgYellow(arg)
647}
648
649func (aurora) BgBrown(arg interface{}) Value {
650	return BgBrown(arg)
651}
652
653func (aurora) BgBlue(arg interface{}) Value {
654	return BgBlue(arg)
655}
656
657func (aurora) BgMagenta(arg interface{}) Value {
658	return BgMagenta(arg)
659}
660
661func (aurora) BgCyan(arg interface{}) Value {
662	return BgCyan(arg)
663}
664
665func (aurora) BgWhite(arg interface{}) Value {
666	return BgWhite(arg)
667}
668
669func (aurora) BgBrightBlack(arg interface{}) Value {
670	return BgBrightBlack(arg)
671}
672
673func (aurora) BgBrightRed(arg interface{}) Value {
674	return BgBrightRed(arg)
675}
676
677func (aurora) BgBrightGreen(arg interface{}) Value {
678	return BgBrightGreen(arg)
679}
680
681func (aurora) BgBrightYellow(arg interface{}) Value {
682	return BgBrightYellow(arg)
683}
684
685func (aurora) BgBrightBlue(arg interface{}) Value {
686	return BgBrightBlue(arg)
687}
688
689func (aurora) BgBrightMagenta(arg interface{}) Value {
690	return BgBrightMagenta(arg)
691}
692
693func (aurora) BgBrightCyan(arg interface{}) Value {
694	return BgBrightCyan(arg)
695}
696
697func (aurora) BgBrightWhite(arg interface{}) Value {
698	return BgBrightWhite(arg)
699}
700
701func (aurora) BgIndex(n uint8, arg interface{}) Value {
702	return BgIndex(n, arg)
703}
704
705func (aurora) BgGray(n uint8, arg interface{}) Value {
706	return BgGray(n, arg)
707}
708
709func (aurora) Colorize(arg interface{}, color Color) Value {
710	return Colorize(arg, color)
711}
712
713func (aurora) Sprintf(format interface{}, args ...interface{}) string {
714	return Sprintf(format, args...)
715}
716