PukiWikiのshowrssプラグインを改造して表示件数を制限するサンプル

会社休んで花粉症の薬をもらうために病院に行く予定でしたが、寝坊してすっかりテンションダウンのbonlifeです。市販の薬飲んだら眠いのなんのって…。
さてさて、人力検索はてなhttp://q.hatena.ne.jp/1172196359 を見て、RSSの表示件数ぐらい制御したいよなぁ、と思ったのでPukiWikiの plugin/showrss.inc.php を修正してみました。もっと上手いやり方もありそうですが、とりあえずなノリで。
まず、USAGEを修正してやる気を出す。

  • 後ろに引数を1つ追加して表示件数を制御させる想定
define('PLUGIN_SHOWRSS_USAGE', '#showrss(URI-to-RSS[,default|menubar|recent,Cache-lifetime,Show-timestamp,Show-number])');

続いて、plugin_showrss_convert関数を修正。

  • 追加した引数を$shownumとして処理
  • $shownumが数値かどうかのチェック
  • $shownumが指定されなかった場合、$rssの件数を取得し、それを$shownumにセット
  • オブジェクト生成時に$shownumを2つ目の引数で渡す
function plugin_showrss_convert()
{
	static $_xml;

	if (! isset($_xml)) $_xml = extension_loaded('xml');
	if (! $_xml) return '#showrss: xml extension is not found<br />' . "\n";

	$num = func_num_args();
	if ($num == 0) return PLUGIN_SHOWRSS_USAGE . '<br />' . "\n";

	$argv = func_get_args();
	$timestamp = FALSE;
	$cachehour = 0;
	$template = $uri = '';
	$shownum = '';
	switch ($num) {
	case 5: $shownum   = trim($argv[4]);			/*FALLTHROUGH*/
	case 4: $timestamp = (trim($argv[3]) == '1');		/*FALLTHROUGH*/
	case 3: $cachehour = trim($argv[2]);			/*FALLTHROUGH*/
	case 2: $template  = strtolower(trim($argv[1]));	/*FALLTHROUGH*/
	case 1: $uri       = trim($argv[0]);
	}

	$class = ($template == '' || $template == 'default') ? 'ShowRSS_html' : 'ShowRSS_html_' . $template;
	if (! is_numeric($cachehour))
		return '#showrss: Cache-lifetime seems not numeric: ' . htmlspecialchars($cachehour) . '<br />' . "\n";
	if ( $shownum != '' && ! is_numeric($shownum))
		return '#showrss: Show-Number seems not numeric: ' . htmlspecialchars($shownum) . '<br />' . "\n";
	if (! class_exists($class))
		return '#showrss: Template not found: ' . htmlspecialchars($template) . '<br />' . "\n";
	if (! is_url($uri))
		return '#showrss: Seems not URI: ' . htmlspecialchars($uri) . '<br />' . "\n";

	list($rss, $time) = plugin_showrss_get_rss($uri, $cachehour);
	if ($rss === FALSE) return '#showrss: Failed fetching RSS from the server<br />' . "\n";
	if ($shownum == '' ) $shownum = count($rss);

	$time = '';
	if ($timestamp > 0) {
		$time = '<p style="font-size:10px; font-weight:bold">Last-Modified:' .
			get_date('Y/m/d H:i:s', $time) .  '</p>';
	}

	$obj = new $class($rss,$shownum);
	return $obj->toString($time);
}

最後に表示処理を行う基本となるShowRSS_htmlクラスを修正。

  • カウンタ用変数$iを使って、$shownumと比較しながら表示
  • $shownumで指定した回数表示したら処理を終了(return)
  • $shownumで指定した数が$rssの件数より多い場合、foreachまかせ
class ShowRSS_html
{
	var $items = array();
	var $class = '';
	var $i     = '';

	function ShowRSS_html($rss,$shownum)
	{
		$i = 1;
		foreach ($rss as $date=>$items) {
			foreach ($items as $item) {
				if ($i > $shownum) {
					return;
				} else {
					$i++;
				}
				$link  = $item['LINK'];
				$title = $item['TITLE'];
				$passage = get_passage($item['_TIMESTAMP']);
				$link = '<a href="' . $link . '" title="' .  $title . ' ' .
					$passage . '" rel="nofollow">' . $title . '</a>';
				$this->items[$date][] = $this->format_link($link);
			}
		}
	}

後ろの関数は省略してます。全表示の場合でも毎回$iとの比較を行ってしまうので、無駄が多いような気もしますね。表示件数が指定されなかった場合と指定された場合の関数を分けておいた方がスッキリするかもしれませんが、まぁ、そのあたりは素人なので気しないことにします。
以下のような感じで5つ目の引数に件数を指定すれば表示件数に反映されます。(下記の例では3件に制限。)

#showrss(http://d.hatena.ne.jp/bonlife/rss,menubar,24,0,3)

これを見た気が利くPHPプロな人がより良い方法を考えてPukiWikiに反映させてくれるんじゃないかなぁ、と期待しつつ。(それにしてもxamppって楽ですね。)