use warnings; use strict; use 5.008; use ExtUtils::MakeMaker; if( build_hashes() ) { WriteMakefile( NAME => 'Lingua::GA::Gramadoir', VERSION_FROM => 'lib/Lingua/GA/Gramadoir.pm', EXE_FILES => ['scripts/gram-ga.pl', 'scripts/groo-ga.pl'], PREREQ_PM => { 'Archive::Zip' => '1.06', 'Carp' => '0', 'Encode' => '0', 'ExtUtils::MakeMaker' => '6.03', 'File::Spec' => '0.83', 'Getopt::Long' => '2.32', 'Memoize' => '0.52', 'Storable' => '2.04', 'String::Approx' => '3.19', 'Term::ANSIColor' => '1.05', }, clean => { FILES => "lib/Lingua/GA/Gramadoir/*.hash" }, ($] >= 5.005 ? (ABSTRACT_FROM => 'lib/Lingua/GA/Gramadoir.pm', AUTHOR => 'Kevin P. Scannell ') : ()), ); } else { die "Problem creating dictionary hash tables.\n"; } sub build_hashes { use Storable; use File::Spec; my $dir = File::Spec->catfile( 'lib', 'Lingua', 'GA', 'Gramadoir' ); my $srcdir = File::Spec->catfile( 'share' ); my $combofile = File::Spec->catfile( $dir, 'nocombo.hash'); my $replfile = File::Spec->catfile( $dir, 'eile.hash'); my $errfile = File::Spec->catfile( $dir, 'earraidi.hash'); my $posfile = File::Spec->catfile( $dir, 'pos.hash'); my $gramfile = File::Spec->catfile( $dir, '3grams.hash'); my $morphfile = File::Spec->catfile( $dir, 'morph.hash'); my $messagesfile = File::Spec->catfile( $dir, 'messages.hash'); my $rawfile; for my $i (0 .. 6) { my $lexfile = File::Spec->catfile( $dir, "focail$i.hash"); unless( -f $lexfile ) { my %FOCAIL; $rawfile = File::Spec->catfile( $srcdir, "focail$i.bs"); open(DATABASE, $rawfile) or die "Can't open dictionary: $!"; binmode DATABASE, ":bytes"; { local $/ = "\cJ"; my $grambytes; # byte semantics always chomp(my $currword=); chomp($grambytes = ); $FOCAIL{$currword} = $grambytes; while () { chomp; m/^([0-9]?)(.*)/; $currword = substr($currword,0,$1).$2; chomp ($grambytes = ); $FOCAIL{$currword} = $grambytes; } } close DATABASE; store \%FOCAIL, $lexfile; } } unless ( -f $replfile ) { my %EILE; $rawfile = File::Spec->catfile( $srcdir, 'eile.bs'); open(DATABASE, $rawfile) or die "Can't open dictionary: $!"; binmode DATABASE, ":bytes"; while () { chomp; my ($key, $repl) = m/^([^ ]*) (.*)$/; $repl =~ s/ /_/g; if (exists($EILE{$key})) { $EILE{$key} .= ",_$repl"; } else { $EILE{$key} = $repl; } } close DATABASE; store \%EILE, $replfile; } unless ( -f $errfile ) { my %EARRAIDI; $rawfile = File::Spec->catfile( $srcdir, 'earraidi.bs'); open(DATABASE, $rawfile) or die "Can't open dictionary: $!"; binmode DATABASE, ":bytes"; while () { chomp; my ($key, $repl) = m/^([^ ]*) (.*)$/; $repl =~ s/ /_/g; if (exists($EARRAIDI{$key})) { $EARRAIDI{$key} .= ",_$repl"; } else { $EARRAIDI{$key} = $repl; } } close DATABASE; store \%EARRAIDI, $errfile; } unless ( -f $posfile ) { my %POS; $rawfile = File::Spec->catfile( $srcdir, 'pos.bs'); open(DATABASE, $rawfile) or die "Can't open dictionary: $!"; binmode DATABASE, ":bytes"; while () { chomp; m/^([^ ]*) (.*)$/; $POS{$1} = $2; } close DATABASE; store \%POS, $posfile; } unless ( -f $morphfile ) { my @MorphRules; $rawfile = File::Spec->catfile( $srcdir, 'morph.bs'); open(DATABASE, $rawfile) or die "Can't open dictionary: $!"; binmode DATABASE, ":bytes"; while () { s/#.*$//; if (/\S/) { my ($patt, $repl, $level, $rootpos) = /\s*(\S+)\s+(\S+)\s+(\S+)\s+(<[^>]+>)/; $repl =~ s/(.*)/"$1"/; $repl =~ s/\\l\$([1-9])/".mylcfirst(\$$1)."/g; $repl =~ s/\\L\$([1-9])/".mylc(\$$1)."/g; push @MorphRules, {'patt' => $patt, 'repl' => $repl, 'level' => $level, 'rootpos' => $rootpos}; } } close DATABASE; store \@MorphRules, $morphfile; } unless ( -f $gramfile ) { my %GRAMS; $rawfile = File::Spec->catfile( $srcdir, '3grams.bs'); open(DATABASE, $rawfile) or die "Can't open dictionary: $!"; binmode DATABASE, ":bytes"; while () { chomp; m/^([^ ]*) (.*)$/; $GRAMS{$1} = $2; } close DATABASE; store \%GRAMS, $gramfile; } unless ( -f $combofile ) { my %COMBO; $rawfile = File::Spec->catfile( $srcdir, 'nocombo.bs'); open(DATABASE, $rawfile) or die "Can't open dictionary: $!"; binmode DATABASE, ":bytes"; while () { chomp; $COMBO{$_}++; } close DATABASE; store \%COMBO, $combofile; } unless ( -f $messagesfile ) { my %MESSAGES; $rawfile = File::Spec->catfile( $srcdir, 'messages.bs'); open(DATABASE, $rawfile) or die "Can't open dictionary: $!"; binmode DATABASE, ":bytes"; while () { chomp; if (m/^(\S+)\s+'(.*)' *$/) { my $msgid = $2; my @macros = split /=/,$1; $msgid =~ s/\\'/'/g; $MESSAGES{$_} = $msgid foreach (@macros); } } close DATABASE; store \%MESSAGES, $messagesfile; } return ( -f $replfile and -f $combofile and -f $morphfile and -f $errfile and -f $posfile and -f $gramfile and -f $messagesfile); }