ソースコード

添付できませんのでCopy&Pasteでお願いします。

<?php
// PukiWiki - Yet another WikiWikiWeb clone.
//
//	relatedview.inc.php		Copyright Cue 2005
//
//	2005/06/10	v0.01
//		とりあえず作る
//
//	2005/06/10	v0.02
//		念のため再入防止
//		マッチングパターンの見直し
//		逆リンク処理をエイリアス利用に変更
//
//	2005/06/11	v0.03
//		リスト・テーブルは空行出力を抑制
//		参照元が#include行だった場合、取り込みを抑制
//
//	2005/06/11	v0.04
//		wiki textのヘッダをオプションで挿入可能に(主にテーブル向け)
//		逆リンク時に直近のアンカーを付加
//
//	2005/06/11	v0.05
//		コメントの日付が間違えてたので修正(恥
//
//	2005/06/12	v0.06
//		デリミタに/を使ってたバグを修正
//		相対リンクに対応
//
//	2005/06/12	v0.07
//		閲覧制限のチェック追加
//
//	2005/06/12	v0.08
//		閲覧制限の変更
//		パターン見直し
//		整形済みとコメントの取り込みを抑制
//
//	2005/06/26	v0.09
//		WikiName,Autolink対応
//
//	2005/07/05	v0.10
//		引数仕様を変更(v0.04仕様を廃止)
//		ブロックプラグインの取り込みを抑制
//
//	2005/07/07	v0.11
//		検索パターンのエラー出力抑制
//		相対パス→絶対パスのバグ修正
//		正規表現でない検索指定の相対パスに対応
//		テーブルの上セル連結('~')を実データで置換するよう処理
//
//	2005/07/09	v0.12
//		ページ読み込み順を自然順ソートに変更
//		対象行中のインラインプラグインはボディ部だけ見るよう変更
//		複数行プラグインはボディ部を含めてスキップ
//
//	2005/07/14	v0.13
//		インラインプラグインのボディ部の取り扱いを変更
//
//	2005/07/31	v0.14
//		複数行プラグイン有効判定のバグ取り
//		ごく簡単なオプションチェック追加
//
//	2005/07/31	v0.15
//		autolink.dat読み込みでflockし忘れ修正

function plugin_relatedview_convert()
{
	global $WikiName, $BracketName, $nowikiname, $autolink;
	global $vars, $non_list, $whatsnew;
	static $busy = false;
	if(!$busy) $busy = true; else return '';

	$args = array();
	foreach(func_get_args() as $arg){
		@list($key, $val) = explode('=>', $arg);
		$args[trim($key)] = trim($val);
	}
	$unknown_args = array_diff(array_keys($args), array('noautolink', 'nowikiname', 'search', 'nosearch'));
	if(!empty($unknown_args)){
		foreach($unknown_args as $key=>$val)
			if($args[$val] != '') $unknown_args[$key] .= '=>'.$args[$val];
		return 'relatedview : unknown option(s). '.htmlspecialchars(implode(', ', $unknown_args)).'<br />';
	}
	$category = isset($vars['page']) ? strip_bracket($vars['page']) : '';
	$q_category = preg_quote($category, '/');
	if(isset($args['search']) && !preg_match('/^#.*#$/', $args['search']))
		$args['search'] = '#^'.preg_quote(get_fullname($args['search'], $category), '#').'#';
	if(isset($args['nosearch']) && !preg_match('/^#.*#$/', $args['nosearch']))
		$args['nosearch'] = '#^'.preg_quote(get_fullname($args['nosearch'], $category), '#').'#';
	$follow_wikiname = !$nowikiname && !isset($args['nowikiname']) && preg_match('/^'.$WikiName.'$/', $category);
	$follow_autolink = $autolink && !isset($args['noautolink']) && file_exists(CACHE_DIR . 'autolink.dat');
	if($follow_autolink){
		$fp = fopen(CACHE_DIR . 'autolink.dat', 'r');
		flock($fp, LOCK_SH);
		@list($auto, $auto_a, $ignores) = file(CACHE_DIR . 'autolink.dat');
		flock($fp, LOCK_UN);
		fclose($fp);
		if (strpos($ignores, $category) !== false || !preg_match('/^(?:'.$auto.'|'.$auto_a.')$/x', $category))
			$follow_autolink = false;
	}

	$links = array_keys(links_get_related_db($category));
	foreach($links as $key=>$page){
		if ($page == $whatsnew ||
			preg_match('/'.$non_list.'/', $page) ||
			(isset($args['search']) && !@preg_match($args['search'], $page)) ||
			(isset($args['nosearch']) && @preg_match($args['nosearch'], $page)) ||
			!check_readable($page, false, false))
				unset($links[$key]);
	}
	natsort($links);

	if($follow_autolink || $follow_wikiname){
		$link_pattern = '/(\[\[(?:.+?>)?)?'.$q_category.'(?(1)(?:#(?:[A-Za-z][\w-]*)?)?\]\])/';
		$replace_patterns = array(
			'/\[\[(.+?)>'.$q_category.'(?:#(?:[A-Za-z][\w-]*)?)?\]\]/',
			'/(\[\[)?'.$q_category.'(?(1)(?:#(?:[A-Za-z][\w-]*)?)?\]\])/'
		);
	}else{
		$link_pattern = '/\[\[(?:.+?>)?'.$q_category.'(?:#(?:[A-Za-z][\w-]*)?)?\]\]/';
		$replace_patterns = array(
			'/\[\[(.+?)>'.$q_category.'(?:#(?:[A-Za-z][\w-]*)?)?\]\]/',
			'/\[\['.$q_category.'(?:#(?:[A-Za-z][\w-]*)?)?\]\]/'
		);
	}
	$anchor_pattern = '/(?:(^\*{1,3}.*?\[#)|(?:^#|&)aname\()([A-Z][\w-]+?)(?(1)\]|[,)])/i';
	$relative_pattern = '/\[\[((?:(?!\]\]).)+>)?(\.{0,2}\/(?:'.$BracketName.')?)((?:#(?:[A-Za-z][\w-]*)?)?)\]\]/e';

	$body = $matches = $cell_buffers = array();
	$is_ver146 = version_compare(S_VERSION, '1.4.6_rc') >= 0;
	$enable_multiline = $is_ver146 && !PKWKEXP_DISABLE_MULTILINE_PLUGIN_HACK ? 1 : 0;
	foreach($links as $page){
		$anchor = $page;
		foreach(preg_grep('%^(?!//| |\t)%', get_source($page)) as $data){
			if($enable_multiline > 1){
				if(preg_match('/^\}{'.$enable_multiline.'}/', $data))
					$enable_multiline = 1;
				continue;
			}
			if(preg_match($anchor_pattern, $data, $matches))
				$anchor = $page.'#'.$matches[2];
			if(preg_match('/^#/', $data, $matches)){
				if($enable_multiline && preg_match('/(\{{2,})\s*$/', $data, $matches))
					$enable_multiline = strlen($matches[1]);
				continue;
			}
			$data = preg_replace($relative_pattern, "'[[$1'.get_fullname('$2', '$page').'$3]]'", $data);
			if(preg_match('/^\|(.+)\|([hfc]?)$/i', $data, $matches)){
				$cells = explode('|', $matches[1]);
				foreach($cells as $key=>$val){
					if($val == '~')
						$cells[$key] = $cell_buffers[$key];
					else
						$cell_buffers[$key] = $val;
				}
				$data = '|'.implode('|', $cells).'|'.$matches[2]."\n";
			}
			$plain = $data;
			while(preg_match('/&(\w+)(?:\([^)]*\))?(?:\{((?:(?!(?R)|\}).)*)\})?;/', $plain, $matches)){
				if(isset($matches[2]) && (!$is_ver146 || $follow_wikiname || preg_match('/^size$/i', $matches[1])))
					$plain = str_replace($matches[0], '#'.$matches[2].'#', $plain);
				else
					$plain = str_replace($matches[0], '#', $plain);
			}
			if(preg_match($link_pattern, $plain)){
				$replacements = array(
					'[[$1>'.$anchor.']]',
					'[['.$category.'>'.$anchor.']]'
				);
				$body[] = preg_replace($replace_patterns, $replacements, $data);
				if(preg_match('/^[^-+:|,]/', $data))
					$body[] = "\n";
			}
		}
	}
	$retval = empty($body) ? "No related pages found.<br />\n" : convert_html($body);
	$busy = false;
	return $retval;
}
?>

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

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

SourceForge