#topicpath
----
*複数行のプラグイン引数を可能に -- [[matsuda]] [#vf81cae4]

プラグインで何行にもわたるような文章を処理したい場合に便利な機能です。

#contents

**ダウンロード [#vdb2e74d]

|バージョン|ファイル|変更点|h
|v1.6-for146|&ref(multiline_convert-16-for146.diff); |2005-07-03時点のCVS版向けです(by [[henoheno]]) &br; v1.6の(正規表現の/デリミタの表現の/処理の)整理をそこそこ行いました。 &br; - 複数行プラグインの閉じブラケットが見つからなかった場合、自動的にテキストの末尾に追加します。 &br; - [[hiroppi]]さんのパッチを取り込み、整理しました。 &br; コメント:正規表現の部分はまだ整理の余地があると思います。v1.7 とした方が良かったかな。&br; &color(red){このコードは 1.4.6_rc に追加されました(※編集に関する問題があるため、デフォルトで無効)}; |
|v1.6|&ref(convert_html.php.9.diff); (new)&br;&ref(plugin.php.4.diff);|複数行引数がヒアドキュメント形式と同じようにプラグインに渡るように修正しました。|
|v1.5|&ref(convert_html.php.8.diff); (new)&br;&ref(plugin.php.4.diff); (new)|PukiWiki1.4.5_1対応です。複数行引数の記述方法を変えました({{ }}スタイル)。ユーザ定義ルールの抑制は未対応です。|
|v1.4|&ref(convert_html.php.3.diff); (reverted)&br;&ref(file.php.diff);&br;&ref(plugin.php.2.diff); (new)|引数が無い場合でもカンマによる分割をしないようにしました(修正版)。|
|v1.3|&ref(convert_html.php.4.diff); (new)&br;&ref(file.php.diff);&br;&ref(plugin.php.diff);|引数が無い場合でもカンマによる分割をしないようにしました。|
|v1.2|&ref(convert_html.php.3.diff); (new)&br;&ref(file.php.diff);&br;&ref(plugin.php.diff); (new)|ヒアドキュメントはカンマによる分割をしないようにしました。|
|v1.1|&ref(convert_html.php.2.diff); (new)&br;&ref(file.php.diff); (new)|skyさんの変更(引数指定)を取り込みました。整形済テキスト用の表記を追加しました。|
|v1.0|&ref(convert_html.php.diff);|初版|

**解説 [#n3028032]

このパッチを当てると、ブロック型プラグインで複数行の引数指定が可能になります。

 #name(arg){{
 複数行の引数
 ...
 }}

>(arg)は省略できます。

+ブロック型プラグインの通常の記述#name(arg)に続いて二文字以上の{を続けます。
+引数は次の行から書きます。
+{と同じ数の}が行頭に現れるまでが引数として扱われます。

複数行引数の行頭に}}をおきたい場合は、引数を囲む{{ }}の文字数を調整します。

**ユーザ定義ルールの抑制 [#fae9118a]

COLOR(red):現在この機能は無効です(パッチv1.5~)。下記は古い仕様です。

また、PRE:を加えれば、ユーザ定義ルール(&now;など)のページ書き込み時の置換を抑制することができます。

 #name<<PRE:EOF
 ...
 ...
 EOF

**用例 [#v59369bb]
-[[org:自作プラグイン/graphviz.inc.php]]
-[[org:自作プラグイン/codehighlight.inc.php]]
-[[org:自作プラグイン/null.inc.php]]

**プラグインのインターフェース [#kb56ae13]

COLOR(red):この仕様は将来、おそらく修正されます。

複数行引数はplugin_xxx_convert()に最後の引数として渡されます。
(通常の引数と複数行引数を区別できません)

** 関連 [#o834f808]

過去の話題
- [[書式再定義/ブロック構造の実現]]

**アンケート [#a417422e]

-ヒアドキュメント形式は分かり易いですか?
~COLOR(red):{{ }}スタイルに変更しました(パッチv1.5)。
#vote(はい[20],いいえ[11])

-標準にとりこまれるといいな。
~COLOR(red):CVSに取り込まれました(パッチv1.6-for146)。
#vote(ぜひ[57],だめ[1])

**仕様検討 [#l836037a]

別のページに分けられています。

#ls2(PukiWiki/1.4/ちょっと便利に/複数行のプラグイン引数を可能に/仕様検討,title)


** 複数行の引数が改変されてしまう: 見出しやユーザー定義ルール [#g021aaed]

-引数を含む文字列を返値としているpluginの場合、行頭にアスタリスクが書かれると見出しのアンカーが表示されてしまうようです。 -- [[hiroppi]] &new{2005-04-15 (金) 22:44:00};
-たとえばどういう記述ですか? -- [[matsuda]] &new{2005-04-18 (月) 18:43:51};
-おそらく、以下のような記述かと・・・ (^^; -- [[みこ]] &new{2005-04-18 (月) 19:49:11};
 #multiline(){{
 *見出し1
 内容
 内容
 **見出し2
 内容
 内容
 }}
-なぜ知っているかというと、実はplus!はそれを有効利用しているから (^^;(plus!のmultilangプラグイン) -- [[みこ]] &new{2005-04-18 (月) 19:51:04};
-なるほど。これはユーザ定義ルールと同じ関数内の処理ですね(ぜんぜん周りを読んでなかった)。抑制は共通のスイッチでよいのだろうか。 -- [[matsuda]] &new{2005-04-18 (月) 20:22:12};
-言葉足らずで申し訳ないです。その後、ぼくの環境では以下のようなpatchを作成しました。共通のスイッチが使えるならばその方がいいと思います。 -- [[hiroppi]] &new{2005-04-19 (火) 15:28:56};
 --- file.php	2005-01-29 22:29:34.000000000 +0900
 +++ /var/www/html/pukiwiki/lib/file.php	2005-04-18 11:37:58.000000000 +0900
 @@ -67,8 +67,17 @@
  			foreach ($str_rules as $rule => $replace)
  				$str = preg_replace('/' . $rule . '/', $replace, $str);
  		
 +		// multiline block plugin
 +		if (preg_match('/#[^{]*(\{{2,})\s*$/', $str, $matches)) {
 +			$stop_len = strlen($matches[1]);
 +			$multi_block_plugin = true;
 +		}
 +		if (preg_match('/\}{'.$stop_len.'}/', $str))
 +			$multi_block_plugin = false;
 +
  		// Adding fixed anchor into headings
  		if ($fixed_heading_anchor &&
 +			!$multi_block_plugin &&
  			preg_match('/^(\*{1,3}(.(?!\[#[A-Za-z][\w-]+\]))+)$/', $str, $matches))
  		{
  			// Generate ID:
-ユーザー定義ルールと固定アンカーについては、[[hiroppi]]さんのアイデアで問題なく動く(回避できる)ようですね :) -- [[henoheno]] &new{2005-07-03 (日) 11:18:58};
-アップロードした v1.6-for146 にマージしてあります。 -- [[henoheno]] &new{2005-07-03 (日) 23:11:19};
- V1.6-for146でmultiline block plugin の正規表現において # がエスケープされていなく、正常に動作しませんでした。 1.4.6_rc のconvert_html.php 内では、148行目と、856行目でしょうか。 とりあえず、「preg_match('/^#(」 を 「preg_match('/^\#(」に変えると動作します。 -- [[ryutiki]] &new{2005-11-21 (月) 21:12:34};

#comment

** 複数行の引数が改変されてしまう: 現行の「書き換え」型プラグインによるもの [#n890be89]

これが
 #multi_sample_convert{{
 hoge
 #memo(この行は編集される事を意図していない)
 fuga
 }}
 
 #memo(※何か実際のメモ ← ここに表示されるmemoプラグインを更新する)

こうなる
 #multi_sample_convert{{
 hoge
 #memo(※何か実際のメモ ← ここに表示されるmemoプラグインを更新する)
 fuga
 }}
 
 #memo(※何か実際のメモ ← ここに表示されるmemoプラグインを更新する)


-パッチあてずの当て推量&些細な事なのですが。 #commentなど挿入位置を調べるためページを読むプラグインがあります。複数プラグインの記述箇所は走査をスキップする対応が必要ではありませんか? -- [[にぶんのに]] &new{2005-07-01 (金) 01:13:05};
-必要そうです :( 私は複数行のアイデアを用い、別のAPIとして用意することで例えば #memo プラグインがより便利な形に生まれ変わるのではないかと思っていたのですが、同じ問題に思い当たりました。 -- [[henoheno]] &new{2005-07-03 (日) 10:57:11};
-現状PukiWikiプラグインによる「テキスト書き換え」は個々のプラグインが担当しており、ほとんどが行指向のシンプルな実装ですから:
-- 個別に対応する場合、走査をスキップする方法を確立したとして、現行の全ての「自己書き換え型」プラグインにそれを盛り込まねば、複数行の引数とバッティングしてしまうでしょう。(方法を確立したとして)付属のプラグインの全てにそれを実装し終わるには時間が必要です -- [[henoheno]] &new{2005-07-03 (日) 10:59:03};
-- PukiWiki本体で解決しようとする場合、実現できるかは別として、例えばテキストをいくつかのブロックに分割して、ブロックごとに処理する(無視する)かどうかを指定する方法があるとは思うのですが、現行のプラグイン実装はそこまで複雑ではありません(必要がないので)。 -- [[henoheno]] &new{2005-07-03 (日) 11:09:22};
-- 「何番目に検出されたmemoプラグインか」といった情報を渡す仕組みがあっても回避できそうですが、現状はそんな仕組みはありません。 -- [[henoheno]] &new{2005-07-03 (日) 12:34:43};
-- 他には、複数行の引数の部分の行頭に、一時的に半角スペースを挿入することで回避できるかどうか? -- [[henoheno]] &new{2005-07-03 (日) 21:07:57};
-今までは、たまたまそのような事例が無かったのでしょうし、「自己書き換え型」複数行プラグインの需要も無かったので話がここまで行かなかったのでしょうけれども、既存の自己書き換え型プラグインと標準的な複数行プラグインが干渉するというのはとても大きな問題だと思います (^^; -- [[henoheno]] &new{2005-07-03 (日) 11:16:33};
-ざっと読んだだけなのでズレてるかもしれませんが、複数行状態である必要性はソースの可読性の問題であって、複数行プラグイン側が改行込みの引数を要求しているわけじゃないと思うのですが合ってますか? --  &new{2005-07-03 (日) 21:08:27};
--もしこの認識で合ってるのであれば、ディスク保存時に単一行状態に変換・ソース表示時に複数行状態へ逆変換が行なえれば問題は解決すると思いますが。 --  &new{2005-07-03 (日) 21:26:14};
-- コメントありがとうございます :) テキスト保存時(単一行テキスト) / 編集時(複数行テキスト) / 表示時(複数行プラグインの引数) でそれぞれ形態を変換する案という事でしょうか。現行のルールの中でもうまく行きそうな案だと思います :) -- [[henoheno]] &new{2005-07-03 (日) 23:05:36};
-- ただ、現在複数行の引数を希望しているみなさんのイメージは、あくまでもテキスト保存時の形態も複数行テキストである事を希望している様に受け取っています。(保存したテキストファイル(wiki/*.txt)と、編集時のテキストが同一) -- [[henoheno]] &new{2005-07-03 (日) 23:08:24};
-- テキスト保存時に改行を \n に変換して格納するような動作自体は、例えば #memo プラグインが行っています。 -- [[henoheno]] &new{2005-07-03 (日) 23:26:36};
--保存テキストと編集テキストの同一性を要求するならこの方法は却下ですね。フロントエンドだけの処理にすればconvert_html等を変えずに既存プラグインも改変無しに複数行引数が可能にもできそうな気がしたのでコメントしてみました。 --  &new{2005-07-04 (月) 01:12:26};

#comment


**コメント [#kf0ad095]

-以前のコメントは[[./昔のコメント]]に移動しました。&new{2005-02-24 (木) 18:06:58};
-PukiWiki 1.4.5-1対応のパッチをアップロードしました。{{ }}スタイルです。ユーザ定義ルールの抑制は除いてあります。 -- [[matsuda]] &new{2005-02-24 (木) 14:26:41};
-これまでは引数の最後が改行である事を利用して複数行引数を見分けていたのですが、それが出来なくなったのですね。&br;それと、ページ長くなり書き込まれた場所が分かりにくいので分割しませんか? -- [[sky]] &new{2005-02-24 (木) 17:28:53};
--分割しました。 -- [[matsuda]] &new{2005-02-24 (木) 18:24:23};
--最後の改行については良く考えずに変更してしまいました。修正版をアップします。 -- [[matsuda]] &new{2005-02-24 (木) 18:24:23};
-一瞬、将来のPukiWiki-1.5で採用されたのかと思いました (^^; -- [[teanan]] &new{2005-02-24 (木) 18:15:02};
--言われてみると確かに。 -- [[matsuda]] &new{2005-02-24 (木) 18:31:25};
-なるべくクリーンなパッチの方が本体に採用されやすいかなぁ、なんて思ってるんですがどうでしょうか。互換性を維持したパッチの方が良いですかね。 -- [[matsuda]] &new{2005-02-24 (木) 18:23:31};
--これに関しては他のパッチと違って、使っているのは基本的には冒険者だから、互換性はあまり考えなくてもいいのでは? :) ((逆に半端な取り込まれ方をしていない分だけクリーンなパッチでも問題ないかと・・・)) -- [[みこ]] &new{2005-02-24 (木) 21:24:08};
--ただ、最後の引数のお話はたしかに指標(プラグイン作者にこう作ってくださいというルール)が必要になるかもしれませんね。(最後の引数が「改行付き」でいいのかな? (^^; ) -- [[みこ]] &new{2005-02-24 (木) 21:28:17};
-- それが可能なのであれば、クリーンなパッチを希望します。利用者に届けたいのは検討の結果ですので :) -- [[henoheno]] &new{2005-02-24 (木) 22:53:18};
-- code(highlight) プラグインの方で非互換情報が出ているようです。どのようなものかは未確認ですが。 -- [[henoheno]] &new{2005-02-24 (木) 22:53:55};
-- マージのために気を使っていただいてありがとうございます。 -- [[henoheno]] &new{2005-02-24 (木) 22:54:27};
--最後の引数に対応して頂きありがとうございます。code.inc.phpで動作しました。&br;これまでの版では結果的に最後が改行になったので、これを利用して場辺り的に区別していました。もしも引数が明確に区別出来るならこのような判定をする必要は無くなります。&br;仕様として引数を区別させるか否かも問題になりそうですね。区別の仕方によっては複数行引数に対応させたプラグインしか動作しないようになってしまいますし。 -- [[sky]] &new{2005-02-25 (金) 01:27:48};
---なにも考えずに・・ということであれば、最後の引数は複数行(インラインプラグインの最後の引数は自動的に{ ~ };の部分と同様の考え)ということにしてしまえばいいのですが、互換性をとりにいくのが大変そうですね。(逆にブロック型も同様にしてしまうと、既存プラグインに影響がでるかな? (^^; でも、既存プラグインもメリット得たりして (^-^(例:refプラグインのタイトル) -- [[みこ]] &new{2005-02-25 (金) 08:55:39};
-プラグインが動きません・・・。convert.html.phpとplugin.phpにパッチを当ててアップロードすればいいだけですよね?1.4.5_1の場合は? -- [[アッカ]] &new{2005-08-15 (月) 05:41:54};
-- 1.4.6ならパッチをあてなくてもpukiwiki.ini.phpにdefine('PKWKEXP_DISABLE_MULTILINE_PLUGIN_HACK', 0);を加えれば動きます。1.4.5_1の場合はv1.6のパッチをあてて下さい。 -- [[matsuda]] &new{2006-02-02 (木) 18:29:47};

#comment

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Site admin: PukiWiki Development Team

PukiWiki 1.5.4+ © 2001-2022 PukiWiki Development Team. Powered by PHP 5.6.40-0+deb8u12. HTML convert time: 0.250 sec.

OSDN