n.c.
[chise/ruby.git] / chise / rbchise.rb
index e43ee16..c90749e 100755 (executable)
@@ -36,13 +36,11 @@ module CHISE
     end
 
     def each_feature
-      dir = @location + "character/feature"
-      dir.each_entry {|f|
-       next if f.to_s == "." || f.to_s == ".."
-       f = f.unescape_win_filename
-       f = f.unescape
-       yield(f.to_s)
-      }
+      each_entry("character/feature") {|f| yield(f) }
+    end
+
+    def each_ccs
+      each_entry("character/by_feature") {|f| yield(f) }
     end
 
     def load_feature(name, cid)
@@ -56,63 +54,19 @@ module CHISE
       return nil if ct.nil?
       ct.decode(code_point)
     end
-  end
-
-  class FeatureTable
-    include ChiseValue
-    include TableAccessModule
-
-    def set_value(cid, value)
-      setup_db(true)
-      return nil if @db.nil?
-      @db.put(format_char_id(cid), value)
-    end
-
-    def get_value(cid)
-      setup_db
-      return nil if @db.nil?
-      @db.get(format_char_id(cid))
-    end
-
-    def each
-      setup_db
-      return nil if @db.nil?
-      @db.each {|k, v|
-       yield(parse_c_string(k), v)
-      }
-    end
 
     private
-    def setup_db(writable=nil)
-      setup_db_exec(writable, "character", "feature")
-    end
-  end
-
-  class CCSTable
-    include ChiseValue
-    include TableAccessModule
-
-    def decode(code_point)
-      setup_db
-      return nil if @db.nil?
-      v = @db.get(code_point.to_s)
-      return nil if v.nil?
-      parse_c_string(v)
-    end
-
-    def set_decoded_char(code_point, cid)
-      setup_db(true)
-      return nil if @db.nil?
-      @db.put(code_point.to_s, format_char_id(cid))
-    end
-
-    private
-    def setup_db(writable=nil)
-      setup_db_exec(writable, "character", "by_feature")
+    def each_entry(subdir)
+      dir = @location + subdir
+      dir.each_entry {|f|
+       next if f.to_s == "." || f.to_s == ".."
+       next if f.to_s =~ /\.txt\Z/
+       yield(f.unescape_win_filename.unescape.to_s)
+      }
     end
   end
 
-  module TableAccessModule
+  class TableAccess
     def initialize(ds, name)
       @ds, @name = ds, name
       @db = nil
@@ -126,6 +80,12 @@ module CHISE
     end
     alias close sync
 
+
+    private
+    def setup_db(writable=nil)
+      setup_db_exec(writable, @category, @keyvalue)
+    end
+
     def setup_db_exec(writable, cat, key)
       if writable
        sync if @access & BDB::CREATE == 0
@@ -146,6 +106,64 @@ module CHISE
     end
   end
 
+  class FeatureTable < TableAccess
+    include ChiseValue
+
+    def initialize(ds, name)
+      super
+      @category, @keyvalue = "character", "feature"
+    end
+
+    def get_value(cid)
+      setup_db
+      return nil if @db.nil?
+      parse_value(@db.get(format_char_id(cid)))
+    end
+
+    def set_value(cid, value)
+      setup_db(true)
+      return nil if @db.nil?
+      @db.put(format_char_id(cid), value)
+    end
+
+    def each
+      setup_db
+      return nil if @db.nil?
+      @db.each {|k, v|
+       yield(parse_c_string(k), v)
+      }
+    end
+  end
+
+  class CCSTable < TableAccess
+    include ChiseValue
+
+    def initialize(ds, name)
+      super
+      @category, @keyvalue = "character", "by_feature"
+    end
+
+    def decode(code_point)
+      setup_db
+      return nil if @db.nil?
+      parse_c_string(@db.get(code_point.to_s))
+    end
+
+    def set_decoded_char(code_point, cid)
+      setup_db(true)
+      return nil if @db.nil?
+      @db.put(code_point.to_s, format_char_id(cid))
+    end
+
+    def each
+      setup_db
+      return nil if @db.nil?
+      @db.each {|k, v|
+       yield(parse_value(k), parse_c_string(v))
+      }
+    end
+  end
+
   class AttributeTable
     def initialize(dir, cat, keytype, name, amask, mmask)
       dbdir  = dir + cat + keytype
@@ -175,7 +193,19 @@ module CHISE
   end
 
   module ChiseValue
+    def parse_value(v)
+      return v if v.nil?
+      #return v if v.kind_of?(Integer)
+      return v.to_i if /\A\d+\Z/ =~ v # number?
+      return $1 if /\A"(.+)"\Z/ =~ v # remove surrounding "
+      #return v.sub(/\A\?/, "") if v =~ /\A\?/ # remove ? in the head
+      #return parse_sexp(v) if v =~ /\A\(.+\)\Z/ # parse sexp # not yet
+      v
+    end
+
     def parse_c_string(str)
+      return nil if str.nil?
+
       i = 0
       c = str[i]
       i += 1