#!/bin/sh set -u KATEG_FILES="`dirname $0`/kategorien-norm.lst `dirname $0`/kategorien-debian.lst `dirname $0`/kategorien-verwandte.lst" #READ_DESKTOP_DIR="/var/lib/menu-xdg/applications/menu-xdg" READ_DESKTOP_DIR="/usr/share/applications" WRITE_DESKTOP_DIR="`dirname $0`/desktop-files" #DATA_FILE="`dirname $0`/database.dat" DATA_FILE="/tmp/database.dat" EINTRAEGE_PRO_SEITE=10 exec -- 2>/tmp/output #set -x ############# Menue-Verwaltung ################ filter_empty() { sed -r '/^[[:space:]]*$/d ; s/^[[:space:]]*// ; s/[[:space:]]*$//' } hole_app_liste() { find "$READ_DESKTOP_DIR" -type f -name \*.desktop | while read a do basename "${a%.desktop}" done | filter_empty | sort | nl } # zuerst in der Datenbank nachsehen - ansonsten aus dem desktop-Verzeichnis holen # Parameter: app-name lade_app_kategs() { DDATEI=`find $READ_DESKTOP_DIR -type f -name $1.desktop` if [ -e "$DATA_FILE" ] && grep -q "^$1=" "$DATA_FILE" then grep "^$1=" "$DATA_FILE" | cut -d "=" -f 2 | tr " " "\n" else [ -e "$DDATEI" ] && grep "^Categories=" "$DDATEI" | cut -d "=" -f 2 | tr ";" "\n" fi | filter_empty | sort | uniq } hole_kateg_liste() { cat $KATEG_FILES | cut -f 1 | filter_empty | sort | uniq } # liefert eine Liste von Kategorien zurueck, die entweder auf die angegebene verweisen oder # solche, auf die sie selbst verweist # nicht-standard-konforme Kategorien (X-???-???) werden herausgefiltert # Parameter: die zu bearbeitende Kategorie hole_verwandte_kategs() { ( [ -z "$1" ] && return # erstmal die verweisenden: cat $KATEG_FILES | sed 's/$/\t/' | grep "[[:space:]]$1[[:space:]]" | cut -f 1 # dann die, auf die verwiesen wird: cat $KATEG_FILES | grep "^$1[[:space:]]" | cut -f 2-30 | tr "\t" "\n" | tr " " "\n" ) | grep -v "^X-" | filter_empty | sort | uniq } # liefert alle Kategorien zurueck, die mit den bisherigen Kategorien der Anwendung verwandt sind, # ihr jedoch noch nicht zugeordnet wurden hole_verwandte_kategs_der_app() { #local FILTER=`lade_app_kategs "$1" | sed 's#^#/# ; s#$#/d;#' | tr "\n" " "` local FILTER=`lade_app_kategs "$1" | sed 's#^.*$#/&/d; #' | tr "\n" " "` lade_app_kategs "$1" | while read a; do hole_verwandte_kategs "$a"; done | sed "$FILTER" | filter_empty | sort | uniq } hole_anzahl_apps() { echo "$ALLE_APPS" | wc -l } # entfernt alle Apps, die nicht in der angegebenen Kategorie sind # Parameter: - die Kategorie # - die Anwendungen filter_apps_nach_kateg() { local KATEG="$1" shift echo -e "$ALLE_APPS" | while read num name do lade_app_kategs "$name" | grep -q "$KATEG" && echo -e "$num\t$name" done } speichere_formdaten() { local POST_DATA=`cat - | tr "&" "\n"` local EINTRAEGE=`echo "$POST_DATA" | grep "^text_kategs_" | cut -d = -f 1 | sed 's/^text_kategs_//'` local NEUE_KATEGS local APP_NAME for a in $EINTRAEGE do NEUE_KATEGS=`echo "$POST_DATA" | grep "^text_kategs_$a=" | cut -d '=' -f 2 | tr '+' ' ' | tr ' ' '\n'` NEUE_KATEGS="$NEUE_KATEGS\n`echo -e \"$POST_DATA\" | grep "^liste_kateg[123]_$a=" | cut -d '=' -f 2`" NEUE_KATEGS=`echo -e "$NEUE_KATEGS" | sort | uniq | tr '\n' ' '` APP_NAME=`app_num2name $a` NEUE_ZEILE=`echo -e "$APP_NAME=$NEUE_KATEGS" | sed -r 's/[[:space:]]+/ /g; s/=[[:space:]]/=/'` [ ! -e "$DATA_FILE" ] && touch "$DATA_FILE" sed -i "s/^$APP_NAME=.*/$NEUE_ZEILE/" "$DATA_FILE" grep -q "^$APP_NAME=" "$DATA_FILE" || echo -e "$NEUE_ZEILE" >> "$DATA_FILE" done } app_num2name() { echo "$ALLE_APPS" | grep "^[[:space:]]*$1[[:space:]]" | cut -f 2 } app_name2num() { echo "$ALLE_APPS" | grep "[[:space:]]$1$" | cut -f 1 } ################# debug & test ################# debug_zeige_alle_apps() { for a in `hole_app_liste` do echo -en "$a\t-\t" lade_app_kategs "$a" | tr "\n" " " echo done } ############## html-encoding ################ html_header() { echo "Content-type: text/html" echo echo "" echo "" echo " Debian-Menue-Designer" echo ' ' echo "" echo "" } html_footer() { echo "" echo "" } html_nav() { echo '
' echo "" echo ' ' echo ' ' echo ' ' echo ' ' echo '
Kategorie:
Einträge je Seite:
' echo '
Beginne bei Eintrag:
' echo '
' echo '
' } # zwei Paramater: # (1) _all_ ODER Name der Anwendung, zu der nur die noch nicht verwendeten Verwandten eingetragen werden sollen # (2) der Name der HTML-Auswahlliste (entspricht dem spaeteren Variablennamen des Inhalts) html_kateg_liste() { echo "" echo } # Parameter: app-nummer html_apps_config() { local APP_NAME=`app_num2name $1` echo " " echo " $APP_NAME" echo " " echo " `html_kateg_liste $APP_NAME liste_kateg1_$1`" echo " `html_kateg_liste $APP_NAME liste_kateg2_$1`" echo " `html_kateg_liste _all_ liste_kateg3_$1`" echo " " } # als Parameter ist die Nummer der ersten Anwendung der Liste erforderlich html_edit_liste() { echo -n '
" echo "" echo " " echo " " echo " " echo " " echo " " echo " " echo " " local uebrig=$EINTRAEGE_PRO_SEITE echo -e "$ALLE_APPS\n" | sed -n "$((APP_START_NR)),$((APP_START_NR+EINTRAEGE_PRO_SEITE-1))p" | while read num name do [ -n "$num" ] && html_apps_config $num uebrig=$((uebrig-1)) done echo "
Programmbisherige Kategorienverwandte Kategorie Iverwandte Kategorie IIweitere Kategorie
" echo '
' echo "
" if [ $APP_START_NR -gt 1 -o $((APP_START_NR+EINTRAEGE_PRO_SEITE-1)) -lt `hole_anzahl_apps` ] then echo '


' if [ $APP_START_NR -gt 1 ] then local PREV_START_NR=$((APP_START_NR-EINTRAEGE_PRO_SEITE)) [ "$PREV_START_NR" -lt 1 ] && PREV_START_NR=1 echo "vorherige Seite" fi if [ $((APP_START_NR+EINTRAEGE_PRO_SEITE-1)) -lt `hole_anzahl_apps` ] then local NEXT_START_NR=$((APP_START_NR+EINTRAEGE_PRO_SEITE)) echo "nächste Seite" fi echo "

" fi } ############# cgi-Zeug ############# # liest einen cgi-Parameter ein und liefert notfalls einen angegebenen Default-Wert zurueck # Parameter: der Name des Parameters und der default-Wert hole_parameter() { local ERG=$2 if set | grep -q "^QUERY_STRING" then ERG=`echo "$QUERY_STRING" | tr "&" "\n" | grep "^$1" | cut -d "=" -f 2` else ERG="$2" fi [ -z "$ERG" ] && ERG="$2" echo -e "$ERG" } ############# los geht es! ############ ALLE_KATEGS=`hole_kateg_liste` ALLE_APPS=`hole_app_liste` KATEG_FILTER=`hole_parameter kateg_filter ""` [ -n "$KATEG_FILTER" ] && ALLE_APPS=`filter_apps_nach_kateg "$KATEG_FILTER"` APP_START_NR=`hole_parameter app_start_nr 1` EINTRAEGE_PRO_SEITE=`hole_parameter eintraege_pro_seite $EINTRAEGE_PRO_SEITE` html_header html_nav ACTION=`hole_parameter action formular` case "$ACTION" in speichern|formular) [ "$ACTION" = "speichern" ] && speichere_formdaten html_edit_liste ;; *) echo '

Fehlerhafte Aktion (' echo "$ACTION" echo ') angefordert!

' ;; esac html_footer