diff --git a/internal/clifmt/symbols.go b/internal/clifmt/symbols.go index 693608f..475d6aa 100644 --- a/internal/clifmt/symbols.go +++ b/internal/clifmt/symbols.go @@ -2,11 +2,12 @@ package clifmt import ( "fmt" + "regexp" "strings" ) var titleIndex = 0 -var alignOffset = 30 +var alignOffset = 40 // Warn returns a red warning ASCII sign. If a string is given // as argument, it will print it after the warning sign @@ -41,44 +42,74 @@ func Title(s string) { func Align(s string) { // 1. replace tabs with 4 spaces - tabs := strings.Split(s, "\t") + tabs := strings.Split(strings.Trim(s, " \t"), "\t") s = strings.Join(tabs, " ") - // 1. get real size - size := getRealSize(s) + // 2. get real size + size := displaySize(s) + + offset := alignOffset if size > alignOffset-6 { for i, l := 0, len(s); i < l; i++ { // find when real size is right under next := fmt.Sprintf("%s\033[0m… ", s[0:i+1]) - if getRealSize(next) >= alignOffset-5 { + if displaySize(next) >= alignOffset-5 { s = next break } } - size = getRealSize(s) + size = displaySize(s) + + } else { + // fix + offset -= 2 } - // 2. print string + // 3. print string fmt.Printf("%s", s) - // 3. print trailing spaces - for i := size; i < alignOffset; i++ { + // 4. print trailing spaces + for i := size; i < offset; i++ { fmt.Printf(" ") } } -// getRealSize returns the real size escaping special characters -func getRealSize(s string) int { +var re = regexp.MustCompile(`(?m)\[(?:\d+;)*\d+m`) + +// displaySize returns the real size escaping special characters +func displaySize(s string) int { + // 1. get actual size size := len(s) - // 2. remove \033[XYm format characters - size -= 7 * len(strings.Split(s, "\033")) - - // 3. compensate 1 char for \033[0m - size += len(strings.Split(s, "\033[0m")) + // 2. get all terminal coloring matches + matches := re.FindAllString(s, -1) + for _, m := range matches { + size -= len(m) + } return size } + +func escape(in string) string { + + out := make([]rune, 0) + + for _, char := range in { + if char == '\n' { + out = append(out, []rune("\\n")...) + } else if char == '\r' { + out = append(out, []rune("\\r")...) + } else if char == '\t' { + out = append(out, []rune("\\t")...) + } else if char == '\033' { + out = append(out, []rune("\\033")...) + } else { + out = append(out, char) + } + } + + return string(out) +}