#!/usr/bin/perl $versio = "0.9 "; # $Id: enb,v 1.1 1999/10/02 13:25:23 michiel Exp michiel $ " $dato = "oktobro 1999"; # Michiel Meeuwissen #uzataj dosieroj: $dosiero = "/var/www/bibliografio/fonto.html"; $donloko = "/var/www/Literaturo/www.best.com/%7Edonh/Esperanto/Literaturo"; $donretloko = "http://www.best.com/~donh/Esperanto/Literaturo/" ; # se Don uzas relativan adreson, tiam ni riparu. $mialoko = "http://131.211.121.124/bibliografio"; # la eligo kompreneble estu html-a. print "Content-type: text/html\n\n"; print "\n"; print "\n"; getinput(); # legas la 'ordon-linion' if($INPUT{'kodo'} =~ /oke/) { $mialoko .= "/8"; } #fontojn, kaj kiel ili aperu %trovlokoj = ( "A" => 'la Germana Esperanto-Biblioteko en Aalen ', "R" => 'la reto (ekz. Literaturo pagxo de Don Harlow)', "T" => 'la Internacia Esperanto-Muzeo (Trovanto) en Vieno', "K" => 'Koninklijke Bibliotheek en Hago', "B" => 'Koninklijke Bibliotheek de Belgio', "U" => 'Librokatalogo de UEA', "A1" => "Belga Antologio, pagxo ", "A2" => "Nederlanda antologio, pagxo ", "AE" => 'Arbeider-Esperantist ', "BA" => 'Belarto ', "BE" => 'Belga Esperantisto ', "BOHEO" => 'Bohema Esperantisto ', "BS" => 'La Belga Sonorilo ', "DR" => 'Dia Regno ', "EB" => 'Eterna Bukedo, pagxo', "ECO" => 'El la Camera Obscuro ', "EDL" => 'El Diversaj Lingvoj ', "EFM" => 'La frua majmateno, pagxo ', "EK" => 'Espero Katolika ', "EPP" => 'El Parnaso de Popoloj, pagxo ', "ET" => 'Esperanto Triomfonta ', "FLE" => 'Flandra Esperantisto ', "FLK" => 'Flandra Katoliko ', "FO" => 'Fonto ', "HE" => 'Holanda Esperantisto ', "HEP" => 'Holanda Esperantisto Pioniro ', "HER" => 'Heroldo de Esperanto ', "HP" => 'Hollanda Pioniro ', "ILG" => 'Interesa Legajxo ', "IN" => 'Inter Ni ', "KEG" => 'Komuna Esperanto-Gazeto ', "KRES" => 'Krestomatio - Thieme & Co, pagxo ', "LE" => 'Laborista Esperantisto ', "LEHKL" => 'Laborista Esperantisto (Haga) ', "LI" => 'Lingvo Internacia ', "LIBRO" => 'Libro nur trovita en Nederlanda Bibliografio de de Smedt, pagxoj:', "LKFLE" => 'Literatura Kurso de F.L.E, pagxo ', "LM" => 'Literatura Mondo ', "LMIG" => 'La Migranto ', "LP" => 'La Praktiko ', "LR" => 'La Revuo ', "LVS" => 'La Verda Stelo (Groningen) ', "MAN" => 'Manuskripto ', "MANSMEDT" => 'Manuskripto de kiu Petro de Smedt posedas kopion ', "MK" => 'Monda Kulturo ', "MR" => 'Malgranda Revuo (S. Engholm) ', "NCKE" => 'Esperanto-Krestomatio ', "NE" => 'Nederlanda Esperantisto ', "NEDEO" => 'Nederland - Esperanto ', "NK" => 'Nederlanda Katoliko ', "NLL" => 'Nia Lernolibro ', "NLR" => 'Nica Literatura Revuo ', "NMA" => 'Nederlando, Miraklo el Akvo, pagxo ', "NOV" => 'Elektitaj noveloj de Baekelmans pagxo ', "NP" => 'Norda Prismo ', "OE" => 'Ons Erfdeel ', "PFL" => 'Pagxoj el la flandra literaturo, pagxo ', "PHV" => 'La poemtradukoj de Hector Vermuyten pagxo ', "PRO" => 'Progreso - Svisa ', "RE" => 'Revuo Esperanto ', "RM" => 'Revuo de l\' Mondo ', "SAA" => 'Se Auxskultas la Animo, pagxo ', "SEN" => 'Sennaciulo ', "SK" => 'Suda Kruco ', "SNN" => 'Sankta Nikolao en Nederlando, pagxo ', "SON" => 'Sonorilo de ', "SR" => 'Sennacieca Revuo ', "ZG" => 'Zamenhofa gazeto ' ); # simple kampigas la kampon 'trovloko' per disigiloj '-' sub trovlok { $_=$_[0]; split /-/; } # kiel prezenti la gxenron %gxenroj = ( "P" => 'poezio', "K" => 'kanto', "Q" => 'popolkanto', "R" => 'prozo', "T" => 'teatrajxo', "E" => 'eseoj ktp' ); #Tiu cxi funkcio enlegas la dosierojn en la memoron. sub enlegu { if($INPUT{'sercxloko'} =~ "ned") { open(DOS, $dosiero) || die "Ne eblis malfermi dosieron $:"; $legu = 0; # la komenca kaj fina html-ajxoj estu ignorataj. while($linio = ) { if(!$legu) { # chomp $linio; if ($linio =~ "") { $legu = 0; next; } chomp $linio; # ni ne volas novliniojn en lasta kampo (kontrolu cxu necesas!) # print $linio."\n"; @ero = split('\;' , $linio); kreu_eron(@ero); } } close DOS; } if($INPUT{'sercxloko'} =~ "don") { opendir(DIR, $donloko) || die "Ne eblis legi $donloko: $!"; @dosieroj = grep { /^literaturo.[ot]/ } readdir(DIR); closedir DIR; foreach $dosiero (@dosieroj) { open(DOS, "$donloko/$dosiero") || die "Ne eblis malfermi dosieron $:"; if( $dosiero =~ /originala/ ) { $originalo = 1; } else { $originalo = 0; } $legu = 0; #print "$donloko/$dosiero\n====================================================\n"; while($linio = ) { #legu gxis ni trovas ion gravan while( ($linio = ) && ! ( ($linio =~ /.*<\/strong>/i) # ah, tio devas esti auxtornomo ) ) {}; if ($linio =~ /(.*):<\/strong>/i ) # ni trovas auxtornom-kapeton. { $auxtoro = $1; next; } # alikaze ni do trovis eron (la ball) if($linio =~ /blue/i ) { $gxenro = "P"; } if($linio =~ /red/i ) { $gxenro = "R"; } if($linio =~ /green/i ) { $gxenro = "T"; } if($linio =~ /purp/i ) { $gxenro = "E"; } $rezulto[6] = $gxenro; $linio = ; # povas esti , tiam relegu: if($linio =~ /NOVA.gif/i) { $linio = ; } # nun en $linio estas la trovloko if($linio =~ /$adreso\n"; $rezulto[5] = "$adreso\n"; if( !( $linio =~ /<\/a>/)) { $linio = ; } $linio =~ s///ig; $linio =~ s/<\/a>//ig; $linio =~ s/\n//g; # ne funkcias, kial ne? $linio =~ s/<.*>//g; # foje ecx aperas en la titolo, ankaux tio malaperu $linio =~ s/\"//g; # ankaux tio ne aperu en la titoloj (povas fusxi la ordigeblon) # chop $linio; #print "titolo:".iksigu($linio); $rezulto[2] = iksigu($linio); $linio=; # probable la auxtor-linio #sed if ( $linio =~ / } if ($linio =~ /^\s*\((.*)\).*/) { $auxtoro = $1; } #print "auxtoro:".iksigu($auxtoro)."\n"; $rezulto[0] = malDonnomigu(iksigu($auxtoro)); # forjxetu cxion inter () $linio =~ s/\(.*\)//g; if ($linio =~ /\[(.*)\][^\)]*$/ && !$originalo ) { #print "tradukinto:".iksigu($1)."\n"; $rezulto[4] = malDonnomigu(iksigu($1)); } #print "gxenro: ".okigu($gxenroj{$gxenro})."\n\n"; #$count++; kreu_eron(@rezulto); } } } close DOS; } # print @dosieroj."\n\n"; } #enlegu. ##-------------------------------------------------------------------------------------------------------------------- ##------ CXEFPROGRAMO ----------------------------------------------------------------------------------------------- ## Konsentite, la loko estas freneza. Mi sxangxu tion. # la funkcio 'okigu' ne nur eventuale okigas, sed ankaux povas nederlandigi. print okigu("Sercxrezulto\n"); if($INPUT{'kodo'} =~ "ikse") {print ''."\n";} else {print ''."\n";} print "\n"; print "\n"; print okigu("

Sercxrezulto

\n"); print "
\n"; print "versio:".$versio." - ".$dato."
\n"; print "Via peto:\n
"; print okigu(" auxtoro:".$INPUT{'auxtoro'}." titolo:".$INPUT{'titolo'}." tradukinto:".$INPUT{'tradukinto'}." ordo:".$INPUT{'ordo'}." koncizeco:".$INPUT{'koncizeco'}." sercxloko:".$INPUT{'sercxloko'}." kombino:".$INPUT{'kombino'}." kodo:".$INPUT{'kodo'}." \n"); print "
\n
";

open LOG, '>>/var/www/log/enb.log' || die "ne eblis malfermi log-dosieron";
$now = gmtime;
print LOG $now." IP:".$ENV{'REMOTE_ADDR'}." auxtoro:".$INPUT{'auxtoro'}." titolo:".$INPUT{'titolo'}." tradukinto:".$INPUT{'tradukinto'}." ordo:".$INPUT{'ordo'}." koncizeco:".$INPUT{'koncizeco'}." sercxloko:".$INPUT{'sercxloko'}." kombino:".$INPUT{'kombino'}." kodo:".$INPUT{'kodo'}." \n";
close LOG;


#$i=1;

#while( $i < 256 ) { print $i.": ".chr($i)."\n"; $i++; }

#exit;
$count = 0; # ni nombras la numbron de trovoj
enlegu(); # tio cxi povus okazi pli frue, sed nun gxi estas en 
, kio faciligas sencimigado, cxar simplaj printoj facile legeblus..

#if($INPUT{'kombino'} =~ /kaje/) 
#{
#    $komb1 = "&&";
#    $komb2 = "||";
#}
#else
#{
#    $komb1 = "||";
#    $komb2 = "&&";
#}

# Tja, tiu cxi konstruo por elekti la celatan ordon sendube pli elegante fareblus...
if($INPUT{'ordo'} =~ "trad")
{    
    printu_cxiujn_erojn_laux_tradukinto();
}
else
{
    if($INPUT{'ordo'} =~ "aut")
    {    
	printu_cxiujn_erojn_laux_auxtoro();
    }
    else 
    {
	if($INPUT{'ordo'} =~ "tit")
	{    
	    printu_cxiujn_erojn_laux_titolo();
	}
	else
	{
	    print "Ne jam eblas tiel sinsekvigi\n";
	}
    }
}
    
print "
\n"; print "trovitas $count ero"; if ($count != 1) {print "j.\n"; } else { print ".\n"; } # ni konsideras la pluralecon... print "
\n"; print 'respondecas Michiel <mihxil@esperanto.nu>
'; print "\n\n"; print ""; # ---------------------------------------------------------------------------------------------------- # fino de cxefprogramo # ---------------------------------------------------------------------------------------------------- sub malDonnomigu # Don indikas familinomojn per majuskloj, tio ne estas konvena por alfabetigado. { $_ = " ".$_[0]." "; s/(.*[\s])([A-ZÄÍÁÉÖÓ\-]{2,}?)([\s,].*)/$2, $1 $3/; $_; } sub okigu { $_=$_[0]; if($INPUT{'kodo'} =~ "oke") { s|cx|ĉ|g; s|Cx|Ĉ|g; s|CX|Ĉ|g; s|gx|ĝ|g; s|Gx|Ĝ|g; s|GX|Ĝ|g; s|jx|ĵ|g; s|Jx|Ĵ|g; s|JX|Ĵ|g; s|hx|ĥ|g; s|Hx|Ĥ|g; s|HX|Ĥ|g; s|sx|ŝ|g; s|Sx|Ŝ|g; s|SX|Ŝ|g; s|ux|ŭ|g; s|Ux|ŭ|g; s|UX|Ŭ|g; } if($INPUT{'kodo'} =~ "nederland") { s|gxenro|genre|g; s|auxtoro|auteur|g; s|titolo|titel|g; s|tradukinto|vertaler|g; s|jaro|jaar|g; s|poezio|poezie|g; s|prozo|proza|g; s|teatrajxo|toneel|g; s|trovloko|vindplaats|g; s|Sercxrezulto|Zoekrezultaat|g; } $_; } sub iksigu # se ni hazarde have latin-3-an enigon, ni devas povi reiksigi, cxar la programo interne supozas iksojn. # krome, per cxi tiu funkcio eblas ankaux traduki "a al ä kaj sekve, se la dua argumento estas 1. { $_=$_[0]; s|ĉ|cx|g; s|Ĉ|CX|g; s|ĝ|gx|g; s|Ĝ|GX|g; s|ĵ|jx|g; s|Ĵ|JX|g; s|ĥ|hx|g; s|Ĥ|HH|g; s|ŝ|sx|g; s|Ŝ|SX|g; s|ŭ|ux|g; s|Ŭ|UX|g; if($_[1]) # traduku unue htm-e, tiam la latin-3/1-igu auxtomatos. { s/\\\"(.)/&$1uml;/g; s/\\\'(.)/&$1acute;/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; $_; } sub kreu_eron # ensxovu unu eron en al datumbazon. { my($auxtoro, $originala_titolo, $tradukita_titolo, $jaro, $tradukinto, $aperloko, $gxenro, $rimarkoj) = @_; # print ">".$tradukinto."<\n"; gxustigu_spacojn($auxtoro, $tradukinto,$aperloko,$originala_titolo, $tradukita_titolo, $jaro); if($gxenro) {gxustigu_spacojn($gxenro);} # print ">".$tradukinto."<\n"; # kreu anoniman tabelon: $rlEro = [$auxtoro, $originala_titolo, $tradukita_titolo, $jaro, $tradukinto, $aperloko, $gxenro, $rimarkoj]; # kreu kelkajn indeksojn: # tiu cxi funkcio estas pli malpli sxtelita. Eble ne necesas fari indeksojn, cxar la tuta enmemora datumbazo estas nur # unufoje uzota. Do, versxajne entempa ordigo same bone funkcius. push (@{$auxtoro_indekso {uc($auxtoro)}}, $rlEro); # push (@{$jaro_indekso {$jaro}}, $rlEro); push (@{$tradukinto_indekso {uc($tradukinto)}}, $rlEro); push (@{$tradukita_titolo_indekso {uc($tradukita_titolo)}}, $rlEro); } sub nomo # kiom stulta funkcio povas esti... { $_=$_[0]; } sub gxustigu_spacojn { for (@_) { s/^\s*//; # forigu spacojn komenclinie s/\s*$//; # kaj fine s/\s+/ /; # kaj krome cxiuj estu unuopaj } } sub printu_eron { # if( # eval ( # "(!$INPUT{'auxtoro'} $komb2 ($rlEro->[0] =~ /$INPUT{'auxtoro'}/i )) $komb1 ". # "(!$INPUT{'titolo'} $komb2 ($rlEro->[2]) =~ /$INPUT{'titolo'}/i )) $komb1 ". # "(!$INPUT{'tradukinto'} $komb2 ($rlEro->[4] =~ /$INPUT{'tradukinto'}/i )) " # ) # ) # print "komb:".$INPUT{'kombino'}."auxt:".$INPUT{'auxtoro'}."\n"; if( (($INPUT{'kombino'} =~ /kaje/) && ( (!$INPUT{'auxtoro'} || ( $rlEro->[0] =~ /$INPUT{'auxtoro'}/i )) && (!$INPUT{'titolo'} || ( $rlEro->[2] =~ /$INPUT{'titolo'}/i )) && (!$INPUT{'tradukinto'} || ( $rlEro->[4] =~ /$INPUT{'tradukinto'}/i )) )) || (($INPUT{'kombino'} =~ /aue/) && ( ($INPUT{'auxtoro'} && ( $rlEro->[0] =~ /$INPUT{'auxtoro'}/i )) || ($INPUT{'titolo'} && ( $rlEro->[2] =~ /$INPUT{'titolo'}/i )) || ($INPUT{'tradukinto'} && ( $rlEro->[4] =~ /$INPUT{'tradukinto'}/i )) )) ) # if(0) { $count++; if($INPUT{'koncizeco'} =~ "^nurnombru") { return; } if($INPUT{'koncizeco'} =~ "^koncize") { print okigu($rlEro->[0]." - ".$rlEro->[2]." - ".$rlEro->[4]."\n"); } else { print okigu("auxtoro: ".$rlEro->[0]."\n"); if($rlEro->[1]){print "originala titolo: ".$rlEro->[1]."\n";} print okigu("titolo: ".$rlEro->[2]."\n"); if($rlEro->[4]) { print(okigu("tradukinto: ").$rlEro->[4]."\n"); } if($rlEro->[3]) { print(okigu("jaro: ").$rlEro->[3]."\n");} print okigu("trovloko: "); @trov = trovlok($rlEro->[5]); if($trovlokoj{$trov[0]}) { @trov = trovlok($rlEro->[5]); print okigu($trovlokoj{$trov[0]}); if($trov[1]){ print $trov[1]; } if($trov[2]){ print " - ".$trov[2]; } print "\n"; } else { print $rlEro->[5]."\n"; } if($rlEro->[6]) { print okigu("gxenro: "); foreach $litero (split (//, $rlEro->[6])) # traktu cxiun literon aparte. { print okigu($gxenroj{$litero})." "; } print "\n"; } if($rlEro->[7]) {print okigu("rimarko: ".$rlEro->[7]."\n");} print "\n"; } } } # La sekvaj funkcioj ankaux estas preskaux rektaj sxteloj. Ne tro demandu kiel ili funkciu, kaj kial tiel. sub printu_erojn_laux_auxtoro { my($auxtoro) = @_; foreach $rlEro (@{$auxtoro_indekso{$auxtoro}}) { printu_eron(); } } sub printu_cxiujn_erojn_laux_auxtoro { foreach $auxtoro (sort keys %auxtoro_indekso) { printu_erojn_laux_auxtoro($auxtoro); } } sub printu_erojn_laux_tradukinto { my($tradukinto) = @_; foreach $rlEro (@{$tradukinto_indekso{$tradukinto}}) { printu_eron(); } } sub printu_cxiujn_erojn_laux_tradukinto { foreach $tradukinto (sort keys %tradukinto_indekso) { printu_erojn_laux_tradukinto($tradukinto); } } sub printu_erojn_laux_titolo { my($titolo) = @_; foreach $rlEro (@{$tradukita_titolo_indekso{$titolo}}) { printu_eron(); } } sub printu_cxiujn_erojn_laux_titolo { foreach $titolo (sort keys %tradukita_titolo_indekso) { printu_erojn_laux_titolo($titolo); } } sub getinput { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); # print "buffer>".$buffer."<"; # fakte mi ne scias por kio tauxgas tion cxi. @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ s//>/g; $value =~ s!\cM!!g; $value =~ s!\n! !g; $INPUT{$name} = iksigu($value,1); } @pairs = split(/&/, $ENV{'QUERY_STRING'}); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ s//>/g; $value =~ s!\cM!!g; $value =~ s!\n! !g; $INPUT{$name} = iksigu($value,1); } } # Local variables: # coding: utf-8 # End: