read.inc.php

Top > Hack > read.inc.php

ページに別名をつける(Redirectする)

Table of Contents

概要

ページに別名をつけ、リダイレクトできるようにする read.inc.php の改造です。

別名の定義を AutoAliasName ページで一括管理します。 このページは Pukiwiki の AutoAlias 機能用の設定ページで、それを再利用します。 書式例 Source:AutoAliasName

本体改造になりますが、autolink や [[]] リンクで、定義した別名を使用できるようにする改造も用意してあります。

インストール

Plus!

同じ別名を複数のページに付けた場合、選択ページが表示されます。

Pukiwiki Plus! に取り込んでもらいました。rev1498 以上で利用できます。plus:BugTrack/121

本家

同じ別名を複数のページに付けた場合、最初の設定だけが利用されます。 Plus! 用のように get_autoaliases をいじってません。

メイン

以下の内容を read.inc.php に上書きします。

<?php
// PukiWiki - Yet another WikiWikiWeb clone.
// $Id: read.inc.php,v 1.8 2005/01/15 13:57:07 henoheno Exp $
//
// Read plugin: Show a page and InterWiki

function plugin_read_action()
{
	global $vars, $_title_invalidwn, $_msg_invalidiwn;

	$page = isset($vars['page']) ? $vars['page'] : '';

	if (is_page($page)) {
		// ページを表示
		check_readable($page, true, true);
		header_lastmod($page);
		return array('msg'=>'', 'body'=>'');

	} else if (! PKWK_SAFE_MODE && is_interwiki($page)) {
		return do_plugin_action('interwiki'); // InterWikiNameを処理

	} else if (is_pagename($page)) {
		$real = get_autoaliases($page);
		if ($real != '') {
			if (is_page($real)) {
				header('HTTP/1.0 301 Moved Permanently');
				header('Location: ' . get_script_uri() . '?' . rawurlencode($real));
				return;
			} else {
				header('Location: ' . get_script_uri() . '?cmd=edit&page=' . rawurlencode($real));
				return;
			}
		}
		$vars['cmd'] = 'edit';
		return do_plugin_action('edit'); // 存在しないので、編集フォームを表示

	} else {
		// 無効なページ名
		return array(
			'msg'=>$_title_invalidwn,
			'body'=>str_replace('$1', htmlspecialchars($page),
				str_replace('$2', 'WikiName', $_msg_invalidiwn))
		);
	}
}
?>

一応差分

--- org.orig/plugin/read.inc.php	2007-06-04 21:33:01.625000000 -0400
+++ org.dev/plugin/read.inc.php	2007-06-04 21:34:13.750000000 -0400
@@ -20,6 +20,13 @@
 		return do_plugin_action('interwiki'); // InterWikiNameを処理

 	} else if (is_pagename($page)) {
+		$real = get_autoaliases($page);
+		if ($real != '') {
+			if (is_page($real)) {
+				header('HTTP/1.0 301 Moved Permanently');
+				header('Location: ' . get_script_uri() . '?' . rawurlencode($real));
+				return;
+			} else {
+				header('Location: ' . get_script_uri() . '?cmd=edit&page=' . rawurlencode($real));
+				return;
+			}
+		}
 		$vars['cmd'] = 'edit';
 		return do_plugin_action('edit'); // 存在しないので、編集フォームを表示

おまけ

さらに autolink や [[]] リンクで定義した別名を使用できるようにします。

make_link.php

Link_autoalias クラス内 toString 関数 (get_autoaliases を検索すると楽)

	function toString()
	{
		$this->alias = get_autoaliases($this->name);
		if ($this->alias != '') {
-			$link = '[[' . $this->name . '>' . $this->alias . ']]';
+			$link = '[[' . $this->name . '>' . $this->name . ']]';
			return make_link($link);
		}
		return '';
	}

make_pagelink 関数内

 function make_pagelink($page, $alias = '', $anchor = '', $refer = '', $isautolink = FALSE)
 {
 	global $script, $vars, $link_compact, $related, $_symbol_noexists;

-	$s_page = htmlspecialchars(strip_bracket($page));
+	if (! is_page($page) & ($real = get_autoaliases(strip_bracket($page))) != '') {
+		$autoalias = $page;
+		$page   = $real;
+		$s_page = htmlspecialchars(strip_bracket($autoalias));
+		$r_page = rawurlencode($autoalias);
+	} else {
+		$s_page = htmlspecialchars(strip_bracket($page));
+		$r_page = rawurlencode($page);
+	}
 	$s_alias = ($alias == '') ? $s_page : $alias;

 	if ($page == '') return '<a href="' . $anchor . '">' . $s_alias . '</a>';
 //	if ($page == '') return open_uri_in_new_window('<a href="' . $anchor . '">' . $s_alias . '</a>', 'make_pagelink');

-	$r_page  = rawurlencode($page);
 	$r_refer = ($refer == '') ? '' : '&amp;refer=' . rawurlencode($refer);

 	if (! isset($related[$page]) && $page != $vars['page'] && is_page($page))

関連