利用者: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


interwiki linkも外部ウインドウにしたい場合は、同じようなコードをmakeKnownObjに突っ込んでみてください。
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を出す)にしてみてください。