-
Notifications
You must be signed in to change notification settings - Fork 5
/
rules.go
62 lines (56 loc) · 1.18 KB
/
rules.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package make2help
import (
"bytes"
"sort"
"strings"
"github.com/mgutz/ansi"
)
type rules map[string][]string
func (r rules) merge(r2 rules) rules {
for k, v := range r2 {
r[k] = v
}
return r
}
func (r rules) string(all, colorful bool) string {
var buf bytes.Buffer
indent, tasks := r.indentAndRules(all)
colorfunc := ansi.ColorFunc("cyan")
for _, task := range tasks {
helplines := r[task]
msg := task
if colorful {
msg = colorfunc(msg)
}
buf.WriteString(msg)
buf.WriteString(":")
restIndent := indent - len(task) - 1
if len(helplines) < 1 {
buf.WriteString("\n")
}
for _, helpline := range helplines {
buf.WriteString(strings.Repeat(" ", restIndent))
buf.WriteString(helpline)
buf.WriteString("\n")
restIndent = indent
}
}
return buf.String()
}
func (r rules) indentAndRules(all bool) (int, []string) {
indent := 19
var tasks []string
for k, v := range r {
if all || len(v) > 0 {
// delimiter(Kolon) and space = 2 width
if len(k)+2 > indent {
indent = len(k) + 2
}
tasks = append(tasks, k)
}
}
sort.Slice(tasks, func(i, j int) bool {
return strings.ToLower(tasks[i]) < strings.ToLower(tasks[j])
})
return indent, tasks
}