I've been working on moving from Win2k to Linux and learning Perl 
at the same time, so I thought I'd kill two birds with one stone and 
write a Perl program to convert my IE bookmarks to Mozilla format.  
The meat of the code is at the end - comments and suggestions are 
more than welcome.

At any rate, the code works and I have my bookmarks in Mozilla.
However, I'm not completely happy with it.  The output is too 
closely tied to the input.  I'd like to rewrite it so that the 
output type could be specified - html, Mozilla, Galeon, etc. 
I'm not sure where to start, though.  I had thought of reading in
the favorites and storing it in a tree-type data structure, but
wasn't sure exactly how to do this or how to write a routine 
to walk the tree.  Any ideas or pointers to resources?

-Phil

code follows:

open(OUTFILE,">$outfile") || 
        die "Couldn't open $outfile for writing: $!";

print_header(\*OUTFILE,$rootdir);
 
# Walk the directory tree and print the links 
print_favs(\*OUTFILE,$rootdir);

print_footer(\*OUTFILE);

# recursive function to walk the directory tree underneath
#   the directory passed in as a parameter.  First the directory
#   is opened, then a list of the files/folders is read into
#   an array, and then the array is split into a list of files and
#   a list of directories.  html links are output for the files
#   and the function is called again for each of the directories.
#   Stopping condition is when a directory is reached that has only
#   files, no sub-directories.   
sub print_favs {
   my $fh = $_[0];  # output file handle
   my $dir = $_[1]; # current directory
   my (@itemlist, @filelist, @dirlist);

   opendir(CURDIR, $dir) || die "Couldn't open $dir: $!\n";
   @itemlist = readdir(CURDIR);
   chdir($dir) || die "Couldn't chdir to $dir: $!\n";
  
   if ($dir ne $rootdir) {
   print $fh "<dt><h3 id=\"NC:BookmarksRoot\#$foldernum\"\>$dir</h3>\n";
   print $fh "<dl><p>\n";
        }
        $foldernum++;
   
   foreach (@itemlist) {
      # print $fh "Item: $_\n";
      # Only process non-symbolic links
      if (!(-l $_)) {              
         if ((-d $_) && ($_ !~ /\.\.?/)) {
            @dirlist = (@dirlist, $_);
         }
         elsif ((-f $_) && ($_ =~ /\.url$/i)) {
            @filelist = (@filelist, $_);
         }
      } 
   }
   foreach (sort @filelist) {
      print $fh "<dt>".getlink($_)."\n";
   }
   foreach (sort @dirlist) {
      print_favs($fh,$_,$foldernum);
   }
   print $fh "</dl><p>\n";
   chdir("..");
}
  
# takes the name of a windows internet shortcut file (from 'Favorites')
#   opens the file and parses out the url it refers to.  The function 
#   returns an html link with the url as the href and the name of 
#   the file (without the .url file extension) as the label
sub getlink {
  my ($file, $line, $url, $name, $link); 
  $file = $_[0];
  open(URLFILE,$file) || die "Can't open $file: $!";
  while (defined($line=<URLFILE>) && ($line !~ /^URL=/)) {
  }
  if (defined($line)) {
     chomp $line; 
     $url = substr($line,4);
     $url =~ s/\cM//;
     #print "URL:  $url\n";
     $name = $file; 
     $name =~ s/.+\///;
     $name =~ s/\.url//;
     #print "Name:  $name\n"; 
     $link = "<a href=\"".$url."\">$name</a>";
     close(URLFILE);
     return $link;
   }
   else {
      return ""; 
   }
}



-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to