ShortCut

出典: OOoJa

[編集] Mediawiki 用の ショートカット

[編集] ShortCut.php

この Mediawiki 用のエクステンションは、Mediawiki内のページへのショートカットを提供します。

Mediawiki 上で日本語文字などをページ名に使うと、%xx という16進数表示の意味のない長いURLが表示されます。 このショートカットは、長いURLの代わりとなる短いURLを提供します。

本ページの上部に表示されている http://openoffice-ja.org/wiki/?shortcut=a4f255 のようなURLが、本エクステンションによって自動的に作成されたショートカットです。

ショートカットは、そのページが表示されたときに、作成されていなければ、自動的に作成され表示されます。 そのため、すでに運用中の Mediawiki のサイトにおいても、ショートカットの作成などの面倒な作業をする必要はありません。


[編集] Mediawiki のバージョン

以下のMediawikiのバージョンにて、動作チェックしてあります。

  • mediawiki-1.11.0.tar.gz
  • mediawiki-1.10.1.tar.gz


[編集] インストール方法

1. 後述のソースコードを Mediawiki のディレクトリ内の extensions ディレクトリにファイル ShortCut.php として保存します。

2. 以下のような手順で、MySQLデータベースにテーブルを1つ作成します。

# mysql
mysql> use wikidb;
mysql> CREATE TABLE `shortcut` (
  `sc_path` varchar(255) character set utf8 collate utf8_bin NOT NULL,
  `sc_name` varchar(255) character set utf8 collate utf8_bin default NULL,
  PRIMARY KEY  (`sc_path`),
  UNIQUE KEY `sc_name` (`sc_name`)
) DEFAULT CHARSET=utf8;
mysql> quit

3, Mediawiki のディレクトリ内の LocalSettings.php に以下の1行を追加します。

require_once('extensions/ShortCut.php');


[編集] ソースコード

<?php

/***

 * ShortCut.php
 * @version 0.1
 * @date December 7, 2007
 * @author Takamichi Akiyama <tora@openoffice.org>
 * @license GNU Lesser General Public License

This Mediawiki extension adds a short cut link at the top of page.

Installation Instructions
^^^^^^^^^^^^^^^^^^^^^^^^^
1. Save this source code as a file 'ShortCut.php' in the directory
   'extensions' of your Mediawiki installation set.

2. This extension will need a table in the database to store short cut links.
   To create the table, do steps like this:

        # mysql
        mysql> use wikidb;
        mysql> CREATE TABLE `shortcut` (
          `sc_path` varchar(255) character set utf8 collate utf8_bin NOT NULL,
          `sc_name` varchar(255) character set utf8 collate utf8_bin default NULL,
          PRIMARY KEY  (`sc_path`),
          UNIQUE KEY `sc_name` (`sc_name`)
        ) DEFAULT CHARSET=utf8;
        mysql> quit

3. To activate this extension, include the following line in your LocalSettings.php:

        require_once('extensions/ShortCut.php');

System Requirements
^^^^^^^^^^^^^^^^^^^
This extension has been tested with the following versions of Mediawiki:
 - mediawiki-1.11.0.tar.gz
 - mediawiki-1.10.1.tar.gz

***/

$wgExtensionFunctions[] = array('ShortCut', 'handleWithShortCutURL');
$wgHooks['PersonalUrls'][] = 'ShortCut::hookOnPersonalUrls';

class ShortCut
{
        function handleWithShortCutURL() {
                global $wgRequest;
                $shortcut = $wgRequest->getVal( 'shortcut' );
                if ( $shortcut ) {
                        $url = ShortCut::getRealURL( $shortcut );
                        if ( $url ) {
                                header( "Location: {$url}" );
                        }
                        else {
                                wfHttpError( 404, 'No such short cut is registered in this server.', '' );
                        }
                        exit;
                }
        }

        private static function getRealURL( $name ) {
                global $wgArticlePath;
                global $wgServer;

                $dbr = wfGetDB( DB_SLAVE );
                $row = $dbr->selectRow( 'shortcut', array( 'sc_path' ),
                                        array( 'sc_name' => mysql_real_escape_string( $name ) ), __METHOD__ );

                if ( $row !== false ) {
                        $path = $row->sc_path;
                } else {
                        return NULL;
                }

                $url = $wgServer . str_replace( '$1', $path, $wgArticlePath );
                return $url;
        }

        static function hookOnPersonalUrls($personal_urls, $wgTitle) {
                $url = ShortCut::getShortCutURL();
                if ($url) {
                        $a['shortcut'] = array(
                                'text' => $url,
                                'href' => $url
                        );
                        $personal_urls = array_merge($a, $personal_urls);
                }
                return true;;
        }

        private static function getShortCutURL() {
                global $wgRequest, $wgOut, $wgArticle, $wgArticlePath, $wgServer;
                if ( $wgOut->isArticle() and !ereg( '[\?\&]' , $_SERVER['REQUEST_URI'] ) and $wgArticle and 0 != $wgArticle->getID() ) {
                        $articlePath = str_replace( '$1', '', $wgArticlePath );
                        $path = str_replace( $articlePath, '', $_SERVER['REQUEST_URI'] );
                        $path = ereg_replace( '[\?\&].*', "", $path );

                        $dbr = wfGetDB( DB_SLAVE );
                        $row = $dbr->selectRow( 'shortcut', array( 'sc_name' ),
                                array( 'sc_path' => mysql_real_escape_string( $path ) ), __METHOD__ );

                        if ( $row !== false ) {
                                $shortcut_name = $row->sc_name;
                        } else {
                                $shortcut_name = ShortCut::createNewShortCut( $path );
                                if ( $shortcut_name === NULL ) {
                                        return NULL;
                                }
                        }

                        $shortcut_url = $wgServer . str_replace( '$1', '?shortcut=' . $shortcut_name, $wgArticlePath );
                        return $shortcut_url;
                }
                return NULL;
        }

        private static function createNewShortCut( $path ) {
                $startPosition = 0;
                $initialLength = 6;
                $md5String = md5( $path );
                $maximumLength = strlen( $md5String );
                $md5String .= $md5String;

                $dbw = wfGetDB( DB_MASTER );

                while ( true ) {
                        $candidate = substr( $md5String, $startPosition, $initialLength );

                        $fields = array(
                                        'sc_path' => mysql_real_escape_string($path),
                                        'sc_name' => $candidate,
                                        );
                        $dbw->insert( 'shortcut', $fields, __METHOD__, array( 'IGNORE' ) );
                        if ( $dbw->affectedRows() ) {
                                return $candidate;
                        }

                        $startPosition ++;
                        if ( $maximumLength <= $startPosition ) {
                                $initialLength ++;
                                if ( $maximumLength <= $initialLength ) {
                                        return NULL;
                                }
                        }
                }
        }
}

?>