* インラインプラグインの{body}は、適宜WikiName, BracketName, 特に AutoLinkを回避しなければならない [#qe64094e] - 元タイトル: [AutoLink] インラインプラグインの{body}には、AutoLinkを回避するためにstrip_htmltag()をかけねばならない -ページ: [[BugTrack2]] -投稿者: [[henoheno]] -優先順位: 重要 -状態: 提案 -状態: 着手 -カテゴリー: その他 -投稿日: 2005-05-07 (土) 16:23:07 -バージョン: ** 修正 [#h5bf96f9] + AutoLinkが生成するアンカー(A)タグの周囲にマーカー(コメント文)を挿入 <!--autolink--><a href="link-to-the-page">page</a><!--/autolink--> + functoin strip_autolink() を追加。マーカーの内側にあるアンカータグを、マーカーもろとも削除する + 必要に応じて(strip_htmltag()の代わりに)上記関数を使用する - [[cvs:plugin/aname.inc.php]] (1.23) - [[cvs:plugin/color.inc.php]] (1.21) - [[cvs:plugin/edit.inc.php]] (1.34) - [[cvs:plugin/new.inc.php]] (1.8) - [[cvs:plugin/size.inc.php]] (1.9) - [[cvs:plugin/stationary.inc.php]] (1.6) - [[cvs:plugin/ruby.inc.php]] (1.6) ** 関連 [#fd56d823] - [[official:質問箱3/52]]: (newプラグイン) comment, pcommentなどで、日付の部分にページへのリンクが表示される **メッセージ [#u01f294a] &inline(arguments,argument2, ... ,argumentN){body text message}; 現在のWikiName, BracketName, AutoLinkの仕様では、{body}部分を利用するインラインプラグインについて、{body}に対して事前にstrip_htmltag()をかけておかなければ、挿入されたリンク文字列(アンカータグ)による影響を受けてしまう。{body}の中の文字列は(特にAutoLinkによって偶発的に)アンカータグを挿入される可能性があり、必要に応じてそれによる影響を回避するコードを挿入しなければならない。この回避策がいままでプラグインの中にまちまちな方法で含まれていたり、物によっては含まれていなかった。 - aname, new プラグインには、以前から別々の方法でこのコードが入っていたが、意図が明文化されておらず、方法はまちまちであった。 - これは回避策であって解決策ではない。 - 複数行ねたにも関連する。 ---- -color, rubyプラグインは微妙ですが、修正しておきます。何かあればコメント下さい。 -- [[henoheno]] &new{2005-05-07 (土) 16:36:04}; -- colorプラグインでAutoLinkを回避させておかないと: AutoLinkによって分断された部分の色が変わりません。今大丈夫でも、いずれそうなる可能性があります。 -sizeプラグインは、「文字サイズを大きくするだけ」ですから、意味合いからするとこの回避策はいらないようです。一応コメントアウトした形でコードを入れておきます。 -- [[henoheno]] &new{2005-05-07 (土) 16:44:11}; -[[BugTrack2/67]] インライン要素内のインライン要素が無視される -- [[henoheno]] &new{2005-05-15 (日) 13:52:25}; -[[BugTrack/669]] AutoLinkによってブラケットネームが正しく処理されないことがある -- [[henoheno]] &new{2005-06-04 (土) 13:05:10}; -- 結局、以前から悩まされている件ですね (^^; -- [[henoheno]] &new{2005-06-04 (土) 13:06:00}; ** WikiNameの処理について [#m489b27c] -完了になってますが、 WikiNameの処理が忘れられてるようなので掘り起こします。WikiNameもAutoLinkと整合性のある処理が良いと思います。 -- [[Cue]] &new{2005-07-11 (月) 19:29:11}; --ざっと調べた範囲では以下のようです。 -- [[Cue]] &new{2005-07-16 (土) 18:54:06};~ |Plugin|AutoLink|WikiName|h |aname |リンクされない|リンクされる| |color |リンクされない|リンクされる| |edit |リンクされない|リンクされる| |new |リンクされない|()内にWikiNameがあると表示が壊れるが、普通WikiNameは入らない| |size |リンクされる |リンクされる| --以下私見。aname,editはそれ自体がリンクなのでリンクしてはいけない。~ color,sizeはどちらも文字装飾なのでリンクして良い、と思う。~ newはこのままでも問題は無い(2005-07-16 (土) &size(8){18:50:18}; といった表示を通して良いような気もするけど、少し脱線してるような)。 -- [[Cue]] &new{2005-07-16 (土) 18:54:06}; -放置されつづけているので直してみました(下の修正案) -- [[Cue]] &new{2005-08-03 (水) 19:51:22}; ++strip_autolinkのリンク剥がし汎用化 ++color.inc.php、new.inc.phpでリンクを許可 -ちなみに[[official:質問箱3/52]]のnew.inc.phpのボディがページ名になってしまう件はv1.7の段階で既にクリアしていたようです(&new{date};形式なのにstrtotimeがエラーを返すことで途中から&new(page);形式の枝に入っていた) -- [[Cue]] &new{2005-08-03 (水) 19:51:22}; -こんにちは :) WikiNameに対するリンクの付与とAutoLinkに対するリンクの付与は、成立時期も実装方法も違います。それが今までごちゃまぜに扱われていたのを、AutoLink(によるリンク)に関して明確なマーカーを導入することによってやっと分割したところですから、strip_autolink() はAutoLink専用のstrip関数のままにしていただきたいと思います。以前の状態に戻したらまた副作用に悩みそうです。 -- [[henoheno]] &new{2005-08-22 (月) 22:22:31}; &aname(hoge){ほげほげWikiName}; -- このような例で、WikiNameの部分が独自のリンクになってしまい、anameとeditで不都合な状態になる事、また以前のバージョンとリンクの挙動が異なることを確認しました。今まではAutoLinkが付与した<a>タグをひっぺがすために、<a>タグを全部ひっぺがす乱暴な処理をしていました(その副作用で苦しんでいました)が、それをまさにAutoLinkが付与した<a>タグだけをひっぺがす様にした結果、利点を得たものの、別の副作用が発生したというものの様です。orz -- [[henoheno]] &new{2005-08-22 (月) 22:44:54}; -- それで、今回問題になるのは「全てのHTMLタグ」ではなくてアンカー(<a>)タグだけである事と、strip_htmltag() に元々WikiNameのdangling linkを綺麗に取り除くためのコードが入っていたのに気付きましたので、strip_htmltag()を拡張してアンカータグ(とdangling linkのリンクとdangling linkの装飾、デフォルトでは '?')だけを取り除く様にすることで、今までのものは綺麗に今まで通りになり、かつ今までとは違って sizeプラグイン なども使える形にできる様に思います :) -- [[henoheno]] &new{2005-08-22 (月) 23:40:49}; 例えばこうした場合の size プラグインが動作する (従来は効果がない) &aname(hoge){ほげほげ &size(8){WikiName};}; -- こんなところでいかがでしょうか :) 今回拡張した部分を今後別のところで使う場合、anchorタグ以外のタグが通過してしまうので、それで悪さができないかどうかは使う前に検討すべきかと思います。 -- [[henoheno]] &new{2005-08-23 (火) 00:07:54}; --- [[cvs:lib/html.php]] (1.42) --- [[cvs:aname.inc.php]] (1.26) --- [[cvs:edit.inc.php]] (1.37) -- colorプラグインについては現状の挙動と以前の挙動が同じ様ですので手をつけません。newについては下記のdiffに別途コメント済みです -- [[henoheno]] &new{2005-08-23 (火) 00:14:06}; -一連の変更の意図は理解できました。対応お疲れ様でした。colorですが1.4.5_1までは下のようになります。1.4.6rcでは全てリンクが働かなくなります。おそらくこの発言「colorプラグインでAutoLinkを回避させておかないと: AutoLinkによって分断された部分の色が変わりません。」を意識されてのことだと思いますが、色はCSS側に解決を任せてリンクはそのままにするのが正しいのではないでしょうか。 -- [[Cue]] &new{2005-08-23 (火) 21:47:09}; |color|&color(white,black){henoheno};|&color(white,black){WikiName};|&color(white,black){[[Cue]]};| ---訂正:1.4.6rcではAutoLinkのみリンクが働かなくなります。 -- [[Cue]] &new{2005-08-23 (火) 22:09:41}; #comment ***修正案 [#q1caab57] --- 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]] &new{2005-08-23 (火) 00:07:06}; -strip_tags()を使わずstrip_htmltag()を使うのは知りませんでした。htmlspecialchars()を削ったのは、strtotimeに渡す値だけ処理すればその他の文字装飾(2005-07-16 (土) &size(8){18:50:18};等)は通過させて構わないと考えたためです(新機能になると思うので特別ここで扱う必要はないと思います) -- [[Cue]] &new{2005-08-23 (火) 21:56:45}; #comment ** コメント [#cc204415] - [[BugTrack2/177]] (rubyプラグイン) 強調構文などに対してルビを振ると、強調などの効果が消える -- &new{2006-04-30 (日) 17:18:10}; - 気がついた2点を、とりあえずメモします。 -- &new{2009-03-30 (月) 23:49:13}; -- $link_compact が有効の場合、strip_htmltag() のDagnling-Link 除去機能が$_symbol_noexists を除去できない。(通常リンクのエイリアスに$_symbol_noexists の設定と同じ文字を使った場合と区別できないので、現状では仕方ない気もします) -- &new{2009-03-30 (月) 23:49:13}; -- AutoAlias がインラインプラグインの{body}を書き換えた場合、strip_autolink() では対応できない。(AutoAlias 用の処理やマーカーが、今はない) -- &new{2009-03-30 (月) 23:49:13}; --- リンクに置き換わる場合以外に、指定したページが存在しない(Dangling link になる)場合や、指定したページ名が無効の場合の処理をどうするのか -- &new{2009-03-31 (火) 17:44:38}; #comment