InterWikiName の地味な拡張案とおまけ

メッセージ

処理方法は同じだが出力時に利用するエンコードだけを変えたい、
という場合の新しい設定文法と、その改造案の提案。

これまでの経緯

雑談 より

改造後のイメージ

下の改造案を適用して、InterWikiName のページに次のように登録する。

[http://test.com/$1.htm test-euc] encode:euc
[http://test.com/$1.htm test-utf8] encode:utf8

PukiWiki で書いたものをHTML に変換して使っているサイトなら都合がいいかもしれない。(ページ名を別名に変えてなければ、ですけど)

改造案

cvs:lib/make_link.php (1.37) をベースに

 // Render an InterWiki into a URL
 function get_interwiki_url($name, $param)
 {
  (中略)
 	default:
-		// Alias conversion of $opt
-		if (isset($encode_aliases[$opt])) $opt = & $encode_aliases[$opt];
-
-		// Encoding conversion into specified encode, and URLencode
-		$param = rawurlencode(mb_convert_encoding($param, $opt, SOURCE_ENCODING));
+		if (strpos($opt, ':') === FALSE) {
+			// Alias conversion of $opt
+			if (isset($encode_aliases[$opt])) $opt = & $encode_aliases[$opt];
+
+			// Encoding conversion into specified encode, and URLencode
+			$param = rawurlencode(mb_convert_encoding($param, $opt, SOURCE_ENCODING));
+		} else {
+			$type = explode(':', $opt, 2);
+
+			switch($type[0]) {
+
+			case 'encode':
+				// Alias conversion of $opt
+				if (isset($encode_aliases[$type[1]])) $type[1] = & $encode_aliases[$type[1]];
+
+				$param = encode(mb_convert_encoding($param, $type[1], SOURCE_ENCODING));
+				break;
+
+			default:
+				$param = '';
+			}
+		}
 	}

改造後について、補足など

コードを見れば、わかる事が大半ですが…。


コメント


おまけ (InterWikiName 関連の疑問など)

get_interwiki_url 関数の正規表現について(ついでで、Link_url_interwiki クラス)

get_interwiki_url() の中では

foreach (get_source($interwiki) as $line)
	if (preg_match('/\[(' . '(?:(?:https?|ftp|news):\/\/|\.\.?\/)' .
	    '[!~*\'();\/?:\@&=+\$,%#\w.-]*)\s([^\]]+)\]\s?([^\s]*)/',
	    $line, $matches))
		$interwikinames[$matches[2]] = array($matches[1], $matches[3]);

となっていて、キャプチャ2番目のエイリアスの部分は、] 以外なら何でも良いことになっている

しかし、bracket の中にInterWikiName を書いた場合の処理(Link_interwikiname クラスが担当)には、

と書いているように見える

 	function get_pattern()
 	{
 		$s2 = $this->start + 2;
 		$s5 = $this->start + 5;
 		return <<<EOD
 \[\[                  # open bracket
 (?:
  ((?:(?!\]\]).)+)>    # (1) alias
 )?
 (\[\[)?               # (2) open bracket
 ((?:(?!\s|:|\]\]).)+) # (3) InterWiki
 (?<! > | >\[\[ )      # not '>' or '>[['
 :                     # separator
 (                     # (4) param
  (\[\[)?              # (5) open bracket
  (?:(?!>|\]\]).)+
  (?($s5)\]\])         # close bracket if (5)
 )
 (?($s2)\]\])          # close bracket if (2)
 \]\]                  # close bracket
 EOD;
 	}

Link_url_interwiki クラスはInterWikiName のページに書き込んだときに、正しい書式なら表示を変えるためにあると思うので、
もしget_interwiki_url() の正規表現を変えるのなら、追従した方が良いと思い、見出しに挙げました。(修正案は何も書いて無いですけど)

あと、コメントアウトした行を除外せずに、リストを収得しているのはどうなんでしょう?
非表示だけど実は有効のまま、というのを認めるかどうかなんですけど。

つまり、official:InterWikiName に書いてあるコメントアウトは、現状では意味が無いということに…。

関連


コメント


mb_convert_encoding 関数に無効なエンコードタイプが使われた場合について(エラーネタ)

現状でも、エンコードタイプの入力をミスするとPHPがエラーを返してきます。

エラーを表示させなくするだけなら

-	$param = rawurlencode(mb_convert_encoding($param, $opt, SOURCE_ENCODING));
+	$param = rawurlencode(@mb_convert_encoding($param, $opt, SOURCE_ENCODING));

で十分だが、なぜか空文字が返されている。

自分のところではなぜかうまく動作したフォロー方法

	$str = @mb_convert_encoding($param, $opt, SOURCE_ENCODING);
	if ($str !== FALSE) {
		$param = rawurlencode($str);
	} else {
		$param = rawurlencode($param);
	}

しかし、rawurlencode() の説明にはエラー時に関する記述が無いので、確実性に欠ける。*2

エラーを表示しない、で十分だと思いますので、後半部分は気にしないでください。


コメント



*1 rawurlencode() はアルファベットの変換はしないんだった…、移転時にミスに気がついた
*2 全てのバージョンで、同じエラーを返すのかなど。型一致で比較しているので、FALSE を返しているのは確かでしょうけど…

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-10-19 (金) 00:58:03
Site admin: PukiWiki Development Team

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

SourceForge