X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=Chise_utils%2FChise_utils.pm;h=b03cf0bebe2484169e7ada7a9dc04b8732bdfe3f;hb=e341f415e0e53c6f498a8a64da54fe129b9445e4;hp=2e13949b9d2874be626b73956fb9e8f372daedb7;hpb=79a14850fbd546e24e08b9c72ae03fc772c902be;p=chise%2Fperl.git diff --git a/Chise_utils/Chise_utils.pm b/Chise_utils/Chise_utils.pm index 2e13949..b03cf0b 100644 --- a/Chise_utils/Chise_utils.pm +++ b/Chise_utils/Chise_utils.pm @@ -1,6 +1,6 @@ package Chise_utils; -require 5.005; +require 5.008; use strict; use warnings; @@ -10,7 +10,9 @@ use utf8; use BerkeleyDB; use vars qw(%db %chardb %reverse_db %reverse_chardb + %er_alias $er_prefix_re $atr $idc + $omegadb_path ); our @ISA = qw(Exporter); @@ -26,6 +28,8 @@ our %EXPORT_TAGS = ( 'all' => [ qw( %db %chardb %reverse_db %reverse_chardb $idc + %er_alias $er_prefix_re + $omegadb_path &get_db &get_reverse_db &get_char_attribute @@ -40,19 +44,19 @@ our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } ); our @EXPORT = qw( ); -our $VERSION = '0.01'; +our $VERSION = '0.02'; # Preloaded methods go here. +$omegadb_path="/usr/local/lib/chise/omega"; + my $DB_HOME=""; unless($DB_HOME){ - if(-e '/usr/local/lib/chise/db'){ - $DB_HOME='/usr/local/lib/chise/db'; - }elsif(-e '/usr/lib/chise/db'){ - $DB_HOME='/usr/lib/chise/db'; - }elsif(-e '/sw/lib/chise/db'){ - $DB_HOME='/sw/lib/chise/db'; + if(-e '/usr/local/lib/chise/chise-db'){ + $DB_HOME='/usr/local/lib/chise/chise-db'; + }elsif(-e '/usr/lib/chise/chise-db'){ + $DB_HOME='/usr/lib/chise/chise-db'; }elsif(-e '/usr/local/lib/chise/char-db'){ $DB_HOME='/usr/local/lib/chise/char-db'; }elsif(-e 'd:/work/chise/char-db'){ @@ -66,7 +70,7 @@ unless($DB_HOME){ $idc="\x{2ff0}-\x{2fff}"; -my %er_alias = +%er_alias = ('C1','=cns11643-1', 'C2','=cns11643-2', 'C3','=cns11643-3', @@ -100,7 +104,7 @@ my %er_alias = 'M','=daikanwa', ); -my $er_prefix_re=join '|', keys %er_alias; +$er_prefix_re=join '|', keys %er_alias; if(-d "$DB_HOME/character"){ for (glob "$DB_HOME/character/feature/*"){ @@ -109,10 +113,10 @@ if(-d "$DB_HOME/character"){ $atr=~s!$DB_HOME/character/feature/!!; $db{$atr}=$_; } - for (glob "$DB_HOME/character/by-feature/*"){ + for (glob "$DB_HOME/character/by_feature/*"){ next if(/\.txt$/); $atr=$_; - $atr=~s!$DB_HOME/character/feature/!!; + $atr=~s!$DB_HOME/character/by_feature/!!; $reverse_db{$atr}=$_; } }elsif(-d "$DB_HOME/system-char-id"){ @@ -139,7 +143,8 @@ sub get_db{ return 1 if(defined(%{$chardb{$atr}})); if(defined($db{$atr}) and -f $db{$atr}){ tie %{$chardb{$atr}}, "BerkeleyDB::Hash", - -Filename => $db{$atr}; + -Filename => $db{$atr}, + -Flags => DB_RDONLY; }else{ return undef; } @@ -150,7 +155,8 @@ sub get_reverse_db{ return 1 if(defined(%{$reverse_chardb{$atr}})); if(defined($reverse_db{$atr}) and -f $reverse_db{$atr}){ tie %{$reverse_chardb{$atr}}, "BerkeleyDB::Hash", - -Filename => $reverse_db{$atr}; + -Filename => $reverse_db{$atr}, + -Flags => DB_RDONLY; }else{ return undef; } @@ -159,9 +165,11 @@ sub get_reverse_db{ sub get_char_attribute{ my($char,$atr)=@_; + my($res); &get_db($atr) or return ""; - if($chardb{$atr}->{"?$char"}){ - return $chardb{$atr}->{"?$char"}; + if($res=$chardb{$atr}->{"?$char"}){ + utf8::decode($res); + return $res; }else{ return ""; } @@ -173,6 +181,7 @@ sub get_chars_containing{ if(&get_db($atr)){ foreach $char (keys %{$chardb{$atr}}){ if($chardb{$atr}->{$char}=~/$value/){ + utf8::decode($char); $char=~s/^\?//; push @res,$char; } @@ -187,6 +196,7 @@ sub get_chars_matching{ if(defined($reverse_db{$atr})){ if(&get_reverse_db($atr)){ if($char=$reverse_chardb{$atr}->{$value}){ + utf8::decode($char); $char=~s/^\?//; push @res,$char; } @@ -199,6 +209,7 @@ sub get_chars_matching{ if(&get_db($atr)){ foreach $char (keys %{$chardb{$atr}}){ if($chardb{$atr}->{$char} eq $value){ + utf8::decode($char); $char=~s/^\?//; push @res,$char; } @@ -245,7 +256,9 @@ sub de_er{ $output_char=pack("U",hex($1)); }elsif($er=~/^(?:I\-)?($er_prefix_re)\-?([0-9a-fA-F]+)$/){ ($atr,$value)=($1,$2); - unless($er_alias{$atr}=~/daikanwa|gt/){ + if($er_alias{$atr}=~/daikanwa|gt/){ + $value+=0; + }else{ $value=hex($value); } ($output_char)=&get_chars_matching($er_alias{$atr},$value);