<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.hard-light.org/index.php?action=history&amp;feed=atom&amp;title=User%3ANx%2Frandomselection</id>
	<title>User:Nx/randomselection - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.hard-light.org/index.php?action=history&amp;feed=atom&amp;title=User%3ANx%2Frandomselection"/>
	<link rel="alternate" type="text/html" href="https://wiki.hard-light.org/index.php?title=User:Nx/randomselection&amp;action=history"/>
	<updated>2026-11-15T16:52:55Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://wiki.hard-light.org/index.php?title=User:Nx/randomselection&amp;diff=29679&amp;oldid=prev</id>
		<title>Nx: Created page with &#039;&lt;pre&gt; &lt;?php /*    RandomSelection v2.1.3 -- 7/21/08    This extension randomly displays one of the given options.    Usage: &lt;choose&gt;&lt;option&gt;A&lt;/option&gt;&lt;option&gt;B&lt;/option&gt;&lt;/choose&gt; …&#039;</title>
		<link rel="alternate" type="text/html" href="https://wiki.hard-light.org/index.php?title=User:Nx/randomselection&amp;diff=29679&amp;oldid=prev"/>
		<updated>2010-06-16T21:16:36Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;#039;&amp;lt;pre&amp;gt; &amp;lt;?php /*    RandomSelection v2.1.3 -- 7/21/08    This extension randomly displays one of the given options.    Usage: &amp;lt;choose&amp;gt;&amp;lt;option&amp;gt;A&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;B&amp;lt;/option&amp;gt;&amp;lt;/choose&amp;gt; …&amp;#039;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
/*&lt;br /&gt;
 &lt;br /&gt;
 RandomSelection v2.1.3 -- 7/21/08&lt;br /&gt;
 &lt;br /&gt;
 This extension randomly displays one of the given options.&lt;br /&gt;
 &lt;br /&gt;
 Usage: &amp;lt;choose&amp;gt;&amp;lt;option&amp;gt;A&amp;lt;/option&amp;gt;&amp;lt;option&amp;gt;B&amp;lt;/option&amp;gt;&amp;lt;/choose&amp;gt;&lt;br /&gt;
 Optional parameter: &amp;lt;option weight=&amp;quot;3&amp;quot;&amp;gt; == 3x weight given&lt;br /&gt;
 &lt;br /&gt;
 Author: Ross McClure [http://www.mediawiki.org/wiki/User:Algorithm]&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
//Avoid unstubbing $wgParser on setHook() too early on modern (1.12+) MW versions, as per r35980&lt;br /&gt;
if ( defined( &amp;#039;MW_SUPPORTS_PARSERFIRSTCALLINIT&amp;#039; ) ) {&lt;br /&gt;
	$wgHooks[&amp;#039;ParserFirstCallInit&amp;#039;][] = &amp;#039;wfRandomSelection&amp;#039;;&lt;br /&gt;
} else {&lt;br /&gt;
	$wgExtensionFunctions[] = &amp;#039;wfRandomSelection&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$wgHooks[&amp;#039;LanguageGetMagic&amp;#039;][] = &amp;#039;efRandomSelection_Magic&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
$wgExtensionCredits[&amp;#039;parserhook&amp;#039;][] = array(&lt;br /&gt;
	&amp;#039;name&amp;#039; =&amp;gt; &amp;#039;RandomSelection&amp;#039;,&lt;br /&gt;
	&amp;#039;url&amp;#039; =&amp;gt; &amp;#039;http://www.mediawiki.org/wiki/Extension:RandomSelection&amp;#039;,&lt;br /&gt;
	&amp;#039;version&amp;#039; =&amp;gt; &amp;#039;2.1.3&amp;#039;,&lt;br /&gt;
	&amp;#039;author&amp;#039; =&amp;gt; &amp;#039;Ross McClure&amp;#039;,&lt;br /&gt;
	&amp;#039;description&amp;#039; =&amp;gt; &amp;#039;Displays a random option from the given set.&amp;#039;&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
function efRandomSelection_Magic( &amp;amp;$magicWords, $langCode) {&lt;br /&gt;
	$magicWords[&amp;#039;choose&amp;#039;] = array( 0, &amp;#039;choose&amp;#039; );&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function wfRandomSelection() {&lt;br /&gt;
	global $wgParser;&lt;br /&gt;
	$wgParser-&amp;gt;setHook( &amp;#039;choose&amp;#039;, &amp;#039;renderChosen&amp;#039; );&lt;br /&gt;
	if ( defined( get_class( $wgParser ) . &amp;#039;::SFH_OBJECT_ARGS&amp;#039; ) ) {&lt;br /&gt;
		$wgParser-&amp;gt;setFunctionHook( &amp;#039;choose&amp;#039;, &amp;#039;efRandomSelection_RenderPF_obj&amp;#039;, SFH_OBJECT_ARGS );&lt;br /&gt;
	} else {&lt;br /&gt;
		$wgParser-&amp;gt;setFunctionHook( &amp;#039;choose&amp;#039;, &amp;#039;efRandomSelection_RenderPF&amp;#039;);&lt;br /&gt;
	}&lt;br /&gt;
	return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function efRandomSelection_RenderPF_obj(&amp;amp;$parser, $frame, $args ) {&lt;br /&gt;
	$options = array();&lt;br /&gt;
	$r = 0;&lt;br /&gt;
&lt;br /&gt;
	//first one is not an object&lt;br /&gt;
	&lt;br /&gt;
	$arg = array_shift( $args );&lt;br /&gt;
	$parts = explode( &amp;#039;=&amp;#039;, $arg, 2);&lt;br /&gt;
	if ( count($parts) == 2 ) {&lt;br /&gt;
		$options[] = array( intval(trim($parts[0])) , $parts[1] );&lt;br /&gt;
		$r += intval(trim($parts[0]));&lt;br /&gt;
	} elseif ( count($parts) == 1 ) {&lt;br /&gt;
		$options[] = array( 1 , $parts[0] );&lt;br /&gt;
		$r += 1;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	foreach ($args as $arg) {&lt;br /&gt;
		$bits = $arg-&amp;gt;splitArg();&lt;br /&gt;
		$nameNode = $bits[&amp;#039;name&amp;#039;];&lt;br /&gt;
		$index = $bits[&amp;#039;index&amp;#039;];&lt;br /&gt;
		$valueNode = $bits[&amp;#039;value&amp;#039;];&lt;br /&gt;
		if ( $index === &amp;#039;&amp;#039; ) {&lt;br /&gt;
			$name = trim($frame-&amp;gt;expand( $nameNode ));&lt;br /&gt;
			$options[] = array( intval($name) , $valueNode );&lt;br /&gt;
			$r += intval($name);&lt;br /&gt;
		} else {&lt;br /&gt;
			$options[] = array( 1 , $valueNode );&lt;br /&gt;
			$r += 1;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	# Choose an option at random&lt;br /&gt;
	if($r &amp;lt;= 0) return &amp;#039;&amp;#039;;&lt;br /&gt;
	$r = mt_rand(1,$r);&lt;br /&gt;
	for($i = 0; $i &amp;lt; count($options); $i++) {&lt;br /&gt;
		$r -= $options[$i][0];&lt;br /&gt;
		if($r &amp;lt;= 0) {&lt;br /&gt;
			$output = $options[$i][1];&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return $frame-&amp;gt;expand($output);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function efRandomSelection_RenderPF( &amp;amp;$parser /*,...*/ ) {&lt;br /&gt;
	$args = func_get_args();&lt;br /&gt;
	array_shift($args);&lt;br /&gt;
	$parts = null;&lt;br /&gt;
	$options = array();&lt;br /&gt;
	$r = 0;&lt;br /&gt;
	foreach ($args as $arg) {&lt;br /&gt;
		//$parts = array_map( &amp;#039;trim&amp;#039;, explode( &amp;#039;=&amp;#039;, $arg, 2));&lt;br /&gt;
		$parts = explode( &amp;#039;=&amp;#039;, $arg, 2);&lt;br /&gt;
		if ( count($parts) == 2 ) {&lt;br /&gt;
			$options[] = array( intval(trim($parts[0])) , $parts[1] );&lt;br /&gt;
			$r += intval(trim($parts[0]));&lt;br /&gt;
		} elseif ( count($parts) == 1 ) {&lt;br /&gt;
			$options[] = array( 1 , $parts[0] );&lt;br /&gt;
			$r += 1;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	# Choose an option at random&lt;br /&gt;
	if($r &amp;lt;= 0) return &amp;#039;&amp;#039;;&lt;br /&gt;
	$r = mt_rand(1,$r);&lt;br /&gt;
	for($i = 0; $i &amp;lt; count($options); $i++) {&lt;br /&gt;
		$r -= $options[$i][0];&lt;br /&gt;
		if($r &amp;lt;= 0) {&lt;br /&gt;
			$output = $options[$i][1];&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return $output;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function renderChosen( $input, $argv, $parser ) {&lt;br /&gt;
	# Prevent caching&lt;br /&gt;
	if (isset($argv[&amp;#039;uncached&amp;#039;])) {&lt;br /&gt;
		$parser-&amp;gt;disableCache();&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	# Parse the options and calculate total weight&lt;br /&gt;
	$len = preg_match_all(&amp;quot;/&amp;lt;option(?:(?:\\s[^&amp;gt;]*?)?\\sweight=[\&amp;quot;&amp;#039;]?([^\\s&amp;gt;]+))?&amp;quot;&lt;br /&gt;
		. &amp;quot;(?:\\s[^&amp;gt;]*)?&amp;gt;([\\s\\S]*?)&amp;lt;\\/option&amp;gt;/&amp;quot;, $input, $out);&lt;br /&gt;
	$r = 0;&lt;br /&gt;
	for($i = 0; $i &amp;lt; $len; $i++) {&lt;br /&gt;
		if(strlen($out[1][$i])==0) $out[1][$i] = 1;&lt;br /&gt;
		else $out[1][$i] = intval($out[1][$i]);&lt;br /&gt;
		$r += $out[1][$i];&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	# Choose an option at random&lt;br /&gt;
	if($r &amp;lt;= 0) return &amp;quot;&amp;quot;;&lt;br /&gt;
	$r = mt_rand(1,$r);&lt;br /&gt;
	for($i = 0; $i &amp;lt; $len; $i++) {&lt;br /&gt;
		$r -= $out[1][$i];&lt;br /&gt;
		if($r &amp;lt;= 0) {&lt;br /&gt;
			$input = $out[2][$i];&lt;br /&gt;
			break;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	# If running new parser, take the easy way out&lt;br /&gt;
	if( defined( &amp;#039;Parser::VERSION&amp;#039; ) &amp;amp;&amp;amp; version_compare( Parser::VERSION, &amp;#039;1.6.1&amp;#039;, &amp;#039;&amp;gt;&amp;#039; ) ) {&lt;br /&gt;
	return $parser-&amp;gt;recursiveTagParse($input);&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
	# Otherwise, create new parser to handle rendering&lt;br /&gt;
	$localParser = new Parser();&lt;br /&gt;
 &lt;br /&gt;
	# Initialize defaults, then copy info from parent parser&lt;br /&gt;
	$localParser-&amp;gt;clearState();&lt;br /&gt;
	$localParser-&amp;gt;mTagHooks         = $parser-&amp;gt;mTagHooks;&lt;br /&gt;
	$localParser-&amp;gt;mTemplates        = $parser-&amp;gt;mTemplates;&lt;br /&gt;
	$localParser-&amp;gt;mTemplatePath     = $parser-&amp;gt;mTemplatePath;&lt;br /&gt;
	$localParser-&amp;gt;mFunctionHooks    = $parser-&amp;gt;mFunctionHooks;&lt;br /&gt;
	$localParser-&amp;gt;mFunctionSynonyms = $parser-&amp;gt;mFunctionSynonyms;&lt;br /&gt;
 &lt;br /&gt;
	# Render the chosen option&lt;br /&gt;
	$output = $localParser-&amp;gt;parse($input, $parser-&amp;gt;mTitle,&lt;br /&gt;
					$parser-&amp;gt;mOptions, false, false);&lt;br /&gt;
	return $output-&amp;gt;getText();&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nx</name></author>
	</entry>
</feed>