i
[chise/ruby.git] / chise / org-character.rb
1     def mcs_hex() sprintf("%x", @char_id) end
2
3     def char_feature_alist() check_all_database(); @features; end
4     def char_feature_list()  check_all_database(); @features.keys; end
5     alias alist char_feature_alist
6     alias list  char_feature_list
7
8     def has_feature?() # \88Ó\96¡\82Ì\82 \82éfeature\82ð\8e\9d\82Á\82Ä\82Ü\82·\82©?
9       keys = list
10       keys.delete_if {|k|
11         k =~ /ids/
12       }
13       return (keys.length != 0)
14     end
15
16     def check_database(a)
17       db = CharDB.instance
18       u8 = mcs_utf8()
19       v = db.get(a, u8) # u8\82Å\95\\82³\82ê\82é\95\8e\9a\82Ìa\83A\83g\83\8a\83r\83\85\81[\83g\82ð\92²\82×\82é\81B
20       v
21     end
22
23     def check_all_database() # \8c»\8dÝ\82Ì@char_id\82©\82ç\81A\95\8e\9a\83f\81[\83^\83x\81[\83X\82ð\8eQ\8fÆ\82·\82é
24       return if @check_all_database
25       return if @char_id.nil?
26       db = CharDB.instance
27       u8 = mcs_utf8()
28       atrs = db.get_all(u8) #u8\82Å\95\\82³\82ê\82é\95\8e\9a\82Ì\83A\83g\83\8a\83r\83\85\81[\83g\82ð\91S\95\94\8e\9d\82Á\82Ä\82±\82¢
29       atrs.each {|a,v|
30         @features[a] = v #\82Æ\82©\82¢\82¤\8a´\82\82Å\91ã\93ü\82·\82é\82Ì\82Å\82¦\82¦\82©\82È?
31       }
32       @check_all_database = true #\8fd\82¢\8f\88\97\9d\82È\82Ì\82Å\88ê\89\9echeck\82·\82é
33     end
34
35     def ucs()
36       #p "ucs"
37       #ar=%w{ucs ucs-big5 ucs-cdp ucs-cns ucs-jis ucs-ks =>ucs =>ucs* =>ucs-jis}
38       #ar=%w{ucs ucs-jis ucs-big5 ucs-cdp ucs-cns ucs-ks =>ucs =>ucs* =>ucs-jis}
39       ar = %w{ucs-jis ucs =>ucs-jis}
40       #\95À\82Ñ\8f\87\82Í\9c\93\88Ó\93I\82Å\81Aucs-jis\82ð\90æ\82É\8fo\82µ\82Ä\82¢\82é\81B\96{\97\88\82Í\82±\82ê\82à\8ew\92è\82Å\82«\82é\82æ\82¤\82É\82·\82é\82×\82«\81B
41       ar.each {|a|      #p [a]
42         u = get_char_feature(a)
43         return u if u
44       }
45       nil
46     end
47
48     #-------------------------------------------------------------------CCS\8aÖ\8cW
49     def to_utf8() Uconv.u4tou8(Character.u4itou4(ucs())) end #UTF8\95\8e\9a\97ñ\82ð\95Ô\82·
50     #alias to_s to_utf8
51     alias to_s mcs_utf8
52
53     def map_utf8()
54       u = ucs()
55       if u.nil? || 0xffff < u
56         return to_er()
57       else
58         return to_utf8()
59       end
60     end
61     alias map_ucs map_utf8
62
63     def map_ucs_er()
64       u = ucs()
65       if u.nil? || 0xffff < u
66         return to_er()
67       else
68         return Character.get(u).to_er()
69       end
70     end
71
72     def to_euc()
73       u = ucs()
74       return "" if u.nil? || 0xffff < u
75       Uconv.u16toeuc(Uconv.u4tou16(Character.u4itou4(ucs())))
76     end
77
78     def map_euc()
79       e = to_euc()
80       return e if e != ""
81       return to_er()
82     end
83
84     def to_sjis()
85       u = ucs()
86       return "" if u.nil? || 0xffff < u
87       Uconv.u16tosjis(Uconv.u4tou16(Character.u4itou4(ucs())))
88     end
89
90     def map_sjis()
91       e = to_sjis()
92       return e if e != ""
93       return to_er()
94     end
95
96     def to_er_list()
97       ar = []
98       EntityReference.each_codesys {|codesys, er_prefix, keta, numtype|
99         er = to_er(codesys)
100         ar << er if er
101       }
102       ar
103     end
104
105     def inspect_all_codesys() #\96¢\8a®\90¬
106       #to_er\82ð\91S\82Ä\82Ìcodesys\82É\82¨\82¢\82Ä\8eÀ\8ds\82·\82é\81B\82»\82Ì\8c\8b\89Ê\82ð\83R\83\93\83p\83N\83g\82É\82Ü\82Æ\82ß\82é
107     end
108
109     def inspect_all()
110       ar = [inspect.chop]
111       alist.to_a.sort.each {|a, v| ar << "#{a}:#{v}" }
112       return ar.join(",")+">"
113     end
114
115     def dump_all()
116       ar = [inspect]
117       alist.to_a.sort.each {|a, v| ar << "#{a}:#{v}" }
118       return ar.join('\n')+'\n'
119     end
120
121     def get_features()
122       str = ""
123       alist.to_a.sort.each {|a, v|
124         str += "#{a}: #{v}\n"
125       }
126       str
127     end
128
129     def inspect_ids(hex_flag=false)
130       ids = decompose
131       ar = []
132       ar << (hex_flag ? "x"+mcs_hex : to_utf8)
133       if to_s != ids #ids\82ª\95\94\95i\82»\82Ì\82à\82Ì\82¾\82Á\82½\82ç\95\94\95i\92Ç\89Á\82Í\82µ\82È\82¢
134         ids.each_char {|ch|
135           char = ch.char
136           next if char.is_ids?
137           if hex_flag then
138             ar << "x"+char.mcs_hex
139           else
140             u = char.to_utf8
141             if u != ""
142               ar << u
143             else
144               ar << char.to_er
145             end
146           end
147         }
148       end
149       return "("+ar.join("\t")+")"
150     end
151
152     #--------------------------------------------------------------------IDS\8aÖ\8cW
153     def glyph_decompose() do_decompose(false) end
154     def decompose()       do_decompose(true)  end
155     def do_decompose(check_meaning = true)
156       k = self.to_s
157       #       idss = self["ids"]
158       #       return idss if idss
159       #       return k if self.is_basic_kanji? #\8aî\96{\8a¿\8e\9a\82Ístop kanji\82Æ\82·\82é\82¼\82Æ\81B
160       if check_meaning
161         return self["ids-represent"] if self["ids-represent"] #ids_represent\82ð\8e\9d\82Á\82Ä\82¢\82é\8fê\8d\87\82Í\82»\82Ì\92l\82Æ\82·\82é\81B
162         return self["ids-element"] if self["ids-element"] #ids_element\82ð\8e\9d\82Á\82Ä\82¢\82é\8fê\8d\87\82Í\82»\82Ì\92l\82Æ\82·\82é\81B
163         idss = self["ids-meaning"]
164         return idss if idss && 0 < idss.length && k != idss
165       end
166       idss = self["ids-aggregated"]
167       return idss if idss && 0 < idss.length && k != idss
168       idss = self["ids"]
169       return idss if idss && 0 < idss.length && k != idss
170       return k
171       #       return k if idss.nil? || idss.length == 0 || k == idss
172       #       if idss.char_length == 2
173       # p ["What???", k, idss, k.inspect_all]
174       #  #return idssx[1] #\93ñ\8cÂ\96Ú\82¾\82¯\95Ô\82·\82Æ\82©?
175       #  return k #IDS\82É\93W\8aJ\82·\82é\95û\96@\82ª\96³\82¢\82Æ\81B
176       #       end
177       #       return k if k == idss
178       #       if idss.include?(k) #<C5-4C4D><C6-4A37>\82±\82Ì\93ñ\95\8e\9a\82ÌBUG\91Î\8dô
179       #  #return idss.sub(k, "")
180       #  return k #IDS\82É\93W\8aJ\82·\82é\95û\96@\82ª\96³\82¢\82Æ\81B
181       #       end
182       #       return idss
183     end
184
185     def decompose_all
186       pde = ""
187       de = self.decompose #\8fo\94­\93_
188       level = 0
189       while true
190         pde = de
191         de = pde.decompose #\82à\82¤\88ê\93x\95ª\89ð\82ð\82µ\82Ä\82Ý\82é\81B
192         break if pde == de #\83\8b\81[\83v\82ð\94²\82¯\82¾\82·
193         exit if 10 < level #p ["too many recursive", self] 
194         level += 1
195       end
196       return de
197     end
198
199     def decompose_all_nu(level=nil)
200       level = 0 if level.nil?
201       if 10 < level
202         p ["too many recursive", self] 
203         exit
204       end
205       de = self.decompose
206       return de.decompose_all(level+1) if de != self #\82È\82É\82©\95Ï\89»\82ª\82 \82Á\82½\82©\82ç\8dÄ\8bA
207       return de #\82à\82¤\82±\82ê\88È\8fã\95Ï\89»\82Í\96³\82³\82»\82¤\82¾\82¼\82Æ\81B
208     end
209
210     def is_ids?() 0x2ff0 <= @char_id && @char_id <= 0x2fff end
211
212     def ids_operator_argc()
213       return 0 unless is_ids?
214       return 3 if @char_id == 0x2ff2 || @char_id == 0x2ff3
215       return 2
216     end