slitaz-base-files annotate rootfs/lib/libtaz.sh @ rev 288

libtaz.sh: use familiar separator in output=raw
author Aleksej Bobylev <al.bobylev@gmail.com>
date Mon Nov 30 02:33:22 2015 +0200 (2015-11-30)
parents efc8f188db6e
children cca198d5952c
rev   line source
pankso@125 1 #!/bin/sh
pankso@125 2 #
al@270 3 # SliTaz Base functions.
al@270 4 # Documentation: `man libtaz` or /usr/share/doc/slitaz/libtaz.txt
pankso@139 5 #
al@270 6 # Copyright (C) 2012-2015 SliTaz GNU/Linux - BSD License
pankso@125 7 #
pankso@125 8
pankso@125 9 . /usr/bin/gettext.sh
al@279 10 alias sed="busybox sed"
al@177 11
al@270 12 # Internal
al@219 13 lgettext() { gettext -d 'slitaz-base' "$@"; }
al@270 14 translate_query() {
al@270 15 case $1 in
al@270 16 y) lgettext "y";;
al@270 17 Y) lgettext "Y";;
al@270 18 n) lgettext "n";;
al@270 19 N) lgettext "N";;
al@270 20 # Support other cases but keep them untranslated.
al@270 21 *) echo "$1" ;;
al@270 22 esac
al@270 23 }
al@177 24 okmsg="$(lgettext 'Done')"
al@177 25 ermsg="$(lgettext 'Failed')"
pankso@174 26 : ${okcolor=32}
pankso@174 27 : ${ercolor=31}
pankso@174 28 : ${decolor=36}
pankso@125 29
pankso@137 30 # Parse cmdline options and store values in a variable.
al@270 31 for opt in "$@"; do
al@278 32 opt_name="${opt%%=*}"; opt_name="$(echo -n "${opt_name#--}" | tr -c 'a-zA-Z0-9' '_')"
al@276 33 case "$opt" in
al@278 34 --[0-9]*=*) export _$opt_name="${opt#*=}" ;;
al@278 35 --[0-9]*) export _$opt_name=yes ;;
al@278 36 --*=*) export $opt_name="${opt#*=}" ;;
al@278 37 --*) export $opt_name=yes ;;
pankso@125 38 esac
pankso@125 39 done
al@270 40 [ "$HTTP_REFERER" ] && output='html'
al@270 41
al@270 42
al@270 43
al@270 44
al@270 45 # i18n functions
al@270 46 _() { local T="$1"; shift; printf "$(eval_gettext "$T")" "$@"; echo; }
al@270 47 _n() { local T="$1"; shift; printf "$(eval_gettext "$T")" "$@"; }
al@271 48 _p() { local S="$1" P="$2" N="$3"; shift 3; printf "$(ngettext "$S" "$P" "$N")" "$@"; }
pankso@125 49
pankso@187 50 # Get terminal columns
al@270 51 get_cols() { stty size 2>/dev/null | busybox cut -d' ' -f2; }
pankso@187 52
al@270 53 # Last command status
pankso@125 54 status() {
pankso@125 55 local check=$?
pankso@131 56 case $output in
pankso@161 57 raw|gtk)
al@270 58 done=" $okmsg"
al@270 59 error=" $ermsg";;
pankso@131 60 html)
al@270 61 done=" <span class=\"float-right color$okcolor\">$okmsg</span>"
al@270 62 error=" <span class=\"float-right color$ercolor\">$ermsg</span>";;
pankso@136 63 *)
al@287 64 done="[ \\033[1;${okcolor}m${okmsg}\\033[0;39m ]"
al@287 65 error="[ \\033[1;${ercolor}m${ermsg}\\033[0;39m ]";;
pankso@131 66 esac
al@270 67 case $check in
al@270 68 0) echo -e "$done";;
al@270 69 *) echo -e "$error";;
al@270 70 esac
pankso@125 71 }
pankso@125 72
al@270 73 # Line separator
pankso@125 74 separator() {
pankso@132 75 case $output in
al@288 76 gtk) echo '--------';;
al@270 77 html) echo -n '<hr/>';;
pankso@187 78 *)
pankso@187 79 local cols=$(get_cols)
al@270 80 printf "%${cols:-80}s\n" | tr ' ' "${1:-=}";;
pankso@132 81 esac
pankso@125 82 }
pankso@125 83
al@270 84 # New line
al@270 85 newline() { echo; }
pankso@164 86
al@270 87 # Display a bold message
pankso@125 88 boldify() {
pankso@125 89 case $output in
al@258 90 raw) echo "$@" ;;
al@258 91 gtk) echo "<b>$@</b>" ;;
meshca@149 92 html) echo "<strong>$@</strong>" ;;
meshca@149 93 *) echo -e "\\033[1m$@\\033[0m" ;;
pankso@125 94 esac
pankso@125 95 }
pankso@125 96
al@270 97 # Colorize message
pankso@167 98 colorize() {
meshca@175 99 : ${color=$1}
meshca@175 100 shift
pankso@167 101 case $output in
al@270 102 raw|gtk) echo "$@";;
al@270 103 html) echo -n "<span class=\"color$color\">$@</span>";;
al@279 104 *) case $color in
al@279 105 0*) echo -e "\\033[${color:-38}m$@\\033[39m";;
al@279 106 *) echo -e "\\033[1;${color:-38}m$@\\033[0;39m";;
al@279 107 esac;;
pankso@167 108 esac
pankso@167 109 unset color
pankso@167 110 }
pankso@167 111
al@270 112 # Indent text
pankso@161 113 indent() {
meshca@158 114 local in="$1"
meshca@158 115 shift
pankso@161 116 echo -e "\033["$in"G $@";
meshca@158 117 }
meshca@158 118
al@193 119 # Extended MeSsaGe output
al@193 120 emsg() {
al@193 121 local sep="\n--------\n"
al@193 122 case $output in
al@193 123 raw)
al@193 124 echo "$@" | sed -e 's|<b>||g; s|</b>||g; s|<c [0-9]*>||g; \
al@193 125 s|</c>||g; s|<->|'$sep'|g; s|<n>|\n|g; s|<i [0-9]*>| |g' ;;
al@193 126 gtk)
al@193 127 echo "$@" | sed -e 's|<c [0-9]*>||g; s|</c>||g; s|<->|'$sep'|g; \
al@193 128 s|<n>|\n|g; s|<i [0-9]*>| |g' ;;
al@193 129 html)
al@193 130 echo "$@" | sed -e 's|<b>|<strong>|g; s|</b>|</strong>|g; \
al@270 131 s|<c \([0-9]*\)>|<span class="color\1">|g; s|</c>|</span>|g; \
al@193 132 s|<n>|<br/>|g; s|<->|<hr/>|g; s|<i [0-9]*>| |g' ;;
al@193 133 *)
al@193 134 local sep="\n"
al@193 135 local cols=$(get_cols)
al@193 136 [ "$cols" ] || cols=80
al@258 137 for c in $(seq 1 $cols); do
al@193 138 sep="${sep}="
al@193 139 done
al@265 140 echo -en "$(echo "$@" | sed -e 's|<b>|\\033[1m|g; s|</b>|\\033[0m|g;
al@279 141 s|<c 0\([0-9]*\)>|\\033[\1m|g; s|<c \([1-9][0-9]*\)>|\\033[1;\1m|g;
al@279 142 s|</c>|\\033[0;39m|g; s|<n>|\n|g;
al@193 143 s|<->|'$sep'|g; s|<i \([0-9]*\)>|\\033[\1G|g')"
al@193 144 [ "$1" != "-n" ] && echo
al@193 145 ;;
al@193 146 esac
al@193 147 }
al@193 148
al@270 149 # Check if user is logged as root
pankso@125 150 check_root() {
pankso@125 151 if [ $(id -u) != 0 ]; then
al@258 152 lgettext "You must be root to execute:"; echo " $(basename $0) $@"
pankso@125 153 exit 1
pankso@125 154 fi
pankso@125 155 }
meshca@158 156
pankso@174 157 # Display debug info when --debug is used.
meshca@169 158 debug() {
al@270 159 [ -n "$debug" ] && echo "$(colorize $decolor 'DEBUG:') $1"
meshca@169 160 }
meshca@169 161
al@270 162 # Confirmation
pankso@161 163 confirm() {
al@260 164 if [ -n "$yes" ]; then
al@260 165 true
al@260 166 else
al@260 167 if [ -n "$1" ]; then
al@260 168 echo -n "$1 "
al@260 169 else
al@260 170 echo -n " ($(translate_query y)/$(translate_query N)) ? "
al@260 171 fi
al@260 172 read answer
al@260 173 [ "$answer" == "$(translate_query y)" ]
al@260 174 fi
meshca@160 175 }
pankso@161 176
al@270 177 # Log activities
pankso@162 178 log() {
al@271 179 echo "$(date '+%F %R') : $@" >> ${activity:-/var/log/slitaz/libtaz.log}
pankso@162 180 }
al@221 181
al@270 182 # Print two-column list of options with descriptions
al@221 183 optlist() {
al@221 184 local in cols col1=1 line
al@221 185 in="$(echo "$1" | sed 's| *| |g')"
al@221 186 cols=$(get_cols); [ "$cols" ] || cols=80
al@258 187 IFS=$'\n'
al@221 188 for line in $in; do
al@221 189 col=$(echo -n "$line" | cut -f1 | wc -m)
al@221 190 [ $col -gt $col1 ] && col1=$col
al@221 191 done
al@221 192 echo "$in" | sed 's|\t|&\n|' | fold -sw$((cols - col1 - 4)) | \
al@221 193 sed "/\t/!{s|^.*$|[$((col1 + 4))G&|g}" | sed "/\t$/{N;s|.*| &|;s|\t\n||}"
al@221 194 }
al@221 195
al@221 196 # Wrap words in long terminal message
al@221 197 longline() {
al@270 198 cols=$(get_cols)
al@270 199 echo -e "$@" | fold -sw${cols:-80}
al@221 200 }
al@271 201
al@271 202 # Print localized title
al@271 203 title() {
al@271 204 case $output in
al@271 205 html) echo "<section><header>$(_ "$@")</header><pre class=\"scroll\">";;
al@271 206 *) newline; boldify "$(_ "$@")"; separator;;
al@271 207 esac
al@271 208 }
al@271 209
al@271 210 # Print footer
al@271 211 footer() {
al@271 212 case $output in
al@271 213 html) echo "</pre><footer>$1</footer></section>";;
al@271 214 *) separator; echo "$1"; [ -n "$1" ] && newline;;
al@271 215 esac
al@271 216 }
al@271 217
al@271 218 # Print current action
al@271 219 action() {
al@287 220 local w cols scol msg chars padding
al@287 221 w=$(_ 'w'); w=${w/w/10}
al@287 222 cols=$(get_cols); cols=${cols:-80}; scol=$(( $cols - $w ))
al@287 223 msg="$(_n "$@" | fold -sw$scol)"
al@287 224 chars=$(echo -n "$msg" | tail -n1 | wc -m); padding=$(( $scol - $chars ))
al@287 225 msg="$(printf '%s%'$padding's' "$msg" "")"
al@287 226
al@271 227 case $output in
al@287 228 raw|gtk|html) echo -n "$msg";;
al@287 229 *) echo -ne "\033[0;33m$msg\033[0m";;
al@271 230 esac
al@271 231 }
al@271 232
al@271 233 # Print long line as list item
al@271 234 itemize() {
al@283 235 case $output in
al@283 236 gtk) echo "$@";;
al@283 237 *)
al@283 238 local inp="$@" cols=$(get_cols) first offset
al@283 239 cols="${cols:-80}"
al@283 240 first="$(echo -e "$inp" | fold -sw$cols | head -n1)"
al@283 241 echo "$first"
al@283 242 cols1="$(echo "${first:1}" | wc -c)"
al@283 243 offset=$(echo "$first" | sed -n 's|^\([^:\*-]*[:\*-]\).*$|\1|p' | wc -m)
al@283 244 echo "${inp:$cols1}" | fold -sw$((cols - offset)) | awk \
al@283 245 '($0){printf "%'$offset's%s\n","",$0}'
al@283 246 ;;
al@283 247 esac
al@271 248 }