Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/bash
- #
- # get_wikibook.sh
- #
- # Programm zum Herunterladen von Wikibooks
- #
- # Copyright (C) 2007 FeG (feg@computer-dc.de)
- #
- # This program is free software; you can redistribute it and/or modify
- # it under the terms of the GNU General Public License as published by
- # the Free Software Foundation; either version 2 of the License, or
- # (at your option) any later version.
- #
- # This program is distributed in the hope that it will be useful, but
- # WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- # General Public License for more details.
- #
- # You should have received a copy of the GNU General Public License
- # along with this program; if not, write to the Free Software Foundation,
- # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110, USA
- # CHANGELOG
- #
- # Version 0.1
- # * Grundlegende Funktionen zum Herunterladen von Wikibooks mit den Trennzeichen : und /
- # * -v|--verbose gibt zusätzlich Folgendes aus:
- # * eine "Fortschrittsanzeige" bei den Online-Links
- # * beim Trennzeichen / die erstellten Verzeichnisse aus
- # * ersetzt Online-Links: Links auf andere Seiten auf wikibooks.org, CSS-Import-Links, src-Links und CSS-Links ("url=(...)"),
- # deaktivierbar mit -n|--no-online
- # Standard-Einstellungen
- # Ländercode der Wikibooks-Seite -> http://XX.wikibooks.org
- #
- # Sollte zurzeit nicht geändert werden, solange nicht sichergestellt ist, dass die
- # andere Wikibooks-Seite die gleichen Trennzeichen verwendet wie die deutsche
- WIKILANG=de
- # --- Don't change anything below here unless you know what you're doing ---
- # --- Ändere nichts unterhalb dieser Zeile außer du weißt was du tust ---
- # Programmversion
- version=0.1
- # Programmname
- progname=$(basename $0)
- # Fehlercodes
- E_Aufruf=1
- E_ZielverzErstellen=2
- E_BuchverzExistiert=3
- E_Buchindex=4
- E_Seperator=5
- E_VerzErstellen=6
- # Wird ausgegeben, wenn mit --help aufgerufen
- print_help()
- {
- cat <<EOF
- Aufruf: $progname [Optionen] Buch [Zielverzeichnis]
- Lädt das angegebene Wikibook herunter.
- Optionen:
- --help zeigt diese Hilfe an
- --version zeigt die Programmversion an
- -n
- --no-online schaltet die Ersetzung von Online-Links (Links auf andere Wikibooks-Seiten) ab
- -s S
- --seperator S gibt das Trennzeichen (":" oder "/") des Wikibooks an
- -v, --verbose erzeugt viel Ausgabe
- Fehlerberichte an <feg@computer-dc.de>.
- EOF
- }
- # Wird ausgegeben, wenn mit --version aufgerufen
- print_version()
- {
- cat <<EOF
- $progname $version
- Copyright (C) 2007 FeG (feg@computer-dc.de)
- This is free software. You may redistribute copies of it under the terms of
- the GNU General Public License <http://www.gnu.org/licenses/gpl.html>.
- There is NO WARRANTY, to the extent permitted by law.
- EOF
- }
- # Kurze und lange Parameter für den Aufruf von getopt
- SHORTOPTS="s:v"
- LONGOPTS="help,version,seperator:,verbose"
- # getopt -T liefert bei neuen Versionen 4 als Fehlercode. Nur neue Versionen können
- # mit langen Parametern umgehen
- if $(getopt -T &> /dev/null) ; [ $? = 4 ] ; then
- # neue getopt-Version, verwende lange Parameter
- OPTS=$(getopt -o $SHORTOPTS --long $LONGOPTS -n "$progname" -- "$@")
- else
- # alte getopt-Version, verwende kurze Parameter
- # --help und --version manuell verwerten
- case $1 in --help) print_help ; exit 0 ;; esac
- case $1 in --version) print_version ; exit 0 ;; esac
- OPTS=$(getopt $SHORTOPTS "$@")
- fi
- # Fehler bei getopt
- if [ $? -ne 0 ]; then
- echo "'$progname --help' für mehr Informationen" 1>&2
- exit $E_Aufruf
- fi
- # Schreibe getopt-Ergebnisse in $@
- eval set -- "$OPTS"
- # Standardwerte
- SEPERATOR="?"
- VERBOSE=0
- NO_ONLINE=0
- # getopt-Ergebnisse auswerten
- while [ $# -gt 0 ]; do
- case $1 in
- --help)
- print_help
- exit 0
- ;;
- --version)
- print_version
- exit 0
- ;;
- -n|--no-online)
- NO_ONLINE=1
- shift
- ;;
- -s|--seperator)
- if [ "$2" == "/" ] || [ "$2" == ":" ]; then
- SEPERATOR=$2
- else
- SEPERATOR="?"
- fi
- shift 2
- ;;
- -v|--verbose)
- VERBOSE=1
- shift
- ;;
- --)
- shift
- break
- ;;
- *)
- echo "Fehler: Ungültiger Parameter $1" 1>&2
- exit $E_Aufruf
- ;;
- esac
- done
- # Buch angegeben?
- if [ $# -lt 1 ]; then
- echo "Aufruf: $progname [Optionen] Buch [Zielverzeichnis]"
- exit $E_Aufruf
- fi
- # Zielverzeichnis
- if [ -n "$2" ]; then
- ZIELVERZ=$2
- mkdir -p $ZIELVERZ
- if [ "$?" != "0" ]; then
- echo "Zielverzeichnis \"$ZIELVERZ\" kann nicht erstellt werden. Abbruch."
- exit $E_ZielverzErstellen
- fi
- else
- ZIELVERZ=`pwd`
- fi
- # zu ladendes Buch
- BUCH=$1
- if [ -e "$ZIELVERZ/$BUCH" ]; then
- echo "Buchverzeichnis \"$ZIELVERZ/$BUCH\" existiert bereits. Abbruch."
- exit $E_BuchverzExistiert
- fi
- # cleanup - Löscht das Buchverzeichnis, wenn ein Fehler auftritt, der zum Programmupdate führt
- cleanup()
- {
- echo -n "Räume auf.. "
- cd "$ZIELVERZ"
- rm -rf "$BUCH"
- if [ $? -eq 0 ]; then
- echo "ok"
- else
- echo "fehlgeschlagen. Buchverzeichnis konnte nicht gelöscht werden."
- fi
- }
- mkdir -p "$ZIELVERZ/$BUCH"
- cd "$ZIELVERZ/$BUCH"
- echo "Beginne mit dem Herunterladen des Wikibooks \"$BUCH\" in den Ordner \"$ZIELVERZ\".."
- echo
- # Index laden:
- echo -n "Lade Buchindex.. "
- wget -nv -O index.html "http://$WIKILANG.wikibooks.org/w/index.php?title=Spezial%3APrefixindex&namespace=0&from=$BUCH" &> /dev/null
- if [ "$?" == "0" ]; then
- echo "ok"
- else
- echo "fehlgeschlagen"
- cleanup
- exit $E_Buchindex
- fi
- # Wenn kein Trennzeichen angegeben wurde..
- if [ "$SEPERATOR" == "?" ]; then
- # ..versuche, das Trennzeichen zu raten
- echo -n "Kein Trennzeichen angegeben. Rate Trennzeichen... "
- # Gibt es Links mit BUCH/ ?
- egrep "href=\"[^\"]*$BUCH/" index.html &> /dev/null
- has_slash=$?
- # Gibt es Links mit BUCH: ?
- egrep "href=\"[^\"]*$BUCH:" index.html &> /dev/null
- has_colon=$?
- if [ $has_slash -eq 0 ] && [ $has_colon -eq 1 ]; then
- SEPERATOR=/
- elif [ $has_slash -eq 1 ] && [ $has_colon -eq 0 ]; then
- SEPERATOR=:
- else
- echo
- echo "Fehler: Konnte nicht ermitteln, ob das Buch das Trennzeichen ":" oder "/" verwendet"
- echo "Bitte geben Sie das Trennzeichen an:"
- echo " $progname -s : BUCH wenn das Buch das Trennzeichen : verwendet"
- echo " $progname -s / BUCH wenn das Buch das Trennzeichen / verwendet"
- echo
- cleanup
- exit $E_Seperator
- fi
- echo $SEPERATOR
- fi
- if [ "$SEPERATOR" == "/" ]; then
- # --- --- --- --- --- --- --- --- ---
- # --- --- --- SEPERATOR / --- --- ---
- # --- --- --- --- --- --- --- --- ---
- # Verzeichnisse erstellen:
- echo -n "Erstelle Verzeichnisse.. "
- touch subdirs.txt
- # "sed 'y/+/ /; s/%/\\\x/g'" übersetzt codierte URLs
- for i in `cat index.html | tr '"' '\n' | sed 'y/+/ /; s/%/\\\x/g'`; do
- j=`echo -e $i | awk "/^\/wiki\/$BUCH\/.*\// { verz=substr(\\$0,8+${#BUCH}); split(verz,a,/\\/[^\\/]+$/); print a[1] }"`
- if [ -n "$j" ]; then
- egrep ^$j$ subdirs.txt &> /dev/null
- # Nur eintragen, wenn noch nicht in der Liste
- if [ "$?" == "1" ]; then
- echo -e $j >> subdirs.txt
- fi
- fi
- done
- mkdir -p `cat subdirs.txt`
- if [ "$?" == "0" ]; then
- echo "ok"
- else
- echo "fehlgeschlagen"
- exit $E_VerzErstellen
- fi
- if [ $VERBOSE -eq 1 ]; then
- echo "Erstellte Verzeichnisse:"
- cat subdirs.txt
- echo
- fi
- # Dateien laden:
- echo "Lade Dateien:"
- echo "-------------"
- err_count=0
- # Finde alle Einträge die mit "/wiki/$BUCH" beginnen
- for x in `cat index.html | tr '"' '\n' | egrep "^/wiki/$BUCH"`; do
- # "/wiki/$BUCH/" abschneiden
- datei=${x:7+${#BUCH}}
- # codierte URL übersetzen
- datei=`echo -e "$(echo $datei | sed 'y/+/ /; s/%/\\\x/g')"`
- # Ist $datei ein Verzeichnis?
- egrep ^$datei$ subdirs.txt &> /dev/null
- if [ "$?" == "0" ]; then
- # -> Ja: Lade die Verzeichnisseite in das Verzeichnis, ohne führenden _
- # z.B.: $x = _Band1 -> Speichern nach _Band1/Band1
- a=`echo $datei | sed 's#.*/##'`
- target=`echo $datei/${a:1}`
- # Wenn abgeschnittener Rest leer ist, ist $x die Haupt-Buchseite
- elif [ -z "$datei" ]; then
- target="$BUCH"
- else target=$datei
- fi
- # Laden..
- wget -nv -O $target http://$WIKILANG.wikibooks.org$x
- if [ $? -ne 0 ]; then ((err_count++)); fi
- done
- echo "-------------"
- if [ $err_count -ne 0 ]; then
- echo "$err_count Dateien konnten nicht heruntergeladen werden."
- echo
- fi
- # Links ersetzen:
- echo -n "Ersetze Links.. "
- for i in $(find -type f); do
- # Links auf lokales Verzeichnis umbiegen
- sed "s#href=\"/wiki/$BUCH#href=\"$ZIELVERZ/$BUCH#g" $i > $i.temp
- mv $i.temp $i
- done
- echo "abgeschlossen"
- # Verzeichnis-Links ersetzen:
- # ( Nötig bei Büchern mit / - Navigation, da ein lokales Verzeichnis nicht gleichzeitig eine Seite sein kann.
- # hier werden Verzeichnisseiten im Verzeichnis selbst und ohne führenden _ abgelegt )
- echo -n "Ersetze Verzeichnis-Links.. "
- for i in $(find -type f); do
- cp $i $i.temp
- for x in `grep -o 'href="[^"]*"' $i | sed 'y/+/ /; s/%/\\\x/g'`; do
- # $x ist 'href="..."', codierte URLs übersetzt
- # 'href="' und abschließendes " abschneiden:
- y=`echo ${x:6}`
- y=${y%\"}
- # link enthält nun den eigentlichen Link:
- link=`echo -e $y`
- # Zeigt $link auf ein Verzeichnis?
- if [ -d "$link" ]; then
- # Übergeordnete Verzeichnisse und führenden _ abschneiden
- replace=`echo $link | sed 's#.*/##'`
- replace=${replace#_}
- # $link in der Datei mit $link/$replace ersetzen (aus _Band1 wird _Band1/Band1, wie beim Herunterladen)
- sed "s#href=\"$link\"#href=\"$link/$replace\"#g" $i.temp > $i.temp2
- mv $i.temp2 $i.temp
- fi
- done
- mv $i.temp $i
- done
- echo "abgeschlossen"
- else
- # --- --- --- --- --- --- --- --- ---
- # --- --- --- SEPERATOR : --- --- ---
- # --- --- --- --- --- --- --- --- ---
- # Dateien herunterladen
- echo "Lade Dateien:"
- echo "-------------"
- err_count=0
- # Finde alle Einträge die mit "/wiki/$BUCH" beginnen
- for x in `cat index.html | tr '"' '\n' | egrep "^/wiki/$BUCH"`; do
- # "/wiki/" abschneiden
- datei=${x:6}
- # codierte URL übersetzen
- datei=`echo -e "$(echo $datei | sed 'y/+/ /; s/%/\\\x/g')"`
- # Laden..
- wget -nv -O $datei http://$WIKILANG.wikibooks.org$x
- if [ $? -ne 0 ]; then ((err_count++)); fi
- done
- echo "-------------"
- if [ $err_count -ne 0 ]; then
- echo "$err_count Dateien konnten nicht heruntergeladen werden."
- echo
- fi
- # Links ersetzen
- echo -n "Ersetze Links.. "
- for i in $(ls); do
- sed "s#href=\"/wiki/$BUCH#href=\"./$BUCH#g" $i > $i.temp
- mv $i.temp $i
- done
- echo "abgeschlossen"
- fi
- # Online-Links ersetzen
- if [ $NO_ONLINE -eq 0 ]; then
- echo -n "Ersetze Online-Links (kann länger dauern).. "
- # normale Online-Links (href="...">)
- for i in $(find -type f); do
- cp $i $i.temp
- for x in `grep -o 'href="[^"]*"' $i`; do
- # URL decodieren
- y=`echo $x | sed 'y/+/ /; s/%/\\\x/g'`
- # href=" und abschließendes " abschneiden
- y=`echo ${y:6}`
- y=${y%\"}
- link=`echo -e $y`
- if [ ! -d "$link" ] && [ ! -f "$link" ]; then
- if [ "${link:0:1}" == "/" ]; then
- # & ist ein spezielles Zeichen für sed, muss escaped werden
- link=`echo $link | sed 's/&/\\\&/g'`
- sed "s@$x@href=\"http://$WIKILANG.wikibooks.org$link\"@g" $i.temp > $i.temp2
- mv $i.temp2 $i.temp
- fi
- fi
- done
- mv $i.temp $i
- done
- if [ $VERBOSE -eq 1 ]; then echo -n "href "; fi
- # CSS-Imports (@IMPORT "...")
- for i in $(find -type f); do
- cp $i $i.temp
- for x in `grep -io '@IMPORT "[^"]*"' $i`; do
- # x enhält wegen dem Leerzeichen im grep-String abwechseln @import und "(url)"
- if [ "${x:0:1}" == "\"" ]; then
- # x beginnt mit " -> URL
- # URL decodieren
- y=`echo $x | sed 'y/+/ /; s/%/\\\x/g'`
- # führendes " und abschließendes " abschneiden
- y=${y#\"}
- y=${y%\"}
- link=`echo -e $y`
- if [ "${link:0:1}" == "/" ]; then
- # & ist ein spezielles Zeichen für sed, muss escaped werden
- link=`echo $link | sed 's/&/\\\&/g'`
- sed "s@$x@\"http://$WIKILANG.wikibooks.org$link\"@g" $i.temp > $i.temp2
- mv $i.temp2 $i.temp
- fi
- fi
- done
- mv $i.temp $i
- done
- if [ $VERBOSE -eq 1 ]; then echo -n "@import "; fi
- # JavaScript-Links (src="...">)
- for i in $(find -type f); do
- cp $i $i.temp
- for x in `grep -o 'src="[^"]*"' $i`; do
- # URL decodieren
- y=`echo $x | sed 'y/+/ /; s/%/\\\x/g'`
- # src=" und abschließendes " abschneiden
- y=`echo ${y:5}`
- y=${y%\"}
- link=`echo -e $y`
- if [ "${link:0:1}" == "/" ]; then
- # & ist ein spezielles Zeichen für sed, muss escaped werden
- link=`echo $link | sed 's/&/\\\&/g'`
- sed "s@$x@src=\"http://$WIKILANG.wikibooks.org$link\"@g" $i.temp > $i.temp2
- mv $i.temp2 $i.temp
- fi
- done
- mv $i.temp $i
- done
- if [ $VERBOSE -eq 1 ]; then echo -n "src "; fi
- # CSS-Links (url("...")>)
- for i in $(find -type f); do
- cp $i $i.temp
- for x in `grep -o 'url([^\)]*)' $i`; do
- # URL decodieren
- y=`echo $x | sed 'y/+/ /; s/%/\\\x/g'`
- # url( und abschließendes ) abschneiden
- y=`echo ${y:4}`
- y=${y%)}
- link=`echo -e $y`
- if [ "${link:0:1}" == "/" ]; then
- # & ist ein spezielles Zeichen für sed, muss escaped werden
- link=`echo $link | sed 's/&/\\\&/g'`
- sed "s@$x@url(http://$WIKILANG.wikibooks.org$link)@g" $i.temp > $i.temp2
- mv $i.temp2 $i.temp
- fi
- done
- mv $i.temp $i
- done
- if [ $VERBOSE -eq 1 ]; then echo -n "url "; fi
- echo "abgeschlossen"
- fi
- # Aufräumen
- if [ -e index.html ]; then rm -f index.html; fi
- if [ -e subdirs.txt ]; then rm -f subdirs.txt; fi
- echo
- echo "Das Wikibook \"$BUCH\" wurde heruntergeladen."
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement