#!/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.
Pourquoi se priver de *awk* alors?
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."$j"; } i
}
$a=$r;
$r="";
$j="";
@b=split/%blue\(/,$a;
foreach $j (@b) {
if ($j ne "") {
$j=~ s/\)/<\/font>/;
$r=$r."$j"; } i
}
$a=$r;
$r="";
$j="";
@b=split/%green\(/,$a;
foreach $j (@b) {
if ($j ne "") {
$j=~ s/\)/<\/font>/;
$r=$r."$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='; }
sub display_console_end() { $_ = '
'; }
#---------------------------------------------------------
# TAG screen
#---------------------------------------------------------
sub display_screen_begin() { $_ = ''; }
sub display_screen_end() { $_ = '
'; }
#---------------------------------------------------------
# TAG code (same model as console)
#---------------------------------------------------------
sub display_code_begin() { $_ = ''; }
sub display_code_end() { $_ = '
'; }
#---------------------------------------------------------
# TAG text (same model as console)
#---------------------------------------------------------
sub display_text_begin() { $_ = ''; }
sub display_text_end() { $_ = '
'; }
#---------------------------------------------------------
# TAG file
#---------------------------------------------------------
sub display_file_begin() { $_ = ''; }
sub display_file_end() { $_ = '
'; }
#---------------------------------------------------------
# TAG include
#---------------------------------------------------------
sub display_include_begin() { }
sub display_include_end() { }
#---------------------------------------------------------
# TAG exec (presentation comme console)
#---------------------------------------------------------
sub display_exec_begin()
{
$_ = << "EOF"
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_"
EOF
;
}
sub display_exec_end()
{
$_ = <<'EOF'
_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 .="
_STOP_
;
$_=$result;
}
#----------------------------------------------------------------------------------------
# TAG liste
#----------------------------------------------------------------------------------------
#----------------------------------------------------------------------------------------
sub display_liste_end
{
my $type = pop;
my @lignes = @_;
@lignes_formates = &dopass1(@lignes);
$result="\n";
# ------------------ TABLE -----------------------------------
if($cmd =~ m/table/) {
for $i (0..$#tab) {
if($first==1) {
$result .=" \n";
$first=0;
}
$result .= << '_STOP_'
$tab[$i] \n"; }
else {
$result .=" $tab[$i] \n"; }
}
# ------------------ DOWNLOAD --------------------------------
} elsif ($cmd =~ m/download/) {
for $i (0..$#tab-1) {
$result .=" $tab[$i] \n"; }
$result .=" $tab[$i] \n";
}
# ------------------ URL --------------------------------
elsif ($cmd =~ m/url/) {
$result .=" $tab[1] \n";
if ($#tab >1)
{
for $i (2..$#tab) {
$result .=" $tab[$i] \n"; }
}
}
# ------------------------------------------------------------
$result .="";
if ($type eq "num") { $result="
"; }
$_=$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,""; }
foreach $e (@lignes_formates)
{
$result .="
"; }
else
{ $result.="
"); push(@res,@lines); push(@res,"
"); $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/@%;/%/g;
$current =~ s/@!;/!/g;
$current =~ s/@.;/./g;
# convertion des caractères en html
$current =~ s/à/\à/g;
$current =~s/â/\â/g;
$current =~s/ä/\ä/g;
$current =~s/á/\á/g;
$current =~s/ã/\ã/g;
$current =~ s/å/\å/g;
$current =~s/é/\é/g;
$current =~s/è/\è/g;
$current =~s/ê/\ê/g;
$current =~s/ë/\ë/g;
$current =~s/î/\î/g;
$current =~ s/ï/\ï/g;
$current =~s/ô/\ô/g;
$current =~s/ö/\ö/g;
$current =~ s/û/\û/g;
$current =~s/ü/\ü/g;
$current =~s/y^/\ŷ/g;
$current =~s/ÿ/\ÿ/g;
$current =~s/«/\«/g;
$current =~s/»/\»/g;
$current =~s/À/\À/g;
$current =~s/Á/\Á/g;
$current =~s/Â/\Â/g;
$current =~s/Ã/\Ã/g;
$current =~s/Ä/\Ä/g;
$current =~s/Å/\Å/g;
$current =~s/Æ/\Æ/g;
$current =~s/Ç/\Ç/g;
$current =~s/È/\È/g;
$current =~s/É/\É/g;
$current =~s/Ê/\Ê/g;
$current =~s/Ë/\Ë/g;
$current =~s/Ì/\Ì/g;
$current =~s/Í/\Í/g;
$current =~s/Î/\Î/g;
$current =~s/Ï/\Ï/g;
$current =~s/Ð/\Ð/g;
$current =~s/Ñ/\Ñ/g;
$current =~s/Ò/\Ò/g;
$current =~s/Ó/\Ó/g;
$current =~s/Ô/\Ô/g;
$current =~s/Õ/\Õ/g;
$current =~s/Ö/\Ö/g;
$current =~s/×/\×/g;
$current =~s/Ø/\Ø/g;
$current =~s/Ù/\Ù/g;
$current =~s/Ú/\Ú/g;
$current =~s/Û/\Û/g;
$current =~s/Ü/\Ü/g;
$current =~s/Ý/\Ý/g;
$current =~s/Þ/\Þ/g;
$current =~s/ß/\ß/g;
$current =~s/æ/\æ/g;
$current =~s/ç/\ç/g;
$current =~s/ì/\ì/g;
$current =~s/í/\í/g;
$current =~s/ð/\ð/g;
$current =~s/ò/\ò/g;
$current =~s/ó/\ó/g;
$current =~s/õ/\õ/g;
$current =~s/÷/\÷/g;
$current =~s/ø/\ø/g;
$current =~s/ù/\ù/g;
$current =~s/ú/\ú/g;
$current =~s/ÿ/\&ytilde;/g;
$current =~s/ý/\ý/g;
$current =~s/þ/\þ/g;
$current =~s/®/\®/g;
$current =~s/©/\©/g;
$current =~s/¢/\¢/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/à/\à/g;
s/â/\â/g;
s/ä/\ä/g;
s/á/\á/g;
s/ã/\ã/g;
s/å/\å/g;
s/é/\é/g;
s/è/\è/g;
s/ê/\ê/g;
s/ë/\ë/g;
s/î/\î/g;
s/ï/\ï/g;
s/ô/\ô/g;
s/ö/\ö/g;
s/û/\û/g;
s/ü/\ü/g;
s/y^/\ŷ/g;
s/ÿ/\ÿ/g;
s/«/\«/g;
s/»/\»/g;
s/À/\À/g;
s/Á/\Á/g;
s/Â/\Â/g;
s/Ã/\Ã/g;
s/Ä/\Ä/g;
s/Å/\Å/g;
s/Æ/\Æ/g;
s/Ç/\Ç/g;
s/È/\È/g;
s/É/\É/g;
s/Ê/\Ê/g;
s/Ë/\Ë/g;
s/Ì/\Ì/g;
s/Í/\Í/g;
s/Î/\Î/g;
s/Ï/\Ï/g;
s/Ð/\Ð/g;
s/Ñ/\Ñ/g;
s/Ò/\Ò/g;
s/Ó/\Ó/g;
s/Ô/\Ô/g;
s/Õ/\Õ/g;
s/Ö/\Ö/g;
s/×/\×/g;
s/Ø/\Ø/g;
s/Ù/\Ù/g;
s/Ú/\Ú/g;
s/Û/\Û/g;
s/Ü/\Ü/g;
s/Ý/\Ý/g;
s/Þ/\Þ/g;
s/ß/\ß/g;
s/æ/\æ/g;
s/ç/\ç/g;
s/ì/\ì/g;
s/í/\í/g;
s/ð/\ð/g;
s/ò/\ò/g;
s/ó/\ó/g;
s/õ/\õ/g;
s/÷/\÷/g;
s/ø/\ø/g;
s/ù/\ù/g;
s/ú/\ú/g;
s/ÿ/\&ytilde;/g;
s/ý/\ý/g;
s/þ/\þ/g;
s/®/\®/g;
s/©/\©/g;
s/¢/\¢/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,"$data[$i]
\n");
$i++;
}
elsif ( $data[$i+1] =~ m/^\=\=\=/) {
chomp($data[$i]);
push(@res,"$data[$i]
\n");
$i++;
}
elsif (
$data[$i+1] =~ m/^\-\-\-/) {
chomp($data[$i]);
push(@res,"$data[$i]
\n");
$i++;
}
elsif (
$data[$i+1] =~ m/^\~\~\~/) {
chomp($data[$i]);
push(@res,"$data[$i]
\n");
$i++;
}
else { $work=$data[$i];
if($work =~m/^ (.*)/) { $work=$1."\n"; }
elsif($work =~ m/^$/)
{
$work = "
"; } else { #$work = &replace($work); for($j=0;$j<10;$j++) { # bold et italique if( $work =~m/(.*)\*(.*)\*(.*)/) { $work=$1."".$2."".$3; } if( $work =~m/(.*)_(.*)_(.*)/) { $work=$1." ".$2." ".$3; } # langage proche du html if( $work =~m/(.*)%pre{(.*)/) { $work=$1."
".$2; } if( $work =~m/(.*)%pre}(.*)/) { $work=$1."".$2;} if( $work =~m/(.*)%li{(.*)/) { $work=$1."
".$2; }
# couleurs bold
if( $work =~m/(.*)%red_\((.*)\)(.*)/) { $work=$1." ".$2." ".$3;}
if( $work =~m/(.*)%blue_\((.*)\)(.*)/){ $work=$1." ".$2." ".$3;}
if( $work =~m/(.*)%green_\((.*)\)(.*)/) { $work=$1." ".$2." ".$3; }
if( $work =~m/(.*)%black_\((.*)\)(.*)/) { $work=$1." ".$2." ".$3; }
# couleurs
if( $work =~m/(.*)%red\((.*)\)(.*)/) { $work=$1." ".$2." ".$3; }
if( $work =~m/(.*)%blue\((.*)\)(.*)/) { $work=$1." ".$2." ".$3; }
if( $work =~m/(.*)%green\((.*)\)(.*)/) { $work=$1." ".$2." ".$3;}
if( $work =~m/(.*)%black\((.*)\)(.*)/) { $work=$1." ".$2." ".$3;}
# liens
if( $work =~m/(.*)\[http:(.*):(.*)\](.*)/)
{
$work = $1."$3".$4;
}
if( $work =~m/(.*)\[file:(.*):(.*)\](.*)/)
{
$work = $1."$3".$4;
}
if( $work =~m/(.*)\[file:(.*)\](.*)/)
{
$work = $1."$2".$3;
}
if( $work =~m/(.*)\[(.*)\](.*)/)
{
if( ! $work =~m/^\.\.\[/) {
$work="$1$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();