function get_interwiki_url($name, $param) { static $interwikinames; static $encode_aliases = array('sjis' => 'SJIS', 'euc' => 'EUC-JP', 'utf8' => 'UTF-8'); $WikiName = PukiWikiConfig::getParam('WikiName'); if (!isset($interwikinames)) { $interwikinames = array(); foreach (PukiWikiConfig::getInteWikiArray() as $line) { if (preg_match('/\\[((?:(?:https?|ftp|news):\\/\\/|\\.\\.?\\/)[!~*\'();\\/?:\\@&=+\\$,%#\\w.-]*)\\s([^\\]]+)\\]\\s?([^\\s]*)/', $line, $matches)) { $interwikinames[$matches[2]] = array($matches[1], $matches[3]); } } } if (!array_key_exists($name, $interwikinames)) { return FALSE; } list($url, $opt) = $interwikinames[$name]; // 文字エンコーディング switch ($opt) { // YukiWiki系 case 'yw': if (!preg_match("/{$WikiName}/", $param)) { $param = '[[' . mb_convert_encoding($param, 'SJIS', MOD_PUKI_SOURCE_ENCODING) . ']]'; } // $param = htmlspecialchars($param); break; // moin系 // moin系 case 'moin': $param = str_replace('%', '_', rawurlencode($param)); break; // 内部文字エンコーディングのままURLエンコード // 内部文字エンコーディングのままURLエンコード case '': case 'std': $param = rawurlencode($param); break; // URLエンコードしない // URLエンコードしない case 'asis': case 'raw': // $param = htmlspecialchars($param); break; default: // エイリアスの変換 if (array_key_exists($opt, $encode_aliases)) { $opt = $encode_aliases[$opt]; } // 指定された文字コードへエンコードしてURLエンコード $param = rawurlencode(mb_convert_encoding($param, $opt, 'auto')); } // パラメータを置換 if (strpos($url, '$1') !== FALSE) { $url = str_replace('$1', $param, $url); } else { $url .= $param; } return $url; }