1 # Copyright (C) 2002-2004 Kouichirou Eto, All rights reserved.
3 require "chise/idstree"
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"
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
38 def tree() IDS_Tree.new(@ids); end
40 def compose(dbname="ids")
41 ids = @ids.to_ids.aggregate
44 byidsdb = cd.get_by_ids_db(dbname)
45 cid = byidsdb.decode(ids)
46 return "" if cid.nil? # TO CHECK: why "", not nil?
47 composed = Character.get(cid).to_s
48 return "" if composed.nil?
49 return "" if composed.char_length == 0
50 return composed if composed.char_length == 1
51 composed.each_char {|ch|
53 #return ch if char.has_attribute?
54 return ch # TO CHECK: the first character?
59 def aggregate(dbname="ids")
60 # In each sub part of IDS, search the corresponding char_id.
61 # If you could search the corresponding char_id, substitute with it.
63 return @ids if tree.depth <= 1 # no sub_node
64 tree.sub_nodes.each {|node|
65 c = node.to_ids.compose(dbname)
66 next if c.nil? || c == ""
67 # print "#{@ids} #{node} #{c}\n"
69 n = @ids.gsub(node, c)
70 return n.to_ids.aggregate(dbname)
78 map_char {|ch| ch.char.decompose }
82 map_char {|ch| ch.char.decompose_all }
85 def ids_tree() IDS_Tree.new(self); end
87 def compose(dbname="ids")
90 byidsdb = cd.get_by_ids_db(dbname)
91 cid = byidsdb.decode(ids)
92 return "" if cid.nil? # TO CHECK: why "", not nil?
93 composed = Character.get(cid).to_s
94 return "" if composed.nil?
95 return "" if composed.char_length == 0
96 return composed if composed.char_length == 1
97 composed.each_char {|ch|
99 return ch # TO CHECK: the first character?
101 "" # TO CHECK: why "", not nil?
104 def aggregate(dbname="ids")
105 # In each sub part of IDS, search the corresponding char_id.
106 # If you could search the corresponding char_id, substitute with it.
108 return self if tree.depth <= 1 # no sub_node
109 tree.sub_nodes.each {|node|
110 c = node.compose(dbname)
111 next if c.nil? || c == ""
112 n = self.gsub(node, c)
113 return n.aggregate(dbname)
118 def find() # "日雲"→"曇"とかいう感じの操作
120 length = char_length()
123 ar << char.ids_contained #その文字を含んでいる漢字のリスト
136 if length == v #全部に顔を出していたら
147 0x2ff0 <= @char_id && @char_id <= 0x2fff
150 def idc_argument_number
151 return 0 unless is_idc?
152 return 3 if @char_id == 0x2ff2 || @char_id == 0x2ff3
158 def decompose_by_meaning
160 ids = self.ids_represent
161 return ids if ids && !ids.empty? && k != ids
162 ids = self.ids_element
163 return ids if ids && !ids.empty? && k != ids
164 ids = self.ids_meaning
165 return ids if ids && !ids.empty? && k != ids
169 def decompose # by glyph
172 return ids if ids && !ids.empty? && k != ids
174 return ids if ids && !ids.empty? && k != ids
180 de = self.decompose # the start point.
184 de = pde.decompose # decompose it again.
185 break if pde == de # previous is same.
186 exit if 10 < level # p ["too many recursive", self]