#!/usr/bin/perl

# mbox2kamus 1.0
# oleh: Priyadi Iman Nurcahyo <priyadi@priyadi.id.org>
# cara penggunaan: ./mbox2kamus mbox1 mbox2 ...
# mbox2kamus akan memparse mailbox yang diberikan pada command line,
# kemudian jika ada kata yang belum terdapat di dalam kamus, maka
# ia akan menanyakan kepada user apakah kata tersebut akan ditambahkan
# ke kamus atau tidak, jika tidak maka akan ditambahkan ke daftar kata
# yang ditolak, kata yang telah ditolak tidak akan ditanyakan lagi kepada
# pengguna. pengguna juga punya pilihan untuk mengedit kata, misalnya
# untuk membetulkan kapitalisasi atau membetulkan ejaan.
# mbox2kamus akan memflush buffer-nya sebelum keluar jika mendapat
# sinyal SIGINT (ctrl-c) atau SIGTERM.

# Mohammad Nafiri (fiean@telkom.net)
# menambah opsi Upper, Lower, dan Proper (hanya huruf depan
# kata saja yang besar), dengan demikian anda tidak perlu mengedit
# hanya untuk mengubah suatu kata dari huruf besar semua menjadi huruf kecil
# semua atau sebalikbya.


$dict = "indonesian.kamus";
$tolak = "indonesian.tolak";

$SIG{INT} = \&sigcabut;
$SIG{TERM} = \&sigcabut;

if (-e $tolak) {
  open(TOLAK, "< $tolak") || die "Error";
  while(<TOLAK>) {
    chop;
    $tolak{$_} = "";
  };
  close(TOLAK);
  unlink("$tolak.orig");
  rename("$tolak","$tolak.orig");
};

if (-e $dict) {
  open(DICT, "< $dict") || die "Error";
  while (<DICT>) {
    chop;
    $dict{$_} = "";
  };
  close(DICT);
  unlink("$dict.orig");
  rename("$dict","$dict.orig");
};

open(TOLAK,"> $tolak") || die "Error";
foreach $_ (keys(%tolak)) {
  if (!m/^$/) { print TOLAK "$_\n"; }
};

open(DICT,"> $dict") || die "Error";
foreach $_ (keys(%dict)) {
  if (!m/^$/) { print DICT "$_\n"; }
};

open(TTY,"/dev/tty");

system('stty -echo -icanon eol \001');

foreach $file (@ARGV) {
  $context = "header"; # atau body
  open(FILE,"$file") || die "Error: tidak dapat membaca $file";
  while(<FILE>) {
    if ($context eq "body") {
      LOOP: {
        if (m/\G([A-Za-z]+)[^A-Za-z]*/igc) { tanya($1) ; redo LOOP };
        if (m/\G[^A-Za-z]/igc) { redo LOOP };
        if (m/^From[^:]/igc) { $context = "header" };
      }
    } else {
      if (m/^$/igc) { $context = "body" };
    };
  };
  close(FILE);
};

close(TOLAK);
close(DICT);

system('stty echo icanon eol ^@');

sub tanya {
  $a = shift;
  if (!exists $dict{$a}) {
    if (!exists $tolak{$a}) {
      print "$a? (Yes/No/Edit/Upper/Lower/Proper)\n";
      LOOP: {
        $b = getc(TTY);
        if ($b =~ m/[yY]/) {
          $dict{$a} = "";
          print DICT "$a\n";
          last; 
        };
        if ($b =~ m/[nN]/) {
          $tolak{$a} = "";
          print TOLAK "$a\n";
          last;
        }
        if ($b =~ m/[eE]/) {
          system('stty echo icanon eol ^@');
          print "-> ";
          $read = readline(*TTY);
          chop($read);
          $dict{$read} = "" ; 
          print DICT "$read\n";
          system('stty -echo -icanon eol \001');
          last;
        };
	# added by fie'
	if ($b =~ m/[uU]/) {
	   $tolak{$a}="";
	   print DICT "\U$a\E\n";
	   last;
	};
	if ($b =~ m/[lL]/) {
	   $tolak{$a}="";
	   print DICT "\L$a\E\n";
	   last;
	};
	if ($b =~ m/[pP]/) {
	   $tolak{$a}="";
	   print DICT "\u\L$a\E\n";
	   last;
	};
	# end of added
	redo LOOP;
      };
    };
  };
#  print "$a\n";
};

sub sigcabut {
  $signame = shift;
  close(DICT);
  close(TOLAK);
  system('stty echo icanon eol ^@');
  die "\n**Interupted** nerima SIG$signame\n";
};

__END__
