#!/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 "