char = ch.char
return ch if char.has_attribute? #とりあえず最初にみつかったものを返すというヌルい仕様
}
- end
- def nu_compose_sorted()
- db = CodesysDB.instance
- composed = db.get('ids', self)
- return "" if composed.nil? #なかったよと。
- return "" if composed.char_length == 0 #なにごと?
- return composed if composed.char_length == 1
- ar = []
- composed.each_char {|ch|
- char = ch.char
- ar << ch if char.has_attribute?
- }
- ar2 = []
- ar.each {|ch|
- char = ch.char
- if char.char_id < 0xfffff #Unicodeっぽい?
- ar2 << ch
- ar.delete(ch)
- end
- }
- EntityReference.each_codesys{|codesys, er_prefix, keta, numtype|
- ar.each {|ch|
- char = ch.char
- v = char[codesys]
- if v #EntityReferenceの順番に準拠する。
- ar2 << ch
- ar.delete(ch)
- end
- }
- }
- if 0 < ar.length
- p ['yokuwakaran character', ar, ar[0].inspect_all]
- end
- return ar2.join("")
- end
- def nu_compose_ar()
- ar = []
- CharDB.instance.each_sort('ids'){|k, v| #文字, IDS
-# if v =~ self
- if v == self
- ar << k
- end
- }
- ar
+ return "" #attributeを持つものが一つも無かったら、""にする
end
def aggregate()
#selfである文字列をIDSだと仮定し、それを完全にcomposeしきらないで、
tree.sub_nodes.each {|node|
c = node.compose
next if c.nil? || c == ""
+# print "#{self} #{node} #{c}\n"
+# p [self, node, c]
n = self.gsub(node, c)
return n.aggregate
}
module CHISE
def windows?()
- (RUBY_PLATFORM =~ /win/ || RUBY_PLATFORM =~ /mingw/)
+ (RUBY_PLATFORM =~ /cygwin/ || RUBY_PLATFORM =~ /mswin32/ || RUBY_PLATFORM =~ /mingw32/)
end
module_function :windows?
if windows?()
return "" unless er =~ Regexp.new(REGEXP_ALL) #なんか、間違ってる?
er = $1 #ついでに中身の部分を取り出す
return $1.hex if er =~ /^MCS-([0-9A-Fa-f]+)/ #MCS
- return $1.hex if er =~ /^U[-+]([0-9A-Fa-f]+)/ #Unicode直打ち
+ return $1.hex if er =~ /^U[-+]?([0-9A-Fa-f]+)/ #Unicode直打ち
er.sub!(/^I-/, '') if er =~ /^I-/ #I-がついてるとどう違うのかはよくわからない
each_codesys {|codesys, er_prefix, keta, numtype| #p [codesys, er_prefix, keta, numtype]
}
return ""
end
+
def self.each_codesys()
CODESYS_ORDER.each {|lang|
CODESYS_TABLE.each {|codesys, er_prefix, keta, numtype| #普通こういう書き方はしない。ループ一個にする。
IDS_DB_DIR = '/home/eto/work/chise/ids/' #この後にIDS-JIS-X0208-1990.txtという感じに続く
end
IDS_LIST = "
+IDS-UCS-Basic.txt
+#IDS-UCS-Compat-Supplement.txt
+#IDS-UCS-Compat.txt
+IDS-UCS-Ext-A.txt
+IDS-UCS-Ext-B-1.txt
+IDS-UCS-Ext-B-2.txt
+IDS-UCS-Ext-B-3.txt
+IDS-UCS-Ext-B-4.txt
+IDS-UCS-Ext-B-5.txt
+IDS-UCS-Ext-B-6.txt
IDS-JIS-X0208-1990.txt
-IDS-CBETA.txt
IDS-Daikanwa-01.txt
IDS-Daikanwa-02.txt
IDS-Daikanwa-03.txt
IDS-Daikanwa-12.txt
IDS-Daikanwa-dx.txt
IDS-Daikanwa-ho.txt
-IDS-UCS-Basic.txt
-#IDS-UCS-Compat-Supplement.txt
-#IDS-UCS-Compat.txt
-IDS-UCS-Ext-A.txt
-IDS-UCS-Ext-B-1.txt
-IDS-UCS-Ext-B-2.txt
-IDS-UCS-Ext-B-3.txt
-IDS-UCS-Ext-B-4.txt
-IDS-UCS-Ext-B-5.txt
-IDS-UCS-Ext-B-6.txt
+IDS-CBETA.txt
".split
def initialize()
super
def make_ids_db
db = IDS_TEXT_DB.instance
db.each_file {|file|
+ @char_counter = 0
+ @same_ids_counter = 0
+ @good_ids_counter = 0
+ @conflict_ids_counter = 0
db.each_line(file){|code, ch, ids|
- char = Character.get(ch) #実体参照である
+ @char_counter += 1
+
ids = "" if ids == nil
+ next if ids == "" #IDSが定義されていない場合は、さっくりと無視するべしよ。
+
+ charimg = Character.get(ch) #実体参照である可能性がある
+
+ next if code =~ /'$/ || code =~ /"$/ #大漢和番号のダッシュ付きは無視する
+ char = Character.get("&"+code+";") #code表記を元に実体参照を作って解釈する
+ if char.nil? || char.to_s == "" #うまく文字にならなかった
+ print "char == null #{char.inspect} #{code} #{ch} #{ids}\n" unless code =~ /^M-/ || code =~ /^CB/
+ #大漢和、CBETA以外の場合は、エラーメッセージ。
+ next
+ end
+ if char != charimg #code表記と文字が一致していない?
+ unless code =~ /^M-/ || code =~ /^MH-/ || code =~ /^CB/ #食い違っていて当然であるので何もしない
+ print "unknown char #{char.inspect} #{code} #{ch} #{ids}\n"
+ next #それ以外の場合はエラメッセージをだして、次へ。
+ end
+ end
+
ids.de_er! #実体参照を解除する
- char['ids-text'] = ids
+ next if ids == char.to_s #もし文字とまったく一緒なら、意味が無いので情報を持たない
+ next if ids.char_length == 1
+
+ idstree = IDS_Tree.new(ids)
+ c = idstree.check_integrity
+ c = "contains self" if ids.include?(char.to_s)
+# c = "no attribute" if !char.has_attribute? #isolated characterはまぎれこませない。
+ if c #ちょっとでもエラーがある場合は、
+ char['ids-error'] = c #エラーを記録して、データとしては保持しない
+ next
+ end
+
+ if char['ids'].nil? || char['ids'] == "" #元々IDSが無かった場合は、
+ char['ids'] = ids #普通に代入すればそれでいいです。
+ @good_ids_counter += 1
+ else #しかしいままでにすでにIDSが定義されていた場合は?
+ if char['ids'] == ids #新しいIDSと古いIDSが完全に一致するなら無視しましょう。
+ @same_ids_counter += 1
+ else #しかしいままでのIDSと新しいIDSが食い違った場合は?
+ @conflict_ids_counter += 1
+# print "conflict #{char.inspect} #{code} #{ids} #{char['ids']}\n"
+ end
+ end
}
- p [file, CharacterFactory.instance.length]
+ print "#{file} #{@char_counter} #{@same_ids_counter} #{@conflict_ids_counter} #{@good_ids_counter}\n"
CharacterFactory.instance.reset()
}
- @dbs.dump_db('ids-text') #テキスト化する
- end
- def make_ids_error_check
- @dbs.each('ids-text') {|k, ids|
- next if k.nil? || k == "" || ids.nil? || ids == "" #無視します
- next if k == ids #問題無しなので
- char = k.char
- idstree = IDS_Tree.new(ids)
- c = idstree.check_integrity
- c = "contains self" if ids.include?(k)
- c = "no attribute" if !char.has_attribute? #isolated characterはまぎれこませない。
- if c
- char['ids-error'] = c
- else
- char['ids'] = ids
- end
-# print c,"\t", k.char.to_er,"\t", k,"\t", v,"\n"
- }
@dbs.dump_db('ids-error') #テキスト化する
@dbs.dump_db('ids') #テキスト化する
end
h.delete_if {|k, v| #h[k]が""になる可能性もあるが、それはkeyとして入れないことにする。
v == ""
}
- p ['length', h.length]
+ print "length #{h.length}\n"
cdb = CodesysDB.instance
cdb.make_db_no_question_mark('ids', h)
+ p ['make db no q mark done.']
+ cdb.open_db('ids') #これが無いと、dump_dbされません。
cdb.dump_db('ids')
+ p ['dump_db done.']
end
def char_sort(composed)
return composed if composed.char_length == 1