pukiwiki の構文解析が持っていた不具合仕様を修正しました。
何が構文仕様の不具合だったか
pukiwiki は、インラインプラグインのパラメータに、);
および ){
を含む文字列を与える方法がありませんでした。
&plugin(color:rgb(0,0,0);, &size(10){テキスト};です。);
この記述は、
パラメータ
- color:rgb(0
- 0
- 0
あとに続く wiki テキスト
, &size(10){テキスト};です。);
というように解釈されます。(rgb の方で発生していますが、size の方でも発生しうる問題です)
ユーザーレベルで回避できる問題
特殊な記号を含んでいる文字列でも、プラグインのパラメータに渡す方法はあります。
&plugin(rgb(0,0,0), rgb(255,255,255));
この記述は、このままであれば、次のように解釈されます:
パラメータ
- rgb(0
- 0
- 0)
- rgb(255
- 255
- 255)
カンマを含む文字列をひとつの値として使いたい場合は、ダブルクオートで囲みます。
&plugin("rgb(0,0,0)","rgb(255,255,255)");
↓
パラメータ
- rgb(0,0,0)
- rgb(255,255,255)
このように書くことで、パラメータに任意の文字列を与えることができます。(できるはずでした)
補足: ダブルクオート囲みの中でダブルクオート文字を使いたい場合は、""
と書きます。
ユーザーレベルでは回避できなかった問題
ところが、インラインプラグインに限って、);
や ){
のパターンを含む文字列がダブルクオート囲みの書式を壊していました。
ダブルクオート囲みを知っていれば、最初の問題がある記述は、このように書くのが正解だと思われます:
// 誤
&plugin(color:rgb(0,0,0);, &size(10){テキスト};です。);
// 正
&plugin("color:rgb(0,0,0);","&size(10){テキスト};です。");
しかしこの表記は、記述意図に反して、次のように解釈されていました:
パラメータ部分 = "color:rgb(0,0,0
↓ ダブルクオートが閉じていない
- "color:rgb(0
- 0
- 0
あとに続く wiki テキスト
","&size(10){テキスト};です。");
なお、この不自然な解釈は、#cssbox
のようなブロック型のプラグインでは発生しません。
#cssbox("color:rgb(0,0,0);","&size(10){テキスト};です。")
↓
パラメータ
- color:rgb(0,0,0);
- &size(10){テキスト};です。
構文解析レベルの修正でどうなったか
今回の構文解釈修正によって、上記ダブルクオート囲みのパラメータ項目は、インラインでも一貫して、次のように解釈されるようになります:
&plugin("color:rgb(0,0,0);","&size(10){テキスト};です。");
↓
パラメータ
- color:rgb(0,0,0);
- &size(10){テキスト};です。
この変更は wikiwiki 独自の修正です。pukiwiki のオリジナル仕様では、不自然な解釈の方を正として採用しています。