scripts / menuadm /
Sébastien MARQUE commit initial
addf1bd 7 years ago
1 contributor
123 lines | 3.26kb
#!/bin/bash

test -n "$1" \
&& egrep -q '^[[:digit:]]+$' <<< $1 \
&& DEFAULT_ENTRY="$1"

# mettre une valeur quelconconque pour entrer en mode deboggage, vide pour prod
DEBUG=

unset menuadm
declare -A menuadm

function build_menu () {
    awk -F'::' -v dq='"' \
        'BEGIN {
            printf("unset action label translation;\n")
            printf("declare -a label translation action;\n")
        }
        !/^\s*(#|$)/ { 
            if ($2 != "") {
                printf("translation[${#translation[*]}]=${#label[*]};\n")
            }
            printf("action[${#action[*]}]=%s;\n", dq $2 dq)
            printf("label[${#label[*]}]=%s;\n", dq $1 dq)
        }' ${menuadm[menulist]}
}

function show_menu_debug () {
     build_menu
     eval $(build_menu)
     read
     until check_answer; do
         show_labels
         read -p "Choix: "
     done
     echo "${action[$REPLY]}"
}

function show_menu () {
    eval $(build_menu)
    until check_answer; do
        show_labels
	test -n "$DEFAULT_ENTRY" \
        && test $DEFAULT_ENTRY -ge 0 \
        && test $DEFAULT_ENTRY -lt ${#translation[*]} \
        && DEFAULT_ENTRY_LABEL="$(get_chapter)"
        read -p "Choix${DEFAULT_ENTRY_LABEL}: "
        test -n "$DEFAULT_ENTRY_LABEL" \
        && REPLY=${REPLY:-$DEFAULT_ENTRY}
    done
    eval "${action[$REPLY]}"
}

function get_chapter () {
    for ((i=0, j=0; i<${#label[*]}; i++)); do
        if test -z "${action[$i]}"; then
            test -n "$DEFAULT_ENTRY" && test $DEFAULT_ENTRY -ge $j && chapter=${label[i]}
        else
            let j++
        fi
    done
    echo -e " [$chapter / ${label[${translation[$DEFAULT_ENTRY]}]}]"
}

function show_labels () {
    for ((i=0, j=0; i<${#label[*]}; i++)); do
        if test -z "${action[$i]}"; then
            prefix="\n : "
        else
            prefix="$j:-->"
            let j++
        fi
        echo -e "$prefix:${label[$i]}"
    done | column -ets ":"
}

function check_answer () {
    test -n "$REPLY" \
    && egrep -q '^[[:digit:]]+$' <<< $REPLY \
    && test $REPLY -ge 0 \
    && test $REPLY -lt ${#translation[*]} \
    && REPLY=${translation[$REPLY]}
}

# répertoire éléments du menu, priorité au menu perso
if test -d $HOME/.local/share/$(basename $0); then
    menuadm[share]=$HOME/.local/share/$(basename $0)
else
    menuadm[share]=/usr/local/share/$(basename $0)
fi

menuadm[keys]="${menuadm[share]}/keys"
menuadm[contents]="${menuadm[share]}/contents"
menuadm[api]=${menuadm[share]}/api

# récupération de la config
for conf in /etc/$(basename $0)/$(basename $0).conf $HOME/.config/$(basename $0)/$(basename $0).conf; do
    if test -r $conf; then
        eval $(awk -F'=' '!/^\s*(#|$)/ {
                    printf("menuadm[%s]=%s\n", 
                    gensub("^\\s*(\\w.*\\w)\\s*$","\\1","",$1), 
                    gensub("^\\s*(\\w.*\\w)\\s*$","\\1","",$2))
                }' $conf)
    fi
done

test -r ${menuadm[api]} && source ${menuadm[api]}

# si pas de menu à afficher, on quitte...
test -d ${menuadm[contents]} || exit 1

for menu in ${menuadm[contents]}/*; do
    if test -r $menu; then
        menuadm[menulist]+=$menu 
        menuadm[menulist]+=" "
    fi
done

if test -n "$DEBUG"; then
    show_menu_debug
else
    show_menu
fi