Extension:CrossReference

From MediaWiki.org

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

Release status: experimental

Implementation Tag
Description Adds LaTeX-style autonumbered cross references to a page
Author(s) Tore Birkeland (KvanteToreTalk)
Last Version First Release
License No license specified
Download no link

[edit] Description

CrossReference is an extension to create automatically numbered cross references on a wiki page, LaTeX style.

[edit] Installation

Create a folder called CrossReference, and put CrossReference.php inside it

<?php
 
//Extension credits that show up on Special:Version
$wgExtensionCredits['parserhook'][] = array(
        'name' => 'CrossReference',
        'author' => 'Tore Birkeland',
        'url' => 'http://www.mediawiki.org/wiki/Extension:CrossReference',
        'description' => 'Extension to create automatically numbered cross references on a wiki page, LaTeX style',
);
 
$efCrossReferenceCounter = array();
$efCrossReferenceLookup = array();
 
$wgExtensionFunctions[] = "efCrossReferenceSetup";
$wgHooks['ParserAfterTidy'][] = 'efCrossReferenceParserAfterTidy';
 
function efCrossReferenceSetup() {
        global $wgParser;
        $wgParser->setHook("xrlabel", "efLabelRender");
        $wgParser->setHook("figure", "efFigureRender");
        $wgParser->setHook("equation", "efEquationRender");
        $wgParser->setHook("xr", "efCrossReferenceRender");
}
 
 
function efLabelRender($text, $args, $parser) {
        global $efCrossReferenceCounter;
        global $efCrossReferenceLookup;
        $id = $args["id"];
        $group = $args["group"];
 
        if ($efCrossReferenceCounter[$group] == "") {
                $efCrossReferenceCounter[$group] = 1;
        }
        $num = $efCrossReferenceCounter[$group];
        $efCrossReferenceCounter[$group] += 1;
        $efCrossReferenceLookup[$id] = $num;
 
        $innerHtml = $parser->recursiveTagParse(trim($text));
 
        $label = "";
        $label .= "<div id='label-" . $id . "'>";
        $label .= "<span style='width:5em;'>";
        $label .= "(" . $num . ")";
        $label .= "</span>";
        $label .= "<span style='position:relative; left:5em;'>";
        $label .= $innerHtml;
        $label .= "</span>";
        $label .= "</div>";
 
        return $label;
}
 
function efEquationRender($text, $args, $parser) {
        $args["group"] = "eqn";
        return efLabelRender($text, $args, $parser);
}
 
function efFigureRender($text, $args, $parser) {
        $args["group"] = "fig";
        return efLabelRender($text, $args, $parser);
}
 
function efCrossReferenceRender($text, $args, $parser) {
        $id = $args["id"];
        $marker = "xx--CrossReference--$id--xx";
 
        if (strpos($text, "%i") == false) {
                $text .= $marker;
        } else {
                $text = str_replace("%i", $marker, $text);
        }
 
        return "<a href='#label-$id'>$text</a>";
}
 
function efCrossReferenceParserAfterTidy(&$parser, &$text) {
        global $efCrossReferenceLookup;
 
        foreach ($efCrossReferenceLookup as $id => $num) {
                $marker = "xx--CrossReference--$id--xx";
                $text = str_replace($marker, $num, $text);
        }
 
        return true;
}

Add the following near the end of LocalSettings.php

require_once( "extensions/CrossReference/CrossReference.php");

[edit] Usage

To create a numbered equation and figure, type the following into your page

 
  <equation id="eqn:first-equation">
  <math>\frac{1}{2} =  0.5</math>
  </equation>

  <figure id="fig:first-figure">
  [[Image:image.png]]
  </figure>
  

Somewhere else on the page, you can put the following to reference the elements

 
  Please refer to <xr id="eqn:first-equation">Equation %i</xr>, and <xr id="fig:first-figure">Fig %i</xr>
Personal tools