複数の人間が書き込みをしていると、どうしても英数文字が全角と半角が混在してしまうので、見栄えが悪くなる。
入力時に全角を半角に変換してしまうのがいちばんいいのだけれども、大幅な改造になってしまいそうなので*1、表示時に全角を半角に変換してしまおうというのが、以下の話。
function make_line_rules($str) { global $line_rules; foreach($line_rules as $rule => $replace) { $str = preg_replace("/$rule/",$replace,$str); } + $str = mb_convert_kana($str,"a"); return $str; }
ここで変換するのがいちばん安全そうなので。
ただし、これだけだと、"&"、"<"、">"が"&"、"<"、">"に変換されてしまい、まずいのでユーザー定義に下記のものを追加しておく。
"&" => "&", "<" => "<", ">" => ">",
これで全角で入力された英数字も、“表示”は半角で表示されるようになる。
ユーザー定義部分で変換しているため、WikiName(BracketName)へのリンク、AutoLinkには影響を及ぼさない。
たとえば、赤&黒というBracketNameを文章中に書いた場合、&が&に変換されて「赤&黒」と表示されるが、ちゃんと赤&黒へのリンクは保たれる。
また整形済み行(pre)では半角変換されないのでアスキーアートも安心。
// ユーザ定義ルール(ソースは置換せずコンバート) function make_line_rules($str) { global $line_rules; static $pattern,$replace; if (!isset($pattern)) { $pattern = array_map(create_function('$a','return "/$a/";'),array_keys($line_rules)); $replace = array_values($line_rules); unset($line_rules); } $str = preg_replace($pattern,$replace,$str); $str = mb_convert_kana($str,"a"); // 半角変換 by reimy return $str; }
上に挙げられた弊害を無視してでも変な文字を除去したい場合は、以下のようにする。 ただし、環境依存文字はそのままである。
lib/file.php の make_str_rules()に一行追加する。以下は PukiWiki 1.4.6 のもの。
// Modify ogirinal text with user-defined / system-defined rules function make_str_rules($source) { global $str_rules, $fixed_heading_anchor; $lines = explode("\n", $source); $count = count($lines); $modify = TRUE; $multiline = 0; $matches = array(); for ($i = 0; $i < $count; $i++) { $line = & $lines[$i]; // Modify directly + $line = mb_convert_kana($line, 'asKV'); // Ignore null string and preformatted texts if ($line == '' || $line{0} == ' ' || $line{0} == "\t") continue; ....