Extension:VariablesExtension

From MediaWiki.org

Jump to: navigation, search
Manual on MediaWiki Extensions
List of MediaWiki Extensions
VariablesExtension

Release status: stable

Implementation Parser function
Description Define page-scoped variables.
Author(s) Rob Adams
Download see below

Variables is a very simple MediaWiki extension which allows you to define a variable on a page, use it later in that same page, change its value, possibly to a value given by an expression in terms of the old value, etc.

It's much like a template only very lightweight and scoped to only a single page, so you can use many variables on a page without polluting the wiki with huge numbers of templates. Combine with the ParserFunctions extension for best results.

This dead simple extension was written by Rob Adams, and he has released it into the public domain. It was ported to MediaWiki version 1.8 by Hempel. It was ported to MediaWiki 1.10 by Rob Adams.

Contents

[edit] Assigning a value to a variable

{{#vardefine:variablename|value}}

assigns the value value to the (already existing or hereby introduced) variable variablename.

[edit] Retrieving the value of a variable

The value of the variable variablename is produced by

{{#var:variablename}}

If undefined this produces the empty string, it does not give an error message.

The value can be used in parser functions, etc.

[edit] Examples

Note that the ParserFunctions extension must also be installed to use #expr

Compute 2*a + b:

{{#expr:2*{{#var:a}}+{{#var:b}}}}

Add one to n:

{{#vardefine:n|{{#expr:{{#var:n}}+1}}}}

[edit] Variables and conditional parser functions

[edit] ParserFunctions

It must be noted that everything in conditional parser functions such as #ifexpr gets executed (though only one result gets displayed), regardless of the condition, see m:ParserFunctions#Code_execution. This applies also to #vardefine. Thus:

{{#ifexpr:..|
    {{#vardefine:a|b}}|
    {{#vardefine:a|c}}
}}

first assigns b and then c (hence effectively just c) regardless of the condition, while

{{#vardefine:a | {{#ifexpr:..|b|c}} }}

assigns only the applicable value.

Similarly

{{#ifexpr:..| {{#vardefine:a|b}}|}}

assigns b regardless of the condition, while

{{#vardefine:a | {{#ifexpr:..|b|{{#var:a}} }} }}

conditionally assigns value b to variable a (a dummy assignment of the value of a to a is done if the condition is not fulfilled).

[edit] Control Structure Functions

Another way around the aforementioned limitation is to use the Control Structure Functions extension which allow the delay of wiki markup being parsed through the use of character escape sequences. So the first above example becomes:

{{#ifexpr:..|
    \o#vardefine:a\pb\c|
    \o#vardefine:a\pc\c
}}

Alternatively, the Character Escapes extension can be used to automate the escape sequences:

{{#ifexpr:..|
    <esc>{{#vardefine:a|b}}</esc>|
    <esc>{{#vardefine:a|c}}</esc>
}}

The Control Structure Functions extension also has loop functions that support character escape sequences. The wiki markup:

{{ #vardefine: i | 0 }}{{
  #while: expr
  | <esc>{{ #var: i }} < 3</esc>
  | <esc>
* {{ #var: i }}{{ #vardefine: i | {{ #expr: {{ #var: i }} + 1 }} }}</esc>
}}

produces the following:

  • 0
  • 1
  • 2

[edit] Installing

Copy this into a file called $mediwikipath/extensions/Variables/Variables.php:

<?php
 
if ( !defined( 'MEDIAWIKI' ) ) {
    die( 'This file is a MediaWiki extension, it is not a valid entry point' );
}
 
$wgExtensionFunctions[] = 'wfSetupVariables';
 
$wgExtensionCredits['parserhook'][] = array(
        'name' => 'Variables',
        'url' => 'http://www.mediawiki.org/wiki/Extension:VariablesExtension',
        'author' => 'Rob Adams',
        'description' => 'Define page-scoped variables'
);
 
$wgHooks['LanguageGetMagic'][]       = 'wfVariablesLanguageGetMagic';
 
class ExtVariables {
    var $mVariables;
 
    function vardefine( &$parser, $expr = '', $value = '' ) {
        $this->mVariables[$expr] = $value;
        return '';
    }
 
    function varf( &$parser, $expr = '' ) {
        return $this->mVariables[$expr];
    }
}
 
function wfSetupVariables() {
    global $wgParser, $wgMessageCache, $wgExtVariables, $wgMessageCache, $wgHooks;
 
    $wgExtVariables = new ExtVariables;
 
    $wgParser->setFunctionHook( 'vardefine', array( &$wgExtVariables, 'vardefine' ) );
    $wgParser->setFunctionHook( 'var', array( &$wgExtVariables, 'varf' ) );
}
 
function wfVariablesLanguageGetMagic( &$magicWords, $langCode = 0 ) {
        require_once( dirname( __FILE__ ) . '/Variables.i18n.php' );
        foreach( efVariablesWords( $langCode ) as $word => $trans )
                $magicWords[$word] = $trans;
        return true;
}

Copy this into a file called $mediwikipath/extensions/Variables/Variables.i18n.php:

<?php
 
/**
 * Get translated magic words, if available
 *
 * @param string $lang Language code
 * @return array
 */
function efVariablesWords( $lang ) {
        $words = array();
 
        /**
         * English
         */
        $words['en'] = array(
                'var'          => array( 0, 'var' ),
                'vardefine'    => array( 0, 'vardefine' ),
        );
 
        # English is used as a fallback, and the English synonyms are
        # used if a translation has not been provided for a given word
        return ( $lang == 'en' || !isset( $words[$lang] ) )
                ? $words['en']
                : array_merge( $words['en'], $words[$lang] );
}

Then add

require_once( "$IP/extensions/Variables/Variables.php" );

to the end of LocalSettings.php.

[edit] See also

Personal tools