Extension:DynamicFunctions

From MediaWiki.org
Jump to: navigation, search
MediaWiki extensions manual
Crystal Clear action run.png
DynamicFunctions

Release status: experimental

Implementation Parser function
Description Defines an additional set of parser functions
Author(s) Ross McClure (Algorithmtalk)
Latest version 1.1 (2006-11-25)
MediaWiki 1.8+
Database changes No
License No license specified
Download See the code section
Hooks used
LanguageGetMagic

Translate the DynamicFunctions extension if it is available at translatewiki.net

Check usage and version matrix; code metrics

The DynamicFunctions extension defines an additional set of parser functions that provide dynamic functionality and cannot be cached.

Usage[edit | edit source]

This module defines four functions: arg, ip, rand, and skin. All of these functions operate in constant time.

#arg:[edit | edit source]

The #arg function returns the value of the given URL argument. The syntax is:

{{#arg:parameter name|default}}.

The default parameter is optional; if defined, it is returned when the argument does not exist.

Thus, instead of including a page for given parameter values, this allows linking to a page for given parameter values. Syntax for linking: external link style with zero or more times "&parameter name=parameter value" added to the URL. The link can be to the same page with different parameter values, or to a different page. In the former case the new values can depend on the old ones.

#ip:[edit | edit source]

The #ip function returns the IP address of the current user. No arguments are required. This should correspond to the IP in the last line of Special:Version.

#rand:[edit | edit source]

The #rand function returns a random integer value. The syntax is:

{{#rand:a|b}}

#rand returns a value between a and b, inclusive. If b is omitted, #rand returns a value between 1 and a (hence, {{#rand:6}} emulates a dice roll).

The function is PHP function mt-rand.

#skin:[edit | edit source]

The #skin function returns the name of the current skin. No arguments are required.

Installation[edit | edit source]

  • Copy the code into a file and extract the file(s) in a directory called DynamicFunctions in your extensions/ folder.
  • Add the following code at the bottom of your LocalSettings.php:
require_once "$IP/extensions/DynamicFunctions/DynamicFunctions.php";
  • Done! Navigate to "Special:Version" on your wiki to verify that the extension is successfully installed.

Code[edit | edit source]

DynamicFunctions.php
<?php
/*

 Defines a subset of parser functions that must clear the cache to be useful.

 {{#arg:name}} Returns the value of the given URL argument.  Can also be called
               with a default value, which is returned if the given argument is
               undefined or blank: {{#arg:name|default}}

 {{#ip:}}      Returns the current user IP.

 {{#rand:a|b}} Returns a random value between a and b, inclusive.  Can
               also be called with a single value; {{#rand:6}} returns a
               random value between 1 and 6 (equivalent to a dice roll).

 {{#skin:}}    Returns the name of the current skin.

 Author: Algorithm [http://meta.wikimedia.org/wiki/User:Algorithm]
 Version 1.1 (11/25/06)

*/


# Not a valid entry point, skip unless MEDIAWIKI is defined
if ( !defined( 'MEDIAWIKI' ) ) {
   die( 'This file is a MediaWiki extension, it is not a valid entry point' );
}

$wgExtensionFunctions[] = 'wfDynamicFunctions';
$wgExtensionCredits['parserhook'][] = array(
        'name' => 'DynamicFunctions',
        'version' => '1.1',
        'url' => 'https://www.mediawiki.org/wiki/Extension:DynamicFunctions',
        'author' => 'Ross McClure',  
        'description' => 'Defines an additional set of parser functions.'
);

$wgHooks['LanguageGetMagic'][] = 'wfDynamicFunctionsLanguageGetMagic';

function wfDynamicFunctions() {
        global $wgParser, $wgExtDynamicFunctions;

        $wgExtDynamicFunctions = new ExtDynamicFunctions();

        $wgParser->setFunctionHook( 'arg', array( &$wgExtDynamicFunctions, 'arg' ) );
        $wgParser->setFunctionHook( 'ip', array( &$wgExtDynamicFunctions, 'ip' ) );
        $wgParser->setFunctionHook( 'rand', array( &$wgExtDynamicFunctions, 'rand' ), SFH_OBJECT_ARGS );
        $wgParser->setFunctionHook( 'skin', array( &$wgExtDynamicFunctions, 'skin' ) );
}

function wfDynamicFunctionsLanguageGetMagic( &$magicWords, $langCode ) {
        switch ( $langCode ) {
        default:
                $magicWords['arg']    = array( 0, 'arg' );
                $magicWords['ip']     = array( 0, 'ip' );
                $magicWords['rand']   = array( 0, 'rand' );
                $magicWords['skin']   = array( 0, 'skin' );
        }
        return true;
}

class ExtDynamicFunctions {

        function arg( &$parser, $name = '', $default = '' ) {
                global $wgRequest;
                $parser->disableCache();
                return $wgRequest->getVal($name, $default);
        }

        function ip( &$parser ) {
                $parser->disableCache();
                return wfGetIP();
        }

        function rand( &$parser, $frame, $args ) {
                $a = isset( $args[0] ) ? $frame->expand( $args[0] ) : 0;
                $b = isset( $args[1] ) ? $frame->expand( $args[1] ) : 1;
                $parser->disableCache();
                if ( is_callable( array( $frame, 'setVolatile' ) ) ) {
                        $frame->setVolatile(); // see bug #58929
                }
                return mt_rand( intval($a), intval($b) );
        }

        function skin( &$parser ) {
                global $wgUser, $wgRequest;
                $parser->disableCache();
                return $wgRequest->getVal('useskin', $wgUser->getOption('skin'));
        }
}

See also[edit | edit source]