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.