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

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

#contents

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

pukiwiki-1.4.6より本体に実験的に取り込まれました。([[BugTrack2/84]])

パッチは必要ありません。設定ファイルに以下を加えると機能します。
 define('PKWKEXP_DISABLE_MULTILINE_PLUGIN_HACK', 0);

**変更履歴 [#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)<<EOF
 #name(arg){{
 複数行の引数
 ...
 ...
 EOF
 }}

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

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

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

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

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

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

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

ヒアドキュメントはプラグインに最後の引数として追加されます。
**用例 [#v59369bb]
-[[official:自作プラグイン/graphviz.inc.php]]
-[[official:自作プラグイン/codehighlight.inc.php]]
-[[official:自作プラグイン/null.inc.php]]

**ダウンロード [#vdb2e74d]
**プラグインのインターフェース [#kb56ae13]

|バージョン|ファイル|変更点|h
|1.4|&ref(convert_html.php.3.diff); (reverted)&br;&ref(file.php.diff);&br;&ref(plugin.php.2.diff); (new)|引数が無い場合でもカンマによる分割をしないようにしました(修正版)。|
|1.3|&ref(convert_html.php.4.diff); (new)&br;&ref(file.php.diff);&br;&ref(plugin.php.diff);|引数が無い場合でもカンマによる分割をしないようにしました。|
|1.2|&ref(convert_html.php.3.diff); (new)&br;&ref(file.php.diff);&br;&ref(plugin.php.diff); (new)|ヒアドキュメントはカンマによる分割をしないようにしました。|
|1.1|&ref(convert_html.php.2.diff); (new)&br;&ref(file.php.diff); (new)|skyさんの変更(引数指定)を取り込みました。整形済テキスト用の表記を追加しました。|
|1.0|&ref(convert_html.php.diff);|初版|
COLOR(red):この仕様は将来、おそらく修正されます。

**アンケート [#a417422e]
複数行引数はplugin_xxx_convert()に最後の引数として渡されます。~
(複数行引数には改行が含まれているため、通常の引数と区別できます。)

-ヒアドキュメント形式は分かり易いですか?
#vote(はい[7],いいえ[4])
** 関連 [#o834f808]

-標準にとりこまれるといいな。
#vote(ぜひ[12],だめ[1])
過去の話題
- [[書式再定義/ブロック構造の実現]]

**コメント [#kf0ad095]
-[[org:自作プラグイン/codehighlight.inc.php]]に使ってみました。 (10/29 変更)-- [[sky]] &new{2004-10-26 (火) 18:40:45};
  			if (preg_match('/^(#.*)<<([A-Z0-9_]+)$/',$line, $matches)) {
 +				if (preg_match('/^(#.*)\((.*)\)$/',$matches[1], $mat)) {
 +					$line = $mat[1]. "(" . $mat[2] . ",";
 +				} else {
 +					$line = $matches[1] . "(";
 +				} 
  				$line = $matches[1] . "(";
このようにすれば #name(arg)<<EOF の形で呼び出せます。プラグインの引数でargとヒアドキュメントを区別したい時に使っています -- [[sky]] &new{2004-10-26 (火) 18:40:45};
-ユーザ定義ルール(&amp;now;など)は展開されてしまうようです。 -- [[matsuda]] &new{2004-10-26 (火) 19:13:28};
-ユーザ定義ルールの置換を抑制できるようにしてみました。 -- [[matsuda]] &new{2004-10-27 (水) 13:57:21};
 #name<<PRE:EOF
 ...
 EOF
&ref(convert_html.php.2.diff);&br;
&ref(file.php.diff);&br;
-関連ありそうなページを発見([[書式再定義/ブロック構造の実現]])。 -- [[matsuda]] &new{2004-10-28 (木) 18:43:35};
-PRE: の時にカンマ '','' を展開しない方法を考えた方は教えて頂けませんか。現在は応急的対策として一度別の文字に変換してからPluginで元のカンマに戻しています。これだと全てのプラグインに逆変換させなければいけません。 -- [[sky]] &new{2004-10-29 (金) 08:52:05};
--convert_html に次のコードを追加して、プラグインで"& sbquo;"をカンマに置換しています。
   $stop_word = $matches[3];
   while (count($lines)) {
 +    if (substr($matches[2], 0, strlen('PRE:')) == 'PRE:'){
 +       $lines = preg_replace("/\,/", "&sbquo;", $lines);
 +    }
      $next_line = array_shift($lines);
      if (substr($next_line, 0, strlen($stop_word)) == $stop_word){
--通常の引数の記述ができるようになったので、ヒアドキュメントの部分はカンマによる分割をしないほうが良いですかね。「&amp;sbquo;」というのは、入力される文字列には絶対現れないでしょうか。 -- [[matsuda]] &new{2004-10-29 (金) 09:26:25};
--PRE:のありなしに関わらずカンマによる分割をしないようにすれば、インライン型プラグインの&amp;name(){...};の記述と対応するので美しい気がします。 -- [[matsuda]] &new{2004-10-29 (金) 09:41:49};
--カンマによる分割をしないようにしました(v1.2)。最初の"\r"を通常の引数とヒアドキュメントの区切りにすることで、特殊な文字の使用を避けてみました。 -- [[matsuda]] &new{2004-10-29 (金) 11:11:13};
-素早い対応ありがとうございます。引数が無い時にはこれまで同様カンマで分割されてしまうため、引数の代わりにカンマを挿入するようにしました。 -- [[sky]] &new{2004-10-29 (金) 14:06:17};
--これ(v1.3)だと、空の引数が2つ出来てしまいますね。 -- [[matsuda]] &new{2004-10-29 (金) 15:41:47};
--plugin.php側の修正にバグがあったので直しました(v1.4)。 -- [[matsuda]] &new{2004-10-29 (金) 15:56:11};
-ヒアドキュメントは主に出力として使用されると思われるので、あらかじめサニタイズしたほうが良いでしょうか。サニタイズした場合、用途が制限されてしまうような可能性はあるでしょうか。 -- [[matsuda]] &new{2004-11-01 (月) 18:55:03};
--今のヒアドキュメントのプラグインへの渡し方ではヒアドキュメントが通常の引数と区別できないため、必ずプラグイン側で再度サニタイズが必要になる。 -- [[matsuda]] &new{2004-11-01 (月) 18:58:04};
-私も時々、どういうカタチ(UI含む)にするのが使いやすいだろうか、あるいは実現できるのだろうかを考えている今日このごろです。 -- [[henoheno]] &new{2004-11-01 (月) 21:22:36};
-けっきょく、ヒアドキュメント構文が理解できるのはプログラマに近いひとだけだとおもいます。((指定ができないほうが心地いいときもあるのです (^^) ))まだ、amazonプラグインのように #amazon(...) ~ #amazon(clear) (でしたっけ?)のほうが分かりやすいかとおもいます。 -- [[みこ]] &new{2004-11-02 (火) 00:31:18};
-ちなみに、上記のような形式(ヒアに近い形)であればインラインでは以下のようにおこなってほしいんですけどね。 -- [[みこ]] &new{2004-11-02 (火) 00:34:49};
 &sample(arg1,arg2,arg3){ ←{のあとはすぐ改行(判定を甘くするならTrimもあり)
   複数行のもの
   複数行のもの
   複数行のもの
 };abcdef ←改行の直後に};で判別。そのあとのabcdef はそのまま続行
-そのままブロック型に応用するならこんな感じかな・・・ -- [[みこ]] &new{2004-11-02 (火) 00:38:35};
 #sample(arg1,arg2,arg3){ ←{のあとはすぐ改行(判定を甘くするならTrimもあり)
   複数行のもの
   複数行のもの
   複数行のもの
 } ←改行の直後に} + [改行]で判別。ブロック型なのでこれ以外何もない。
 abcdef
--終端を固定の文字列で表そうとすると、じゃあその文字列を含めたいときはどうするんだ、って問題が必ず発生するんですよね。 -- [[matsuda]] &new{2004-11-02 (火) 12:24:55};
---上記はそれを承知で発言しています (^-^ 構文・文法を作成するときは技術寄りではなく本来の文(この場合Wiki )が持っている世界観にあわせてほしいということだけです。 -- [[みこ]] &new{2004-11-02 (火) 12:36:32};
---これは、あくまでも一例です。(nは同じ数です) -- [[みこ]] &new{2004-11-02 (火) 12:38:07};
 #sample(arg1,arg2,arg3){{ ←{(1~n)のあとはすぐ改行(判定を甘くするならTrimもあり)
   複数行のもの
   複数行のもの
   複数行のもの
 }} ←改行の直後に}(1~n) + [改行]で判別。ブロック型なのでこれ以外何もない。
 abcdef
---この表現はすごく良いのでは。-- [[matsuda]] &new{2004-11-02 (火) 12:51:20};
-なお、HTMLの構文解析と同様でヒアの終端を記述しない場合は「そのまま」見せるほうが(失敗したということも含めて)わかりやすいかとおもいます。 -- [[みこ]] &new{2004-11-02 (火) 00:42:49};
--これはその通りですね。その場合、複数行にわたった文字列をそのまま出力すると、ブラウザ側で連結されてしまいますが、そこはどう扱うのが良いのでしょう。-- [[matsuda]] &new{2004-11-02 (火) 12:28:03};
---いままでのPukiWikiと同じように「ありのまま」でいいんじゃないでしょうか?(プラグインが存在しない場合は処理せずそのまま出力していますよね?) -- [[みこ]] &new{2004-11-02 (火) 12:42:56};
--{{ }}で囲むスタイルなら、連結されても見た目に分かりやすいですね。 -- [[matsuda]] &new{2004-11-02 (火) 12:53:18};
-[[みこ]]さんの案が素晴らしいと思います。Wikiの文法に潜む共通のルールのひとつ「繰り返し」が生きています。実際の実装を考えると、繰り返し数は 2~n がよろしいかと思います。(1つの場合は従来通り、1行しか見ない様にしたほうが処理的に優しく、覚えてもらう基本ルールとしては2つとするのが人に優しそうです)実装については、ヒアドキュメントを作られた皆さんが一番近いところにいらっしゃるでしょうか? 今心配しているのは、その間で #include プラグインなどでインクルードしたなかにそのデリミタ(nコの閉じカッコ)が存在していたらどうなるかですね。やってみた方が早いですが :) -- [[henoheno]] &new{2004-11-07 (日) 22:36:40};
-&ref(convert_html.php5.diff);でどうでしょうか。繰り返し数は 1以上です。 -- [[sky]] &new{2004-11-07 (日) 22:59:48};
--次のようにしないと、"()"が省略できませんでした。((正規表現的に合っているかどうかは自信ないです (^^;)) -- [[teanan]] &new{2004-11-08 (月) 10:32:54};
 - if (preg_match('/^(#[^\(]*)(\((.*)\))?(PRE:)?({+)$/',$line, $matches))
 + if (preg_match('/^(#[^\(]\w+)(\((.*)\))?(PRE:)?({+)$/',$line, $matches))
--修正ありがとうございます。 -- [[sky]] &new{2004-11-08 (月) 15:19:31};
-残るはいかにもプログラムっぽい PRE: をプラグインの引数に入れることですね (^^) -- [[みこ]] &new{2004-11-08 (月) 12:02:50};
--このあたりは、上の正規表現を見る限り擬似引数として解釈させることは可能でしょうか? -- [[みこ]] &new{2004-11-08 (月) 12:21:53};
--例えば "{{PRE:" として引数のように見せかけると言う事でしょうか。"()"を省略するとプラグイン名と"PRE:"が続いてしまうのでこっちの方が良いと思います。この方式でのプラグイン呼び出しは出来ています。 -- [[sky]] &new{2004-11-08 (月) 15:19:31};
---いえ、最後の引数とする(例: #sample(arg1,arg2,''pre'') の ''pre'')とするという意味です。これができなければ結局ヒアドキュメントと何らかわりはないですしね。 -- [[みこ]] &new{2004-11-08 (月) 16:27:51};
---んじゃ引数じゃない方向も。通常記述が#sampleの時、preの記述は整形済テキスト=空白なので、空白あけて# sampleとか。あるいは太字&斜体ルールの様に#を重ねた数に意味を持たせて##sampleとか。…うーん余計混乱するかなぁ。 -- [[にぶんのに]] &new{2004-11-09 (火) 03:29:36};
---複数行処理用の引数案。通常の引数とは区別が必要だと思うので #sample(arg)[pre]{{ }}  -- [[matsuda]] &new{2004-11-09 (火) 13:04:40};
---えっと、区別する理由って技術的要因以外になにかあるのでしょうか? (^^; -- [[みこ]] &new{2004-11-09 (火) 13:48:48};
---preっていうのはすごく汎用的な単語なので、予約語にしてしまうのは抵抗感があります。衝突しないように特殊な記号をつければ使い勝手が悪くなりますし。 -- [[matsuda]] &new{2004-11-09 (火) 14:06:20};
---では、ちゃんとした単語を用意すればいいのは?(実際にプラグインの意味からすると、整形ではないし)たとえば、preformatted とか noparse とか((なんでも省略するのはプログラマの悪い癖だとおもっているので、あえてフルスペルで書いています。))・・・ -- [[みこ]] &new{2004-11-09 (火) 14:16:30};
---例としてあげられた単語は、いかにも通常の引数として渡したいような単語に見えます。 -- [[matsuda]] &new{2004-11-09 (火) 14:25:03};
-いっそのこと、複数行引数形式のときはユーザ定義ルールは適用されないとか。 -- [[matsuda]] &new{2004-11-09 (火) 14:45:24};
--そのほうがいいかもしれませんね (^^; 必要ある人がどこまでいるかにもよりますが・・・ -- [[みこ]] &new{2004-11-09 (火) 14:55:01};
--逆転の発想で、プラグイン引数でユーザ定義を適用したいなら、プラグインで何か引数を用意してもらってプラグインの中で make_str_rules を呼んでもらう・・・というのはどうでしょう?>matsudaさん -- [[みこ]] &new{2004-11-09 (火) 14:58:57};
--&amp;now;はプラグインの実行時の解釈では意味が違って%%しまいますね%%しまわないでしょうか。 -- [[matsuda]] &new{2004-11-09 (火) 15:11:54};
---なるほど。コンバート時に置換はともかく、ソースを直接置換に関してはそうかもしれませんね。 -- [[みこ]] &new{2004-11-09 (火) 15:42:24};
-いろいろ考えてみたんですが、本来の Wiki のパターンに沿わせるならば、やはり複数行の中でも空白が先頭にあった場合のみ整形済みテキスト((preだとまぎらわしいので表現変えました))扱いするのが正論だとはおもいますけどね・・・(ソースを埋め込みたい人にとっては面倒なのでしょうけど (^^;) -- [[みこ]] &new{2004-11-09 (火) 19:56:00};
--逆に、プログラムソース以外で変換されたくない需要ってあるのかな? (^^; -- [[みこ]] &new{2004-11-09 (火) 20:02:41};
--自分もユーザ定義ルールを適用したくないケースはプログラムソースがほとんどだと思います。なのでユーザ定義ルールの適用を除外する記述がいかにもプログラム的であっても「使い勝手」上は問題ない気がします。ソースの場合は特に行数が多くなり勝ちなので、先頭に空白を入れるのは何とかして欲しいと思います。 -- [[matsuda]] &new{2004-11-10 (水) 12:53:02};
-プラグインが適用されない場合にソースのまま出力されるようにしました。 -- [[matsuda]] &new{2004-11-10 (水) 12:56:12};
 書式
 #sample(args)[nosubst]{{
 ...
//**アンケート [#a417422e]
//
//-ヒアドキュメント形式は分かり易いですか?
//~COLOR(red):{{ }}スタイルに変更しました(パッチv1.5)。
//#vote(はい[26],いいえ[15])
//
//-標準にとりこまれるといいな。
//~&COLOR(red){実験的な機能としてPukiWiki本体に取り込まれました(ver 1.4.6)。};~
//複数行引数の機能を有効にする方法は[[設定>./#a26e9cec]]を御覧ください。
//#vote(ぜひ[63],だめ[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
 内容
 内容
 }}
&ref(convert_html.php.7.diff); &ref(file.php.2.diff);&br;
convert_html.php.6.diffはバグっているので使わないでください。-- [[matsuda]] &new{2004-11-10 (水) 13:48:54};
-ソース置換を区別するためにだけならば、(どのみち複数行なんだから)いっそのこと中括弧に拘らないほうが楽かもね・・・  大括弧とか (^^; -- [[みこ]] &new{2004-11-10 (水) 16:07:26};
 #code_highlight(c)[[ ←(1~n)
 void main(int argc, char *argv[])
 {
 	printf("hello world.\n");
 }
 ]] ←(行頭で1~n)
-なぜ知っているかというと、実は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};

 #plugin((
 arg
 ))
--'上のように普通の括弧を従来のプラグイン引数と同じどうさをした複数行拡張にしたら紛らわしいでしょうか? -- [[sky]] &new{2004-11-10 (水) 18:17:19};
---上記(通常の括弧)でも、複数の引数が欲しい場合に同様の感じ(最後に複数行の引数)になるならば OK なのでは? -- [[みこ]] &new{2004-11-11 (木) 10:12:59};
---ただ、文法は安易に拡張をするとあとで収拾が付かなくなる((それを利用した改造も将来的にでてくるなどを含む))ので、(標準に採用されるならば)できる限りディスカッションしたほうがいいと考えています。 -- [[みこ]] &new{2004-11-11 (木) 10:23:41};
-極端に言うとユーザ定義ルールは UI のお話(文法のお話ではなく置換マクロを文法っぽくみせている)なので外部プラグインで制御も可能かなとおもう部分もあります。以下例↓ -- [[みこ]] &new{2004-11-11 (木) 10:37:33};
 #nouserrules ←このプラグインでページ内のユーザルール全体の書き換えを抑制
 #sample(arg1,arg2,arg3){{ ←{(1~n)のあとはすぐ改行(判定を甘くするならTrimもあり)
   複数行のもの
   複数行のもの
   複数行のもの
 }} ←改行の直後に}(1~n) + [改行]で判別。ブロック型なのでこれ以外何もない。
--あ、別に1~nと書いていますが、単にコピペなのでこだわってるわけではないです (^^; -- [[みこ]] &new{2004-11-11 (木) 10:42:27};
--ページ全体が抑制されてしまうと、commentとか置いたときに困るような気がします。((&amp;new{&amp;now;};などが置換されなくなりそう)) -- [[teanan]] &new{2004-11-11 (木) 11:26:21};
--範囲指定できるようにして、下記のようにするとか((・・・って元の木阿弥なのような気が (^^;))  -- [[teanan]] &new{2004-11-11 (木) 11:29:46};
 #nouserrules(start)
   :
 #nouserrules(end)
-いえ、そこまでもいらないと思います。元々、行メタなPukiWiki は on/off だけあればいいので制御する場合はブロックにする必要はないです。すなわち
 #nouserrules(on)
   :
でほおっておいてもいいし
 #nouserrules(on)
   :
 #nouserrules(off)
としてもいいという意味です。でもって、引数なしのデフォルトは on もしくはトグルが理想かな・・・ -- [[みこ]] &new{2004-11-11 (木) 11:36:22};
-↑ちなみに上記は、skyさん/upkさんの部分編集のon/offよりヒントを得ています[[plus:開発談義/4]] -- [[みこ]] &new{2004-11-11 (木) 11:45:15};
-ただ、あくまでも一案(しかも極論)です (^^; <別プラグイン -- [[みこ]] &new{2004-11-11 (木) 12:27:47};
-別プラグインというのは綺麗な表現だなと感じました。疑問点はその効果を複数行引数とするのが良いか、それとも全体におよぶのか。また部分的にコピペしたときにユーザ定義ルールが適用されてしまう可能性があるので気をつける必要があります。複数行引数以外は行指向なのでそういう煩わしさが無いぶん余計に気になるかも。ソースコードを書く場合を考えると[[ ]]でユーザ定義ルールOFFというのが使い勝手がよさそうですが、ブラケットネームとかぶるのはどうなんでしょう。 -- [[matsuda]] &new{2004-11-11 (木) 15:50:28};
--わたしも、((自分で発言しているにもかかわらず(ぉ))その部分は気になっていました (^^;>中括弧以外の括弧を使用 -- [[みこ]] &new{2004-11-11 (木) 17:53:32};
--別プラグインによる場合のお話ですが、これはどっちにも言えるので(もともとsetlinebreakなどに近い)似たような実装でいいのではないかとおもいます。すなわち、全体でおこなってもいいですし、複数行引数のみにしてもいいのではないかと(どちらかであって、それを引数で指定はめんどいのでなしね (^^;) -- [[みこ]] &new{2004-11-11 (木) 17:56:28};
--ちなみに現在でも、([nosubst]なしで)行頭に空白を入れていると、いまでもユーザ定義ルールは置換されないのですね (^^) -- [[みこ]] &new{2004-11-11 (木) 17:57:00};
---%%当面、ユーザ定義ルールは抑制できなくても良い気がしてきました%%。-- [[matsuda]] &new{2004-11-11 (木) 18:42:59};
--やっと「複数行引数でも先頭の空白で表すのが正論」がのみこめました。 -- [[matsuda]] &new{2004-11-11 (木) 18:50:01};
--複数行引数は整形済テキストというわけではないから、先頭に空白があってもユーザ定義ルールを適用するのがスジですかね。-- [[matsuda]] &new{2004-11-11 (木) 18:57:00};
---あ、わたしが言葉足らずで伝わらなかったのですね (^^; すみません。 と同時にその部分をどうするかが微妙なんですよね (^^; ただ「引数」と解釈するならば変換しないほうがいいでしょうし、「文章(テキスト)」と解釈するなら変換すべき(ただし、「整形済みテキスト」は例外)という狭間なんですよね。わたしは、複数行=「(ソースも含めて)文章」という捉え方をしていたのでそのままルールを生かしていいのかなとおもったのですが・・・たしかにgraphvizなどは「引数」のような感じですものね。(テキストには近いけど (^^;) -- [[みこ]] &new{2004-11-11 (木) 19:13:28};
---プラグイン依存ということですね。プラグインに問い合わせる新しいインターフェースの導入するしかないか! -- [[matsuda]] &new{2004-11-11 (木) 19:32:23};
---なるほど、action convert inline の他にプラグインが望んでいる挙動を問い合わせるということですね。たしかにそれが手っ取り早いかも・・・ -- [[みこ]] &new{2004-11-11 (木) 19:54:22};
---余談:ちなみに今、下記を試したら &amp;now; が置換されてしまいました (^^; -- [[みこ]] &new{2004-11-11 (木) 20:02:26};
 #codehighlight(&now;){{
 abcdefg
** 複数行の引数が改変されてしまう: 現行の「書き換え」型プラグインによるもの [#n890be89]

これが
 #multi_sample_convert{{
 hoge
 #memo(この行は編集される事を意図していない)
 fuga
 }}
-複数行の引数を最後の引数に限定しているのが不満。何番目の引数でも複数行に書ける記述が出来るといいと思う。 -- [[外野]] &new{2004-11-11 (木) 18:03:34};
--2つ以上の複数行の引数を使う想定が思いつかないのでおしえてください。どのような場合(プラグイン)を想定されていますか?>外野 -- [[みこ]] &new{2004-11-11 (木) 19:01:42};
--同時に複数行の引数を使うケースはまず無いでしょう。既存のプラグインを使いまわす場合、1つめの引数で使いたい場合もあります。 -- [[外野]] &new{2004-11-11 (木) 20:29:08};
--そのプラグインってどれになるんでしょう? (^^; オフィシャルプラグインでは1つ目の引数で複数行がほしいというのは見当がつかなかったのですが・・・>外野 -- [[みこ]] &new{2004-11-11 (木) 21:09:07};
 
 #memo(※何か実際のメモ ← ここに表示されるmemoプラグインを更新する)

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

*提案例の抽出 [#vc199d8e]
**複数行のプラグイン引数の入力方法 [#n1d4cec5]
-ヒアドキュメント
-可変数の{} 例:{{ }}で囲む
-#プラグイン名 ~ #プラグイン名(終端指定) 終端指定はend,clear等

**エラー処理 [#a9ba497b]
-現状:終端まで引数になる
-入力と同じ出力「ありのまま」
-パッチあてずの当て推量&些細な事なのですが。 #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};

**ユーザ定義ルールの抑制方法 [#v141e777]
-現状:#sample<<PRE:EOF
-擬似引数:#sample(arg, ''pre'')
-#をダブルで:##sample
-スペースを入れる:# sample
-パーサ用引数:#sample[nosubst]{{
-別の括弧を使う:#sample[[ ]]
-別プラグイン:#nouserrules

**開いたままのバラグラフに対し自動的に閉じパラグラフが付加される時の「開」判断について [#i4181b1b]

不思議な動きを見かけたのでどなたかご確認をお願いします。pukiwiki1.4.7を使用しています。

任意のページに

 //#plugin(){{

と1行書いて保存すると、自動的に

 //#plugin(){{
 }}

とパラグラフの「閉じ」が付加されてしまいます。コメントアウトしてあるにも関わらずです。

改善のため、/lib/file.phpの114行に以下の変更を加えてはどうでしょうか。

 前:preg_match('/#[^{]*(\{\{+)\s*$/', $line, $matches)) {
 後:preg_match('/^#[^{]*(\{\{+)\s*$/', $line, $matches)) {

ただ、これはプラグインが行頭に書かれる場合に限っての処置なのですが、これは

 -#plugin(){{

のようにリストやテーブル内に書き込まれる想定は必要でしょうか?その場合は上記変更では対応できないのですが。
- pkwkのバージョンアップのため、replaceプラグインで #plugin()<<_BLOCK_ を #plugin(){{ に置換したら自動的に }} が付加されてびびりましたw 先に /^_BLOCK_$/→}} を置換することで置換に成功しましたが、その過程でこの動作を発見しました。 -- [[フォルグロス]] &new{2007-02-24 (土) 14:21:14};
- なぜ自動追加の処理があるのでしょうかね?得てしてそれが正しい所に置かれたとは思えないし、いわゆる、小さな親切大きなお世話、な気がします。 --  &new{2007-02-25 (日) 03:28:16};


**コメント [#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};
- アンケートを削除しました。ご協力有難うございました。 -- [[matsuda]] &new{2008-03-18 (火) 10:32:21};


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

PukiWiki 1.5.3+ © 2001-2020 PukiWiki Development Team. Powered by PHP 5.6.40-0+deb8u12. HTML convert time: 0.340 sec.

OSDN