処理方法は同じだが出力時に利用するエンコードだけを変えたい、
という場合の新しい設定文法と、その改造案の提案。
雑談 より
[[PukiWiki http://pukiwiki.sourceforge.jp/?euc($1)]]
下の改造案を適用して、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 = ''; + } + } }
コードを見れば、わかる事が大半ですが…。
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 に書いてあるコメントアウトは、現状では意味が無いということに…。
現状でも、エンコードタイプの入力をミスすると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
エラーを表示しない、で十分だと思いますので、後半部分は気にしないでください。