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