../

インライン・マルチラインコメントアウト

official:自作プラグイン/null.inc.phpとpukiwiki.ini.phpのPKWKEXP_DISABLE_MULTILINE_PLUGIN_HACKを有効にすること 」で、同様のことが実現できます。
改造には危険を伴います。どのように実現するかは各自の判断・責任でお願いします。

発端

//コメント

は、1行コメントでかつ、

文章 //コメント

のように、行中にコメントを書けない。

phpの/*~*/のようなコメント機能が欲しい。

仕様

  • 見出し内はコメントアウトされない*1
  • 整形済みテキスト内はコメントアウトされない*2
  • phpと同じ/* ~ */を使いたかったが、fixed_heading_anchorの処理を回避するのが面倒*3だったので、MediaWikiと同じ<!-- ~ -->にしました。
  • <!-- ~ -->のコメントより、//のコメントの方が優先されます。*5
  • テストが十分ではないかもしれません。問題がありましたらコメントください。

テキスト整形ルール

コメントは表示されません

文章1<!--コメント-->文章2
文章1<!--コメント-->
<!--コメント-->文章1
文章1<!--コメント-->文章2<!--コメント-->文章3

文章1<!--コメント
コメント
-->文章2

文章1<!--コメント
//コメント<!--コメント-->コメント
-->文章2

null.inc.phpにできないが、この改造でできること

  • 表組み構造をコメントアウト
    |A|B|C|<!--D|--E|-->
    |aaa|bbb|ccc|<!--ddd|eee|-->
  • 行の途中から複数行コメントアウト
    文章<!--コメント
    コメント-->
  • 複数行コメントアウト中、行の途中までコメントアウト
    <!--コメント
    コメント
    コメント-->文章
  • 上2件の合せ技
    文章1<!--コメント
    コメント-->文章2

    文章1文章2
    と解釈されます。

差分

改造は自己責任で

convert_html.php,v 1.18
下の差分は旧版です。最新の差分はこちら(コメントの下のほう)。上の仕様 は最新版についての説明です。

--- convert_html.org.php	Sat May 13 07:29:58 2006
+++ convert_html.php	Sat May 26 14:49:15 2007
@@ -885,6 +885,20 @@
 			// Line Break
 			if (substr($line, -1) == '~')
 				$line = substr($line, 0, -1) . "\r";
+
+			// Escape inline and multiline comments 
+			$line = preg_replace('/\<\!--(.*)--\>/U','',$line);
+			if (preg_match('/^(.*)\<\!--/U',$line, $matches)) {
+				$line = $matches[1];
+				while (! empty($lines)) {
+					if (preg_match('/--\>(.*)$/U', array_shift($lines), $matches)) {
+ 						$line .= $matches[1];
+						break;
+					}
+				}
+			}
+			$head = $line{0}; // replace head
 			
 			// Other Character
 			if (isset($this->classes[$head])) {

  • null プラグインでよろしいかとおもいますが。 -- 2007-05-26 (土) 18:18:37
    • PKWKEXP_DISABLE_MULTILINE_PLUGIN_HACKを有効にしたくない人もいるでしょう -- 2007-05-26 (土) 18:47:20
      • 本体を改造したくない人もいるでしょう。選択肢がいくつかあってもいいんでは。 -- 2007-05-26 (土) 19:11:15
    • 「null.inc.phpにできないが、この改造でできること」を追記しました
  • 「PKWKEXP_DISABLE_MULTILINE_PLUGIN_HACK を~」と書いていながら、
    if 文の条件にこれが入っていないので、設定が何であれ動作してしまう気がします。
    PKWKEXP_DISABLE_MULTILINE_PLUGIN_HACK の設定に、マルチラインコメントの動作を連動させるには、
    上で追加する1つ目のif 文の所を
    			if (! PKWKEXP_DISABLE_MULTILINE_PLUGIN_HACK &&
    			    preg_match('/^(.*)\<\!--/U',$line, $matches)) {
    とする必要があると思います。
    まあ逆に、
    「PKWKEXP_DISABLE_MULTILINE_PLUGIN_HACK の設定関係なしに、マルチラインコメントを使うことができる」
    というのが、メリットといえるかもしれませんが -- 2007-05-27 (日) 12:41:53
    • すみません、もう一度見直したら、設定が関係あるのは自作プラグインだけでした。忘れてください。
  • 「行頭に開始タグがあるときにエラーが出て表示できない」、「マルチラインコメントの時に行コメント内の終了タグに反応してしまう」、
    という2つの問題が発生しました。
    2つ目の問題は注意書きさえあれば、どちらでもいい気がしますが、それも含めた修正案を書きます。
    ついでで、開始タグがその行にない時は「replace head」までの作業が必要ないので、if文でくくってみました。
    上の差分の追記する部分」に対する差分を書きます(ただし、タブ数の変更は無視してあります)。
    	// Escape inline and multiline comments 
    +	if (preg_match('/\<\!--/',$line)) {
    		$line = preg_replace('/\<\!--(.*)--\>/U','',$line);
    		if (preg_match('/^(.*)\<\!--/U',$line, $matches)) {
    			$line = $matches[1];
    			while (! empty($lines)) {
    -				if (preg_match('/--\>(.*)$/U', array_shift($lines), $matches)) {
    +				if (preg_match('/^(?!\/\/).*--\>(.*)$/U', array_shift($lines), $matches)) {
    					$line .= $matches[1];
    					break;
    				}
    			}
    		}
    +		if ($line == '') {
    +			$this->last = & $this;
    +			continue;
    +		}
    		$head = $line{0}; // replace head
    +	}
    上にも書きましたが、この差分は横長になり過ぎないようにタブを調整してます。
    ご注意ください。 -- 2007-05-27 (日) 13:53:20
    • いまさらな補足、error_reporting(E_ALL) としていたからエラーをみつけれたのかも。 -- 2007-05-29 (火) 23:09:32
  • フォロー&ツッコミありがとうございます。私も悩んだ点です。
    • インラインとマルチラインの処理を分けるかどうか
    • preg_match/replaceで /\<\!--/ を2回チェックするのか
    • 関係なくてもheadを置き換えるのか
    • $line == '' の処理については、一度は書いた*6ものの、消しても動いてそうだったんで消しちゃいました。(^^ゞ
    • //-->については、すいません明記していませんでした。ご指摘ありがとうございます。 -- 2007-05-28 (月) 07:25:42
  • 最初のpreg_matchは正規表現の必要がないので、strstrでOKですよね? -- 2007-05-28 (月) 08:41:49
    -	if (preg_match('/\<\!--/',$line)) {
    +	if (strstr($line,'<!--')) {
  • はい、strstrで事足ります。
    正規表現の練習をしているせいか、まずはpreg_ 系の関数を選択してそれから~、なんてことをしてしまっています。
    PHP マニュアル にも、注意書きがある*7んですけどね。 -- 2007-05-28 (月) 12:36:23
  • strposの方が軽いようですね。以下に差分ソースをまとめます。 -- 2007-05-29 (火) 06:48:45
    --- convert_html.org.php	Sat May 13 07:29:58 2006
    +++ convert_html.php	Tue May 29 06:43:56 2007
    @@ -885,6 +885,25 @@
     			// Line Break
     			if (substr($line, -1) == '~')
     				$line = substr($line, 0, -1) . "\r";
    +
    +			// Escape inline and multiline comments 
    +			if (strpos($line,'<!--') !== false) {
    +				$line = preg_replace('/\<\!--(.*)--\>/U','',$line);
    +				if (preg_match('/^(.*)\<\!--/U',$line, $matches)) {
    +					$line = $matches[1];
    +					while (! empty($lines)) {
    +						if (preg_match('/^(?!\/\/).*--\>(.*)$/U', array_shift($lines), $matches)) {
    + 							$line .= $matches[1];
    +							break;
    +						}
    +					}
    +				}
    +				if ($line == '') {
    +					$this->last = & $this;
    +					continue;
    +				}
    +				$head = $line{0}; // replace head
    +			}
     			
     			// Other Character
     			if (isset($this->classes[$head])) {
  • 現在の仕様ですとプラグインによっては動作しないので、本格的に対応するには、BugTrack2/234#i2b8e74d?にあるように、get_source()をフックするしかなさそうです。 -- Kjm 2007-06-22 (金) 23:46:19
    • 「プラグインによっては」ではなく,「自作プラグインで独自に整形ルールをパースする場合は」が正解です。本体標準に対応していればそれで十分ですよ。 -- 2007-06-23 (土) 07:58:19

*1 *見出し<!--コメント-->のコメントは表示されます
*2 プログラムソースを張りたい時があると思いますので
*3 行頭に*/があるとアンカーが付いてしまう*4
*4 lib/file.phpのmake_str_rulesが付けてくれる XD
*5 行頭//-->ではコメントを終了できません
*6 ソースの上の方からコピペした
*7 マニュアルより引用 : ある文字列が他の文字列内に含まれているかどうかを調べるためだけに preg_match() を使うのは避けた方が良いでしょう。
   strpos() か strstr() 関数を 使う方が速くなります。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-04-04 (土) 01:22:19
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.586 sec.

OSDN