ulib/base: implémenter ask_any()
This commit is contained in:
parent
94615de67a
commit
2a6d0899ca
|
@ -3533,6 +3533,79 @@ function ask_yesno() {
|
||||||
is_yes "$default"
|
is_yes "$default"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
function ask_any() {
|
||||||
|
# Afficher le message $1 suivi du texte "[$2]" (qui vaut par défaut +Oq), puis
|
||||||
|
# lire la réponse. Les lettres de la chaine de format $2 sont numérotées de 0 à
|
||||||
|
# $((${#2} - 1)). Le code de retour est le numéro de la lettre qui a été
|
||||||
|
# sélectionnée. Cette fonction est une généralisation de ask_yesno() pour
|
||||||
|
# n'importe quel ensemble de lettres.
|
||||||
|
# La première lettre en majuscule est la lettre sélectionnée par défaut.
|
||||||
|
# La lettre O matche toutes les lettres qui signifient oui: o, y, 1, v, t
|
||||||
|
# La lettre N matche toutes les lettres qui signifient non: n, f, 0
|
||||||
|
# Il y a des raccourcis:
|
||||||
|
# +O --> On
|
||||||
|
# +N --> oN
|
||||||
|
# +C --> oN si on est en mode interactif, On sinon
|
||||||
|
# +X --> On si on est en mode interactifn oN sinon
|
||||||
|
# Si $1 est une option, elle est utilisée avec check_interaction pour savoir si
|
||||||
|
# on est en mode interactif ou non. A ce moment-là, les valeurs sont décalées
|
||||||
|
# ($2=message, $3=format)
|
||||||
|
local interactive=1
|
||||||
|
if [[ "$1" == -* ]]; then
|
||||||
|
if [ "$1" != -- ]; then
|
||||||
|
check_interaction "$1" || interactive=
|
||||||
|
fi
|
||||||
|
shift
|
||||||
|
else
|
||||||
|
check_interaction -c || interactive=
|
||||||
|
fi
|
||||||
|
local format="${2:-+Oq}"
|
||||||
|
format="${format/+O/On}"
|
||||||
|
format="${format/+N/oN}"
|
||||||
|
if [ -n "$interactive" ]; then
|
||||||
|
format="${format/+C/oN}"
|
||||||
|
format="${format/+X/On}"
|
||||||
|
else
|
||||||
|
format="${format/+C/On}"
|
||||||
|
format="${format/+X/oN}"
|
||||||
|
fi
|
||||||
|
local i count="${#format}"
|
||||||
|
|
||||||
|
if [ -n "$interactive" ]; then
|
||||||
|
eflush
|
||||||
|
local message="${1:-Voulez-vous continuer?}"
|
||||||
|
local prompt="[$format]"
|
||||||
|
local r f lf defi
|
||||||
|
while true; do
|
||||||
|
__eecho_ "$message $prompt " 1>&2
|
||||||
|
uread r
|
||||||
|
r="$(strlower "${r:0:1}")"
|
||||||
|
i=0; defi=
|
||||||
|
while [ $i -lt $count ]; do
|
||||||
|
f="${format:$i:1}"
|
||||||
|
lf="$(strlower "$f")"
|
||||||
|
[ "$r" == "$lf" ] && return $i
|
||||||
|
if [ -z "$defi" ]; then
|
||||||
|
[[ "$f" =~ [A-Z] ]] && defi="$i"
|
||||||
|
fi
|
||||||
|
if [ "$lf" == o ]; then
|
||||||
|
case "$r" in o|y|1|v|t) return $i;; esac
|
||||||
|
elif [ "$lf" == n ]; then
|
||||||
|
case "$r" in n|f|0) return $i;; esac
|
||||||
|
fi
|
||||||
|
i=$(($i + 1))
|
||||||
|
done
|
||||||
|
[ -z "$r" ] && return ${defi:-0}
|
||||||
|
done
|
||||||
|
else
|
||||||
|
i=0
|
||||||
|
while [ $i -lt $count ]; do
|
||||||
|
[[ "${format:$i:1}" =~ [A-Z] ]] && return $i
|
||||||
|
i=$(($i + 1))
|
||||||
|
done
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
}
|
||||||
function read_value() {
|
function read_value() {
|
||||||
# Afficher le message $1 suivi de la valeur par défaut [$3] si elle est non
|
# Afficher le message $1 suivi de la valeur par défaut [$3] si elle est non
|
||||||
# vide, puis lire la valeur donnée par l'utilisateur. Cette valeur doit être non
|
# vide, puis lire la valeur donnée par l'utilisateur. Cette valeur doit être non
|
||||||
|
|
Loading…
Reference in New Issue