利用者:Anesan rokkaku/リンクのターゲット変更
出典: STARBOOK WIKI
Mediawikiでは外部へのリンクも内部でのリンクも一緒くたに同一ウインドウ内での遷移させています。
ですが日本的ルール、てゆうか企業系サイトにおける一般的なリンクルールでは、外部サイトはtarget=_blankという処理にする事が多々あると思います。同一ウインドウで遷移させるのはimpressとかsb系かな。日経あたりは明確に外部って決まってたはず。
遷移とウインドウに関するルールをMediawikiにも適用したい場合、改造方法は2つ考えられます。
- 出来上がったページ(html)をJavascriptレベルで小細工する(=ブラウザ側で仕事させる)
- そもそもリンクを生成する所でtargetを入れてやる
前者の方がお手軽です。が、企業内wikiとかで対応するならば、後者の方がおすめです。
今回は後者でやってみます。
[編集] リンク生成ルーチンの修正
Mediawikiにおけるリンクの処理はinclude/Linker.phpで行なっています。
外部リンクを作っていそうな所をhrefをキーに検索すると数箇所見つかると思います。
| 場所 | func | 備考 |
| 226行目付近 | makeLinkObj() | DB検索して自分が知ってるリンクだったらうんちゃら~してます。 |
| 316行目付近 | makeKnownLinkObj() | 内部リンクを作っているようです。大半がここを通過するようです。 |
| 355行目付近 | makeBrokenLinkObj() | 内部リンクのうち、ページが存在しないものを作っているようです。 |
| 741行目付近 | makeBrokenImageLinkObj() | wiki内の画像を指しているが、その画像が存在しない場合にこれを使うようです。 |
| 787行目付近 | makeMediaLinkObj() | その他メディアの場合、これを使うようです。 |
| 812行目付近 | makeExternalLink() | 外部であると判定されているリンクを貼る場合にこれを使っているようです。 |
| 1135行目付近 | tocLine() | toc生成で使っているようです。 |
makeExternalLink()にtarget指定を書いてあげれば、とりあえず外部へのリンクを_blankにする事ができます。
ですがテンプレート経由かつアンカータグで直書きのリンクはどうも外部とみなされるようで、一部内部であるはずのリンクも外に開いてしまいます。
これを回避するには、簡単な判定ルーチンを入れてあげる必要があります。
- include/Linker.php
814 $link_target=strpos(trim($url),'http://' . $_SERVER['SERVER_NAME'])===0 ? 815 '' : ' target="_blank"'; 816 817 return '<a href="'.$url.'"'.$style. $link_target . '>'.$text.'</a>'; 818 }
余談ですが、ページはキャッシュされている事があります。Linker.phpを修正したらLocalSettings.phpをtouchしておいてください。
$ touch LocalSettings.php
227 $link_target=strpos(trim($u),'http://' . $_SERVER['SERVER_NAME'])===0 ? 228 '' : ' target="_blank"'; 229 230 $t = "<a href=\"{$u}\"{$style}{$link_target}>{$text}{$inside}</a>";
ちなみに、これを弄ってもinterwiki linkに対して外部マークは出ません。出したいならば、CSSでクラスextiwをexternalと同じような内容(右寄せでexternal.pngを出す)にしてみてください。
