wikiwiki official

構文解析の不具合仕様について

0 コメント
views
1 フォロー

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 のオリジナル仕様では、不自然な解釈の方を正として採用しています。

WIKIWIKI運営
作成: 2023/06/06 (火) 16:37:41
最終更新: 2023/06/06 (火) 16:50:49
通報 ...