• 追加された行はこの色です。
  • 削除された行はこの色です。
#author("2020-01-08T15:16:40+09:00","default:kanateko0404","kanateko0404")
RIGHT:&tag(カスタマイズ,プラグイン改造);
#author("2022-07-06T04:29:04+09:00;2022-05-22T15:00:18+09:00","default:kanateko","kanateko")
&tag(カスタマイズ,プラグイン改造);

*alias.inc.php [#q8529858]
アンカー (ページ名#アンカー) に対応させる。
短縮URLに対応させる。
#contentsx

*変更箇所のまとめ [#y367335b]
-アンカー (ページ名#アンカー) に対応させる
-URLを相対パスにする
-URLカスタマイズに対応させる

*変更の詳細 [#uc0730f7]
**アンカーに対応させる [#anchor]

ページ名を指定する際にアンカーも指定できたら便利かなーと思ったので追加してみる。
元々Pukiwikiの自作プラグインにアップされてた方にはこの機能があったらしい。
あとついでに1.5.2以降の仕様に合わせて細部を変更する。

まずは渡された引数をページ名とアンカーで分離する。
#prism(diff-php diff-highlight){{
@@ -4,6 +4,12 @@
 // alias プラグインがなくなっていたので、独自に作成。
 // ついでに、alias 方式の弱点を解消するため、
 // alias 実行されたものについて記録を残すようにした。
+// 2019/09/23 kanateko
+// アンカーを使えるように改変。
+// あとUTF-8に変換。
+// 2020/01/08 kanateko
+// $script → get_base_uri()
+// 短縮URLを使用するように改変。
 
 define('ALIAS_DATA_DIR', DATA_HOME . 'alias/'); 
 
@@ -11,19 +17,23 @@
 {
 	global $vars;
 	$args = func_get_args();
+	// ページ名とアンカーを分離。
+	$list = explode('#',$args[0]);
 	
 	// エラー処理系
 	// 自分自身への転送は禁止。
-	if($vars['page']==$args[0]) return '#alias: Can not set Selfpage.';
+	if($vars['page']==$list[0]) return '#alias: Can not set Selfpage.';
 	//「ページ」でない指定も禁止。
-	if(! is_page($args[0])) return '#alias: Bad parameter.';
+	if(! is_page($list[0])) return '#alias: Bad parameter.';
 	// すでに alias で指定されているページへの alias 禁止。
 	// 多重alias による負荷や、最悪「ループする関係」の構築を避けるための処理。
-	$filename = ALIAS_DATA_DIR.encode($args[0]).".txt";
+	$filename = ALIAS_DATA_DIR.encode($list[0]).".txt";
 	if( file_exists($filename)) return '#alias: Can not alias to already aliased page.';
 
+	$args = explode('#',$args[0]);
}}

ページ名と一緒にアンカー名も(一応)エンコード。
#prism(diff-php diff-highlight){{
 	// ここまで来たら、alias 許可。現在の 'page' の表示要求は arg[0]に跳ばす。
-	$jumpto = rawurlencode($args[0]);
+	// 短縮URLを使用するように変更。
+	$jumpto = get_short_url_from_pagename($list[0]);
+	$aname = urlencode($list[1]);
 	$filename = ALIAS_DATA_DIR.encode($vars['page']).".txt";
 
 	// alias の記録。記録を残すことで、後で拾いやすくする。
@@ -39,7 +49,8 @@
 	}
 
 	$jumpto = rawurlencode($args[0]);
+	$aname = rawurlencode($args[1]);
}}

最後にアンカー指定の有無によって出力するURLを変更する。
#prism(diff-php diff-highlight){{
 	// alias のジャンプ処理実体
-	header('Location: ' . $script .'?'. $jumpto); // HTTP
+	if($aname) header('Location: ' . get_base_uri() . $jumpto .'#'. $aname); // HTTP
+	else  header('Location: ' . get_base_uri() . $jumpto); // HTTP
 	exit;
 
 }
+	if($aname) header('Location: ' . get_base_uri() .'?'. $jumpto .'#'. $aname); // HTTP
+	else  header('Location: ' . get_base_uri() .'?'. $jumpto); // HTTP
}}
ここでもPukiwiki 1.5.2の仕様に合わせ、$script(絶対パス)を$get_base_uri(相対パス)に変更する。

これでアンカーを指定した場合は、ページ遷移後に指定した位置へと移動してくれるようになる。

**移動先のURLを短縮URLにする [#url]

PukiWiki 1.5.4で追加されたURLカスタマイズ機能に対応させる。

ページ名をURLエンコードする部分を、以下のように変更する。
#prism(diff-php diff-highlight){{
 	// ここまで来たら、alias 許可。現在の 'page' の表示要求は arg[0]に跳ばす。
-	$jumpto = urlencode($args[0]);
+	$jumpto = get_page_uri($args[0]);
}}

そして、上記関数を使用した場合はURLに既に"?"が含まれた状態になるためecho部分を変更する。
#prism(diff-php diff-highlight){{
 	// alias のジャンプ処理実体
-	if($aname) header('Location: ' . get_base_uri() .'?'. $jumpto .'#'. $aname); // HTTP
-	else  header('Location: ' . get_base_uri() .'?'. $jumpto); // HTTP
+	if($aname) header('Location: ' . $jumpto .'#'. $aname); // HTTP
+	else  header('Location: ' . $jumpto); // HTTP
}}

*更新履歴 [#ge2f0e3c]
:2022-05-21|
公式のURLカスタマイズ機能に対応。

*配布元 [#k3642538]
[[pukiwikiプラグイン/alias - Tomose's junkyard.:https://tomose.dynalias.net/junk/?pukiwiki%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3/alias]]



*コメント [#edec4fc1]
質問や指摘などあればどうぞ
----
#pcomment(,10,above,reply)
#pcomment(reply)