Opera Hotlist in Mozilla Bookmarks konvertieren
Frank Schönmann
- perl
hi!
Da ich bislang kein vernünftiges Programm gefunden habe, das meine
Opera-Hotlist in Mozilla-Bookmarks konvertiert, und Mozilla das
Format von Opera auch nicht lesen kann, habe ich gerade ein kleines
Perl-Skript geschrieben, das die Bookmark-Liste von Opera ausliest
und ein Bookmark-File erstellt, das problemlos von Mozilla importiert
werden kann. Dabei bleiben vor allem die Ordnerstruktur und die für
Bookmarks eingestellten Shortcuts erhalten. Das zweite Feature habe
ich oft bei anderer Software vermisst.
Naja, also falls jemand das Programm auch gebrauchen kann, poste ich
mal hier den Quellcode. Damit kann man übrigens auch seine Opera
Hotlist in eine HTML-Linkliste verwandeln, da das Mozilla-Format ja
auch dafür geeignet ist... ;)
=== cut ===
#!/usr/bin/perl
my ($input, $output) = @ARGV;
open FILE, "<$input" or die "Could not read file $input: $!";
my @lines = <FILE>;
close FILE;
open FILE, ">$output" or die "Could not write file $output: $!";
print FILE headerHTML();
print FILE parseOpera(@lines)->[0];
print FILE footerHTML();
close FILE;
sub folderHTML($$$$);
sub bookmarkHTML($$$$$$);
sub strip($);
sub parseOpera(@) {
my @lines = @_;
my ($line, $output);
while ($line !~ /^-/) {
if ($line =~ /#URL/) {
my %bookmark;
while (($line = shift @lines) !~ /^$/m) {
my ($key, $value) = map { strip $_ } split /=/, $line;
$bookmark{$key} = $value;
}
$output .= bookmarkHTML $bookmark{'NAME'}, $bookmark{'URL'},
$bookmark{'CREATED'}, $bookmark{'VISITED'},
$bookmark{'SHORT NAME'}, $bookmark{'DESCRIPTION'};
} elsif ($line =~ /#FOLDER/) {
my %folder;
while (($line = shift @lines) !~ /^$/m) {
my ($key, $value) = map { strip $_ } split /=/, $line;
$folder{$key} = $value;
}
my $content = parseOpera(@lines);
$output .= folderHTML $folder{'NAME'}, $folder{'CREATED'},
$folder{'VISITED'}, $content->[0];
@lines = @{@$content->[1]};
}
$line = shift @lines;
}
return [$output, @lines];
}
sub folderHTML($$$$) {
my ($name, $created, $visited, $content) = @_;
return <<"EOT";
<DT><H3 ADD_DATE="$created" LAST_MODIFIED="$created" ID="NC:BookmarksRoot#$f519bc5c">$name</H3>
<DL><p>
$content
</DL><p>
EOT
}
sub bookmarkHTML($$$$$$) {
my ($name, $url, $created, $visited, $shortcut, $description) = @_;
my $output = <<"EOT";
<DT><A HREF="$url" ADD_DATE="$created" LAST_VISIT="$visited" LAST_MODIFIED="$created" SHORTCUTURL="$shortcut" LAST_CHARSET="ISO-8859-1">$name</A>
EOT
if ($description) {
$output .= "<DD>$description";
}
return $output;
}
sub headerHTML() {
return <<"EOT";
<!DOCTYPE NETSCAPE-Bookmark-file-1>
<!-- This is an automatically generated file.
It will be read and overwritten.
Do Not Edit! -->
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
<TITLE>Bookmarks</TITLE>
<H1>Bookmarks</H1>
<DL><p>
EOT
}
sub footerHTML() {
return <<"EOT";
</DL><p>
EOT
}
sub strip($) {
my $line = shift;
$line =~ s/^\s*(.*?)\s*$/$1/;
return $line;
}
=== cut ===
Vielleicht hat ja jemand Verbesserungsvorschläge oder findet noch
einen Bug...
bye, Frank!