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

[mhc:02005] Re: mhc2palm でのコメントの変換



  Message-Id: <20041224153743R.nom@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx>
  Date:       Fri, 24 Dec 2004 15:37:43 +0900
  From:       Yoshinari Nomura <nom@xxxxxxxxxxxxx>
  Subject:    [mhc:01999] Re: mhc2palm でのコメントの変換

  | > Palmで入力した予定をMHCに取り込むのに
  | > palm2mhcをつかっていますが
  | > コメントが「0:」のように時刻っぽいと
  | > コメントがヘッダにくっついてしまうようです。
  | 
  | 年末年始の時間で確認してみます.
  | 最近,自分では,CLIE 使ってないので.
  | # PDA 持たなくなっちゃいました.

しらべてみました。
どうやらDateBK3対応で入ったコードが
私の環境では予期しない動きをしてしまっているようです。
    cvs log -r1.3 ruby-ext/lib/mhc-palm.rb
    revision 1.3
    date: 2000/06/26 04:08:40;  author: nom;  state: Exp;  lines: +36 -2
    (PilotApptRecord#to_xsc): datebk3 compliant (I hope).

mhc-palm.rb:1.3で追加された
クラスPilotApptRecordのメソッドconv_noteに
/^[A-Za-z0-9_-]+:/ という正規表現があり、
bodyの頭辺りがこれにマッチすると
ヘッダとして取り込まれることになっています。
この正規表現は時刻風文字列にもマッチしてしまうのが
直接の原因っぽいです。

DateBK4の日本語ユーザマニュアルをさらっと見てみたのですが
アイコンフォーマットの説明はあったのですが
それ以外にnoteのフォーマットはみつけられませんでした。

またmhc MLの過去メイルも検索してみたのですが
あの正規表現が入った理由らしいものはみあたりませんでした。

結局、Emailを扱うコードのような気がしてきました。
mhc2palmではEmailのヘッダをnoteの先頭に置き、
palm2mhcでそれをEmailのヘッダに戻すためのコードではないかと。

この仮定でrfc2822をみるとフィールドの文字の定義 ftext はかなり緩くて
Any character except controls, SP, and ":"
となっていますが、いきなり数字で始まるフィールドは実際にはなさそうなので
フィールドはアルファベットで始まると仮定すれば
/^[A-Za-z][A-Za-z0-9_-]*:/ ではどうでしょうか。

とりあえず手元では次のようなパッチで回避できました。

Index: ruby-ext/lib/mhc-palm.rb
===================================================================
RCS file: /cvsroot/mhc/ruby-ext/lib/mhc-palm.rb,v
retrieving revision 1.11
diff -p -u -r1.11 mhc-palm.rb
--- ruby-ext/lib/mhc-palm.rb	22 Jun 2004 10:09:15 -0000	1.11
+++ ruby-ext/lib/mhc-palm.rb	11 Jan 2005 06:48:12 -0000
@@ -664,15 +674,15 @@ class PilotApptRecord < PilotRecord
 
     part1, part2 = string .split("\n\n", 2)
 
-    if !(part1 =~ /^[ \t]+/ or part1 =~ /^[A-Za-z0-9_-]+:/)
+    if !(part1 =~ /^[ \t]+/ or part1 =~ /^[A-Za-z][A-Za-z0-9_-]*:/)
       part1_is_header = false
     end
 
-    part1 .split("\n") .each{|line|
-      if !(string =~ /^[ \t]+/ or string =~ /^[A-Za-z0-9_-]+:/)
-	part1_is_header = false
-      end
-    }
+#    part1 .split("\n") .each{|line|
+#      if !(string =~ /^[ \t]+/ or string =~ /^[A-Za-z0-9_-]+:/)
+#	part1_is_header = false
+#      end
+#    }
 
     if part1_is_header
       header, body = part1, part2


そのほかconv_noteで気になったことなのですが
    if !(part1 =~ /^[ \t]+/ or part1 =~ /^[A-Za-z0-9_-]+:/)
      part1_is_header = false
    end

    part1 .split("\n") .each{|line|
      if !(string =~ /^[ \t]+/ or string =~ /^[A-Za-z0-9_-]+:/)
        part1_is_header = false
      end
    }
のところで後半のイテレータの line が使われていないのと、
仮にstringがlineの間違いだとしても前半との違いがよくわかりません。
前半のif節だけでよく後半のeachは不要そうに感じるのですが。

--
鯉江英隆 <hide@xxxxxxxx>