From f73918be4cbdab8f90693963157aba624797816d Mon Sep 17 00:00:00 2001 From: eto Date: Mon, 17 Feb 2003 14:40:28 +0000 Subject: [PATCH] change IDS text read. change Windows condition. --- src/chise.rb | 148 +++++++++++++++++++++++--------------------------- tools/make_ids_db.rb | 13 ++--- 2 files changed, 75 insertions(+), 86 deletions(-) diff --git a/src/chise.rb b/src/chise.rb index 4901fa2..feed0b6 100755 --- a/src/chise.rb +++ b/src/chise.rb @@ -95,50 +95,7 @@ class String 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しきらないで、 @@ -148,6 +105,8 @@ class String 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 } @@ -157,7 +116,7 @@ end 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?() @@ -199,7 +158,7 @@ module CHISE 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] @@ -217,6 +176,7 @@ module CHISE } return "" end + def self.each_codesys() CODESYS_ORDER.each {|lang| CODESYS_TABLE.each {|codesys, er_prefix, keta, numtype| #普通こういう書き方はしない。ループ一個にする。 @@ -776,8 +736,17 @@ module CHISE 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 @@ -792,16 +761,7 @@ IDS-Daikanwa-11.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 @@ -872,33 +832,60 @@ IDS-UCS-Ext-B-6.txt 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 @@ -916,10 +903,13 @@ IDS-UCS-Ext-B-6.txt 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 diff --git a/tools/make_ids_db.rb b/tools/make_ids_db.rb index 13b346c..c1740f2 100755 --- a/tools/make_ids_db.rb +++ b/tools/make_ids_db.rb @@ -9,14 +9,13 @@ include CHISE db = IDS_DB.instance db.make_ids_db -db.make_ids_error_check #35分程度かかる -IDS_TEXT_DB.instance.make_ids_error +#IDS_TEXT_DB.instance.make_ids_error db.make_ids_reverse -db.dump_ids_duplicated +db.dump_ids_duplicated #1分 db.make_ids_aggregated -db.dump_ids_aggregated -db.make_ids_parts -db.make_ids_contained -db.make_ids_decomposed #1分 +#db.dump_ids_aggregated +#db.make_ids_parts +#db.make_ids_contained +#db.make_ids_decomposed #1分 #----------------------------------------------------------------------end. -- 1.7.10.4