13
13
# USAGE:
14
14
#
15
15
# As a script:
16
- # /path/to-display-box.sh "$headers" "$body" -s 2 -p 2 -d ,
16
+ # /path/to-display-box.sh "$headers" "$body" -s 2 -p 2 -d , -m 1
17
17
#
18
18
# As a function:
19
19
# . /path/to/display-box.sh
20
- # display-box "$headers" "$body" -s 2 -p 2 -d ,
20
+ # display-box "$headers" "$body" -s 2 -p 2 -d , -m 1
21
21
#
22
22
# Or via a pipe:
23
- # echo "$multi_line_string" | /path/to/display-box.sh -s 2 -p 2 -d ,
23
+ # echo "$multi_line_string" | /path/to/display-box.sh -s 2 -p 2 -d , -m 1
24
24
#
25
25
# To make it more convenient, you may want to create a symlink in the
26
26
# global path, such as: /usr/local/bin/display-box
30
30
31
31
# Main function to display box
32
32
display-box () {
33
+ # Clean up input strings
34
+ clean_string () {
35
+ r=$(( $required_spaces - 1 ))
36
+ test " $r " -lt 1 && r=1
37
+ echo " $1 " | sed -E \
38
+ -e ' /^\s*$/d' ` # Delete blank lines` \
39
+ -e ' s/([ ]{' $r ' }[ ]+)/\t/g' ` # Detect n spaces and replace with tab` \
40
+ -e ' s/^\s*//g' ` # Trim leading spaces` \
41
+ -e ' s/\s*$//g' ` # Trim trailing spaces`
42
+ }
43
+
33
44
headers=" "
34
45
# Process options ($headers is always defined before $body)
35
46
while [[ $# != 0 ]]; do
36
47
case " $1 " in
37
- -s) [[ ! -z " $2 " ]] && { style=" $2 " ; shift 2; } || shift ;;
38
- -p) [[ ! -z " $2 " ]] && { padding=" $2 " ; shift 2; } || shift ;;
39
- -d) [[ ! -z " $2 " ]] && { delimiter=" $2 " ; shift 2; } || shift ;;
48
+ -s) [[ ! -z " $2 " ]] && { style=$2 ; shift 2; } || shift ;;
49
+ -p) [[ ! -z " $2 " ]] && { padding=$2 ; shift 2; } || shift ;;
50
+ -d) [[ ! -z " $2 " ]] && { delimiter=$2 ; shift 2; } || shift ;;
51
+ -m) [[ ! -z " $2 " ]] && { margin=$2 ; shift 2; } || shift ;;
40
52
* )
53
+ # i="$(echo "$1" | sed ':a;N;$!ba;s/^[[:space:]\n]*//;s/[[:space:]\n]*$//')" # Trim leading and trailing whitespace
54
+ i=" $( clean_string " $1 " ) "
41
55
if [[ -z " $headers " ]]; then
42
- headers=" $1 "
56
+ headers=" $i "
43
57
elif [[ -z " $body " ]]; then
44
- body=" $1 "
45
- elif [[ -z " $style " ]] && [[ $1 =~ ^[1-6]$ ]]; then
46
- style=" $1 "
47
- elif [[ -z " $padding " ]] && [[ $1 =~ ^[1-6]$ ]]; then
48
- padding=" $1 "
49
- elif [[ -z " $delimiter " ]] && [[ $1 =~ ^.\ * $ ]]; then
50
- delimiter=" $1 "
58
+ body=" $i "
59
+ elif [[ -z " $style " ]] && [[ $i =~ ^[1-6]$ ]]; then
60
+ style=$i
61
+ elif [[ -z " $padding " ]] && [[ $i =~ ^[1-6]$ ]]; then
62
+ padding=$i
63
+ elif [[ -z " $delimiter " ]] && [[ $i =~ ^.\ * $ ]]; then # 1 Character plus any number of spaces are optional
64
+ delimiter=$i
65
+ elif [[ -z " $margin " ]] && [[ $i =~ ^[0-9]+$ ]]; then
66
+ margin=$i
51
67
fi
52
68
shift
53
69
;;
@@ -58,6 +74,7 @@ display-box() {
58
74
[[ -z " $style " ]] && style=1
59
75
[[ -z " $padding " ]] && padding=1
60
76
[[ -z " $delimiter " ]] && delimiter=$' \t '
77
+ [[ -z " $margin " ]] && margin=0
61
78
62
79
# Catch missing inputs
63
80
error=0
@@ -78,7 +95,11 @@ display-box() {
78
95
error=1
79
96
fi
80
97
if [[ ! -z " $delimiter " ]] && [[ ! " $delimiter " =~ ^.\ * $ ]]; then
81
- echo " Invalid delimiter. delimiter must be a single character or 2+ spaces."
98
+ echo " Invalid delimiter. Delimiter must be a single character or 2+ spaces."
99
+ error=1
100
+ fi
101
+ if [[ ! -z " $margin " ]] && [[ ! " $margin " =~ ^.\ * $ ]]; then
102
+ echo " Invalid margin number. Must be an integer."
82
103
error=1
83
104
fi
84
105
if [[ " $error " -eq 1 ]]; then
@@ -93,17 +114,6 @@ display-box() {
93
114
printf " %0.s$1 " $( seq $2 )
94
115
}
95
116
96
- # Clean up input strings
97
- clean_string () {
98
- r=$(( $required_spaces - 1 ))
99
- test " $r " -lt 1 && r=1
100
- echo " $1 " | sed -E \
101
- -e ' /^\s*$/d' ` # Delete blank lines` \
102
- -e ' s/([ ]{' $r ' }[ ]+)/\t/g' ` # Detect n spaces and replace with tab` \
103
- -e ' s/^\s*//g' ` # Trim leading spaces` \
104
- -e ' s/\s*$//g' ` # Trim trailing spaces`
105
- }
106
-
107
117
# Set some default vars
108
118
declare -a column_length
109
119
required_spaces=2 # Spaces required as column separator
@@ -195,6 +205,15 @@ display-box() {
195
205
done
196
206
}
197
207
208
+ # Set margin above and below table
209
+ margin () {
210
+ if [[ $margin -gt 0 ]]; then
211
+ for in in $( seq 1 $margin ) ; do
212
+ output+=$' \n '
213
+ done
214
+ fi
215
+ }
216
+
198
217
# Display the top line above the header
199
218
header_top_line () {
200
219
for column in ${! column_length[@]} ; do
@@ -259,6 +278,9 @@ display-box() {
259
278
get_max_depth " $headers "
260
279
get_max_depth " $body "
261
280
281
+ # Add top margin if any
282
+ margin
283
+
262
284
# Add padding to the max depths
263
285
pad_each_column
264
286
@@ -271,8 +293,11 @@ display-box() {
271
293
process_data " $body "
272
294
[[ " $show_bottom " -eq 1 ]] && footer
273
295
296
+ # Add bottom margin if any
297
+ margin
298
+
274
299
# Display the final output
275
- printf " $output "
300
+ printf " %b " " $output "
276
301
}
277
302
278
303
@@ -282,7 +307,7 @@ if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
282
307
# Get headers/body/flags
283
308
if [[ -z " $1 " ]] || [[ " $1 " =~ ^\- .* $ ]]; then
284
309
# Capture stdin and separate header from body
285
- input=" $( timeout 1 cat) "
310
+ input=" $( timeout 1 cat | sed ' :a;N;$!ba;s/^[[:space:]\n]*//;s/[[:space:]\n]*$// ' ) " # Trim leading and trailing whitespace
286
311
headers=" ${input%% $' \n ' * } "
287
312
body=" ${input#* $' \n ' } "
288
313
@@ -292,10 +317,11 @@ if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
292
317
-s) [[ ! -z " $2 " ]] && { style=" -s $2 " ; shift 2; } || shift ;;
293
318
-p) [[ ! -z " $2 " ]] && { padding=" -p $2 " ; shift 2; } || shift ;;
294
319
-d) [[ ! -z " $2 " ]] && { delimiter=" -d $2 " ; shift 2; } || shift ;;
320
+ -m) [[ ! -z " $2 " ]] && { margin=" -m $2 " ; shift 2; } || shift ;;
295
321
* ) shift ;;
296
322
esac
297
323
done
298
- display-box " $headers " " $body " $style $padding $delimiter
324
+ display-box " $headers " " $body " $style $padding $delimiter $margin
299
325
else
300
326
# Try just running it with the same input
301
327
display-box " $@ "
0 commit comments