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)