PukiWiki別窓リンク

PukiWikiの通常リンク方法では同窓リンク(『target="_blank"』オプション無し)となるが、それを別窓リンク(『target="_blank"』オプション有り)にも対応させる方法。
ココにも色々と書いてあるが、やる事が多いのと自分では解りにくかったので他の方法を模索。
下みたいな感じでリンクをページを書くと、リンクが出来る様にPHPファイルを一部修正する。

  • リンク方法
通常リンク方法 → [[ns-lab>http://www.ns-lab.org/]]
別窓リンク方法 → [[ns-lab>+http://www.ns-lab.org/]]
  • リンク見本
通常リンク方法 → ns-lab
別窓リンク方法 → ns-lab


編集ファイル

編集するファイルは、『[PukiWiki]/lib/make_link.php』ファイル。
基本的には以下に書いてある方法で出来るが、PukiWikiのバージョンによっては書き換える内容を変更する必要がある。...かも?

編集箇所

1. [class Link_url extends Link()] - [function get_pattern()]

  • 書き換え前
    function get_pattern()
    {
        $s1 = $this->start + 1;
        return <<<EOD
    (\[\[             # (1) open bracket
     ((?:(?!\]\]).)+) # (2) alias
     (?:>|:)
    )?
    (                 # (3) url
     (?:(?:https?|ftp|news):\/\/|mailto:)[\w\/\@\$()!?&%#:;.,~'=*+-]+
    )
     (?($s1)\]\])      # close bracket
     EOD;
        }
  • 書き換え後
    function get_pattern()
    {
        $s1 = $this->start + 1;
        return <<<EOD
    (\[\[             # (1) open bracket
     ((?:(?!\]\]).)+) # (2) alias
     (?:>|:)
    )?
    (                 # (3) url
     (?:(?:\+?https?|\+?ftp|\+?news):\/\/|mailto:)[\w\/\@\$()!?&%#:;.,~'=*+-]+
    )
    (?($s1)\]\])      # close bracket
    EOD;
        }

2. [class Link_url extends Link()] - [function toString()]

  • 書き換え前
    function toString()
    {
        if (FALSE) {
            $rel = '';
        } else {
            $rel = ' rel="nofollow"';
        }
        return '<a href="' . $this->name . '"' . $rel . '>' . $this->alias . '</a>';
    }
  • 書き換え後 [PHP ~5.6.*]
    function toString()
    {
        if (FALSE) {
            $rel = '';
        } else {
            $rel = ' rel="nofollow"';
        }
        if (ereg("^(\+)(.*)", $this->name, $regs)) {
            return '<a href="' . $regs[2] . '" target="_blank" ' . $rel . '>' . $this->alias . '</a>';
        }else{
            return '<a href="' . $this->name . '"' . $rel . '>' . $this->alias . '</a>';
        }
    }
  • 書き換え後 [PHP 7.0.*~]
    function toString()
    {
        if (FALSE) {
            $rel = '';
        } else {
            $rel = ' rel="nofollow"';
        }
        if (preg_match("/^(\+)(.*)/", $this->name, $matches)) {
            return '<a href="' . $matches[2] . '" target="_blank" ' . $rel . '>' . $this->alias . '</a>';
        }else{
            return '<a href="' . $this->name . '"'                  . $rel . '>' . $this->alias . '</a>';
        }
    }

Fix

そうすると、URLの先頭に+をつけるリンクを作成する事によって、別窓リンクが可能になる。
また、今回の改良はその他文字装飾系プラグインと同時使用する事も可能。