#!/usr/bin/perl
#================================================================================
# NOM         : stxt2html
# DESCRIPTION : convertit un fichier text (en version markup) en  html
# CATEGORIE   : 2html
# DEPENDANCE  : Getopt::Std
# AUTEUR      : Jean-Louis Bicquelet-Salaun
# LANGAGE     : perl
# DATE        : 31/07/2015
# VERSION     : 2.9
#          1.0     28/11/2008 version initiale
#          1.1	06/02/2009 modification pour une manipulation plus simple: le résultat est retourné dans une chaine
#          1.2 	02/10/2009  écrit un fichier et gère les défaut
#          1.3 	05/10/2009 gère les  arguments                        
#          1.4 	07/10/2009 correction du bug console
#          1.5 	12/10/2009 management des arguments
#          2.1 	27/05/2010 refonte de la version (2 passes)
#          2.2 	11/07/2011 correction bug tableau, ajout du + en début de ligne dans un tableau pour ne pas changer la couleur
#          2.3 	02/12/2011 ajout de la commande download, de la commande exec et de la commande include
#                          correction de l'erreur lorsqu'il n'y a pas d'extension
#          2.4 	14/12/2011 ajout des séparateurs pour les tableaux ( & + # | : ), de l'option header et des listes
#          2.5 	19/12/2011 ajout de la commande url
#          2.6 	19/01/2012 ajout des commandes de date et d'heure %time %date etc ..
#          2.7 	24/06/2013 ajout des couleurs %red, %blue .. et du terme alternate pour un tableau avec un séparateur
#          2.8 	24/06/2013 ajout de pseudo code html %ul{; %ul}, %p, %li
#          2.8.1 22/04/2015 mise en forme et doc
#          2.8.2 20/07/2015 mise à jour de la doc
#          2.8.3 21/07/2015 substitution de caractères @.; @%; ...
#          2.8.4 22/07/2015 ajout ..[include text].... et de header4 ~~~~
#          2.8.5 23/07/2015 ajout de la convertion ascii2html (en caractères html)
#          2.8.6 29/07/2015 ajout des couleurs par défaut pour ..[table].... 
#          2.8.7 30/07/2015 vérification sur les arguments, ajout de la convertion des caractères en html
# 	  2.9    31/07/2015 ajout des macros et des styles css
#
# BUGS : 19/12/2011     le _ dans url est mal traduit
#                29/07/2015 bug plusieures fois la même couleur
#
#================================================================================
# EXAMPLES:
#
#   1. stxt2html test.txt
#
#   genere un fichier test.html à partir de test
#
#   2. stxt2html test test.html
#
#   genere un fichier test.html à partir de test
#
#   3. stxt2html -m
#
#   affiche la page de man
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
use Getopt::Std;

#==============================================================================
# libdate.pl librairie date
#==============================================================================
@GLB_month = ("January","February","March","April","May","June","July","August","September","October","November","December");
@GLB_day=("Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday");

@GLB_mois=("janvier","fevrier","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","decembre");
@GLB_jour=("lundi","mardi","mercredi","jeudi","vendredi","samedi","dimanche");

#.........................................................
# valeurs par defaut
#.........................................................

$SEPARATOR =";";

$BORDER=0;
$PUCE="";
$DEFAULT_COLOR1="#C0C0C0";
$DEFAULT_COLOR2="#EFEFEF";
$DEBUG="no";

$cmd="";
$arg1="";
$arg2="";
$arg3="";
$mode=1;
	
	
#-------------------------------------------------------------------------------
sub getdate()
{
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime time;

$year += 1900;
$mon +=1;

$v = sprintf("%2.2d/%2.2d/%2.4d",$mday,$mon,$year);
return $v;
}

#-------------------------------------------------------------------------------
sub getdate_en()
{
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime time;

$year += 1900;
$mon +=1;

$v = sprintf("%2.4d/%2.2d/%2.2d",$year,$mon,$mday);
return $v;
}

#-------------------------------------------------------------------------------
sub tagdate()
{
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime time;

$year += 1900;
$mon +=1;

$v = sprintf("%2.4d%2.2d%2.2d",$year,$mon,$mday,$mon);
return $v;
}

#-------------------------------------------------------------------------------
sub gettime
{
	my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
	if ($hour < 10) { $hour = "0"."$hour"; }
	if ($min < 10) { $min = "0"."$min"; }
	if ($sec < 10) { $sec = "0"."$sec"; }

return "$hour:$min:$sec\n";
}
#-------------------------------------------------------------------------------
sub ordinal_en()
{
  my ($v)=@_;
  if ($v == 1) { $r="1st"; }
  elsif ($v == 2) { $r="2nd"; }
  elsif ($v == 3) { $r="3rd"; }
  else
  {
    $r=$v."th";
  }
  return $r;
}
#-------------------------------------------------------------------------------
sub show_date_fr()
{
   my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);

}
#-------------------------------------------------------------------------------
sub show_date_en()
{
  my($v);
  my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
  if ($year <= 99) { $year = "19"."$year"; }
  if ($year > 99) { $year = $year-100; if($year < 10) { $year = "0".$year; }$year = "20"."$year"; }
  $v=&ordinal_en($mday);
  return "$GLB_month[$mon]$m $v $year";
}
#-------------------------------------------------------------------------------
sub show_date_long_en()
{
   my($v);
  ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
  if ($year <= 99) { $year = "19"."$year"; }
  if ($year > 99) { $year = $year-100; if($year < 10) { $year = "0".$year; }$year = "20"."$year"; }
  $v=&ordinal_en($mday);
  return $GLB_day[$wday].", "."$GLB_month[$mon] $v $year";
}
#-------------------------------------------------------------------------------
sub show_date()
{
  my($v);
  ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
  if ($year <= 99) { $year = "19"."$year"; }
  if ($year > 99) { $year = $year-100; if($year < 10) { $year = "0".$year; }$year = "20"."$year"; }
  return "$mday $GLB_mois[$mon] $year";
}
#-------------------------------------------------------------------------------

sub show_date_long()
{
  my($v);
  ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
  if ($year <= 99) { $year = "19"."$year"; }
  if ($year > 99) { $year = $year-100; if($year < 10) { $year = "0".$year; }$year = "20"."$year"; }
  return "$GLB_jour[$wday], $mday $GLB_mois[$mon] $year";
}
#-------------------------------------------------------------------------------

#.........................................................
# valeurs par defaut
#.........................................................
$name="defaut.txt";
$filename="defaut.html";
$result="";

#=========================================================

#=========================================================
# usage et man
#=========================================================
sub usage()
{
  print << 'XXX';
    usage:
       stxt2html file.txt
XXX

  exit;
}

#----------------------------------------------------------
# man
#----------------------------------------------------------
sub man()
{
print <<'XXX';
NAME
   stxt2html - convertisseur de simple fichier texte (en markup langage) en html

DESCRIPTION

   traduit un fichier texte en un fichier html en utilisant quelques règles simples:

   * le paragraphe formaté

   Les formats utilisés pour formater les paragraphes permettent d'identifier clairement les parties du documents.


   Les paragraphes formaté commence par une ligne ressemblant à  
   ..[ ]............. 
   et se termine par un ligne comme celle-ci  
   ................... 
   (au moins 4 ".").

   La syntaxe générale est :

  début de paragraphe:
  
   ..[format arg1 arg2 arg3]...............
   ..[format arg1 arg2]....................
   ..[format arg1].........................
   ..[format]..............................
   
   Aucun espace n'est toléré avant le caractère "]".
   
   fin de paragraphe:
   ....
   ........................................

   Les formats reconnus sont:

   * file  : un fichier
   * table : un tableau
   * code : un listing
   * exec : le resultat d'une commande
   
  * table
  * url   : une liste d'url 
  * download :  une liste de fichiers à télécharger
   
Chaque table a un type, qui prédéfini l'affichage
  
le  type peut âtre:

  simple (simple table avec une couleur de fond)
  Une table avec une couleur pour les lignes impaires et une pour les lignes paires
  
  ..[table simple #C0C0C0 #EFEFEF].........................................
  val;12
  val;13
  url;144
  .........................................................................

  * paragraphe par défaut

  Le paragraphe est formatté suivant les règles suivantes:

  - headers
  Si une ligne est soulignée par 3 ou plus caractères suivants, il devient un header: 
  
  Une ligne commençant par au moins 3 caractères '*' correspond à H1
  Une ligne commençant par au moins 3 caractères '=' correspond à H2
  Une ligne commençant par au moins 3 caractères '-' correspond à H3
   Une ligne commençant par au moins 3 caractères '~' correspond à H4
    
  - gras et italique
  
Pour mettre en gras un mot on le précède et on le fait suivre par le caractère '*'.

Pour mettre en itaque un mot on le précède et on le fait suivre par le caractère '_'.

 10 substitutions de chaque sont acceptéer au maximum par ligne.

  - liens et images
  
  [http://link:text] est un lien vers "link" avec le  "text" pour valeur.

  [image] affiche une image nommée "image"


  - pas de format
  Une ligne commençant par un espace n'est pas formattée.
  

  - html code
  Il est bien sur possible d'utiliser des tags html dans un paragraphe par défaut.
  
   <font color=red>Pourquoi se priver de *awk* alors?</font>
  will produce

  Pourquoi se priver de awk alors?

SYNTAX

   stxt2html [options] [textfile]

   Options:

     -h   help
     -m   man

EXAMPLES:

   1. stxt2html test.txt

   génère un fichier test.html à partir de test

   2. stxt2html test test.html

   génère un fichier test.html à partir de test

   3. stxt2html -m

   affiche la page de man

VERSION
   2.9  31/07/2015

SEE ALSO

   la documentation complète peut être trouvée dans stxt2html.html

XXX

exit 1;
}

#--------------------------------------------------------
# gestion arguments
#--------------------------------------------------------
sub couleur_par_defaut()
{
	if ($arg2==-1) { $arg2=$DEFAULT_COLOR1;  $arg3=$DEFAULT_COLOR2 } ;
        if ($arg3==-1) {  $arg3=$DEFAULT_COLOR2 } ;
}


#--------------------------------------------------------
# test pour replace %red ...
#--------------------------------------------------------
sub replace()
{
  my $a=pop;
  my $r="";
  my @b=();
  my $j;

  @b=split/%red\(/,$a;
  foreach $j (@b) {
    if ($j ne "") {
       $j=~ s/\)/<\/font>/;
       $r=$r."<font color=\"red\">$j"; } i
  }
  $a=$r;
  $r="";
  $j="";
  @b=split/%blue\(/,$a;
  foreach $j (@b) {
    if ($j ne "") {
       $j=~ s/\)/<\/font>/;
       $r=$r."<font color=\"blue\">$j"; } i
  }
  $a=$r;
  $r="";
  $j="";
  @b=split/%green\(/,$a;
  foreach $j (@b) {
    if ($j ne "") {
       $j=~ s/\)/<\/font>/;
       $r=$r."<font color=\"green\">$j"; } i
  }



  $_ = $r;
}

#=========================================================
# gestion des macros
#=========================================================

#--------------------------------------------------------
# fixe la valeur d'une variable
#--------------------------------------------------------
sub set_var()
{
	 my $value = pop;
	 my $var = pop;
	 
	 $var = uc $var;
	 print "$var $value\n";
	 if ($var eq "DEBUG") { $DEBUG=$value }
	 elsif ($var eq "DEFAULT_COLOR1") { $DEFAULT_COLOR1=$value }
	 elsif ($var eq "DEFAULT_COLOR2") { $DEFAULT_COLOR2=$value }
}

#--------------------------------------------------------
# affiche toutes les variables
#--------------------------------------------------------
sub display_var()
{
	print << "EOV"
	\$DEBUG = $DEBUG
	
	\$DEFAULT_COLOR1 = $DEFAULT_COLOR1
	\$DEFAULT_COLOR2 = $DEFAULT_COLOR2

	\$SEPARATOR = $SEPARATOR 
	
EOV
;
	
}

#=========================================================
# déclaration de tags d'ouverture fermeture des modes
#=========================================================

#--------------------------------------------------------
# read a text file and put it in a list.
#--------------------------------------------------------
sub file_read()
{
  my ($name)=shift;
  my @l;

  open(FILE,$name)||die "couldn't open file $!\n";

  @l=<FILE>;
  close FILE;
  return @l;
}

#--------------------------------------------------------
# write a list into a text file
#--------------------------------------------------------
sub file_write
{
  my ($name,@l)=(@_);
  open(FILE,">$name")||die "couldn't write file $!\n";

  print FILE @l;
  close FILE;
}

#---------------------------------------------------------
# TAG console
#---------------------------------------------------------
sub display_console_begin() {	$_ = '<pre class="screen">'; }
sub display_console_end() { $_  = '</pre>'; }
#---------------------------------------------------------
# TAG screen
#---------------------------------------------------------
sub display_screen_begin() { $_ = '<pre class="screen">'; }
sub display_screen_end() { $_  = '</pre>'; }

#---------------------------------------------------------
# TAG code (same model as console)
#---------------------------------------------------------
sub display_code_begin() { $_ = '<pre class="codeblock">';  }
sub display_code_end()  { $_  = '</pre>'; }

#---------------------------------------------------------
# TAG text (same model as console)
#---------------------------------------------------------
sub display_text_begin() {  $_ = '<pre class="texte">'; }
sub display_text_end() { $_  = '</pre>'; }

#---------------------------------------------------------
# TAG file
#---------------------------------------------------------
sub display_file_begin() { $_ = '<pre class="file">'; }
sub display_file_end() { $_  = '</pre>'; }

#---------------------------------------------------------
# TAG include
#---------------------------------------------------------
sub display_include_begin() { }
sub display_include_end() { }

#---------------------------------------------------------
# TAG exec (presentation comme console)
#---------------------------------------------------------
sub display_exec_begin()
{
	$_ = << "EOF"
        <font color=black><pre><code>
EOF
;
}

sub display_exec_end()
{
	$_ = <<'EOF'
	</code></pre></font>
EOF
;
}

#----------------------------------------------------------------------------------------
# TAG table
#----------------------------------------------------------------------------------------

#----------------------------------------------------------------------------------------
sub display_table_end
{
  my $color2 = pop;
  my $color1 = pop;
  my $type = pop;
  my @lignes = @_;
  my $sep=";";
  my $first;

 ### SEPARATEURS ###
   if($type eq "alt&") { $sep="&"; }
      elsif($type eq "alt#") { $sep="#"; }
      elsif($type eq "alt:") { $sep=":"; }
      elsif($type eq "alt+") { $sep="+"; }
      elsif($type eq "alt|") { $sep="|"; }
      elsif($type eq "alt£") { $sep="£"; }
      elsif($type eq "alt%") { $sep="%"; }
      elsif($type eq "alt;") { $sep=";"; }
      elsif($type eq "alt§") { $sep="§"; }
     elsif($type eq "alt!") { $sep="!"; }
     elsif($type eq "alt") { $sep=";"; }
     
   if($type eq "simple&") { $sep="&"; }
      elsif($type eq "simple#") { $sep="#"; }
      elsif($type eq "simple:") { $sep=":"; }
      elsif($type eq "simple+") { $sep="+"; }
      elsif($type eq "simple|") { $sep="|"; }
      elsif($type eq "simple") { $sep="£"; }
      elsif($type eq "simple%") { $sep="%"; }
      elsif($type eq "simple;") { $sep=";"; }
      elsif($type eq "simple§") { $sep="§"; }
      elsif($type eq "simple!") { $sep="!"; }
      elsif($type eq "simple") { $sep=";"; }

    $first=0;
    if($type eq "header") { $first=1;} else { $first=0;}
    

	$result .=<<  "_START_"
<table  border="0" cellpadding="4">
	<tbody>
_START_
;

	$pair=0;

	foreach $e (@lignes)
	{
#	   print "$sep $e \n";
	   @tab=split(/$sep/,$e);
	   if ( substr($tab[$0],0,1) ne "+" ) {
	   if ($pair == 0)
	    {    $pair=1; $color=$color1; }
	   else
	      {    $pair=0; $color=$color2; }
       }
	   else { $tab[$0]=substr($tab[$0],1);}
		   
			  
	   $result .="<tr bgcolor=\"$color\">\n";	  

# ------------------ TABLE -----------------------------------
            if($cmd  =~ m/table/) {
 
			   for $i (0..$#tab) {
                 if($first==1) {
             		 $result .=" <td><b>$tab[$i]</b></td>\n"; }

                 else { 
			       $result .=" <td>$tab[$i]</td>\n"; }
               }

# ------------------ DOWNLOAD --------------------------------
			} elsif  ($cmd =~ m/download/) {
                for $i (0..$#tab-1) {
			       $result .=" <td>$tab[$i]</td>\n"; } 
				$result .=" <td><a href=\"$tab[$i]\">$tab[$i]</a></td>\n"; 
            }
# ------------------ URL --------------------------------
			elsif  ($cmd =~ m/url/) {
				$result .=" <td><a href=\"$tab[0]\">$tab[1]</a></td>\n"; 
                if ($#tab >1)
                {
                   for $i (2..$#tab) {
			          $result .=" <td>$tab[$i]</td>\n"; } 
                }

            }
# ------------------------------------------------------------ 
		$result .="</tr>\n";
            $first=0;
	}

	$result .= << '_STOP_'
	</tbody></table>
_STOP_
;

$_=$result;

}

#----------------------------------------------------------------------------------------
# TAG liste
#----------------------------------------------------------------------------------------


#----------------------------------------------------------------------------------------
sub display_liste_end
{
	my $type = pop;
	my @lignes = @_;

    @lignes_formates = &dopass1(@lignes);

    $result="<ul>";
    if ($type eq "num") {  $result="<ol>"; }

	foreach $e (@lignes_formates)
	{
      $result .="<li>".$e."</li>";
    }

	if ($type eq "num") 
       { $result.="<ol>"; }
    else 
       { $result.="</ul>"; }
    $_=$result;
}

#=========================================================
# pass2
#=========================================================
sub dopass2()
{
  my (@data)=(@_);
  my @res;
  my $i;
  my $j;
  my $work;

#--------------------------------------------------------------------------------------------------
# modes possibles
#
# mode 0 = mode normal
# mode 1 = mode begin sert aussi à gérer les arguments
# mode 2 = mode traitement formattage special
# mode 3 = mode end
# mode 4 = mode ligne mise en liste pour traitement au final
# mode 5 = mode exec
#--------------------------------------------------------------------------------------------------

  my $mode=0;

  for ($i=0;$i<=$#data;$i++)
  {
     $current=$data[$i];
     # reduce white
     
     # print ">$current\n";
    # nettoyage de la chaine pour éviter les erreur.
    if($current =~ m/^\.\.\[(.*)\./) {	
	$current=~s/  / /g;
	if ( $DEBUG eq "yes") { print "DEBUG $current\n"; }		
    }
     if($current =~ m/^\.\.\[(.*) (.*) (.*) (.*) (.*)\]\.\.\./) {
	     print "HALT pas plus de 4 arguments\n";
	     exit1;
     }
     
     if($current =~ m/^\.\.\[(.*) (.*) (.*) (.*)\]\.\.\./)
     {
        $cmd=$1;
        $arg1=$2;
        $arg2=$3;
        $arg3=$4;
        $mode=1;
	 }
      elsif($current =~ m/^\.\.\[(.*) (.*) (.*)\]\.\.\./)
      {
        $cmd=$1;
        $arg1=$2;
        $arg2=$3;
	$arg3=-1;
        $mode=1; 
      }
      elsif($current =~ m/^\.\.\[(.*) (.*)\]\.\.\./)
      {
        $cmd=$1;
        $arg1=$2;
	$arg2=-1;
	$arg3=-1;
        $mode=1;
      }
      elsif($current =~ m/^\.\.\[(.*)]\.\.\./)
      {
         $cmd=$1;
	 $arg1=-1;
         $arg2=-1;
	 $arg3=-1;	 
         $mode=1;
      }
      elsif($current =~ m/^\.\.\.\./)
      {

        if ($cmd  eq "console" )  {  push(@res,&display_console_end()); }
	elsif ($cmd eq "file") { push(@res,&display_file_end()); }
	elsif ($cmd eq "screen") { push(@res,&display_screen_end()); }
        elsif ($cmd  eq "code") { push(@res,&display_code_end()); }
	elsif ($cmd  eq "text") { push(@res,&display_text_end()); }
    	elsif ($cmd  eq "exec") { push(@res,&display_exec_end()); }
        elsif ($cmd  eq "table") {    push(@res,&display_table_end(@lines,$arg1,$arg2,$arg3)); @lines=(); $result=""; }
        elsif ($cmd  eq "url") { push(@res,&display_table_end(@lines,$arg1,$arg2,$arg3)); @lines=(); $result=""; }
	elsif ($cmd  eq "list") { push(@res,&display_liste_end(@lines,$arg1)); @lines=(); $result=""; }
        elsif ($cmd  eq "download") { push(@res,&display_table_end(@lines,$arg1,$arg2,$arg3)); @lines=(); $result=""; }
       	$mode=3;
      }
     
      #--------------------------------------------------------------------
      # formats specifiques mode1 (debut) mode2 (lignes) mode4 (retardé) mode 5 (exec)
      #--------------------------------------------------------------------
      
      # mode 0 = mode normal avec traduction des tags
      if ($mode eq 0) {  push(@res,$current);   }
      # mode 1 = mode begin sert aussi à gérer les arguments
      elsif ($mode eq 1) {
	
         if ( $cmd  eq "console" )  { push(@res,&display_console_begin()); $mode=2;}
	 elsif ($cmd eq "file") { push(@res,&display_file_begin()); $mode=2;}
	 elsif ($cmd eq "screen") { push(@res,&display_screen_begin()); $mode=2;}
	 elsif ($cmd  eq "code") { push(@res,&display_code_begin());$mode=2; }
	 elsif ($cmd eq "text") { push(@res,&display_text_begin());$mode=2; }
	 elsif  ($cmd eq "table") {  &couleur_par_defaut();  @lines=(); $mode=4;}
	 elsif  ($cmd eq "url") { &couleur_par_defaut();  @lines=(); $mode=4;}
	 elsif  ($cmd eq "download") { &couleur_par_defaut(); @lines=(); $mode=4;}
	 elsif  ($cmd eq "list") { @lines=(); $mode=4;}
         elsif  ($cmd eq "exec") { push(@res,&display_exec_begin()); $mode=5;}
         elsif  ($cmd eq "include") {  
	        if ($arg1 eq "text") {@lines = &file_read($arg2); push(@res,"<pre>"); push(@res,@lines); push(@res,"</pre>"); $mode=3; }
			else
	               { @lines = &file_read($arg1); push(@res,@lines);$mode=3; }
	      }
	elsif  ($cmd eq "set") { print "> $arg1 = $arg2 \n";  &set_var ($arg1,$arg2) ;   $mode=3; @lines=(); $result=""; }     
        elsif  ($cmd eq "var") { &display_var();  $mode=3; @lines=(); $result="";}      	
      }
     # mode 2 = mode traitement formattage special
     elsif ($mode eq 2) { push(@res,$current); }
     # mode 3 = mode end : on revient au mode normal
     elsif ($mode eq 3) {  $mode=0;  }
     # mode 4 = mode ligne mise en liste pour traitement au final
      elsif ($mode eq 4) {  push(@lines,$current); }  
      # mode 5 = mode exec
      elsif ($mode eq 5) { push(@res,`$current`);  } 
   }

  @_=@res;
}

#=========================================================
# pass3
#=========================================================
sub dopass3()
{
  my (@data)=(@_);
  my @res;
  my @res2;
  my $i;
  my $j;
  my $work;
  
  
  for ($i=0;$i<=$#data;$i++)
  {
     $current=$data[$i];  
      # caractères réservés
     $current =~ s/@%;/&#37;/g; 
     $current =~ s/@!;/&#33;/g; 
     $current =~ s/@.;/&#46;/g; 
     
     # convertion des caractères en html
     $current =~ s/à/\&agrave;/g;
    $current =~s/â/\&acirc;/g;
    $current =~s/ä/\&auml;/g;
    $current =~s/á/\&aacute;/g;
    $current =~s/ã/\&atilde;/g;
    $current =~ s/å/\&aring;/g;
     $current =~s/é/\&eacute;/g;
     $current =~s/è/\&egrave;/g;
     $current =~s/ê/\&ecirc;/g;
     $current =~s/ë/\&euml;/g;
     $current =~s/î/\&icirc;/g;
    $current =~ s/ï/\&iuml;/g;
     $current =~s/ô/\&ocirc;/g;
     $current =~s/ö/\&ouml;/g;
    $current =~ s/û/\&ucirc;/g;
     $current =~s/ü/\&uuml;/g;
     $current =~s/y^/\&ycirc;/g;
     $current =~s/ÿ/\&yuml;/g;
     $current =~s/«/\&laquo;/g;
     $current =~s/»/\&raquo;/g;
     $current =~s/À/\&Agrave;/g;
     $current =~s/Á/\&Aacute;/g;
     $current =~s/Â/\&Acirc;/g;
     $current =~s/Ã/\&Atilde;/g;
     $current =~s/Ä/\&Auml;/g;
     $current =~s/Å/\&Aring;/g;
     $current =~s/Æ/\&AElig;/g;
     $current =~s/Ç/\&Ccedil;/g;
     $current =~s/È/\&Egrave;/g;
     $current =~s/É/\&Eacute;/g;
     $current =~s/Ê/\&Ecirc;/g;
     $current =~s/Ë/\&Euml;/g;
     $current =~s/Ì/\&Igrave;/g;
     $current =~s/Í/\&Iacute;/g;
     $current =~s/Î/\&Icirc;/g;
     $current =~s/Ï/\&Iuml;/g;
     $current =~s/Ð/\&ETH;/g;
     $current =~s/Ñ/\&Ntilde;/g;
     $current =~s/Ò/\&Ograve;/g;
     $current =~s/Ó/\&Oacute;/g;
     $current =~s/Ô/\&Ocirc;/g;
     $current =~s/Õ/\&Otilde;/g;
     $current =~s/Ö/\&Ouml;/g;
     $current =~s/×/\&times;/g;
     $current =~s/Ø/\&Oslash;/g;
     $current =~s/Ù/\&Ugrave;/g;
     $current =~s/Ú/\&Uacute;/g;
     $current =~s/Û/\&Ucirc;/g;
     $current =~s/Ü/\&Uuml;/g;
     $current =~s/Ý/\&Yacute;/g;
     $current =~s/Þ/\&THORN;/g;
     $current =~s/ß/\&szlig;/g;
     $current =~s/æ/\&aelig;/g;
     $current =~s/ç/\&ccedil;/g;
     $current =~s/ì/\&igrave;/g;
     $current =~s/í/\&iacute;/g;
     $current =~s/ð/\&eth;/g;
     $current =~s/ò/\&ograve;/g;
     $current =~s/ó/\&oacute;/g;
     $current =~s/õ/\&otilde;/g;
     $current =~s/÷/\&divide;/g;
     $current =~s/ø/\&oslash;/g;
     $current =~s/ù/\&ugrave;/g;
     $current =~s/ú/\&uacute;/g;
     $current =~s/ÿ/\&ytilde;/g;
     $current =~s/ý/\&yacute;/g;
     $current =~s/þ/\&thorn;/g;
     $current =~s/®/\&reg;/g;
     $current =~s/©/\&copy;/g;
     $current =~s/¢/\&cent;/g;     
     push(@res,$current);
 }

  @_ =@res;
}

#=========================================================
# ascii2html
#=========================================================
sub ascii2html()
{
  my (@data)=(@_);
  my @res;
  my $i;
  my $j;
  my $work;
  
  
  for ($i=0;$i<=$#data;$i++)
  {
	  $_=$data[$i];  
    s/à/\&agrave;/g;
    s/â/\&acirc;/g;
    s/ä/\&auml;/g;
    s/á/\&aacute;/g;
    s/ã/\&atilde;/g;
    s/å/\&aring;/g;
    s/é/\&eacute;/g;
    s/è/\&egrave;/g;
    s/ê/\&ecirc;/g;
    s/ë/\&euml;/g;
    s/î/\&icirc;/g;
    s/ï/\&iuml;/g;
    s/ô/\&ocirc;/g;
    s/ö/\&ouml;/g;
    s/û/\&ucirc;/g;
    s/ü/\&uuml;/g;
    s/y^/\&ycirc;/g;
    s/ÿ/\&yuml;/g;
    s/«/\&laquo;/g;
    s/»/\&raquo;/g;
    s/À/\&Agrave;/g;
    s/Á/\&Aacute;/g;
    s/Â/\&Acirc;/g;
    s/Ã/\&Atilde;/g;
    s/Ä/\&Auml;/g;
    s/Å/\&Aring;/g;
    s/Æ/\&AElig;/g;
    s/Ç/\&Ccedil;/g;
    s/È/\&Egrave;/g;
    s/É/\&Eacute;/g;
    s/Ê/\&Ecirc;/g;
    s/Ë/\&Euml;/g;
    s/Ì/\&Igrave;/g;
    s/Í/\&Iacute;/g;
    s/Î/\&Icirc;/g;
    s/Ï/\&Iuml;/g;
    s/Ð/\&ETH;/g;
    s/Ñ/\&Ntilde;/g;
    s/Ò/\&Ograve;/g;
    s/Ó/\&Oacute;/g;
    s/Ô/\&Ocirc;/g;
    s/Õ/\&Otilde;/g;
    s/Ö/\&Ouml;/g;
    s/×/\&times;/g;
    s/Ø/\&Oslash;/g;
    s/Ù/\&Ugrave;/g;
    s/Ú/\&Uacute;/g;
    s/Û/\&Ucirc;/g;
    s/Ü/\&Uuml;/g;
    s/Ý/\&Yacute;/g;
    s/Þ/\&THORN;/g;
    s/ß/\&szlig;/g;
    s/æ/\&aelig;/g;
    s/ç/\&ccedil;/g;
    s/ì/\&igrave;/g;
    s/í/\&iacute;/g;
    s/ð/\&eth;/g;
    s/ò/\&ograve;/g;
    s/ó/\&oacute;/g;
    s/õ/\&otilde;/g;
    s/÷/\&divide;/g;
    s/ø/\&oslash;/g;
    s/ù/\&ugrave;/g;
    s/ú/\&uacute;/g;
    s/ÿ/\&ytilde;/g;
    s/ý/\&yacute;/g;
    s/þ/\&thorn;/g;
    s/®/\&reg;/g;
    s/©/\&copy;/g;
    s/¢/\&cent;/g;
    push(@res,$current);
 }
  @_=@res;
}

#=========================================================
# pass1
#=========================================================
sub dopass1()
{
  my (@data)=(@_);
  my @res;
  my $i;
  my $j;
  my $work;

  for ($i=0;$i<=$#data;$i++)
  {
    if($data[$i+1] =~ m/^\*\*\*/) {
      chomp($data[$i]);
      push(@res,"<h1>$data[$i]</h1>\n");
      $i++;
    }
    elsif ( $data[$i+1] =~ m/^\=\=\=/) {
      chomp($data[$i]);
      push(@res,"<h2>$data[$i]</h2>\n");
      $i++;
    }
    elsif (
      $data[$i+1] =~ m/^\-\-\-/) {
      chomp($data[$i]);
      push(@res,"<h3>$data[$i]</h3>\n");
      $i++;
    }
     elsif (
      $data[$i+1] =~ m/^\~\~\~/) {
      chomp($data[$i]);
      push(@res,"<h4>$data[$i]</h4>\n");
      $i++;
    }
    else { $work=$data[$i];
        if($work =~m/^ (.*)/) { $work=$1."\n"; }
        elsif($work =~ m/^$/)
	      {
	         $work = "</p>\n<p>";
	      }
        else {
		#$work = &replace($work);
        for($j=0;$j<10;$j++)
	      {
	           # bold et italique 
	           if( $work =~m/(.*)\*(.*)\*(.*)/) { $work=$1."<b>".$2."</b>".$3; }
	           if( $work =~m/(.*)_(.*)_(.*)/) { $work=$1." <i>".$2."</i> ".$3; }
	           	        
	           # langage proche du html	        
	           if( $work =~m/(.*)%pre{(.*)/) { $work=$1." <pre>".$2; }
	           if( $work =~m/(.*)%pre}(.*)/) { $work=$1." </pre>".$2;}
	             
	           if( $work =~m/(.*)%li{(.*)/) { $work=$1." <li>".$2; }
	           if( $work =~m/(.*)%li}(.*)/) { $work=$1." </li>".$2; }
	           
	           if( $work =~m/(.*)%ul{(.*)/) { $work=$1." <ul>".$2;  }
	           if( $work =~m/(.*)%ul}(.*)/) { $work=$1." </ul>".$2; }
	            
	           if( $work =~m/(.*)%ol{(.*)/) { $work=$1." <ol>".$2; }
	           if( $work =~m/(.*)%ol}(.*)/) { $work=$1." </ol>".$2;}
	           
	           if( $work =~m/(.*)%li(.*)/) { $work=$1." <li>".$2; }
	           if( $work =~m/(.*)%br(.*)/) { $work=$1." <br>".$2; }
	           if( $work =~m/(.*)%p(.*)/) { $work=$1." <p>".$2; }
	                    
	           # couleurs bold
	           if( $work =~m/(.*)%red_\((.*)\)(.*)/) { $work=$1." <font color=red><b>".$2."</b></font> ".$3;}
	           if( $work =~m/(.*)%blue_\((.*)\)(.*)/){ $work=$1." <font color=blue><b>".$2."</b></font> ".$3;}
             if( $work =~m/(.*)%green_\((.*)\)(.*)/) { $work=$1." <font color=green><b>".$2."</b></font> ".$3; }
	          if( $work =~m/(.*)%black_\((.*)\)(.*)/) { $work=$1." <font color=black><b>".$2."</b></font> ".$3; }
            
	           # couleurs         
            if( $work =~m/(.*)%red\((.*)\)(.*)/)  { $work=$1." <font color=red>".$2."</font> ".$3; }
	           if( $work =~m/(.*)%blue\((.*)\)(.*)/) { $work=$1." <font color=blue>".$2."</font> ".$3; }
             if( $work =~m/(.*)%green\((.*)\)(.*)/) { $work=$1." <font color=green>".$2."</font> ".$3;}
	           if( $work =~m/(.*)%black\((.*)\)(.*)/) { $work=$1." <font color=black>".$2."</font> ".$3;}

       
             # liens
	           if( $work =~m/(.*)\[http:(.*):(.*)\](.*)/)
	           {
	              $work = $1."<a href=\"http://$2\">$3</a>".$4;
	           }
	           if( $work =~m/(.*)\[file:(.*):(.*)\](.*)/)
	           {
	              $work = $1."<a href=\"$2\">$3</a>".$4;
	           }
	           if( $work =~m/(.*)\[file:(.*)\](.*)/)
	           {
	              $work = $1."<a href=\"$2\">$2</a>".$3;
	           }
	           if( $work =~m/(.*)\[(.*)\](.*)/)
	           {
                      if( ! $work =~m/^\.\.\[/) {
	              $work="$1<img src=\"$2\">$3" }
	           }

              # date et heure (les plus longues en premiers)
	           if( $work =~m/%longdate_uk/) {
	             $dt=&show_date_long_en();
	             $work=~s#%longdate_uk#$dt#;
	           }
	           
	           if( $work =~m/%date_uk/) {
	             $dt=&show_date_en();
	             $work=~s#%date#$dt#;
	           }

		 if( $work =~m/%longdate/) {
	               $dt=&show_date_long();
	               $work=~s#%longdate#$dt#;
	           }
	           
	           if( $work =~m/%date/) {
	             $dt=&show_date();
	             $work=~s#%date#$dt#;
	           }
	           
	           
	           if( $work =~m/%time/) {
	             $dt=&gettime();
	             $work=~s#%time#$dt#;
	           }
	   }
        }
      push(@res,$work);
    }
  }
  @_=@res;
}

#=========================================================

sub main()
{
#read the file
#@source = libfile::file_read("package_slackware.txt");

@source = &file_read($name);
@pass1 = &dopass1(@source);
@pass2 = &dopass2(@pass1);
@pass3 = &dopass3(@pass2);
@pass1 = &dopass3(@pass3);

# display it with a line
#&libfile::lines_print(@pass2);

#libfile::file_write("package_slackware.html",@pass2);
file_write($filename,@pass1);
}

#-------------------------------------------------------
# arguments verification
#-------------------------------------------------------
sub arg() {
  %options=();
  getopt("h",\%options);

  &usage if defined $options{o};

  &usage if ($#ARGV < 0) || ($#ARGV > 1);

  if ($#ARGV == 0) {
     $name=$ARGV[0];
     $_=$name;
     ($nom, $ext) = (/^(.*?)\.?([^\.]*)$/);
#     if ($nom =="") { $nom=$ext; }
     $filename=$nom.".html";
#     print "$name\n";
#     print "$filename\n";
  }

   if ($#ARGV == 1) {
       $name=$ARGV[0];
       $filename=$ARGV[1];
#     print "$name\n";
#     print "$filename\n";
    }
}

&arg();
&main();
