#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

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Site admin: PukiWiki Development Team

PukiWiki 1.5.4+ © 2001-2022 PukiWiki Development Team. Powered by PHP 5.6.40-0+deb8u12. HTML convert time: 0.173 sec.

OSDN