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)
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
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
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
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