[sylpheed-jp:10706] Re: format=flowedへの対応

Taku Amano taku @ toi-planning.net
2008年 11月 10日 (月) 19:11:58 JST


天野です。

ありがとうございます。

> サイズがたいしたことなければ、この ML にでも投げてみてください。
「添付ファイル: text_format_flowed.diff」になります。

できていることは、今朝のメールの繰り返しになりますが、
・format=flowed のメールを解釈して表示すること
になります。
・format=flowed としてメールを送信すること
はできません。


以下、簡単な仕様と、検討が必要になりそうな部分をまとめます。

●仕様について
http://www.ietf.org/rfc/rfc3676.txt
http://suika.fam.cx/~wakaba/-temp/wiki/wiki?RFC%203676
RFC3676での章番号と対応させて並べています。

4. The Format and DelSp Parameters
・Content-Type が text/plain の時のみ、format= と delsp= を調べます。
 text/plain 以外の場合には無視されます。

4.1. Interpreting Format=Flowed
・Content-Type で format=flowed が指定された場合には、
 "{空白文字}{改行}"で終わる行を flowed line と解釈し、
 {改行}を削除して次の行と連結します。
・delsp=yes が指定された場合はさらに{空白文字}も削除します。

4.3. Usenet Signature Convention
・署名行は"-- "なので、"{空白文字}{改行}"で終わりますが、次の行とは連結しません。
・RFCでは以下のようになっており、
 「引用符や空白文字削除前と削除後の両方で検査をする(both)」とありますが、
 削除前に署名行であった行が、削除後に署名行でなくなることはないため、
 署名行であるかどうかの検査は「削除後」の一度のみ検査しています。

 > A receiving agent needs to test for a signature line both before the
 > test for a quoted line (see Section 4.5) and also after logically
 > counting and deleting quote marks and stuffing (see Section 4.4) from
 > a quoted line.

 Thunderbird のソースでも検査は一度のようだったので、誤りではないと思うのですが、
 もしも誤っているようでしたらどなたか指摘を頂ければありがたいです。

4.4. Space-Stuffing
・行頭の空白文字は削除されます。

4.5. Quoting
・引用文が flowed line である場合は、続く行の引用符は削除された上で連結されます。
・引用の深さが変わった場合は、続く行は連結されません。
 (不正なフォーマットのメールへの対応)

その他.
・詳細な状況は未確認なのですが、Outlookで「返信」からメールを作成した場合、
 Content-Type: text/plain; format=flowed
 であるにも関わらず、返信元メッセージの前に、
 "----- Original Message ----- {改行}"
 という行が入るようです。

 RFCをそのまま適用するのであれば、次の行と連携するようになりますが、
 "----- Original Message ----- {改行}"だけを特別扱いし、
 この前後では必ず出力するという対応もありかもしれないと考えています。

 パッチには特別扱いするコードが入っています。


●コードについて
コーディングの際に検討した事項です。

・format= と delsp= の値を取得する位置について

まず最初に、以下の関数内での取得を検討したのですが、
procmime_scan_content_type_str()
ここで取得をするとなるとインターフェイスの変更が必要になるので避けました。

また次に、以下の関数内での取得を考えたのですが、
procmime_scan_content_type()
MimeParamよりも上で定義されている関数であり、
procmime_parse_mime_parameter()
を利用することができなかったので、ここでの取得も避けました。

そのような経緯があり、以下の関数内で、
procmime_scan_mime_header()
Content-Type が text であった場合にのみ、
format= と delsp= の値を調べるというようにしています。

この部分で、私としては以下の2点が気になっています。
- procmime_scan_mime_header() での取得で問題がないか。
 (取得されるべきコンテキストで取得されないというケースが発生するか)
- procmime_parse_mime_parameter() を2回呼んでいる。

検討した項目は以上です。


よろしくお願いいたします。

-- 
Name: Taku Amano
Mail: taku @ toi-planning.net
-------------- next part --------------
テキスト形式以外の添付ファイルを保管しました...
ファイル名: text_format_flowed.diff
型:         text/x-diff
サイズ:     9565 バイト
説明:       無し
URL:        http://www.sraoss.jp/pipermail/sylpheed-jp/attachments/20081110/0847c96b/attachment-0001.bin 


Sylpheed-jp メーリングリストの案内