Benutzer:Jan Bartels/bookmarks2wiki.pl: Unterschied zwischen den Versionen

aus DerMoba, der Wissensdatenbank für Modellbahner
Wechseln zu: Navigation, Suche
(Linklisten-Generatorscript neu)
 
K (Kategorie hinzugefügt)
Zeile 375: Zeile 375:
  
 
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.
 
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.
 +
 +
[[Kategorie:Links]]

Version vom 8. März 2006, 21:22 Uhr

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.