#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(ぜひ[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}; -ユーザ定義ルール(&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}; ---複数行処理用の引数案。通常の引数とは区別が必要だと思うので #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}; --&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]{{ ... }} &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) #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とか置いたときに困るような気がします。((&new{&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}; ---余談:ちなみに今、下記を試したら &now; が置換されてしまいました (^^; -- [[みこ]] &new{2004-11-11 (木) 20:02:26}; #codehighlight(&now;){{ abcdefg }} -複数行の引数を最後の引数に限定しているのが不満。何番目の引数でも複数行に書ける記述が出来るといいと思う。 -- [[外野]] &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}; --[[pukiwiki:自作プラグイン/div.inc.php]]が当てはまるかも知れません。 -- [[matsuda]] &new{2004-11-11 (木) 23:27:46}; --外野さんは同時にはないといっているので、違うかと (^^; 唯一オフィシャルで思いつくのは #back プラグインぐらい? -- [[みこ]] &new{2004-11-12 (金) 00:37:39}; ---ちなみに #div プラグインは直感的でないので[[splitinclude プラグイン>plus:Plugin/splitinclude.inc.php]]として自作しちゃってます (^^; -- [[みこ]] &new{2004-11-12 (金) 00:39:12}; #comment *提案例の抽出 [#vc199d8e] **複数行のプラグイン引数の入力方法 [#n1d4cec5] -ヒアドキュメント -可変数の{} 例:{{ }}で囲む -#プラグイン名 ~ #プラグイン名(終端指定) 終端指定はend,clear等 **エラー処理 [#a9ba497b] -現状:終端まで引数になる -入力と同じ出力「ありのまま」 **ユーザ定義ルールの抑制方法 [#v141e777] -現状:#sample<<PRE:EOF -擬似引数:#sample(arg, ''pre'') -#をダブルで:##sample -スペースを入れる:# sample -パーサ用引数:#sample[nosubst]{{ -別の括弧を使う:#sample[[ ]] -別プラグイン:#nouserrules