日記
似た話題の日プラグイン (17:18)Edit

Estraierを使った似た話題の日プラグインをrubyにポーティングしたら公開するとか言っておきつつも、いろいろ後回しにしすぎてやる機会がないんで、PHP版(estrelate.php)をそのまま公開しておきます。ライセンスはGPLってことで。やっていることは単純なんで、rubyがわかる人ならば一呼吸で移植できることでしょう。ただ、tDiary側の設定に依存してキャッシュファイルのパスとかが変わってくるんで、その辺りの整合性をきちんと作るのは結構面倒かも。ほかのプラグインの@confとかを参照して動く必要が出てくるし。というか、tDiaryとestraierの連携に関しても、まだ正式なやり方ってのは存在していないっけ?

#!/usr/bin/php
<?php
//estxviewのパス。maxを変えると検索個数が変わる
define('ESTXVIEW', '/usr/local/bin/estxview -nk -nt -max 5');
//転置インデックスのパス
define('INDEX', '/home/tdiary/html/casket');
//転置インデックスに含まれるHTMLのパス
define('DOCROOTPATH', '/home/tdiary/var/data/cache/html');
//tDiaryのURL
define('TDIARY_URL', 'http://tdiary.ishinao.net/');
main();
function main() {
global $argv;
$targetdate = $argv[1]; //'YYYYMMDD'形式で対象の日付を指定
$docId = getDocId($targetdate);
if (!isset($docId)) {return;}
$dates = getRelatedDates($docId);
array_shift($dates);    //最初の1個は$targetdate自体が返るので除去
$result = '似た話題の日: '."\n";
foreach ($dates as $date) {
$result .= '<a href="'.TDIARY_URL.date('Ymd', $date).'.html">'.date('Y/m/d', $date).'</a>'."\n";
}
echo $result;
}
//document idに似た文書(日付)を取得
function getRelatedDates($docId) {
$cmd = ESTXVIEW.' -rel '.INDEX.' '.$docId;
$result = shell_exec($cmd);
if (preg_match_all('/<uri>.*\/([0-9]{4}\/[0-9]{4})\.html<\/uri>/', $result, $matches)) {
$files = $matches[1];
$dates = array();
foreach ($files as $file) {
list($year, $md) = split('/', $file);
$dates[] = strtotime($year.'/'.substr($md, 0, 2).'/'.substr($md, 2));
}
return $dates;
}
return NULL;
}
//HTMLファイル名からdocument idを取得
function getDocId($date) {
$datestr = date('Y/md', strtotime($date));
$cmd = ESTXVIEW.' -uri '.INDEX.' '.DOCROOTPATH.'/'.$datestr.'.html';
$result = shell_exec($cmd);
if (preg_match('/<document id="([0-9]+)">/', $result, $matches)) {
$docId = $matches[1];
return $docId;
}
return NULL;
}
?>

ちなみにこのスクリプトを呼び出すestrelate.rbの方では、

add_body_enter_proc do |date|
`/home/tdiary/bin/estrelate.php #{date.strftime('%Y%m%d')}`
end

ってしてるだけね。

Published At2004-10-08 00:00Updated At2004-10-08 00:00