2 # CHISE.pm by Shigeki Moro
3 # $Id: CHISE.pm,v 1.3 2003-03-12 16:53:59 moro Exp $
10 our ($EXCLUSIVE, $HAVE_INTERSECTION, $PROPER_SUBSET, $PROPER_SUPERSET, $EQSET);
11 ($EXCLUSIVE, $HAVE_INTERSECTION, $PROPER_SUBSET, $PROPER_SUPERSET, $EQSET)
14 my $DB_HOME = '/usr/local/lib/xemacs-21.4.10/i686-pc-linux/char-db';
17 my %alias_reverse = ();
18 for (glob "$DB_HOME/system-char-id/*") {
26 $alias_reverse{$i} = $_;
30 'radical','ideographic-radical',
31 'strokes','total-strokes',
34 #--- exportする予の関数 -------------------------------------#
39 my $class = ref($invocant) || $invocant;
42 my $key = ($self->chars)[0]; # 要エラーチェック
44 for my $dbname (glob "$DB_HOME/system-char-id/*") {
45 $value = &getvalue($dbname, $key);
47 $dbname =~ s/^.*\/([^\/]+)$/$1/;
48 $result->{$alias_reverse{$dbname}} = $value;
51 return bless $result, $class;
57 my $class = ref($invocant) || $invocant;
60 for my $i (keys %$self) {
61 $result->{$alias_reverse{$alias{$i}}} = $$self{$i};
63 return bless $result, $class;
67 # 字オブジェクトが持っている全属性をprint
69 for my $i (keys %$self) {
70 print "$i => $$self{$i}\n";
77 my $self = $model->define_char(%$model, @_);
84 delete $$model{$_} foreach (@_);
85 my $self = $model->define_char(%$model);
90 # 例: $s->morohashi_daikanwa
91 # cf. get_char_attribute
92 for my $attrname (keys %alias) {
93 my $slot = __PACKAGE__ . "::$attrname";
97 my $dbname = exists $alias{$attrname}
98 ? $alias_reverse{$alias{$attrname}}
100 return $self->{$dbname};
103 #for my $attrname (keys %alias) {
104 # my $slot = __PACKAGE__ . "::$attrname";
109 # for my $i ($self->chars) {
110 # my $j = &getvalue("$DB_HOME/system-char-id/$alias{$attrname}", $i);
111 # push @result, $j if $j;
121 my($aonly, $bonly, $common) = (0, 0, 0);
122 for my $i (&cup(keys %$a, keys %$b)) {
123 if ($a->{$i} eq $b->{$i}) {
126 $aonly++ if (exists $a->{$i});
127 $bonly++ if (exists $b->{$i});
131 return $EXCLUSIVE; # 他
132 } elsif ($aonly == 0 and $bonly == 0) {
134 } elsif ($aonly == 0) {
135 return $PROPER_SUBSET; # $aは$bの合
136 } elsif ($bonly == 0) {
137 return $PROPER_SUPERSET; # $bは$aの合
139 return $HAVE_INTERSECTION;
143 sub rate_of_coincidence {
144 # 字オブジェクトどうしの属性の一致を出す。
146 my($all_attr, $common_attr) = (0, 0);
147 for my $i (&cup(keys %$a, keys %$b)) {
148 if ($a->{$i} eq $b->{$i}) {
152 $all_attr++ if (exists $a->{$i});
153 $all_attr++ if (exists $b->{$i});
156 return $all_attr ? ($common_attr / $all_attr) : 0;
163 'C1','chinese-cns11643-1',
164 'C2','chinese-cns11643-2',
165 'C3','chinese-cns11643-3',
166 'C4','chinese-cns11643-4',
167 'C5','chinese-cns11643-5',
168 'C6','chinese-cns11643-6',
169 'C7','chinese-cns11643-7',
170 'CB','ideograph-cbeta',
171 'CDP','chinese-big5-cdp',
173 'GT-K','ideograph-gt',
174 'HZK1','ideograph-hanziku-1',
175 'HZK2','ideograph-hanziku-2',
176 'HZK3','ideograph-hanziku-3',
177 'HZK4','ideograph-hanziku-4',
178 'HZK5','ideograph-hanziku-5',
179 'HZK6','ideograph-hanziku-6',
180 'HZK7','ideograph-hanziku-7',
181 'HZK8','ideograph-hanziku-8',
182 'HZK9','ideograph-hanziku-9',
183 'HZK10','ideograph-hanziku-10',
184 'HZK11','ideograph-hanziku-11',
185 'HZK12','ideograph-hanziku-12',
186 'J78','japanese-jisx0208-1978',
187 'J83','japanese-jisx0208',
188 'J90','japanese-jisx0208-1990',
189 'JSP','japanese-jisx0212',
190 'JX1','japanese-jisx0213-1',
191 'JX2','japanese-jisx0213-2',
192 'K0','korean-ksc5601',
193 'M','ideograph-daikanwa',
195 my $keys = join '|', sort keys %alias;
196 my($phname, $phvalue) = ($ph =~ /^\&(?:I\-)?($keys)\-?([0-9a-f]+);$/i);
197 if (exists $alias{$phname}) {
198 if ($alias{$phname} =~ /daikanwa|gt/) {
201 $phvalue = "0x$phvalue";
203 tie my %h, "BerkeleyDB::Hash",
204 -Filename => "$DB_HOME/$alias{$phname}/system-char-id"
205 or die "Cannot open file $alias{$phname}: $! $BerkeleyDB::Error\n";
206 if (exists $h{$phvalue}) {
209 #print STDERR "\tCan't convert $phname - $phvalue (no value in db).\n";
214 #print STDERR "\tCan't convert $phname - $phvalue.\n";
219 #--- モジュール内のみでう予の関数 ----------------------#
225 for my $attrname (keys %$self) {
227 my $dbname = exists $alias{$attrname} ? $alias{$attrname} : $attrname;
228 if (-f "$DB_HOME/$dbname/system-char-id") {
229 @tmp = (&getvalue("$DB_HOME/$dbname/system-char-id", $$self{$attrname}));
230 @result = &cap(\@result, \@tmp);
231 } elsif (-f "$DB_HOME/system-char-id/$dbname") {
232 @tmp = &getkeys("$DB_HOME/system-char-id/$dbname", $$self{$attrname});
233 @result = &cap(\@result, \@tmp);
235 die "cannot find $attrname: $! $BerkeleyDB::Error\n";
245 for my $i ($self->chars) {
247 # To Do: 私用域のはさないようにしないと。
255 my($dbname, $key) = @_;
256 tie my %h, "BerkeleyDB::Hash",
257 -Filename => $dbname;
258 my $value = $h{$key};
265 my($dbname, $value) = @_;
266 tie my %h, "BerkeleyDB::Hash",
267 -Filename => $dbname;
269 for my $key (keys %h) {
270 push @keys, $key if ($h{$key} eq $value);
281 } elsif ($$a[0] eq '*') { # '*'は全体合
283 } elsif ($$b[0] eq '*') {
288 for my $i (@$a, @$b) {
290 push @result, $i if ($result{$i} == 2);
303 for my $i (@_) { $result{$i}++; }
307 #--------------------------------------------------------#