namazu-ml(avocado)


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: nkf + MHonArc + Namazu



眞柄@富士通オアシス開発です。
浦島フォロー第二弾です。

>>> Sun, 15 Mar 1998 18:12:50 +0900 の刻に
>>> mmatsu@xxxxxxxxxxxxxxxxxxxxxxx(Masafumi Matsumura) 氏曰く
> MHonArc の resource file で、DECODEHEADS/CHARSETCONVERTERS が
> 使えればよいのですが、どなたか、iso8859.pl 相当の日本語版ファイルを
> 作ってしまったよ、なんていう方はいらっしゃいませんか?

作ってあります。:-)

MHonArcは、ところどころにus-asciiしか想定していないコードがあって、
実際はiso8859.pl相当だけでは不完全でした。その辺の不具合も改造する
パッチを作りました。
しばらく前から社内で公開して使っていますが、一応は動いているようです。
multipartで添付しておきます。使い方は、パッチの先頭部分にある
ドキュメントを参照してください。

-- 
眞柄 康弘 (Magara Yasuhiro)
% (株)富士通オアシス開発 開発部第一開発課
diff -cNrBb MHonArc-2.2.0.orig/00README.jp MHonArc-2.2.0.new/00README.jp
*** MHonArc-2.2.0.orig/00README.jp	Thu Jan  1 09:00:00 1970
--- MHonArc-2.2.0.new/00README.jp	Fri Apr 17 11:20:51 1998
***************
*** 0 ****
--- 1,64 ----
+         MHonArc-2.2.0 Japanization Patch
+ 
+ [What is this patch ?]
+ 
+ MHonArc-2.2.0は、メール本文については元のままでも日本語に対応しているう
+ え、RFC2047のヘッダ拡張にも対応していますが、ヘッダがJISで書かれている
+ 場合は文字化けが発生します。このパッチは、
+   ・ヘッダの日本語部分が破壊されることなくhtml化されるようにする
+   ・サーチエンジンNamazuで使いやすいhtmlを出力する
+ ための物です。
+ 
+ [Description]
+ 
+ 日本語(ISO-2022-JP)対応の作業は、m2h_text_plain'jp2022()を参考に、眞柄
+ が解析/改造を行ないました。iso2022jp.pl, Japanize.rcの一部では、市川至
+ 課長(ichikawa@xxxxxxxxxxxxxxxx)の書かれたコードを参考にしました。
+ 改造に際しては、オリジナルのコード変更が最小限で済むように、対応可能な
+ 部分はリソースファイルに記述するように心がけましたが、最後まで手間取っ
+ たmailto(), extract_email_address。extract_email_name については、泥縄
+ 的かつ不完全な対応になってしまいました。
+ MHonArcの日本語化については、最初にnkfを通しておくという方法も知られて
+ いますが、本パッチはオリジナルの環境であるperlだけで動作します。
+ 
+ [How to apply this patch.]
+ 
+ パッチを適用するには、MHonArc-2.2.0を展開し、
+   patch -p1 -d MHonArc-2.2.0 < MHonArc-2.2.0-Japanize-SSE.patch
+ を実行してください。
+ 日本語メッセージを処理する場合は、リソースファイル Japanize.rc の
+ 内容を、実際に使用するリソースファイルに追加して下さい。また、Namazuの
+ 検索対象にする場合は、Namazu.rcの内容を追加することをお勧めします。
+ 
+ [Distribution]
+ 
+ 再配布等に関しては、オリジナルに同梱のCOPYING(GNU General Public License)
+ に準ずるものとします。
+ 
+ [Contact]
+ 質問、バグ報告等は、眞柄まで御連絡下さい。
+ 
+                 眞柄 康弘 (Magara Yasuhiro) gama@xxxxxxxxxxxxxxxxxxxxxxxx
+                 籍は 株式会社富士通オアシス開発 開発部第一開発課
+                 席は 富士通株式会社 南多摩工場, ソフトウェア事業本部
+                      第一ソフトウェア事業部 第四開発部 SGMLプロジェクト
+ 
+ [ChangeLog]
+ 
+ 1998.Apr.17
+   [bug]ヘッダのmailtoリンクが化けるバグを修正。
+        mhonarc'mailtoをiso_2022_jp'mailtoに置き換えた。
+   [bug]DateとThreadのIndexでヘッダの発信者名が化けるバグを修正。
+        mhonarc'extract_email_addressをiso_2022_jp'extract_email_address
+        のstubに変更。
+        mhonarc'extract_email_nameでmhonarc'extract_email_addressの
+        結果を利用するように変更。
+ 
+ 1998.Apr.16
+   [info]MHonArc-2.2.0の日本語対応及びNamazu-1.1.2対応パッチとして公開
+   [bug]iso_2022_jp'str2sgmlで$offsetが初期化されないバグを修正。
+   [info]mhonarc'htmlize_iso2022jpをiso_2022_jp'str2sgmlに統合。
+   [info]mhinit.plへのパッチをリソースファイルへ移動。
+ 
+ 1997.Sep.26
+   [info]MHonArc-2.1の日本語対応及びSSE-1.1対応パッチとして公開
diff -cNrBb MHonArc-2.2.0.orig/Japanize.rc MHonArc-2.2.0.new/Japanize.rc
*** MHonArc-2.2.0.orig/Japanize.rc	Thu Jan  1 09:00:00 1970
--- MHonArc-2.2.0.new/Japanize.rc	Thu Apr 16 11:45:47 1998
***************
*** 0 ****
--- 1,42 ----
+ <!--	MHonArc resource file
+ 
+ 	Japanize.rc 1.1 1998/04/16
+ 
+ 	For messages which has Japanized(iso-2022-jp) headers.
+   -->
+ 
+ <!-- In Japan, default charset is 'ISO-2022-JP'. -->
+ <CharsetConverters>
+ plain;          iso_2022_jp::str2sgml;	iso2022jp.pl
+ us-ascii;       mhonarc::htmlize;
+ iso-8859-1;     mhonarc::htmlize;
+ iso-8859-2;     iso_8859::str2sgml;     iso8859.pl
+ iso-8859-3;     iso_8859::str2sgml;     iso8859.pl
+ iso-8859-4;     iso_8859::str2sgml;     iso8859.pl
+ iso-8859-5;     iso_8859::str2sgml;     iso8859.pl
+ iso-8859-6;     iso_8859::str2sgml;     iso8859.pl
+ iso-8859-7;     iso_8859::str2sgml;     iso8859.pl
+ iso-8859-8;     iso_8859::str2sgml;     iso8859.pl
+ iso-8859-9;     iso_8859::str2sgml;     iso8859.pl
+ iso-8859-10;    iso_8859::str2sgml;     iso8859.pl
+ iso-2022-jp;    iso_2022_jp::str2sgml;	iso2022jp.pl
+ default;        iso_2022_jp::str2sgml;	iso2022jp.pl
+ </CharsetConverters>
+ <MIMEArgs>
+ text/plain;     default=iso-2022-jp
+ mage/gif;       inline
+ image/jpeg;	inline
+ image/x-xbitmap;	inline
+ image/x-xbm;	inlin
+ </MIMEArgs>
+ 
+ <!-- keep SUBJECTNA in multibyte character(Japanese) environment -->
+ <MsgPgBegin>
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML//EN">
+ <HTML>
+ <HEAD>
+ <TITLE>$SUBJECTNA$</TITLE>
+ <LINK REV="made" HREF="mailto:$FROMADDR$">
+ </HEAD>
+ <BODY>
+ </MsgPgBegin>
diff -cNrBb MHonArc-2.2.0.orig/Namazu.rc MHonArc-2.2.0.new/Namazu.rc
*** MHonArc-2.2.0.orig/Namazu.rc	Thu Jan  1 09:00:00 1970
--- MHonArc-2.2.0.new/Namazu.rc	Thu Apr 16 11:43:23 1998
***************
*** 0 ****
--- 1,60 ----
+ <!--	MHonArc resource file
+ 
+ 	Namazu.rc 1.0 1998/04/16
+ 
+ 	This resource file makes html files fit for Namazu.
+ 	Namazu is the full text retrieval search system.
+              http://saturn.aichi-u.ac.jp/%7Eccsatoru/Namazu/
+   -->
+ 
+ <IDXFNAME>
+ index.html
+ </IDXFNAME>
+ 
+ <SORT>
+ <REVERSE>
+ 
+ <TSORT>
+ <TREVERSE>
+ 
+ <MULTIPG>
+ <IDXSIZE>
+ 1000
+ </IDXSIZE>
+ 
+ <FieldOrder>
+ subject
+ from
+ date
+ -extra-
+ </FieldOrder>
+ 
+ <!-- rcvdist(MH command) insert 'Resent-' header -->
+ <!-- To and Reply-To field has no information because
+ 	nearly all mail have the same address in this field --> 
+ <Excs>
+ content-
+ errors-to
+ forward
+ lines
+ message-id
+ mime-
+ nntp-
+ originator
+ path
+ precedence
+ received
+ replied
+ return-path
+ status
+ via
+ x-
+ resent-
+ sender
+ reply-to
+ to
+ </Excs>
+ 
+ <!-- eliminate Prev and Next links at bottom of page -->
+ <BotLinks>
+ </BotLinks>
diff -cNrBb MHonArc-2.2.0.orig/install.cfg MHonArc-2.2.0.new/install.cfg
*** MHonArc-2.2.0.orig/install.cfg	Wed Mar  4 09:12:31 1998
--- MHonArc-2.2.0.new/install.cfg	Wed Apr 15 21:51:20 1998
***************
*** 52,57 ****
--- 52,58 ----
      'qprint.pl',
      'readmail.pl',
      'rfc822.pl',
+     'iso2022jp.pl',
  );
  $reldoc = 'doc';	# Location of source doc files relative to install.me
  @docfiles = (
diff -cNrBb MHonArc-2.2.0.orig/lib/iso2022jp.pl MHonArc-2.2.0.new/lib/iso2022jp.pl
*** MHonArc-2.2.0.orig/lib/iso2022jp.pl	Thu Jan  1 09:00:00 1970
--- MHonArc-2.2.0.new/lib/iso2022jp.pl	Fri Apr 17 11:00:04 1998
***************
*** 0 ****
--- 1,211 ----
+ ##---------------------------------------------------------------------------##
+ ##  File:
+ ##	@(#)  iso2022jp.pl 1.0 97/02/25 @(#)
+ ##  Author:
+ ##      Magara Yasuhiro       gama@xxxxxxxxxxxxxxxx
+ 
+ package iso_2022_jp;
+ require 'iso8859.pl';
+ 
+ ###############################################################################
+ ##	Mapping arrays for characters to entity references
+ ###############################################################################
+ 
+ ##---------------------------------------------------------------------------
+ ##      ISO-2022-JP
+ ##---------------------------------------------------------------------------
+ 
+ %ISO_2022_JP_To_Ent = ();
+ 
+ ###############################################################################
+ ##	Routines
+ ###############################################################################
+ 
+ ##---------------------------------------------------------------------------##
+ ##	str2str returns a string received and do nothing else.
+ ##
+ ##	    $return_data = iso_2022_jp'str2str($data, $charset);
+ ##
+ sub str2str {
+   return $_[0];
+ }
+ ##---------------------------------------------------------------------------##
+ ##	str2sgml converts a string encoded by $charset to an sgml
+ ##	string where special characters are converted to entity
+ ##	references.
+ ##
+ ##	$return_data = iso_2022_jp'str2sgml($data, $charset, $only8bit);
+ ##
+ ##	If $only8bit is non-zero, than only 8-bit characters are
+ ##	translated.
+ ##
+ 
+ sub str2sgml {
+     local($data, $charset, $only8bit) = ($_[0], $_[1], $_[2]);
+     local($ret) = '';
+     local($offset, $len);
+ 
+     # Get mapping (this method works for Perl 4 and 5)
+     $charset =~ tr/a-z/A-Z/;
+     $charset =~ tr/-/_/;
+     local(*map) = ("${charset}_To_Ent");
+ 
+     # Convert string
+     while ($data ne "") {
+         if ($data =~ /^\033\([BJ]/) { # Single Byte Segment
+             $data = $';
+             $ret .= $&;
+         } elsif ($data =~ /^\033\$[\@AB]|\033\$\([CD]/) { # Double Byte Segment
+             $data = $';
+             $ret .= $&;
+             while(1) {
+                 if ($data =~ /^([!-~][!-~])+/) { # Double Char plain text
+                     $data = $';
+                     $ret .= $&;
+                 } elsif ($data =~ /\033\.[A-F]/) { # G2 Designate Sequence
+                     $data = $';
+                     $ret .= $&;
+                 } elsif ($data =~ /\033N[ -\x7f]/) { # Single Shift Sequence
+                     $data = $';
+                     $ret .= $&;
+                 } else {
+                     last;
+                 }
+             }
+ 	} elsif ($data =~ /^[^\033]+/) {      # ASCII plain text
+ 	    $data = $';
+ 	    $ascii_text = $&;
+ 
+ 	    # Convert string
+ 	    $len = length($ascii_text);
+ 	    $offset = 0;
+ 	    while ($offset < $len) {
+ 	        $char = unpack("C", substr($ascii_text, $offset++, 1));
+ 	        if ($only8bit && $char < 0xA0) {
+ 		    $ret .= pack("C", $char);
+ 	        } else {
+ 		    $ret .= ($map{$char} || $iso_8859'US_ASCII_To_Ent{$char} ||	# '
+ 			     pack("C", $char));
+ 	        }
+ 	    }
+         } elsif ($data =~ /\033\.[A-F]/) { # G2 Designate Sequence
+ 	    $data = $';
+ 	    $ret .= $&;
+ 	} elsif ($data =~ /\033N[ -\x7f]/) { # Single Shift Sequence
+ 	    $data = $';
+ 	    $ret .= $&;
+ 	} else {
+ 	    $ret .= $data;
+ 	    last;
+         }
+     }
+     $ret .= "\033\(J" if ($ret !~ /\033\(J$/);
+     $ret;
+ }
+ 
+ sub mailto {
+     local(*data) = @_;
+     local($ret) = '';
+ 
+     # Convert string
+     while ($data ne "") {
+         if ($data =~ /^\033\([BJ]/) { # Single Byte Segment
+             $data = $';
+             $ret .= $&;
+         } elsif ($data =~ /^\033\$[\@AB]|\033\$\([CD]/) { # Double Byte Segment
+             $data = $';
+             $ret .= $&;
+             while(1) {
+                 if ($data =~ /^([!-~][!-~])+/) { # Double Char plain text
+                     $data = $';
+                     $ret .= $&;
+                 } elsif ($data =~ /\033\.[A-F]/) { # G2 Designate Sequence
+                     $data = $';
+                     $ret .= $&;
+                 } elsif ($data =~ /\033N[ -\x7f]/) { # Single Shift Sequence
+                     $data = $';
+                     $ret .= $&;
+                 } else {
+                     last;
+                 }
+             }
+ 	} elsif ($data =~ /^[^\033]+/) {      # ASCII plain text
+ 	    $data = $';
+ 	    $ascii_text = $&;
+ 	    # Convert string
+ 	    if ($MAILTOURL) {
+ 		$ascii_text =~ s|([\!\%\w\.\-+=/]+@[\w\.\-]+)|&mhonarc'mailUrl($1)|ge;
+ 	    } else {
+ 		$ascii_text =~ s|([\!\%\w\.\-+=/]+@[\w\.\-]+)|<A HREF="mailto:$1">$1</A>|g;
+ 	    }
+ 	    $ret .=  $ascii_text;
+         } elsif ($data =~ /\033\.[A-F]/) { # G2 Designate Sequence
+ 	    $data = $';
+ 	    $ret .= $&;
+ 	} elsif ($data =~ /\033N[ -\x7f]/) { # Single Shift Sequence
+ 	    $data = $';
+ 	    $ret .= $&;
+ 	} else {
+ 	    $ret .= $data;
+ 	    last;
+         }
+     }
+     $ret .= "\033\(J" if ($ret !~ /\033\(J$/);
+     $data = $ret;
+ }
+ 
+ sub extract_email_address {
+     local($data) = shift;
+     local($ret) = '';
+ 
+     # Convert string
+     while ($data ne "") {
+         if ($data =~ /^\033\([BJ]/) { # Single Byte Segment
+             $data = $';
+ #            $ret .= $&;
+         } elsif ($data =~ /^\033\$[\@AB]|\033\$\([CD]/) { # Double Byte Segment
+             $data = $';
+ #            $ret .= $&;
+             while(1) {
+                 if ($data =~ /^([!-~][!-~])+/) { # Double Char plain text
+                     $data = $';
+ #                    $ret .= $&;
+                 } elsif ($data =~ /\033\.[A-F]/) { # G2 Designate Sequence
+                     $data = $';
+ #                    $ret .= $&;
+                 } elsif ($data =~ /\033N[ -\x7f]/) { # Single Shift Sequence
+                     $data = $';
+ #                    $ret .= $&;
+                 } else {
+                     last;
+                 }
+             }
+ 	} elsif ($data =~ /^[^\033]+/) {      # ASCII plain text
+ 	    $data = $';
+ 	    $ascii_text = $&;
+ 
+ 	    if ($ascii_text =~ /<(\S+)>/) {
+ 		$ret = $1;
+ 	    } elsif ($ascii_text =~ s/\([^\)]+\)//) {
+ 		$ascii_text =~ /\s*(\S+)\s*/;  $ret = $1;
+ 	    } else {
+ 		$ascii_text =~ /\s*(\S+)\s*/;  $ret = $1;
+ 	    }
+ 	    return $ret if ($ret);
+         } elsif ($data =~ /\033\.[A-F]/) { # G2 Designate Sequence
+ 	    $data = $';
+ #	    $ret .= $&;
+ 	} elsif ($data =~ /\033N[ -\x7f]/) { # Single Shift Sequence
+ 	    $data = $';
+ #	    $ret .= $&;
+ 	} else {
+ #	    $ret .= $data;
+ 	    last;
+         }
+     }
+ #    $ret .= "\033\(J" if ($ret !~ /\033\(J$/);
+     $ret;
+ }
+ ##---------------------------------------------------------------------------##
+ 
+ 1;
diff -cNrBb MHonArc-2.2.0.orig/lib/mhinit.pl MHonArc-2.2.0.new/lib/mhinit.pl
*** MHonArc-2.2.0.orig/lib/mhinit.pl	Wed Mar  4 09:12:53 1998
--- MHonArc-2.2.0.new/lib/mhinit.pl	Thu Apr 16 11:37:04 1998
***************
*** 47,52 ****
--- 47,53 ----
      "MDT", 6,	# Mountain Daylight Time
      "PST", 8,	# Pacific Standard Time
      "PDT", 7,	# Pacific Daylight Time
+     "JST",-9,	# JAPAN Standard Time
  );
  
  ##	Assoc array listing mail header fields to exclude in output.
diff -cNrBb MHonArc-2.2.0.orig/lib/mhutil.pl MHonArc-2.2.0.new/lib/mhutil.pl
*** MHonArc-2.2.0.orig/lib/mhutil.pl	Wed Mar  4 09:12:54 1998
--- MHonArc-2.2.0.new/lib/mhutil.pl	Fri Apr 17 10:59:01 1998
***************
*** 26,31 ****
--- 26,32 ----
  ##---------------------------------------------------------------------------##
  
  package mhonarc;
+ require 'iso2022jp.pl';
  
  ##---------------------------------------------------------------------------
  ##	Get an e-mail address from (HTML) $str.
***************
*** 34,46 ****
      local($str) = shift;
      local($ret);
  
!     if ($str =~ /<(\S+)>/) {
! 	$ret = $1;
!     } elsif ($str =~ s/\([^\)]+\)//) {
! 	$str =~ /\s*(\S+)\s*/;  $ret = $1;
!     } else {
! 	$str =~ /\s*(\S+)\s*/;  $ret = $1;
!     }
      $ret;
  }
  
--- 35,48 ----
      local($str) = shift;
      local($ret);
  
!     $ret = &iso_2022_jp'extract_email_address($str);
! #    if ($str =~ /<(\S+)>/) {
! #	$ret = $1;
! #    } elsif ($str =~ s/\([^\)]+\)//) {
! #	$str =~ /\s*(\S+)\s*/;  $ret = $1;
! #    } else {
! #	$str =~ /\s*(\S+)\s*/;  $ret = $1;
! #    }
      $ret;
  }
  
***************
*** 50,55 ****
--- 52,70 ----
  sub extract_email_name {
      local($str) = shift;
      local($ret);
+     local($email);
+ 
+     $email = extract_email_address($str);
+     if ($email) {
+ 	$ret = $str;
+ 	$ret =~ s/<$email>//g;
+ 	$ret =~ s/$email//g;
+ 	if ($ret =~ /^[\s\"\(\)<>]*$/) {
+ 	    $ret = $email;
+ 	    $ret =~ s/@.*//;
+ 	}
+     }
+     return $ret;
  
      if ($str =~ s/<(\S+)>//) {		# Check for: name <addr>
  	$ret = $1;
***************
*** 355,361 ****
  ##
  sub field_add_links {
      local($label, *fld_text) = @_;
!     &mailto(*fld_text)
  	if !$NOMAILTO &&
  	    $label =~ /^(to|from|cc|sender|reply-to|resent-to|resent-cc)/i;
      &newsurl(*fld_text)
--- 370,376 ----
  ##
  sub field_add_links {
      local($label, *fld_text) = @_;
!     &iso_2022_jp'mailto(*fld_text)
  	if !$NOMAILTO &&
  	    $label =~ /^(to|from|cc|sender|reply-to|resent-to|resent-cc)/i;
      &newsurl(*fld_text)