#!/bin/sh
# funkce pro uklizeni(pousti se pri zabiti)
uklid() {
echo uklizim...
rm /tmp/filelist.*.$$ 2> /dev/null
rm /tmp/xml.edscript.$$ 2> /dev/null
rm /tmp/xmlfile.*$$ 2> /dev/null
exit 1
}
# funkce, ktera vypise napovedu
help() {
echo Napoveda:
echo "xmlpopis [volby] cesta"
echo " cesta urcuje koren stromu, jenz se ma prohledavat"
echo
echo "Volby:"
echo " --store cesta - rika, kam se ma vysledek ukladat, standartne ./"
echo " --style cesta - urcuje cestu k pouzivanemu css stylu, standartne prazdny"
echo " --nodescent - zakaze zmenu cesty ke stylu"
echo " --root soubor - jmeno korenoveho souboru"
echo " -e prikaz - rika, ktery program se ma spustit pro ziskani informaci ze souboru"
echo " --with-care - zakaze mazani jiz nepotrebnych souboru, standartne vypnuto"
echo " --recoff - vypne rekurzivni volani"
echo " --string string - nastavi popis nezarazenych souboru"
echo " --verbose - nastavi popis nezarazenych souboru"
echo " --help nebo -? - vypise napovedu"
exit 0
}
# dojde-li k chybe, vola se tato funkce
chyba() {
echo Doslo k zavazne chybe, kocim!
uklid
}
# fumkce pro vlozeni souboru, $1 je jmeno souboru, s vysledkem se pocita na stdoutu
addfile() {
[ "$verbose" ] && echo including file "$1" >&2
repared="`echo "$1" | sed "s:&:&:g"`"
echo " - "
if [ "$spath" = "./" ]; then
echo " "
else
echo " "
fi
[ "$definfo" ] && echo " $definfo"
echo " file"
if [ "$prgname" ]; then
prgout="`$prgname "$1"`"
[ "$prgout" ] && echo " $prgout"
fi
echo "
"
echo
}
# funkce pro vlozeni adreasre, $1 je jmeno adresare, s vysledkem se pocita na stdoutu
adddir() {
[ "$verbose" ] && echo including directory "$1" >&2
repared="`echo "$1" | sed "s:&:&:g"`"
echo " - "
echo " "
[ "$definfo" ] && echo " $definfo"
echo " directory"
echo "
"
echo
# rekurze
if [ "$recursive" ]; then
[ "$verbose" ] && echo entering directory "$1" >&2
# ukladam-li jinam a je-li treba vytvorit adresar
[ ! -d "$spath/$1" ] && mkdir "$spath/$1"
cd "$epath" || chyba
# neni-li cesta ke stylu absolutni, musim ji opravit
newstyle="$style"
[ "`echo "$style" | sed "s:\(.\).*:\1:"`" != "/" ] && [ ! "$nodescent" ] && newstyle="../$style"
# volam sam sebe
$estr --store "$spath/$1" -e "$prgname" --style "$newstyle" $delete $verbose "$apath/$1" || chyba
cd "$apath" || chyba
fi
}
# funkce pro vlozeni neceho, o cem nevim, co to je
addneco() {
if [ "$1" != "$xmlfile" ] && [ "$1" ]; then
if [ -f "$1" ]; then
addfile "$1"
elif [ -d "$1" ]; then
adddir "$1"
fi
fi
}
# funkce pro zalozeni noveho souboru, zapise do stdoutu
zacatek() {
echo ""
echo ""
echo
filetitle="`echo "$xmlfile" | sed "s:.*/\(.*\)\.xml:\1:"`"
echo ""
echo ""
echo
}
# funkce pro dokonceni noveho souboru
konec() {
date="`date`"
echo "$date"
echo ""
}
# funkce ktera vrati prvni vec ze seznamu
getfirst() {
first=""
if [ `cat /tmp/filelist.$inputstate.$$ | wc -l` != "0" ]; then
first="`ed -s /tmp/filelist.$inputstate.$$ < /tmp/xml.edscript.$$`"
else
if [ "$inputstate" = "directory" ]; then
# dosli adresare, je nacase brat soubory
inputstate="file"
changestate="true"
[ `cat /tmp/filelist.$inputstate.$$ | wc -l` != "0" ] && first="`ed -s /tmp/filelist.$inputstate.$$ < /tmp/xml.edscript.$$`"
fi
fi
}
# inicializace promenych
spath="./"
epath="`pwd`"
estr="$0"
recursive="yes"
# kdyby me chtel nekdo nahodou killnout
trap uklid 2 3
while [ "$2" ]; do
# ukladani xml-souboru jinam
if [ "$1" = "--store" ]; then
spath="$2"
shift 2
fi
# spousteni programu pro generovani daslich informaci
if [ "$1" = "-e" ]; then
prgname="$2"
shift 2
fi
# kde se ma hledat xmlstyl
if [ "$1" = "--style" ]; then
style="$2"
shift 2
fi
# kde se ma hledat xmlstyl
if [ "$1" = "--string" ]; then
definfo="$2"
shift 2
fi
# kde se ma hledat xmlstyl
if [ "$1" = "--root" ]; then
rootfile="$2"
shift 2
fi
# nemazou se polozky
if [ "$1" = "--with-care" ]; then
delete="--with-care"
shift
fi
# vypne rekurzy
if [ "$1" = "--recoff" ]; then
recursive=""
shift
fi
# vypne rekurzy
if [ "$1" = "--nodescent" ]; then
descent="--nodescent"
shift
fi
if [ "$1" = "--verbose" ]; then
verbose="--verbose"
shift
fi
# vypise se napoveda
if [ "$1" = "--help" ] || [ "$1" = "-?" ]; then
help
fi
done
if [ "$1" = "--help" ] || [ "$1" = "-?" ] || [ ! "$1" ]; then
help
fi
cd "$spath" || chyba
spath=`pwd`
apath="$1"
cd "$epath" || chyba
cd "$apath" || chyba
apath="`pwd`"
xmlfile="`pwd`.xml"
[ "$rootfile" ] && xmlfile="`pwd`/$rootfile"
xmlfile="$spath/`echo "$xmlfile" | sed "s:.*/::"`"
inputstate="directory"
# inicializace pomocnych souboru
echo 1 p > /tmp/xml.edscript.$$
echo 1 d >> /tmp/xml.edscript.$$
echo w >> /tmp/xml.edscript.$$
echo q >> /tmp/xml.edscript.$$
echo "s:^: :" > /tmp/xml.sedscript.$$
echo "/- / s:
- :
- :" >> /tmp/xml.sedscript.$$
# samotny program
# zapisu si seznam souboru
ls -A1p | sed -n "s:/$::p" | sort > /tmp/filelist.directory.$$
ls -A1p | grep -v "/" | sort > /tmp/filelist.file.$$
# zalozim si novy xml, kam budu ukladat vysledky
zacatek > /tmp/xmlfile.$$
# prectu si prvni polozku
getfirst
# ezistuje-li jiz soubor s popisem, pokusim se nacist polozky z nej
if [ -f "$xmlfile" ]; then
while read tmp; do
# jsem-li uz mezi polozkami
if [ "$activ" ]; then
# jsem uvnitr polozky a kopiruji jeji obsah
if [ "$copy" ] && [ "$tmp" != "
" ]; then
echo "$tmp" >> /tmp/xmlfile.copy.$$
# obsah zkopirovan, kontroluji, jestli v te polozce nebyl nazev souboru, ten by se mi moh hodit
tmp2="`echo "$tmp" | sed -n "s:.*]*>\(.*\).*:\1:p"`"
[ "$tmp2" ] && filename="$tmp2"
# kontroluji, jestli v te polozce nebyl typ, ten by se mi moh hodit
tmp2="`echo "$tmp" | sed -n "s:.*\(.*\).*:\1:p"`"
[ "$tmp2" ] && filetype="$tmp2"
fi
# zacina nova polozka
if [ "$tmp" = "- " ]; then
# nastavim kopirovaci mod
copy="yes"
# smazu starej buffer
rm /tmp/xmlfile.copy.$$ 2> /dev/null
# dozapisu do novyho
echo "
- " > /tmp/xmlfile.copy.$$
fi
# skoncila polozka, je cas to vsechno zapsat
if [ "$tmp" = "
" ]; then
# skoncil-li jsem se vsemi adresari z puvodniho XML a zbyli-li mi jeste nejake nove adresare v souborech, dovyberu je
if [ "$filetype" = "file" ] && [ "$inputstate" = "directory" ]; then
while [ "$changestate" ]; do
addneco "$first" >> /tmp/xmlfile.$$
getfirst
done
fi
# zkusim, nepribylo-li neco, co by melo prijit pred kopirovanou vec
while [ "$first" \< "$filename" ] && [ "$filetype" = "$inputstate" ] && [ "$first" ]; do
addneco "$first" >> /tmp/xmlfile.$$
getfirst
done
copy=""
# mam-li soubor v seznamu kandidatu na nove prichoziho, musim ho vyhodit
[ "$first" = "$filename" ] && getfirst
# existuje -li soubor, jehoz popis jsem kopiroval, je nacase zapsat ho do vysledneho xml
if [ -e "$filename" ]; then
cat /tmp/xmlfile.copy.$$ | sed -f /tmp/xml.sedscript.$$ >> /tmp/xmlfile.$$
echo " " >> /tmp/xmlfile.$$
echo >> /tmp/xmlfile.$$
else
if [ ! "$delete" ]; then
# pokud nexistuje, je to adresar a je to povoleno, je treba odstranit zbytky po nem (pokud je to soubor, tak ho jen nepridam)
[ "$filetype" = "directory" ] && rm -fr "$spath/$filename"
else
# pokud je odstranovani zakazano, prida se tag odstraneno
cat /tmp/xmlfile.copy.$$ | sed -f /tmp/xml.sedscript.$$ > /tmp/xmlfile.new.$$
echo " yes" >> /tmp/xmlfile.new.$$
echo " " >> /tmp/xmlfile.new.$$
echo >> /tmp/xmlfile.new.$$
cat /tmp/xmlfile.new.$$ | uniq >> /tmp/xmlfile.$$
fi
fi
fi
# dosli-li polozky, je nacase ukoncit kopirovani a vypnout hledani
if [ "$tmp" = "" ]; then
activ=""
copy=""
fi
# pokud jsem jeste nezacal prohledavat polozky, mel bych zjistit, jestli bych s tim nemel zacit
else
[ "$tmp" = "" ] && activ="yes"
fi
done < "$xmlfile"
fi
# pokud mi zbyli jeste nejaky nezarazeny soubory, zaradim je ted
while [ "$first" ]; do
addneco "$first" >> /tmp/xmlfile.$$
getfirst
done
# zapisu konec a umistim vysledny soubor
konec >> /tmp/xmlfile.$$
[ -f "$xmlfile" ] && rm -f "$xmlfile" 2> /dev/null
mv /tmp/xmlfile.$$ "$xmlfile" || chyba
# uklidim zbytek
rm /tmp/filelist.*.$$ 2> /dev/null
rm /tmp/xml.*script.$$ 2> /dev/null
rm /tmp/xmlfile.*$$ 2> /dev/null
echo soubor \""$xmlfile"\" vytvoren >&2