Benutzer:Jan Bartels/bookmarks2wiki.pl
Die Linklisten auf DER_MOBA sind mit Hilfe des Perl-Scripts bookmarks2wiki.pl aus den Bookmark-Dateien vom Netscape-Browser konvertiert worden.
Aus den Ordnernamen generiert das Script Überschriften, die ggf. von Fließtext gefolgt werden. Wenn man dort optisch was ändern will, muß man die Zeilen zwischen
print OUTPUT <<MARKE; Dieser Text wird ausgegeben MARKE
in den beiden Unterroutinen (sub printheadline und sub printsectioncomment) anpassen. Zwischen der print-Zeile und der abschließende Marke steht wiki-Code drin, wobei z. T. die Inhalte von perl-Variablen (das sind die Dinger mit $ am Anfang) ausgegeben werden. Außerdem gibt es noch die Unterroutinen, die die Tabelle anlegen: sub printheader, sub printfooter und sub printlink.
use strict; require HTML::TokeParser; if ( $#ARGV != 0 ) { print <<USAGE; Usage: perl bookmarks2wiki.pl datei.html liest datei.hmtl ein und erzeugt datei.wiki. USAGE exit(1); } my $file = $ARGV[0]; #my $file = 'Bookmarks.html'; my $outputfile = $file . "\.wiki"; $outputfile =~ s/\.html\.wiki$/\.wiki/i; #my $outputfile = 'wikilinks.txt'; #my $outputfile = '-'; # Standardausgabe my $p = HTML::TokeParser->new($file) || die "Can't open: $!"; my $printheader = 1; my $printfooter = 0; # # Ueberschriftenzeile ausgeben # sub printheadline { my $headline = shift(); my $level = shift(); printfooter(); my $markup = '=' x $level; chomp( $headline ); print OUTPUT <<EOHL; $markup $headline $markup EOHL } # # Fliesstext zu Ueberschrift ausgeben # sub printsectioncomment { my $comment = shift(); chomp( $comment ); print OUTPUT <<EOSC; $comment EOSC } # # Tabellenkopf ausgeben # sub printheader { return unless ( $printheader ); $printheader = 0; $printfooter = 1; print OUTPUT <<EOH; {| {{Linktabelle}} {{Linkheader}} EOH } # # Tabellenfuss ausgeben # sub printfooter { $printheader = 1; return unless ( $printfooter ); $printfooter = 0; print OUTPUT <<EOF; {{Linkheader}} |} EOF } # # Tabellenzeile ausgeben # sub printlink { my $link = shift(); my $href = $link->{ href }; my $text = $link->{ text }; chomp( $text ); my $comment = $link->{ comment }; $comment =~ s/\s+\n/ /mg; $comment =~ s/\s+$//m; $comment =~ s/\[(.*?)\]//; my $special; $special = "<br>$1" if ( defined( $1 ) ); my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime; printheader(); # ggf. Tabellenkopf ausgeben my $date = sprintf( "%02d.%02d.%04d", $mday, $mon + 1, $year + 1900 ); print OUTPUT <<EOTL; {{Linkzeile}} ! [$href $text] | $comment | $date $special EOTL } # # Link parsen # sub parselink { my $href; my $text; while (my $token = $p->get_token) { if ( $$token[0] eq 'S' ) { # Starttoken if ( $$token[1] eq 'a' ) { $href = $$token[2]->{href}; while (my $token = $p->get_token) { if ( $$token[0] eq 'T' ) { # Text $text .= $$token[1]; } if ( $$token[0] eq 'E' ) { # Endtoken if ( $$token[1] eq 'a' ) { return ( href => $href, text => $text, comment => ' ' ); } } } } } } } # # Linkkommentar parsen # sub parsecomment { my $text; while (my $token = $p->get_token) { if ( $$token[0] eq 'T' ) { # Text $text .= $$token[1]; } if ( $$token[0] eq 'S' ) { # naechstes Starttoken $p->unget_token( $token ); return $text; } if ( $$token[0] eq 'E' ) { # naechstes Starttoken $p->unget_token( $token ); return $text; } } } # # Linkliste bis Sektionsende parsen und ausgeben # sub parselinklist { my $level = shift(); $printheader = 1; my $link; while (my $token = $p->get_token) { if ( $$token[0] eq 'S' ) { # Starttoken if ( $$token[1] eq 'dt' ) { printlink( $link ) if ( defined( $link ) ); $token = $p->get_token; if ( $$token[0] eq 'S' ) { if ( $$token[1] eq 'a' ) { # Link $p->unget_token( $token ); $link = { parselink() }; } if ( $$token[1] eq 'h3' ) { # geschachtelte Sektion $p->unget_token( $token ); parseheadline( $level ); undef $link; } } next; } if ( $$token[1] eq 'dd' ) { if ( defined( $link ) ) { $link->{comment} = parsecomment(); } next; } } if ( $$token[0] eq 'E' ) { # Endtoken if ( $$token[1] eq 'dl' ) { printlink( $link ) if ( defined( $link ) ); printfooter(); return; } } } } # # Sektionsueberschrift parsen und ausgeben # sub parseheadline { my $level = shift(); my $headline; while (my $token = $p->get_token) { if ( $$token[0] eq 'S' ) { # Starttoken if ( $$token[1] eq 'h3' ) { while (my $token = $p->get_token) { $headline .= $$token[1] if ( $$token[0] eq 'T' ); if ( $$token[0] eq 'E' && $$token[1] eq 'h3' ) { printheadline( $headline, $level ); last; } } next; } if ( $$token[1] eq 'dd' ) # Fließtext { my $text; while (my $token = $p->get_token) { if ( $$token[0] eq 'T' ) { # Text $text .= $$token[1]; } if ( $$token[0] eq 'S' && $$token[1] eq 'dl' ) { # naechstes Starttoken $p->unget_token( $token ); printsectioncomment( $text ); last; } } next; } if ( $$token[1] eq 'dl' ) # Linkliste beginnt { $p->unget_token( $token ); parselinklist( $level + 1 ); return; } } } } # # Datei parsen # sub parsebody { while (my $token = $p->get_token) { if ( $$token[0] eq 'S' ) { # Starttoken if ( $$token[1] eq 'h1' ) { parseheadline( 0 ); next; } } } } open( OUTPUT, ">$outputfile" ) || die "Can't open: $!"; print OUTPUT "<!-- Konvertiert von $ARGV[0] -->\n"; parsebody(); close( OUTPUT );
Um das Script unter Windows "drag & drop"-fähig zu machen, erstellt man sich eine Batch-Datei bookmarks2wiki.bat mit folgendem Inhalt:
perl "C:\Eigene Dateien\der_moba\bookmarks2wiki.pl" "%1"
Eine zu konvertierende Bookmarkdatei kann man nun im Explorer auf die Batchdatei ziehen. Die Pfadangabe zu dem Perl-Script muß gegebenenfalls angepaßt werden. Das Perl-Script ist unter Windows und Mac getestet und sollte auch unter Linux laufen.