MLのアーカイブなどでリスト表示・スレッド表示をするときに、Subjectの替わりに本文の一行目を表示する場合があります。MLなどの場合、Subjectは「Re: ...」のような感じで情報量が少ないので、これはなかなか便利です。というわけで、QMAIL3のリストビューで同じようなことをしてみようという試みです。
方針としては、ビューのカスタマイズで一行目を取り出すマクロを指定するという方針です。一行目を取り出すといっても、引用や挨拶などは飛ばしたいので、これをマクロでやるのはできなくはありませんが、ちょっと酷です。そこで、@Scriptを使って一行目の取り出しはJScriptで書くことにしました。できたのはこんな感じです。
@If(@Contain(%Subject, 'Re:'), @Script('
function getDescription(text) {
var maxline = 20; // 指定した行数以内に見つからなかったらあきらめる
var minchar = 5; // これより短い行は無視
var regexes = [ // これらの正規表現にマッチしたら無視
/^\\s+$/, // 空白だけの行
/^[>|#>|#]/, // 引用符っぽい文字から始まっている
/^In (message|article)\\s/i, // 引用の説明っぽい
/[+-]\\d{4},?\\s*$/, // タイムゾーンで終わっているのも引用の説明っぽい
/(writes|wrote|さん)[::]\\s*$/i, // これも引用の説明っぽい
/こんにちは|こんにちわ|こんばんは/, // 挨拶
/(申します|です)。?$/, // 名前を述べていそう
/世話/, // 「お世話になります」とか
/(.)\\1{4}/, // 同じ文字が5文字以上続くのは区切りっぽい
/^[\\w-]+:/ // ヘッダの引用っぽい
];
var lines = text.split(/\\n/, maxline);
for (n in lines) {
var line = lines[n];
if (line.length < minchar)
continue;
var match = false;
for (r in regexes) {
var regex = regexes[r];
match = line.search(regex) != -1;
if (match)
break;
}
if (!match)
return line;
}
return lines.length > 0 ? lines[0] : \"\";
}
result.value = getDescription(arguments.item(0)).replace(/^[\\s ]*/, \"\");
', 'JScript', @Body('', @True())), %Subject)
使いたいフォルダを開いて、[View]-[Custmize Column]を選び、ダイアログで[Subject]を選んで[Edit]を押します。そのダイアログで[Type]に[Other]を指定して、[Macro]に上記のマクロを指定し、[Cache]にチェックを入れてOKを押します。
ちなみにマクロを指定するところは一行しか入れられないので、上のマクロを一行にしたものを貼っておきます。
@If(@Contain(%Subject, 'Re:'), @Script('function getDescription(text) { var maxline = 20; var minchar = 5; var regexes = [ /^\\s+$/, /^[>|#>|#]/, /^In (message|article)\\s/i, /[+-]\\d{4},?\\s*$/, /(writes|wrote|さん)[::]\\s*$/i, /こんにちは|こんにちわ|こんばんは/, /(申します|です)。?$/, /世話/, /(.)\\1{4}/, /^[\\w-]+:/ ]; var lines = text.split(/\\n/, maxline); for (n in lines) { var line = lines[n]; if (line.length < minchar) continue; var match = false; for (r in regexes) { var regex = regexes[r]; match = line.search(regex) != -1; if (match) break; } if (!match) return line; } return lines.length > 0 ? lines[0] : \"\"; } result.value = getDescription(arguments.item(0)).replace(/^[\\s ]*/, \"\");', 'JScript', @Body('', @True())), %Subject)
行ごとに正規表現でマッチさせるのではなく、前後の行を見ながら判定したりするともっと正確に一行目が取り出せるのではないかと思います。