#! /usr/bin/perl

# skrypt wspomagajcy rezerwacj tumaczenia pliku dla PTM

# Pamitaj, prosz o skopiowaniu tego skryptu do prywatnego katalogu
# z plikami wykonywalnymi (np. ~/bin). Zmiany przeprowad na takiej,
# prywatnej kopii. Nie chcielibymy, by zmienia si w repozytorium PTM
# kadorazowo z kolejnymi osobami, tworzc zamieszanie, prawda?

###################################################
#
#   HQ, X-1999
#   w podzikowaniu Przemkowi Borysowi za PTM
#   i inspiracj tumaczeniami perl*.1
#
###################################################


############################ KONFIGURACJA ##################################

# ----------------------- to raczej nie wymaga zmian -----------------------

# cieka do lokalnych zasobw pl_PL
#
$PLPL = "..";

# cieka alternatywna - gdy uruchamiamy np. z ~/bin
#
$PLALTERNATE = $ENV{PTM_PL_DIR};

# Twj adres poczty elektronicznej - ten sam, ktry identyfikuje ci 
# w pliku 'robotnicy' z moduu pl_PL
#
$EMAIL = $ENV{PTM_EMAIL};	

# Twoje imi i nazwisko
#
$IMIE = $ENV{PTM_NAME};

# Katalog, gdzie przechowujesz oryginay do przetumaczenia.
# Nie uywaj prosz listy katalogw. Ten skrypt na razie jest zbyt gupi :(
#
($MAN) = split(":",$ENV{MANPATH});   # pierwszy katalog z $MANPATH wystarczy ;)
$MAN="/usr/man" if ($MAN eq "");     # nieustawione rodowisko - to si zdarza

# czy rezerwowany plik doda na koniec ju wzitych przez siebie
$NA_KONIEC = 1;

# ------------------ a tego na pewno nie zmieniamy ---------------------------

# pena nazwa pliku tumaczy
$TLUMACZE = "$PLPL/zasoby/robotnicy";

# tymczasowy plik tumaczy (w tym samym katalogu co $TLUMACZE)
$TMP_TLUM = "$TLUMACZE.tmp";

# kopia archiwalna pliku tumaczy (w tym samym katalogu co $TLUMACZE)
$OLD_TLUM = "$TLUMACZE~";

############################################################################

# tu bdziemy przechowywa dane tumaczy
@ludzie=();

# tablica @pliki bdzie zawiera skalary przechowujce odwoania do anonimowych
# tablic z plikami danego tumacza. Rozmiar tablicy @pliki jest, oczywicie,
# rwny rozmiarowi tablicy @ludzie. W ten sposb emulujemy tablice 2-wymiarowe.
#
# Ta metoda nie jest najlepsza, gdy wymaga przechowania caego pliku w pamici;
# uyto jej tutaj gownie do celw edukacyjnych (perlref.1)
@pliki=();

# szybki dostp do par plik-tumacz przez tablic asocjacyjn
%czyj={};

# ---------------------------------------------------------------------------
sub czytajROB() {
    open(PLIK,"< $TLUMACZE") or die "Nie mog otworzy pliku '$TLUMACZE'\n";
    while (defined($wiersz=<PLIK>)) {
	chomp($wiersz);
	if ($wiersz=~/\//) {  # po tym poznamy wizytwk tumacza
	    if ($#ludzie == $#pliki) { # poprzedni tumacz nie mia plikw
		push @ludzie, $wiersz  # rozumiem, e to wsplne tumaczenie
		}
	    else {
		@ludzie[$#ludzie] = "@ludzie[$#ludzie]\n$wiersz";
		}
	    next;
	    }
	push @{$pliki[$#ludzie]}, $wiersz;  # plik do odpowiedniej podtablicy
	}
    close(PLIK);
    # czyj jest dany plik, umiecimy w haszu (szybkie szukanie)
    for ($i=0; $i<=$#ludzie; $i++) {
        foreach $plik (@{$pliki[$i]}) {	# pliki i-tego tumacza
	    $czyj{$plik} = @ludzie[$i];
	    }
	}
    }  # end sub
# ---------------------------------------------------------------------------
sub TakNie($) { # parametr - tekst zachty, zwraca logiczn wg tak/nie
    my $zacheta = shift;
    my $odp = "";
    while (!($odp=~/^\s*[TtYyNn]/)) {
        print "$zacheta"; $odp=<STDIN>;
        chomp($odp);
        }
    return ($odp =~/^\s*[TtYy]/)
    }
# ---------------------------------------------------------------------------
sub Dopisz($) { # dopisuje plik do listy tumaczonych przez Ciebie
    my $plik = shift;
    open(TMP_TLUM,"> $TMP_TLUM") 
	or die "Nie mog utworzy tymczasowego pliku '$TMP_TLUM'\n"; 
    for ($i=0; $i<=$#ludzie; $i++) {
	print TMP_TLUM "@ludzie[$i]\n";		# tumacz
	if ((@ludzie[$i]=~/$IMIE/) && ! $NA_KONIEC) {	# pocz.wasnej sekcji
	    print TMP_TLUM "$plik\n";
	    }
        foreach $staryplik (@{$pliki[$i]}) {	# pliki tumacza
	    print TMP_TLUM "$staryplik\n";
	    }
	if ((@ludzie[$i]=~/$IMIE/) && $NA_KONIEC) {	# koniec wasnej sekcji
	    print TMP_TLUM "$plik\n";
	    }
	}
    close(TMP_TLUM);
    # a teraz zamieniamy na waciwy
    unlink($OLD_TLUM);
    rename($TLUMACZE, $OLD_TLUM)
	or die "Kopoty ze zmiana nazwy '$TLUMACZE'\n";
    rename($TMP_TLUM, $TLUMACZE)
	or die "Kopoty ze zmian nazwy tymczasowego '$TMP_TLUM'\n";
    print "Dokonano rezerwacji '$plik'.\n";
    } # end sub
# ---------------------------------------------------------------------------
sub StatusTlumaczenia($) {  # drukuje status tumaczonego pliku
    my $plk = shift;
    print "$czyj{$plk}\n";
    ($cyf)=($plk=~/\.([n1-9])[^.]*$/);
    if (-f "$PLPL/man$cyf/$plk") {
        print "i przetumaczony.\n";
        }
    else {
        print "cho jeszcze nie gotowy.\n"
        }
    }
# ---------------------------------------------------------------------------
sub Rezerwacja($) {	# szukanie moliwoci rezerwacji pliku
    my $plik = shift;

    $jest = 0 ;
    for ($i=0; $i<=$#ludzie; $i++) {
	if (@ludzie[$i]=~/$IMIE/) {$jest = 1}
	}
    die "Niestety, nie znalazem Ci wrd tumaczy. Skrypt jest zbyt gupi :-(\n"
	unless $jest;
	
    die "Podaj, prosz, nazw pliku bez cieki.\n"
	if ($plik=~/\//);

    ($cyfra)=($plik=~/\.([n1-9])[^.]*$/);
    die "Nie mog znale sekcji, w ktrej miaby by '$plik'.\n"
	if ($cyfra eq "");

    ($baza)=($plik=~/(.*\.[n1-9])[^.]*$/); # obetnij liter po numerze sekcji
    $jest = 0 ;
    if ( exists $czyj{$plik} ) {
	$jest = 1;
	print "\nPlik '$plik' ju wzity przez:\n";
	&StatusTlumaczenia($plik);
        }
    else {  # nie ma pliku z dokadnie tak nazw
        if ( ($baza ne $plik) && (exists $czyj{$baza}) ) {
	    print "\nPodobny plik '$baza', wzity przez:\n";
	    &StatusTlumaczenia($baza);
            if (! TakNie("Moliwe, e to ten sam. Kontynuowa? ")) {
		$jest = 1;
		}
	    }
        if ($baza eq $plik) { # podano *.[1-9], moe tumaczono *.[1-9][a-z]?
	    $znalazl = 0;
	    foreach $plk (keys %czyj) {
		if ($plk=~/($baza[a-zA-Z])$/) {
		    $znalazl = 1;
		    $inny = $1;
		    }
		}
	    if ($znalazl) {
		print "\nPodobny plik '$inny', wzity przez:\n";
		&StatusTlumaczenia($inny);
        	if (! TakNie("Moliwe, e to ten sam. Kontynuowa? ")) {
		    $jest = 1;
		    }
		}
	    }
	}
    if (! $jest) {
        if (-f "$PLPL/man$cyfra/$plik") {
	    print "\nDziwne, plik '$plik' jest w zasobach PTM,\n";
	    print "ale brak adnotacji na licie tumaczy. Czyby literwka?\n";
	    }
        elsif (-f "$PLPL/man$cyfra/$baza") {
	    print "\nW zasobach PTM jest plik o zblionej nazwie '$baza',\n";
	    print "ale brak adnotacji na licie tumaczy. Czyby ten sam?\n";
            if (TakNie("Czy mimo to chcesz go zarezerwowa? ")) {
	        &Dopisz($plik);
	        }
	    }
	else {
	    if (-f "$MAN/man$cyfra/$plik") {
	        print "\nWyglda na to, e moesz wzi '$plik'\n";
	        if (TakNie("Czy chcesz go zarezerwowa? ")) {
		    &Dopisz($plik);
		    }
	        }
	    elsif (-f "$MAN/man$cyfra/$baza") {
		print "Nie znalazem pliku oryginau, ale jest o podobnej nazwie\n";
	        print "\t'$MAN/man$cyfra/$baza'.\n";
	        if (TakNie("Czy chcesz go zarezerwowa pod nazw '$plik'? ")) {
		    &Dopisz($plik);
		    }	
	        elsif (TakNie("A pod oryginaln nazw ('$baza')? ")) {
		    &Dopisz($plik);
		    }	
		}
	    else {  # brak oryginau
	        print "\nNikt jeszcze nad nim nie pracowa, ";
	        print "ale nie znalazem pliku oryginau\n";
	        print "\t'$MAN/man$cyfra/$plik'.\n";
	        if (TakNie("Czy mimo to chcesz go zarezerwowa? ")) {
		    &Dopisz($plik);
		    }	
		}
	    }
	    } # brak takiego pliku
    print "\n";
    } # end sub Rezerwacja
# ---------------------------------------------------------------------------

############################################################################

$plik=shift or die <<SYNTAX;
Skadnia: $0 plik
Rezerwuje do tumaczenia w PTM podany plik podrcznika man.
SYNTAX

if (! -d "$PLPL/CVS" || ! -d "$PLPL/zasoby" || ! -f "$PLPL/FAQ")
	{
	if ("$PLALTERNATE" ne "")
	    {
	    $PLPL = "$PLALTERNATE";
	    $TLUMACZE = "$PLPL/zasoby/robotnicy";
	    $TMP_TLUM = "$TLUMACZE.tmp";
	    $OLD_TLUM = "$TLUMACZE~";
	    }
	else
	    {
	    print "\nUWAGA!\nObecna wersja programu przystosowana jest do pracy\nbezporednio z poziomu katalogu CVS.\
Jeli chcesz uywa jej z tej lokacji musisz ustawi zmienn rodowiskow PTM_PL_DIR,\nwskazujc na pooenie katalogu pl_PL z CVS-u.\
Na przykad: export PTM_PL_DIR=\"\$HOME/cvs/pl_PL\"\n";
	    exit (1);
	    }
	}

if ($EMAIL eq "")
    {
    print "Wyeksportuj zmienn PTM_EMAIL zawierajc twj adres poczty\nelektronicznej identyfikujcy ci w pliku robotnicy\n";
    exit (1);
    }

if ($IMIE eq "")
    {
    print "Wyeksportuj zmienn PTM_NAME zawierajc twoje imi i nazwisko,\ntakie jak identyfikujce ci w pliku robotnicy\n";
    exit (1);
    }
print "\nUytkownik: $IMIE <$EMAIL>\n";

&czytajROB;	 # "zassanie" caego pliku tumaczy do zmiennych
&Rezerwacja($plik);

# end of script
