Click
Click |
- Реализует:
{{#click:}}
- Системные требования:
- MediaWiki
- Разработчик:
- MinuteElectron, Danny B., Mithgol the Webmaster
- Текущая версия:
- 1.4.3
- Дата выхода текущей версии:
- 2008
Click — расширение MediaWiki, вводящее функцию парсера {{#click:}}
, позволяющую внедрять в вики-статьи такие изображения, которые не обязательно служат гиперссылками на страницы этих изображений: ссылка может вместо этого указывать на любую страницу вики или произвольную страницу Всемирной Паутины.
Первоначальные создатели — MinuteElectron и Danny B. (см. описание расширения на сайте MediaWiki).
Mithgol the Webmaster, участник Традиции, доработал код расширения, чтобы изображение могло также и вообще не быть гиперссылкою (иными словами, теперь можно указывать пустой URL).
Расширение Click перестаёт быть нужным в MediaWiki версии 1.14 и более новых, потому что в MediaWiki, начиная с этой версии, можно использовать параметр link=
в коде иллюстрации для указания того, куда должна вести ссылка (или пустой параметр link=
для устранения ссылки).
Применение[править | править код]
Картинка вставляется в страницу следующим выражением:
{{#click:URL|Изображение:имя файла.расширение|альтернативный текст|РАЗМЕРpx}}
где значения параметров таковы:
- URL — адрес, на который ведёт гиперссылка. Может быть интернетовским URLом, или названием статьи вики, или отсутствовать (тогда после двоеточия сразу идёт вертикальная черта).
- имя файла.расширение — название файла изображения (загруженного в вики подобно всякой другой иллюстрации).
- альтернативный текст — текст, который отображается в качестве всплывающей подсказки к изображению (когда на него наводится мышь) или вместо изображения (если читатель отключил отображение изображений, или если заданный файл изображения не найден).
- РАЗМЕРpx — размер изображения по горизонтали (используется, когда естественный размер изображения не годится, то есть когда его надо уменьшить перед отображением).
Два последних параметра (альтернативный текст и размер) являются необязательными: любой из них можно не указывать (разумеется, вместе с параметром тогда не указывается и предшествующая ему вертикальная разделительная черта). Если оба эти параметра присутствуют, то можно указывать их в любом порядке (расширение само отличит размер, поскольку размер всегда состоит из цифр, за которыми следуют только две латинские буквы «px»).
Исходный код[править | править код]
<?php
/**
* Click Extension
*
* Adds a parser function to display an image with a link that leads to a page other than the image description page.
*
* @addtogroup Extensions
*
* @link http://www.traditio.ru/index.php?title=Click
* @author Mithgol the Webmaster
* @copyright Copyright © 2008 Mithgol the Webmaster, based on work by MinuteElectron and Danny B.
* @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later
*/
// If this is run directly from the web die as this is not a valid entry point.
if( !defined( 'MEDIAWIKI' ) ) die;
// Extension credits.
$wgExtensionCredits[ 'parserhook' ][] = array(
'name' => 'Click',
'description' => 'Функция парсера для отображения картинки с такой гиперссылкою, которая ведёт не на страницу картинки, или вообще без гиперссылки.',
'author' => array( 'Mithgol the Webmaster', 'MinuteElectron', 'Danny B.' ),
'url' => 'http://traditio.ru/wiki/Click',
'version' => '1.4.3',
);
// Setup function.
$wgExtensionFunctions[] = 'efClickParserFunction_Setup';
// Register hook.
$wgHooks[ 'LanguageGetMagic' ][] = 'efClickParserFunction_Magic';
function efClickParserFunction_Setup() {
global $wgParser;
// Register parser function hook.
$wgParser->setFunctionHook( 'click', 'efClickParserFunction_Render' );
// Return true so things don't break.
return true;
}
function efClickParserFunction_Magic( &$magicWords, $langCode ) {
// Register parser function magic word.
$magicWords[ 'click' ] = array( 0, 'click' );
// Return true so things don't break.
return true;
}
function efClickParserFunction_Render( &$parser, $target = '', $image = '', $widthalt = '', $altwidth = '' ) {
// Width and alt-text are interchangable.
// No need to escape here, automatically done by Xml class functions.
if( preg_match( '#^[0-9]+px$#', $widthalt ) ) {
// First value width, second alt.
$width = $widthalt;
$alt = $altwidth;
} elseif( preg_match( '#^[0-9]+px$#', $altwidth ) ) {
// First value alt, second width.
$alt = $widthalt;
$width = $altwidth;
} else {
// First value alt, no width.
$alt = $widthalt;
$width = false;
}
if ($target !== ''){
// Open hyperlink, default to a on-wiki page, but if it doesn't exist and
// is a valid external URL then use it.
$targettitle = Title::newFromText( $target );
// Link title attribute (full page name).
// Note: $title may not be found (neither used below) when is_object($targettitle) is false.
if (is_object($targettitle)){
if( $targettitle->getNamespace() !== 0 ) {
$title = $targettitle->getNsText() . ':' . $targettitle->getText();
} else {
$title = $targettitle->getText();
}
}
if( is_object( $targettitle ) && $targettitle->exists() ) {
// Internal link, open hyperlink and register internal link.
// Note: $title may be used here, since is_object($targettitle) is true.
$r = Xml::openElement( 'a', array( 'href' => $targettitle->getLocalUrl(), 'title' => $title ) );
$parser->mOutput->addLink( $targettitle );
} else {
// Internal page doesn't exist, test if external.
global $wgUrlProtocols;
$ext = false;
foreach( $wgUrlProtocols as $protocol ) {
if( strpos( $target, $protocol ) === 0 ) {
$ext = true;
break;
}
}
if( $ext ) {
// External link, open hyperlink with escaped href and register external link.
$r = Xml::openElement( 'a', array( 'href' => $target, 'title' => $target ) );
$parser->mOutput->addExternalLink( $target );
} elseif( is_object( $targettitle ) ) {
// Valid internal link after all (but to non-existant page), open hyperlink and register internal link.
// Note: $title may be used here, since is_object($targettitle) is true.
$r = Xml::openElement( 'a', array( 'class' => 'new', 'href' => $targettitle->getLocalUrl( 'action=edit&redlink=1' ),
'title' => wfMsg( 'red-link-title', $title ) ) );
$parser->mOutput->addLink( $targettitle );
}// here endz if ($ext)
}// here endz if( is_object( $targettitle ) && $targettitle->exists() )
}// here endz if ($target !== '')
// Add image element, or use alt text on it's own if image doesn't exist.
$imagetitle = Title::newFromText( $image );
if( is_object( $imagetitle ) ) $imageimage = Image::newFromTitle( $imagetitle, false );
if( isset( $imageimage ) && is_object( $imagetitle ) && is_object( $imageimage ) && $imageimage->exists() ) {
// Display image.
if( !$width ) $width = $imageimage->getWidth();
$thumbnail = $imageimage->getThumbnail($width);
$r .= $thumbnail->toHtml( array( 'alt' => $alt, 'file-link' => false ) );
} else {
// Display alt text.
$r .= $alt;
}
// Register image usage if it is a valid name, even if it doesn't exist (so it appears as a "wanted image").
if( isset( $imageimage ) && is_object( $imagetitle ) && is_object( $imageimage ) ) {
$parser->mOutput->addImage( $imagetitle->getDBkey() );
}
// Close hyperlink.
if ($target !== '') {
if( is_object( $targettitle ) ) $r .= Xml::closeElement( 'a' );
}
// Can't just output as HTML, need to do this to make a new paragraph.
return $parser->insertStripItem( $r, $parser->mStripState );
}