Click

Материал из свободной русской энциклопедии «Традиция»
Перейти к: навигация, поиск
Click
Реализует:
{{#click:}}
Язык программирования:
PHP



Системные требования:
MediaWiki
Разработчик:
MinuteElectron, Danny B., Mithgol the Webmaster



Текущая версия:
1.4.3
Дата выхода текущей версии:
2008



Лицензия:
GNU General Public License 2.0

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 );

}