#!/usr/bin/env perl
use POSIX;
use File::Basename;
use Net::FTP;
use Getopt::Long;

$host = "mirrors.dotsrc.org";
$basesourcedir = "/ctan";
$sourcedir = "";

sub ftpmessage {
   # I'm not sure whether $ftp->message is supposed to end with "\n"
   # or not. To be sure (and have nicer output on the screen), it is
   # removed here.
   my $x = $ftp->message;
   chomp $x;
   return $x;
}

# Determine ${prefix}, for the default target directory for pattern
# files. Two different strategies ...
$makefile = (dirname $0) . "/Makefile";
if (-e $makefile) {
   # 1. Makefile exists in the same directory, so it can be assumed
   # that this script is not yet installed, but called from the source
   # directory. Search Makefile for prexix. 
   open MF, $makefile or die "Cannot open $makefile: $!";
   while (<MF>) {
      if (/^\s*prefix\s*=\s*(.*)\s*$/) {
         $prefix = $1;
      }
   }
   close MF;

   if ($prefix eq "") {
      die "Prefix not defined in $makefile.";
   }
} else {
   # 2. Assume that this is script is installed, so its path contains
   # the prefix.
   if ($0 =~ /(.*)\/bin\/[^\/]+$/) {
      $prefix = $1;
   } else {
      die "Failed to determine prefix from $0.";
   }
}

$targetdir = "$prefix/lib/dillo/hyphenation";

if (!GetOptions ("host=s" => \$host,
                 "basesourcedir=s" => \$basesourcedir,
                 "sourcedir=s" => \$sourcedir,
                 "targetdir=s" => \$targetdir)
    || @ARGV == 0) {
   print "Usage: $0 [OPTIONS] LANG [LANG ...]\n\n";
   print <<EOT;
Download and install hyphenation patterns from CTAN for different languages,
via FTP. Languages are specified as defined by ISO 639-1 ("en" for English
etc.).

If there are multiple pattern files for a language (and so the filename is not
"hyph-LANG.pat.txt"), you must specify the respective part of the filename,
e. g. "en-gb" or "en-us". In this case, the extra part ("-gb" or "-us") is
automatically removed.

If you are not sure, simply specify the language code ("en" in this example);
you will then given a list of existing pattern files.

Options:
   -h, --host=HOST            the host to connect to (default:
                              mirrors.dotrc.org)
   -s, --sourcedir=DIR        the directory on the FTP server
   -b, --basesourcedir=DIR    alternatively, the base directory, after which
                              /language/hyph-utf8/tex/generic/hyph-utf8...
                              .../patterns/txt is added (default: /ctan/)
   -t, --targetdir=DIR        where to install the hyphenation patterns
                              (default: where they are read by dillo)
EOT
} else {
   if ($sourcedir eq "") {
      $sourcedir =
         "$basesourcedir/language/hyph-utf8/tex/generic/hyph-utf8/patterns/txt";
   }

   if (!-e $targetdir) {
      mkdir $targetdir or die "Cannot create directory $targetdir: $!";
      print "Created $targetdir.\n";
   }

   # Connect to CTAN FTP server, change to the directory where the
   # patterns lie, and read files list (which may be useful later).
   $ftp = Net::FTP->new($host,Timeout=>240)
      or die "Cannot connect to $host: $@";
   $ftp->login() or die "Cannot login: ", ftpmessage;
   $ftp->cwd($sourcedir)
      or die "Cannot change to directory $sourcedir: ", ftpmessage;
   @files = $ftp->ls or die "Cannot read directory: ", ftpmessage;

   # Finally, read pattern files.
   foreach $arg (@ARGV) {
      if ($arg =~ /^([a-z]+)-.*$/) {
         # More files per language, e. g. "en-gb".
         $lang = $1;
      } else {
         # One file per language, e. g. "ru".
         $lang = $arg;
      }
      
      # First, donwload the pattern file to a temporary file.
      $tmppat = tmpnam();
      if ($ftp->get ("hyph-$arg.pat.txt", $tmppat)) {
         printf ("Successfully downloaded pattern file for \"$arg\".\n");
         
         # Search for a licence file. (Only a warning, when it does
         # not exist.)
         $tmplic = tmpnam();
         $licfound = 0;
         if ($ftp->get ("hyph-$arg.lic.txt", $tmplic)) {
            $licfound = 1;
         } else {
            print "Warning: Cannot download license file for \"$arg\": ",
              ftpmessage, "\n";
         }
         
         # Combine both, licence and pattern, to the final pattern
         # file.
         $outfile = "$targetdir/$lang.pat";
         open OUT, "> $outfile" or die "Cannot open $outfile: $!";
         
         if ($licfound) {
            print OUT
               "% Licence from ftp://$host$sourcedir/hyph-$arg.lic.txt\n";
            print OUT "%\n";
            open IN, $tmplic or die "Cannot open $tmplic: $!";
            while (<IN>) {
               # Each line from the licence file must be a comment.
               if (!/^%/) {
                  print OUT "% ";
               }
               print OUT;
            }
            close IN;
            unlink $tmplic;

            print OUT "%\n";
         }
         
         print OUT "% Patterns from ftp://$host$sourcedir/hyph-$arg.pat.txt\n";
         print OUT "%\n";
         open IN, $tmppat or die "Cannot open $tmppat: $!";
         while (<IN>) {
            print OUT;
         }
         close IN;
         unlink $tmppat;
         
         close OUT;
      } else {
         # Not found. If a single language was specified (e. g. "en"),
         # search for possibilities.
         print "Error: Cannot download pattern file for \"$arg\": ",
            ftpmessage, "\n";
         if ($lang eq $arg) {
            print "Try one of these:\n";
            foreach(@files) {
               if (/^hyph-($lang-.*)\.pat\.txt$/) {
                  print "   $1\n";
               }
            }
         }
      }
   }
   
   $ftp->quit;
}
