cli: add smart-wrap for help description
parent
717e26b45e
commit
dc8199709f
|
@ -1,5 +1,10 @@
|
||||||
module cli
|
module cli
|
||||||
|
|
||||||
|
import (
|
||||||
|
term
|
||||||
|
strings
|
||||||
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
BASE_INDENT = 2
|
BASE_INDENT = 2
|
||||||
ABBREV_INDENT = 5
|
ABBREV_INDENT = 5
|
||||||
|
@ -55,7 +60,8 @@ fn help_func(help_cmd Command) {
|
||||||
|
|
||||||
base_indent := ' '.repeat(BASE_INDENT)
|
base_indent := ' '.repeat(BASE_INDENT)
|
||||||
description_indent := ' '.repeat(max(DESCRIPTION_INDENT-flag_name.len, 1))
|
description_indent := ' '.repeat(max(DESCRIPTION_INDENT-flag_name.len, 1))
|
||||||
help += '${base_indent}${flag_name}${description_indent}${flag.description}${required}\n'
|
help += '${base_indent}${flag_name}${description_indent}' +
|
||||||
|
pretty_description(flag.description + required) + '\n'
|
||||||
}
|
}
|
||||||
help += '\n'
|
help += '\n'
|
||||||
}
|
}
|
||||||
|
@ -65,7 +71,8 @@ fn help_func(help_cmd Command) {
|
||||||
base_indent := ' '.repeat(BASE_INDENT)
|
base_indent := ' '.repeat(BASE_INDENT)
|
||||||
description_indent := ' '.repeat(max(DESCRIPTION_INDENT-command.name.len, 1))
|
description_indent := ' '.repeat(max(DESCRIPTION_INDENT-command.name.len, 1))
|
||||||
|
|
||||||
help += '${base_indent}${command.name}${description_indent}${command.description}\n'
|
help += '${base_indent}${command.name}${description_indent}' +
|
||||||
|
pretty_description(command.description) + '\n'
|
||||||
}
|
}
|
||||||
help += '\n'
|
help += '\n'
|
||||||
}
|
}
|
||||||
|
@ -73,6 +80,36 @@ fn help_func(help_cmd Command) {
|
||||||
print(help)
|
print(help)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// pretty_description resizes description text depending on terminal width.
|
||||||
|
// Essentially, smart wrap-around
|
||||||
|
fn pretty_description(s string) string {
|
||||||
|
width, _ := term.get_terminal_size()
|
||||||
|
// Don't prettify if the terminal is that small, it won't be pretty anyway.
|
||||||
|
if s.len + DESCRIPTION_INDENT < width || DESCRIPTION_INDENT > width {
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
indent := ' '.repeat(DESCRIPTION_INDENT + 1)
|
||||||
|
chars_per_line := width - DESCRIPTION_INDENT
|
||||||
|
// Give us enough room, better a little bigger than smaller
|
||||||
|
mut acc := strings.new_builder(((s.len / chars_per_line) + 1) * (width + 1))
|
||||||
|
|
||||||
|
mut i := chars_per_line - 1
|
||||||
|
mut j := 0
|
||||||
|
for ; i < s.len ; i += chars_per_line - 1 {
|
||||||
|
for s.str[i] != ` ` { i-- }
|
||||||
|
// indent was already done the first iteration
|
||||||
|
if j != 0 { acc.write(indent) }
|
||||||
|
acc.writeln(s[j..i])
|
||||||
|
j = i
|
||||||
|
}
|
||||||
|
// We need this even though it should never happen
|
||||||
|
if j != 0 {
|
||||||
|
acc.write(indent)
|
||||||
|
}
|
||||||
|
acc.write(s[j..])
|
||||||
|
return acc.str()
|
||||||
|
}
|
||||||
|
|
||||||
fn max(a, b int) int {
|
fn max(a, b int) int {
|
||||||
return if a > b {a} else {b}
|
return if a > b {a} else {b}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue