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

libtaz: implement options --quiet and --cols=
author Aleksej Bobylev <al.bobylev@gmail.com>
date Thu Dec 03 04:59:59 2015 +0200 (2015-12-03)
parents 973c3b2ecc5a
children 2d181ce6f795
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'
45 # i18n functions
46 _() { local T="$1"; shift; printf "$(eval_gettext "$T")" "$@"; echo; }
47 _n() { local T="$1"; shift; printf "$(eval_gettext "$T")" "$@"; }
48 _p() { local S="$1" P="$2" N="$3"; shift 3; printf "$(ngettext "$S" "$P" "$N")" "$@"; }
50 # Get terminal columns
51 get_cols() { stty size 2>/dev/null | awk -vc=$cols 'END{print c?c:($2 && $2<80)?$2:80}'; }
53 # Last command status
54 status() {
55 local ret_code=$?
56 [ -n "$quiet" -a "$ret_code" -eq 0 ] && return
57 [ -n "$quiet" ] && action "$saved_action" no-quiet
59 case $ret_code in
60 0) local msg="$okmsg" color="$okcolor";;
61 *) local msg="$ermsg" color="$ercolor";;
62 esac
63 case $output in
64 raw|gtk) echo " $msg";;
65 html) echo " <span class=\"float-right color$color\">$msg</span>";;
66 *) echo -e "[ \\033[1;${color}m$msg\\033[0;39m ]";;
67 esac
68 }
70 # Line separator
71 separator() {
72 [ -n "$quiet" ] && return
73 case $output in
74 gtk) echo '--------';;
75 html) echo -n '<hr/>';;
76 *) printf "%$(get_cols)s\n" | tr ' ' "${1:-=}";;
77 esac
78 }
80 # New line
81 newline() {
82 [ -z "$quiet" ] && echo
83 }
85 # Display a bold message
86 boldify() {
87 [ -n "$quiet" ] && return
88 case $output in
89 raw) echo "$@" ;;
90 gtk) echo "<b>$@</b>" ;;
91 html) echo "<strong>$@</strong>" ;;
92 *) echo -e "\\033[1m$@\\033[0m" ;;
93 esac
94 }
96 # Colorize message
97 colorize() {
98 [ -n "$quiet" ] && return
99 : ${color=$1}
100 shift
101 case $output in
102 raw|gtk) echo "$@";;
103 html) echo -n "<span class=\"color$color\">$@</span>";;
104 *) case $color in
105 0*) echo -e "\\033[${color:-38}m$@\\033[39m";;
106 *) echo -e "\\033[1;${color:-38}m$@\\033[0;39m";;
107 esac;;
108 esac
109 unset color
110 }
112 # Indent text
113 indent() {
114 [ -n "$quiet" ] && return
115 local in="$1"
116 shift
117 echo -e "\033["$in"G $@";
118 }
120 # Extended MeSsaGe output
121 emsg() {
122 [ -n "$quiet" ] && return
123 local sep="\n$(separator)\n"
124 case $output in
125 raw)
126 echo "$@" | sed -e 's|<b>||g; s|</b>||g; s|<c [0-9]*>||g; \
127 s|</c>||g; s|<->|'$sep'|g; s|<n>|\n|g; s|<i [0-9]*>| |g' ;;
128 gtk)
129 echo "$@" | sed -e 's|<c [0-9]*>||g; s|</c>||g; s|<->|'$sep'|g; \
130 s|<n>|\n|g; s|<i [0-9]*>| |g' ;;
131 html)
132 echo "$@" | sed -e 's|<b>|<strong>|g; s|</b>|</strong>|g; \
133 s|<c \([0-9]*\)>|<span class="color\1">|g; s|</c>|</span>|g; \
134 s|<n>|<br/>|g; s|<->|<hr/>|g; s|<i [0-9]*>| |g' ;;
135 *)
136 echo -en "$(echo "$@" | sed -e 's|<b>|\\033[1m|g; s|</b>|\\033[0m|g;
137 s|<c 0\([0-9]*\)>|\\033[\1m|g; s|<c \([1-9][0-9]*\)>|\\033[1;\1m|g;
138 s|</c>|\\033[0;39m|g; s|<n>|\n|g;
139 s|<->|'$sep'|g; s|<i \([0-9]*\)>|\\033[\1G|g')"
140 [ "$1" != "-n" ] && echo
141 ;;
142 esac
143 }
145 # Check if user is logged as root
146 check_root() {
147 if [ $(id -u) -ne 0 ]; then
148 lgettext "You must be root to execute:"; echo " $(basename $0) $@"
149 exit 1
150 fi
151 }
153 # Display debug info when --debug is used.
154 debug() {
155 [ -n "$debug" ] && echo "$(colorize $decolor 'DEBUG:') $1"
156 }
158 # Confirmation
159 confirm() {
160 if [ -n "$yes" ]; then
161 true
162 else
163 if [ -n "$1" ]; then
164 echo -n "$1 "
165 else
166 echo -n " ($(translate_query y)/$(translate_query N)) ? "
167 fi
168 read answer
169 [ "$answer" == "$(translate_query y)" ]
170 fi
171 }
173 # Log activities
174 log() {
175 echo "$(date '+%F %R') : $@" >> ${activity:-/var/log/slitaz/libtaz.log}
176 }
178 # Print two-column list of options with descriptions
179 optlist() {
180 [ -n "$quiet" ] && return
181 local in="$(echo "$1" | sed 's| *| |g')" w=$(get_cols) col1=1 line
182 IFS=$'\n'
183 for line in $in; do
184 col=$(echo -n "$line" | cut -f1 | wc -m)
185 [ $col -gt $col1 ] && col1=$col
186 done
187 echo "$in" | sed 's|\t|&\n|' | fold -sw$((w - col1 - 4)) | \
188 sed "/\t/!{s|^.*$|[$((col1 + 4))G&|g}" | sed "/\t$/{N;s|.*| &|;s|\t\n||}"
189 }
191 # Wrap words in long terminal message
192 longline() {
193 [ -n "$quiet" ] && return
194 local w=$(get_cols)
195 echo -e "$@" | fold -sw$w
196 }
198 # Print localized title
199 title() {
200 [ -n "$quiet" ] && return
201 case $output in
202 html) echo "<section><header>$(_ "$@")</header><pre class=\"scroll\">";;
203 *) newline; boldify "$(_ "$@")"; separator;;
204 esac
205 }
207 # Print footer
208 footer() {
209 [ -n "$quiet" ] && return
210 case $output in
211 html) echo "</pre><footer>$1</footer></section>";;
212 *) separator; echo "$1"; [ -n "$1" ] && newline;;
213 esac
214 }
216 # Print current action
217 saved_action=''
218 action() {
219 saved_action="$1"
220 [ -n "$quiet" -a -z "$2" ] && return
221 local w c scol msg chars
222 w=$(_ 'w'); w=${w/w/10}
223 c=$(get_cols)
224 scol=$(( $c - $w ))
225 msg="$(_n "$@" | fold -sw$scol)"
226 chars=$(echo -n "$msg" | tail -n1 | wc -m)
227 msg="$(printf '%s%'$(( $scol - $chars ))'s' "$msg" '')"
229 case $output in
230 raw|gtk|html) echo -n "$msg";;
231 *) echo -ne "\033[0;33m$msg\033[0m";;
232 esac
233 }
235 # Print long line as list item
236 itemize() {
237 [ -n "$quiet" ] && return
238 case $output in
239 gtk) echo "$@";;
240 *)
241 local inp="$@" w=$(get_cols) first offset
242 first="$(echo -e "$inp" | fold -sw$w | head -n1)"
243 echo "$first"
244 cols1="$(echo "${first:1}" | wc -c)"
245 offset=$(echo "$first" | sed -n 's|^\([^:\*-]*[:\*-]\).*$|\1|p' | wc -m)
246 echo "${inp:$cols1}" | fold -sw$((w - offset)) | awk \
247 '($0){printf "%'$offset's%s\n","",$0}'
248 ;;
249 esac
250 }