インラインプラグインの{body}は、適宜WikiName, BracketName, 特に AutoLinkを回避しなければならない†
- 元タイトル: [AutoLink] インラインプラグインの{body}には、AutoLinkを回避するためにstrip_htmltag()をかけねばならない
- ページ: BugTrack2
- 投稿者: henoheno
- 優先順位: 重要
- 状態: 着手
- カテゴリー: その他
- 投稿日: 2005-05-07 (土) 16:23:07
- バージョン:
- AutoLinkが生成するアンカー(A)タグの周囲にマーカー(コメント文)を挿入
<!--autolink--><a href="link-to-the-page">page</a><!--/autolink-->
- functoin strip_autolink() を追加。マーカーの内側にあるアンカータグを、マーカーもろとも削除する
- 必要に応じて(strip_htmltag()の代わりに)上記関数を使用する
メッセージ†
&inline(arguments,argument2, ... ,argumentN){body text message};
現在のWikiName, BracketName, AutoLinkの仕様では、{body}部分を利用するインラインプラグインについて、{body}に対して事前にstrip_htmltag()をかけておかなければ、挿入されたリンク文字列(アンカータグ)による影響を受けてしまう。{body}の中の文字列は(特にAutoLinkによって偶発的に)アンカータグを挿入される可能性があり、必要に応じてそれによる影響を回避するコードを挿入しなければならない。この回避策がいままでプラグインの中にまちまちな方法で含まれていたり、物によっては含まれていなかった。
- aname, new プラグインには、以前から別々の方法でこのコードが入っていたが、意図が明文化されておらず、方法はまちまちであった。
- これは回避策であって解決策ではない。
- 複数行ねたにも関連する。
- color, rubyプラグインは微妙ですが、修正しておきます。何かあればコメント下さい。 -- henoheno
- colorプラグインでAutoLinkを回避させておかないと: AutoLinkによって分断された部分の色が変わりません。今大丈夫でも、いずれそうなる可能性があります。
- sizeプラグインは、「文字サイズを大きくするだけ」ですから、意味合いからするとこの回避策はいらないようです。一応コメントアウトした形でコードを入れておきます。 -- henoheno
- BugTrack2/67 インライン要素内のインライン要素が無視される -- henoheno
- BugTrack/669 AutoLinkによってブラケットネームが正しく処理されないことがある -- henoheno
WikiNameの処理について†
修正案†
--- lib/html.php Sun Jul 03 23:51:18 2005
+++ lib/html.php Wed Aug 03 15:56:18 2005
@@ -329,7 +329,7 @@
// Remove AutoLink marker with AutLink itself
function strip_autolink($str)
{
- return preg_replace('#<!--autolink--><a [^>]+>|</a><!--/autolink-->#', '', $str);
+ return preg_replace('#(?:<!--autolink-->)?<a [^>]+>|</a>(?:<!--/autolink-->)?#', '', $str);
}
// Make a backlink. searching-link of the page name, by the page name, for the page name
--- plugin/color.inc.php Fri Jun 17 00:04:08 2005
+++ plugin/color.inc.php Wed Aug 03 16:25:08 2005
@@ -17,7 +17,7 @@
global $pkwk_dtd;
$args = func_get_args();
- $text = strip_autolink(array_pop($args)); // Already htmlspecialchars(text)
+ $text = array_pop($args); // Already htmlspecialchars(text)
list($color, $bgcolor) = array_pad($args, 2, '');
if ($color != '' && $bgcolor != '' && $text == '') {
--- plugin/new.inc.php Sat Jul 16 20:01:20 2005
+++ plugin/new.inc.php Wed Aug 03 16:42:54 2005
@@ -28,17 +28,17 @@
$retval = '';
$args = func_get_args();
- $date = strip_autolink(array_pop($args)); // {date} always exists
+ $date = array_pop($args); // {date} always exists
if($date !== '') {
// Show 'New!' message by the time of the $date string
if (func_num_args() > 2) return '&new([nodate]){date};';
- $timestamp = strtotime($date);
+ $timestamp = strtotime(strip_tags($date));
if ($timestamp === -1) return '&new([nodate]){date}: Invalid date string;';
$timestamp -= ZONETIME;
- $retval = in_array('nodate', $args) ? '' : htmlspecialchars($date);
+ $retval = in_array('nodate', $args) ? '' : $date;
} else {
// Show 'New!' message by the timestamp of the page
if (func_num_args() > 3) return '&new(pagename[,nolink]);';
- newのdiffについては、strip_tags()とある部分は strip_htmltag() のようですね。過去に無効化できるバグがあった経緯から、PukiWikiのコードは PHP のstrip_tags() を意図的に避けるように作られています。htmlspecialchars() は過剰なもののようなので必要なさそうですが、 $date ではなくて今回用意した strip_htmltag($date, FALSE) としておくのが綺麗そうです。ただもう頭が働かないと思われるので冒険はしないでおきます。 -- henoheno
- strip_tags()を使わずstrip_htmltag()を使うのは知りませんでした。htmlspecialchars()を削ったのは、strtotimeに渡す値だけ処理すればその他の文字装飾(2005-07-16 (土) &size(8){18:50:18};等)は通過させて構わないと考えたためです(新機能になると思うので特別ここで扱う必要はないと思います) -- Cue
コメント†
- 気がついた2点を、とりあえずメモします。 --
- $link_compact が有効の場合、strip_htmltag() のDagnling-Link 除去機能が$_symbol_noexists を除去できない。(通常リンクのエイリアスに$_symbol_noexists の設定と同じ文字を使った場合と区別できないので、現状では仕方ない気もします) --
- AutoAlias がインラインプラグインの{body}を書き換えた場合、strip_autolink() では対応できない。(AutoAlias 用の処理やマーカーが、今はない) --
- リンクに置き換わる場合以外に、指定したページが存在しない(Dangling link になる)場合や、指定したページ名が無効の場合の処理をどうするのか --