きくたにです。

Mon, Apr 27, 1998 at 06:23:21AM +0900 において
GOTO Kentaro さん曰く:

> $froms.sort ではなく、こんな感じでどうでしょう? 
> 
> sorted_mails = $mails.sort{|i,j|
>   i['From'] <=> j['From']
> }

なるほど。ありがとうございます。
最初 $mails はスプール内容を全部持っているでかい配列なので、
全体をソートするのはコストが高いかなと思ってたのですが、
実際には十分速いですね。あと、「ソートしない(スプールへの到着順)」
というのもあるので、元のを取っておきたかったのですが、
最初に読みこんだのは mails_nosort というところに取っておくことに
して解決しました。

MailFolderクラスのソートメソッドはこうしました。

  def sort_by(f)
    if f == 'no_sort'
      @mails = @mails_nosort # dupしなくていんだろうか?
    else
      @mails = @mails_nosort.sort{|i,j|
        if f == 'Subject'
          si = i.header[f]
          si = '' unless si
          sj = j.header[f]
          sj = '' unless sj
          si.kconv($lang) <=> sj.kconv($lang)
        elsif f == 'Date'
          y, mo, d , wd, h, mi = parsedate(i.header[f])
          y += 1900 if y < 100
          ni  = sprintf("%4d%02d%02d%02d%02d\n", y, mo, d, h, mi)
          y, mo, d , wd, h, mi = parsedate(j.header[f])
          y += 1900 if y < 100
          nj  = sprintf("%4d%02d%02d%02d%02d\n", y, mo, d, h, mi)
          ni <=> nj
        else
          i.header[f] <=> j.header[f]
        end
      }
    end
  end

日付けのあたりがダサいですねえ。もっとうまい方法はないですか?
最近気付いたのですが、Date:フィールドの年が 「98」 としかないのが
けっこうあるので、上のように補正が必要です。

> もっとも、Subject の中に構造を持たせてるような場合は
> 汎用のものは難しそうですね。

そうですね。上のようにMIMEあたりはkconvにまかせてよしとします。

あとはスレッド分けか。
以前やまださんかどなたかがメールのスレッド分けについて書いて
おられた気がしますが、どこかに例がありますか?

-- 
人生を背負い投げ

菊谷 誠(Kikutani Makoto)  kikutani / gol.com
                          kikutani / debian.or.jp (Linux関係のみ)