MediaWiki:Spoiler
From Vanishing Point Wiki
Jump to navigationJump to search
Several people have asked me about the spoiler extension, so I figured I might as well release it to the public. Simply copy this to your mediawiki /extensions/ folder and add the following line to your LocalSettings.php:
require_once("$IP/extensions/spoiler.php");
Keep in mind that only limited testing has been done on this extension. There is certainly an issue in the rare case that a browser supports CSS but not JavaScript: the spoilerized block starts out with the CSS "visibility:hidden" attribute with no way to switch it to visible.
This is the content of the spoiler.php file:
<?php # WikiMedia spoiler extension # <spoiler> some text </spoiler> # the function registered by the extension hides the text between the # tags behind a JavaScript spoiler block. # # (C) Copyright 2006, Brian Enigma <brian@netninja.com> # This work is licensed under a Creative Commons Attribution-Noncommercial-Share # Alike 2.5 License. Some rights reserved. # http://creativecommons.org/licenses/by-nc-sa/2.5/ $wgExtensionFunctions[] = "wfSpoilerExtension"; # $wgHooks['ParserBeforeTidy'][] = 'spoilerParserHook' ; $wgHooks['OutputPageBeforeHTML'][] = 'spoilerParserHook' ; function wfSpoilerExtension() { global $wgParser; # register the extension with the WikiText parser # the first parameter is the name of the new tag. # In this case it defines the tag <example> ... </example> # the second parameter is the callback function for # processing the text between the tags $wgParser->setHook( "spoiler", "renderSpoiler" ); } function wfSpoilerJavaScript() { return "<script language=\"JavaScript\">\n" . "\n" . "function getStyleObject(objectId) {\n" . " // checkW3C DOM, then MSIE 4, then NN 4.\n" . " //\n" . " if(document.getElementById) {\n" . " if (document.getElementById(objectId)) {\n" . " return document.getElementById(objectId).style;\n" . " }\n" . " } else if (document.all) {\n" . " if (document.all(objectId)) {\n" . " return document.all(objectId).style;\n" . " }\n" . " } else if (document.layers) { \n" . " if (document.layers[objectId]) { \n" . " return document.layers[objectId];\n" . " }\n" . " } else {\n" . " return false;\n" . " }\n" . "}\n" . "\n" . "function toggleObjectVisibility(objectId) {\n" . " // first get the object's stylesheet\n" . " var styleObject = getStyleObject(objectId);\n" . "\n" . " // then if we find a stylesheet, set its visibility\n" . " // as requested\n" . " //\n" . " if (styleObject) {\n" . " if (styleObject.visibility == 'hidden') {\n" . " styleObject.visibility = 'visible';\n" . " styleObject.position = 'relative';\n" . " } else {\n" . " styleObject.visibility = 'hidden';\n" . " styleObject.position = 'absolute';\n" . " }\n" . " return true;\n" . " } else {\n" . " return false;\n" . " }\n" . "}\n" . "</script>\n" . "<style type=\"text/css\"><!--\n" . "div.spoiler {border: dashed red 3px; background-color: #ffdddd; padding:3px;}\n" . "span.spoilerHeader {font-size:135%; color:#ff0000;}\n" . "a.spoilerLink {background-color:#ff0000; color:#ffff00; font-weight:bold; padding:4px 4px 2px 4px; border:solid black 1px;}\n" . "--></style>\n"; } function spoilerParserHook( &$parser , &$text ) { $text = wfSpoilerJavaScript() . $text; } function wfMakeSpoilerId() { $result = ""; for ($i=0; $i<20; $i++) $result .= chr(rand(ord('A'), ord('Z'))); return $result; } # The callback function for converting the input text to HTML output function renderSpoiler( $input, $argv, &$parser ) { # $argv is an array containing any arguments passed to the # extension like <example argument="foo" bar>.. # Put this on the sandbox page: (works in MediaWiki 1.5.5) # <example argument="foo" argument2="bar">Testing text **example** in between the new tags</example> $localParser = new Parser(); $outputObj = $localParser->parse($input, $parser->mTitle, $parser->mOptions); $spoilerId = wfMakeSpoilerId(); $output = "<a href=\"#\"onclick=\"toggleObjectVisibility('" . $spoilerId . "'); return false;\" class=\"spoilerLink\">"; $output .= "Click to reveal Spoiler</a>\n"; $output .= "<div id=\"" . $spoilerId . "\" class=\"spoiler\" style=\"visibility: hidden; position:absolute;\">\n"; $output .= "<span class=\"spoilerHeader\">SPOILER</span><br />\n"; $output .= $outputObj->getText() . "\n"; #$output .= $input . "\n"; $output .= "</div>\n"; # $output .= "Text passed into example extension: <br/>$input"; # $output .= " <br/> and the value for the arg 'argument' is " . $argv["argument"]; # $output .= " <br/> and the value for the arg 'argument2' is: " . $argv["argument2"]; return $output; } ?>