update.
[chise/ruby.git] / chise / ids.rb
index 792c863..4b695ce 100755 (executable)
@@ -29,25 +29,131 @@ module CHISE
   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