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;
}
}
}
}
}
?>
