**ソースコード [#a07da080]
添付できませんので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
Site admin: PukiWiki Development Team

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

SourceForge