2018-11-08 13:09:19 +00:00
|
|
|
|
package clifmt
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"fmt"
|
2018-11-12 23:20:05 +00:00
|
|
|
|
"regexp"
|
2018-11-08 13:09:19 +00:00
|
|
|
|
"strings"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
var titleIndex = 0
|
2018-11-12 23:20:05 +00:00
|
|
|
|
var alignOffset = 40
|
2018-11-13 15:22:57 +00:00
|
|
|
|
var defaultPrinter = fmt.Printf
|
2018-11-08 13:09:19 +00:00
|
|
|
|
|
|
|
|
|
// Warn returns a red warning ASCII sign. If a string is given
|
|
|
|
|
// as argument, it will print it after the warning sign
|
|
|
|
|
func Warn(s ...string) string {
|
|
|
|
|
if len(s) == 0 {
|
|
|
|
|
return Color(31, "/!\\")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return fmt.Sprintf("%s %s", Warn(), s[0])
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Info returns a blue info ASCII sign. If a string is given
|
|
|
|
|
// as argument, it will print it after the info sign
|
|
|
|
|
func Info(s ...string) string {
|
|
|
|
|
if len(s) == 0 {
|
|
|
|
|
return Color(34, "(!)")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return fmt.Sprintf("%s %s", Info(), s[0])
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Title prints a formatted title (auto-indexed from local counted)
|
|
|
|
|
func Title(s string) {
|
|
|
|
|
titleIndex++
|
2018-11-13 15:22:57 +00:00
|
|
|
|
defaultPrinter("\n%s |%d| %s %s\n", Color(33, ">>", false), titleIndex, s, Color(33, "<<", false))
|
2018-11-08 13:09:19 +00:00
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Align prints strings with space padding to align line ends (fixed width)
|
2018-11-10 17:35:00 +00:00
|
|
|
|
// also crops the content to add '...' at the end if too long (must have a space
|
|
|
|
|
// at the end)
|
2018-11-08 13:09:19 +00:00
|
|
|
|
func Align(s string) {
|
|
|
|
|
|
2018-11-10 17:35:00 +00:00
|
|
|
|
// 1. replace tabs with 4 spaces
|
2018-11-12 23:20:05 +00:00
|
|
|
|
tabs := strings.Split(strings.Trim(s, " \t"), "\t")
|
2018-11-10 17:35:00 +00:00
|
|
|
|
s = strings.Join(tabs, " ")
|
2018-11-08 13:09:19 +00:00
|
|
|
|
|
2018-11-12 23:20:05 +00:00
|
|
|
|
// 2. get real size
|
2018-11-13 16:26:04 +00:00
|
|
|
|
size := DisplaySize(s)
|
2018-11-12 23:20:05 +00:00
|
|
|
|
offset := alignOffset
|
2018-11-08 13:09:19 +00:00
|
|
|
|
|
2018-11-13 16:26:04 +00:00
|
|
|
|
if size > alignOffset-2 {
|
|
|
|
|
|
|
|
|
|
for i := len(s) - 1; i > 0; i-- { // find when real size is right under
|
|
|
|
|
next := fmt.Sprintf("%s\033[0m… ", s[0:i])
|
2018-11-08 13:09:19 +00:00
|
|
|
|
|
2018-11-13 16:26:04 +00:00
|
|
|
|
if DisplaySize(next) <= alignOffset {
|
2018-11-10 17:35:00 +00:00
|
|
|
|
s = next
|
2018-11-13 16:26:04 +00:00
|
|
|
|
size = DisplaySize(s)
|
2018-11-10 17:35:00 +00:00
|
|
|
|
break
|
|
|
|
|
}
|
2018-11-08 13:09:19 +00:00
|
|
|
|
|
2018-11-10 17:35:00 +00:00
|
|
|
|
}
|
2018-11-08 13:09:19 +00:00
|
|
|
|
}
|
2018-11-10 12:20:10 +00:00
|
|
|
|
|
2018-11-12 23:20:05 +00:00
|
|
|
|
// 3. print string
|
2018-11-13 15:22:57 +00:00
|
|
|
|
defaultPrinter("%s", s)
|
2018-11-10 12:20:10 +00:00
|
|
|
|
|
2018-11-12 23:20:05 +00:00
|
|
|
|
// 4. print trailing spaces
|
|
|
|
|
for i := size; i < offset; i++ {
|
2018-11-13 15:22:57 +00:00
|
|
|
|
defaultPrinter(" ")
|
2018-11-10 12:20:10 +00:00
|
|
|
|
}
|
2018-11-10 17:35:00 +00:00
|
|
|
|
}
|
2018-11-10 12:20:10 +00:00
|
|
|
|
|
2018-11-12 23:20:05 +00:00
|
|
|
|
var re = regexp.MustCompile(`(?m)\[(?:\d+;)*\d+m`)
|
2018-11-13 16:26:04 +00:00
|
|
|
|
var reDots = regexp.MustCompile(`(?m)…`)
|
2018-11-12 23:20:05 +00:00
|
|
|
|
|
2018-11-13 16:26:04 +00:00
|
|
|
|
// DisplaySize returns the real size escaping special characters
|
|
|
|
|
func DisplaySize(s string) int {
|
2018-11-12 23:20:05 +00:00
|
|
|
|
|
2018-11-10 17:35:00 +00:00
|
|
|
|
// 1. get actual size
|
2018-11-10 12:20:10 +00:00
|
|
|
|
size := len(s)
|
|
|
|
|
|
2018-11-12 23:20:05 +00:00
|
|
|
|
// 2. get all terminal coloring matches
|
|
|
|
|
matches := re.FindAllString(s, -1)
|
|
|
|
|
for _, m := range matches {
|
|
|
|
|
size -= len(m)
|
|
|
|
|
}
|
2018-11-10 12:20:10 +00:00
|
|
|
|
|
2018-11-13 16:26:04 +00:00
|
|
|
|
// 3. Remove unicode character (len of 3 instead of 1)
|
|
|
|
|
matches = reDots.FindAllString(s, -1)
|
|
|
|
|
for _, m := range matches {
|
|
|
|
|
size -= len(m)
|
|
|
|
|
size += 1
|
|
|
|
|
}
|
|
|
|
|
|
2018-11-10 17:35:00 +00:00
|
|
|
|
return size
|
2018-11-10 12:20:10 +00:00
|
|
|
|
}
|