In diesem Blogeintrag beschreibe ich, wie man Gesetze von Gesetze-im-Internet.de so aufbereitet, dass sie sich noch komfortabler auf dem iPad nutzen lassen. Das Skript sollte unter MacOS und Linux problemlos funktionieren.
Mit Schrecken erinnere ich mich an mein Studium und mein Referendariat, als man regelmäßig „den Schönfelder“ und „den Sartorius“ nachheften musste, wenn man stets den aktuellen Gesetzesstand nutzen wollte. Dank Gesetze-im-Internet.de ist heute das Bundesrecht auch online und in verschiedenen Formaten zum Herunterladen verfügbar. Viele Jahre habe ich ausschließlich mit Gesetzen im PDF-Format gearbeitet. Allerdings ist die Nutzung der PDF-Dateien auf dem iPad (oder gar dem iPhone) nicht besonders komfortabel, weil sich die Schriftgröße nicht sinnvoll anpassen lässt. Seit einiger Zeite sind über Gesetze-im-Internet.de aber auch EPUB-Dateien verfügbar. Diese lassen sich über die iBooks-App ganz hervorragend auf dem iPad und dem iPhone nutzen.
Gestört haben mich allerdings zwei Kleinigkeiten:
1. Ich benötige für die Arbeit eine ganze Reihe von Gesetzen. Um diese aktuell zu halten, müsste ich also regelmäßig die Seite Gesetze-im-Internet.de aufrufen, die einzelnen Gesetze anwählen und die EPUB-Dateien herunterladen. Zudem sind die EPUB-Dateien eher kryptisch benannt (etwa BJNR217900011.epub für das ProdSG).
2. Eigentlich ist es nur eine Kleinigkeit, die mich aber sehr gestört hat: In der iBooks-App wird statt der Gesetzesabkürzung der Gesetzestitel angezeigt. Ich finde das bei der kleinen Schrift eher unübersichtlich.
Beide Probleme lassen sich mit einem kleinen Skript lösen, welches mehrere Gesetze auf einen Schlag herunterlädt, mit einem sinnvollen Dateinamen versieht und den EPUB-Titel anpassen kann. Das Skript besteht aus zwei Teilen: Einer Text-Datei mit den Gesetzen und dem eigentlichen Skript.
Die Datei mit den Gesetzestexten hat folgenden Aufbau:
ABK#EPUB-Pfad
ABK: Abkürzung des Gesetzes, die später genutzt werden soll.
EPUB-Pfad: Der Pfad der EPUB-Datei. Im Firefox kann man den Pfad in die Zwischenablage kopieren, indem man mit einem Rechtsklick auf EPUB klickt und „Link-Adresse kopieren“ auswählt. Im Fall des TKG wäre der Pfad etwa: http://www.gesetze-im-internet.de/tkg_2004/BJNR119000004.epub
Der komplette Eintrag für das TKG würde also lauten:
TKG#http://www.gesetze-im-internet.de/tkg_2004/BJNR119000004.epub
Für jedes Gesetz wird eine eigene Zeile in die Datei geschrieben. Ein Ausschnitt aus meiner Datei sieht etwa folgendermaßen aus:
AEG#http://www.gesetze-im-internet.de/aeg_1994/BJNR239600993.epub AFuG#http://www.gesetze-im-internet.de/afug_1997/BJNR149400997.epub AFuV#http://www.gesetze-im-internet.de/afuv_2005/BJNR024200005.epub BDSG#http://www.gesetze-im-internet.de/bdsg_1990/BJNR029550990.epub BEGTPG#http://www.gesetze-im-internet.de/begtpg/BJNR200900005.epub BGSG#http://www.gesetze-im-internet.de/bgsg/BJNR118340972.epub BImSchV_26#http://www.gesetze-im-internet.de/bimschv_26/BJNR196600996.epub BEMFV#http://www.gesetze-im-internet.de/bemfv/BJNR336600002.epub BKAG#http://www.gesetze-im-internet.de/bkag_1997/BJNR165010997.epub BSIG#http://www.gesetze-im-internet.de/bsig_2009/BJNR282110009.epub BRKG#http://www.gesetze-im-internet.de/brkg_2005/BJNR141810005.epub BGB#http://www.gesetze-im-internet.de/bgb/BJNR001950896.epub
Die Datei heißt bei mir einfach „gesetze.txt“.
Das eigentliche Skript ist in Perl geschrieben und sieht folgendermaßen aus:
Nota bene: Ich bin Anwalt, kein Programmierer. Das Skript funktioniert für mich. Eventuell funktioniert es auch für Sie – das müssen Sie auf eigenes Risiko herausfinden. Ich übernehme keine Haftung für irgendwelche Sach- oder Personenschäden!
#!/usr/bin/perl use strict; my $rechtsweg = "/PFAD/gesetze.txt"; my $epubpfad = "/PFAD/gesetze_epub"; my $epubtemp = "/PFAD/epub"; system ("mkdir $epubtemp"); print "makelaw\n\n"; open (GESETZ, $rechtsweg); foreach my $aktgesetz (<GESETZ>) { chomp $aktgesetz; $aktgesetz =~ /(.+?)#(.+?)$/; my $gesetz = $1; my $epub = $2; print "$gesetz \n"; system ("curl $epub --output $epubtemp/$gesetz.epub"); system ("rm -R $epubtemp/temp"); system ("mkdir $epubtemp/temp"); system ("unzip $epubtemp/$gesetz.epub -d $epubtemp/temp/"); open(FILE, "<$epubtemp/temp/inhalt.opf") || die "File not found"; my @lines = <FILE>; close(FILE); my @newlines; foreach(@lines) { $_ =~ s/<dc:title>.*<\/dc:title>/<dc:title>$gesetz<\/dc:title>/gsi; push(@newlines,$_); } open(FILE, ">$epubtemp/temp/inhalt.opf") || die "File not found"; print FILE @newlines; close(FILE); system ("rm $epubtemp/$gesetz.epub; cd $epubtemp/temp; zip -r ../$gesetz.epub *"); system ("cp $epubtemp/$gesetz.epub $epubpfad/$gesetz.epub"); }
In den Zeilen 4-6 werden Pfade definiert. Die Notation entspricht der unter MacOS bzw. Linux (mit Windows kenne ich mich leider nicht aus …). Die Pfade müssen existent sein!
Die Schleife ab Zeile 13 arbeitet die Datei mit den Gesetzen zeilenweise ab. In den Zeilen 14-17 werden die einzelnen Einträge in Variablen eingelesen. (Ja, das geht auch eleganter …)
In Zeile 19 wird die EPUB-Datei heruntergeladen.
In den nächsten Zeilen wird zunächst sichergestellt, dass das Temp-Verzeichnis existiert und leer ist. Dazu wird das Verzeichnis zunächst gelöscht (was eine Fehlermeldung erzeugt, wenn es nicht existiert – damit sollte man aber leben können) und dann neu angelegt.
In Zeile 22 wird die EBUP-Datei entpackt. EPUB-Dateien sind nämlich letztlich ZIP-Dateien, die XHTML enthalten.1
In den Zeilen 23-25 wird die Datei inhalt.opf eingelesen. Diese enthält Metainformationen zu der EPUB-Datei – unter anderem den Titel. Um den Titel zu finden, arbeiten wir die Datei zeilenweise ab und ersetzen ggf. den Titel durch den von uns in der gesetze.txt hinterlegten Kurztitel (Zeilen 27-30). (Ja, ja, auch das geht eleganter …)
In den Zeilen 31-33 wird die veränderte Datei inhalt.opf neu geschrieben.
Schließlich wird aus den XHTML-Dateien wieder eine EPUB-Datei erstellt. Dazu werden die Dateien zunächst gezippt (Zeile 36) und die ZIP-Datei dann in .epub umbenannt.
Die EPUB-Dateien synchronisiere ich schließlich über iTunes mit dem iPad.