diff --git a/README.md b/README.md index 4bdc927..9285396 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,14 @@ # FIGlet for Go -`figlet4go` is a go library forked from [getwe/figlet4go](https://github.com/getwe/figlet4go) which is a port of [FIGlet](http://www.figlet.org/) to Golang. +[![Go Report Card](https://goreportcard.com/badge/github.com/probandula/figlet4go)](https://goreportcard.com/report/github.com/probandula/figlet4go) + +`figlet4go` is a go library forked from which is a port of [FIGlet](http://www.figlet.org/) to Golang. With `figlet4go` it's easy to create **ascii text banners** in the command-line or with the given api. ![screenshot](./screenshot/figlet4go.png) -[![Go Report Card](https://goreportcard.com/badge/github.com/probandula/figlet4go)](https://goreportcard.com/report/github.com/probandula/figlet4go) + +**This Repository used to be a fork of [getwe/figlet4go](https://github.com/getwe/figlet4go), but changed so much that it's not compatible anymore** ## Installation @@ -38,10 +41,10 @@ fmt.Print(renderStr) ``` ### Colored -The colors given in the `[]color.Attribute` slice are repeating if the string is longer than the slice. You have to call the `RenderOpts` instead of the `Render` method to give the Renderer the Options. +The colors given in the `[]figlet4go.Color` slice are repeating if the string is longer than the slice. You have to call the `RenderOpts` instead of the `Render` method to give the Renderer the Options. +If you use a `TrueColor` color, you have to ensure that your [terminal supports](https://gist.github.com/XVilka/8346728/) it. ```go import "github.com/probandula/figlet4go" -import "github.com/fatih/color" // ... @@ -49,10 +52,15 @@ ascii := figlet4go.NewAsciiRender() // Adding the colors to RenderOptions options := figlet4go.NewRenderOptions() -options.FontColor = []color.Attribute{ - color.FgGreen, - color.FgYellow, - color.FgCyan, +options.FontColor = []figlet4go.Color{ + // Colors can be given by default ansi color codes... + figlet4go.ColorGreen, + figlet4go.ColorYellow, + figlet4go.ColorCyan, + // ...or by an hex string... + figlet4go.GetTrueColorFromHexString("885DBA"), + // ...or by an TrueColor object with rgb values + figlet4go.TrueColor{136, 93, 186}, } renderStr, _ := ascii.RenderOpts("Hello Colors", options) @@ -67,7 +75,6 @@ import "github.com/probandula/figlet4go" // ... - ascii := figlet4go.NewAsciiRender() options := figlet4go.NewRenderOptions() @@ -76,7 +83,7 @@ options.FontName = "larry3d" // If 'larry3d' wouldn't be included you would have to load your .flf files like that: ascii.LoadFont("/path/to/fonts/") -renderStr, _ := ascii.RenderOpts("Hello Colors", options) +renderStr, _ := ascii.RenderOpts("Hello Fonts", options) fmt.Print(renderStr) ``` @@ -98,7 +105,10 @@ Other fonts can mainly be found on [figlet](http://www.figlet.org). You have to ## Todo - [x] Cli client -- [ ] automatic the perfect char margin +- [ ] automatically the perfect char margin - [ ] Linebreak possible? - [x] Colors in the cli client -- [ ] No dependencies (fatih/color) \ No newline at end of file +- [x] No dependencies (fatih/color) +- [x] Truecolor support +- [ ] More parsers (HTML) +- [ ] Tests diff --git a/char.go b/char.go index 18b95bf..667c3ea 100644 --- a/char.go +++ b/char.go @@ -2,7 +2,6 @@ package figlet4go import ( "errors" - "github.com/fatih/color" ) // Represents a single ascii character @@ -10,7 +9,7 @@ type asciiChar struct { // Slice with the lines of the Char Lines []string // Color of the char - Color color.Attribute + Color Color } // Creates a new ascii character @@ -28,9 +27,13 @@ func newAsciiChar(font *font, char rune) (*asciiChar, error) { // Return a line of the char as string with color if set func (char *asciiChar) GetLine(index int) string { - if char.Color != 0 { - colorFunc := color.New(char.Color).SprintFunc() - return colorFunc(char.Lines[index]) + prefix := "" + suffix := "" + + if char.Color != nil { + prefix = char.Color.getPrefix() + suffix = char.Color.getSuffix() } - return char.Lines[index] + + return prefix + char.Lines[index] + suffix } diff --git a/cmd/figlet4go/figlet4go.go b/cmd/figlet4go/figlet4go.go index 8b0465f..11986a0 100644 --- a/cmd/figlet4go/figlet4go.go +++ b/cmd/figlet4go/figlet4go.go @@ -3,7 +3,6 @@ package main import ( "flag" "fmt" - "github.com/fatih/color" "github.com/probandula/figlet4go" "log" "os" @@ -14,7 +13,7 @@ var ( str *string = flag.String("str", "", "String to be converted with FIGlet") font *string = flag.String("font", "", "Font name to use") fontpath *string = flag.String("fontpath", "", "Font path to load fonts from") - colors *string = flag.String("colors", "", "Character colors separated by ';'\n\tPossible colors: black, red, green, yellow, blue, magenta, cyan, white") + colors *string = flag.String("colors", "", "Character colors separated by ';'\n\tPossible colors: black, red, green, yellow, blue, magenta, cyan, white, or any hexcode (f.e. '885DBA')") ) func main() { @@ -52,30 +51,37 @@ func main() { // Get a slice with colors to give to the RenderOptions // Splits the given string with the separator ";" -func getColorSlice(colorStr string) []color.Attribute { +func getColorSlice(colorStr string) []figlet4go.Color { givenColors := strings.Split(colorStr, ";") - colors := make([]color.Attribute, len(givenColors)) + colors := make([]figlet4go.Color, len(givenColors)) for i, c := range givenColors { switch c { case "black": - colors[i] = color.FgBlack + colors[i] = figlet4go.ColorBlack case "red": - colors[i] = color.FgRed + colors[i] = figlet4go.ColorRed case "green": - colors[i] = color.FgGreen + colors[i] = figlet4go.ColorGreen case "yellow": - colors[i] = color.FgYellow + colors[i] = figlet4go.ColorYellow case "blue": - colors[i] = color.FgBlue + colors[i] = figlet4go.ColorBlue case "magenta": - colors[i] = color.FgMagenta + colors[i] = figlet4go.ColorMagenta case "cyan": - colors[i] = color.FgCyan + colors[i] = figlet4go.ColorCyan case "white": - colors[i] = color.FgWhite + colors[i] = figlet4go.ColorWhite + default: + // Try to parse the TrueColor from the string + color, err := figlet4go.GetTrueColorFromHexString(c) + if err != nil { + log.Fatal(err) + } + colors[i] = color } } diff --git a/color.go b/color.go new file mode 100644 index 0000000..8768a6a --- /dev/null +++ b/color.go @@ -0,0 +1,73 @@ +package figlet4go + +import ( + "fmt" + "errors" + "encoding/hex" +) + +// Escape char +const escape string = "\x1b" + +var ( + ColorBlack AnsiColor = AnsiColor{30} + ColorRed AnsiColor = AnsiColor{31} + ColorGreen AnsiColor = AnsiColor{32} + ColorYellow AnsiColor = AnsiColor{33} + ColorBlue AnsiColor = AnsiColor{34} + ColorMagenta AnsiColor = AnsiColor{35} + ColorCyan AnsiColor = AnsiColor{36} + ColorWhite AnsiColor = AnsiColor{37} +) + +// Every color has a pre- and a suffix +type Color interface { + getPrefix() string + getSuffix() string +} + +// Ansi color +type AnsiColor struct { + code int +} + +// Truecolor with rgb Attributes +type TrueColor struct { + r int + g int + b int +} + +// Prefix for ansi color +func (tc TrueColor) getPrefix() string { + return fmt.Sprintf("%v[38;2;%d;%d;%dm", escape, tc.r, tc.g, tc.b) +} + +// Suffix for ansi color +func (tc TrueColor) getSuffix() string { + return fmt.Sprintf("%v[0m", escape) +} + +func GetTrueColorFromHexString(c string) (*TrueColor, error) { + rgb, err := hex.DecodeString(c) + if err != nil { + return nil, errors.New("Invalid color given (" + c + ")") + } + + return &TrueColor{ + int(rgb[0]), + int(rgb[1]), + int(rgb[2]), + }, nil +} + + +// Prefix for ansi color +func (ac AnsiColor) getPrefix() string { + return fmt.Sprintf("%v[0;%dm", escape, ac.code) +} + +// Suffix for ansi color +func (ac AnsiColor) getSuffix() string { + return fmt.Sprintf("%v[0m", escape) +} diff --git a/render.go b/render.go index d80a120..44f673d 100644 --- a/render.go +++ b/render.go @@ -1,16 +1,12 @@ package figlet4go -import ( - "github.com/fatih/color" -) - // RenderOptions are used to set color or maybe future // options to the AsciiRenderer type RenderOptions struct { // Name of the used font FontName string // Colors of the font - FontColor []color.Attribute + FontColor []Color } // NewRenderOptions creates new RenderOptions