totalpages.inc.php

サマリウィキ内のページ数を表示する
リビジョン1.0
対応バージョン1.5.2
投稿者M.Taniguchi
投稿日2020-03-22 (日) 09:14:38

概要

ウィキ内のページ数を表示するプラグイン。

PukiWiki 1.5.2/PHP 7.3 で動作確認済み。互換性に問題のある関数は使っていないため、旧バージョンでもおそらく動くと思います。

使い方


引数


使用例

このウィキには&totalpages;本の記事があります。
花に関する記事は&totalpages(花/);本です。

コード

totalpages.inc.php
(下記のコードをコピーして、plugin ディレクトリに totalpages.inc.php というファイル名で保存してください)

<?php
/*
PukiWiki - Yet another WikiWikiWeb clone.
totalpages.inc.php, v1.00 2020 M.Taniguchi
License: GPL v3 or (at your option) any later version

ウィキ内のページ数を数えて出力するPukiWiki用プラグイン。

【使い方】
&totalpages;
&totalpages(対象ページ名接頭辞);

【引数】
対象ページ名接頭辞 … この文字列から始まる名前のページのみを数える

【使用例】
このウィキには&totalpages;本の記事があります。
花に関する記事は&totalpages(花/);本です。

【処理の詳細】
数えるのは、次のすべての条件で絞り込まれたページです。

1) RecentChanges ページを除外する
2) pukiwiki.ini.php 内 $non_list で指定されたページを除外する
3) PLUGIN_TOTALPAGES_PAGE_ALLOW 定数が空でなければ、それが表すページのみを対象とする
4) PLUGIN_TOTALPAGES_PAGE_DISALLOW 定数が空でなければ、それが表すページを除外する(デフォルトでは「Pukiwiki/」から始まるページを除外)
5) 引数が空でなければ、その文字列から始まるページのみを対象とする
6) 閲覧不可のページを除外する

数えたページ数は専用のキャッシュファイル cache/totalpages[.*].dat に保存し、次回から処理を省略します。
cache/recent.dat のタイムスタンプを参照し、ページの更新・増減を検知したら数え直します。
もしプラグイン内の定数やコードを書き換えて条件を変更したら、キャッシュファイル cache/totalpages[.*].dat を削除するか適当なページを更新して強制的に数え直させてください。

【謝辞】
次のプラグインを参考にし、コードを一部流用させていただきました。
sitemap.inc.php : Google-Sitemaps plugin - Create Google-Sitemaps. Copyright (C) JuJu License: GPL v2 or (at your option) any later version
*/

define('PLUGIN_TOTALPAGES_PAGE_ALLOW', '');	// カウント対象ページ名を表す正規表現
define('PLUGIN_TOTALPAGES_PAGE_DISALLOW', '^(Pukiwiki\/.*)$');	// カウント除外ページ名を表す正規表現

define('PLUGIN_TOTALPAGES_NUMBERFORMAT', true);	// カウント結果をカンマで区切るかどうか


function plugin_totalpages_convert() { return ''; }

function plugin_totalpages_inline() {
	global $whatsnew, $non_list;

	list($prefix) = func_get_args();

	$cachefile = CACHE_DIR . 'totalpages' . (($prefix != '')? '.' . encode($prefix) : '') . '.dat';	// カウント結果キャッシュファイルパス
	$recentfile = CACHE_DIR . 'recent.dat';	// ページ更新キャッシュファイルパス
	$num = 0;	// カウント数

	// カウント結果キャッシュファイルがない、またはページ更新キャッシュファイルより古かったらカウント実行
	if (!file_exists($cachefile) || (file_exists($recentfile) && (filemtime($cachefile) < filemtime($recentfile)))) {
		foreach(get_existpages() as $page) {
			if (($page != $whatsnew)	// RecentChangesページを除外
				&& !preg_match("/$non_list/", $page)	// $non_list に該当するページを除外
				&& ((PLUGIN_TOTALPAGES_PAGE_ALLOW     == '') ||  preg_match('/' . PLUGIN_TOTALPAGES_PAGE_ALLOW    . '/', $page))	// 定数指定があれば該当するページのみ対象
				&& ((PLUGIN_TOTALPAGES_PAGE_DISALLOW  == '') || !preg_match('/' . PLUGIN_TOTALPAGES_PAGE_DISALLOW . '/', $page))	// 定数指定があれば該当するページを除外
				&& (($prefix == '') || mb_strpos($page, $prefix) === 0)	// 引数による接頭辞指定があれば該当するページのみ対象
				&& check_readable($page, false, false)	// 閲覧可能なページのみ対象(ただし、これを実行するユーザーの権限において)
			) {
				$num++;	// カウント
			}
		}

		// カウント結果キャッシュファイル書き込み
		$fp = fopen($cachefile, 'w');
		flock($fp, LOCK_EX);
		rewind($fp);
		fputs($fp, $num);
		flock($fp, LOCK_UN);
		fclose($fp);
	} else {
		// カウント結果キャッシュファイル読み込み
		$fp = fopen($cachefile, 'r');
		$num = (int)fgets($fp);
		fclose($fp);
	}

	// 3桁カンマ区切り
	if (PLUGIN_TOTALPAGES_NUMBERFORMAT) $num = number_format($num);

	return $num;
}

処理の詳細

数えるのは、次のすべての条件で絞り込まれたページです。
特殊なページを省くなど、ご自分のウィキを厳密に数えたい方は条件を調整してみてください。正規表現の知識が必要です。

  1. RecentChanges ページを除外する
  2. pukiwiki.ini.php 内 $non_list で指定されたページを除外する
  3. PLUGIN_TOTALPAGES_PAGE_ALLOW 定数が空でなければ、それが表すページのみを対象とする
  4. PLUGIN_TOTALPAGES_PAGE_DISALLOW 定数が空でなければ、それが表すページを除外する(デフォルトでは「Pukiwiki/」から始まるページを除外)
  5. 引数が空でなければ、その文字列から始まるページのみを対象とする
  6. 閲覧不可のページを除外する

数えたページ数は専用のキャッシュファイル cache/totalpages[.*].dat に保存し、次回から処理を省略します。
cache/recent.dat のタイムスタンプを参照し、ページの更新・増減を検知したら数え直します。
もしプラグイン内の定数やコードを書き換えて条件を変更したら、キャッシュファイル cache/totalpages[.*].dat を削除するか適当なページを更新して強制的に数え直させてください。

ライセンス

GPL v3


謝辞

次のプラグインを参考にし、コードを一部流用させていただきました。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2020-03-22 (日) 17:51:35
Site admin: PukiWiki Development Team

PukiWiki 1.5.3+ © 2001-2020 PukiWiki Development Team. Powered by PHP 5.6.40-0+deb8u12. HTML convert time: 0.325 sec.

OSDN