1 # Copyright (C) 2002-2004 Kouichirou Eto, All rights reserved.
5 require "chise/chisedb"
11 class CharacterFactory # generate Character object and cache them
14 MAX_CACHE_CHARACTER = 10000
18 @parser = CharacterParser.new
27 mcs = @parser.parse(s)
28 @chars[mcs] = Character.new(mcs) if @chars[mcs].nil?
33 clear if MAX_CACHE_CHARACTER < @chars.length # clear all cache
42 def initialize(char_id)
44 raise unless char_id.kind_of?(Integer) # make sure char_id is Integer.
45 raise if char_id < 0 # make sure char_id is positive.
48 @utf8_mcs = itou8(@char_id)
56 CharacterFactory.instance.get(s)
60 sprintf("Char:%x", @char_id)
63 def to_s() @utf8_mcs; end
66 f = normalize_feature_name(f)
79 v = get_feature("="+f)
89 f = normalize_feature_name(k)
91 feature = cd.get_feature(f)
92 feature.set_value(@char_id, v)
96 def method_missing(mid, *args) # ref. ostruct.rb
99 return self[mname] if args.empty? # get
101 if args.length == 1 && /=\Z/ =~ mname # put
102 self[mname.chop] = args.shift
110 en = EntityReferenceEncoder.new
115 cd = ChiseDB.instance
116 cd.each_feature_name {|f|
117 feature = cd.get_feature(f)
119 v = feature.get_value(@char_id)
123 feature.close # important
139 cd = ChiseDB.instance
140 cd.load_feature(@char_id, f)
143 def normalize_feature_name(a)
144 a = a.gsub(/_/, "-") #underlineは-に置換
145 a = a.sub(/-at-/, "@")
146 a = a.sub(/-plus-/, "+")
147 a = a.sub(/\Amap-/, "=>")
148 a = a.sub(/\Ato-/, "->")
149 a = a.sub(/\Afrom-/, "<-")