WordPressのbrBrbrプラグインの振る舞いを確認する

本blogはWordPressを使用して構築しているのですが、その中でWP-SyntaxとbrBrbrのプラグインを使用しています。

しばらく使っていて気づいたのですが、どうやら上記2つのプラグインを同時に使用すると、シンタックスハイライトさせたコードの下に無駄なスペース(brタグ)2行ほど出てしまうらしく、出力結果の見た目がかっこ悪くなってしまいます。

で、この問題を解消したいので、プラグインの勉強を兼ねてbrBrbrの処理内容をチェックしてみました。


プラグインのソースを表示させる

プラグイン内のソースチェックは、ファイルを直接開く必要があるのかと思っていたのですが、調べてみるとWordPressの管理画面から直接確認や編集を行うことができました。

管理者ページの左メニューから、プラグイン→プラグイン編集を選択します。


その後、画面右上のコンボボックスから、確認したいプラグイン(今回はbrBrbr)を選択すると、ソースが確認できます。




brBrbrプラグインのソースを読む


ソースは以下のとおり、30行程度です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/*
Plugin Name:brBrbr
Plugin URI:http://camcam.info/wordpress/101/
Description:Line feed is converted to <br />.
Version:2.0
Author:CamCam
Author URI:http://camcam.info/
*/
 
remove_filter('the_content','wpautop');
add_filter('the_content','brBrbr');
 
 
remove_filter('comment_text', 'wpautop', 30);
add_filter('comment_text','brBrbr',30);
 
function brBrbr($brbr) {
	$brbr = str_replace(array("\r\n", "\r"), "\n", $brbr); // cross-platform newlines 
	$brbr = str_replace("\n", "<br />\n", $brbr); // cross-platform newlines 
	$brbr = preg_replace('!(</?(?:table|img|thead|tfoot|caption|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|textarea|input|blockquote|address|p|math|script|h[1-6])[^>]*>)\s*<br />!', "$1", $brbr);
	$brbr = preg_replace('|<blockquote([^>]*)>|i', "</p>\n<blockquote$1><p>", $brbr);
	$brbr = str_replace('</blockquote>', "</p></blockquote>\n<p>", $brbr);
	$brbr = preg_replace('/(<pre.*?>)(.*?)<\/pre>/ise', "clr_br('$0')", $brbr);
	$brbr = preg_replace('/(<script.*?>)(.*?)<\/script>/ise', "clr_br('$0')", $brbr);
	$brbr = preg_replace('/(<form.*?>)(.*?)<\/form>/ise', "clr_br('$0')", $brbr);
	$brbr="<p>\n".$brbr."</p>\n";
	return $brbr; 
}
 
 
function clr_br($str){
	$str  = str_replace("<br />","",$str);
	$str  = str_replace('\"','"',$str);
	return $str;
}



ぱっと見で分かるように、brBrbr()関数だけ押さえればOKなので、この関数内の各処理で何を行っているかチェックしました。以下にコメントの形で処理内容を記述します。

function brBrbr($brbr) {
    //--------------------------------------------------------------------------
    // \r\nや、\rを\nに置換します。
    // これはクライアント環境によって改行文字が"CRLF,LFのみCRのみ"と
    // 混在しているのを、全て\nへ正規化するのが目的です。
    //--------------------------------------------------------------------------
    $brbr = str_replace(array("\r\n", "\r"), "\n", $brbr); // cross-platform newlines 
 
    //--------------------------------------------------------------------------
    // 正規化された改行文字を、一旦全部brタグに変換します。
    //--------------------------------------------------------------------------
    $brbr = str_replace("\n", "<br />\n", $brbr); // cross-platform newlines 
 
    //--------------------------------------------------------------------------
    // ここに列挙されたタグの後にあるbrタグは除去します。
    // (これらのタグの後にある改行は改行文字のままにしておきたいので)
    //--------------------------------------------------------------------------
    $brbr = preg_replace('!(</?(?:table|img|thead|tfoot|caption|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|textarea|input|blockquote|address|p|math|script|h[1-6])[^>]*>)\s*<br />!', "$1", $brbr);
 
 
    //--------------------------------------------------------------------------
    // blockquoteタグが出てきたときは、blockquoteの中全体をpタグで括ります。
    //--------------------------------------------------------------------------
    $brbr = preg_replace('|<blockquote([^>]*)>|i', "</p>\n<blockquote$1><p>", $brbr);
    $brbr = str_replace('</blockquote>', "</p></blockquote>\n<p>", $brbr);
 
    //--------------------------------------------------------------------------
    // pre,script,formタグの中にある改行はそのまま保持したいので、br->改行に戻します。
    //--------------------------------------------------------------------------
    $brbr = preg_replace('/(<pre.*?>)(.*?)<\/pre>/ise', "clr_br('$0')", $brbr);
    $brbr = preg_replace('/(<script.*?>)(.*?)<\/script>/ise', "clr_br('$0')", $brbr);
    $brbr = preg_replace('/(<form.*?>)(.*?)<\/form>/ise', "clr_br('$0')", $brbr);
 
    //--------------------------------------------------------------------------
    //置換後の文字列全体を,pタグで括ります。
    //--------------------------------------------------------------------------
    $brbr="<p>\n".$brbr."</p>\n";
    return $brbr; 
}





brBrbrプラグインは無罪っぽい…

元々の問題だったWP-SyntaxとbrBrbr混在時の不具合ですが、brBrbrのソースを見る限りこちらの問題ではなさそうです…

おそらく、WP-Syntaxがpreタグを置換する際、置換後文字列に空行を無駄に入れているような雰囲気です。



関連記事

コメントを残す

メールアドレスが公開されることはありません。