change IDS text read.
authoreto <eto>
Mon, 17 Feb 2003 14:40:28 +0000 (14:40 +0000)
committereto <eto>
Mon, 17 Feb 2003 14:40:28 +0000 (14:40 +0000)
change Windows condition.

src/chise.rb
tools/make_ids_db.rb

index 4901fa2..feed0b6 100755 (executable)
@@ -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
index 13b346c..c1740f2 100755 (executable)
@@ -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.