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