<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://compusofia.com/w/index.php?action=history&amp;feed=atom&amp;title=Manual%3AParser_functions</id>
	<title>Manual:Parser functions - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://compusofia.com/w/index.php?action=history&amp;feed=atom&amp;title=Manual%3AParser_functions"/>
	<link rel="alternate" type="text/html" href="https://compusofia.com/w/index.php?title=Manual:Parser_functions&amp;action=history"/>
	<updated>2026-04-18T23:18:41Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://compusofia.com/w/index.php?title=Manual:Parser_functions&amp;diff=5762&amp;oldid=prev</id>
		<title>Majestix: 1 revision imported: Initial Setup</title>
		<link rel="alternate" type="text/html" href="https://compusofia.com/w/index.php?title=Manual:Parser_functions&amp;diff=5762&amp;oldid=prev"/>
		<updated>2026-04-12T10:05:05Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported: Initial Setup&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 12:05, 12 April 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Majestix</name></author>
	</entry>
	<entry>
		<id>https://compusofia.com/w/index.php?title=Manual:Parser_functions&amp;diff=5761&amp;oldid=prev</id>
		<title>en&gt;HyperNervie: Should this be translated?</title>
		<link rel="alternate" type="text/html" href="https://compusofia.com/w/index.php?title=Manual:Parser_functions&amp;diff=5761&amp;oldid=prev"/>
		<updated>2026-03-19T08:07:16Z</updated>

		<summary type="html">&lt;p&gt;Should this be translated?&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;languages /&amp;gt;&lt;br /&gt;
{{Magic words}}&lt;br /&gt;
[[File:MediaWiki-extensions-icon.svg|125px|alt=MediaWiki extensions|{{dir|{{pagelang}}|left|right}}]]&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:1--&amp;gt; Parser functions, added in MediaWiki 1.7, are a type of extension that integrate closely with the parser.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:68--&amp;gt; The phrase &amp;quot;parser function&amp;quot; should not be confused with &amp;lt;tvar name=1&amp;gt;{{ll|Extension:ParserFunctions}}&amp;lt;/tvar&amp;gt;, which is a collection of simple parser functions.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:69--&amp;gt; (See &amp;lt;tvar name=1&amp;gt;{{ll|Help:Extension:ParserFunctions}}&amp;lt;/tvar&amp;gt; for those.)&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
== Description == &amp;lt;!--T:2--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:3--&amp;gt;&lt;br /&gt;
Whereas a [[&amp;lt;tvar name=tag-ext&amp;gt;Special:MyLanguage/Manual:Tag extensions&amp;lt;/tvar&amp;gt;|tag extension]] is expected to take unprocessed text and return HTML to the browser, a parser function can &amp;#039;interact&amp;#039; with other wiki elements in the page. For example, the output of a parser function could be used as a [[&amp;lt;tvar name=hlp-param&amp;gt;Special:MyLanguage/Help:Templates#Parameters&amp;lt;/tvar&amp;gt;|template parameter]] or in the construction of a [[&amp;lt;tvar name=links&amp;gt;Special:MyLanguage/Help:Link&amp;lt;/tvar&amp;gt;|link]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:4--&amp;gt;&lt;br /&gt;
The typical syntax for a parser function is:&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
 {{ #functionname: param1 | param2 | param3 }}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:5--&amp;gt; For more information, see {{&amp;lt;tvar name=2&amp;gt;tmpl|0={{method doclink | class=MediaWiki\Parser\Parser | anchor=a34da5613dad9dd0a5e921aa7bceba3cf|method=$1}}&amp;lt;/tvar&amp;gt;|the documentation}} for &amp;lt;tvar name=hook&amp;gt;{{phpi|Parser::setFunctionHook ( $id, $callback, $flags {{=}} 0 )}}&amp;lt;/tvar&amp;gt;.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:127--&amp;gt; This documentation states:&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:6--&amp;gt; The callback function should have the form:&amp;lt;/translate&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;function myParserFunction( $parser, $arg1, $arg2, $arg3 ) { ... }&amp;lt;/code&amp;gt;&lt;br /&gt;
:&amp;lt;translate&amp;gt;&amp;lt;!--T:7--&amp;gt; Or with &amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;SFH_OBJECT_ARGS&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt;:&amp;lt;/translate&amp;gt;&lt;br /&gt;
::&amp;lt;code&amp;gt;function myParserFunction( $parser, $frame, $args ) { ... }&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:74--&amp;gt; The first variant of the call passes all arguments as plain text.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:104--&amp;gt; The second passes all arguments as an array of &amp;lt;tvar name=&amp;quot;1&amp;quot;&amp;gt;{{ll|Manual:PPNode.php|PPNode}}&amp;lt;/tvar&amp;gt;s, except for the first (&amp;lt;tvar name=&amp;quot;2&amp;quot;&amp;gt;&amp;lt;code&amp;gt;$args[0]&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt;), which is currently text, though this may change in the future.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:75--&amp;gt; These represent the unexpanded wikitext.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:98--&amp;gt; The &amp;lt;tvar name=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;code&amp;gt;{{ll|Manual:PPFrame.php|$frame}}&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; parameter can be used to expand these arguments as needed.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:76--&amp;gt; This is commonly used for conditional processing so that only the &amp;lt;tvar name=1&amp;gt;{{phpi|true}}&amp;lt;/tvar&amp;gt; case is evaluated with an &amp;lt;tvar name=2&amp;gt;&amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt;-or-&amp;lt;tvar name=3&amp;gt;&amp;lt;code&amp;gt;switch&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt;-like parser function.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:77--&amp;gt; The frame object can also climb up the document tree to get information about the caller and has functions to determine and manage call depth, time-to-live, and whether the result of the parser function is volatile.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:8--&amp;gt;&lt;br /&gt;
Creating a parser function is slightly more complicated than creating a new tag because the function name must be a [[&amp;lt;tvar name=magic&amp;gt;Special:MyLanguage/Help:Magic words&amp;lt;/tvar&amp;gt;|magic word]], a keyword that supports aliases and localization.&lt;br /&gt;
&lt;br /&gt;
== Simple example == &amp;lt;!--T:9--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:10--&amp;gt;&lt;br /&gt;
Below is an example of an extension that creates a parser function.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:60--&amp;gt;&lt;br /&gt;
The registration goes into &amp;lt;tvar name=1&amp;gt;&amp;#039;&amp;#039;&amp;#039;extension.json&amp;#039;&amp;#039;&amp;#039;&amp;lt;/tvar&amp;gt; and the code into &amp;lt;tvar name=2&amp;gt;&amp;#039;&amp;#039;&amp;#039;src/ExampleExtensionHooks.php&amp;#039;&amp;#039;&amp;#039;&amp;lt;/tvar&amp;gt; respectively:&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;translate&amp;gt;&amp;lt;!--T:132--&amp;gt; Standard:&amp;lt;/translate&amp;gt;&lt;br /&gt;
! &amp;lt;translate&amp;gt;&amp;lt;!--T:133--&amp;gt; Using the &amp;lt;tvar name=1&amp;gt;HookHandler&amp;lt;/tvar&amp;gt; interface:&amp;lt;/translate&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;| extension.json&lt;br /&gt;
|-&lt;br /&gt;
| {{ExtensionJsonFile&lt;br /&gt;
|type=parserhook&lt;br /&gt;
|extension=ExampleExtension&lt;br /&gt;
}}&lt;br /&gt;
| &lt;br /&gt;
{{Code&lt;br /&gt;
|lang=json&lt;br /&gt;
|&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;name&amp;quot;: &amp;quot;ExampleExtension&amp;quot;,&lt;br /&gt;
	&amp;quot;author&amp;quot;: &amp;quot;Me&amp;quot;,&lt;br /&gt;
	&amp;quot;version&amp;quot;: &amp;quot;1.0.0&amp;quot;,&lt;br /&gt;
	&amp;quot;url&amp;quot;: &amp;quot;https://www.mediawiki.org/wiki/Extension:ExampleExtension&amp;quot;,&lt;br /&gt;
	&amp;quot;descriptionmsg&amp;quot;: &amp;quot;{{lc:ExampleExtension}}-desc&amp;quot;,&lt;br /&gt;
	&amp;quot;license-name&amp;quot;: &amp;quot;GPL-2.0-or-later&amp;quot;,&lt;br /&gt;
	&amp;quot;type&amp;quot;: &amp;quot;parserhook&amp;quot;,&lt;br /&gt;
	&amp;quot;MessagesDirs&amp;quot;: {&lt;br /&gt;
		&amp;quot;ExampleExtension&amp;quot;: [&lt;br /&gt;
			&amp;quot;i18n&amp;quot;&lt;br /&gt;
		]&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;AutoloadClasses&amp;quot;: {&lt;br /&gt;
		&amp;quot;ExampleExtensionHooks&amp;quot;: &amp;quot;src/ExampleExtensionHooks.php&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;ExtensionMessagesFiles&amp;quot;: {&lt;br /&gt;
		&amp;quot;ExampleExtensionMagic&amp;quot;: &amp;quot;ExampleExtension.i18n.php&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;Hooks&amp;quot;: {&lt;br /&gt;
		&amp;quot;ParserFirstCallInit&amp;quot;: &amp;quot;onParserFirstCallInit&amp;quot;&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;HookHandlers&amp;quot;: {&lt;br /&gt;
		&amp;quot;ExampleExtensionHooks&amp;quot;: {&lt;br /&gt;
			&amp;quot;class&amp;quot;: &amp;quot;MediaWiki\\Extension\\ExampleExtension\\Hooks&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;manifest_version&amp;quot;: 1&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;2&amp;quot;| ExampleExtensionHooks.php&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
class ExampleExtensionHooks {&lt;br /&gt;
&lt;br /&gt;
   // &amp;lt;translate nowrap&amp;gt;&amp;lt;!--T:61--&amp;gt; Register any render callbacks with the parser&amp;lt;/translate&amp;gt;&lt;br /&gt;
   public static function onParserFirstCallInit( Parser $parser ) {&lt;br /&gt;
      // &amp;lt;translate nowrap&amp;gt;&amp;lt;!--T:62--&amp;gt; Create a function hook associating the &amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;example&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; magic word with &amp;lt;tvar name=2&amp;gt;renderExample()&amp;lt;/tvar&amp;gt;&amp;lt;/translate&amp;gt;&lt;br /&gt;
      $parser-&amp;gt;setFunctionHook( &amp;#039;example&amp;#039;, [ self::class, &amp;#039;renderExample&amp;#039; ] );&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   // &amp;lt;translate nowrap&amp;gt;&amp;lt;!--T:63--&amp;gt; Render the output of &amp;lt;tvar name=1&amp;gt;{{#example:}}&amp;lt;/tvar&amp;gt;.&amp;lt;/translate&amp;gt;&lt;br /&gt;
   public static function renderExample( Parser $parser, $param1 = &amp;#039;&amp;#039;, $param2 = &amp;#039;&amp;#039;, $param3 = &amp;#039;&amp;#039; ) {&lt;br /&gt;
      // &amp;lt;translate nowrap&amp;gt;&amp;lt;!--T:64--&amp;gt; The input parameters are wikitext with templates expanded.&amp;lt;/translate&amp;gt;&lt;br /&gt;
      // &amp;lt;translate nowrap&amp;gt;&amp;lt;!--T:65--&amp;gt; The output should be wikitext too.&amp;lt;/translate&amp;gt;&lt;br /&gt;
      $output = &amp;quot;param1 is $param1 and param2 is $param2 and param3 is $param3&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
      return $output;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
class ExampleExtensionHooks implements ParserFirstCallInitHook {&lt;br /&gt;
&lt;br /&gt;
   // &amp;lt;translate nowrap&amp;gt;&amp;lt;!--T:128--&amp;gt; Register any render callbacks with the parser&amp;lt;/translate&amp;gt;&lt;br /&gt;
   public function onParserFirstCallInit( $parser ) {&lt;br /&gt;
      // Create a function hook associating the example magic word with renderExample()&lt;br /&gt;
      $parser-&amp;gt;setFunctionHook( &amp;#039;example&amp;#039;, [ $this, &amp;#039;renderExample&amp;#039; ] );&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   // &amp;lt;translate nowrap&amp;gt;&amp;lt;!--T:129--&amp;gt; Render the output of &amp;lt;tvar name=1&amp;gt;{{#example:}}&amp;lt;/tvar&amp;gt;.&amp;lt;/translate&amp;gt;&lt;br /&gt;
   public function renderExample( $parser, $param1 = &amp;#039;&amp;#039;, $param2 = &amp;#039;&amp;#039;, $param3 = &amp;#039;&amp;#039; ) {&lt;br /&gt;
      // &amp;lt;translate nowrap&amp;gt;&amp;lt;!--T:130--&amp;gt; The input parameters are wikitext with templates expanded.&amp;lt;/translate&amp;gt;&lt;br /&gt;
      // &amp;lt;translate nowrap&amp;gt;&amp;lt;!--T:131--&amp;gt; The output should be wikitext too.&amp;lt;/translate&amp;gt;&lt;br /&gt;
      $output = &amp;quot;param1 is $param1 and param2 is $param2 and param3 is $param3&amp;quot;;&lt;br /&gt;
      return $output;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:12--&amp;gt;&lt;br /&gt;
Another file, &amp;lt;tvar name=example&amp;gt;&amp;#039;&amp;#039;&amp;#039;ExampleExtension.i18n.php&amp;#039;&amp;#039;&amp;#039;&amp;lt;/tvar&amp;gt;, in your extension directory (Not in the &amp;lt;tvar name=1&amp;gt;src/&amp;lt;/tvar&amp;gt; subdirectory) should contain:&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
/**&lt;br /&gt;
 * @license GPL-2.0-or-later&lt;br /&gt;
 * @author &amp;lt;translate nowrap&amp;gt;&amp;lt;!--T:106--&amp;gt; Your Name&amp;lt;/translate&amp;gt; (YourUserName)&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
$magicWords = [];&lt;br /&gt;
&lt;br /&gt;
/** English&lt;br /&gt;
 * @author &amp;lt;translate nowrap&amp;gt;&amp;lt;!--T:107--&amp;gt; Your Name&amp;lt;/translate&amp;gt; (YourUserName)&lt;br /&gt;
 */&lt;br /&gt;
$magicWords[&amp;#039;en&amp;#039;] = [&lt;br /&gt;
   &amp;#039;example&amp;#039; =&amp;gt; [ 0, &amp;#039;example&amp;#039; ],&lt;br /&gt;
];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:13--&amp;gt;&lt;br /&gt;
With this extension enabled,&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* {{#example: hello | hi | hey}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:14--&amp;gt; produces:&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* param1 is hello and param2 is hi and param3 is hey&lt;br /&gt;
&lt;br /&gt;
{{note|1=&amp;lt;translate&amp;gt;&amp;lt;!--T:15--&amp;gt; This magicWords array is not optional. If it is omitted, the parser function simply will not work; the &amp;lt;tvar name=array&amp;gt;{{#example: hello | hi}}&amp;lt;/tvar&amp;gt; will be rendered as though the extension were not installed.&amp;lt;/translate&amp;gt; &amp;lt;translate&amp;gt;&amp;lt;!--T:78--&amp;gt; If only the language-specific array is initialized and not the magicWords array itself, this can cause localization errors as translations from other extensions leak into yours.&amp;lt;/translate&amp;gt; &amp;lt;translate&amp;gt;&amp;lt;!--T:70--&amp;gt; You can associate magic words inline in PHP rather than through a i18n file.&amp;lt;/translate&amp;gt; &amp;lt;translate&amp;gt;&amp;lt;!--T:71--&amp;gt; This is useful when defining hooks in &amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;LocalSettings.php&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt;&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
MediaWiki\MediaWikiServices::getInstance()-&amp;gt;getContentLanguage()-&amp;gt;mMagicExtensions[&amp;#039;wikicodeToHtml&amp;#039;] = [&amp;#039;MAG_CUSTOM&amp;#039;, &amp;#039;custom&amp;#039;];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Within &amp;lt;tvar name=1&amp;gt;LocalSettings.php&amp;lt;/tvar&amp;gt; === &amp;lt;!--T:100--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:101--&amp;gt;&lt;br /&gt;
Magic words and their handling parser functions can be defined entirely in &amp;lt;tvar name=&amp;quot;1&amp;quot;&amp;gt;LocalSettings.php&amp;lt;/tvar&amp;gt;.&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
$wgHooks[&amp;#039;ParserFirstCallInit&amp;#039;][] = function ( Parser $parser ) &lt;br /&gt;
{&lt;br /&gt;
	MediaWiki\MediaWikiServices::getInstance()-&amp;gt;getContentLanguage()-&amp;gt;mMagicExtensions[&amp;#039;wikicodeToHtml&amp;#039;] = [&amp;#039;wikicodeToHtml&amp;#039;, &amp;#039;wikicodeToHtml&amp;#039;];&lt;br /&gt;
&lt;br /&gt;
	$parser-&amp;gt;setFunctionHook( &amp;#039;wikicodeToHtml&amp;#039;, &amp;#039;wikicodeToHtml&amp;#039; );&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
function wikicodeToHtml( Parser $parser, $code = &amp;#039;&amp;#039; ) &lt;br /&gt;
{&lt;br /&gt;
	$title = $parser-&amp;gt;getTitle();&lt;br /&gt;
	$options = $parser-&amp;gt;Options();&lt;br /&gt;
	$options-&amp;gt;enableLimitReport(false);&lt;br /&gt;
	$parser = $parser-&amp;gt;getFreshParser();&lt;br /&gt;
	return [$parser-&amp;gt;parse($code, $title, $options)-&amp;gt;getText(), &amp;#039;isHTML&amp;#039; =&amp;gt; true];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Longer functions === &amp;lt;!--T:16--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:17--&amp;gt;&lt;br /&gt;
For longer functions, you may want to split the hook functions out to a &amp;lt;tvar name=1&amp;gt;_body.php&amp;lt;/tvar&amp;gt; or &amp;lt;tvar name=2&amp;gt;.hooks.php&amp;lt;/tvar&amp;gt; file and make them static functions of a class. Then you can load the class with &amp;lt;tvar name=AutoloadClasses&amp;gt;{{ll|Manual:$wgAutoloadClasses|$wgAutoloadClasses}}&amp;lt;/tvar&amp;gt; and call the static functions in the hooks; e.g.:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:18--&amp;gt;&lt;br /&gt;
Put this in your &amp;lt;tvar name=myext&amp;gt;&amp;lt;code&amp;gt;extension.json&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; file:&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
&amp;quot;Hooks&amp;quot;: {&lt;br /&gt;
	&amp;quot;ParserFirstCallInit&amp;quot;: &amp;quot;ExampleExtensionHooks::onParserFirstCallInit&amp;quot;&lt;br /&gt;
},&lt;br /&gt;
&amp;quot;AutoloadClasses&amp;quot;: {&lt;br /&gt;
	&amp;quot;ExampleExtensionHooks&amp;quot;: &amp;quot;src/ExampleExtensionHooks.php&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &amp;lt;small&amp;gt;&amp;lt;translate&amp;gt;&amp;lt;!--T:19--&amp;gt; See: [[&amp;lt;tvar name=handler&amp;gt;Special:MyLanguage/Manual:Hooks#Writing_an_event_handler&amp;lt;/tvar&amp;gt;|writing an event handler]] for other styles.&amp;lt;/translate&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:20--&amp;gt;&lt;br /&gt;
Then put this in your &amp;lt;tvar name=myext&amp;gt;&amp;lt;code&amp;gt;src/ExampleExtensionHooks.php&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; file:&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
class ExampleExtensionHooks {&lt;br /&gt;
      public static function onParserFirstCallInit( Parser $parser ) {&lt;br /&gt;
           $parser-&amp;gt;setFunctionHook( &amp;#039;example&amp;#039;, [ self::class, &amp;#039;renderExample&amp;#039; ] );&lt;br /&gt;
      }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
== Parser interface == &amp;lt;!--T:23--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Controlling the parsing of output === &amp;lt;!--T:24--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:25--&amp;gt;&lt;br /&gt;
To have the wikitext returned by your parser function be fully parsed (including expansion of templates), set the &amp;lt;tvar name=noparse&amp;gt;&amp;lt;code&amp;gt;noparse&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; option to &amp;lt;tvar name=1&amp;gt;{{phpi|false}}&amp;lt;/tvar&amp;gt; when returning:&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
return [ $output, &amp;#039;noparse&amp;#039; =&amp;gt; false ];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:26--&amp;gt;&lt;br /&gt;
It seems the default value for &amp;lt;tvar name=noparse&amp;gt;&amp;lt;code&amp;gt;noparse&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; changed from &amp;lt;tvar name=1&amp;gt;{{phpi|false}}&amp;lt;/tvar&amp;gt; to &amp;lt;tvar name=2&amp;gt;{{phpi|true}}&amp;lt;/tvar&amp;gt;, at least in some situations, sometime around version 1.12.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:27--&amp;gt;&lt;br /&gt;
Conversely, to have your parser function return HTML that remains unparsed, rather than returning wikitext, use this:&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
return [ $output, &amp;#039;noparse&amp;#039; =&amp;gt; true, &amp;#039;isHTML&amp;#039; =&amp;gt; true ];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Naming === &amp;lt;!--T:32--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:33--&amp;gt; By default, MW adds a hash character (number sign, &amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt;) to the name of each parser function.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:72--&amp;gt; To suppress that addition (and obtain a parser function with no &amp;lt;tvar name=2&amp;gt;&amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; prefix), include the &amp;#039;&amp;#039;&amp;lt;tvar name=3&amp;gt;SFH_NO_HASH&amp;lt;/tvar&amp;gt;&amp;#039;&amp;#039; constant in the optional &amp;lt;tvar name=4&amp;gt;flags&amp;lt;/tvar&amp;gt; argument to &amp;lt;tvar name=5&amp;gt;setFunctionHook&amp;lt;/tvar&amp;gt;, as described [[&amp;lt;tvar name=1&amp;gt;#The setFunctionHook hook&amp;lt;/tvar&amp;gt;|below]].&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:34--&amp;gt;&lt;br /&gt;
When choosing a name without a hash prefix, note that transclusion of a page with a name starting with that function name followed by a colon is no longer possible. In particular, avoid function names equal to a namespace name. In the case that interwiki transclusion &amp;lt;tvar name=gmane&amp;gt;[https://lists.wikimedia.org/hyperkitty/list/mediawiki-l@lists.wikimedia.org/thread/3M53FBQ66B4EZNU6XMJQRFG3TVCW7WQO/]&amp;lt;/tvar&amp;gt; is enabled, also avoid function names equal to an interwiki prefix.&lt;br /&gt;
&lt;br /&gt;
=== The &amp;lt;tvar name=1&amp;gt;setFunctionHook&amp;lt;/tvar&amp;gt; hook === &amp;lt;!--T:35--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:36--&amp;gt; For more details of the interface into the parser, see the documentation for &amp;lt;tvar name=1&amp;gt;setFunctionHook&amp;lt;/tvar&amp;gt; in &amp;lt;tvar name=2&amp;gt;includes/Parser.php&amp;lt;/tvar&amp;gt;.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:54--&amp;gt; Here&amp;#039;s a (possibly dated) copy of those comments:&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;function setFunctionHook( $id, $callback, $flags = 0 )&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:37--&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Parameters:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* string $id – &amp;lt;translate&amp;gt;&amp;lt;!--T:38--&amp;gt; The magic word ID&amp;lt;/translate&amp;gt;&lt;br /&gt;
* mixed $callback – &amp;lt;translate&amp;gt;&amp;lt;!--T:55--&amp;gt; The callback function (and object) to use&amp;lt;/translate&amp;gt;&lt;br /&gt;
* integer $flags – &amp;lt;translate&amp;gt;&amp;lt;!--T:56--&amp;gt; Optional. Values:&amp;lt;/translate&amp;gt;&lt;br /&gt;
:* &amp;lt;code&amp;gt;SFH_NO_HASH&amp;lt;/code&amp;gt; (1) – &amp;lt;translate&amp;gt;&amp;lt;!--T:118--&amp;gt; constant if you call the function without &amp;lt;tvar name=2&amp;gt;&amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt;.&amp;lt;/translate&amp;gt; &lt;br /&gt;
:* &amp;lt;code&amp;gt;SFH_OBJECT_ARGS&amp;lt;/code&amp;gt; (2) – &amp;lt;translate&amp;gt;&amp;lt;!--T:119--&amp;gt; if you pass a PPFrame object and array of arguments instead of a series of function arguments, for which [[&amp;lt;tvar name=2&amp;gt;#Description&amp;lt;/tvar&amp;gt;|see above]].&amp;lt;/translate&amp;gt; &lt;br /&gt;
:*&amp;lt;translate&amp;gt;&amp;lt;!--T:120--&amp;gt; Defaults to 0 (no flags).&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:39--&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Return value:&amp;#039;&amp;#039;&amp;#039; The old callback function for this name, if any&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:40--&amp;gt;&lt;br /&gt;
Create a function, e.g., &amp;lt;tvar name=sum&amp;gt;&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{#sum:1|2|3}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt;. The callback function should have the form:&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
function myParserFunction( $parser, $arg1, $arg2, $arg3 ) { ... }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:41--&amp;gt;&lt;br /&gt;
The callback may either return the text result of the function, or an array with the text in element 0, and a number of flags in the other elements. The names of the flags are specified in the keys. Valid flags are:&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! &amp;lt;translate&amp;gt;&amp;lt;!--T:121--&amp;gt; Name&amp;lt;/translate&amp;gt; !! &amp;lt;translate&amp;gt;&amp;lt;!--T:122--&amp;gt; Type&amp;lt;/translate&amp;gt; !! &amp;lt;translate&amp;gt;&amp;lt;!--T:123--&amp;gt; Default&amp;lt;/translate&amp;gt;&lt;br /&gt;
! &amp;lt;translate&amp;gt;&amp;lt;!--T:124--&amp;gt; Description&amp;lt;/translate&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| found || &amp;lt;translate&amp;gt;&amp;lt;!--T:125--&amp;gt; Boolean&amp;lt;/translate&amp;gt; || {{phpi|true}}&lt;br /&gt;
| &amp;lt;translate&amp;gt;&amp;lt;!--T:42--&amp;gt; &amp;lt;tvar name=1&amp;gt;{{phpi|true}}&amp;lt;/tvar&amp;gt; if the text returned is valid and processing of the template must stop.&amp;lt;/translate&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| text || ? || ?&lt;br /&gt;
| &amp;lt;translate&amp;gt;&amp;lt;!--T:84--&amp;gt; The text to return from the function.&amp;lt;/translate&amp;gt; &amp;lt;translate&amp;gt;&amp;lt;!--T:85--&amp;gt; If &amp;lt;tvar name=1&amp;gt;isChildObj&amp;lt;/tvar&amp;gt; or &amp;lt;tvar name=2&amp;gt;isLocalObj&amp;lt;/tvar&amp;gt; are specified, this should be a DOM node instead.&amp;lt;/translate&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| noparse || {{Tunit|id=125|content=Boolean}} || {{phpi|true}}&lt;br /&gt;
| &amp;lt;translate&amp;gt;&amp;lt;!--T:44--&amp;gt; &amp;lt;tvar name=1&amp;gt;{{phpi|true}}&amp;lt;/tvar&amp;gt; if text should not be preprocessed to a DOM tree, e.g. unsafe HTML tags should not be stripped, etc.&amp;lt;/translate&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| isHTML || {{Tunit|id=125|content=Boolean}} || ?&lt;br /&gt;
| &amp;lt;translate&amp;gt;&amp;lt;!--T:46--&amp;gt; &amp;lt;tvar name=1&amp;gt;{{phpi|true}}&amp;lt;/tvar&amp;gt; if the returned text is HTML and must be armoured against wikitext transformation.&amp;lt;/translate&amp;gt; &amp;lt;translate&amp;gt;&amp;lt;!--T:103--&amp;gt; [[&amp;lt;tvar name=&amp;quot;1&amp;quot;&amp;gt;Manual talk:Parser functions#isHTML - almost but not _entirely&amp;lt;/tvar&amp;gt;|But see discussion]]&amp;lt;/translate&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| nowiki || {{Tunit|id=125|content=Boolean}} || &amp;lt;translate&amp;gt;&amp;lt;!--T:126--&amp;gt; usually &amp;lt;tvar name=1&amp;gt;{{phpi|false}}&amp;lt;/tvar&amp;gt;&amp;lt;/translate&amp;gt;&lt;br /&gt;
| &amp;lt;translate&amp;gt;&amp;lt;!--T:43--&amp;gt; &amp;lt;tvar name=1&amp;gt;{{phpi|true}}&amp;lt;/tvar&amp;gt; if wiki markup in the return value (text) should be escaped.&amp;lt;/translate&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| isChildObj || {{Tunit|id=125|content=Boolean}} || ?&lt;br /&gt;
| &amp;lt;translate&amp;gt;&amp;lt;!--T:80--&amp;gt; &amp;lt;tvar name=1&amp;gt;{{phpi|true}}&amp;lt;/tvar&amp;gt; if the text is a DOM node needing expansion in a child frame.&amp;lt;/translate&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| isLocalObj || {{Tunit|id=125|content=Boolean}} || ?&lt;br /&gt;
| &amp;lt;translate&amp;gt;&amp;lt;!--T:81--&amp;gt; &amp;lt;tvar name=1&amp;gt;{{phpi|true}}&amp;lt;/tvar&amp;gt; if the text is a DOM node needing expansion in the current frame.&amp;lt;/translate&amp;gt; &amp;lt;translate&amp;gt;&amp;lt;!--T:105--&amp;gt; The default value depends on other values and outcomes.&amp;lt;/translate&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| preprocessFlags || ? || {{phpi|false}}&lt;br /&gt;
| &amp;lt;translate&amp;gt;&amp;lt;!--T:82--&amp;gt; Optional &amp;lt;tvar name=1&amp;gt;{{ll|Manual:PPFrame.php|PPFrame}}&amp;lt;/tvar&amp;gt; flags to use when parsing the returned text.&amp;lt;/translate&amp;gt; &amp;lt;translate&amp;gt;&amp;lt;!--T:83--&amp;gt; This only applies when &amp;lt;tvar name=1&amp;gt;noparse&amp;lt;/tvar&amp;gt; is &amp;lt;tvar name=2&amp;gt;{{phpi|false}}&amp;lt;/tvar&amp;gt;.&amp;lt;/translate&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| title || ? || {{phpi|false}}&lt;br /&gt;
| &amp;lt;translate&amp;gt;&amp;lt;!--T:86--&amp;gt; The &amp;lt;tvar name=1&amp;gt;{{ll|Manual:Title.php|Title}}&amp;lt;/tvar&amp;gt; object where the text came from.&amp;lt;/translate&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| forceRawInterwiki || {{Tunit|id=125|content=Boolean}} || ?&lt;br /&gt;
| &amp;lt;translate&amp;gt;&amp;lt;!--T:79--&amp;gt; &amp;lt;tvar name=1&amp;gt;{{phpi|true}}&amp;lt;/tvar&amp;gt; if interwiki transclusion must be forced to be done in raw mode and not rendered.&amp;lt;/translate&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
=== Expensive parser functions === &amp;lt;!--T:87--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
{{see also|Manual:Template limits#Expensive parser function calls}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:88--&amp;gt; Some parser functions represent a significant use of a wiki&amp;#039;s resources and should be marked as &amp;quot;expensive&amp;quot;.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:89--&amp;gt; The number of expensive parser functions on any given page is limited by the &amp;lt;tvar name=1&amp;gt;{{ll|Manual:$wgExpensiveParserFunctionLimit|$wgExpensiveParserFunctionLimit}}&amp;lt;/tvar&amp;gt; setting.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:90--&amp;gt; What counts as expensive is left up to the function itself, but typically, anything that is likely to cause a delay that extends beyond simple processing of data should be considered.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:91--&amp;gt; This includes things like database reads and writes, launching a shell script synchronously, or file manipulation.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:92--&amp;gt; On the other hand, not all such functions should necessarily be tagged.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:93--&amp;gt; Semantic MediaWiki, for example, only marks a percentage of its database reads as expensive.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:94--&amp;gt; This is due to the fact that on certain data-intensive pages, it could easily overflow the normal expensive parser function limits.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:95--&amp;gt; In cases like this, the potential for noticeably slower performance that doesn&amp;#039;t get flagged as expensive is a trade-off to having the functionality that SMW offers.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:96--&amp;gt; To mark your parser function as expensive, from within the body of the function&amp;#039;s code, use &amp;lt;tvar name=1&amp;gt;&amp;lt;syntaxhighlight lang=php inline&amp;gt;$result = $parser-&amp;gt;incrementExpensiveFunctionCount();&amp;lt;/syntaxhighlight&amp;gt;&amp;lt;/tvar&amp;gt;.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:97--&amp;gt; The return value will be &amp;lt;tvar name=1&amp;gt;{{phpi|false}}&amp;lt;/tvar&amp;gt; if the expensive function limit has been reached or exceeded.&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==Named parameters== &amp;lt;!--T:47--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:48--&amp;gt;&lt;br /&gt;
Parser functions do not support named parameters the way templates and tag extensions do, but it is occasionally useful to fake it. Users are often accustomed to using vertical bars ( &amp;lt;tvar name=1&amp;gt;&amp;lt;code&amp;gt;|&amp;lt;/code&amp;gt;&amp;lt;/tvar&amp;gt; ) to separate arguments, so it&amp;#039;s nice to be able to do that in the parser function context, too. Here&amp;#039;s a simple example of how to accomplish this:&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot; style=&amp;quot;overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
function ExampleExtensionRenderParserFunction( &amp;amp;$parser ) {&lt;br /&gt;
	// &amp;lt;translate nowrap&amp;gt;&amp;lt;!--T:108--&amp;gt; Suppose the user invoked the parser function like so:&amp;lt;/translate&amp;gt;&lt;br /&gt;
	// {{#myparserfunction: foo=bar | apple=orange | banana }}&lt;br /&gt;
&lt;br /&gt;
	$options = extractOptions( array_slice( func_get_args(), 1 ) );&lt;br /&gt;
&lt;br /&gt;
	// &amp;lt;translate nowrap&amp;gt;&amp;lt;!--T:109--&amp;gt; Now you&amp;#039;ve got an array that looks like this:&amp;lt;/translate&amp;gt;&lt;br /&gt;
	// [foo] =&amp;gt; &amp;#039;bar&amp;#039;&lt;br /&gt;
	// [apple] =&amp;gt; &amp;#039;orange&amp;#039;&lt;br /&gt;
	// [banana] =&amp;gt; true&lt;br /&gt;
	// &amp;lt;translate nowrap&amp;gt;&amp;lt;!--T:110--&amp;gt; Continue writing your code...&amp;lt;/translate&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * &amp;lt;translate nowrap&amp;gt;&amp;lt;!--T:111--&amp;gt; Converts an array of values in form [0] =&amp;gt; &amp;quot;name=value&amp;quot; into a real associative array in form [name] =&amp;gt; value&amp;lt;/translate&amp;gt;&lt;br /&gt;
 * &amp;lt;translate nowrap&amp;gt;&amp;lt;!--T:113--&amp;gt; If no = is provided, true is assumed like this: [name] =&amp;gt; true&amp;lt;/translate&amp;gt;&lt;br /&gt;
 *&lt;br /&gt;
 * @param array string $options&lt;br /&gt;
 * @return array $results&lt;br /&gt;
 */&lt;br /&gt;
function extractOptions( array $options ) {&lt;br /&gt;
	$results = [];&lt;br /&gt;
	foreach ( $options as $option ) {&lt;br /&gt;
		$pair = array_map( &amp;#039;trim&amp;#039;, explode( &amp;#039;=&amp;#039;, $option, 2 ) );&lt;br /&gt;
		if ( count( $pair ) === 2 ) {&lt;br /&gt;
			$results[ $pair[0] ] = $pair[1];&lt;br /&gt;
		}&lt;br /&gt;
		if ( count( $pair ) === 1 ) {&lt;br /&gt;
			$results[ $pair[0] ] = true;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return $results;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
==See also== &amp;lt;!--T:52--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--T:114--&amp;gt;&lt;br /&gt;
General and related guides:&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:115--&amp;gt; &amp;lt;tvar name=1&amp;gt;{{ll|Manual:Developing extensions}}&amp;lt;/tvar&amp;gt;, or for more general information about extensions, see &amp;lt;tvar name=2&amp;gt;{{ll|Manual:Extensions}}&amp;lt;/tvar&amp;gt; and &amp;lt;tvar name=3&amp;gt;{{ll|Extensions FAQ}}&amp;lt;/tvar&amp;gt;.&amp;lt;/translate&amp;gt;&lt;br /&gt;
* {{ll|Manual:Tag extensions}}&lt;br /&gt;
* {{ll|Manual:Magic words}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:116--&amp;gt; Code:&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* {{ll|Manual:Parser.php}}&lt;br /&gt;
* {{ll|Manual:Hooks/ParserFirstCallInit}}&lt;br /&gt;
* {{ll|Parser function hooks}} – &amp;lt;translate&amp;gt;&amp;lt;!--T:73--&amp;gt; an (incomplete) list of parser functions provided by core and extensions&amp;lt;/translate&amp;gt;&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:66--&amp;gt;&lt;br /&gt;
* The [&amp;lt;tvar name=url&amp;gt;https://github.com/JeroenDeDauw/ParserHooks#parserhooks&amp;lt;/tvar&amp;gt; Parser Hooks] PHP library, which provides an object orientated interface for declarative parser hooks&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* {{ll|Manual:Extension data}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&amp;lt;!--T:117--&amp;gt; Examples:&amp;lt;/translate&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;translate&amp;gt;&amp;lt;!--T:53--&amp;gt; The [[&amp;lt;tvar name=parser-func&amp;gt;Special:MyLanguage/Extension:ParserFunctions&amp;lt;/tvar&amp;gt;|ParserFunctions extension]] is a well-known collection of parser functions.&amp;lt;/translate&amp;gt;&lt;br /&gt;
* {{ll|Help:Extension:ParserFunctions}}&lt;br /&gt;
* {{ll|Category:Parser function extensions}}&lt;br /&gt;
&lt;br /&gt;
{{Extension development}}&lt;br /&gt;
&lt;br /&gt;
[[Category:MediaWiki development{{#translation:}}]]&lt;br /&gt;
[[Category:Parser extensions{{#translation:}}|*]]&lt;br /&gt;
[[Category:Wiki markup{{#translation:}}|Parser functions]]&lt;br /&gt;
[[Category:Customization techniques{{#translation:}}|Parser functions]]&lt;br /&gt;
[[Category:Sample code{{#translation:}}]]&lt;/div&gt;</summary>
		<author><name>en&gt;HyperNervie</name></author>
	</entry>
</feed>