../

全角英数文字を半角に変換表示 -- reimy

複数の人間が書き込みをしていると、どうしても英数文字が全角と半角が混在してしまうので、見栄えが悪くなる。

入力時に全角を半角に変換してしまうのがいちばんいいのだけれども、大幅な改造になってしまいそうなので*1、表示時に全角を半角に変換してしまおうというのが、以下の話。

変更箇所

  • html.php (make_line_rules)
 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;
}

ここで変換するのがいちばん安全そうなので。

ただし、これだけだと、"&"、"<"、">"が"&"、"<"、">"に変換されてしまい、まずいのでユーザー定義に下記のものを追加しておく。

  • default.ini.php
"&" => "&amp;",
"<" => "&lt;",
">" => "&gt;",

これで全角で入力された英数字も、“表示”は半角で表示されるようになる。

ユーザー定義部分で変換しているため、WikiName(BracketName)へのリンク、AutoLinkには影響を及ぼさない。

たとえば、赤&黒?というBracketNameを文章中に書いた場合、&が&に変換されて「赤&黒」と表示されるが、ちゃんと赤&黒?へのリンクは保たれる。

また整形済み行(pre)では半角変換されないのでアスキーアートも安心。


  • なお、引用符(シングルクォーテーション、ダブルクォーテーション)は全角→半角変換しない(仕様)。でないと“注目”、‘注目’が“注目"、‘注目'になってしまい具合が悪い。また円マークとバックスラッシュも半角に変換されません(仕様)。 -- reimy 2003-05-27 (火) 02:06:04
    • スラッシュは半角に変換されるので/\が/\になってしまいます(仕様)。-- reimy 2003-05-27 (火) 02:29:39
  • 1.4.2ではmake_line_rulesが少し変わったので、下記のようにすればOK。 -- reimy 2003-12-30 (火) 19:04:41
    // ユーザ定義ルール(ソースは置換せずコンバート)
    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;
    }

ソースを書き換えて変な文字を変換 -- satoshi?

上に挙げられた弊害を無視してでも変な文字を除去したい場合は、以下のようにする。 ただし、環境依存文字はそのままである。

変更箇所

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;
        ....

*1 入力時に変換してしまうと、BracketNameやURLなど半角に変換されると困るものの処理が厄介。したがってソース書き換え型ユーザー定義の部分で変換するのは避けた。また、ソースを書き換えるのはあまりしたくないので。

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-08-20 (木) 16:40:45
Site admin: PukiWiki Development Team

PukiWiki 1.5.2+ © 2001-2019 PukiWiki Development Team. Powered by PHP 5.6.40-0+deb8u7. HTML convert time: 0.342 sec.

OSDN