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

libtaz.sh: fix '_' and '_n' when used space-separated arguments: _ 'Run "%s" in /.' "tazpkg -i $pkg"
author Aleksej Bobylev <al.bobylev@gmail.com>
date Thu Dec 04 16:50:29 2014 +0200 (2014-12-04)
parents a410c3feb222
children e9258bc4e858
rev   line source
pankso@125 1 #!/bin/sh
pankso@125 2 #
pankso@125 3 # SliTaz Base functions used from boot scripts to end user tools. Use
pankso@125 4 # gettext and not echo for messages. Keep output suitable for GTK boxes
pankso@125 5 # and Ncurses dialog. LibTaz should not depend on any configuration file.
paul@166 6 # No bloated code here, functions must be used by at least 3-4 tools.
pankso@139 7 #
pankso@139 8 # Documentation: man libtaz or /usr/share/doc/slitaz/libtaz.txt
pankso@125 9 #
pascal@226 10 # Copyright (C) 2012-2014 SliTaz GNU/Linux - BSD License
pankso@125 11 #
pankso@125 12
pankso@125 13 . /usr/bin/gettext.sh
al@177 14
al@219 15 # short names for common i18n functions (like 'echo' and 'echo -n')
al@263 16 _() { local T="$1"; shift; printf "$(eval_gettext "$T")" "$@"; echo; }
al@263 17 _n() { local T="$1"; shift; printf "$(eval_gettext "$T")" "$@"; }
al@261 18 # usage #1: _ 'Hello, $USER!'
al@261 19 # usage #2: _ 'Hello, %s!' $USER
al@219 20
al@219 21 # internal i18n
al@219 22 lgettext() { gettext -d 'slitaz-base' "$@"; }
pankso@125 23
pankso@125 24 # Internal variables.
al@177 25 okmsg="$(lgettext 'Done')"
al@177 26 ermsg="$(lgettext 'Failed')"
pankso@174 27 : ${okcolor=32}
pankso@174 28 : ${ercolor=31}
pankso@174 29 : ${decolor=36}
pankso@125 30
pankso@137 31 # Parse cmdline options and store values in a variable.
pankso@125 32 for opt in "$@"
pankso@125 33 do
pankso@125 34 case "$opt" in
al@223 35 --*=*) export "${opt#--}" ;;
al@258 36 --*) export ${opt#--}="yes" ;;
pankso@125 37 esac
pankso@125 38 done
pankso@131 39 [ "$HTTP_REFERER" ] && output="html"
pankso@125 40
pankso@187 41 # Get terminal columns
pankso@187 42 get_cols() {
al@249 43 stty size 2>/dev/null | busybox cut -d " " -f 2
pankso@187 44 }
pankso@187 45
pankso@125 46 # Return command status. Default to colored console output.
pankso@125 47 status() {
pankso@125 48 local check=$?
pankso@131 49 case $output in
pankso@161 50 raw|gtk)
pankso@161 51 done=" $okmsg"
pankso@131 52 error=" $ermsg" ;;
pankso@131 53 html)
pankso@167 54 done=" <span style='color: $okcolor;'>$okmsg</span>"
pankso@167 55 error=" <span style='color: $ercolor;'>$ermsg</span>" ;;
pankso@136 56 *)
pankso@187 57 local cols=$(get_cols)
pankso@187 58 [ "$cols" ] || cols=80
pankso@131 59 local scol=$(($cols - 10))
pankso@131 60 done="\\033[${scol}G[ \\033[1;${okcolor}m${okmsg}\\033[0;39m ]"
pankso@131 61 error="\\033[${scol}G[ \\033[1;${ercolor}m${ermsg}\\033[0;39m ]" ;;
pankso@131 62 esac
pankso@125 63 if [ $check = 0 ]; then
pankso@125 64 echo -e "$done"
pankso@125 65 else
pankso@125 66 echo -e "$error"
pankso@125 67 fi
pankso@125 68 }
pankso@125 69
pankso@125 70 # Line separator.
pankso@125 71 separator() {
pankso@132 72 local sepchar="="
pankso@132 73 [ "$HTTP_REFERER" ] && local sepchar="<hr />"
pankso@132 74 case $output in
al@258 75 raw|gtk) local sepchar="-"; local cols="8" ;;
al@258 76 html) local sepchar="<hr />" ;;
pankso@187 77 *)
pankso@187 78 local cols=$(get_cols)
pankso@187 79 [ "$cols" ] || cols=80 ;;
pankso@132 80 esac
pankso@125 81 for c in $(seq 1 $cols); do
pankso@131 82 echo -n "$sepchar"
pankso@125 83 done && echo ""
pankso@125 84 }
pankso@125 85
pankso@164 86 # New line for echo -n or gettext.
pankso@164 87 newline() {
pankso@164 88 echo ""
pankso@164 89 }
pankso@164 90
pankso@125 91 # Display a bold message. GTK Yad: Works only in --text=""
pankso@125 92 boldify() {
pankso@125 93 case $output in
al@258 94 raw) echo "$@" ;;
al@258 95 gtk) echo "<b>$@</b>" ;;
meshca@149 96 html) echo "<strong>$@</strong>" ;;
meshca@149 97 *) echo -e "\\033[1m$@\\033[0m" ;;
pankso@125 98 esac
pankso@125 99 }
pankso@125 100
al@193 101 # Usage: colorize colorNB "Message" or use --color=NB option
pankso@167 102 # when running a tool. Default to white/38 and no html or gtk.
pankso@167 103 colorize() {
meshca@175 104 : ${color=$1}
meshca@175 105 shift
meshca@175 106 local content="$@"
pankso@167 107 case $output in
meshca@175 108 raw|gtk|html) echo "$content" ;;
pankso@167 109 *)
pankso@168 110 [ "$color" ] || color=38
meshca@175 111 echo -e "\\033[1;${color}m${content}\\033[0;39m" ;;
pankso@167 112 esac
pankso@167 113 unset color
pankso@167 114 }
pankso@167 115
pankso@174 116 # Indent text $1 spaces.
pankso@161 117 indent() {
meshca@158 118 local in="$1"
meshca@158 119 shift
pankso@161 120 echo -e "\033["$in"G $@";
meshca@158 121 }
meshca@158 122
al@193 123 # Extended MeSsaGe output
al@193 124 emsg() {
al@193 125 local sep="\n--------\n"
al@193 126 case $output in
al@193 127 raw)
al@193 128 echo "$@" | sed -e 's|<b>||g; s|</b>||g; s|<c [0-9]*>||g; \
al@193 129 s|</c>||g; s|<->|'$sep'|g; s|<n>|\n|g; s|<i [0-9]*>| |g' ;;
al@193 130 gtk)
al@193 131 echo "$@" | sed -e 's|<c [0-9]*>||g; s|</c>||g; s|<->|'$sep'|g; \
al@193 132 s|<n>|\n|g; s|<i [0-9]*>| |g' ;;
al@193 133 html)
al@193 134 echo "$@" | sed -e 's|<b>|<strong>|g; s|</b>|</strong>|g; \
al@193 135 s|<n>|<br/>|g; s|<->|<hr/>|g; s|<i [0-9]*>| |g' ;;
al@193 136 *)
al@193 137 local sep="\n"
al@193 138 local cols=$(get_cols)
al@193 139 [ "$cols" ] || cols=80
al@258 140 for c in $(seq 1 $cols); do
al@193 141 sep="${sep}="
al@193 142 done
al@193 143 echo -en "$(echo "$@" | sed -e 's|<b>|\\033[1m|g; s|</b>|\\033[0m|g; \
al@193 144 s|<c \([0-9]*\)>|\\033[1;\1m|g; s|</c>|\\033[0;39m|g; s|<n>|\n|g; \
al@193 145 s|<->|'$sep'|g; s|<i \([0-9]*\)>|\\033[\1G|g')"
al@193 146 [ "$1" != "-n" ] && echo
al@193 147 ;;
al@193 148 esac
al@193 149 }
al@193 150
pankso@125 151 # Check if user is logged as root.
pankso@125 152 check_root() {
pankso@125 153 if [ $(id -u) != 0 ]; then
al@258 154 lgettext "You must be root to execute:"; echo " $(basename $0) $@"
pankso@125 155 exit 1
pankso@125 156 fi
pankso@125 157 }
meshca@158 158
pankso@174 159 # Display debug info when --debug is used.
meshca@169 160 debug() {
al@193 161 [ "$debug" ] && echo "$(colorize $decolor 'DEBUG:') $1"
meshca@169 162 }
meshca@169 163
pankso@161 164 # Gettextize yes/no.
meshca@158 165 translate_query() {
meshca@158 166 case $1 in
al@177 167 y) lgettext "y" ;;
al@177 168 Y) lgettext "Y" ;;
al@177 169 n) lgettext "n" ;;
al@177 170 N) lgettext "N" ;;
meshca@158 171 # Support other cases but keep them untranslated.
meshca@158 172 *) echo "$1" ;;
meshca@158 173 esac
meshca@158 174 }
meshca@160 175
al@260 176 # Usage 1: echo -n "The question"; confirm
al@260 177 # Usage 2: confirm "The question (y/N)?"
pankso@161 178 confirm() {
al@260 179 if [ -n "$yes" ]; then
al@260 180 true
al@260 181 else
al@260 182 if [ -n "$1" ]; then
al@260 183 echo -n "$1 "
al@260 184 else
al@260 185 echo -n " ($(translate_query y)/$(translate_query N)) ? "
al@260 186 fi
al@260 187 read answer
al@260 188 [ "$answer" == "$(translate_query y)" ]
al@260 189 fi
meshca@160 190 }
pankso@161 191
pankso@164 192 # Log activities. $activity should be set by the script. The log format
pankso@164 193 # is suitable for web interfaces like cook. Usage: log "String"
pankso@162 194 log() {
pankso@163 195 [ "$activity" ] || activity=/var/log/slitaz/libtaz.log
pankso@164 196 echo "$(date '+%Y-%m-%d %H:%M') : $@" >> $activity
pankso@162 197 }
al@221 198
al@221 199 # Sophisticated function to print two-column list of options with descriptions
al@221 200 # Be UTF-8 friendly, not use `wc -L`, `awk length`, `${#string}`
al@221 201 optlist() {
al@221 202 local in cols col1=1 line
al@221 203 in="$(echo "$1" | sed 's| *| |g')"
al@221 204 cols=$(get_cols); [ "$cols" ] || cols=80
al@258 205 IFS=$'\n'
al@221 206 for line in $in; do
al@221 207 col=$(echo -n "$line" | cut -f1 | wc -m)
al@221 208 [ $col -gt $col1 ] && col1=$col
al@221 209 done
al@221 210 echo "$in" | sed 's|\t|&\n|' | fold -sw$((cols - col1 - 4)) | \
al@221 211 sed "/\t/!{s|^.*$|[$((col1 + 4))G&|g}" | sed "/\t$/{N;s|.*| &|;s|\t\n||}"
al@221 212 }
al@221 213
al@221 214 # Wrap words in long terminal message
al@221 215 longline() {
al@221 216 cols=$(get_cols); [ "$cols" ] || cols=80
al@221 217 echo -e "$@" | fold -sw$cols
al@221 218 }