package Ernad::Presort::Frexe; use strict; use warnings; use Carp qw(confess); use Data::Dumper; use base ('Ernad::Presorter'); use Ernad::Store; binmode(STDOUT,':utf8'); ## the frexe in construction my $f; sub get { my $a=shift; my $e=$a->{'a'} // $main::e // confess "I need an erimp here."; $a->{'dir'}->{'fidek'}=$a->set_dir('fidek','do_base'); $a->{'file'}->{'frexe'}=$a->{'dir'}->{'fidek'}.'/frexe.json'; my $frast=$e->{'conf'}->{'frast'}; if(not $frast or not -f $frast) { return undef; } my $frexe; if(&Ernad::Files::does_file_need_renewal($a->{'file'}->{'frexe'}, $e->{'conf'}->{'frast'})) { $frexe=$a->compile(); } else { $frexe=&Ernad::Store::load($a->{'file'}->{'frexe'}); } return $frexe; } ## compile from frast sub compile { my $a=shift; ## the scanner if(not $a->{'frast'}) { my $frast=&Ernad::Store::load($a->{'e'}->{'conf'}->{'frast'}); $a->{'frast'}=$frast; } my $count=0; foreach my $frase (keys %{$a->{'frast'}}) { my $s="\$a->{'f'}->"; my @terms=split(' ',$frase); foreach my $term (@terms) { ## escape the use of ' $term=~s|'|\\'|g; $s.="{'".$term."'}->"; } $s.="{'_'}=".$a->{'frast'}->{$frase}.";"; eval($s); if($@) { warn "I could not eval '$s': $@."; next; } ## save a little memory delete $a->{'frast'}->{$frase}; } undef $a->{'frast'}; &Ernad::Store::save($a->{'f'},$a->{'file'}->{'frexe'}); return $a->{'f'}; } 1;