#!/usr/bin/perl

use strict;
use Search::Dict;
use CGI qw(:standard);


my $query=new CGI;

print header;
print html_start;
print <<EOF;
<div style="background: url(http://www.pinseri.com/pictures/suikale.gif)">
<a href="/"><img src="/pictures/logo.gif" alt="pinseri (tärkeitä asioita)" width="345" height="90" border="0" style="margin-left: 20px;"></a>
</div>
EOF
    ;

print h1("Veijo kirjoittaa blogia");

my $aloituslause=lc($query->param("a"));
$aloituslause=~s/[^a-zåäöÅÄÖA-Z0-9\s]//g;
my $max_lause=$query->param("m");
if ($max_lause > 500) {$max_lause=500};
if ($max_lause < 1) {$max_lause=50};

my $persoonallisuus="/home/customers/pinseri/blog-triplets.txt";
my $max_virkkeet=5;
my $nyt_virke=1;

if ($aloituslause ne "") {
    my $teksti="";
    $teksti=&veijo_puhuu($aloituslause);

    $teksti=~s/</&lt;/g;
    $teksti=~s/>/&gt;/g;
#    $teksti=~s/&/&amp;/g;

#  my $uusi_virke=&veijo_puhuu($aloituslause);
#  $teksti.=$uusi_virke;
#  while ($nyt_virke < $max_virkkeet && $uusi_virke ne "?") {
#      $nyt_virke++;
#      my @splitted=split(" ", $uusi_virke);
#      my $new_seed=join(" ", @splitted[$#splitted-2..$#splitted]);
#      $uusi_virke=&veijo_puhuu($uusi_virke);
#      $teksti.=$uusi_virke;
#  }

    my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)
	=localtime(time);
    $mon++;
    $year+=1900;
    $hour=sprintf("%02d", $hour);
    $min=sprintf("%02d", $min);
    
    print p($teksti);
    
    print p("<small>Posted by Veijo, $mday.$mon.$year $hour:$min</small>");
}

print hr;
print start_form();
print p("Iskikö inspiraation puute? Anna Veijon kirjoittaa blogijuttusi. Kirjoita hieman jutun alkua ja Veijo täyttää loput.");
print p("Kirjoitukset pohjautuvat tämänhetkisiin kirjoituksiin blogistanissa ja, kuten varmasti huomaat, ovat koneellisesti tehtyjä ja siksi joskus hieman sekavia. Veijo on vielä hieman kokeiluvaiheessa, joten joskus tekstin sekaan saattaa vuotaa hieman koodiakin. Kokeile silloin uudelleen.");
print "<p>Kirjoita aloituslause (muutama sana riittää): ";
print textfield("a");
print "<p>Montako sanaa generoidaan (max. 500): ";
print textfield("m");
print "<p>", submit(-value=>"Generoi");
print end_form;
print <<EOF;
<p>
<p>
<p>
<!--WEBBOT bot="HTMLMarkup" startspan ALT="Site Meter" -->
<script type="text/javascript" language="JavaScript">var site="sm6samik"</script>
<script type="text/javascript" language="JavaScript1.2" src="http://sm6.sitemeter.com/js/counter.js?site=sm6samik">
</script>
<noscript>
<a href="http://sm6.sitemeter.com/stats.asp?site=sm6samik" target="_top">
<img src="http://sm6.sitemeter.com/meter.asp?site=sm6samik" alt="Site Meter" border=0></a>
</noscript>
<!-- Copyright (c)2002 Site Meter -->
<!--WEBBOT bot="HTMLMarkup" Endspan -->
EOF
    ;
print html_end;

sub veijo_puhuu {
  my ($lause)=@_;
  $lause=~tr/[a-zA-ZåäöÅÄÖ\:\;\)\(\-\@0-9\/\\\.\_\~\,]/ /cs;
  $lause=~tr/[A-ZÅÄÖ]/[a-zåäö]/;
  my ($sana, @seedwords);
  my @seedwords=split(/\s+/, $lause);
  my $num_seedwords=scalar(@seedwords);
  open (TRIPLETS, $persoonallisuus) || die "en voi avata persoonallisuustiedostoa $persoonallisuus";
  my ($i, $ehdokas, $lopullinen);
  if ($num_seedwords < 3) {
    $ehdokas=rakenna_lause($seedwords[$i]);
    if ($ehdokas ne $seedwords[$i]) {
      $lopullinen=$ehdokas;
    }
  }
#  print "Ex ($seedwords[$i]): |$ehdokas| ($lopullinen)\n";
  foreach ($i=0; $i<scalar(@seedwords)-1; $i++) {
    $ehdokas=rakenna_lause($seedwords[$i], $seedwords[$i+1]);
    if (length($ehdokas) > length($lopullinen) && $ehdokas ne "$seedwords[$i] $seedwords[$i+1]") {
      $lopullinen=$ehdokas;
    }
#    print "E$i ($seedwords[$i], $seedwords[$i+1]): |$ehdokas| ($lopullinen)\n";
  }
  if ($lopullinen eq "") {
    $ehdokas=rakenna_lause($seedwords[$i]);
    if (length($ehdokas) > length($lopullinen) && $ehdokas ne $seedwords[$i]) {
      $lopullinen=$ehdokas;
    }
  }
#  print "Ez ($seedwords[$i]): |$ehdokas| ($lopullinen)\n";
  if ($lopullinen eq "") {
    $lopullinen="?";
  }
  close (TRIPLETS);
  return $lopullinen;
}

sub rakenna_lause {
  my @seedwords=@_;
#  print "Seedwords: ", join(" ", @seedwords), "\n";
  my $jatkuu=1;
  my $counter=1;
  my $num_seedwords=scalar(@seedwords);
  my (@tulos);
  push @tulos, @seedwords;
  while($jatkuu) {
#    print "HAE JATKOSANA: |$seedwords[0]|$seedwords[1]|\n";
    my ($jatkosana);
    if ($num_seedwords==1) {
      $jatkosana=hae_jatkosana($seedwords[0]);
    } else {
      $jatkosana=hae_jatkosana($seedwords[0], $seedwords[1]);
    }
#    if (substr($jatkosana, length($jatkosana)-1, 1) eq ".") {
#      $jatkuu=0;
#    }
#    elsif ($jatkosana eq "") {
    if ($jatkosana eq "") {
      $jatkuu=0;
    }
    elsif  ($counter>$max_lause) {
      $jatkuu=0;
      $jatkosana.="...";
    }
    push @tulos, $jatkosana;
    if ($num_seedwords>1) {
      $seedwords[0]=$seedwords[1];
      $seedwords[1]=$jatkosana;
    } else {
      $seedwords[1]=$jatkosana;
      $num_seedwords=2;
    }
    $counter++;
  }
  #print " ($counter)\n";
  my $tulos=join (" ", @tulos);
  $tulos=~s/\s+$//;
  return $tulos;
}

sub hae_jatkosana {
  seek(TRIPLETS,0,0);
  my @seedwords=@_;
  my $seedwords_lkm=scalar(@seedwords);
#  print "\n", join(" ", @seedwords), ":";
  my $searchterm=join('|', @seedwords);
  $searchterm.="|";
  my $searchterm_l=length($searchterm);
  look (*TRIPLETS, $searchterm, 0, 0);
  my $matches=1;
  my (@sanat_all);
  LOOP: while ($matches) {
    my $rivi=<TRIPLETS>;
    chomp $rivi;
#    print $rivi, "\n";
    if (substr($rivi,0,$searchterm_l) ne $searchterm) {
      $matches=0;
#      print ",NM";
      last LOOP;
    }
#    print ",MA";
    my ($sanat, $freq)=split('\t', $rivi);
    my @sanat=split('\|', $sanat);
    my ($i);
#    for ($i=0; $i<$freq; $i++) {
      if ($seedwords_lkm==1) {
	push @sanat_all, $sanat[1];
      } else {
	push @sanat_all, $sanat[2];
      }
      last LOOP if (scalar(@sanat_all) > 1000);
#    }
  }
#  print ": ", join('|', @sanat_all), "\n";
  my $lkm=scalar(@sanat_all);
  my $idx=int(rand($lkm));
  return $sanat_all[$idx];
#  print "\n";
}
