change regular expression in &de_er
[chise/perl.git] / Chise_utils / Chise_utils.pm
index e63122d..5967978 100644 (file)
@@ -77,7 +77,7 @@ my %er_alias =
      'CB','=cbeta',
      'CDP','=big5-cdp',
      'GT','=gt',
-     'GT-K','=gt',
+     'GT-K','=gt-k',
      'HZK1','=hanziku-1',
      'HZK2','=hanziku-2',
      'HZK3','=hanziku-3',
@@ -100,6 +100,8 @@ my %er_alias =
      'M','=daikanwa',
      );
 
+my $er_prefix_re=join '|', keys %er_alias;
+
 if(-d "$DB_HOME/character"){
     for (glob "$DB_HOME/character/feature/*"){
        next if(/\.txt$/);
@@ -191,8 +193,9 @@ sub get_chars_matching{
        }
     }
     else{
-#    # fall back if DB inconsistency exists.
+#   never fall back.
 #    unless(@res){
+#    # fall back if DB inconsistency exists.
        if(&get_db($atr)){
            foreach $char (keys %{$chardb{$atr}}){
                if($chardb{$atr}->{$char} eq $value){
@@ -225,23 +228,21 @@ sub get_chars_for{
            }
        }
     }
-    foreach (keys %res){
-       if($res{$_}==$i){
-           push @res,$_;
-       }
-    }
-    return @res;
+    return grep {defined($res{$_}) and $res{$_}==$i} (keys %res);
 }
 
 sub de_er{
     my($er)=@_;
     my($output_char,$atr,$value);
-    my $keys = join '|', keys %er_alias;
+    my($prefix,$suffix);
+    $er=~/^(amp|&)?(.+?)(;)?$/
+       and $prefix=$1,$er=$2,$suffix=$3;
+    $prefix or $prefix="",$suffix or $suffix="";
     if($er=~/^\d+$/){
        $output_char=pack("U",$er);
     }elsif($er=~/^U[\+\-]([a-fA-F\d]+)/){
        $output_char=pack("U",hex($1));
-    }elsif($er=~/(?:I\-)?($keys)\-?([0-9a-fA-F]+)/){
+    }elsif($er=~/^(?:I\-)?($er_prefix_re)\-?([0-9a-fA-F]+)$/){
        ($atr,$value)=($1,$2);
        unless($er_alias{$atr}=~/daikanwa|gt/){
            $value=hex($value);
@@ -249,9 +250,9 @@ sub de_er{
        ($output_char)=&get_chars_matching($er_alias{$atr},$value);
     }
     if($output_char){
-      return $output_char;
+       return $output_char;
     }else{
-      return $er;
+       return $prefix.$er.$suffix;
     }
 }