-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstring.sh
More file actions
113 lines (94 loc) · 1.96 KB
/
string.sh
File metadata and controls
113 lines (94 loc) · 1.96 KB
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#!/usr/bin/env bash
if type string::clean > /dev/null 2>&1; then return; fi
set -euo pipefail
string::clean() {
local string="$1"
if type ansi::strip >/dev/null 2>&1; then
ansi::strip "$string"
else
echo "$string"
fi
}
string::length() {
local string="$1"
if type ansi::length >/dev/null 2>&1; then
ansi::length "$string"
else
echo "${#string}"
fi
}
string::make_pad() {
local length="$1"
local pad="${2:- }"
local pad_clean=$(string::clean "$pad")
if [[ "${#pad_clean}" -ne 1 ]]; then
string::err "Error: Invalid pad character '$pad'"
return 1
fi
if [[ "$pad" == ' ' ]]; then
printf "%${length}s" ''
else
printf "%${length}s" '' | tr ' ' "$pad_clean"
fi
}
string::pad() {
local string="$1"
local length="$2"
local align="${3:-l}"
local pad="${4:- }"
local string_clean=$(string::clean "$string")
local diff=$((length - ${#string_clean}))
local pad_left=0
local pad_right=0
case "$align" in
l | left)
pad_right="$diff"
;;
r | right)
pad_left="$diff"
;;
c | center)
pad_left=$((diff / 2))
pad_right=$((diff - pad_left))
;;
esac
local pad_left_str=$(string::make_pad "$pad_left" "$pad")
local pad_right_str=$(string::make_pad "$pad_right" "$pad")
printf "%s%s%s" "$pad_left_str" "$string" "$pad_right_str"
}
string::warn() {
if [[ -t 2 || -z "$TERM" ]]; then
echo -e "$@" >&2
return 0
fi
local args=()
for arg in "$@"; do
args+=("$(string::clean "$arg")")
done
echo -e "${args[@]}" >&2
return 0
}
string::err() {
if [[ -t 2 || -z "$TERM" ]]; then
echo -e "$@" >&2
return 1
fi
local args=()
for arg in "$@"; do
args+=("$(string::clean "$arg")")
done
echo -e "${args[@]}" >&2
return 1
}
string::out() {
if [[ -t 1 || -z "$TERM" ]]; then
echo -e "$@"
return 0
fi
local args=()
for arg in "$@"; do
args+=("$(string::clean "$arg")")
done
echo -e "${args[@]}"
return 0
}