jsonfeed.inc.php

サマリJSON Feed を出力するコマンド
リビジョン1.01
対応バージョン1.5.3
投稿者M.Taniguchi
投稿日2020-04-07 (火) 11:37:20

概要

JSON Feed を出力するコマンドです。

標準プラグイン「rss」の JSON Feed 版です。
具体的には、RecentChanges をフィードに変換して出力します。
出力はファイルにキャッシュし、次回からページが更新されるまで処理を省きます。

PukiWiki 1.5.3/PHP 7.4 で動作確認済み。旧バージョンでもおそらく動くと思いますが、PHPは5.2以上が必要です。

JSON Feed とは

JSON Feed は2017年に定義されたJSON形式のウェブフィードです。

https:// jsonfeed.org/

XML形式のRSSやAtomに比べ、パースが簡単に済みます。
大量のフィードも比較的高速に処理でき、JavaScriptでの扱いも楽です。
比較的新しい形式のため未対応のフィードリーダーもあるかもしれませんが、RSSと併用していれば問題ないでしょう。

使い方


引数

コード

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

<?php
// PukiWiki - Yet another WikiWikiWeb clone
// jsonfeed.inc.php v1.01
// Copyright 2020 M.Taniguchi
// License: GPL v3 or (at your option) any later version
//
// JSON Feed plugin: Publishing JSON Feed of RecentChanges

// Usage: plugin=jsonfeed[&ver=1.0] (Default: 1.0)

function plugin_jsonfeed_action() {
	global $vars, $rss_max;

	$json = plugin_jsonfeed_makejson($rss_max, isset($vars['ver'])? $vars['ver'] : '', true);
	pkwk_common_headers();
	header('Content-type: application/json; charset=utf-8');
	echo $json;

	exit;
}

function plugin_jsonfeed_makejson($rss_max = 10, $version = '1.0', $action = false) {
	global $page_title, $whatsnew;

	switch ($version) {
	case '':
	case '1.0':
	case '1':
		$version = '1.0';
	break;

	default:
		if ($action) die('Invalid JSON Feed version!!');
		return false;
	}

	$recent = CACHE_DIR . 'recent.dat';
	if (!file_exists($recent)) {
		if ($action) die('recent.dat is not found');
		return false;
	}

	$cacheFile = CACHE_DIR . 'jsonfeed.dat';
	if (!file_exists($cacheFile) || (filemtime($cacheFile) < filemtime($recent))) {
		$page_title_utf8 = mb_convert_encoding($page_title, 'UTF-8', SOURCE_ENCODING);
		$self = get_base_uri(PKWK_URI_ABSOLUTE);

		$items = array();
		if ($rss_max > 0) {
			foreach (file_head($recent, $rss_max) as $line) {
				list($time, $page) = explode("\t", rtrim($line));
				$r_page = pagename_urlencode($page);
				$title  = mb_convert_encoding($page, 'UTF-8', SOURCE_ENCODING);

				switch ($version) {
				case '1.0':
					$date = date('Y-m-d\TH:i:sP', $time);
					$summary = date('Y-m-d\TH:i:sP', $time);
					$items[] = array(
						'id' => $self . $r_page,
						'url' => $self . $r_page,
						'title' => $title,
						'date_published' => $date
					);
					break;
				}
			}
		}

		$r_whatsnew = pagename_urlencode($whatsnew);
		$description = 'PukiWiki RecentChanges';

		switch ($version) {
		case '1.0':
			$feed = array(
				'version' => 'https:'.'//jsonfeed.org/version/1',
				'title' => $page_title_utf8,
				'home_page_url' => $self . '?' . $r_whatsnew,
				'feed_url' => $self . '?plugin=jsonfeed',
				'description' => $description,
				'items' => $items
			);
			break;
		}

		$json = json_encode($feed, JSON_UNESCAPED_UNICODE | JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT);

		$fp = fopen($cacheFile, 'w');
		flock($fp, LOCK_EX);
		rewind($fp);
		fwrite($fp, $json);
		flock($fp, LOCK_UN);
		fclose($fp);
	} else {
		$fp = fopen($cacheFile, 'r');
		$json = fread($fp, filesize($cacheFile));
		fclose($fp);
	}

	return $json;
}

ライセンス

GPL v3


謝辞

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


トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2023-11-21 (火) 23:42:13
Site admin: PukiWiki Development Team

PukiWiki 1.5.4+ © 2001-2022 PukiWiki Development Team. Powered by PHP 8.2.12. HTML convert time: 0.287 sec.

SourceForge