update.
[chise/ruby.git] / chise / ids.rb
1 # Copyright (C) 2002-2004 Kouichirou Eto, All rights reserved.
2
3 require "chise/idstree"
4
5 module CHISE
6   IDC_0 = "\342\277\260"
7   IDC_1 = "\342\277\261"
8   IDC_2 = "\342\277\262"
9   IDC_3 = "\342\277\263"
10   IDC_4 = "\342\277\264"
11   IDC_5 = "\342\277\265"
12   IDC_6 = "\342\277\266"
13   IDC_7 = "\342\277\267"
14   IDC_8 = "\342\277\270"
15   IDC_9 = "\342\277\271"
16   IDC_A = "\342\277\272"
17   IDC_B = "\342\277\273"
18
19   IDC_LEFT_TO_RIGHT = IDC_0
20   IDC_ABOVE_TO_BELOW = IDC_1
21   IDC_LEFT_TO_MIDDLE_AND_RIGHT = IDC_2
22   IDC_ABOVE_TO_MIDDLE_AND_BELOW = IDC_3
23   IDC_FULL_SURROUND = IDC_4
24   IDC_SURROUND_FROM_ABOVE = IDC_5
25   IDC_SURROUND_FROM_BELOW = IDC_6
26   IDC_SURROUND_FROM_LEFT = IDC_7
27   IDC_SURROUND_FROM_UPPER_LEFT = IDC_8
28   IDC_SURROUND_FROM_UPPER_RIGHT = IDC_9
29   IDC_SURROUND_FROM_LOWER_LEFT = IDC_A
30   IDC_OVERLAID = IDC_B
31
32   module StringIDS
33     def decompose
34       map_char {|ch| ch.char.decompose }
35     end
36
37     def decompose_all
38       map_char {|ch| ch.char.decompose_all }
39     end
40
41     def ids_tree() IDS_Tree.new(self); end
42
43     def compose(dbname="ids")
44       ids = self.aggregate
45       cd = ChiseDB.instance
46       byidsdb = cd.get_by_ids_db(dbname)
47       cid = byidsdb.decode(ids)
48       return "" if cid.nil? # TO CHECK: why "", not nil?
49       composed = Character.get(cid).to_s
50       return "" if composed.nil?
51       return "" if composed.char_length == 0
52       return composed if composed.char_length == 1
53       composed.each_char {|ch|
54         char = ch.char
55         return ch # TO CHECK: the first character?
56       }
57       "" # TO CHECK: why "", not nil?
58     end
59
60     def aggregate(dbname="ids")
61       # In each sub part of IDS, search the corresponding char_id.
62       # If you could search the corresponding char_id, substitute with it.
63       #tree = self.ids_tree
64       tree = IDS_Tree.new(self)
65       return self if tree.depth <= 1 # no sub_node
66       tree.sub_nodes.each {|node|
67         c = node.compose(dbname)
68         next if c.nil? || c == ""
69         n = self.gsub(node, c)
70         return n.aggregate(dbname)
71       }
72       self
73     end
74
75     def find() # "日雲"→"曇"とかいう感じの操作
76       ar = []
77       length = char_length()
78       each_char {|ch|
79         char = ch.char
80         ar << char.ids_contained #その文字を含んでいる漢字のリスト
81       }
82       h = Hash.new(0)
83       #qp ar
84       ar.each {|list|
85         next if list.nil?
86         list.each_char {|ch|
87           h[ch] += 1
88         }
89       }
90       str = ""
91       h.each {|k, v|
92         #      p [k, v]
93         if length == v #全部に顔を出していたら
94           str += k
95         end
96       }
97       #    p str
98       str
99     end
100   end
101
102   module CharacterIDC
103     def is_idc?
104       0x2ff0 <= @char_id && @char_id <= 0x2fff
105     end
106
107     def idc_argument_number
108       return 0 unless is_idc?
109       return 3 if @char_id == 0x2ff2 || @char_id == 0x2ff3
110       return 2
111     end
112   end
113
114   module CharacterIDS
115     def decompose_by_meaning
116       k = self.to_s
117       ids = self.ids_represent
118       return ids if ids && !ids.empty? && k != ids
119       ids = self.ids_element
120       return ids if ids && !ids.empty? && k != ids
121       ids = self.ids_meaning
122       return ids if ids && !ids.empty? && k != ids
123       decompose
124     end
125
126     def decompose # by glyph
127       k = self.to_s
128       ids = self.ids
129       return ids if ids && !ids.empty? && k != ids
130       ids = self.ids_org
131       return ids if ids && !ids.empty? && k != ids
132       k
133     end
134
135     def decompose_all
136       pde = ""
137       de = self.decompose # the start point.
138       level = 0
139       while true
140         pde = de
141         de = pde.decompose # decompose it again.
142         break if pde == de # previous is same.
143         exit if 10 < level # p ["too many recursive", self] 
144         level += 1
145       end
146       de
147     end
148   end
149 end