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