Benutzer:Jan Bartels/bookmarks2wiki.pl

aus DerMoba, der Wissensdatenbank für Modellbahner
< Benutzer:Jan Bartels
Version vom 8. März 2006, 21:13 Uhr von Jan Bartels (Diskussion | Beiträge) (Linklisten-Generatorscript neu)

(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche

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.