#author("2020-04-07T12:15:14+09:00","","") #author("2020-04-07T12:38:03+09:00","","") ** jsonfeed.inc.php [#x7bdc64a] |RIGHT:100|LEFT:360|c |~サマリ|JSON Feed を出力するコマンド| |~リビジョン|1.0| |~リビジョン|1.01| |~対応バージョン|1.5.3| |~投稿者|[[M.Taniguchi]]| |~投稿日|&new{2020-04-07 (火) 11:37:20};| **概要 [#kcd63fed] JSON Feed を出力するコマンドです。 標準プラグイン「rss」の JSON Feed 版です。~ 具体的には、RecentChanges をフィードに変換して出力します。~ 出力はファイルにキャッシュし、次回からページが更新されるまで処理を省きます。 PukiWiki 1.5.3/PHP 7.4 で動作確認済み。旧バージョンでもおそらく動くと思いますが、PHPは5.2以上が必要です。 ***JSON Feed とは [#t80aed1d] JSON Feed は2017年に定義されたJSON形式のウェブフィードです。 https:// jsonfeed.org/ XML形式のRSSやAtomに比べ、パースが簡単に済みます。~ 大量のフィードも比較的高速に処理でき、JavaScriptでの扱いも楽です。~ 比較的新しい形式のため未対応のフィードリーダーもあるかもしれませんが、RSSと併用していれば問題ないでしょう。 **使い方 [#e6f9146e] -?plugin=jsonfeed[&ver=1.0] ~ ''引数'' -ver … JSON Feed のバージョン。省略時の既定値は1.0 **コード [#c2352d1c] jsonfeed.inc.php~ (下記のコードをコピーして、plugin ディレクトリに jsonfeed.inc.php というファイル名で保存してください) <?php // PukiWiki - Yet another WikiWikiWeb clone // jsonfeed.inc.php v1.00 // 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) define(PLUGIN_JSONFEED_MIMETYPE, 'application/json'); 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: ' . PLUGIN_JSONFEED_MIMETYPE . '; charset=utf-8'); 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 = 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; } **ライセンス [#m9e4af70] GPL v3 ~ ''謝辞'' 次のプラグインを参考にし、コードを一部流用させていただきました。 -rss.inc.php : Copyright 2003-2017 PukiWiki Development Team, License: GPL v2 or (at your option) any later version