#!/usr/local/bin/perl -w

use strict ;

#
# Crée un catalogue de fontes, à partir des fichiers Métafont 
# présents dans le répertoire courrant et ses sous-répertoires.
# Le résultat sera présenté sous forme d'un fichier HTML contenant
# des liens vers des fichiers GIF dans un répertoire.
#
# Vincent Zoonekynd (zoonek@math.jussieu.fr)
# Aout 1998
#
###############################################################

# BUG:
# Quand il se trompe de fichier, ie, quand il prend pour une fonte
# un fichier MF qui n'est qu'un morceau de fonte, il y a plein d'erreurs.
# Les fichiers d'erreurs *.log peuvent etre TRES gros (j'en ai vu un de 
# de 200 Mo, mais metafont n'avait pas encore fini quand je l'ai arrété) ;
# de surcroit, ils sont parfois copiés dans $TEXMF/ (!)
# Je suggère donc de lancer, en tache de fond, 
#   while : ; do find -name ".log" -exec rm -f {} \; ; sleep 300 ; done
# à la fois dans le répertoire courrant et dans $TEXMF/

## Variables globales
my @T ;

## Recherche des fichiers Métafont
use File::Find ;
sub wanted {
  my $Fichier = $_ ;
  exemple($_, $File::Find::name) if m/\.mf$/ ;
  $_ = $Fichier ;
}

## On a trouvé un fichier, on l'utilise...
sub exemple { 
  my ($base, $FichierMF) = (@_) ;
  print STDERR "*** processing $FichierMF\n";
  my $FichierLaTeX = $base . ".essai.tex" ;
  my $FichierDVI =   $base . ".essai.dvi" ;
  my $FichierPS =    $base . ".essai.ps" ;
  my $Fonte = $base ; $Fonte =~ s/\.mf$// ;
  my $FichierLOG = $Fonte . ".log" ;
  # On crée un fichier LaTeX
  open(LATEX, ">$FichierLaTeX");
  print LATEX '\documentclass{minimal}' . "\n" ;
  print LATEX '\DeclareFontFamily{U}{' .$Fonte. '}{}' ."\n" ;
  print LATEX '\DeclareFontShape{U}{toto}{m}{n}{<->' .$Fonte. '}{}' . "\n" ;
  print LATEX '\DeclareSymbolFont{toto}{U}{toto}{m}{n}' . "\n" ;
  print LATEX '\DeclareSymbolFontAlphabet{\mathtoto}{toto}' . "\n" ;
  print LATEX '\newcommand{\texttoto}[1]' . "\n" ;
  print LATEX '{\fontencoding{U}\fontfamily{toto}\selectfont #1}' . "\n" ;
  print LATEX '\begin{document}' . "\n" ;
  print LATEX '\texttoto{Un peu de texte...}' . "\n" ;
  print LATEX '\end{document}' ."\n" ;
  close(LATEX);
  # Ca ne marche pas comme je le voudrais, on crée un fichier TeX...
  open(LATEX, ">$FichierLaTeX");
  print LATEX '\batchmode' . "\n";
  print LATEX '\font\toto=' . $Fonte . "\n" ;
  print LATEX '\nopagenumbers' . "\n" ;
  print LATEX '\hbox{\toto ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789}'."\n";
  print LATEX '\bye' . "\n" ;
  close(LATEX);

  # On le compile. S'il manque des fichiers *.tfm, TeX (web2c) est
  # capable de les créer tout seul.
  # En cas d'erreur, on ignore simplement la fonte.

  # BUG : il faudrait regarder si teX met plus de 20 minutes pour 
  # compiler le fichier et, en ce cas, l'arréter...
  system("ln", "-s", "/dev/null", $FichierLOG) ;

  if( system("tex", "$FichierLaTeX") ){
    unlink $FichierLOG ;
    return ; }
  unlink $FichierLOG;
  system("dvips", "-E", "-o", "$FichierPS", "$FichierDVI");

  # Il y a parfois des problèmes, il faut voir si le fichier *.eps
  # a une Bounding Box non triviale.
  open(EPS, "$FichierPS");
  while(<EPS>){ last if m/bounding/i; }
  close(EPS);
  print STDERR ">>>>> $_" ;
  return if m/72 72 72 72/;

  # On crée le fichier GIF
  # pstogif est un morceau de latex2html
  system("pstogif", "-density", "300", "$FichierPS");

  # On rajoute le nom du fichier dans un tableau.
  @T = (@T, $FichierMF) ;
}


find(\&wanted, '.');

print "FINI\n";

# La version HTML
print "Version HTML\n";
my $FichierHTML = "catalogue.html";
#mkdir "Images", 755;
open(HTML, ">$FichierHTML");
print HTML "<HTML><HEAD><TITLE>Catalogue de fontes MF</TITLE></HEAD><BODY>\n";
my $image1;
my $image2;
my $fonte ;
foreach $fonte (@T){
  $image1 = $fonte . ".essai.gif" ;
  $image2 =$image1;
  $image2 =~ s|^\./||;
  $image2 =~ s|/|_|g;
  rename $image1, $image2;
  print HTML '<P> <HR> <P>' . "\n";
  print HTML "$fonte <BR>\n";
  print HTML '<img src="' . $image2 .'">' . "\n" ;
}
print HTML "<P><HR><HR><PRE>" .`date`. "</PRE>\n";
print HTML "</BODY></HTML>\n";
close(HTML);

# On crée un fichier LaTeX qui contient toutes ces fontes. 
print "Version PostScript\n";
my $FichierLaTeX = "catalogue.tex" ;
my $FichierDVI = "catalogue.dvi" ;
my $FichierPS = "catalogue.ps" ;
open(LATEX,">$FichierLaTeX");
print LATEX '\documentclass{minimal}' . "\n" ;
print LATEX '\usepackage{graphicx}' . "\n";
print LATEX '' . "\n";
print LATEX '\begin{document}' . "\n" ;
foreach $fonte (@T){
  my $eps = $fonte .".essai.ps" ;
  print LATEX '\par\noindent' . "\n";
  print LATEX "$fonte\n";
  print LATEX '\includegraphics{' .$eps. '}' ."\n";
  print LATEX '\par\medskip' . "\n";
}
print LATEX '\end{document}' ."\n" ;
close(LATEX);
system("latex", $FichierLaTeX);
#system("dvips", "-o", "$FichierPS", "$FichierDVI");

