OSDN Git Service

コメント内のカギ括弧の間違いを修正した。s/]/」/
[o-dic/o-dic.git] / script / oki2atk.pl
index bc08c33..234a568 100755 (executable)
@@ -1,45 +1,71 @@
 #!/usr/bin/perl
 #
-# oki2atk.pl - ²­Æì¼­½ñ¤Î¥Õ¥¡¥¤¥ë¤òATOK13·Á¼°¤ËÊÑ´¹¤¹¤ë¡£
+# oki2atk.pl - 沖縄辞書のファイルをATOK13形式に変換する。
 #
 #                                                         yonesu@syon.co.jp
 #
-# ¤³¤Î¥¹¥¯¥ê¥×¥È¤ò»È¤Ã¤Æ¡¢°Ê²¼¤Î¤è¤¦¤Ë¡Öokinawa.txt¡×¤òÀ¸À®¤·¤Æ¤ª¤¤¤Æ¡¢
-#     $ nkf -e *.dic | ./oki2atk.pl | sort -u | nkf -s > okinawa.txt
-#  ATOK13¤Î¼­½ñ¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤òµ¯Æ°¤·¡¢
-# ¡Ö°ì³ç½èÍý]-¡Öñ¸ì°ì³ç½èÍý¡×¤Î¡Öñ¸ì¥Õ¥¡¥¤¥ë(T)¡×¤Ë
-#  okinawa.txt¤ò»ØÄꤷ¡¢¡ÖÅÐÏ¿¡×¤ò²¡²¼¤·¤Æ¤¯¤À¤µ¤¤¡£
+# このスクリプトを使って、以下のように「okinawa.txt」を生成しておいて、
+#     $ cat ../*.dic | ./oki2atk.pl -g | sort -u > okinawa.txt
+#  ATOK13の辞書ユーティリティを起動し、
+# 「一括処理」-「単語一括処理」の「単語ファイル(T)」に
+#  okinawa.txtを指定し、「登録」を押下してください。
+#
+#  「尚灝王」(しょうこうおう)など、JIS X 0208の範囲外の文字が含まれる単語を
+#  辞書にインポートする場合には、UTF-8 で出力してから、Notepad.exeなどで
+#  「Unicode」(UTF-16LE BOM付き)に変換してください。
 #
 #############################################################################
-#                          ATOK13¤Ç¤ÎÉÊ»ìÂηϠ                              #
-#1  Ì¾»ì       2  ¸ÇÍ­¿ÍÀ«     3  ¸ÇÍ­¿Í̾     4  ¸ÇÍ­¿Í¾     5  ¸ÇÍ­ÃÏ̾ #
-#6  ¸ÇÍ­ÁÈ¿¥   7  ¸ÇÍ­¾¦ÉÊ     8  ¸ÇÍ­°ìÈÌ     9  Ì¾»ì¥µÊÑ     10 Ì¾»ì¥¶ÊÑ #
-#11 Ì¾»ì·ÁÆ°   12 Ì¾¥µ·ÁÆ°     13 ¿ô»ì         14 Éû»ì         15 Ï¢Âλ젠 #
-#16 Àܳ»ì     17 ´¶Æ°»ì       18 ÆÈΩ¸ì       19 ÀÜƬ¸ì       20 ´§¿ô»ì   #
-#21 ÀÜÈø¸ì     22 ½õ¿ô»ì       23 ¥«¹Ô¸ÞÃÊ     24 ¥¬¹Ô¸ÞÃÊ     25 ¥µ¹Ô¸ÞÃÊ #
-#26 ¥¿¹Ô¸ÞÃÊ   27 ¥Ê¹Ô¸ÞÃÊ     28 ¥Ð¹Ô¸ÞÃÊ     29 ¥Þ¹Ô¸ÞÃÊ     30 ¥é¹Ô¸ÞÃÊ #
-#31 ¥ï¹Ô¸ÞÃÊ   32 ¥Ï¹Ô»ÍÃÊ     33 °ìÃÊÆ°»ì     34 ¥«ÊÑÆ°»ì     35 ¥µÊÑÆ°»ì #
-#36 ¥¶ÊÑÆ°»ì   37 ·ÁÍƻ젠     38 ·ÁÍƻ쥦     39 ·ÁÍÆÆ°»ì     40 ·ÁÆ°¥¿¥ê #
-#41 Ã±´Á»ú                                                                  #
+#                          ATOK13での品詞体系                               #
+#1  名詞     2  固有人姓 3  固有人名 4  固有人他 5  固有地名 #
+#6  固有組織       7  固有商品 8  固有一般 9  名詞サ変 10 名詞ザ変 #
+#11 名詞形動       12 名サ形動 13 数詞               14 副詞               15 連体詞   #
+#16 接続詞  17 感動詞    18 独立語    19 接頭語    20 冠数詞   #
+#21 接尾語  22 助数詞    23 カ行五段 24 ガ行五段 25 サ行五段 #
+#26 タ行五段       27 ナ行五段 28 バ行五段 29 マ行五段 30 ラ行五段 #
+#31 ワ行五段       32 ハ行四段 33 一段動詞 34 カ変動詞 35 サ変動詞 #
+#36 ザ変動詞       37 形容詞    38 形容詞ウ 39 形容動詞 40 形動タリ #
+#41 単漢字                                                                  #
 #############################################################################
 #
-#require 5.6.0;
-#use strict;
-#our $phonate;
-#our $word;
-#our $class;
+require 5.6.0;
+require 'ODIC.pm';
+use strict;
+use Getopt::Long qw(:config posix_default no_ignore_case gnu_compat);
+
+our $phonate;
+our $word;
+our $class;
+
+my $help_only;
+my $skip_geta;
+my $utf8_output;
+
+GetOptions(
+    'help|h'      => \$help_only,
+    'skip-geta|g' => \$skip_geta,
+    'utf8|u'      => \$utf8_output
+);
+if (defined($help_only)) {
+    print STDERR "usage: $0 [--help|-h] [--skip-geta|-g] [--utf8-output|-u]\n";
+    exit 1;
+}
 
 &header;
 
 while (<>) {
-       s/#.*$//;               # `#'°Ü¹Ô¤ò¼è¤êµî¤ë
-       next if (/^\s*$/);      # ¤½¤Î·ë²Ì¶õ¹Ô¤Ë¤Ê¤Ã¤¿¹Ô¤ÏÆɤßÈô¤Ð¤¹¡£
+       # JIS X 0208 に含まれていない文字を含む行を読み飛ばす
+       # 読み飛ばしにはコメントに「〓あり」マーカーが必要
+       next if (defined($skip_geta) && /〓あり/);
+
+       s/#.*$//;               # `#'以降を取り去る
+       next if (/^\s*$/);      # その結果空行になった行は読み飛ばす。
+
        if (/(\S+)\s+(\S+)\s+(\S+)/) {
-               $phonate  = $1; # Æɤß
-               $word = $2;     # Ã±¸ì
-               $class = $3;    # ÉÊ»ì
-               &check_phonate;
-               &check_word;
+               $phonate = $1;  # 読み
+               $word    = $2;  # 単語
+               $class   = $3;  # 品詞
+               ODIC::check_phonate($phonate);
+               ODIC::check_word($word);
                &convert_class;
        }
        else {
@@ -51,106 +77,92 @@ while (<>) {
 exit 0;
 
 
-sub check_phonate
-{
-       if (length($phonate) > 40) {
-               print STDERR "Warning: $.: too long phonate `$phonate'\n";
-       }
-       if ($phonate =~ /[^¤¢¤¤¤¦¤¨¤ª¤«¤­¤¯¤±¤³¤µ¤·¤¹¤»¤½¤¿¤Á¤Ä¤Æ¤È¤Ê¤Ë¤Ì¤Í¤Î¤Ï¤Ò¤Õ¤Ø¤Û¤Þ¤ß
-¤à¤á¤â¤é¤ê¤ë¤ì¤í¤¬¤®¤°¤²¤´¤¶¤¸¤º¤¼¤¾¤À¤Â¤Å¤Ç¤É¤Ð¤Ó¤Ö¤Ù¤Ü¤¡¤£¤¥¤§¤©¤Ã¤ç¤ã¤å¤î¤Ñ¤Ô¤×¤Ú¤Ý¤ä¤æ
-¤è¤ï¤ò¤ó¥ô¡¼]/) {
-               print STDERR "Warning: $.: ilegal character in `$phonate'\n";
-       }
-}
-
-
-sub check_word
-{
-       if (length($word) > 64) {
-               print STDERR "Warning: $.: too long word `$word'\n";
-       }
-       if ($word =~ /[ \t",#]/) {
-               print STDERR "Warning: $.: ilegal character in `$word'\n";
-       }
-}
-
-
 sub convert_class {
-       if ($class eq "ÉáÄÌ̾»ì") {
-               print "$phonate\t$word\t 1 \n";
+       if ($class eq "普通名詞") {
+               $class = 1;
        }
-       elsif ($class eq "¥µÊÑ̾»ì") {
-               print "$phonate\t$word\t 9 \n";
+       elsif ($class eq "サ変名詞") {
+               $class = 9;
        }
-       elsif ($class eq "·Áư̾»ì") {
-               print "$phonate\t$word\t 11 \n";
+       elsif ($class eq "形動名詞") {
+               $class = 11;
        }
-       elsif ($class eq "À«") {
-               print "$phonate\t$word\t 2 \n";
+       elsif ($class eq "") {
+               $class = 2;
        }
-       elsif ($class eq "̾") {
-               print "$phonate\t$word\t 3 \n";
+       elsif ($class eq "") {
+               $class = 3;
        }
-       elsif ($class eq "¤½¤Î¾¤Î¿Í̾") {
-               print "$phonate\t$word\t 4 \n";
+       elsif ($class eq "その他の人名") {
+               $class = 4;
        }
-       elsif ($class eq "ñ½ãÃÏ̾") {
-               print "$phonate\t$word\t 5 \n";
+       elsif ($class eq "単純地名") {
+               $class = 5;
        }
-       elsif ($class eq "ÀÜÈø¸ìÉÕ¤­ÃÏ̾") {
-               print "$phonate\t$word\t 5 \n";
+       elsif ($class eq "接尾語付き地名") {
+               $class = 5;
        }
-       elsif ($class eq "ÁÈ¿¥Ì¾") {
-               print "$phonate\t$word\t 6 \n";
+       elsif ($class eq "組織名") {
+               $class = 6;
        }
-       elsif ($class eq "¤½¤Î¾¸Çͭ̾»ì") {
-               print "$phonate\t$word\t 7 \n";
+       elsif ($class eq "その他固有名詞") {
+               $class = 7;
        }
-       elsif ($class eq "Éû»ì") {
-               print "$phonate\t$word\t 14 \n";
+       elsif ($class eq "副詞") {
+               $class = 14;
        }
-       elsif ($class eq "Àܳ»ì") {
-               print "$phonate\t$word\t 16 \n";
+       elsif ($class eq "接続詞") {
+               $class = 16;
        }
-       elsif ($class eq "´¶Æ°»ì") {
-               print "$phonate\t$word\t 17 \n";
+       elsif ($class eq "感動詞") {
+               $class = 17;
        }
-       elsif ($class eq "·ÁÍÆ»ì") {
-               print "$phonate\t$word\t 37 \n";
+       elsif ($class eq "形容詞") {
+               $class = 37;
        }
-       elsif ($class eq "·ÁÍÆÆ°»ì") {
-               print "$phonate\t$word\t 39 \n";
+       elsif ($class eq "形容動詞") {
+               $class = 39;
        }
-       elsif ($class eq "ÀÜƬ¸ì") {
-               print "$phonate\t$word\t 19 \n";
+       elsif ($class eq "接頭語") {
+               $class = 19;
        }
-       elsif ($class eq "¿ô»úÎóÀÜƬ¸ì") {
-               print "$phonate\t$word\t 20 \n";
+       elsif ($class eq "数字列接頭語") {
+               $class = 20;
        }
-       elsif ($class eq "ÀÜÈø¸ì") {
-               print "$phonate\t$word\t 21 \n";
+       elsif ($class eq "接尾語") {
+               $class = 21;
        }
-       elsif ($class eq "¿Í̾ÀÜÈø¸ì") {
-               print "$phonate\t$word\t 21 \n";
+       elsif ($class eq "人名接尾語") {
+               $class = 21;
        }
-       elsif ($class eq "ÃÏ̾ÀÜÈø¸ì") {
-               print "$phonate\t$word\t 21 \n";
+       elsif ($class eq "地名接尾語") {
+               $class = 21;
        }
-       elsif ($class eq "ÁÈ¿¥Ì¾ÀÜÈø¸ì") {
-               print "$phonate\t$word\t 21 \n";
+       elsif ($class eq "組織名接尾語") {
+               $class = 21;
        }
-       elsif ($class eq "¿ô»úÎóÀÜÈø¸ì") {
-               print "$phonate\t$word\t 13 \n";
+       elsif ($class eq "数字列接尾語") {
+               $class = 13;
        }
-       elsif ($class eq "À®¶ç") {
-               print "$phonate\t$word\t 1 \n";
+       elsif ($class eq "成句") {
+               $class = 1;
        }
-       elsif ($class eq "̵ÉÊ»ì") {
-               print "$phonate\t$word\t 41 \n";
+       elsif ($class eq "無品詞") {
+               $class = 41;
        }
        else {
                print STDERR "Error: $.: unknown class `$class': $phonate\t$word\n";
-               print "$phonate\t$word\t¡Î¢®¡Ï\n";
+               if (defined($utf8_output)) {
+                       print "$phonate\t$word\t[〓]\r\n";
+               } else {
+                       print ODIC::to_shiftjis("$phonate\t$word\t[〓]\r\n");
+               }
+               return;
+       }
+       if (defined($utf8_output)) {
+               print "$phonate\t$word\t $class \r\n";
+       } else {
+               print ODIC::to_shiftjis("$phonate\t$word\t $class \r\n");
        }
 }
 
@@ -165,10 +177,14 @@ sub version {
        ($sec, $min, $hour, $mday, $mon, $year) = localtime(time());
        $year += 1900;
        $mon++;
-       print "¤ª¤­¤Ê¤ï¤¸¤·¤ç¤Î¤Ò¤Å¤±\t$year/$mon/$mday(²­Æì¼­½ñ¤ÎÆüÉÕ¤±)\t¡Î̾»ì¡Ï\n";
+       if (defined($utf8_output)) {
+               print "おきなわじしょのひづけ\t$year/$mon/$mday(沖縄辞書の日付け)\t 1 \r\n";
+       } else {
+               print ODIC::to_shiftjis("おきなわじしょのひづけ\t$year/$mon/$mday(沖縄辞書の日付け)\t 1 \r\n");
+       }
 }
 
 sub header {
-       print "!!DICUT16\n";
+       print "!!DICUT16\r\n";
 }