IDC_SURROUND_FROM_LOWER_LEFT = IDC_A
IDC_OVERLAID = IDC_B
- class IDS_Decomposer
- def initialize(str)
- @str = str
+ class IDS
+ def initialize(ids)
+ @ids = ids
+ @ids.freeze
end
- def decompose
-
+ def tree() IDS_Tree.new(@ids); end
+
+ def compose
+ ids = @ids
+ cd = ChiseDB.instance
+ ct = cd.get_by_ids_db("ids")
+ cid = ct.decode(ids)
+ return "" if cid.nil?
+ composed = Character.get(cid).to_s
+ return "" if composed.nil?
+ return "" if composed.char_length == 0
+ return composed if composed.char_length == 1
+ composed.each_char {|ch|
+ char = ch.char
+ #return ch if char.has_attribute?
+ return ch
+ }
+ return ""
+ end
+
+ def aggregate
+ # Take each sub part of String.
+ # If you can aggregate the sub part, aggregate it.
+ #tree = IDS_Tree.new(@ids)
+ tree = self.tree
+ return @ids if tree.depth <= 1 # no sub_node
+ tree.sub_nodes.each {|node|
+ c = node.to_ids.compose
+ next if c.nil? || c == ""
+ # print "#{@ids} #{node} #{c}\n"
+ # p [@ids, node, c]
+ n = @ids.gsub(node, c)
+ return n.to_ids.aggregate
+ }
+ @ids
end
end
- module IDS_Module
+ module StringIDS
def decompose
- self.ids
+ map_char {|ch| ch.char.decompose }
end
def decompose_all
-
+ map_char {|ch| ch.char.decompose_all }
end
+ end
+ module CharacterIDC
+ def is_idc?
+ 0x2ff0 <= @char_id && @char_id <= 0x2fff
+ end
+
+ def idc_argument_number
+ return 0 unless is_idc?
+ return 3 if @char_id == 0x2ff2 || @char_id == 0x2ff3
+ return 2
+ end
end
+ module CharacterIDS
+ def decompose # by glyph
+ decompose_internal
+ end
+
+ def decompose_by_meaning
+ decompose_internal(true)
+ end
+
+ def decompose_all
+ pde = ""
+ de = self.decompose # the start point.
+ level = 0
+ while true
+ pde = de
+ de = pde.decompose # decompose it again.
+ break if pde == de # previous is same.
+ exit if 10 < level # p ["too many recursive", self]
+ level += 1
+ end
+ de
+ end
+
+ private
+
+ def decompose_internal(by_meaning=nil)
+ #idss = self.ids
+ #return idss if idss
+ #return k if self.is_basic_kanji?
+ #return ids if idss && 0 < ids.length && k != ids
+
+ k = self.to_s
+ if by_meaning
+ ids = self.ids_represent
+ return ids if ids && 0 < ids.length && k != ids
+ ids = self.ids_element
+ return ids if ids && 0 < ids.length && k != ids
+ ids = self.ids_meaning
+ return ids if ids && 0 < ids.length && k != ids
+ end
+ ids = self.ids_aggregated
+ return ids if ids && 0 < ids.length && k != ids
+ ids = self.ids
+ return ids if ids && 0 < ids.length && k != ids
+ k
+
+ #return k if ids.nil? || ids.length == 0 || k == ids
+ #if ids.char_length == 2
+ #p ["What???", k, ids, k.inspect_all]
+ ##return idsx[1] #二個目だけ返すとか?
+ #return k #IDSに展開する方法が無いと。
+ #end
+ #return k if k == ids
+ #if ids.include?(k) #<C5-4C4D><C6-4A37>この二文字のBUG対策
+ ##return ids.sub(k, "")
+ #return k #IDSに展開する方法が無いと。
+ #end
+ #return ids
+ end
+
+ end
end