サマリ | 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 は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
謝辞
次のプラグインを参考にし、コードを一部流用させていただきました。