[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>