CHISE Omega
[chise/omega.git] / make_omegadb.pl
1 #!/usr/bin/perl -w
2
3 use strict;
4 use vars qw($perl56 $perl58
5             $cmapdir $db_home
6             %cmaps $target
7             $char $charid $from $to
8             %ciddb_filename %ciddb
9             %ucsdb_filename %ucsdb
10             %cid
11             $code $cid %mapto
12             $ucs
13             );
14 use BerkeleyDB;
15 use Chise_utils ':all';
16
17 if($^V and $^V ge v5.8){
18     $perl58=1;
19 }elsif($^V and $^V ge v5.6){
20     $perl56=1;
21 }else{
22     print STDERR "This versin is not supported.";
23 }
24 if($perl58){
25     eval "use Encode";
26     binmode(STDIN, ':encoding(utf8)');
27     binmode(STDOUT, ':encoding(utf8)');
28 }
29
30 %cmaps=("cns"=>"UniCNS-UCS2-H",
31         "gb"=>"UniGB-UCS2-H",
32         "jis"=>"UniJIS-UCS2-H",
33         "ks"=>"UniKS-UCS2-H");
34
35 foreach $target (keys %cmaps){
36     ($ciddb_filename{$target}=$cmaps{$target})=~s/\-UCS2\-H//;
37 }
38
39 foreach $target (keys %cmaps){
40     $ucsdb_filename{$target}="ucs-".$target;
41  }
42
43 # if using with Mac.
44 if($^O=~/darwin/){
45     print STDERR "Using ^M as delimiter.\n";
46     $/="\r";
47 }
48
49 my $usage=<<EOF;
50 Usage: perl $0 <CMAP dir> <DB dir>
51     <CMAP dir> is the directory where
52         CMAP for UniCNS-UCS2-H, UniGB-UCS2-H, UniJIS-UCS2-H, UniKS-UCS2-H exist.
53     <DB dir> is the directory to store BDB data.
54     This creates the databases required by Omega/CHISE.
55 EOF
56
57 #my $cmapdir="/usr/local/share/texmf/dvipdfm/CMap-AcrobatReader5.0";
58 #my $db_home="./omegadb";
59 if(@ARGV==2){
60     $cmapdir=shift;
61     $db_home=shift;
62 }
63 if(not -d $cmapdir
64    or not -d $db_home){
65     print $usage;
66     exit 1;
67 }
68
69 foreach $target (keys %ciddb_filename){
70     if(-f "$db_home/$ciddb_filename{$target}"){
71         print STDERR "Removing old DB $db_home/$ciddb_filename{$target}.\n";
72         unlink "$db_home/$ciddb_filename{$target}";
73     }
74     if(-f "$db_home/$ucsdb_filename{$target}"){
75         print STDERR "Removing old DB $db_home/$ucsdb_filename{$target}.\n";
76         unlink "$db_home/$ucsdb_filename{$target}";
77     }
78     $ciddb{$target}=new BerkeleyDB::Hash
79         -Filename => "$db_home/$ciddb_filename{$target}", -Flags => DB_CREATE
80         or die $!;
81     $ucsdb{$target}=new BerkeleyDB::Hash
82         -Filename => "$db_home/$ucsdb_filename{$target}", -Flags => DB_CREATE
83         or die $!;
84 }
85
86 foreach $target (keys %cmaps){
87     print STDERR "Getting ucs-$target map from Character DB...";
88     &get_db("ucs-$target");
89     foreach $char (sort keys %{$chardb{"ucs-$target"}}){
90         $char=decode('utf8',$char) if($perl58);
91         $char=~s/^\?//;
92         $charid=unpack("U",$char);
93         if($ucs=$chardb{"ucs-$target"}->{"?$char"}){
94             $mapto{$target}->{$ucs}=$charid;
95             $ucsdb{$target}->db_put($ucs,$charid);
96         }
97     }
98     print STDERR "done!\n";
99 }
100
101 foreach $target (keys %cmaps){
102     my $in=0;
103     print STDERR "Reading $cmapdir/$cmaps{$target}...";
104     open(CMAP,"<$cmapdir/$cmaps{$target}") or die $!;
105     # taken from expandcmap.pl by taiji.
106     while(<CMAP>){
107         if(/begincidrange/){
108             $in=1;
109         }elsif(/endcidrange/){
110             $in=0;
111         }elsif($in){
112             if(/<([\da-fA-F]+)>\s*<([\da-fA-F]+)>\s*(\d+)/){
113                 ($from, $to, $cid) = (hex($1), hex($2), $3);
114                 while ($from <= $to) {
115                     $cid{$target}->{$cid++}=$from++;
116                 }
117             }
118         }
119     }
120     close(CMAP);
121     print STDERR "done!\n";
122 }
123
124 foreach $target (keys %cmaps){
125     print STDERR "Storing data for Uni",uc($target),"...";
126     foreach $cid (keys %{$cid{$target}}){
127         # $cid{$target}->{$cid} ¢« ucs in UniJIS, etc.
128         $ucs=$cid{$target}->{$cid};
129         # DB¤Î¥Þ¥Ã¥Ô¥ó¥°¥Æ¡¼¥Ö¥ë¤Ë¤Ê¤¤¤Î¤Ëcid¤¬¤¢¤ë¾ì¹ç¤Ï
130         # UCS ¤½¤Î¤Þ¤Þ¤Ç¤è¤¤¡©
131         if(defined($mapto{$target}->{$ucs})){
132             $charid=$mapto{$target}->{$ucs};
133         }else{
134             $charid=$ucs;
135         }
136         unless($ciddb{$target}->db_put($charid,$ucs)==0){
137             die $!;
138         }
139     }
140     print STDERR "done!\n";
141 }
142
143 # creating reverse ids DB.
144 my $idsdb_filename="idsdb";
145 my($idsdb,$ids);
146 if(-f "$db_home/$idsdb_filename"){
147     print STDERR "Removing old DB: $db_home/$idsdb_filename.\n";
148     unlink "$db_home/$idsdb_filename";
149 }
150 $idsdb=new BerkeleyDB::Hash
151         -Filename => "$db_home/$idsdb_filename", -Flags => DB_CREATE
152         or die $!;
153 print STDERR "Making IDS DB...";
154 #&get_db("ideographic-structure");
155 &get_db("ids");
156 #foreach $char (keys %{$chardb{"ideographic-structure"}}){
157 foreach $char (keys %{$chardb{"ids"}}){
158     $char=decode('utf8',$char) if($perl58);
159     $char=~s/^\?//;
160 #    if($ids=$chardb{"ideographic-structure"}->{"?$char"}){
161     if($ids=$chardb{"ids"}->{"?$char"}){
162         $ids=decode('utf8', $ids) if($perl58);
163         $idsdb->db_put($ids,$char);
164     }
165 }
166 print STDERR "done\n";