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

aus DerMoba, der Wissensdatenbank für Modellbahner
Wechseln zu: Navigation, Suche
K (Kategorie hinzugefügt)
K (kleine Korrekturen am Script sowie Ergänzungen im Text)
 
Zeile 47: Zeile 47:
 
sub printheadline
 
sub printheadline
 
{
 
{
my $headline = shift();
+
  my $headline = shift();
my $level = shift();
+
  my $level = shift();
  
printfooter();
+
  printfooter();
 
    
 
    
my $markup = '=' x $level;
+
  my $markup = '=' x $level;
 
   chomp( $headline );
 
   chomp( $headline );
 
    
 
    
Zeile 69: Zeile 69:
 
sub printsectioncomment
 
sub printsectioncomment
 
{
 
{
my $comment = shift();
+
  my $comment = shift();
 
   chomp( $comment );
 
   chomp( $comment );
 
   print OUTPUT <<EOSC;
 
   print OUTPUT <<EOSC;
Zeile 84: Zeile 84:
 
sub printheader
 
sub printheader
 
{
 
{
return unless ( $printheader );
+
  return unless ( $printheader );
$printheader = 0;
+
  $printheader = 0;
 
   $printfooter = 1;
 
   $printfooter = 1;
  
Zeile 101: Zeile 101:
 
{
 
{
 
   $printheader = 1;
 
   $printheader = 1;
return unless ( $printfooter );
+
  return unless ( $printfooter );
 
   $printfooter = 0;
 
   $printfooter = 0;
  
Zeile 117: Zeile 117:
 
sub printlink
 
sub printlink
 
{
 
{
my $link = shift();
+
  my $link = shift();
  
 
   my $href = $link->{ href };
 
   my $href = $link->{ href };
Zeile 125: Zeile 125:
  
 
   my $comment = $link->{ comment };
 
   my $comment = $link->{ comment };
$comment =~ s/\s+\n/ /mg;
+
  $comment =~ s/\s+\n/ /mg;
$comment =~ s/\s+$//m;
+
  $comment =~ s/\s+$//m;
 
 
$comment =~ s/\[(.*?)\]//;
+
  $comment =~ s/\[(.*?)\]//;
my $special;
+
  my $special;
$special = "<br>$1" if ( defined( $1 ) );
+
  $special = "<br/>$1" if ( defined( $1 ) );
 
 
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime;
+
  my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime;
  
 
   printheader(); # ggf. Tabellenkopf ausgeben
 
   printheader(); # ggf. Tabellenkopf ausgeben
Zeile 143: Zeile 143:
 
!  [$href $text]
 
!  [$href $text]
 
|  $comment
 
|  $comment
|  $date $special
+
|  $date$special
 
EOTL
 
EOTL
 
}
 
}
Zeile 368: Zeile 368:
 
</pre>
 
</pre>
  
Um das Script unter Windows "drag & drop"-fähig zu machen, erstellt man sich eine Batch-Datei bookmarks2wiki.bat mit folgendem Inhalt:
+
Das Script wird mit der zu konvertierenden Bookmarkdatei als Parameter gestartet:
 +
 
 +
<pre>
 +
perl bookmarks2wiki.pl bookmarkdatei.html
 +
</pre>
 +
 
 +
Daraus erzeugt das Script die Datei bookmarkdatei.wiki als Ergebnis. Um das Script unter Windows "drag & drop"-fähig zu machen, erstellt man sich eine Batch-Datei bookmarks2wiki.bat mit folgendem Inhalt:
  
 
<pre>
 
<pre>

Aktuelle Version vom 9. März 2006, 21:09 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 );

Das Script wird mit der zu konvertierenden Bookmarkdatei als Parameter gestartet:

perl bookmarks2wiki.pl bookmarkdatei.html

Daraus erzeugt das Script die Datei bookmarkdatei.wiki als Ergebnis. 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.