in reply to RFC: Japanese Language Quiz Program
I can share a program written for WinCE devices (hence strange geometry) that uses Tcl::Tk and provides English/Korenan/Japanese/Chinese dictionary searching (Japanese, Chinese taken from Monash university, thanks them!)
Also it allows searching in Unihan database.
use strict; $::unipath='\storage card\unicode'; #my %uniexcl = (); my $o='5669'; my $last=0; use Tcl::Tk qw/:perlTk/; my $mw=tkinit; my $int=$mw->interp; my $lfont = "-*-Arial Unicode MS--R---*-300-*-*-*-*-*-*"; my $cfont = "-*-Arial Unicode MS--R---*-200-*-*-*-*-*-*"; my $mfont = "-*-Arial Unicode MS--R---*-100-*-*-*-*-*-*"; my $tw=$mw->Text(-wrap=>'char',-font=>$cfont,-height=>4,-width=>20)->p +ack; $tw->tagConfigure('large',-font=>$lfont); $tw->tagConfigure('descr',-font=>$mfont,-foreground=>'blue4'); $tw->tagConfigure('def',-font=>$mfont,-foreground=>'red4'); my $fbot=$mw->Frame()->pack; my $ew=$fbot->Entry(-font=>$mfont,-textvariable=>\$o,-width=>10)->pack +(-side=>'left'); my ($gdef,$ghier)=('',''); #my $e1w=$fbot->Entry(-font=>$lfont,-textvariable=>\$ghier,-width=>3)- +>pack(-side=>'left'); my $e2w=$fbot->Entry(-font=>$mfont,-textvariable=>\$gdef)->pack(-side= +>'left'); my $fr=$mw->Frame()->pack; my $bw=$fr->Button(-text=>'test', -command=>sub{ $tw->insert('insert',eval qq/"\\x{$o}"/); })->pack(-side=>'left'); my $bschw=$fr->Button(-text=>'search', -command=>sub{ my ($r,$what)=($tw->get('insert','insert + 1 chars'),''); if ($r eq '+') { $what=$tw->get('insert + 1 chars','insert + 5 chars'); } else { #use Devel::Peek; #Dump($r); use Encode; Encode::_utf8_on($r);# will go away once Tcl bug will be fixed #Dump($r); $what=unpack("H*",encode('ucs2',$r)); } #print STDERR qq/=$what=\n/; $ghier = eval qq/"\\x{$what}"/; $tw->insert('end',"$ghier\n",'large'); $tw->insert('end',$_,/kDefinition/i?'def':'descr') for lookup_unihan($what); })->pack(-side=>'left'); my $bscodew=$fr->Button(-text=>'(#)', -command=>sub{ my $what=$o; $tw->insert('end',eval qq/"\\x{$what}\n"/); $tw->insert('end',$_,/kDefinition/i?'def':'descr') for lookup_unihan($what); })->pack(-side=>'left'); my $blookupj=$fr->Button(-text=>'l-J', -command=>sub{ my $what=quotemeta $o; unless (defined $::jmdict) { open my $fhjm, "<$::unipath\\tkjmdict-0.94\\jmdict_en.bin"; binmode $fhjm; local $/; $::jmdict=<$fhjm>; } while ($::jmdict=~/^.*?$what.*?$/img) { my ($t0,$t1)=($-[0],$+[0]); $tw->insert('end',substr($::jmdict,$t0,$t1-$t0).qq/\n/,'descr'); $int->update; } })->pack(-side=>'left'); my $blookupch=$fr->Button(-text=>'l-CH', -command=>sub{ my $what=quotemeta $o; unless (defined $::chdict) { open my $fhch, "<$::unipath\\CHIN\\cedict.utf8"; binmode $fhch; local $/; $::chdict=<$fhch>; } while ($::chdict=~/^.*?$what.*?$/img) { my ($t0,$t1)=($-[0],$+[0]); $tw->insert('end',substr($::chdict,$t0,$t1-$t0).qq/\n/,'descr'); $int->update; } })->pack(-side=>'left'); my $blookupch=$fr->Button(-text=>'l-KR', -command=>sub{ my $what=quotemeta $o; unless (defined $::krdict) { open my $fhkr, "<$::unipath\\korean\\kor2eng.ut8"; binmode $fhkr; local $/; $::krdict=<$fhkr>; } while ($::krdict=~/^.*?$what.*?$/img) { my ($t0,$t1)=($-[0],$+[0]); $tw->insert('end',substr($::krdict,$t0,$t1-$t0).qq/\n/,'descr'); $int->update; } })->pack(-side=>'left'); my $bclr=$fr->Button(-text=>'clear',-command=>sub{ $tw->delete('1.0','end'); })->pack(-side=>'left'); my $bgen=$fr->Button(-text=>'gen_idx', -command=>sub{ 0 && do_idx(); })->pack(-side=>'left'); my $cnt=0; sub do_idx { if(!$last){ $o='Testing... done!'; return; } open my $fh, "<$::unipath\\unihan.txt"; binmode $fh; open my $fhoidx, ">$::unipath\\unihan-idx.idx"; binmode $fhoidx; my $lo=''; my ($fpos,$fpos0)=(0,0); while(<$fh>) { $fpos=$fpos0; $fpos0=tell $fh; if (/^u\+(\w+)/i) { next if $1 eq $lo; $lo=$1;$o=$1; $int->update; printf $fhoidx "%4s%08d\n",$lo,$fpos; # $tw->insert('end',eval qq/"\\x{$lo}"/); while(<$fh>=~/^u\+$o/io){ # print "$_"; } } last if $last; #last if ++$cnt>100000; # $int->update; } } $int->MainLoop; # # look up in unihan database. # reads index file if necessary sub lookup_unihan { my $what=shift; unless (defined $::idx) { open my $fhiidx, "<$::unipath\\unihan-idx.idx"; binmode $fhiidx; local $/; $::idx=<$fhiidx>; } $::idx=~/^$what(.*?)$/im; open my $fh, "<$::unipath\\unihan.txt"; binmode $fh; seek $fh, $1, 0; my @res; while (local $_ = <$fh>) { last unless /^u\+$what/i; s/\t/ /g; push @res, $_; } return @res; }
Courage, the Cowardly Dog
|
|---|