package ILMT::HIN::PAN::Morph;
use strict;
use warnings;
use Dir::Self;
use Data::Dumper;
use ILMT::HIN::PAN::Morph::adj_gen;
my %daemons = (
"morph" => {
"path" => __DIR__ . "/Morph/morph-socket-server.py",
"args" => "-d " . __DIR__ . "/Morph/data/dict_final.txt " .
"-e " . __DIR__ . "/Morph/data/exception_words.txt " .
"-s " . __DIR__ . "/Morph/data/suff_info.dbm.c " .
"-f " . __DIR__ . "/Morph/data/features-final.txt " .
"-p " . __DIR__ . "/Morph/data/pdgm_offset_info -port " ,
"port" => "13003"
},
"nuqta_adder" => {
"path" => __DIR__ . "/Morph/nuqta-adder.py",
"args" => "",
"port" => "12004"
}
);
my @dispatch_seq = (
"remove_sentence_tag",
"remove_ssf",
"morph_analyser",
"nuqta_adder_hin",
"add_sentence_tag",
"adjective_generator"
);
sub add_sentence_tag {
my %par = @_;
my $data = $par{'data'};
open INFILE, '<', \$data or die $!;
my $result = "\n";
while (my $line=) {
$result .= $line;
}
$result .= "\n";
return $result;
}
sub morph_analyser {
my %args = @_;
return call_daemon("morph", $args{data});
}
sub nuqta_adder_hin {
my %args = @_;
return call_daemon("nuqta_adder", $args{data});
}
sub process {
my %args = @_;
foreach my $submodule (@dispatch_seq) {
$args{'data'} = __PACKAGE__->can($submodule)->(%args);
}
return $args{"data"};
}
sub remove_sentence_tag {
my %par = @_;
my $data = $par{'data'};
open INFILE, '<', \$data or die $!;
my $result = "";
while(my $line=) {
if($line=~/^) {
next;
} else {
$result .= $line;
}
}
return $result;
}
sub remove_ssf {
my %par = @_;
my $data = $par{'data'};
open INFILE, '<', \$data or die $!;
my $result = "";
my $_prev = 1;
while (my $line=) {
if ($line=~m/^0\t/) {
$_prev=2;
next;
} elsif ($line=~/^\t\)\)/ and $_prev=~/^\t\)\)/) {
$_prev="\t))";
next;
} else {
$_prev="$line";
$result .= "$line";
}
}
return $result;
}
sub run_daemons {
my @daemon_names = @_;
foreach my $daemon_name (@daemon_names) {
my %daemon = %{$daemons{$daemon_name}};
my $cmd = "$daemon{path} $daemon{args} $daemon{port} &";
my $runfile = __DIR__ . "/run/${daemon_name}_$daemon{port}";
system("flock -e -w 0.01 $runfile -c '$cmd'") == 0
or warn "[" . __PACKAGE__ . "]: Port $daemon{port} maybe unavailable! $?\n";
}
}
sub call_daemon {
my ($daemon_name, $input) = @_;
my $port = $daemons{$daemon_name}{port};
my ($socket, $client_socket);
$socket = new IO::Socket::INET (
PeerHost => '127.0.0.1',
PeerPort => $port,
Proto => 'tcp',
) or die "ERROR in Socket Creation : $!\n";
$socket->send("$input\n");
my $result = "";
while (my $line = $socket->getline) {
$result .= $line;
}
$socket->close();
return $result;
}
sub adjective_generator {
my %par = @_;
my $data = $par{'data'};
my $result = "";
adj_gen(\$data, \$result);
return ($result);
}
run_daemons(("morph", "nuqta_adder"));
1;