# BIBLIOTECA / KNIHOVNA
#!/usr/bin/perl
# última alteração: mudança do nome do projecto
#  DMS 30 Jan 2003
# diferença entre duas listas  PAR 2003 Feb 07
# produto vectorial de duas listas PAR 2003 Feb 11
# mais SGML PAR 2003 Mai 2

use locale;
use POSIX qw(locale_h);
setlocale(LC_CTYPE, "pt_PT") or die;

# Meses abreviados PT,EN,NO
@m_pt = ("Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez");
@m_en = ("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
@m_no = ("Jan","Feb","Mar","Abr","Mai","Jun","Jul","Ago","Sep","Okt","Nov","Des");
	
# Meses completos PT,EN,NO,ES,DE,FR,DA,SV,FI,NL,IS,CA,EU,EE,HU
@mc_ca=("gener","febrer","març","abril","maig","juny","juliol","agost","setembre","octubre","novembre","desembre");
@mc_da=("januar","februar","marts","april","maj","juni","juli","august","september","oktober","november","december");
@mc_de=("Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember");
@mc_et=("jaanuar","veebruar","märts","aprill","mai","juuni","juuli","august","september","oktoober","november","detsember");
@mc_en=("January","February","March","April","May","June","July","August","September","October","November","December");
@mc_eu=("urtarrila","otsaila","martxoa","apirila","maiatza","ekaina","uztaila","abuztua","iraila","urria","azaroa","abendua");
@mc_es=("enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre");
@mc_fi=("tammikuu","helmikuu","maaliskuu","huhtikuu","toukokuu","kesäkuu","heinäkuu","elokuu","syyskuu","lokakuu","marraskuu","joulukuu");
@mc_fr=("janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre");
@mc_hu=("Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember");
@mc_is=("janúar","febrúar","mars","apríl","maí","júní","júlí","ágúst","september","október","nóvember","desember");
@mc_it=("gennaio","febbraio","marzo","aprile","maggio","giugno","luglio","agosto","settembre","ottobre","novembre","dicembre");
@mc_nl=("januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december");
@mc_no=("januar","februar","mars","april","mai","juni","juli","august","september","oktober","november","desember");
@mc_pt=("Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro");
@mc_sv=("januari","februari","mars","april","maj","juni","juli","augusti","september","oktober","november","december");

# Nome do projecto em diferentes línguas
%nomeproj=(
"ptant"=>"Linguateca",
"ptant"=>"Processamento computacional do português",
"en"=>"Computational Processing of Portuguese",
"no"=>"Databehandling av portugisisk språk",
"cs"=>"Poczitaczový zprácovaní portugal&scaron;tiny"
);

return 1;

# Lê conteúdo de um ficheiro
sub Conteudo {
    open FX, shift;
    $t= join '', <FX>;
    close FX;
    return $t;
}
# Idem, mas devolve em formato lista
sub ConteudoL {
    split /\n/, &Conteudo(shift);
}

# Grava uma string num ficheiro
sub Contendo {
    open FX, "> $_[0]" || die "Não consigo abrir $_[0]\n";
    print FX $_[1];
    close FX;
}

# Lê conteúdo de um directório
sub DirConteudo {
    opendir D, shift;
    @_=grep /\w/, readdir D;
    closedir D;
    return @_;
}

# Ordena uma lista e elimina elementos repetidos
sub ListaUnica {
    %visto=();
    return sort grep { ! $visto{$_} ++} @_;
}
# Elemina elementos repetidos, mas não ordena
sub ElemUnicos {
    %visto=();
    return grep { ! $visto{$_} ++} @_;
}

sub DifLista {
        my ($l1,$l2,@lf)=@_;
        foreach $n (@$l1) { push @lf,$n unless (grep /^$n$/, @$l2) }
        return @lf;
}

sub ProdVec {
	my ($l1,$l2,@pv)=@_;
	foreach $n (@$l1) { push @pv, map { "A:$n B:$_\n"} (@$l2) }
	return @pv;
}


# Máximo e mínimo de uma lista
sub Max {
    @_=sort @_;
    return pop;
}
sub Min {
    @_=sort @_;
    return shift;
}

# Conversões de codificação

sub Cgi2Txt {
    $_=shift;
    y/\+/ /;
    s/%([A-F0-9]{2})/chr(hex($1))/egi;
    return $_;
}

sub Txt2Cgi {
    $_=shift;
    y/ /+/;
    s/([\x90-\xff])/sprintf("%%%2X",ord($1))/egi;
    return $_;
}

sub MaiusculaInicial {
	$_=shift;
	$_=~s#\b(\w)(\w+)\b#\u$1\L$2#g;
	$_=~s#\bD([aeo]s?)\b#d$1#g;
	$_=~s#\bE\b#e#g;
	return $_;
}

sub ISO2HTML {
    $_=shift;
    s/º/&ordm;/g;
    s/ª/&ordf;/g;
    s/ã/&atilde;/g;
    s/ñ/&ntilde;/g;
    s/õ/&otilde;/g;
    s/Ã/&Atilde;/g;
    s/Ñ/&Ntilde;/g;
    s/Õ/&Otilde;/g;
    s/Á/&Aacute;/g;
    s/É/&Eacute;/g;
    s/Í/&Iacute;/g;
    s/Ó/&Oacute;/g;
    s/Ú/&Uacute;/g;
    s/á/&aacute;/g;
    s/é/&eacute;/g;
    s/í/&iacute;/g;
    s/ó/&oacute;/g;
    s/ú/&uacute;/g;
    s/À/&Agrave;/g;
    s/È/&Egrave;/g;
    s/Ì/&Igrave;/g;
    s/Ò/&Ograve;/g;
    s/Ù/&Ugrave;/g;
    s/à/&agrave;/g;
    s/è/&egrave;/g;
    s/ì/&igrave;/g;
    s/ò/&ograve;/g;
    s/ù/&ugrave;/g;
    s/Ç/&Ccdeil;/g;
    s/ç/&ccedil;/g;
    s/æ/&aelig;/g;
    s/ø/&oslash;/g;
    s/å/&aring;/g;
    s/Æ/&AElig;/g;
    s/Ø/&Oslash;/g;
    s/Å/&Aring;/g;
    s/Â/&Acirc;/g;
    s/Ê/&Ecirc;/g;
    s/Î/&Icirc;/g;
    s/Ô/&Ocirc;/g;
    s/Û/&Ucirc;/g;
    s/â/&acirc;/g;
    s/ê/&ecirc;/g;
    s/î/&icirc;/g;
    s/ô/&ocirc;/g;
    s/û/&ucirc;/g;
    s/Ä/&Auml;/g;
    s/Ë/&Euml;/g;
    s/Ï/&Iuml;/g;
    s/Ö/&Ouml;/g;
    s/Ü/&Uuml;/g;
    s/ä/&auml;/g;
    s/ë/&euml;/g;
    s/ï/&iuml;/g;
    s/ö/&ouml;/g;
    s/ü/&uuml;/g;
    return $_;
}

sub HTML2ISO {
    $_=shift;
    s/&#179;/«/g;
    s/&#178;/»/g;
    s/&#(\d+);/chr($1)/ge;
    s/&ordm;/º/g;
    s/&ordf;/ª/g;
    s#&quot;#'#g;
    s/&atilde;/ã/g;
    s/&ntilde;/ñ/g;
    s/&otilde;/õ/g;
    s/&Atilde;/Ã/g;
    s/&Ntilde;/Ñ/g;
    s/&Otilde;/Õ/g;
    s/&Aacute;/Á/g;
    s/&Eacute;/É/g;
    s/&Iacute;/Í/g;
    s/&Oacute;/Ó/g;
    s/&Uacute;/Ú/g;
    s/&aacute;/á/g;
    s/&eacute;/é/g;
    s/&iacute;/í/g;
    s/&oacute;/ó/g;
    s/&uacute;/ú/g;
    s/&Agrave;/À/g;
    s/&Egrave;/È/g;
    s/&Igrave;/Ì/g;
    s/&Ograve;/Ò/g;
    s/&Ugrave;/Ù/g;
    s/&agrave;/à/g;
    s/&egrave;/è/g;
    s/&igrave;/ì/g;
    s/&ograve;/ò/g;
    s/&ugrave;/ù/g;
    s/&Ccdeil;/Ç/g;
    s/&ccedil;/ç/g;
    s/&aelig;/æ/g;
    s/&oslash;/ø/g;
    s/&aring;/å/g;
    s/&Aelig;/Æ/g;
    s/&Oslash;/Ø/g;
    s/&Aring;/Å/g;
    s/&Acirc;/Â/g;
    s/&Ecirc;/Ê/g;
    s/&Icirc;/Î/g;
    s/&Ocirc;/Ô/g;
    s/&Ucirc;/Û/g;
    s/&acirc;/â/g;
    s/&ecirc;/ê/g;
    s/&icirc;/î/g;
    s/&ocirc;/ô/g;
    s/&ucirc;/û/g;
    s/&Auml;/Ä/g;
    s/&Euml;/Ë/g;
    s/&Iuml;/Ï/g;
    s/&Ouml;/Ö/g;
    s/&Uuml;/Ü/g;
    s/&auml;/ä/g;
    s/&euml;/ë/g;
    s/&iuml;/ï/g;
    s/&ouml;/ö/g;
    s/&uuml;/ü/g;
	s#&raquo;#»#g;
	s#&laquo;#«#g;
	s#&lsquo;#'#g;
    s/&amp;/&/g;
    s/&nbsp;/ /gi;
	s#&ndash;#-#g;
	s#&quest;#\?#g;
    return $_;
}

sub UtfCod {
    return chr(128+64+$_[0]/64).chr(128+$_[0]%64);
}

sub HTML2UTF {
    $_=shift;
    s/&#([0-9A-F]+);/&hex($1)/egi;
    s/&#([0-9]+);/&UtfCod($1)/egi;
    s/&Aacute;/Ã/g;
    s/&aacute;/Ã¡/g;
    s/&Acirc;/Ã‚/g;
    s/&acirc;/Ã¢/g;
    s/&aelig;/Ã¦/g;
    s/&A[Ee]lig;/Ã†/g;
    s/&agrave;/Ã /g;
    s/&Agrave;/Ã€/g;
    s/&aring;/Ã¥/g;
    s/&Aring;/Ã…/g;
    s/&atilde;/Ã£/g;
    s/&Atilde;/Ãƒ/g;
    s/&Auml;/Ã„/g;
    s/&auml;/Ã¤/g;
    s/&ccedil;/Ã§/g;
    s/&Ccedil;/Ã‡/g;
    s/&eacute;/Ã©/g;
    s/&Eacute;/Ã‰/g;
    s/&ecirc;/Ãª/g;
    s/&Ecirc;/ÃŠ/g;
    s/&Egrave;/Ãˆ/g;
    s/&egrave;/Ã¨/g;
    s/&E[Tt][Hh];/Ã/g;
    s/&eth;/Ã°/g;
    s/&Euml;/Ã‹/g;
    s/&euml;/Ã«/g;
    s/&Iacute;/Ã/g;
    s/&iacute;/Ã­/g;
    s/&icirc;/Ã®/g;
    s/&Icirc;/ÃŽ/g;
    s/&igrave;/Ã¬/g;
    s/&Igrave;/ÃŒ/g;
    s/&Iuml;/Ã/g;
    s/&iuml;/Ã¯/g;
    s/&Ntilde;/Ã‘/g;
    s/&ntilde;/Ã±/g;
    s/&Oacute;/Ã“/g;
    s/&oacute;/Ã³/g;
    s/&ocirc;/Ã´/g;
    s/&Ocirc;/Ã”/g;
    s/&Ograve;/Ã’/g;
    s/&ograve;/Ã²/g;
    s/&oslash;/Ã¸/g;
    s/&Oslash;/Ã˜/g;
    s/&otilde;/Ãµ/g;
    s/&Otilde;/Ã•/g;
    s/&Ouml;/Ã–/g;
    s/&ouml;/Ã¶/g;
    s/&Scaron;/Å /g;
    s/&scaron;/Å¡/g;
    s/&Szlig;/ÃŸ/g;
    s/&thorn;/Ã¾/g;
    s/&Thorn;/Ãž/g;
    s/&Uacute;/Ãº/g;
    s/&uacute;/Ãš/g;
    s/&Ucirc;/Ã›/g;
    s/&ucirc;/Ã»/g;
    s/&ugrave;/Ã¹/g;
    s/&Ugrave;/Ã™/g;
    s/&uuml;/Ã¼/g;
    s/&Uuml;/Ãœ/g;
    s/&Yacute;/Ã/g;
    s/&yacute;/Ã½/g;
    s/&yuml;/Ã¿/g;
    return $_;
}

# Transforma RTF em Texto (aproximadamente...)
sub RTF2TXT {
	$_=shift;
	s/\\\'([a-f0-9]{2})/chr(hex($1))/eg;
	s/\\[lr]quote/'/g;
	s/\\.*? //g;
	{} while (s/{[^}]*?;}//sg);
	{} while (s/{[^ }]*?}//sg);
	return $_;
}
# Transforma PostScripts em texto (aproximadamente...)
sub PS2TXT {
	$_=shift;
	s#\\\(#PAR_ABR#g;
	s#\\\)#PAR_FEC#g;
	s#\\(\d\d\d)#chr(oct($1))#eg;
	@_=($_=~/\((.*?)\)/g);
	$_=join '', @t;
	s#PAR_ABR#\(#g;
	s#PAR_FEC#\)#g;
	return $_;
}
# Função data
sub Data {
    my ($lg,$j,$m,$t,$ts)=@_;
    if ($j eq "h") {
	($_,$mn,$h,$t,$m,$j+=1900)=localtime(time);
	$j+=1900;
    }
    else {
	$m--;
    }
    return &DataEN if ($lg eq "en");
    return "$t $mc_fr[$m] $j" if ($lg eq "fr");
    return "$t $mc_nl[$m] $j" if ($lg eq "nl");	
    return "$t. $mc_da[$m] $j" if ($lg eq "da");
    return "$t. $mc_de[$m] $j" if ($lg eq "de");
    return "$t. $mc_no[$m] $j" if ($lg eq "no");
    return "$t / $mc_ca[$m] / $j" if ($lg eq "ca");
    return "$t. $mc_et[$m] $j. A." if ($lg eq "et");
    return "$j.eko $mc_eu[$m]k $t" if ($lg eq "eu");
    return "$t. $mc_fi[$m]ta $j" if ($lg eq "fi");
    return "$j. $mc_hu[$m] $t." if ($lg eq "hu");
    return "den $t $mc_sv[$m] $j" if ($lg eq "sv");
    return "$t de $mc_es[$m] de $j" if ($lg eq "es");
    return "$t de $mc_pt[$m] de $j" if ($lg eq "pt");
	return "$t de $mc_pt[$m] de $j ".sprintf("%02d:%02d",$h,$mn) if ($lg eq "pt.h");

}

sub DataEN {
    $ext=($t%10<3 && ($t<10 || $t>20) ? ("th","st","nd","rd")[$t%10] : "th");
    return "$mc_en[$m] $t$ext $j";
}


# Códigos ISO Línguas
%lang=(
	"ca","catalão",
	"cs","checo",
	"da","dinamarquês",
	"de","alemão",
	"el","grego",
	"en","inglês",
	"es","castelhano",
	"fi","finlandês",
	"fr","francês",
	"gl","galego",
	"it","italiano",
        "nl","neerlandês",
	"no","norueguês",
	"pl","polaco",
	"pt","português",
	"ru","russo",
	"sv","sueco",
	"zh","chinês"
);

