仕様検討†
複数行のプラグイン引数の入力方法†
- ヒアドキュメント
- 可変数の{} 例:{{ }}で囲む (パッチv1.5で採用)
- #プラグイン名 ~ #プラグイン名(終端指定) 終端指定はend,clear等
エラー処理†
- 現状:終端まで引数になる
- 入力と同じ出力「ありのまま」
ユーザ定義ルールの抑制方法†
- 現状:#sample<<PRE:EOF
- 擬似引数:#sample(arg, pre)
- #をダブルで:##sample
- スペースを入れる:# sample
- パーサ用引数:#sample[nosubst]{{
- 別の括弧を使う:#sample[[ ]]
- 別プラグイン:#nouserrules
- プラグインに問い合わせる
- 標準としては適用しない。プラグインが必要に応じて make_str_rules() を呼ぶ
プラグインに問い合わせる案(miko)†
ユーザ定義ルールの抑制方法を本体からプラグインに問い合わせるための機能案です。
- プラグインのコールバックで提供できるようにするために、プラグインの初期化関数 plugin_xxxx_init で問い合わせる(xxxxはプラグイン名)
- プラグインの初期化関数は戻り値としてハッシュ配列を提供する。その配列には本体に要求する項目が入っている。
- デフォルトは互換性を配慮するためなにもなし(戻り値は配列でない、初期化関数自体が存在しない可能性あり)
- 複数行で捌くハッシュは 'blockargs'。デフォルトはセットされていない(通常通りの動作)。'noreplace'を含む文字列ががセットされていたら置換しない。
- ついでにいうならば、'args'も用意して、引数は置換されないようにしたほうがいい?
これに限らず他にも活用できる可能性あり?
どうでしょう?コメントください。
- 書いた後で気がつきましたが、べつに plugin_xxxx_init でなくてもよさそう (^^; -- みこ
- まとめありがとうございます :) 開発日記/2004-11-16 に私の考えを書いてみました。 -- henoheno
- はい、テクニカル的にできるなら henohenoさんの考えで必要十分かなと思います。(しいて言えば、ブロック型とインライン型で挙動を変えるプラグインがたまにあるので1つでまにあうかな?ということぐらいです。) -- みこ
- plugin_xxx_write()というのを呼び出して、戻り値がarray('action' => 'replace', 'body' => ...)だったらbodyでリプレースすると言うのはどうでしょう。これなら引数によってユーザ定義ルールを適用する/しないを制御することができます。 -- matsuda
- なるほど、もともとユーザ定義ってファイルの書き込み時ですものね(^^) で、その関数がない場合は(互換性を考えて)リプレースするがデフォルトって感じかな・・・ -- みこ
プラグインに問い合わせる案2(matsuda)†
ユーザ定義ルールの適用を含めて、複数行引数部分(ボディ)の前処理をプラグインに
任せる案です。
ページ書き込み(またはプレビュー)時に前処理を行うための新しいプラグインインターフェースとしてplugin_xxx_write()を導入します。
- 複数行引数がある場合にのみ呼ばれます。
- 引数はplugin_xxx_convert()と同様に与えられます。
- 戻り値としてarray('action' => 'replace', 'body' => "文字列")を返すと、複数行引数部分が"文字列"に置き換えられます。
- 戻り値がその他の場合には、ユーザ定義ルールは適用されません。
- plugin_xxx_write()が定義されていない場合は、ユーザ定義ルールが適用されます。行頭に空白文字があっても同様です。
- プラグインの引数部分には常にユーザ定義ルールが適用されます。
コメント
- plugin_xxx_write()を実際に書いてみましたが、ユーザ定義ルールの適用だけを考えると結構めんどうです。処理方法だけ返すようにして、実際のユーザ定義ルールの適用は呼び出し元で処理するほうが良いかも。 -- matsuda
- 改善案。複数行部分を除く引数のみで呼び出す。戻り値はarrayで処理方法を記述する。 これだとmake_str_rules()が複数行引数部分の処理に入るときには、処理方法を確定させておくことができる。また、プラグイン側がmake_str_rules()と同じ処理を知っている必要もない。 -- matsuda
プラグインインターフェース†
plugin_xxx_convert()†
plugin_xxx_convert()の引数に追加する。
現在の実装(パッチv1.5)が採用している仕様。
利点:
- 既存のブロック型プラグインで利用できる。ただし、コンテンツを最後の引数として扱うタイプのプラグインのみ。
欠点:
plugin_xxx_convert_multiline()†
plugin_xxx_convert()とは別のインターフェースを用意する。
plugin_xxx_inline()と同様に、複数行引数は最後の引数とするが、複数行引数が無い場合には空の引数を渡す。
利点:
- 通常の引数と複数行引数を区別できるので、パラメータとコンテンツをハッキリ分けられる。
コメント
- plugin_xxx_convert()でも、引数の最後に"\r"があるかどうかで複数行引数を判定可能。 -- matsuda
- plugin_xxx_convert_multilineが定義されてたらインライン型と同じスタイルで呼び出す。無ければplugin_xxx_convertを現状のスタイルで呼び出す、っていうのはどうでしょう。 -- matsuda
- サニタイズは元に戻せるけれど、オートリンクなどが処理されてしまうとページのソースには戻せない。 -- matsuda