#topicpath ---- *複数行のプラグイン引数を可能に -- [[matsuda]] [#vf81cae4] プラグインで何行にもわたるような文章を処理したい場合に便利な機能です。 #contents **用例 [#v59369bb] -[[org:自作プラグイン/graphviz.inc.php]] -[[org:自作プラグイン/codehighlight.inc.php]] -[[org:自作プラグイン/null.inc.php]] **解説 [#n3028032] このパッチを当てると、ブロック型プラグインでヒアドキュメント形式による複数行の引数指定が可能になります。 #name(arg)<<EOF ... ... EOF (arg)は省略できます。 また、PRE:を加えれば、ユーザ定義ルール(&now;など)のページ書き込み時の置換を抑制することができます。 #name<<PRE:EOF ... ... EOF ヒアドキュメントはプラグインに最後の引数として追加されます。 **ダウンロード [#vdb2e74d] |バージョン|ファイル|変更点|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);|初版| **アンケート [#a417422e] -ヒアドキュメント形式は分かり易いですか? #vote(はい[7],いいえ[4]) -標準にとりこまれるといいな。 #vote(ぜひ[11],だめ[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}; -ユーザ定義ルール(&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("/\,/", "‚", $lines); + } $next_line = array_shift($lines); if (substr($next_line, 0, strlen($stop_word)) == $stop_word){ --通常の引数の記述ができるようになったので、ヒアドキュメントの部分はカンマによる分割をしないほうが良いですかね。「&sbquo;」というのは、入力される文字列には絶対現れないでしょうか。 -- [[matsuda]] &new{2004-10-29 (金) 09:26:25}; --PRE:のありなしに関わらずカンマによる分割をしないようにすれば、インライン型プラグインの&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}; #comment *提案例の抽出 [#vc199d8e] **複数行のプラグイン引数の入力方法 [#n1d4cec5] -ヒアドキュメント -可変数の{} 例:{{ }}で囲む -#プラグイン名 ~ #プラグイン名(終端指定) 終端指定はend,clear等 **エラー処理 [#a9ba497b] -現状:終端まで引数になる -入力と同じ出力「ありのまま」