slitaz-base-files view rootfs/lib/libtaz.sh @ rev 329

libtaz.sh: add info() to display an info in same place than status()
author Christophe Lincoln <pankso@slitaz.org>
date Thu Mar 02 15:38:20 2017 +0100 (2017-03-02)
parents 133ee7fe8217
children 5d1266bb31bd
line source
1 #!/bin/sh
2 #
3 # SliTaz Base functions.
4 # Documentation: `man libtaz` or /usr/share/doc/slitaz/libtaz.txt
5 #
6 # Copyright (C) 2012-2015 SliTaz GNU/Linux - BSD License
7 #
9 . /usr/bin/gettext.sh
10 alias sed="busybox sed"
12 # Internal
13 lgettext() { gettext -d 'slitaz-base' "$@"; }
14 translate_query() {
15 case $1 in
16 y) lgettext "y";;
17 Y) lgettext "Y";;
18 n) lgettext "n";;
19 N) lgettext "N";;
20 # Support other cases but keep them untranslated.
21 *) echo "$1" ;;
22 esac
23 }
24 okmsg="$(lgettext 'Done')"
25 ermsg="$(lgettext 'Failed')"
26 : ${okcolor=32}
27 : ${ercolor=31}
28 : ${decolor=36}
30 # Parse cmdline options and store values in a variable.
31 for opt in "$@"; do
32 opt_name="${opt%%=*}"; opt_name="$(echo -n "${opt_name#--}" | tr -c 'a-zA-Z0-9' '_')"
33 case "$opt" in
34 --[0-9]*=*) export _$opt_name="${opt#*=}" ;;
35 --[0-9]*) export _$opt_name=yes ;;
36 --*=*) export $opt_name="${opt#*=}" ;;
37 --*) export $opt_name=yes ;;
38 esac
39 done
40 [ "$HTTP_REFERER" ] && output='html'
42 # i18n functions
43 _() { local T="$1"; shift; printf "$(gettext "$T")" "$@"; echo; }
44 _n() { local T="$1"; shift; printf "$(gettext "$T")" "$@"; }
45 _p() { local S="$1" P="$2" N="$3"; shift 3; printf "$(ngettext "$S" "$P" "$N")" "$@"; }
47 # Get terminal columns
48 get_cols() { stty size 2>/dev/null | awk -vc=$cols 'END{print c?c:$2?$2:80}'; }
50 # Last command status
51 status() {
52 local ret_code=$?
53 [ -n "$quiet" -a "$ret_code" -eq 0 ] && return
54 [ -n "$quiet" ] && action "$saved_action" no-quiet
56 case $ret_code in
57 0) local msg="$okmsg" color="$okcolor";;
58 *) local msg="$ermsg" color="$ercolor";;
59 esac
60 case $output in
61 raw|gtk) echo " $msg";;
62 html) echo " <span class=\"float-right color$color\">$msg</span>";;
63 *)
64 local cols=$(get_cols)
65 local scol=$((${cols:-80} - 10))
66 echo -e "\\033[${scol}G[ \\033[1;${color}m$msg\\033[0;39m ]";;
67 esac
68 }
70 # Print info a la status way: info [color] [content]
71 info() {
72 local info="$2"
73 case "$output" in
74 raw|gtk) echo "$info" ;;
75 html) echo " <span class=\"float-right color${1}\">$info</span>";;
76 *)
77 local char="$(echo $info | wc -L)"
78 local in=$((7 + ${char}))
79 indent $(($(get_cols) - ${in})) "[ $(colorize $1 $info) ]" ;;
80 esac
81 }
83 # Line separator
84 separator() {
85 [ -n "$quiet" ] && return
86 case $output in
87 gtk) echo '--------';;
88 html) echo -n '<hr/>';;
89 *) printf "%$(get_cols)s\n" | tr ' ' "${1:-=}";;
90 esac
91 }
93 # New line
94 newline() {
95 [ -z "$quiet" ] && echo
96 }
98 # Display a bold message
99 boldify() {
100 [ -n "$quiet" ] && return
101 case $output in
102 raw) echo "$@" ;;
103 gtk) echo "<b>$@</b>" ;;
104 html) echo "<strong>$@</strong>" ;;
105 *) echo -e "\\033[1m$@\\033[0m" ;;
106 esac
107 }
109 # Colorize message
110 colorize() {
111 [ -n "$quiet" ] && return
112 : ${color=$1}
113 shift
114 case $output in
115 raw|gtk) echo "$@";;
116 html) echo -n "<span class=\"color$color\">$@</span>";;
117 *) case $color in
118 0*) echo -e "\\033[${color:-38}m$@\\033[39m";;
119 *) echo -e "\\033[1;${color:-38}m$@\\033[0;39m";;
120 esac;;
121 esac
122 unset color
123 }
125 # Indent text
126 indent() {
127 [ -n "$quiet" ] && return
128 local in="$1"
129 shift
130 echo -e "\033["$in"G $@";
131 }
133 # Extended MeSsaGe output
134 emsg() {
135 [ -n "$quiet" ] && return
136 local sep="\n$(separator)\n"
137 case $output in
138 raw)
139 echo "$@" | sed -e 's|<b>||g; s|</b>||g; s|<c [0-9]*>||g; \
140 s|</c>||g; s|<->|'$sep'|g; s|<n>|\n|g; s|<i [0-9]*>| |g' ;;
141 gtk)
142 echo "$@" | sed -e 's|<c [0-9]*>||g; s|</c>||g; s|<->|'$sep'|g; \
143 s|<n>|\n|g; s|<i [0-9]*>| |g' ;;
144 html)
145 echo "$@" | sed -e 's|<b>|<strong>|g; s|</b>|</strong>|g; \
146 s|<c \([0-9]*\)>|<span class="color\1">|g; s|</c>|</span>|g; \
147 s|<n>|<br/>|g; s|<->|<hr/>|g; s|<i [0-9]*>| |g' ;;
148 *)
149 echo -en "$(echo "$@" | sed -e 's|<b>|\\033[1m|g; s|</b>|\\033[0m|g;
150 s|<c 0\([0-9]*\)>|\\033[\1m|g; s|<c \([1-9][0-9]*\)>|\\033[1;\1m|g;
151 s|</c>|\\033[0;39m|g; s|<n>|\n|g;
152 s|<->|'$sep'|g; s|<i \([0-9]*\)>|\\033[\1G|g')"
153 [ "$1" != "-n" ] && echo
154 ;;
155 esac
156 }
158 # Check if user is logged as root
159 check_root() {
160 if [ $(id -u) -ne 0 ]; then
161 lgettext "You must be root to execute:"; echo " $(basename $0) $@"
162 exit 1
163 fi
164 }
166 # Display debug info when --debug is used.
167 debug() {
168 [ -n "$debug" ] && echo "$(colorize $decolor 'DEBUG:') $1"
169 }
171 # Report error and finish work
172 die() { longline "$(_ "$@")" >&2; exit 1; }
174 # Interactive mode
175 im() { tty -s; }
177 # Confirmation
178 confirm() {
179 local answer='' defanswer='n'
180 # Check auto-answer, if any
181 [ -n "$yes" ] && answer='y'
182 [ -n "$noconfirm" ] && answer='n'
183 # Print question
184 if [ -n "$1" ]; then
185 case "$2" in
186 '') echo -n "$1 ";;
187 y|Y) echo -n "$1 [$(translate_query Y)/$(translate_query n)] "; defanswer='y';;
188 *) echo -n "$1 [$(translate_query y)/$(translate_query N)] ";;
189 esac
190 else
191 echo -n " [$(translate_query y)/$(translate_query N)] ? "
192 fi
193 # Is it auto-answer?
194 if [ -z "$answer" ]; then
195 im && read -t ${timeout:-30} answer
196 [ -z "$answer" ] && answer="$(translate_query "$defanswer")"
197 else
198 translate_query "$answer"; echo ' (auto)'
199 fi
200 # Return true/false to use in conditions
201 [ "$answer" == "$(translate_query y)" -o "$answer" == "$(translate_query Y)" ]
202 }
204 # Log activities
205 log() {
206 echo "$(date '+%F %R') : $@" >> ${activity:-/var/log/slitaz/libtaz.log}
207 }
209 # Print two-column list of options with descriptions
210 optlist() {
211 [ -n "$quiet" ] && return
212 local in="$(echo "$1" | sed 's| *| |g')" w=$(get_cols) col1=1 line
213 IFS=$'\n'
214 for line in $in; do
215 col=$(echo -n "$line" | cut -f1 | wc -m)
216 [ $col -gt $col1 ] && col1=$col
217 done
218 echo "$in" | sed 's|\t|&\n|' | fold -sw$((w - col1 - 4)) | \
219 sed "/\t/!{s|^.*$|[$((col1 + 4))G&|g}" | sed "/\t$/{N;s|.*| &|;s|\t\n||}"
220 }
222 # Wrap words in long terminal message
223 longline() {
224 [ -n "$quiet" ] && return
225 local w=$(get_cols)
226 echo -e "$@" | fold -sw$w
227 }
229 # Print localized title
230 title() {
231 [ -n "$quiet" ] && return
232 case $output in
233 html) echo "<section><header>$(_ "$@")</header><pre class=\"scroll\">";;
234 *) newline; boldify "$(_ "$@")"; separator;;
235 esac
236 }
238 # Print footer
239 footer() {
240 [ -n "$quiet" ] && return
241 case $output in
242 html) echo "</pre><footer>$1</footer></section>";;
243 *) separator; echo "$1"; [ -n "$1" ] && newline;;
244 esac
245 }
247 # Print current action
248 saved_action=''
249 action() {
250 saved_action="$1"
251 [ -n "$quiet" -a -z "$2" ] && return
252 local w c scol msg chars
253 # Translators: 'w' is the width the wider translated message ('[ Done ]' or '[ Failed ]') takes in a terminal; place here the number
254 w=$(_ 'w'); w=${w/w/10}
255 c=$(get_cols)
256 scol=$(( $c - $w ))
257 msg="$(_n "$@" | fold -sw$scol)"
258 chars=$(echo -n "$msg" | tail -n1 | wc -m)
259 msg="$(printf '%s%'$(( $scol - $chars ))'s' "$msg" '')"
261 case $output in
262 raw|gtk|html) echo -n "$msg";;
263 *) echo -ne "\033[0;33m$msg\033[0m";;
264 esac
265 }
267 # Print long line as list item
268 itemize() {
269 [ -n "$quiet" ] && return
270 case $output in
271 gtk) echo "$@";;
272 *)
273 local inp="$@" w=$(get_cols) first offset
274 first="$(echo -e "$inp" | fold -sw$w | head -n1)"
275 echo "$first"
276 cols1="$(echo "${first:1}" | wc -c)"
277 offset=$(echo "$first" | sed -n 's|^\([^:\*-]*[:\*-]\).*$|\1|p' | wc -m)
278 echo "${inp:$cols1}" | fold -sw$((w - offset)) | awk \
279 '($0){printf "%'$offset's%s\n","",$0}'
280 ;;
281 esac
282 }