CINXE.COM

Module:parameters - Wiktionary, the free dictionary

<!DOCTYPE html> <html class="client-nojs" lang="en" dir="ltr"> <head> <meta charset="UTF-8"> <title>Module:parameters - Wiktionary, the free dictionary</title> <script>(function(){var className="client-js";var cookie=document.cookie.match(/(?:^|; )enwiktionarymwclientpreferences=([^;]+)/);if(cookie){cookie[1].split('%2C').forEach(function(pref){className=className.replace(new RegExp('(^| )'+pref.replace(/-clientpref-\w+$|[^\w-]+/g,'')+'-clientpref-\\w+( |$)'),'$1'+pref+'$2');});}document.documentElement.className=className;}());RLCONF={"wgBreakFrames":false,"wgSeparatorTransformTable":["",""],"wgDigitTransformTable":["",""],"wgDefaultDateFormat":"dmy","wgMonthNames":["","January","February","March","April","May","June","July","August","September","October","November","December"],"wgRequestId":"90bb49c8-6095-4ab1-b04c-7aeebb14ad16","wgCanonicalNamespace":"Module","wgCanonicalSpecialPageName":false,"wgNamespaceNumber":828,"wgPageName":"Module:parameters","wgTitle":"parameters","wgCurRevisionId":82639508,"wgRevisionId":82639508,"wgArticleId":4797340,"wgIsArticle":true,"wgIsRedirect":false,"wgAction":"view","wgUserName":null,"wgUserGroups":["*"], "wgCategories":["Parameter parsing modules"],"wgPageViewLanguage":"en","wgPageContentLanguage":"en","wgPageContentModel":"Scribunto","wgRelevantPageName":"Module:parameters","wgRelevantArticleId":4797340,"wgIsProbablyEditable":false,"wgRelevantPageIsProbablyEditable":false,"wgRestrictionEdit":["templateeditor"],"wgRestrictionMove":["templateeditor"],"wgNoticeProject":"wiktionary","wgCiteReferencePreviewsActive":true,"wgMediaViewerOnClick":true,"wgMediaViewerEnabledByDefault":true,"wgVisualEditor":{"pageLanguageCode":"en","pageLanguageDir":"ltr","pageVariantFallbacks":"en"},"wgMFDisplayWikibaseDescriptions":{"search":true,"watchlist":true,"tagline":false,"nearby":true},"wgWMESchemaEditAttemptStepOversample":false,"wgWMEPageLength":50000,"wgCentralAuthMobileDomain":false,"wgEditSubmitButtonLabelPublish":true,"wgULSPosition":"interlanguage","wgULSisCompactLinksEnabled":true,"wgVector2022LanguageInHeader":false,"wgULSisLanguageSelectorEmpty":false,"wgWikibaseItemId":"Q33083227", "wgCheckUserClientHintsHeadersJsApi":["brands","architecture","bitness","fullVersionList","mobile","model","platform","platformVersion"]};RLSTATE={"ext.gadget.LanguagesAndScripts":"ready","ext.gadget.Palette":"ready","ext.gadget.Site":"ready","ext.globalCssJs.user.styles":"ready","site.styles":"ready","user.styles":"ready","ext.globalCssJs.user":"ready","user":"ready","user.options":"loading","ext.pygments":"ready","skins.vector.styles.legacy":"ready","ext.visualEditor.desktopArticleTarget.noscript":"ready","codex-search-styles":"ready","ext.uls.interlanguage":"ready","wikibase.client.init":"ready","ext.wikimediaBadges":"ready"};RLPAGEMODULES=["ext.pygments.view","site","mediawiki.page.ready","skins.vector.legacy.js","ext.centralNotice.geoIP","ext.centralNotice.startUp","ext.gadget.LegacyScripts","ext.gadget.DocTabs","ext.gadget.RevdelInfo","ext.gadget.PagePreviews","ext.gadget.Edittools","ext.gadget.defaultVisibilityToggles","ext.gadget.UnsupportedTitles","ext.gadget.WiktGadgetPrefs", "ext.urlShortener.toolbar","ext.centralauth.centralautologin","ext.visualEditor.desktopArticleTarget.init","ext.visualEditor.targetLoader","ext.echo.centralauth","ext.eventLogging","ext.wikimediaEvents","ext.navigationTiming","ext.uls.compactlinks","ext.uls.interface","ext.checkUser.clientHints","wikibase.sidebar.tracking"];</script> <script>(RLQ=window.RLQ||[]).push(function(){mw.loader.impl(function(){return["user.options@12s5i",function($,jQuery,require,module){mw.user.tokens.set({"patrolToken":"+\\","watchToken":"+\\","csrfToken":"+\\"}); }];});});</script> <link rel="stylesheet" href="/w/load.php?lang=en&amp;modules=codex-search-styles%7Cext.pygments%2CwikimediaBadges%7Cext.uls.interlanguage%7Cext.visualEditor.desktopArticleTarget.noscript%7Cskins.vector.styles.legacy%7Cwikibase.client.init&amp;only=styles&amp;skin=vector"> <script async="" src="/w/load.php?lang=en&amp;modules=startup&amp;only=scripts&amp;raw=1&amp;skin=vector"></script> <meta name="ResourceLoaderDynamicStyles" content=""> <link rel="stylesheet" href="/w/load.php?lang=en&amp;modules=ext.gadget.LanguagesAndScripts%2CPalette%2CSite&amp;only=styles&amp;skin=vector"> <link rel="stylesheet" href="/w/load.php?lang=en&amp;modules=site.styles&amp;only=styles&amp;skin=vector"> <meta name="generator" content="MediaWiki 1.44.0-wmf.4"> <meta name="referrer" content="origin"> <meta name="referrer" content="origin-when-cross-origin"> <meta name="robots" content="max-image-preview:standard"> <meta name="format-detection" content="telephone=no"> <meta name="viewport" content="width=1120"> <meta property="og:site_name" content="Wiktionary"> <meta property="og:title" content="Module:parameters - Wiktionary, the free dictionary"> <meta property="og:type" content="website"> <link rel="alternate" media="only screen and (max-width: 640px)" href="//en.m.wiktionary.org/wiki/Module:parameters"> <link rel="apple-touch-icon" href="/static/apple-touch/wiktionary/en.png"> <link rel="icon" href="/static/favicon/wiktionary/en.ico"> <link rel="search" type="application/opensearchdescription+xml" href="/w/rest.php/v1/search" title="Wiktionary (en)"> <link rel="EditURI" type="application/rsd+xml" href="//en.wiktionary.org/w/api.php?action=rsd"> <link rel="canonical" href="https://en.wiktionary.org/wiki/Module:parameters"> <link rel="license" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en"> <link rel="alternate" type="application/atom+xml" title="Wiktionary Atom feed" href="/w/index.php?title=Special:RecentChanges&amp;feed=atom"> <link rel="dns-prefetch" href="//meta.wikimedia.org" /> <link rel="dns-prefetch" href="//login.wikimedia.org"> </head> <body class="skin-vector-legacy mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-828 ns-subject page-Module_parameters rootpage-Module_parameters skin-vector action-view"><div id="mw-page-base" class="noprint"></div> <div id="mw-head-base" class="noprint"></div> <div id="content" class="mw-body" role="main"> <a id="top"></a> <div id="siteNotice"><!-- CentralNotice --></div> <div class="mw-indicators"> </div> <h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-namespace">Module</span><span class="mw-page-title-separator">:</span><span class="mw-page-title-main">parameters</span></h1> <div id="bodyContent" class="vector-body"> <div id="siteSub" class="noprint">From Wiktionary, the free dictionary</div> <div id="contentSub"><div id="mw-content-subtitle"></div></div> <div id="contentSub2"></div> <div id="jump-to-nav"></div> <a class="mw-jump-link" href="#mw-head">Jump to navigation</a> <a class="mw-jump-link" href="#searchInput">Jump to search</a> <div id="mw-content-text" class="mw-body-content"><div class="mw-content-ltr mw-parser-output" lang="en" dir="ltr"><div class="documentation" style="display:block; clear:both"> <hr /> <dl class="plainlinks" style="font-size: smaller;"><dd><i style="font-size: larger;">The following <a href="/wiki/Help:Documenting_templates_and_modules" title="Help:Documenting templates and modules">documentation</a> is located at <a href="/wiki/Module:parameters/documentation" title="Module:parameters/documentation">Module:parameters/documentation</a>. <sup>[<a class="external text" href="https://en.wiktionary.org/w/index.php?title=Module:parameters/documentation&amp;action=edit">edit</a>]</sup></i></dd><dd> <i>Useful links</i>: <a href="/wiki/Special:PrefixIndex/Module:parameters/" title="Special:PrefixIndex/Module:parameters/">subpage list</a> • <a class="external text" href="https://en.wiktionary.org/w/index.php?title=Special%3AWhatLinksHere%2FModule%3Aparameters&amp;hideredirs=1&amp;hidetrans=1">links</a> • <a class="external text" href="https://en.wiktionary.org/w/index.php?title=Special%3AWhatLinksHere%2FModule%3Aparameters&amp;hidelinks=1&amp;hideredirs=1">transclusions</a> • <a href="/w/index.php?title=Module:parameters/testcases&amp;action=edit&amp;redlink=1" class="new" title="Module:parameters/testcases (page does not exist)">testcases</a> • <a href="/wiki/Module:parameters/sandbox" title="Module:parameters/sandbox">sandbox</a> (<a class="external text" href="https://en.wiktionary.org/w/index.php?title=Special%3AComparePages&amp;page1=Module%3Aparameters&amp;page2=Module%3Aparameters%2Fsandbox">diff</a>)</dd></dl> <div class="mw-heading mw-heading2"><h2 id="Exported_functions">Exported functions</h2></div> <p>This module is used to standardize template argument processing and checking. A typical workflow is as follows (based on <a href="/wiki/Module:translations" title="Module:translations">Module:translations</a>): </p> <div class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><pre><span></span> <span class="p">...</span> <span class="kd">local</span> <span class="n">parent_args</span> <span class="o">=</span> <span class="n">frame</span><span class="p">:</span><span class="n">getParent</span><span class="p">().</span><span class="n">args</span> <span class="kd">local</span> <span class="n">params</span> <span class="o">=</span> <span class="p">{</span> <span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="n">required</span> <span class="o">=</span> <span class="kc">true</span><span class="p">,</span> <span class="nb">type</span> <span class="o">=</span> <span class="s2">&quot;language&quot;</span><span class="p">,</span> <span class="n">default</span> <span class="o">=</span> <span class="s2">&quot;und&quot;</span><span class="p">},</span> <span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="kc">true</span><span class="p">,</span> <span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="n">list</span> <span class="o">=</span> <span class="kc">true</span><span class="p">},</span> <span class="p">[</span><span class="s2">&quot;alt&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">true</span><span class="p">,</span> <span class="p">[</span><span class="s2">&quot;id&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">true</span><span class="p">,</span> <span class="p">[</span><span class="s2">&quot;sc&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="nb">type</span> <span class="o">=</span> <span class="s2">&quot;script&quot;</span><span class="p">},</span> <span class="p">[</span><span class="s2">&quot;tr&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">true</span><span class="p">,</span> <span class="p">[</span><span class="s2">&quot;ts&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">true</span><span class="p">,</span> <span class="p">[</span><span class="s2">&quot;lit&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">true</span><span class="p">,</span> <span class="p">}</span> <span class="kd">local</span> <span class="n">args</span> <span class="o">=</span> <span class="nb">require</span><span class="p">(</span><span class="s2">&quot;Module:parameters&quot;</span><span class="p">).</span><span class="n">process</span><span class="p">(</span><span class="n">parent_args</span><span class="p">,</span> <span class="n">params</span><span class="p">)</span> <span class="c1">-- Do further processing of the parsed arguments in &lt;code&gt;args&lt;/code&gt;.</span> <span class="p">...</span> </pre></div> <p>The <code>params</code> table should have the parameter names as the keys, and a (possibly empty) table of parameter tags as the value. An empty table as the value merely states that the parameter exists, but should not receive any special treatment; if desired, empty tables can be replaced with the value <code>true</code> as a perforamnce optimization. </p><p>Possible parameter tags are listed below: </p> <dl><dt><code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="n">required</span> <span class="o">=</span> <span class="kc">true</span></code></dt> <dd>The parameter is required; an error is shown if it is not present. The template's page itself is an exception; no error is shown there.</dd> <dt><code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="n">default</span> <span class="o">=</span></code></dt> <dd>Specifies a default input value for the parameter, if it is absent or empty. This will be processed as though it were the input instead, so (for example) <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="n">default</span> <span class="o">=</span> <span class="s2">&quot;und&quot;</span></code> with the type <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="s2">&quot;language&quot;</span></code> will return a language object for <a href="/wiki/Category:Undetermined_language" title="Category:Undetermined language">Undetermined language</a> if no language code is provided. When used on list parameters, this specifies a default value for the first item in the list only. Note that it is not possible to generate a default that depends on the value of other parameters. If used together with <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="n">required</span> <span class="o">=</span> <span class="kc">true</span></code>, the default applies only to template pages (see the following entry), as a side effect of the fact that "required" parameters aren't actually required on template pages. This can be used to show an example of the template in action when the template page is visited; however, it is preferred to use <code>template_default</code> for this purpose, for clarity.</dd> <dt><code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="n">template_default</span> <span class="o">=</span></code></dt> <dd>Specifies a default input value for absent or empty parameters only on template pages. Template pages are any page in the template space (beginning with <code>Template:</code>) except for documentation pages (those ending in <code>.../documentation</code>). This can be used to provide an example value for a non-required parameter when the template page is visited, without interfering with other uses of the template. Both <code>template_default</code> and <code>default</code> can be specified for the same parameter. If this is done, <code>template_default</code> applies on template pages, and <code>default</code> on other pages. As an example, <code style="white-space:pre-wrap">&#123;&#123;<a href="/wiki/Template:cs-IPA#top" title="Template:cs-IPA">cs-IPA</a>&#125;&#125;</code> uses the equivalent of <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="n">default</span> <span class="o">=</span> <span class="s2">&quot;+&quot;</span><span class="p">,</span> <span class="n">template_default</span> <span class="o">=</span> <span class="s2">&quot;příklad&quot;</span><span class="p">}</span></code> to supply a default of <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="s2">&quot;+&quot;</span></code> for mainspace and documentation pages (which tells the module to use the value of the <code>&#124;pagename=</code> parameter, falling back to the actual pagename), but <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="s2">&quot;příklad&quot;</span></code> (which means "example"), on <a href="/wiki/Template:cs-IPA" title="Template:cs-IPA">Template:cs-IPA</a>.</dd> <dt><code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="n">alias_of</span> <span class="o">=</span></code></dt> <dd>Treat the parameter as an alias of another. When arguments are specified for this parameter, they will automatically be renamed and stored under the alias name. This allows for parameters with multiple alternative names, while still treating them as if they had only one name. The conversion-related properties of an aliased parameter (e.g. <code>type</code>, <code>set</code>, <code>convert</code>, <code>sublist</code>) are taken from the aliasee, and the corrresponding properties set on the alias itself are ignored; but other properties on the alias are taken from the alias's spec and not from the aliasee's spec. This means, for example, that if you create an alias of a list parameter, the alias must also specify the <code>list</code> property or it is not a list. (In such a case, a value specified for the alias goes into the first item of the aliasee's list. You cannot make a list alias of a non-list parameter; this causes an error to be thrown.) Similarly, if you specify <code>separate_no_index</code> on an aliasee but not on the alias, uses of the unindexed aliasee parameter are stored into the <code>.default</code> key, but uses of the unindexed alias are stored into the first numbered key of the aliasee's list. Aliases cannot be required, as this prevents the other name or names of the parameter from being used. Parameters that are aliases and required at the same time cause an error to be thrown.</dd> <dt><code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="n">allow_empty</span> <span class="o">=</span> <span class="kc">true</span></code></dt> <dd>If the argument is an empty string value, it is not converted to <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="kc">nil</span></code>, but kept as-is. The use of <code>allow_empty</code> is disallowed if a type has been specified, and causes an error to be thrown.</dd> <dt><code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="n">no_trim</span> <span class="o">=</span> <span class="kc">true</span></code></dt> <dd>Spacing characters such as spaces and newlines at the beginning and end of a positional parameter are not removed. (MediaWiki itself automatically trims spaces and newlines at the edge of named parameters.) The use of <code>no_trim</code> is disallowed if a type has been specified, and causes an error to be thrown.</dd> <dt><code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="nb">type</span> <span class="o">=</span></code></dt> <dd>Specifies what value type to convert the argument into. The default is to leave it as a text string. Alternatives are: <dl><dt><code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="nb">type</span> <span class="o">=</span> <span class="s2">&quot;boolean&quot;</span></code></dt> <dd>The value is treated as a boolean value, either true or false. No value, the empty string, and the strings <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="s2">&quot;0&quot;</span></code>, <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="s2">&quot;no&quot;</span></code>, <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="s2">&quot;n&quot;</span></code> and <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="s2">&quot;false&quot;</span></code> are treated as <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="kc">false</span></code>, all other values are considered <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="kc">true</span></code>.</dd> <dt><code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="nb">type</span> <span class="o">=</span> <span class="s2">&quot;number&quot;</span></code></dt> <dd>The value is converted into a number, and throws an error if the value is not parsable as a number. Input values may be signed (<code>+</code> or <code>-</code>), and may contain decimal points and leading zeroes. If <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="n">allow_hex</span> <span class="o">=</span> <span class="kc">true</span></code>, then hexadecimal values in the form <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="s2">&quot;0x100&quot;</span></code> may optionally be used instead, which otherwise have the same syntax restrictions (including signs, decimal digits, and leading zeroes after <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="s2">&quot;0x&quot;</span></code>). Hexadecimal inputs are not case-sensitive. Lua's special number values (<code>inf</code> and <code>nan</code>) are not possible inputs.</dd> <dt><code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="nb">type</span> <span class="o">=</span> <span class="s2">&quot;language&quot;</span></code></dt> <dd>The value is interpreted as a full or <a href="/wiki/Wiktionary:Languages#Etymology-only_languages" title="Wiktionary:Languages">etymology-only language</a> code language code (or name, if <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="n">method</span> <span class="o">=</span> <span class="s2">&quot;name&quot;</span></code>) and converted into the corresponding object (see <a href="/wiki/Module:languages" title="Module:languages">Module:languages</a>). If the code or name is invalid, then an error is thrown. The additional setting <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="n">family</span> <span class="o">=</span> <span class="kc">true</span></code> can be given to allow <a href="/wiki/Wiktionary:Language_families" title="Wiktionary:Language families">language family codes</a> to be considered valid and the corresponding object returned. Note that to distinguish an etymology-only language object from a full language object, use <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="n">object</span><span class="p">:</span><span class="n">hasType</span><span class="p">(</span><span class="s2">&quot;language&quot;</span><span class="p">,</span> <span class="s2">&quot;etymology-only&quot;</span><span class="p">)</span></code>.</dd> <dt><code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="nb">type</span> <span class="o">=</span> <span class="s2">&quot;full language&quot;</span></code></dt> <dd>The value is interpreted as a full language code (or name, if <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="n">method</span> <span class="o">=</span> <span class="s2">&quot;name&quot;</span></code>) and converted into the corresponding object (see <a href="/wiki/Module:languages" title="Module:languages">Module:languages</a>). If the code or name is invalid, then an error is thrown. Etymology-only languages are not allowed. The additional setting <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="n">family</span> <span class="o">=</span> <span class="kc">true</span></code> can be given to allow <a href="/wiki/Wiktionary:Language_families" title="Wiktionary:Language families">language family codes</a> to be considered valid and the corresponding object returned.</dd> <dt><code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="nb">type</span> <span class="o">=</span> <span class="s2">&quot;wikimedia language&quot;</span></code></dt> <dd>The value is interpreted as a code and converted into a wikimedia language object. If the code is invalid, then an error is thrown. If <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="n">method</span> <span class="o">=</span> <span class="s2">&quot;fallback&quot;</span></code> is specified, conventional language codes which are different from their Wikimedia equivalent will also be accepted as a fallback.</dd> <dt><code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="nb">type</span> <span class="o">=</span> <span class="s2">&quot;family&quot;</span></code></dt> <dd>The value is interpreted as a language family code (or name, if <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="n">method</span> <span class="o">=</span> <span class="s2">&quot;name&quot;</span></code>) and converted into the corresponding object (see <a href="/wiki/Module:families" title="Module:families">Module:families</a>). If the code or name is invalid, then an error is thrown.</dd> <dt><code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="nb">type</span> <span class="o">=</span> <span class="s2">&quot;script&quot;</span></code></dt> <dd>The value is interpreted as a script code (or name, if <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="n">method</span> <span class="o">=</span> <span class="s2">&quot;name&quot;</span></code>) and converted into the corresponding object (see <a href="/wiki/Module:scripts" title="Module:scripts">Module:scripts</a>). If the code or name is invalid, then an error is thrown.</dd> <dt><code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="nb">type</span> <span class="o">=</span> <span class="s2">&quot;title&quot;</span></code></dt> <dd>The value is interpreted as a page title and converted into the corresponding object (see the <a href="https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Title_library" class="extiw" title="mw:Extension:Scribunto/Lua reference manual">Title library</a>). If the page title is invalid, then an error is thrown. If <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="n">namespace</span> <span class="o">=</span> <span class="n">n</span></code> (where <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="n">n</span></code> is a namespace number), then the title object will be in that namespace unless overridden by a namespace prefix in the value; this is the way that template invocations work, where the template namespace is used by default, but can be overridden. If <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="n">strict</span> <span class="o">=</span> <span class="kc">true</span></code>, then the namespace prefix is unconditionally added to the value in all cases, even if a prefix is already present; this is way that <code style="white-space:pre-wrap">&#123;&#123;<a href="https://www.mediawiki.org/wiki/Extension:Scribunto#Usage" class="extiw" title="mw:Extension:Scribunto">#invoke</a>&#58;&#125;&#125;</code> works, where the "Module:" prefix is always appended no matter what.</dd> <dt><code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="nb">type</span> <span class="o">=</span> <span class="s2">&quot;qualifier&quot;</span></code></dt> <dd>The value is interpreted as a qualifier and converted into the correct format for passing into <code>format_qualifiers()</code> in <a href="/wiki/Module:qualifier" title="Module:qualifier">Module:qualifier</a> (which currently just means converting it to a one-item list).</dd> <dt><code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="nb">type</span> <span class="o">=</span> <span class="s2">&quot;labels&quot;</span></code></dt> <dd>The value is interpreted as a comma-separated list of labels and converted into the correct format for passing into <code>show_labels()</code> in <a href="/wiki/Module:labels" title="Module:labels">Module:labels</a> (which is currently a list of strings). Splitting is done on commas not followed by whitespace, except that commas inside of double angle brackets do not count even if not followed by whitespace. This type should be used by for normal labels (typically specified using <code>&#124;l=</code> or <code>&#124;ll=</code>) and accent qualifiers (typically specified using <code>&#124;a=</code> and <code>&#124;aa=</code>).</dd> <dt><code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="nb">type</span> <span class="o">=</span> <span class="s2">&quot;references&quot;</span></code></dt> <dd>The value is interpreted as one or more references, in the format prescribed by <code>parse_references()</code> in <a href="/wiki/Module:references" title="Module:references">Module:references</a>, and converted into a list of objects of the form accepted by <code>format_references()</code> in the same module. If a syntax error is found in the reference format, an error is thrown.</dd> <dt><code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="nb">type</span> <span class="o">=</span> <span class="kr">function</span><span class="p">(</span><span class="n">val</span><span class="p">)</span> <span class="p">...</span> <span class="kr">end</span></code></dt> <dd><code>type</code> may be set to a function (or callable table), which must take the argument value as its sole argument, and must output one of the other recognized types. This is particularly useful for lists (see below), where certain values need to be interpreted differently to others.</dd></dl></dd></dl> <dl><dt><code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="n">list</span> <span class="o">=</span></code></dt> <dd>Treat the parameter as a list of values, each having its own parameter name, rather than a single value. The parameters will have a number at the end, except optionally for the first (but see also <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="n">require_index</span> <span class="o">=</span> <span class="kc">true</span></code>). For example, <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="n">list</span> <span class="o">=</span> <span class="kc">true</span></code> on a parameter named "head" will include the parameters <code>&#124;head=</code> (or <code>&#124;head1=</code>), <code>&#124;head2=</code>, <code>&#124;head3=</code> and so on. If the parameter name is a number, another number doesn't get appended, but the counting simply continues, e.g. for parameter <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="mi">3</span></code> the sequence is <code>&#124;3=</code>, <code>&#124;4=</code>, <code>&#124;5=</code> etc. List parameters are returned as numbered lists, so for a template that is given the parameters <code>|head=a|head2=b|head3=c</code>, the processed value of the parameter <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="s2">&quot;head&quot;</span></code> will be <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="p">{</span> <span class="s2">&quot;a&quot;</span><span class="p">,</span> <span class="s2">&quot;b&quot;</span><span class="p">,</span> <span class="s2">&quot;c&quot;</span> <span class="p">}</span></code>}.</dd> <dd>The value for <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="n">list</span> <span class="o">=</span></code> can also be a string. This tells the module that parameters other than the first should have a different name, which is useful when the first parameter in a list is a number, but the remainder is named. An example would be for genders: <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="n">list</span> <span class="o">=</span> <span class="s2">&quot;g&quot;</span></code> on a parameter named <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="mi">1</span></code> would have parameters <code>&#124;1=</code>, <code>&#124;g2=</code>, <code>&#124;g3=</code> etc.</dd> <dd>If the number is not located at the end, it can be specified by putting <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="s2">&quot;</span><span class="se">\1</span><span class="s2">&quot;</span></code> at the number position. For example, parameters <code>&#124;f1accel=</code>, <code>&#124;f2accel=</code>, ... can be captured by using the parameter name <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="s2">&quot;f</span><span class="se">\1</span><span class="s2">accel&quot;</span></code>, as is done in <a href="/wiki/Module:headword/templates" title="Module:headword/templates">Module:headword/templates</a>.</dd> <dt><code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="n">set</span> <span class="o">=</span></code></dt> <dd>Require that the value of the parameter be one of the specified list of values (or omitted, if <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="n">required</span> <span class="o">=</span> <span class="kc">true</span></code> isn't given). The values in the specified list should be strings corresponding to the raw parameter values except when <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="nb">type</span> <span class="o">=</span> <span class="s2">&quot;number&quot;</span></code>, in which case they should be numbers. The use of <code>set</code> is disallowed if <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="nb">type</span> <span class="o">=</span> <span class="s2">&quot;boolean&quot;</span></code> and causes an error to be thrown.</dd> <dt><code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="n">sublist</span> <span class="o">=</span></code></dt> <dd>The value of the parameter is a delimiter-separated list of individual raw values. The resulting field in <code>args</code> will be a Lua list (i.e. a table with numeric indices) of the converted values. If <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="n">sublist</span> <span class="o">=</span> <span class="kc">true</span></code> is given, the values will be split on commas (possibly with whitespace on one or both sides of the comma, which is ignored). If <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="n">sublist</span> <span class="o">=</span> <span class="s2">&quot;comma without whitespace&quot;</span></code> is given, the values will be split on commas which are not followed by whitespace, and which aren't preceded by an escaping backslash. Otherwise, the value of <code>sublist</code> should be either a Lua pattern specifying the delimiter(s) to split on or a function (or callable table) to do the splitting, which is passed two values (the value to split and a function to signal an error) and should return a list of the split values.</dd> <dt><code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="n">convert</span> <span class="o">=</span></code></dt> <dd>If given, this specifies a function (or callable table) to convert the raw parameter value into the Lua object used during further processing. The function is passed two arguments, the raw parameter value itself and a function used to signal an error during parsing or conversion, and should return one value, the converted parameter. The error-signaling function contains the name and raw value of the parameter embedded into the message it generates, so these do not need to specified in the message passed into it. If <code>type</code> is specified in conjunction with <code>convert</code>, the processing by <code>type</code> happens first. If <code>sublist</code> is given in conjunction with <code>convert</code>, the raw parameter value will be split appropriately and <code>convert</code> called on each resulting item.</dd> <dt><code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="n">allow_hex</span> <span class="o">=</span> <span class="kc">true</span></code></dt> <dd>When used in conjunction with <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="nb">type</span> <span class="o">=</span> <span class="s2">&quot;number&quot;</span></code>, allows hexadecimal numbers as inputs, in the format <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="s2">&quot;0x100&quot;</span></code> (which is not case-sensitive).</dd> <dt><code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="n">family</span> <span class="o">=</span> <span class="kc">true</span></code></dt> <dd>When used in conjunction with <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="nb">type</span> <span class="o">=</span> <span class="s2">&quot;language&quot;</span></code>, allows <a href="/wiki/Wiktionary:Language_families" title="Wiktionary:Language families">language family codes</a> to be returned. To check if a given object refers to a language family, use <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="n">object</span><span class="p">:</span><span class="n">hasType</span><span class="p">(</span><span class="s2">&quot;family&quot;</span><span class="p">)</span></code>.</dd> <dt><code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="n">method</span> <span class="o">=</span> <span class="s2">&quot;name&quot;</span></code></dt> <dd>When used in conjunction with <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="nb">type</span> <span class="o">=</span> <span class="s2">&quot;language&quot;</span></code>, <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="nb">type</span> <span class="o">=</span> <span class="s2">&quot;family&quot;</span></code> or <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="nb">type</span> <span class="o">=</span> <span class="s2">&quot;script&quot;</span></code>, checks for and parses a language, family or script name instead of a code.</dd> <dt><code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="n">allow_holes</span> <span class="o">=</span> <span class="kc">true</span></code></dt> <dd>This is used in conjunction with list-type parameters. By default, the values are tightly packed in the resulting list. This means that if, for example, an entry specified <code>head=a|head3=c</code> but not <code>&#124;head2=</code>, the returned list will be <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="p">{</span><span class="s2">&quot;a&quot;</span><span class="p">,</span> <span class="s2">&quot;c&quot;</span><span class="p">}</span></code>}, with the values stored at the indices <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="mi">1</span></code> and <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="mi">2</span></code>, not <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="mi">1</span></code> and <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="mi">3</span></code>. If it is desirable to keep the numbering intact, for example if the numbers of several list parameters correlate with each other (like those of <code style="white-space:pre-wrap">&#123;&#123;<a href="/wiki/Template:affix#top" title="Template:affix">affix</a>&#125;&#125;</code>), then this tag should be specified.</dd> <dd>If <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="n">allow_holes</span> <span class="o">=</span> <span class="kc">true</span></code> is given, there may be <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="kc">nil</span></code> values in between two real values, which makes many of Lua's table processing functions no longer work, like <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="o">#</span></code> or <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="nb">ipairs</span><span class="p">()</span></code>. To remedy this, the resulting table will contain an additional named value, <code>maxindex</code>, which tells you the highest numeric index that is present in the table. In the example above, the resulting table will now be <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="p">{</span> <span class="s2">&quot;a&quot;</span><span class="p">,</span> <span class="kc">nil</span><span class="p">,</span> <span class="s2">&quot;c&quot;</span><span class="p">,</span> <span class="n">maxindex</span> <span class="o">=</span> <span class="mi">3</span><span class="p">}</span></code>}. That way, you can iterate over the values from <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="mi">1</span></code> to <code>maxindex</code>, while skipping <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="kc">nil</span></code> values in between.</dd> <dt><code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="n">disallow_holes</span> <span class="o">=</span> <span class="kc">true</span></code></dt> <dd>This is used in conjunction with list-type parameters. As mentioned above, normally if there is a hole in the source arguments, e.g. <code>head=a|head3=c</code> but not <code>&#124;head2=</code>, it will be removed in the returned list. If <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="n">disallow_holes</span> <span class="o">=</span> <span class="kc">true</span></code> is specified, however, an error is thrown in such a case. This should be used whenever there are multiple list-type parameters that need to line up (e.g. both <code>&#124;head=</code> and <code>&#124;tr=</code> are available and <code>&#124;head3=</code> lines up with <code>&#124;tr3=</code>), unless <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="n">allow_holes</span> <span class="o">=</span> <span class="kc">true</span></code> is given and you are prepared to handle the holes in the returned lists.</dd> <dt><code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="n">require_index</span> <span class="o">=</span> <span class="kc">true</span></code></dt> <dd>This is used in conjunction with list-type parameters. By default, the first parameter can have its index omitted. For example, a list parameter named <code>head</code> can have its first parameter specified as either <code>&#124;head=</code> or <code>&#124;head1=</code>. If <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="n">require_index</span> <span class="o">=</span> <span class="kc">true</span></code> is specified, however, only <code>&#124;head1=</code> is recognized, and <code>&#124;head=</code> will be treated as an unknown parameter. <code style="white-space:pre-wrap">&#123;&#123;<a href="/wiki/Template:affixusex#top" title="Template:affixusex">affixusex</a>&#125;&#125;</code> (and variants <code style="white-space:pre-wrap">&#123;&#123;<a href="/wiki/Template:suffixusex#top" title="Template:suffixusex">suffixusex</a>&#125;&#125;</code>, <code style="white-space:pre-wrap">&#123;&#123;<a href="/wiki/Template:prefixusex#top" title="Template:prefixusex">prefixusex</a>&#125;&#125;</code>) use this, for example, on all list parameters.</dd> <dt><code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="n">separate_no_index</span> <span class="o">=</span> <span class="kc">true</span></code></dt> <dd>This is used to distinguish between <code>&#124;head=</code> and <code>&#124;head1=</code> as different parameters. For example, in <code style="white-space:pre-wrap">&#123;&#123;<a href="/wiki/Template:affixusex#top" title="Template:affixusex">affixusex</a>&#125;&#125;</code>, to distinguish between <code>&#124;sc=</code> (a script code for all elements in the usex's language) and <code>&#124;sc1=</code> (the script code of the first element, used when the first element is prefixed with a language code to indicate that it is in a different language). When this is used, the resulting table will contain an additional named value, <code>default</code>, which contains the value for the indexless argument.</dd> <dt><code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="n">demo</span> <span class="o">=</span> <span class="kc">true</span></code></dt> <dd>This is used as a way to ensure that the parameter is only enabled on the template's own page (and its documentation page), and in the User: namespace; otherwise, it will be treated as an unknown parameter. This should only be used if special settings are required to showcase a template in its documentation (e.g. adjusting the pagename or disabling categorization). In most cases, it should be possible to do this without using demo parameters, but they may be required if a template/documentation page also contains real uses of the same template as well (e.g. <code style="white-space:pre-wrap">&#123;&#123;<a href="/wiki/Template:shortcut#top" title="Template:shortcut">shortcut</a>&#125;&#125;</code>), as a way to distinguish them.</dd></dl> <div class="mw-heading mw-heading3"><h3 id="export.convert_val">export.convert_val</h3></div> <p><code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="kr">function</span> <span class="nc">export</span><span class="p">.</span><span class="nf">convert_val</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">param</span><span class="p">)</span></code> </p><p>Convert a parameter value according to the associated specs listed in the <code>params</code> table passed to <a class="mw-selflink selflink">Module:parameters</a>. <code>val</code> is the value to convert for a parameter whose name is <code>name</code> (used only in error messages). <code>param</code> is the spec (the value part of the <code>params</code> table for the parameter). In place of passing in the parameter name, <code>name</code> can be a function that throws an error, displaying the specified message along with the parameter name and value. This function processes all the conversion-related fields in <code>param</code>, including <code>type</code>, <code>set</code>, <code>sublist</code>, <code>convert</code>, etc. It returns the converted value. </p> <div class="mw-heading mw-heading3"><h3 id="export.process">export.process</h3></div> <p><code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="kr">function</span> <span class="nc">export</span><span class="p">.</span><span class="nf">process</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">params</span><span class="p">,</span> <span class="n">return_unknown</span><span class="p">)</span></code> </p><p>Process arguments with a given list of parameters. Return a table containing the processed arguments. The <code>args</code> parameter specifies the arguments to be processed; they are the arguments you might retrieve from <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="n">frame</span><span class="p">:</span><span class="n">getParent</span><span class="p">().</span><span class="n">args</span></code> (the template arguments) or in some cases <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="n">frame</span><span class="p">.</span><span class="n">args</span></code> (the invocation arguments). The <code>params</code> parameter specifies a list of valid parameters, and consists of a table. If an argument is encountered that is not in the parameter table, an error is thrown. </p><p>The structure of the <code>params</code> table is as described above in the intro comment. </p><p><b>WARNING:</b> The <code>params</code> table is destructively modified to save memory. Nonetheless, different keys can share the same value objects in memory without causing problems. </p><p>The <code>return_unknown</code> parameter, if set to <code class="mw-highlight mw-highlight-lang-lua mw-content-ltr" dir="ltr"><span class="kc">true</span></code>, prevents the function from triggering an error when it comes across an argument with a name that it doesn't recognise. Instead, the return value is a pair of values: the first is the processed arguments as usual, while the second contains all the unrecognised arguments that were left unprocessed. This allows you to do multi-stage processing, where the entire set of arguments that a template should accept is not known at once. For example, an inflection-table might do some generic processing on some arguments, but then defer processing of the remainder to the function that handles a specific inflectional type. </p> <br style="clear: both;" /></div> <div class="mw-highlight mw-highlight-lang-lua mw-content-ltr mw-highlight-lines" dir="ltr"><pre><span></span><span id="L-1"><a href="#L-1"><span class="linenos" data-line="1"></span></a><span class="kd">local</span> <span class="n">export</span> <span class="o">=</span> <span class="p">{}</span> </span><span id="L-2"><a href="#L-2"><span class="linenos" data-line="2"></span></a> </span><span id="L-3"><a href="#L-3"><span class="linenos" data-line="3"></span></a><span class="kd">local</span> <span class="n">debug_track_module</span> <span class="o">=</span> <span class="s2">&quot;Module:debug/track&quot;</span> </span><span id="L-4"><a href="#L-4"><span class="linenos" data-line="4"></span></a><span class="kd">local</span> <span class="n">families_module</span> <span class="o">=</span> <span class="s2">&quot;Module:families&quot;</span> </span><span id="L-5"><a href="#L-5"><span class="linenos" data-line="5"></span></a><span class="kd">local</span> <span class="n">function_module</span> <span class="o">=</span> <span class="s2">&quot;Module:fun&quot;</span> </span><span id="L-6"><a href="#L-6"><span class="linenos" data-line="6"></span></a><span class="kd">local</span> <span class="n">labels_module</span> <span class="o">=</span> <span class="s2">&quot;Module:labels&quot;</span> </span><span id="L-7"><a href="#L-7"><span class="linenos" data-line="7"></span></a><span class="kd">local</span> <span class="n">languages_module</span> <span class="o">=</span> <span class="s2">&quot;Module:languages&quot;</span> </span><span id="L-8"><a href="#L-8"><span class="linenos" data-line="8"></span></a><span class="kd">local</span> <span class="n">pages_module</span> <span class="o">=</span> <span class="s2">&quot;Module:pages&quot;</span> </span><span id="L-9"><a href="#L-9"><span class="linenos" data-line="9"></span></a><span class="kd">local</span> <span class="n">parse_utilities_module</span> <span class="o">=</span> <span class="s2">&quot;Module:parse utilities&quot;</span> </span><span id="L-10"><a href="#L-10"><span class="linenos" data-line="10"></span></a><span class="kd">local</span> <span class="n">references_module</span> <span class="o">=</span> <span class="s2">&quot;Module:references&quot;</span> </span><span id="L-11"><a href="#L-11"><span class="linenos" data-line="11"></span></a><span class="kd">local</span> <span class="n">scripts_module</span> <span class="o">=</span> <span class="s2">&quot;Module:scripts&quot;</span> </span><span id="L-12"><a href="#L-12"><span class="linenos" data-line="12"></span></a><span class="kd">local</span> <span class="n">string_utilities_module</span> <span class="o">=</span> <span class="s2">&quot;Module:string utilities&quot;</span> </span><span id="L-13"><a href="#L-13"><span class="linenos" data-line="13"></span></a><span class="kd">local</span> <span class="n">table_module</span> <span class="o">=</span> <span class="s2">&quot;Module:table&quot;</span> </span><span id="L-14"><a href="#L-14"><span class="linenos" data-line="14"></span></a><span class="kd">local</span> <span class="n">wikimedia_languages_module</span> <span class="o">=</span> <span class="s2">&quot;Module:wikimedia languages&quot;</span> </span><span id="L-15"><a href="#L-15"><span class="linenos" data-line="15"></span></a> </span><span id="L-16"><a href="#L-16"><span class="linenos" data-line="16"></span></a><span class="kd">local</span> <span class="nb">require</span> <span class="o">=</span> <span class="nb">require</span> </span><span id="L-17"><a href="#L-17"><span class="linenos" data-line="17"></span></a><span class="kd">local</span> <span class="n">require_when_needed</span> <span class="o">=</span> <span class="nb">require</span><span class="p">(</span><span class="s2">&quot;Module:require when needed&quot;</span><span class="p">)</span> </span><span id="L-18"><a href="#L-18"><span class="linenos" data-line="18"></span></a> </span><span id="L-19"><a href="#L-19"><span class="linenos" data-line="19"></span></a><span class="kd">local</span> <span class="n">m_str_utils</span> <span class="o">=</span> <span class="nb">require</span><span class="p">(</span><span class="n">string_utilities_module</span><span class="p">)</span> </span><span id="L-20"><a href="#L-20"><span class="linenos" data-line="20"></span></a> </span><span id="L-21"><a href="#L-21"><span class="linenos" data-line="21"></span></a><span class="kd">local</span> <span class="n">dump</span> <span class="o">=</span> <span class="n">mw</span><span class="p">.</span><span class="n">dumpObject</span> </span><span id="L-22"><a href="#L-22"><span class="linenos" data-line="22"></span></a><span class="kd">local</span> <span class="n">find</span> <span class="o">=</span> <span class="nb">string.find</span> </span><span id="L-23"><a href="#L-23"><span class="linenos" data-line="23"></span></a><span class="kd">local</span> <span class="n">floor</span> <span class="o">=</span> <span class="nb">math.floor</span> </span><span id="L-24"><a href="#L-24"><span class="linenos" data-line="24"></span></a><span class="kd">local</span> <span class="n">gsplit</span> <span class="o">=</span> <span class="n">m_str_utils</span><span class="p">.</span><span class="n">gsplit</span> </span><span id="L-25"><a href="#L-25"><span class="linenos" data-line="25"></span></a><span class="kd">local</span> <span class="n">gsub</span> <span class="o">=</span> <span class="nb">string.gsub</span> </span><span id="L-26"><a href="#L-26"><span class="linenos" data-line="26"></span></a><span class="kd">local</span> <span class="n">huge</span> <span class="o">=</span> <span class="nb">math.huge</span> </span><span id="L-27"><a href="#L-27"><span class="linenos" data-line="27"></span></a><span class="kd">local</span> <span class="n">insert</span> <span class="o">=</span> <span class="nb">table.insert</span> </span><span id="L-28"><a href="#L-28"><span class="linenos" data-line="28"></span></a><span class="kd">local</span> <span class="nb">ipairs</span> <span class="o">=</span> <span class="nb">ipairs</span> </span><span id="L-29"><a href="#L-29"><span class="linenos" data-line="29"></span></a><span class="kd">local</span> <span class="n">is_callable</span> <span class="o">=</span> <span class="nb">require</span><span class="p">(</span><span class="n">function_module</span><span class="p">).</span><span class="n">is_callable</span> </span><span id="L-30"><a href="#L-30"><span class="linenos" data-line="30"></span></a><span class="kd">local</span> <span class="n">is_valid_title</span> <span class="o">=</span> <span class="n">require_when_needed</span><span class="p">(</span><span class="n">pages_module</span><span class="p">,</span> <span class="s2">&quot;is_valid_title&quot;</span><span class="p">)</span> </span><span id="L-31"><a href="#L-31"><span class="linenos" data-line="31"></span></a><span class="kd">local</span> <span class="n">list_to_set</span> <span class="o">=</span> <span class="n">require_when_needed</span><span class="p">(</span><span class="n">table_module</span><span class="p">,</span> <span class="s2">&quot;listToSet&quot;</span><span class="p">)</span> </span><span id="L-32"><a href="#L-32"><span class="linenos" data-line="32"></span></a><span class="kd">local</span> <span class="n">list_to_text</span> <span class="o">=</span> <span class="n">mw</span><span class="p">.</span><span class="n">text</span><span class="p">.</span><span class="n">listToText</span> </span><span id="L-33"><a href="#L-33"><span class="linenos" data-line="33"></span></a><span class="kd">local</span> <span class="n">make_title</span> <span class="o">=</span> <span class="n">mw</span><span class="p">.</span><span class="n">title</span><span class="p">.</span><span class="n">makeTitle</span> </span><span id="L-34"><a href="#L-34"><span class="linenos" data-line="34"></span></a><span class="kd">local</span> <span class="n">match</span> <span class="o">=</span> <span class="nb">string.match</span> </span><span id="L-35"><a href="#L-35"><span class="linenos" data-line="35"></span></a><span class="kd">local</span> <span class="n">max</span> <span class="o">=</span> <span class="nb">math.max</span> </span><span id="L-36"><a href="#L-36"><span class="linenos" data-line="36"></span></a><span class="kd">local</span> <span class="n">new_title</span> <span class="o">=</span> <span class="n">mw</span><span class="p">.</span><span class="n">title</span><span class="p">.</span><span class="n">new</span> </span><span id="L-37"><a href="#L-37"><span class="linenos" data-line="37"></span></a><span class="kd">local</span> <span class="nb">pairs</span> <span class="o">=</span> <span class="nb">pairs</span> </span><span id="L-38"><a href="#L-38"><span class="linenos" data-line="38"></span></a><span class="kd">local</span> <span class="n">pattern_escape</span> <span class="o">=</span> <span class="n">m_str_utils</span><span class="p">.</span><span class="n">pattern_escape</span> </span><span id="L-39"><a href="#L-39"><span class="linenos" data-line="39"></span></a><span class="kd">local</span> <span class="nb">rawset</span> <span class="o">=</span> <span class="nb">rawset</span> </span><span id="L-40"><a href="#L-40"><span class="linenos" data-line="40"></span></a><span class="kd">local</span> <span class="n">remove_holes</span> <span class="o">=</span> <span class="n">require_when_needed</span><span class="p">(</span><span class="s2">&quot;Module:parameters/remove holes&quot;</span><span class="p">)</span> </span><span id="L-41"><a href="#L-41"><span class="linenos" data-line="41"></span></a><span class="kd">local</span> <span class="n">rsplit</span> <span class="o">=</span> <span class="n">m_str_utils</span><span class="p">.</span><span class="n">split</span> </span><span id="L-42"><a href="#L-42"><span class="linenos" data-line="42"></span></a><span class="kd">local</span> <span class="n">scribunto_param_key</span> <span class="o">=</span> <span class="n">m_str_utils</span><span class="p">.</span><span class="n">scribunto_param_key</span> </span><span id="L-43"><a href="#L-43"><span class="linenos" data-line="43"></span></a><span class="kd">local</span> <span class="n">sort</span> <span class="o">=</span> <span class="nb">table.sort</span> </span><span id="L-44"><a href="#L-44"><span class="linenos" data-line="44"></span></a><span class="kd">local</span> <span class="n">split_on_comma</span> <span class="o">=</span> <span class="n">require_when_needed</span><span class="p">(</span><span class="n">parse_utilities_module</span><span class="p">,</span> <span class="s2">&quot;split_on_comma&quot;</span><span class="p">)</span> </span><span id="L-45"><a href="#L-45"><span class="linenos" data-line="45"></span></a><span class="kd">local</span> <span class="nb">tonumber</span> <span class="o">=</span> <span class="nb">tonumber</span> </span><span id="L-46"><a href="#L-46"><span class="linenos" data-line="46"></span></a><span class="kd">local</span> <span class="nb">tostring</span> <span class="o">=</span> <span class="nb">tostring</span> </span><span id="L-47"><a href="#L-47"><span class="linenos" data-line="47"></span></a><span class="kd">local</span> <span class="n">trim</span> <span class="o">=</span> <span class="n">m_str_utils</span><span class="p">.</span><span class="n">trim</span> </span><span id="L-48"><a href="#L-48"><span class="linenos" data-line="48"></span></a><span class="kd">local</span> <span class="nb">type</span> <span class="o">=</span> <span class="nb">type</span> </span><span id="L-49"><a href="#L-49"><span class="linenos" data-line="49"></span></a><span class="kd">local</span> <span class="n">yesno</span> <span class="o">=</span> <span class="n">require_when_needed</span><span class="p">(</span><span class="s2">&quot;Module:yesno&quot;</span><span class="p">)</span> </span><span id="L-50"><a href="#L-50"><span class="linenos" data-line="50"></span></a> </span><span id="L-51"><a href="#L-51"><span class="linenos" data-line="51"></span></a><span class="kd">local</span> <span class="n">current_title</span> <span class="c1">-- Current title.</span> </span><span id="L-52"><a href="#L-52"><span class="linenos" data-line="52"></span></a><span class="kd">local</span> <span class="n">current_namespace</span> <span class="c1">-- Current namespace.</span> </span><span id="L-53"><a href="#L-53"><span class="linenos" data-line="53"></span></a><span class="kd">local</span> <span class="n">frame_title</span> <span class="c1">-- Title of the originating module.</span> </span><span id="L-54"><a href="#L-54"><span class="linenos" data-line="54"></span></a><span class="kd">local</span> <span class="n">parent_frame_title</span> <span class="c1">-- Title of the page containing {{#invoke:}} (if any).</span> </span><span id="L-55"><a href="#L-55"><span class="linenos" data-line="55"></span></a><span class="kd">local</span> <span class="n">is_invoke_page</span> <span class="c1">-- Whether the current title is either of those titles.</span> </span><span id="L-56"><a href="#L-56"><span class="linenos" data-line="56"></span></a><span class="kr">do</span> </span><span id="L-57"><a href="#L-57"><span class="linenos" data-line="57"></span></a> <span class="kd">local</span> <span class="n">page_title_obj</span> <span class="o">=</span> <span class="n">mw</span><span class="p">.</span><span class="n">title</span><span class="p">.</span><span class="n">getCurrentTitle</span><span class="p">()</span> </span><span id="L-58"><a href="#L-58"><span class="linenos" data-line="58"></span></a> <span class="n">current_title</span> <span class="o">=</span> <span class="n">page_title_obj</span><span class="p">.</span><span class="n">prefixedText</span> </span><span id="L-59"><a href="#L-59"><span class="linenos" data-line="59"></span></a> <span class="n">current_namespace</span> <span class="o">=</span> <span class="n">page_title_obj</span><span class="p">.</span><span class="n">namespace</span> </span><span id="L-60"><a href="#L-60"><span class="linenos" data-line="60"></span></a> </span><span id="L-61"><a href="#L-61"><span class="linenos" data-line="61"></span></a> <span class="kd">local</span> <span class="n">frame</span> <span class="o">=</span> <span class="n">mw</span><span class="p">.</span><span class="n">getCurrentFrame</span><span class="p">()</span> </span><span id="L-62"><a href="#L-62"><span class="linenos" data-line="62"></span></a> <span class="n">frame_title</span> <span class="o">=</span> <span class="n">frame</span><span class="p">:</span><span class="n">getTitle</span><span class="p">()</span> </span><span id="L-63"><a href="#L-63"><span class="linenos" data-line="63"></span></a> </span><span id="L-64"><a href="#L-64"><span class="linenos" data-line="64"></span></a> <span class="kd">local</span> <span class="n">parent_frame</span> <span class="o">=</span> <span class="n">frame</span><span class="p">:</span><span class="n">getParent</span><span class="p">()</span> </span><span id="L-65"><a href="#L-65"><span class="linenos" data-line="65"></span></a> <span class="kr">if</span> <span class="n">parent_frame</span> <span class="kr">then</span> </span><span id="L-66"><a href="#L-66"><span class="linenos" data-line="66"></span></a> <span class="n">parent_frame_title</span> <span class="o">=</span> <span class="n">parent_frame</span><span class="p">:</span><span class="n">getTitle</span><span class="p">()</span> </span><span id="L-67"><a href="#L-67"><span class="linenos" data-line="67"></span></a> <span class="kr">end</span> </span><span id="L-68"><a href="#L-68"><span class="linenos" data-line="68"></span></a> </span><span id="L-69"><a href="#L-69"><span class="linenos" data-line="69"></span></a> <span class="n">is_invoke_page</span> <span class="o">=</span> <span class="n">current_title</span> <span class="o">==</span> <span class="n">frame_title</span> <span class="ow">or</span> <span class="n">current_title</span> <span class="o">==</span> <span class="n">parent_frame_title</span> </span><span id="L-70"><a href="#L-70"><span class="linenos" data-line="70"></span></a><span class="kr">end</span> </span><span id="L-71"><a href="#L-71"><span class="linenos" data-line="71"></span></a> </span><span id="L-72"><a href="#L-72"><span class="linenos" data-line="72"></span></a><span class="cm">--[==[ intro:</span> </span><span id="L-73"><a href="#L-73"><span class="linenos" data-line="73"></span></a><span class="cm">This module is used to standardize template argument processing and checking. A typical workflow is as follows (based</span> </span><span id="L-74"><a href="#L-74"><span class="linenos" data-line="74"></span></a><span class="cm">on [[Module:translations]]):</span> </span><span id="L-75"><a href="#L-75"><span class="linenos" data-line="75"></span></a> </span><span id="L-76"><a href="#L-76"><span class="linenos" data-line="76"></span></a><span class="cm">{</span> </span><span id="L-77"><a href="#L-77"><span class="linenos" data-line="77"></span></a><span class="cm"> ...</span> </span><span id="L-78"><a href="#L-78"><span class="linenos" data-line="78"></span></a><span class="cm"> local parent_args = frame:getParent().args</span> </span><span id="L-79"><a href="#L-79"><span class="linenos" data-line="79"></span></a> </span><span id="L-80"><a href="#L-80"><span class="linenos" data-line="80"></span></a><span class="cm"> local params = {</span> </span><span id="L-81"><a href="#L-81"><span class="linenos" data-line="81"></span></a><span class="cm"> [1] = {required = true, type = &quot;language&quot;, default = &quot;und&quot;},</span> </span><span id="L-82"><a href="#L-82"><span class="linenos" data-line="82"></span></a><span class="cm"> [2] = true,</span> </span><span id="L-83"><a href="#L-83"><span class="linenos" data-line="83"></span></a><span class="cm"> [3] = {list = true},</span> </span><span id="L-84"><a href="#L-84"><span class="linenos" data-line="84"></span></a><span class="cm"> [&quot;alt&quot;] = true,</span> </span><span id="L-85"><a href="#L-85"><span class="linenos" data-line="85"></span></a><span class="cm"> [&quot;id&quot;] = true,</span> </span><span id="L-86"><a href="#L-86"><span class="linenos" data-line="86"></span></a><span class="cm"> [&quot;sc&quot;] = {type = &quot;script&quot;},</span> </span><span id="L-87"><a href="#L-87"><span class="linenos" data-line="87"></span></a><span class="cm"> [&quot;tr&quot;] = true,</span> </span><span id="L-88"><a href="#L-88"><span class="linenos" data-line="88"></span></a><span class="cm"> [&quot;ts&quot;] = true,</span> </span><span id="L-89"><a href="#L-89"><span class="linenos" data-line="89"></span></a><span class="cm"> [&quot;lit&quot;] = true,</span> </span><span id="L-90"><a href="#L-90"><span class="linenos" data-line="90"></span></a><span class="cm"> }</span> </span><span id="L-91"><a href="#L-91"><span class="linenos" data-line="91"></span></a> </span><span id="L-92"><a href="#L-92"><span class="linenos" data-line="92"></span></a><span class="cm"> local args = require(&quot;Module:parameters&quot;).process(parent_args, params)</span> </span><span id="L-93"><a href="#L-93"><span class="linenos" data-line="93"></span></a> </span><span id="L-94"><a href="#L-94"><span class="linenos" data-line="94"></span></a><span class="cm"> -- Do further processing of the parsed arguments in `args`.</span> </span><span id="L-95"><a href="#L-95"><span class="linenos" data-line="95"></span></a><span class="cm"> ...</span> </span><span id="L-96"><a href="#L-96"><span class="linenos" data-line="96"></span></a><span class="cm">}</span> </span><span id="L-97"><a href="#L-97"><span class="linenos" data-line="97"></span></a> </span><span id="L-98"><a href="#L-98"><span class="linenos" data-line="98"></span></a><span class="cm">The `params` table should have the parameter names as the keys, and a (possibly empty) table of parameter tags as the</span> </span><span id="L-99"><a href="#L-99"><span class="linenos" data-line="99"></span></a><span class="cm">value. An empty table as the value merely states that the parameter exists, but should not receive any special</span> </span><span id="L-100"><a href="#L-100"><span class="linenos" data-line="100"></span></a><span class="cm">treatment; if desired, empty tables can be replaced with the value `true` as a perforamnce optimization.</span> </span><span id="L-101"><a href="#L-101"><span class="linenos" data-line="101"></span></a> </span><span id="L-102"><a href="#L-102"><span class="linenos" data-line="102"></span></a><span class="cm">Possible parameter tags are listed below:</span> </span><span id="L-103"><a href="#L-103"><span class="linenos" data-line="103"></span></a> </span><span id="L-104"><a href="#L-104"><span class="linenos" data-line="104"></span></a><span class="cm">; {required = true}</span> </span><span id="L-105"><a href="#L-105"><span class="linenos" data-line="105"></span></a><span class="cm">: The parameter is required; an error is shown if it is not present. The template&#39;s page itself is an exception; no</span> </span><span id="L-106"><a href="#L-106"><span class="linenos" data-line="106"></span></a><span class="cm"> error is shown there.</span> </span><span id="L-107"><a href="#L-107"><span class="linenos" data-line="107"></span></a><span class="cm">; {default =}</span> </span><span id="L-108"><a href="#L-108"><span class="linenos" data-line="108"></span></a><span class="cm">: Specifies a default input value for the parameter, if it is absent or empty. This will be processed as though it were</span> </span><span id="L-109"><a href="#L-109"><span class="linenos" data-line="109"></span></a><span class="cm"> the input instead, so (for example) {default = &quot;und&quot;} with the type {&quot;language&quot;} will return a language object for</span> </span><span id="L-110"><a href="#L-110"><span class="linenos" data-line="110"></span></a><span class="cm"> [[:Category:Undetermined language|Undetermined language]] if no language code is provided. When used on list</span> </span><span id="L-111"><a href="#L-111"><span class="linenos" data-line="111"></span></a><span class="cm"> parameters, this specifies a default value for the first item in the list only. Note that it is not possible to</span> </span><span id="L-112"><a href="#L-112"><span class="linenos" data-line="112"></span></a><span class="cm"> generate a default that depends on the value of other parameters. If used together with {required = true}, the default</span> </span><span id="L-113"><a href="#L-113"><span class="linenos" data-line="113"></span></a><span class="cm"> applies only to template pages (see the following entry), as a side effect of the fact that &quot;required&quot; parameters</span> </span><span id="L-114"><a href="#L-114"><span class="linenos" data-line="114"></span></a><span class="cm"> aren&#39;t actually required on template pages. This can be used to show an example of the template in action when the</span> </span><span id="L-115"><a href="#L-115"><span class="linenos" data-line="115"></span></a><span class="cm"> template page is visited; however, it is preferred to use `template_default` for this purpose, for clarity.</span> </span><span id="L-116"><a href="#L-116"><span class="linenos" data-line="116"></span></a><span class="cm">; {template_default =}</span> </span><span id="L-117"><a href="#L-117"><span class="linenos" data-line="117"></span></a><span class="cm">: Specifies a default input value for absent or empty parameters only on template pages. Template pages are any page in</span> </span><span id="L-118"><a href="#L-118"><span class="linenos" data-line="118"></span></a><span class="cm"> the template space (beginning with `Template:`) except for documentation pages (those ending in `.../documentation`).</span> </span><span id="L-119"><a href="#L-119"><span class="linenos" data-line="119"></span></a><span class="cm"> This can be used to provide an example value for a non-required parameter when the template page is visited, without</span> </span><span id="L-120"><a href="#L-120"><span class="linenos" data-line="120"></span></a><span class="cm"> interfering with other uses of the template. Both `template_default` and `default` can be specified for the same</span> </span><span id="L-121"><a href="#L-121"><span class="linenos" data-line="121"></span></a><span class="cm"> parameter. If this is done, `template_default` applies on template pages, and `default` on other pages. As an example,</span> </span><span id="L-122"><a href="#L-122"><span class="linenos" data-line="122"></span></a><span class="cm"> {{tl|cs-IPA}} uses the equivalent of {[1] = {default = &quot;+&quot;, template_default = &quot;příklad&quot;}} to supply a default of</span> </span><span id="L-123"><a href="#L-123"><span class="linenos" data-line="123"></span></a><span class="cm"> {&quot;+&quot;} for mainspace and documentation pages (which tells the module to use the value of the {{para|pagename}}</span> </span><span id="L-124"><a href="#L-124"><span class="linenos" data-line="124"></span></a><span class="cm"> parameter, falling back to the actual pagename), but {&quot;příklad&quot;} (which means &quot;example&quot;), on [[Template:cs-IPA]].</span> </span><span id="L-125"><a href="#L-125"><span class="linenos" data-line="125"></span></a><span class="cm">; {alias_of =}</span> </span><span id="L-126"><a href="#L-126"><span class="linenos" data-line="126"></span></a><span class="cm">: Treat the parameter as an alias of another. When arguments are specified for this parameter, they will automatically</span> </span><span id="L-127"><a href="#L-127"><span class="linenos" data-line="127"></span></a><span class="cm"> be renamed and stored under the alias name. This allows for parameters with multiple alternative names, while still</span> </span><span id="L-128"><a href="#L-128"><span class="linenos" data-line="128"></span></a><span class="cm"> treating them as if they had only one name. The conversion-related properties of an aliased parameter (e.g. `type`,</span> </span><span id="L-129"><a href="#L-129"><span class="linenos" data-line="129"></span></a><span class="cm"> `set`, `convert`, `sublist`) are taken from the aliasee, and the corrresponding properties set on the alias itself</span> </span><span id="L-130"><a href="#L-130"><span class="linenos" data-line="130"></span></a><span class="cm"> are ignored; but other properties on the alias are taken from the alias&#39;s spec and not from the aliasee&#39;s spec. This</span> </span><span id="L-131"><a href="#L-131"><span class="linenos" data-line="131"></span></a><span class="cm"> means, for example, that if you create an alias of a list parameter, the alias must also specify the `list` property</span> </span><span id="L-132"><a href="#L-132"><span class="linenos" data-line="132"></span></a><span class="cm"> or it is not a list. (In such a case, a value specified for the alias goes into the first item of the aliasee&#39;s list.</span> </span><span id="L-133"><a href="#L-133"><span class="linenos" data-line="133"></span></a><span class="cm"> You cannot make a list alias of a non-list parameter; this causes an error to be thrown.) Similarly, if you specify</span> </span><span id="L-134"><a href="#L-134"><span class="linenos" data-line="134"></span></a><span class="cm"> `separate_no_index` on an aliasee but not on the alias, uses of the unindexed aliasee parameter are stored into the</span> </span><span id="L-135"><a href="#L-135"><span class="linenos" data-line="135"></span></a><span class="cm"> `.default` key, but uses of the unindexed alias are stored into the first numbered key of the aliasee&#39;s list.</span> </span><span id="L-136"><a href="#L-136"><span class="linenos" data-line="136"></span></a><span class="cm"> Aliases cannot be required, as this prevents the other name or names of the parameter from being used. Parameters</span> </span><span id="L-137"><a href="#L-137"><span class="linenos" data-line="137"></span></a><span class="cm"> that are aliases and required at the same time cause an error to be thrown.</span> </span><span id="L-138"><a href="#L-138"><span class="linenos" data-line="138"></span></a><span class="cm">; {allow_empty = true}</span> </span><span id="L-139"><a href="#L-139"><span class="linenos" data-line="139"></span></a><span class="cm">: If the argument is an empty string value, it is not converted to {nil}, but kept as-is. The use of `allow_empty` is</span> </span><span id="L-140"><a href="#L-140"><span class="linenos" data-line="140"></span></a><span class="cm"> disallowed if a type has been specified, and causes an error to be thrown.</span> </span><span id="L-141"><a href="#L-141"><span class="linenos" data-line="141"></span></a><span class="cm">; {no_trim = true}</span> </span><span id="L-142"><a href="#L-142"><span class="linenos" data-line="142"></span></a><span class="cm">: Spacing characters such as spaces and newlines at the beginning and end of a positional parameter are not removed.</span> </span><span id="L-143"><a href="#L-143"><span class="linenos" data-line="143"></span></a><span class="cm"> (MediaWiki itself automatically trims spaces and newlines at the edge of named parameters.) The use of `no_trim` is</span> </span><span id="L-144"><a href="#L-144"><span class="linenos" data-line="144"></span></a><span class="cm"> disallowed if a type has been specified, and causes an error to be thrown.</span> </span><span id="L-145"><a href="#L-145"><span class="linenos" data-line="145"></span></a><span class="cm">; {type =}</span> </span><span id="L-146"><a href="#L-146"><span class="linenos" data-line="146"></span></a><span class="cm">: Specifies what value type to convert the argument into. The default is to leave it as a text string. Alternatives are:</span> </span><span id="L-147"><a href="#L-147"><span class="linenos" data-line="147"></span></a><span class="cm">:; {type = &quot;boolean&quot;}</span> </span><span id="L-148"><a href="#L-148"><span class="linenos" data-line="148"></span></a><span class="cm">:: The value is treated as a boolean value, either true or false. No value, the empty string, and the strings {&quot;0&quot;},</span> </span><span id="L-149"><a href="#L-149"><span class="linenos" data-line="149"></span></a><span class="cm"> {&quot;no&quot;}, {&quot;n&quot;} and {&quot;false&quot;} are treated as {false}, all other values are considered {true}.</span> </span><span id="L-150"><a href="#L-150"><span class="linenos" data-line="150"></span></a><span class="cm">:; {type = &quot;number&quot;}</span> </span><span id="L-151"><a href="#L-151"><span class="linenos" data-line="151"></span></a><span class="cm">:: The value is converted into a number, and throws an error if the value is not parsable as a number. Input values may</span> </span><span id="L-152"><a href="#L-152"><span class="linenos" data-line="152"></span></a><span class="cm"> be signed (`+` or `-`), and may contain decimal points and leading zeroes. If {allow_hex = true}, then hexadecimal</span> </span><span id="L-153"><a href="#L-153"><span class="linenos" data-line="153"></span></a><span class="cm"> values in the form {&quot;0x100&quot;} may optionally be used instead, which otherwise have the same syntax restrictions</span> </span><span id="L-154"><a href="#L-154"><span class="linenos" data-line="154"></span></a><span class="cm"> (including signs, decimal digits, and leading zeroes after {&quot;0x&quot;}). Hexadecimal inputs are not case-sensitive. Lua&#39;s</span> </span><span id="L-155"><a href="#L-155"><span class="linenos" data-line="155"></span></a><span class="cm"> special number values (`inf` and `nan`) are not possible inputs.</span> </span><span id="L-156"><a href="#L-156"><span class="linenos" data-line="156"></span></a><span class="cm">:; {type = &quot;language&quot;}</span> </span><span id="L-157"><a href="#L-157"><span class="linenos" data-line="157"></span></a><span class="cm">:: The value is interpreted as a full or [[Wiktionary:Languages#Etymology-only languages|etymology-only language]] code</span> </span><span id="L-158"><a href="#L-158"><span class="linenos" data-line="158"></span></a><span class="cm"> language code (or name, if {method = &quot;name&quot;}) and converted into the corresponding object (see [[Module:languages]]).</span> </span><span id="L-159"><a href="#L-159"><span class="linenos" data-line="159"></span></a><span class="cm"> If the code or name is invalid, then an error is thrown. The additional setting {family = true} can be given to allow</span> </span><span id="L-160"><a href="#L-160"><span class="linenos" data-line="160"></span></a><span class="cm"> [[Wiktionary:Language families|language family codes]] to be considered valid and the corresponding object returned.</span> </span><span id="L-161"><a href="#L-161"><span class="linenos" data-line="161"></span></a><span class="cm"> Note that to distinguish an etymology-only language object from a full language object, use</span> </span><span id="L-162"><a href="#L-162"><span class="linenos" data-line="162"></span></a><span class="cm"> {object:hasType(&quot;language&quot;, &quot;etymology-only&quot;)}.</span> </span><span id="L-163"><a href="#L-163"><span class="linenos" data-line="163"></span></a><span class="cm">:; {type = &quot;full language&quot;}</span> </span><span id="L-164"><a href="#L-164"><span class="linenos" data-line="164"></span></a><span class="cm">:: The value is interpreted as a full language code (or name, if {method = &quot;name&quot;}) and converted into the corresponding</span> </span><span id="L-165"><a href="#L-165"><span class="linenos" data-line="165"></span></a><span class="cm"> object (see [[Module:languages]]). If the code or name is invalid, then an error is thrown. Etymology-only languages</span> </span><span id="L-166"><a href="#L-166"><span class="linenos" data-line="166"></span></a><span class="cm"> are not allowed. The additional setting {family = true} can be given to allow</span> </span><span id="L-167"><a href="#L-167"><span class="linenos" data-line="167"></span></a><span class="cm"> [[Wiktionary:Language families|language family codes]] to be considered valid and the corresponding object returned.</span> </span><span id="L-168"><a href="#L-168"><span class="linenos" data-line="168"></span></a><span class="cm">:; {type = &quot;wikimedia language&quot;}</span> </span><span id="L-169"><a href="#L-169"><span class="linenos" data-line="169"></span></a><span class="cm">:: The value is interpreted as a code and converted into a wikimedia language object. If the code is invalid, then an</span> </span><span id="L-170"><a href="#L-170"><span class="linenos" data-line="170"></span></a><span class="cm"> error is thrown. If {method = &quot;fallback&quot;} is specified, conventional language codes which are different from their</span> </span><span id="L-171"><a href="#L-171"><span class="linenos" data-line="171"></span></a><span class="cm"> Wikimedia equivalent will also be accepted as a fallback.</span> </span><span id="L-172"><a href="#L-172"><span class="linenos" data-line="172"></span></a><span class="cm">:; {type = &quot;family&quot;}</span> </span><span id="L-173"><a href="#L-173"><span class="linenos" data-line="173"></span></a><span class="cm">:: The value is interpreted as a language family code (or name, if {method = &quot;name&quot;}) and converted into the</span> </span><span id="L-174"><a href="#L-174"><span class="linenos" data-line="174"></span></a><span class="cm"> corresponding object (see [[Module:families]]). If the code or name is invalid, then an error is thrown.</span> </span><span id="L-175"><a href="#L-175"><span class="linenos" data-line="175"></span></a><span class="cm">:; {type = &quot;script&quot;}</span> </span><span id="L-176"><a href="#L-176"><span class="linenos" data-line="176"></span></a><span class="cm">:: The value is interpreted as a script code (or name, if {method = &quot;name&quot;}) and converted into the corresponding object</span> </span><span id="L-177"><a href="#L-177"><span class="linenos" data-line="177"></span></a><span class="cm"> (see [[Module:scripts]]). If the code or name is invalid, then an error is thrown.</span> </span><span id="L-178"><a href="#L-178"><span class="linenos" data-line="178"></span></a><span class="cm">:; {type = &quot;title&quot;}</span> </span><span id="L-179"><a href="#L-179"><span class="linenos" data-line="179"></span></a><span class="cm">:: The value is interpreted as a page title and converted into the corresponding object (see the [[mw:Extension:Scribunto/Lua_reference_manual#Title_library|Title library]]). If the page title is invalid, then an error is thrown. If {namespace = n} (where {n} is a namespace number), then the title object will be in that namespace unless overridden by a namespace prefix in the value; this is the way that template invocations work, where the template namespace is used by default, but can be overridden. If {strict = true}, then the namespace prefix is unconditionally added to the value in all cases, even if a prefix is already present; this is way that {{tl|#invoke:}} works, where the &quot;Module:&quot; prefix is always appended no matter what.</span> </span><span id="L-180"><a href="#L-180"><span class="linenos" data-line="180"></span></a><span class="cm">:; {type = &quot;qualifier&quot;}</span> </span><span id="L-181"><a href="#L-181"><span class="linenos" data-line="181"></span></a><span class="cm">:: The value is interpreted as a qualifier and converted into the correct format for passing into `format_qualifiers()`</span> </span><span id="L-182"><a href="#L-182"><span class="linenos" data-line="182"></span></a><span class="cm"> in [[Module:qualifier]] (which currently just means converting it to a one-item list).</span> </span><span id="L-183"><a href="#L-183"><span class="linenos" data-line="183"></span></a><span class="cm">:; {type = &quot;labels&quot;}</span> </span><span id="L-184"><a href="#L-184"><span class="linenos" data-line="184"></span></a><span class="cm">:: The value is interpreted as a comma-separated list of labels and converted into the correct format for passing into</span> </span><span id="L-185"><a href="#L-185"><span class="linenos" data-line="185"></span></a><span class="cm"> `show_labels()` in [[Module:labels]] (which is currently a list of strings). Splitting is done on commas not followed</span> </span><span id="L-186"><a href="#L-186"><span class="linenos" data-line="186"></span></a><span class="cm"> by whitespace, except that commas inside of double angle brackets do not count even if not followed by whitespace.</span> </span><span id="L-187"><a href="#L-187"><span class="linenos" data-line="187"></span></a><span class="cm"> This type should be used by for normal labels (typically specified using {{para|l}} or {{para|ll}}) and accent</span> </span><span id="L-188"><a href="#L-188"><span class="linenos" data-line="188"></span></a><span class="cm"> qualifiers (typically specified using {{para|a}} and {{para|aa}}).</span> </span><span id="L-189"><a href="#L-189"><span class="linenos" data-line="189"></span></a><span class="cm">:; {type = &quot;references&quot;}</span> </span><span id="L-190"><a href="#L-190"><span class="linenos" data-line="190"></span></a><span class="cm">:: The value is interpreted as one or more references, in the format prescribed by `parse_references()` in</span> </span><span id="L-191"><a href="#L-191"><span class="linenos" data-line="191"></span></a><span class="cm"> [[Module:references]], and converted into a list of objects of the form accepted by `format_references()` in the same</span> </span><span id="L-192"><a href="#L-192"><span class="linenos" data-line="192"></span></a><span class="cm"> module. If a syntax error is found in the reference format, an error is thrown.</span> </span><span id="L-193"><a href="#L-193"><span class="linenos" data-line="193"></span></a><span class="cm">:; {type = function(val) ... end}</span> </span><span id="L-194"><a href="#L-194"><span class="linenos" data-line="194"></span></a><span class="cm">:: `type` may be set to a function (or callable table), which must take the argument value as its sole argument, and must</span> </span><span id="L-195"><a href="#L-195"><span class="linenos" data-line="195"></span></a><span class="cm"> output one of the other recognized types. This is particularly useful for lists (see below), where certain values need</span> </span><span id="L-196"><a href="#L-196"><span class="linenos" data-line="196"></span></a><span class="cm"> to be interpreted differently to others.</span> </span><span id="L-197"><a href="#L-197"><span class="linenos" data-line="197"></span></a><span class="cm">; {list =}</span> </span><span id="L-198"><a href="#L-198"><span class="linenos" data-line="198"></span></a><span class="cm">: Treat the parameter as a list of values, each having its own parameter name, rather than a single value. The</span> </span><span id="L-199"><a href="#L-199"><span class="linenos" data-line="199"></span></a><span class="cm"> parameters will have a number at the end, except optionally for the first (but see also {require_index = true}). For</span> </span><span id="L-200"><a href="#L-200"><span class="linenos" data-line="200"></span></a><span class="cm"> example, {list = true} on a parameter named &quot;head&quot; will include the parameters {{para|head}} (or {{para|head1}}),</span> </span><span id="L-201"><a href="#L-201"><span class="linenos" data-line="201"></span></a><span class="cm"> {{para|head2}}, {{para|head3}} and so on. If the parameter name is a number, another number doesn&#39;t get appended, but</span> </span><span id="L-202"><a href="#L-202"><span class="linenos" data-line="202"></span></a><span class="cm"> the counting simply continues, e.g. for parameter {3} the sequence is {{para|3}}, {{para|4}}, {{para|5}} etc. List</span> </span><span id="L-203"><a href="#L-203"><span class="linenos" data-line="203"></span></a><span class="cm"> parameters are returned as numbered lists, so for a template that is given the parameters `|head=a|head2=b|head3=c`,</span> </span><span id="L-204"><a href="#L-204"><span class="linenos" data-line="204"></span></a><span class="cm"> the processed value of the parameter {&quot;head&quot;} will be { { &quot;a&quot;, &quot;b&quot;, &quot;c&quot; }}}.</span> </span><span id="L-205"><a href="#L-205"><span class="linenos" data-line="205"></span></a><span class="cm">: The value for {list =} can also be a string. This tells the module that parameters other than the first should have a</span> </span><span id="L-206"><a href="#L-206"><span class="linenos" data-line="206"></span></a><span class="cm"> different name, which is useful when the first parameter in a list is a number, but the remainder is named. An example</span> </span><span id="L-207"><a href="#L-207"><span class="linenos" data-line="207"></span></a><span class="cm"> would be for genders: {list = &quot;g&quot;} on a parameter named {1} would have parameters {{para|1}}, {{para|g2}}, {{para|g3}}</span> </span><span id="L-208"><a href="#L-208"><span class="linenos" data-line="208"></span></a><span class="cm"> etc.</span> </span><span id="L-209"><a href="#L-209"><span class="linenos" data-line="209"></span></a><span class="cm">: If the number is not located at the end, it can be specified by putting {&quot;\1&quot;} at the number position. For example,</span> </span><span id="L-210"><a href="#L-210"><span class="linenos" data-line="210"></span></a><span class="cm"> parameters {{para|f1accel}}, {{para|f2accel}}, ... can be captured by using the parameter name {&quot;f\1accel&quot;}, as is</span> </span><span id="L-211"><a href="#L-211"><span class="linenos" data-line="211"></span></a><span class="cm"> done in [[Module:headword/templates]].</span> </span><span id="L-212"><a href="#L-212"><span class="linenos" data-line="212"></span></a><span class="cm">; {set =}</span> </span><span id="L-213"><a href="#L-213"><span class="linenos" data-line="213"></span></a><span class="cm">: Require that the value of the parameter be one of the specified list of values (or omitted, if {required = true} isn&#39;t</span> </span><span id="L-214"><a href="#L-214"><span class="linenos" data-line="214"></span></a><span class="cm"> given). The values in the specified list should be strings corresponding to the raw parameter values except when</span> </span><span id="L-215"><a href="#L-215"><span class="linenos" data-line="215"></span></a><span class="cm"> {type = &quot;number&quot;}, in which case they should be numbers. The use of `set` is disallowed if {type = &quot;boolean&quot;} and</span> </span><span id="L-216"><a href="#L-216"><span class="linenos" data-line="216"></span></a><span class="cm"> causes an error to be thrown.</span> </span><span id="L-217"><a href="#L-217"><span class="linenos" data-line="217"></span></a><span class="cm">; {sublist =}</span> </span><span id="L-218"><a href="#L-218"><span class="linenos" data-line="218"></span></a><span class="cm">: The value of the parameter is a delimiter-separated list of individual raw values. The resulting field in `args` will</span> </span><span id="L-219"><a href="#L-219"><span class="linenos" data-line="219"></span></a><span class="cm"> be a Lua list (i.e. a table with numeric indices) of the converted values. If {sublist = true} is given, the values</span> </span><span id="L-220"><a href="#L-220"><span class="linenos" data-line="220"></span></a><span class="cm"> will be split on commas (possibly with whitespace on one or both sides of the comma, which is ignored). If</span> </span><span id="L-221"><a href="#L-221"><span class="linenos" data-line="221"></span></a><span class="cm"> {sublist = &quot;comma without whitespace&quot;} is given, the values will be split on commas which are not followed by whitespace,</span> </span><span id="L-222"><a href="#L-222"><span class="linenos" data-line="222"></span></a><span class="cm"> and which aren&#39;t preceded by an escaping backslash. Otherwise, the value of `sublist` should be either a Lua pattern</span> </span><span id="L-223"><a href="#L-223"><span class="linenos" data-line="223"></span></a><span class="cm"> specifying the delimiter(s) to split on or a function (or callable table) to do the splitting, which is passed two values</span> </span><span id="L-224"><a href="#L-224"><span class="linenos" data-line="224"></span></a><span class="cm"> (the value to split and a function to signal an error) and should return a list of the split values.</span> </span><span id="L-225"><a href="#L-225"><span class="linenos" data-line="225"></span></a><span class="cm">; {convert =}</span> </span><span id="L-226"><a href="#L-226"><span class="linenos" data-line="226"></span></a><span class="cm">: If given, this specifies a function (or callable table) to convert the raw parameter value into the Lua object used</span> </span><span id="L-227"><a href="#L-227"><span class="linenos" data-line="227"></span></a><span class="cm"> during further processing. The function is passed two arguments, the raw parameter value itself and a function used to</span> </span><span id="L-228"><a href="#L-228"><span class="linenos" data-line="228"></span></a><span class="cm"> signal an error during parsing or conversion, and should return one value, the converted parameter. The error-signaling</span> </span><span id="L-229"><a href="#L-229"><span class="linenos" data-line="229"></span></a><span class="cm"> function contains the name and raw value of the parameter embedded into the message it generates, so these do not need to</span> </span><span id="L-230"><a href="#L-230"><span class="linenos" data-line="230"></span></a><span class="cm"> specified in the message passed into it. If `type` is specified in conjunction with `convert`, the processing by</span> </span><span id="L-231"><a href="#L-231"><span class="linenos" data-line="231"></span></a><span class="cm"> `type` happens first. If `sublist` is given in conjunction with `convert`, the raw parameter value will be split</span> </span><span id="L-232"><a href="#L-232"><span class="linenos" data-line="232"></span></a><span class="cm"> appropriately and `convert` called on each resulting item.</span> </span><span id="L-233"><a href="#L-233"><span class="linenos" data-line="233"></span></a><span class="cm">; {allow_hex = true}</span> </span><span id="L-234"><a href="#L-234"><span class="linenos" data-line="234"></span></a><span class="cm">: When used in conjunction with {type = &quot;number&quot;}, allows hexadecimal numbers as inputs, in the format {&quot;0x100&quot;} (which is</span> </span><span id="L-235"><a href="#L-235"><span class="linenos" data-line="235"></span></a><span class="cm"> not case-sensitive).</span> </span><span id="L-236"><a href="#L-236"><span class="linenos" data-line="236"></span></a><span class="cm">; {family = true}</span> </span><span id="L-237"><a href="#L-237"><span class="linenos" data-line="237"></span></a><span class="cm">: When used in conjunction with {type = &quot;language&quot;}, allows [[Wiktionary:Language families|language family codes]] to be</span> </span><span id="L-238"><a href="#L-238"><span class="linenos" data-line="238"></span></a><span class="cm"> returned. To check if a given object refers to a language family, use {object:hasType(&quot;family&quot;)}.</span> </span><span id="L-239"><a href="#L-239"><span class="linenos" data-line="239"></span></a><span class="cm">; {method = &quot;name&quot;}</span> </span><span id="L-240"><a href="#L-240"><span class="linenos" data-line="240"></span></a><span class="cm">: When used in conjunction with {type = &quot;language&quot;}, {type = &quot;family&quot;} or {type = &quot;script&quot;}, checks for and parses a</span> </span><span id="L-241"><a href="#L-241"><span class="linenos" data-line="241"></span></a><span class="cm"> language, family or script name instead of a code.</span> </span><span id="L-242"><a href="#L-242"><span class="linenos" data-line="242"></span></a><span class="cm">; {allow_holes = true}</span> </span><span id="L-243"><a href="#L-243"><span class="linenos" data-line="243"></span></a><span class="cm">: This is used in conjunction with list-type parameters. By default, the values are tightly packed in the resulting</span> </span><span id="L-244"><a href="#L-244"><span class="linenos" data-line="244"></span></a><span class="cm"> list. This means that if, for example, an entry specified `head=a|head3=c` but not {{para|head2}}, the returned list</span> </span><span id="L-245"><a href="#L-245"><span class="linenos" data-line="245"></span></a><span class="cm"> will be { {&quot;a&quot;, &quot;c&quot;}}}, with the values stored at the indices {1} and {2}, not {1} and {3}. If it is desirable to keep</span> </span><span id="L-246"><a href="#L-246"><span class="linenos" data-line="246"></span></a><span class="cm"> the numbering intact, for example if the numbers of several list parameters correlate with each other (like those of</span> </span><span id="L-247"><a href="#L-247"><span class="linenos" data-line="247"></span></a><span class="cm"> {{tl|affix}}), then this tag should be specified.</span> </span><span id="L-248"><a href="#L-248"><span class="linenos" data-line="248"></span></a><span class="cm">: If {allow_holes = true} is given, there may be {nil} values in between two real values, which makes many of Lua&#39;s</span> </span><span id="L-249"><a href="#L-249"><span class="linenos" data-line="249"></span></a><span class="cm"> table processing functions no longer work, like {#} or {ipairs()}. To remedy this, the resulting table will contain an</span> </span><span id="L-250"><a href="#L-250"><span class="linenos" data-line="250"></span></a><span class="cm"> additional named value, `maxindex`, which tells you the highest numeric index that is present in the table. In the</span> </span><span id="L-251"><a href="#L-251"><span class="linenos" data-line="251"></span></a><span class="cm"> example above, the resulting table will now be { { &quot;a&quot;, nil, &quot;c&quot;, maxindex = 3}}}. That way, you can iterate over the</span> </span><span id="L-252"><a href="#L-252"><span class="linenos" data-line="252"></span></a><span class="cm"> values from {1} to `maxindex`, while skipping {nil} values in between.</span> </span><span id="L-253"><a href="#L-253"><span class="linenos" data-line="253"></span></a><span class="cm">; {disallow_holes = true}</span> </span><span id="L-254"><a href="#L-254"><span class="linenos" data-line="254"></span></a><span class="cm">: This is used in conjunction with list-type parameters. As mentioned above, normally if there is a hole in the source</span> </span><span id="L-255"><a href="#L-255"><span class="linenos" data-line="255"></span></a><span class="cm"> arguments, e.g. `head=a|head3=c` but not {{para|head2}}, it will be removed in the returned list. If</span> </span><span id="L-256"><a href="#L-256"><span class="linenos" data-line="256"></span></a><span class="cm"> {disallow_holes = true} is specified, however, an error is thrown in such a case. This should be used whenever there</span> </span><span id="L-257"><a href="#L-257"><span class="linenos" data-line="257"></span></a><span class="cm"> are multiple list-type parameters that need to line up (e.g. both {{para|head}} and {{para|tr}} are available and</span> </span><span id="L-258"><a href="#L-258"><span class="linenos" data-line="258"></span></a><span class="cm"> {{para|head3}} lines up with {{para|tr3}}), unless {allow_holes = true} is given and you are prepared to handle the</span> </span><span id="L-259"><a href="#L-259"><span class="linenos" data-line="259"></span></a><span class="cm"> holes in the returned lists.</span> </span><span id="L-260"><a href="#L-260"><span class="linenos" data-line="260"></span></a><span class="cm">; {require_index = true}</span> </span><span id="L-261"><a href="#L-261"><span class="linenos" data-line="261"></span></a><span class="cm">: This is used in conjunction with list-type parameters. By default, the first parameter can have its index omitted.</span> </span><span id="L-262"><a href="#L-262"><span class="linenos" data-line="262"></span></a><span class="cm"> For example, a list parameter named `head` can have its first parameter specified as either {{para|head}} or</span> </span><span id="L-263"><a href="#L-263"><span class="linenos" data-line="263"></span></a><span class="cm"> {{para|head1}}. If {require_index = true} is specified, however, only {{para|head1}} is recognized, and {{para|head}}</span> </span><span id="L-264"><a href="#L-264"><span class="linenos" data-line="264"></span></a><span class="cm"> will be treated as an unknown parameter. {{tl|affixusex}} (and variants {{tl|suffixusex}}, {{tl|prefixusex}}) use</span> </span><span id="L-265"><a href="#L-265"><span class="linenos" data-line="265"></span></a><span class="cm"> this, for example, on all list parameters.</span> </span><span id="L-266"><a href="#L-266"><span class="linenos" data-line="266"></span></a><span class="cm">; {separate_no_index = true}</span> </span><span id="L-267"><a href="#L-267"><span class="linenos" data-line="267"></span></a><span class="cm">: This is used to distinguish between {{para|head}} and {{para|head1}} as different parameters. For example, in</span> </span><span id="L-268"><a href="#L-268"><span class="linenos" data-line="268"></span></a><span class="cm"> {{tl|affixusex}}, to distinguish between {{para|sc}} (a script code for all elements in the usex&#39;s language) and</span> </span><span id="L-269"><a href="#L-269"><span class="linenos" data-line="269"></span></a><span class="cm"> {{para|sc1}} (the script code of the first element, used when the first element is prefixed with a language code to</span> </span><span id="L-270"><a href="#L-270"><span class="linenos" data-line="270"></span></a><span class="cm"> indicate that it is in a different language). When this is used, the resulting table will contain an additional named</span> </span><span id="L-271"><a href="#L-271"><span class="linenos" data-line="271"></span></a><span class="cm"> value, `default`, which contains the value for the indexless argument.</span> </span><span id="L-272"><a href="#L-272"><span class="linenos" data-line="272"></span></a><span class="cm">; {demo = true}</span> </span><span id="L-273"><a href="#L-273"><span class="linenos" data-line="273"></span></a><span class="cm">: This is used as a way to ensure that the parameter is only enabled on the template&#39;s own page (and its documentation page), and in the User: namespace; otherwise, it will be treated as an unknown parameter. This should only be used if special settings are required to showcase a template in its documentation (e.g. adjusting the pagename or disabling categorization). In most cases, it should be possible to do this without using demo parameters, but they may be required if a template/documentation page also contains real uses of the same template as well (e.g. {{tl|shortcut}}), as a way to distinguish them.</span> </span><span id="L-274"><a href="#L-274"><span class="linenos" data-line="274"></span></a><span class="cm">]==]</span> </span><span id="L-275"><a href="#L-275"><span class="linenos" data-line="275"></span></a> </span><span id="L-276"><a href="#L-276"><span class="linenos" data-line="276"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">track</span><span class="p">(</span><span class="n">page</span><span class="p">)</span> </span><span id="L-277"><a href="#L-277"><span class="linenos" data-line="277"></span></a> <span class="kd">local</span> <span class="n">tracking_page</span> <span class="o">=</span> <span class="s2">&quot;parameters/&quot;</span> <span class="o">..</span> <span class="n">page</span> </span><span id="L-278"><a href="#L-278"><span class="linenos" data-line="278"></span></a> <span class="kd">local</span> <span class="n">pages</span><span class="p">,</span> <span class="n">current</span><span class="p">,</span> <span class="n">mod</span><span class="p">,</span> <span class="n">func</span> <span class="o">=</span> <span class="p">{</span><span class="n">tracking_page</span><span class="p">}</span> </span><span id="L-279"><a href="#L-279"><span class="linenos" data-line="279"></span></a> <span class="c1">-- Check through the traceback to get the calling module and function.</span> </span><span id="L-280"><a href="#L-280"><span class="linenos" data-line="280"></span></a> <span class="kr">for</span> <span class="n">mod</span><span class="p">,</span> <span class="n">func</span> <span class="kr">in</span> <span class="nb">debug.traceback</span><span class="p">():</span><span class="n">gmatch</span><span class="p">(</span><span class="s2">&quot;%f[^%z</span><span class="se">\n</span><span class="s2">]</span><span class="se">\t</span><span class="s2">Module:(.-):%d+: in function &#39;(.-)&#39;%f[%z</span><span class="se">\n</span><span class="s2">]&quot;</span><span class="p">)</span> <span class="kr">do</span> </span><span id="L-281"><a href="#L-281"><span class="linenos" data-line="281"></span></a> <span class="kr">if</span> <span class="n">current</span> <span class="o">==</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-282"><a href="#L-282"><span class="linenos" data-line="282"></span></a> <span class="n">current</span> <span class="o">=</span> <span class="n">mod</span> <span class="c1">-- Name of this module.</span> </span><span id="L-283"><a href="#L-283"><span class="linenos" data-line="283"></span></a> <span class="kr">elseif</span> <span class="n">mod</span> <span class="o">~=</span> <span class="n">current</span> <span class="kr">then</span> </span><span id="L-284"><a href="#L-284"><span class="linenos" data-line="284"></span></a> <span class="n">insert</span><span class="p">(</span><span class="n">pages</span><span class="p">,</span> <span class="n">tracking_page</span> <span class="o">..</span> <span class="s2">&quot;/&quot;</span> <span class="o">..</span> <span class="n">mod</span><span class="p">)</span> </span><span id="L-285"><a href="#L-285"><span class="linenos" data-line="285"></span></a> <span class="c1">-- FIXME: if the calling function is the one called by #invoke:, traceback calls it &quot;chunk&quot; instead of its actual name.</span> </span><span id="L-286"><a href="#L-286"><span class="linenos" data-line="286"></span></a> <span class="n">insert</span><span class="p">(</span><span class="n">pages</span><span class="p">,</span> <span class="n">tracking_page</span> <span class="o">..</span> <span class="s2">&quot;/&quot;</span> <span class="o">..</span> <span class="n">mod</span> <span class="o">..</span> <span class="s2">&quot;/&quot;</span> <span class="o">..</span> <span class="n">func</span><span class="p">)</span> </span><span id="L-287"><a href="#L-287"><span class="linenos" data-line="287"></span></a> <span class="kr">break</span> </span><span id="L-288"><a href="#L-288"><span class="linenos" data-line="288"></span></a> <span class="kr">end</span> </span><span id="L-289"><a href="#L-289"><span class="linenos" data-line="289"></span></a> <span class="kr">end</span> </span><span id="L-290"><a href="#L-290"><span class="linenos" data-line="290"></span></a> <span class="nb">require</span><span class="p">(</span><span class="n">debug_track_module</span><span class="p">)(</span><span class="n">pages</span><span class="p">)</span> </span><span id="L-291"><a href="#L-291"><span class="linenos" data-line="291"></span></a><span class="kr">end</span> </span><span id="L-292"><a href="#L-292"><span class="linenos" data-line="292"></span></a> </span><span id="L-293"><a href="#L-293"><span class="linenos" data-line="293"></span></a><span class="c1">-------------------------------------- Some splitting functions -----------------------------</span> </span><span id="L-294"><a href="#L-294"><span class="linenos" data-line="294"></span></a> </span><span id="L-295"><a href="#L-295"><span class="linenos" data-line="295"></span></a><span class="c1">-- Split an argument on comma, but not comma followed by whitespace.</span> </span><span id="L-296"><a href="#L-296"><span class="linenos" data-line="296"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">split_on_comma_without_whitespace</span><span class="p">(</span><span class="n">val</span><span class="p">)</span> </span><span id="L-297"><a href="#L-297"><span class="linenos" data-line="297"></span></a> <span class="kr">if</span> <span class="n">find</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="s2">&quot;</span><span class="se">\\</span><span class="s2">&quot;</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="kc">true</span><span class="p">)</span> <span class="ow">or</span> <span class="n">match</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="s2">&quot;,%s&quot;</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-298"><a href="#L-298"><span class="linenos" data-line="298"></span></a> <span class="kr">return</span> <span class="n">split_on_comma</span><span class="p">(</span><span class="n">val</span><span class="p">)</span> </span><span id="L-299"><a href="#L-299"><span class="linenos" data-line="299"></span></a> <span class="kr">else</span> </span><span id="L-300"><a href="#L-300"><span class="linenos" data-line="300"></span></a> <span class="kr">return</span> <span class="n">rsplit</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="s2">&quot;,&quot;</span><span class="p">)</span> </span><span id="L-301"><a href="#L-301"><span class="linenos" data-line="301"></span></a> <span class="kr">end</span> </span><span id="L-302"><a href="#L-302"><span class="linenos" data-line="302"></span></a><span class="kr">end</span> </span><span id="L-303"><a href="#L-303"><span class="linenos" data-line="303"></span></a> </span><span id="L-304"><a href="#L-304"><span class="linenos" data-line="304"></span></a><span class="c1">-------------------------------------- Error handling -----------------------------</span> </span><span id="L-305"><a href="#L-305"><span class="linenos" data-line="305"></span></a> </span><span id="L-306"><a href="#L-306"><span class="linenos" data-line="306"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">process_error</span><span class="p">(</span><span class="n">fmt</span><span class="p">,</span> <span class="p">...)</span> </span><span id="L-307"><a href="#L-307"><span class="linenos" data-line="307"></span></a> <span class="kd">local</span> <span class="n">args</span> <span class="o">=</span> <span class="p">{...}</span> </span><span id="L-308"><a href="#L-308"><span class="linenos" data-line="308"></span></a> <span class="kr">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">val</span> <span class="kr">in</span> <span class="nb">ipairs</span><span class="p">(</span><span class="n">args</span><span class="p">)</span> <span class="kr">do</span> </span><span id="L-309"><a href="#L-309"><span class="linenos" data-line="309"></span></a> <span class="n">args</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">dump</span><span class="p">(</span><span class="n">val</span><span class="p">)</span> </span><span id="L-310"><a href="#L-310"><span class="linenos" data-line="310"></span></a> <span class="kr">end</span> </span><span id="L-311"><a href="#L-311"><span class="linenos" data-line="311"></span></a> <span class="kr">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">fmt</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&quot;table&quot;</span> <span class="kr">then</span> </span><span id="L-312"><a href="#L-312"><span class="linenos" data-line="312"></span></a> <span class="c1">-- hacky signal that we&#39;re called from internal_process_error(), and not to omit stack frames</span> </span><span id="L-313"><a href="#L-313"><span class="linenos" data-line="313"></span></a> <span class="kr">return</span> <span class="nb">error</span><span class="p">(</span><span class="n">fmt</span><span class="p">[</span><span class="mi">1</span><span class="p">]:</span><span class="n">format</span><span class="p">(</span><span class="n">unpack</span><span class="p">(</span><span class="n">args</span><span class="p">)))</span> </span><span id="L-314"><a href="#L-314"><span class="linenos" data-line="314"></span></a> <span class="kr">else</span> </span><span id="L-315"><a href="#L-315"><span class="linenos" data-line="315"></span></a> <span class="kr">return</span> <span class="nb">error</span><span class="p">(</span><span class="n">fmt</span><span class="p">:</span><span class="n">format</span><span class="p">(</span><span class="n">unpack</span><span class="p">(</span><span class="n">args</span><span class="p">)),</span> <span class="mi">3</span><span class="p">)</span> </span><span id="L-316"><a href="#L-316"><span class="linenos" data-line="316"></span></a> <span class="kr">end</span> </span><span id="L-317"><a href="#L-317"><span class="linenos" data-line="317"></span></a><span class="kr">end</span> </span><span id="L-318"><a href="#L-318"><span class="linenos" data-line="318"></span></a> </span><span id="L-319"><a href="#L-319"><span class="linenos" data-line="319"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">internal_process_error</span><span class="p">(</span><span class="n">fmt</span><span class="p">,</span> <span class="p">...)</span> </span><span id="L-320"><a href="#L-320"><span class="linenos" data-line="320"></span></a> <span class="n">fmt</span> <span class="o">=</span> <span class="s2">&quot;Internal error in `params` table: &quot;</span> <span class="o">..</span> <span class="n">fmt</span> </span><span id="L-321"><a href="#L-321"><span class="linenos" data-line="321"></span></a> <span class="n">process_error</span><span class="p">({</span><span class="n">fmt</span><span class="p">},</span> <span class="p">...)</span> </span><span id="L-322"><a href="#L-322"><span class="linenos" data-line="322"></span></a><span class="kr">end</span> </span><span id="L-323"><a href="#L-323"><span class="linenos" data-line="323"></span></a> </span><span id="L-324"><a href="#L-324"><span class="linenos" data-line="324"></span></a><span class="c1">-------------------------------------- Value conversion -----------------------------</span> </span><span id="L-325"><a href="#L-325"><span class="linenos" data-line="325"></span></a> </span><span id="L-326"><a href="#L-326"><span class="linenos" data-line="326"></span></a><span class="c1">-- For a list parameter `name` and corresponding value `list_name` of the `list` field (which should have the same value</span> </span><span id="L-327"><a href="#L-327"><span class="linenos" data-line="327"></span></a><span class="c1">-- as `name` if `list = true` was given), generate a pattern to match parameters of the list and store the pattern as a</span> </span><span id="L-328"><a href="#L-328"><span class="linenos" data-line="328"></span></a><span class="c1">-- key in `patterns`, with corresponding value set to `name`. For example, if `list_name` is &quot;tr&quot;, the pattern will</span> </span><span id="L-329"><a href="#L-329"><span class="linenos" data-line="329"></span></a><span class="c1">-- match &quot;tr&quot; as well as &quot;tr1&quot;, &quot;tr2&quot;, ..., &quot;tr10&quot;, &quot;tr11&quot;, etc. If the `list_name` contains a \1 in it, the numeric</span> </span><span id="L-330"><a href="#L-330"><span class="linenos" data-line="330"></span></a><span class="c1">-- portion goes in place of the \1. For example, if `list_name` is &quot;f\1accel&quot;, the pattern will match &quot;faccel&quot;,</span> </span><span id="L-331"><a href="#L-331"><span class="linenos" data-line="331"></span></a><span class="c1">-- &quot;f1accel&quot;, &quot;f2accel&quot;, etc. Any \1 in `name` is removed before storing into `patterns`.</span> </span><span id="L-332"><a href="#L-332"><span class="linenos" data-line="332"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">save_pattern</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">list_name</span><span class="p">,</span> <span class="n">patterns</span><span class="p">)</span> </span><span id="L-333"><a href="#L-333"><span class="linenos" data-line="333"></span></a> <span class="n">name</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&quot;string&quot;</span> <span class="ow">and</span> <span class="n">gsub</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="s2">&quot;</span><span class="se">\1</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">name</span> </span><span id="L-334"><a href="#L-334"><span class="linenos" data-line="334"></span></a> <span class="kr">if</span> <span class="n">match</span><span class="p">(</span><span class="n">list_name</span><span class="p">,</span> <span class="s2">&quot;</span><span class="se">\1</span><span class="s2">&quot;</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-335"><a href="#L-335"><span class="linenos" data-line="335"></span></a> <span class="n">patterns</span><span class="p">[</span><span class="s2">&quot;^&quot;</span> <span class="o">..</span> <span class="n">gsub</span><span class="p">(</span><span class="n">pattern_escape</span><span class="p">(</span><span class="n">list_name</span><span class="p">),</span> <span class="s2">&quot;</span><span class="se">\1</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;([1-9]%%d*)&quot;</span><span class="p">)</span> <span class="o">..</span> <span class="s2">&quot;$&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">name</span> </span><span id="L-336"><a href="#L-336"><span class="linenos" data-line="336"></span></a> <span class="kr">else</span> </span><span id="L-337"><a href="#L-337"><span class="linenos" data-line="337"></span></a> <span class="n">patterns</span><span class="p">[</span><span class="s2">&quot;^&quot;</span> <span class="o">..</span> <span class="n">pattern_escape</span><span class="p">(</span><span class="n">list_name</span><span class="p">)</span> <span class="o">..</span> <span class="s2">&quot;([1-9]%d*)$&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">name</span> </span><span id="L-338"><a href="#L-338"><span class="linenos" data-line="338"></span></a> <span class="kr">end</span> </span><span id="L-339"><a href="#L-339"><span class="linenos" data-line="339"></span></a><span class="kr">end</span> </span><span id="L-340"><a href="#L-340"><span class="linenos" data-line="340"></span></a> </span><span id="L-341"><a href="#L-341"><span class="linenos" data-line="341"></span></a><span class="c1">-- Convert a list in `list` to a string, separating the final element from the preceding one(s) by `conjunction`. If</span> </span><span id="L-342"><a href="#L-342"><span class="linenos" data-line="342"></span></a><span class="c1">-- `dump_vals` is given, pass all values in `list` through mw.dumpObject() (WARNING: this destructively modifies</span> </span><span id="L-343"><a href="#L-343"><span class="linenos" data-line="343"></span></a><span class="c1">-- `list`). This is similar to serialCommaJoin() in [[Module:table]] when used with the `dontTag = true` option, but</span> </span><span id="L-344"><a href="#L-344"><span class="linenos" data-line="344"></span></a><span class="c1">-- internally uses mw.text.listToText().</span> </span><span id="L-345"><a href="#L-345"><span class="linenos" data-line="345"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">concat_list</span><span class="p">(</span><span class="n">list</span><span class="p">,</span> <span class="n">conjunction</span><span class="p">,</span> <span class="n">dump_vals</span><span class="p">)</span> </span><span id="L-346"><a href="#L-346"><span class="linenos" data-line="346"></span></a> <span class="kr">if</span> <span class="n">dump_vals</span> <span class="kr">then</span> </span><span id="L-347"><a href="#L-347"><span class="linenos" data-line="347"></span></a> <span class="kr">for</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="o">#</span><span class="n">list</span> <span class="kr">do</span> </span><span id="L-348"><a href="#L-348"><span class="linenos" data-line="348"></span></a> <span class="n">list</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">dump</span><span class="p">(</span><span class="n">list</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> </span><span id="L-349"><a href="#L-349"><span class="linenos" data-line="349"></span></a> <span class="kr">end</span> </span><span id="L-350"><a href="#L-350"><span class="linenos" data-line="350"></span></a> <span class="kr">end</span> </span><span id="L-351"><a href="#L-351"><span class="linenos" data-line="351"></span></a> <span class="kr">return</span> <span class="n">list_to_text</span><span class="p">(</span><span class="n">list</span><span class="p">,</span> <span class="kc">nil</span><span class="p">,</span> <span class="n">conjunction</span><span class="p">)</span> </span><span id="L-352"><a href="#L-352"><span class="linenos" data-line="352"></span></a><span class="kr">end</span> </span><span id="L-353"><a href="#L-353"><span class="linenos" data-line="353"></span></a> </span><span id="L-354"><a href="#L-354"><span class="linenos" data-line="354"></span></a><span class="c1">-- Helper function for use with convert_val_error(). Format a list of possible choices using `concat_list` and</span> </span><span id="L-355"><a href="#L-355"><span class="linenos" data-line="355"></span></a><span class="c1">-- conjunction &quot;or&quot;, displaying &quot;either &quot; before the choices if there&#39;s more than one.</span> </span><span id="L-356"><a href="#L-356"><span class="linenos" data-line="356"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">format_choice_list</span><span class="p">(</span><span class="n">typ</span><span class="p">)</span> </span><span id="L-357"><a href="#L-357"><span class="linenos" data-line="357"></span></a> <span class="kr">return</span> <span class="p">(</span><span class="o">#</span><span class="n">typ</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="ow">and</span> <span class="s2">&quot;either &quot;</span> <span class="ow">or</span> <span class="s2">&quot;&quot;</span><span class="p">)</span> <span class="o">..</span> <span class="n">concat_list</span><span class="p">(</span><span class="n">typ</span><span class="p">,</span> <span class="s2">&quot; or &quot;</span><span class="p">)</span> </span><span id="L-358"><a href="#L-358"><span class="linenos" data-line="358"></span></a><span class="kr">end</span> </span><span id="L-359"><a href="#L-359"><span class="linenos" data-line="359"></span></a> </span><span id="L-360"><a href="#L-360"><span class="linenos" data-line="360"></span></a><span class="c1">-- Signal an error for a value `val` that is not of the right typ `typ` (which is either a string specifying a type or</span> </span><span id="L-361"><a href="#L-361"><span class="linenos" data-line="361"></span></a><span class="c1">-- a list of possible values, in the case where `set` was used). `name` is the name of the parameter and can be a</span> </span><span id="L-362"><a href="#L-362"><span class="linenos" data-line="362"></span></a><span class="c1">-- function to signal an error (which is assumed to automatically display the parameter&#39;s name and value). `seetext` is</span> </span><span id="L-363"><a href="#L-363"><span class="linenos" data-line="363"></span></a><span class="c1">-- an optional additional explanatory link to display (e.g. [[WT:LOL]], the list of possible languages and codes).</span> </span><span id="L-364"><a href="#L-364"><span class="linenos" data-line="364"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">convert_val_error</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">typ</span><span class="p">,</span> <span class="n">seetext</span><span class="p">)</span> </span><span id="L-365"><a href="#L-365"><span class="linenos" data-line="365"></span></a> <span class="kr">if</span> <span class="n">is_callable</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-366"><a href="#L-366"><span class="linenos" data-line="366"></span></a> <span class="kr">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">typ</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&quot;table&quot;</span> <span class="kr">then</span> </span><span id="L-367"><a href="#L-367"><span class="linenos" data-line="367"></span></a> <span class="n">typ</span> <span class="o">=</span> <span class="s2">&quot;choice, must be &quot;</span> <span class="o">..</span> <span class="n">format_choice_list</span><span class="p">(</span><span class="n">typ</span><span class="p">)</span> </span><span id="L-368"><a href="#L-368"><span class="linenos" data-line="368"></span></a> <span class="kr">end</span> </span><span id="L-369"><a href="#L-369"><span class="linenos" data-line="369"></span></a> <span class="n">name</span><span class="p">((</span><span class="s2">&quot;Invalid %s; the value %s is not valid%s&quot;</span><span class="p">):</span><span class="n">format</span><span class="p">(</span><span class="n">typ</span><span class="p">,</span> <span class="n">val</span><span class="p">,</span> <span class="n">seetext</span> <span class="ow">and</span> <span class="s2">&quot;; see &quot;</span> <span class="o">..</span> <span class="n">seetext</span> <span class="ow">or</span> <span class="s2">&quot;&quot;</span><span class="p">))</span> </span><span id="L-370"><a href="#L-370"><span class="linenos" data-line="370"></span></a> <span class="kr">else</span> </span><span id="L-371"><a href="#L-371"><span class="linenos" data-line="371"></span></a> <span class="kr">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">typ</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&quot;table&quot;</span> <span class="kr">then</span> </span><span id="L-372"><a href="#L-372"><span class="linenos" data-line="372"></span></a> <span class="n">typ</span> <span class="o">=</span> <span class="s2">&quot;must be &quot;</span> <span class="o">..</span> <span class="n">format_choice_list</span><span class="p">(</span><span class="n">typ</span><span class="p">)</span> </span><span id="L-373"><a href="#L-373"><span class="linenos" data-line="373"></span></a> <span class="kr">else</span> </span><span id="L-374"><a href="#L-374"><span class="linenos" data-line="374"></span></a> <span class="n">typ</span> <span class="o">=</span> <span class="s2">&quot;should be a valid &quot;</span> <span class="o">..</span> <span class="n">typ</span> </span><span id="L-375"><a href="#L-375"><span class="linenos" data-line="375"></span></a> <span class="kr">end</span> </span><span id="L-376"><a href="#L-376"><span class="linenos" data-line="376"></span></a> <span class="nb">error</span><span class="p">((</span><span class="s2">&quot;Parameter %s %s; the value %s is not valid.%s&quot;</span><span class="p">):</span><span class="n">format</span><span class="p">(</span><span class="n">dump</span><span class="p">(</span><span class="n">name</span><span class="p">),</span> <span class="n">typ</span><span class="p">,</span> <span class="n">dump</span><span class="p">(</span><span class="n">val</span><span class="p">),</span> </span><span id="L-377"><a href="#L-377"><span class="linenos" data-line="377"></span></a> <span class="n">seetext</span> <span class="ow">and</span> <span class="s2">&quot; See &quot;</span> <span class="o">..</span> <span class="n">seetext</span> <span class="o">..</span> <span class="s2">&quot;.&quot;</span> <span class="ow">or</span> <span class="s2">&quot;&quot;</span><span class="p">))</span> </span><span id="L-378"><a href="#L-378"><span class="linenos" data-line="378"></span></a> <span class="kr">end</span> </span><span id="L-379"><a href="#L-379"><span class="linenos" data-line="379"></span></a><span class="kr">end</span> </span><span id="L-380"><a href="#L-380"><span class="linenos" data-line="380"></span></a> </span><span id="L-381"><a href="#L-381"><span class="linenos" data-line="381"></span></a><span class="c1">-- Convert a value that is not a string or number to a string using mw.dumpObject(), for debugging purposes.</span> </span><span id="L-382"><a href="#L-382"><span class="linenos" data-line="382"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">dump_if_unusual</span><span class="p">(</span><span class="n">val</span><span class="p">)</span> </span><span id="L-383"><a href="#L-383"><span class="linenos" data-line="383"></span></a> <span class="kd">local</span> <span class="n">val_type</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="n">val</span><span class="p">)</span> </span><span id="L-384"><a href="#L-384"><span class="linenos" data-line="384"></span></a> <span class="kr">return</span> <span class="p">(</span><span class="n">val_type</span> <span class="o">==</span> <span class="s2">&quot;string&quot;</span> <span class="ow">or</span> <span class="n">val_type</span> <span class="o">==</span> <span class="s2">&quot;number&quot;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">val</span> <span class="ow">or</span> <span class="n">dump</span><span class="p">(</span><span class="n">val</span><span class="p">)</span> </span><span id="L-385"><a href="#L-385"><span class="linenos" data-line="385"></span></a><span class="kr">end</span> </span><span id="L-386"><a href="#L-386"><span class="linenos" data-line="386"></span></a> </span><span id="L-387"><a href="#L-387"><span class="linenos" data-line="387"></span></a><span class="c1">-- A helper function for use with generating error-signaling functions in the presence of raw value conversion. Format a</span> </span><span id="L-388"><a href="#L-388"><span class="linenos" data-line="388"></span></a><span class="c1">-- message `msg`, including the processed value `processed` if it is different from the raw value `rawval`; otherwise,</span> </span><span id="L-389"><a href="#L-389"><span class="linenos" data-line="389"></span></a><span class="c1">-- just return `msg`.</span> </span><span id="L-390"><a href="#L-390"><span class="linenos" data-line="390"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">msg_with_processed</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">rawval</span><span class="p">,</span> <span class="n">processed</span><span class="p">)</span> </span><span id="L-391"><a href="#L-391"><span class="linenos" data-line="391"></span></a> <span class="kr">if</span> <span class="n">rawval</span> <span class="o">==</span> <span class="n">processed</span> <span class="kr">then</span> </span><span id="L-392"><a href="#L-392"><span class="linenos" data-line="392"></span></a> <span class="kr">return</span> <span class="n">msg</span> </span><span id="L-393"><a href="#L-393"><span class="linenos" data-line="393"></span></a> <span class="kr">else</span> </span><span id="L-394"><a href="#L-394"><span class="linenos" data-line="394"></span></a> <span class="kr">return</span> <span class="p">(</span><span class="s2">&quot;%s (processed value %s)&quot;</span><span class="p">):</span><span class="n">format</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">dump_if_unusual</span><span class="p">(</span><span class="n">processed</span><span class="p">))</span> </span><span id="L-395"><a href="#L-395"><span class="linenos" data-line="395"></span></a> <span class="kr">end</span> </span><span id="L-396"><a href="#L-396"><span class="linenos" data-line="396"></span></a><span class="kr">end</span> </span><span id="L-397"><a href="#L-397"><span class="linenos" data-line="397"></span></a> </span><span id="L-398"><a href="#L-398"><span class="linenos" data-line="398"></span></a><span class="c1">-- Generate the appropriate error-signaling function given parameter value `val` and name `name`. If `name` is already</span> </span><span id="L-399"><a href="#L-399"><span class="linenos" data-line="399"></span></a><span class="c1">-- a function, it is just returned; otherwise a function is generated and returned that displays the passed-in messaeg</span> </span><span id="L-400"><a href="#L-400"><span class="linenos" data-line="400"></span></a><span class="c1">-- along with the parameter&#39;s name and value.</span> </span><span id="L-401"><a href="#L-401"><span class="linenos" data-line="401"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">make_parse_err</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span> </span><span id="L-402"><a href="#L-402"><span class="linenos" data-line="402"></span></a> <span class="kr">if</span> <span class="n">is_callable</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-403"><a href="#L-403"><span class="linenos" data-line="403"></span></a> <span class="kr">return</span> <span class="n">name</span> </span><span id="L-404"><a href="#L-404"><span class="linenos" data-line="404"></span></a> <span class="kr">else</span> </span><span id="L-405"><a href="#L-405"><span class="linenos" data-line="405"></span></a> <span class="kr">return</span> <span class="kr">function</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span> </span><span id="L-406"><a href="#L-406"><span class="linenos" data-line="406"></span></a> <span class="nb">error</span><span class="p">((</span><span class="s2">&quot;%s: parameter %s=%s&quot;</span><span class="p">):</span><span class="n">format</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">val</span><span class="p">))</span> </span><span id="L-407"><a href="#L-407"><span class="linenos" data-line="407"></span></a> <span class="kr">end</span> </span><span id="L-408"><a href="#L-408"><span class="linenos" data-line="408"></span></a> <span class="kr">end</span> </span><span id="L-409"><a href="#L-409"><span class="linenos" data-line="409"></span></a><span class="kr">end</span> </span><span id="L-410"><a href="#L-410"><span class="linenos" data-line="410"></span></a> </span><span id="L-411"><a href="#L-411"><span class="linenos" data-line="411"></span></a><span class="c1">-- A reimplementation of ipairs() for use in a single-variable for-loop (like with gsplit()) instead of a two-variable</span> </span><span id="L-412"><a href="#L-412"><span class="linenos" data-line="412"></span></a><span class="c1">-- for-loop (like with ipairs()). If we changed the return statement below to `return index, list[index]`, we&#39;d get</span> </span><span id="L-413"><a href="#L-413"><span class="linenos" data-line="413"></span></a><span class="c1">-- ipairs() directly.</span> </span><span id="L-414"><a href="#L-414"><span class="linenos" data-line="414"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">iterate_over_list</span><span class="p">(</span><span class="n">list</span><span class="p">)</span> </span><span id="L-415"><a href="#L-415"><span class="linenos" data-line="415"></span></a> <span class="kd">local</span> <span class="n">index</span><span class="p">,</span> <span class="n">len</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="o">#</span><span class="n">list</span> </span><span id="L-416"><a href="#L-416"><span class="linenos" data-line="416"></span></a> <span class="kr">return</span> <span class="kr">function</span><span class="p">()</span> </span><span id="L-417"><a href="#L-417"><span class="linenos" data-line="417"></span></a> <span class="n">index</span> <span class="o">=</span> <span class="n">index</span> <span class="o">+</span> <span class="mi">1</span> </span><span id="L-418"><a href="#L-418"><span class="linenos" data-line="418"></span></a> <span class="kr">if</span> <span class="n">index</span> <span class="o">&lt;=</span> <span class="n">len</span> <span class="kr">then</span> </span><span id="L-419"><a href="#L-419"><span class="linenos" data-line="419"></span></a> <span class="kr">return</span> <span class="n">list</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> </span><span id="L-420"><a href="#L-420"><span class="linenos" data-line="420"></span></a> <span class="kr">end</span> </span><span id="L-421"><a href="#L-421"><span class="linenos" data-line="421"></span></a> <span class="kr">end</span> </span><span id="L-422"><a href="#L-422"><span class="linenos" data-line="422"></span></a><span class="kr">end</span> </span><span id="L-423"><a href="#L-423"><span class="linenos" data-line="423"></span></a> </span><span id="L-424"><a href="#L-424"><span class="linenos" data-line="424"></span></a><span class="c1">-- A helper function for use with `sublist`. It is an iterator function for use in a for-loop that returns split</span> </span><span id="L-425"><a href="#L-425"><span class="linenos" data-line="425"></span></a><span class="c1">-- elements of `val` using `sublist` (a Lua split pattern; boolean `true` to split on commas optionally surrounded by</span> </span><span id="L-426"><a href="#L-426"><span class="linenos" data-line="426"></span></a><span class="c1">-- whitespace; &quot;comma without whitespace&quot; to split only on commas not followed by whitespace which have not been escaped</span> </span><span id="L-427"><a href="#L-427"><span class="linenos" data-line="427"></span></a><span class="c1">-- by a backslash; or a function to do the splitting, which is passed two values, the value to split and a function to</span> </span><span id="L-428"><a href="#L-428"><span class="linenos" data-line="428"></span></a><span class="c1">-- signal an error, and should return a list of the split elements). `name` is the parameter name or error-signaling</span> </span><span id="L-429"><a href="#L-429"><span class="linenos" data-line="429"></span></a><span class="c1">-- function passed into convert_val().</span> </span><span id="L-430"><a href="#L-430"><span class="linenos" data-line="430"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">split_sublist</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">sublist</span><span class="p">)</span> </span><span id="L-431"><a href="#L-431"><span class="linenos" data-line="431"></span></a> <span class="kr">if</span> <span class="n">sublist</span> <span class="o">==</span> <span class="kc">true</span> <span class="kr">then</span> </span><span id="L-432"><a href="#L-432"><span class="linenos" data-line="432"></span></a> <span class="n">sublist</span> <span class="o">=</span> <span class="s2">&quot;%s*,%s*&quot;</span> </span><span id="L-433"><a href="#L-433"><span class="linenos" data-line="433"></span></a> <span class="kr">elseif</span> <span class="n">sublist</span> <span class="o">==</span> <span class="s2">&quot;comma without whitespace&quot;</span> <span class="kr">then</span> </span><span id="L-434"><a href="#L-434"><span class="linenos" data-line="434"></span></a> <span class="n">sublist</span> <span class="o">=</span> <span class="n">split_on_comma_without_whitespace</span> </span><span id="L-435"><a href="#L-435"><span class="linenos" data-line="435"></span></a> <span class="kr">end</span> </span><span id="L-436"><a href="#L-436"><span class="linenos" data-line="436"></span></a> <span class="kr">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">sublist</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&quot;string&quot;</span> <span class="kr">then</span> </span><span id="L-437"><a href="#L-437"><span class="linenos" data-line="437"></span></a> <span class="kr">return</span> <span class="n">gsplit</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">sublist</span><span class="p">)</span> </span><span id="L-438"><a href="#L-438"><span class="linenos" data-line="438"></span></a> <span class="kr">elseif</span> <span class="n">is_callable</span><span class="p">(</span><span class="n">sublist</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-439"><a href="#L-439"><span class="linenos" data-line="439"></span></a> <span class="kd">local</span> <span class="n">retval</span> <span class="o">=</span> <span class="n">sublist</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">make_parse_err</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">name</span><span class="p">))</span> </span><span id="L-440"><a href="#L-440"><span class="linenos" data-line="440"></span></a> <span class="kr">return</span> <span class="n">iterate_over_list</span><span class="p">(</span><span class="n">retval</span><span class="p">)</span> </span><span id="L-441"><a href="#L-441"><span class="linenos" data-line="441"></span></a> <span class="kr">else</span> </span><span id="L-442"><a href="#L-442"><span class="linenos" data-line="442"></span></a> <span class="nb">error</span><span class="p">((</span><span class="s1">&#39;Internal error: Expected `sublist` to be of type &quot;string&quot; or &quot;function&quot; or boolean `true`, but saw %s&#39;</span><span class="p">):</span><span class="n">format</span><span class="p">(</span><span class="n">dump</span><span class="p">(</span><span class="n">sublist</span><span class="p">)))</span> </span><span id="L-443"><a href="#L-443"><span class="linenos" data-line="443"></span></a> <span class="kr">end</span> </span><span id="L-444"><a href="#L-444"><span class="linenos" data-line="444"></span></a><span class="kr">end</span> </span><span id="L-445"><a href="#L-445"><span class="linenos" data-line="445"></span></a> </span><span id="L-446"><a href="#L-446"><span class="linenos" data-line="446"></span></a><span class="c1">-- For parameter named `name` with value `val` and param spec `param`, if the `set` field is specified, verify that the</span> </span><span id="L-447"><a href="#L-447"><span class="linenos" data-line="447"></span></a><span class="c1">-- value is one of the one specified in `set`, and throw an error otherwise. `name` is taken directly from the</span> </span><span id="L-448"><a href="#L-448"><span class="linenos" data-line="448"></span></a><span class="c1">-- corresponding parameter passed into convert_val() and may be a function to signal an error. Optional `typ` is a</span> </span><span id="L-449"><a href="#L-449"><span class="linenos" data-line="449"></span></a><span class="c1">-- string specifying the conversion type of `val` and is used for special-casing: If `typ` is &quot;boolean&quot;, an internal</span> </span><span id="L-450"><a href="#L-450"><span class="linenos" data-line="450"></span></a><span class="c1">-- error is thrown (since `set` cannot be used in conjunction with booleans) and if `typ` is &quot;number&quot;, no checking</span> </span><span id="L-451"><a href="#L-451"><span class="linenos" data-line="451"></span></a><span class="c1">-- happens because in this case `set` contains numbers and is checked inside the number conversion function itself,</span> </span><span id="L-452"><a href="#L-452"><span class="linenos" data-line="452"></span></a><span class="c1">-- after converting `val` to a number.</span> </span><span id="L-453"><a href="#L-453"><span class="linenos" data-line="453"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">check_set</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">param</span><span class="p">,</span> <span class="n">typ</span><span class="p">)</span> </span><span id="L-454"><a href="#L-454"><span class="linenos" data-line="454"></span></a> <span class="kr">if</span> <span class="n">typ</span> <span class="o">==</span> <span class="s2">&quot;boolean&quot;</span> <span class="kr">then</span> </span><span id="L-455"><a href="#L-455"><span class="linenos" data-line="455"></span></a> <span class="nb">error</span><span class="p">((</span><span class="s1">&#39;Internal error: Cannot use `set` with `type = &quot;%s&quot;`&#39;</span><span class="p">):</span><span class="n">format</span><span class="p">(</span><span class="n">typ</span><span class="p">))</span> </span><span id="L-456"><a href="#L-456"><span class="linenos" data-line="456"></span></a> <span class="kr">end</span> </span><span id="L-457"><a href="#L-457"><span class="linenos" data-line="457"></span></a> <span class="kr">if</span> <span class="n">typ</span> <span class="o">==</span> <span class="s2">&quot;number&quot;</span> <span class="kr">then</span> </span><span id="L-458"><a href="#L-458"><span class="linenos" data-line="458"></span></a> <span class="c1">-- Needs to be special cased because the check happens after conversion to numbers.</span> </span><span id="L-459"><a href="#L-459"><span class="linenos" data-line="459"></span></a> <span class="kr">return</span> </span><span id="L-460"><a href="#L-460"><span class="linenos" data-line="460"></span></a> <span class="kr">end</span> </span><span id="L-461"><a href="#L-461"><span class="linenos" data-line="461"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">param</span><span class="p">.</span><span class="n">set</span><span class="p">[</span><span class="n">val</span><span class="p">]</span> <span class="kr">then</span> </span><span id="L-462"><a href="#L-462"><span class="linenos" data-line="462"></span></a> <span class="kd">local</span> <span class="n">list</span> <span class="o">=</span> <span class="p">{}</span> </span><span id="L-463"><a href="#L-463"><span class="linenos" data-line="463"></span></a> <span class="kr">for</span> <span class="n">k</span> <span class="kr">in</span> <span class="nb">pairs</span><span class="p">(</span><span class="n">param</span><span class="p">.</span><span class="n">set</span><span class="p">)</span> <span class="kr">do</span> </span><span id="L-464"><a href="#L-464"><span class="linenos" data-line="464"></span></a> <span class="n">insert</span><span class="p">(</span><span class="n">list</span><span class="p">,</span> <span class="n">dump</span><span class="p">(</span><span class="n">k</span><span class="p">))</span> </span><span id="L-465"><a href="#L-465"><span class="linenos" data-line="465"></span></a> <span class="kr">end</span> </span><span id="L-466"><a href="#L-466"><span class="linenos" data-line="466"></span></a> <span class="n">sort</span><span class="p">(</span><span class="n">list</span><span class="p">)</span> </span><span id="L-467"><a href="#L-467"><span class="linenos" data-line="467"></span></a> <span class="c1">-- If the parameter is not required then put &quot;or empty&quot; at the end of the list, to avoid implying the parameter is actually required.</span> </span><span id="L-468"><a href="#L-468"><span class="linenos" data-line="468"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">param</span><span class="p">.</span><span class="n">required</span> <span class="kr">then</span> </span><span id="L-469"><a href="#L-469"><span class="linenos" data-line="469"></span></a> <span class="n">insert</span><span class="p">(</span><span class="n">list</span><span class="p">,</span> <span class="s2">&quot;empty&quot;</span><span class="p">)</span> </span><span id="L-470"><a href="#L-470"><span class="linenos" data-line="470"></span></a> <span class="kr">end</span> </span><span id="L-471"><a href="#L-471"><span class="linenos" data-line="471"></span></a> <span class="n">convert_val_error</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">list</span><span class="p">)</span> </span><span id="L-472"><a href="#L-472"><span class="linenos" data-line="472"></span></a> <span class="kr">end</span> </span><span id="L-473"><a href="#L-473"><span class="linenos" data-line="473"></span></a><span class="kr">end</span> </span><span id="L-474"><a href="#L-474"><span class="linenos" data-line="474"></span></a> </span><span id="L-475"><a href="#L-475"><span class="linenos" data-line="475"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">convert_language</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">param</span><span class="p">,</span> <span class="n">allow_etym</span><span class="p">)</span> </span><span id="L-476"><a href="#L-476"><span class="linenos" data-line="476"></span></a> <span class="kd">local</span> <span class="n">lang</span> <span class="o">=</span> <span class="nb">require</span><span class="p">(</span><span class="n">languages_module</span><span class="p">)[</span><span class="n">param</span><span class="p">.</span><span class="n">method</span> <span class="o">==</span> <span class="s2">&quot;name&quot;</span> <span class="ow">and</span> <span class="s2">&quot;getByCanonicalName&quot;</span> <span class="ow">or</span> <span class="s2">&quot;getByCode&quot;</span><span class="p">](</span><span class="n">val</span><span class="p">,</span> <span class="kc">nil</span><span class="p">,</span> <span class="n">allow_etym</span><span class="p">,</span> <span class="n">param</span><span class="p">.</span><span class="n">family</span><span class="p">)</span> </span><span id="L-477"><a href="#L-477"><span class="linenos" data-line="477"></span></a> <span class="kr">if</span> <span class="n">lang</span> <span class="kr">then</span> </span><span id="L-478"><a href="#L-478"><span class="linenos" data-line="478"></span></a> <span class="kr">return</span> <span class="n">lang</span> </span><span id="L-479"><a href="#L-479"><span class="linenos" data-line="479"></span></a> <span class="kr">end</span> </span><span id="L-480"><a href="#L-480"><span class="linenos" data-line="480"></span></a> <span class="kd">local</span> <span class="n">list</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;language&quot;</span><span class="p">}</span> </span><span id="L-481"><a href="#L-481"><span class="linenos" data-line="481"></span></a> <span class="kd">local</span> <span class="n">links</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;[[WT:LOL]]&quot;</span><span class="p">}</span> </span><span id="L-482"><a href="#L-482"><span class="linenos" data-line="482"></span></a> <span class="kr">if</span> <span class="n">allow_etym</span> <span class="kr">then</span> </span><span id="L-483"><a href="#L-483"><span class="linenos" data-line="483"></span></a> <span class="n">insert</span><span class="p">(</span><span class="n">list</span><span class="p">,</span> <span class="s2">&quot;etymology language&quot;</span><span class="p">)</span> </span><span id="L-484"><a href="#L-484"><span class="linenos" data-line="484"></span></a> <span class="n">insert</span><span class="p">(</span><span class="n">links</span><span class="p">,</span> <span class="s2">&quot;[[WT:LOL/E]]&quot;</span><span class="p">)</span> </span><span id="L-485"><a href="#L-485"><span class="linenos" data-line="485"></span></a> <span class="kr">end</span> </span><span id="L-486"><a href="#L-486"><span class="linenos" data-line="486"></span></a> <span class="kr">if</span> <span class="n">param</span><span class="p">.</span><span class="n">family</span> <span class="kr">then</span> </span><span id="L-487"><a href="#L-487"><span class="linenos" data-line="487"></span></a> <span class="n">insert</span><span class="p">(</span><span class="n">list</span><span class="p">,</span> <span class="s2">&quot;family&quot;</span><span class="p">)</span> </span><span id="L-488"><a href="#L-488"><span class="linenos" data-line="488"></span></a> <span class="n">insert</span><span class="p">(</span><span class="n">links</span><span class="p">,</span> <span class="s2">&quot;[[WT:LOF]]&quot;</span><span class="p">)</span> </span><span id="L-489"><a href="#L-489"><span class="linenos" data-line="489"></span></a> <span class="kr">end</span> </span><span id="L-490"><a href="#L-490"><span class="linenos" data-line="490"></span></a> <span class="n">convert_val_error</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">concat_list</span><span class="p">(</span><span class="n">list</span><span class="p">,</span> <span class="s2">&quot; or &quot;</span><span class="p">)</span> <span class="o">..</span> <span class="s2">&quot; &quot;</span> <span class="o">..</span> <span class="p">(</span><span class="n">param</span><span class="p">.</span><span class="n">method</span> <span class="o">==</span> <span class="s2">&quot;name&quot;</span> <span class="ow">and</span> <span class="s2">&quot;name&quot;</span> <span class="ow">or</span> <span class="s2">&quot;code&quot;</span><span class="p">),</span> </span><span id="L-491"><a href="#L-491"><span class="linenos" data-line="491"></span></a> <span class="n">concat_list</span><span class="p">(</span><span class="n">links</span><span class="p">,</span> <span class="s2">&quot; and &quot;</span><span class="p">))</span> </span><span id="L-492"><a href="#L-492"><span class="linenos" data-line="492"></span></a><span class="kr">end</span> </span><span id="L-493"><a href="#L-493"><span class="linenos" data-line="493"></span></a> </span><span id="L-494"><a href="#L-494"><span class="linenos" data-line="494"></span></a><span class="cm">--[==[ func: export.convert_val(val, name, param)</span> </span><span id="L-495"><a href="#L-495"><span class="linenos" data-line="495"></span></a><span class="cm">Convert a parameter value according to the associated specs listed in the `params` table passed to</span> </span><span id="L-496"><a href="#L-496"><span class="linenos" data-line="496"></span></a><span class="cm">[[Module:parameters]]. `val` is the value to convert for a parameter whose name is `name` (used only in error messages).</span> </span><span id="L-497"><a href="#L-497"><span class="linenos" data-line="497"></span></a><span class="cm">`param` is the spec (the value part of the `params` table for the parameter). In place of passing in the parameter name,</span> </span><span id="L-498"><a href="#L-498"><span class="linenos" data-line="498"></span></a><span class="cm">`name` can be a function that throws an error, displaying the specified message along with the parameter name and value.</span> </span><span id="L-499"><a href="#L-499"><span class="linenos" data-line="499"></span></a><span class="cm">This function processes all the conversion-related fields in `param`, including `type`, `set`, `sublist`, `convert`,</span> </span><span id="L-500"><a href="#L-500"><span class="linenos" data-line="500"></span></a><span class="cm">etc. It returns the converted value.</span> </span><span id="L-501"><a href="#L-501"><span class="linenos" data-line="501"></span></a><span class="cm">]==]</span> </span><span id="L-502"><a href="#L-502"><span class="linenos" data-line="502"></span></a><span class="kd">local</span> <span class="n">convert_val</span> <span class="o">=</span> <span class="nb">setmetatable</span><span class="p">({</span> </span><span id="L-503"><a href="#L-503"><span class="linenos" data-line="503"></span></a> <span class="p">[</span><span class="s2">&quot;boolean&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kr">function</span><span class="p">(</span><span class="n">val</span><span class="p">)</span> </span><span id="L-504"><a href="#L-504"><span class="linenos" data-line="504"></span></a> <span class="kr">return</span> <span class="n">yesno</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="kc">true</span><span class="p">)</span> </span><span id="L-505"><a href="#L-505"><span class="linenos" data-line="505"></span></a> <span class="kr">end</span><span class="p">,</span> </span><span id="L-506"><a href="#L-506"><span class="linenos" data-line="506"></span></a> </span><span id="L-507"><a href="#L-507"><span class="linenos" data-line="507"></span></a> <span class="p">[</span><span class="s2">&quot;family&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kr">function</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">param</span><span class="p">)</span> </span><span id="L-508"><a href="#L-508"><span class="linenos" data-line="508"></span></a> <span class="kr">return</span> <span class="nb">require</span><span class="p">(</span><span class="n">families_module</span><span class="p">)[</span><span class="n">param</span><span class="p">.</span><span class="n">method</span> <span class="o">==</span> <span class="s2">&quot;name&quot;</span> <span class="ow">and</span> <span class="s2">&quot;getByCanonicalName&quot;</span> <span class="ow">or</span> <span class="s2">&quot;getByCode&quot;</span><span class="p">](</span><span class="n">val</span><span class="p">)</span> <span class="ow">or</span> </span><span id="L-509"><a href="#L-509"><span class="linenos" data-line="509"></span></a> <span class="n">convert_val_error</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="s2">&quot;family &quot;</span> <span class="o">..</span> <span class="p">(</span><span class="n">param</span><span class="p">.</span><span class="n">method</span> <span class="o">==</span> <span class="s2">&quot;name&quot;</span> <span class="ow">and</span> <span class="s2">&quot;name&quot;</span> <span class="ow">or</span> <span class="s2">&quot;code&quot;</span><span class="p">),</span> <span class="s2">&quot;[[WT:LOF]]&quot;</span><span class="p">)</span> </span><span id="L-510"><a href="#L-510"><span class="linenos" data-line="510"></span></a> <span class="kr">end</span><span class="p">,</span> </span><span id="L-511"><a href="#L-511"><span class="linenos" data-line="511"></span></a> </span><span id="L-512"><a href="#L-512"><span class="linenos" data-line="512"></span></a> <span class="p">[</span><span class="s2">&quot;labels&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kr">function</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">param</span><span class="p">)</span> </span><span id="L-513"><a href="#L-513"><span class="linenos" data-line="513"></span></a> <span class="c1">-- FIXME: Should be able to pass in a parse_err function.</span> </span><span id="L-514"><a href="#L-514"><span class="linenos" data-line="514"></span></a> <span class="kr">return</span> <span class="nb">require</span><span class="p">(</span><span class="n">labels_module</span><span class="p">).</span><span class="n">split_labels_on_comma</span><span class="p">(</span><span class="n">val</span><span class="p">)</span> </span><span id="L-515"><a href="#L-515"><span class="linenos" data-line="515"></span></a> <span class="kr">end</span><span class="p">,</span> </span><span id="L-516"><a href="#L-516"><span class="linenos" data-line="516"></span></a> </span><span id="L-517"><a href="#L-517"><span class="linenos" data-line="517"></span></a> <span class="p">[</span><span class="s2">&quot;references&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kr">function</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">param</span><span class="p">)</span> </span><span id="L-518"><a href="#L-518"><span class="linenos" data-line="518"></span></a> <span class="kr">return</span> <span class="nb">require</span><span class="p">(</span><span class="n">references_module</span><span class="p">).</span><span class="n">parse_references</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">make_parse_err</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">name</span><span class="p">))</span> </span><span id="L-519"><a href="#L-519"><span class="linenos" data-line="519"></span></a> <span class="kr">end</span><span class="p">,</span> </span><span id="L-520"><a href="#L-520"><span class="linenos" data-line="520"></span></a> </span><span id="L-521"><a href="#L-521"><span class="linenos" data-line="521"></span></a> <span class="p">[</span><span class="s2">&quot;qualifier&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kr">function</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">param</span><span class="p">)</span> </span><span id="L-522"><a href="#L-522"><span class="linenos" data-line="522"></span></a> <span class="kr">return</span> <span class="p">{</span><span class="n">val</span><span class="p">}</span> </span><span id="L-523"><a href="#L-523"><span class="linenos" data-line="523"></span></a> <span class="kr">end</span><span class="p">,</span> </span><span id="L-524"><a href="#L-524"><span class="linenos" data-line="524"></span></a> </span><span id="L-525"><a href="#L-525"><span class="linenos" data-line="525"></span></a> <span class="p">[</span><span class="s2">&quot;language&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kr">function</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">param</span><span class="p">)</span> </span><span id="L-526"><a href="#L-526"><span class="linenos" data-line="526"></span></a> <span class="kr">return</span> <span class="n">convert_language</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">param</span><span class="p">,</span> <span class="kc">true</span><span class="p">)</span> </span><span id="L-527"><a href="#L-527"><span class="linenos" data-line="527"></span></a> <span class="kr">end</span><span class="p">,</span> </span><span id="L-528"><a href="#L-528"><span class="linenos" data-line="528"></span></a> </span><span id="L-529"><a href="#L-529"><span class="linenos" data-line="529"></span></a> <span class="p">[</span><span class="s2">&quot;full language&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kr">function</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">param</span><span class="p">)</span> </span><span id="L-530"><a href="#L-530"><span class="linenos" data-line="530"></span></a> <span class="kr">return</span> <span class="n">convert_language</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">param</span><span class="p">)</span> </span><span id="L-531"><a href="#L-531"><span class="linenos" data-line="531"></span></a> <span class="kr">end</span><span class="p">,</span> </span><span id="L-532"><a href="#L-532"><span class="linenos" data-line="532"></span></a> </span><span id="L-533"><a href="#L-533"><span class="linenos" data-line="533"></span></a> <span class="p">[</span><span class="s2">&quot;number&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kr">function</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">param</span><span class="p">)</span> </span><span id="L-534"><a href="#L-534"><span class="linenos" data-line="534"></span></a> <span class="kr">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">val</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&quot;number&quot;</span> <span class="kr">then</span> </span><span id="L-535"><a href="#L-535"><span class="linenos" data-line="535"></span></a> <span class="kr">return</span> <span class="n">val</span> </span><span id="L-536"><a href="#L-536"><span class="linenos" data-line="536"></span></a> <span class="kr">end</span> </span><span id="L-537"><a href="#L-537"><span class="linenos" data-line="537"></span></a> <span class="c1">-- Avoid converting inputs like &quot;nan&quot; or &quot;inf&quot;, and disallow 0x hex inputs unless explicitly enabled</span> </span><span id="L-538"><a href="#L-538"><span class="linenos" data-line="538"></span></a> <span class="c1">-- with `allow_hex`.</span> </span><span id="L-539"><a href="#L-539"><span class="linenos" data-line="539"></span></a> <span class="n">val</span> <span class="o">=</span> <span class="nb">tonumber</span><span class="p">(</span> </span><span id="L-540"><a href="#L-540"><span class="linenos" data-line="540"></span></a> <span class="n">match</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="s2">&quot;^[+-]?%d+%.?%d*$&quot;</span><span class="p">)</span> <span class="ow">or</span> </span><span id="L-541"><a href="#L-541"><span class="linenos" data-line="541"></span></a> <span class="n">param</span><span class="p">.</span><span class="n">allow_hex</span> <span class="ow">and</span> <span class="n">match</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="s2">&quot;^[+-]?0[Xx]%x+%.?%x*$&quot;</span><span class="p">)</span> </span><span id="L-542"><a href="#L-542"><span class="linenos" data-line="542"></span></a> <span class="p">)</span> <span class="ow">or</span> <span class="n">convert_val_error</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="s2">&quot;number&quot;</span><span class="p">)</span> </span><span id="L-543"><a href="#L-543"><span class="linenos" data-line="543"></span></a> <span class="kr">if</span> <span class="n">param</span><span class="p">.</span><span class="n">set</span> <span class="kr">then</span> </span><span id="L-544"><a href="#L-544"><span class="linenos" data-line="544"></span></a> <span class="c1">-- Don&#39;t pass in &quot;number&quot; here; otherwise no checking will happen.</span> </span><span id="L-545"><a href="#L-545"><span class="linenos" data-line="545"></span></a> <span class="n">check_set</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">param</span><span class="p">)</span> </span><span id="L-546"><a href="#L-546"><span class="linenos" data-line="546"></span></a> <span class="kr">end</span> </span><span id="L-547"><a href="#L-547"><span class="linenos" data-line="547"></span></a> <span class="kr">return</span> <span class="n">val</span> </span><span id="L-548"><a href="#L-548"><span class="linenos" data-line="548"></span></a> <span class="kr">end</span><span class="p">,</span> </span><span id="L-549"><a href="#L-549"><span class="linenos" data-line="549"></span></a> </span><span id="L-550"><a href="#L-550"><span class="linenos" data-line="550"></span></a> <span class="p">[</span><span class="s2">&quot;script&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kr">function</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">param</span><span class="p">)</span> </span><span id="L-551"><a href="#L-551"><span class="linenos" data-line="551"></span></a> <span class="kr">return</span> <span class="nb">require</span><span class="p">(</span><span class="n">scripts_module</span><span class="p">)[</span><span class="n">param</span><span class="p">.</span><span class="n">method</span> <span class="o">==</span> <span class="s2">&quot;name&quot;</span> <span class="ow">and</span> <span class="s2">&quot;getByCanonicalName&quot;</span> <span class="ow">or</span> <span class="s2">&quot;getByCode&quot;</span><span class="p">](</span><span class="n">val</span><span class="p">)</span> <span class="ow">or</span> </span><span id="L-552"><a href="#L-552"><span class="linenos" data-line="552"></span></a> <span class="n">convert_val_error</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="s2">&quot;script &quot;</span> <span class="o">..</span> <span class="p">(</span><span class="n">param</span><span class="p">.</span><span class="n">method</span> <span class="o">==</span> <span class="s2">&quot;name&quot;</span> <span class="ow">and</span> <span class="s2">&quot;name&quot;</span> <span class="ow">or</span> <span class="s2">&quot;code&quot;</span><span class="p">),</span> <span class="s2">&quot;[[WT:LOS]]&quot;</span><span class="p">)</span> </span><span id="L-553"><a href="#L-553"><span class="linenos" data-line="553"></span></a> <span class="kr">end</span><span class="p">,</span> </span><span id="L-554"><a href="#L-554"><span class="linenos" data-line="554"></span></a> </span><span id="L-555"><a href="#L-555"><span class="linenos" data-line="555"></span></a> <span class="p">[</span><span class="s2">&quot;string&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kr">function</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">param</span><span class="p">)</span> </span><span id="L-556"><a href="#L-556"><span class="linenos" data-line="556"></span></a> <span class="kr">return</span> <span class="n">val</span> </span><span id="L-557"><a href="#L-557"><span class="linenos" data-line="557"></span></a> <span class="kr">end</span><span class="p">,</span> </span><span id="L-558"><a href="#L-558"><span class="linenos" data-line="558"></span></a> </span><span id="L-559"><a href="#L-559"><span class="linenos" data-line="559"></span></a> <span class="p">[</span><span class="s2">&quot;title&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kr">function</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">param</span><span class="p">)</span> </span><span id="L-560"><a href="#L-560"><span class="linenos" data-line="560"></span></a> <span class="n">val</span> <span class="o">=</span> <span class="nb">tostring</span><span class="p">(</span><span class="n">val</span><span class="p">)</span> </span><span id="L-561"><a href="#L-561"><span class="linenos" data-line="561"></span></a> <span class="kd">local</span> <span class="n">namespace</span><span class="p">,</span> <span class="n">title</span> <span class="o">=</span> <span class="n">param</span><span class="p">.</span><span class="n">namespace</span> </span><span id="L-562"><a href="#L-562"><span class="linenos" data-line="562"></span></a> <span class="kr">if</span> <span class="n">param</span><span class="p">.</span><span class="n">strict</span> <span class="kr">then</span> </span><span id="L-563"><a href="#L-563"><span class="linenos" data-line="563"></span></a> <span class="c1">-- Always applies the namespace prefix.</span> </span><span id="L-564"><a href="#L-564"><span class="linenos" data-line="564"></span></a> <span class="n">title</span> <span class="o">=</span> <span class="n">make_title</span><span class="p">(</span><span class="n">namespace</span> <span class="ow">or</span> <span class="mi">0</span><span class="p">,</span> <span class="n">val</span><span class="p">)</span> </span><span id="L-565"><a href="#L-565"><span class="linenos" data-line="565"></span></a> <span class="kr">else</span> </span><span id="L-566"><a href="#L-566"><span class="linenos" data-line="566"></span></a> <span class="c1">-- Applies the namespace prefix if `val` doesn&#39;t contain one already.</span> </span><span id="L-567"><a href="#L-567"><span class="linenos" data-line="567"></span></a> <span class="n">title</span> <span class="o">=</span> <span class="n">new_title</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">namespace</span><span class="p">)</span> </span><span id="L-568"><a href="#L-568"><span class="linenos" data-line="568"></span></a> <span class="c1">-- If the input starts with an interwiki prefix, the returned title will be an interwiki title. If `namespace` is specified and not the mainspace, force the title to be a namespace title instead (e.g. &quot;el:All topics&quot; with namespace = 14 returns &quot;el:Category:All topics&quot;, but we want &quot;Category:el:All topics&quot; instead).</span> </span><span id="L-569"><a href="#L-569"><span class="linenos" data-line="569"></span></a> <span class="kr">if</span> <span class="n">title</span> <span class="ow">and</span> <span class="n">title</span><span class="p">.</span><span class="n">isExternal</span> <span class="ow">and</span> <span class="n">namespace</span> <span class="ow">and</span> <span class="n">namespace</span> <span class="o">~=</span> <span class="mi">0</span> <span class="kr">then</span> </span><span id="L-570"><a href="#L-570"><span class="linenos" data-line="570"></span></a> <span class="n">title</span> <span class="o">=</span> <span class="n">make_title</span><span class="p">(</span><span class="n">namespace</span><span class="p">,</span> <span class="n">val</span><span class="p">)</span> </span><span id="L-571"><a href="#L-571"><span class="linenos" data-line="571"></span></a> <span class="kr">end</span> </span><span id="L-572"><a href="#L-572"><span class="linenos" data-line="572"></span></a> <span class="kr">end</span> </span><span id="L-573"><a href="#L-573"><span class="linenos" data-line="573"></span></a> <span class="kr">return</span> <span class="n">is_valid_title</span><span class="p">(</span><span class="n">title</span><span class="p">)</span> <span class="ow">and</span> <span class="n">title</span> <span class="ow">or</span> <span class="n">convert_val_error</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="s2">&quot;Wiktionary page title&quot;</span><span class="p">)</span> </span><span id="L-574"><a href="#L-574"><span class="linenos" data-line="574"></span></a> <span class="kr">end</span><span class="p">,</span> </span><span id="L-575"><a href="#L-575"><span class="linenos" data-line="575"></span></a> </span><span id="L-576"><a href="#L-576"><span class="linenos" data-line="576"></span></a> <span class="p">[</span><span class="s2">&quot;wikimedia language&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="kr">function</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">param</span><span class="p">)</span> </span><span id="L-577"><a href="#L-577"><span class="linenos" data-line="577"></span></a> <span class="kd">local</span> <span class="n">fallback</span> <span class="o">=</span> <span class="n">param</span><span class="p">.</span><span class="n">method</span> <span class="o">==</span> <span class="s2">&quot;fallback&quot;</span> </span><span id="L-578"><a href="#L-578"><span class="linenos" data-line="578"></span></a> <span class="kd">local</span> <span class="n">lang</span> <span class="o">=</span> <span class="nb">require</span><span class="p">(</span><span class="n">wikimedia_languages_module</span><span class="p">)[</span><span class="n">fallback</span> <span class="ow">and</span> <span class="s2">&quot;getByCodeWithFallback&quot;</span> <span class="ow">or</span> <span class="s2">&quot;getByCode&quot;</span><span class="p">](</span><span class="n">val</span><span class="p">)</span> </span><span id="L-579"><a href="#L-579"><span class="linenos" data-line="579"></span></a> <span class="kr">if</span> <span class="n">lang</span> <span class="kr">then</span> </span><span id="L-580"><a href="#L-580"><span class="linenos" data-line="580"></span></a> <span class="kr">return</span> <span class="n">lang</span> </span><span id="L-581"><a href="#L-581"><span class="linenos" data-line="581"></span></a> <span class="kr">end</span> </span><span id="L-582"><a href="#L-582"><span class="linenos" data-line="582"></span></a> <span class="kd">local</span> <span class="n">list</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;wikimedia language&quot;</span><span class="p">}</span> </span><span id="L-583"><a href="#L-583"><span class="linenos" data-line="583"></span></a> <span class="kr">if</span> <span class="n">fallback</span> <span class="kr">then</span> </span><span id="L-584"><a href="#L-584"><span class="linenos" data-line="584"></span></a> <span class="n">insert</span><span class="p">(</span><span class="n">list</span><span class="p">,</span> <span class="s2">&quot;language&quot;</span><span class="p">)</span> </span><span id="L-585"><a href="#L-585"><span class="linenos" data-line="585"></span></a> <span class="kr">end</span> </span><span id="L-586"><a href="#L-586"><span class="linenos" data-line="586"></span></a> <span class="n">convert_val_error</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">concat_list</span><span class="p">(</span><span class="n">list</span><span class="p">,</span> <span class="s2">&quot; or &quot;</span><span class="p">)</span> <span class="o">..</span> <span class="s2">&quot; code&quot;</span><span class="p">)</span> </span><span id="L-587"><a href="#L-587"><span class="linenos" data-line="587"></span></a> <span class="kr">end</span><span class="p">,</span> </span><span id="L-588"><a href="#L-588"><span class="linenos" data-line="588"></span></a><span class="p">},</span> <span class="p">{</span> </span><span id="L-589"><a href="#L-589"><span class="linenos" data-line="589"></span></a> <span class="n">__call</span> <span class="o">=</span> <span class="kr">function</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">val</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">param</span><span class="p">)</span> </span><span id="L-590"><a href="#L-590"><span class="linenos" data-line="590"></span></a> <span class="kd">local</span> <span class="n">typ</span> <span class="o">=</span> <span class="n">param</span><span class="p">.</span><span class="n">type</span> <span class="ow">or</span> <span class="s2">&quot;string&quot;</span> </span><span id="L-591"><a href="#L-591"><span class="linenos" data-line="591"></span></a> <span class="c1">-- If param.type is a function, resolve it to a recognized type.</span> </span><span id="L-592"><a href="#L-592"><span class="linenos" data-line="592"></span></a> <span class="kr">if</span> <span class="n">is_callable</span><span class="p">(</span><span class="n">typ</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-593"><a href="#L-593"><span class="linenos" data-line="593"></span></a> <span class="n">typ</span> <span class="o">=</span> <span class="n">typ</span><span class="p">(</span><span class="n">val</span><span class="p">)</span> </span><span id="L-594"><a href="#L-594"><span class="linenos" data-line="594"></span></a> <span class="kr">end</span> </span><span id="L-595"><a href="#L-595"><span class="linenos" data-line="595"></span></a> <span class="kd">local</span> <span class="n">func</span><span class="p">,</span> <span class="n">sublist</span> <span class="o">=</span> <span class="n">self</span><span class="p">[</span><span class="n">typ</span><span class="p">],</span> <span class="n">param</span><span class="p">.</span><span class="n">sublist</span> </span><span id="L-596"><a href="#L-596"><span class="linenos" data-line="596"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">func</span> <span class="kr">then</span> </span><span id="L-597"><a href="#L-597"><span class="linenos" data-line="597"></span></a> <span class="nb">error</span><span class="p">(</span><span class="s2">&quot;Internal error: &quot;</span> <span class="o">..</span> <span class="n">dump</span><span class="p">(</span><span class="n">typ</span><span class="p">)</span> <span class="o">..</span> <span class="s2">&quot; is not a recognized parameter type.&quot;</span><span class="p">)</span> </span><span id="L-598"><a href="#L-598"><span class="linenos" data-line="598"></span></a> <span class="kr">elseif</span> <span class="n">sublist</span> <span class="kr">then</span> </span><span id="L-599"><a href="#L-599"><span class="linenos" data-line="599"></span></a> <span class="kd">local</span> <span class="n">retlist</span> <span class="o">=</span> <span class="p">{}</span> </span><span id="L-600"><a href="#L-600"><span class="linenos" data-line="600"></span></a> <span class="kr">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">val</span><span class="p">)</span> <span class="o">~=</span> <span class="s2">&quot;string&quot;</span> <span class="kr">then</span> </span><span id="L-601"><a href="#L-601"><span class="linenos" data-line="601"></span></a> <span class="nb">error</span><span class="p">(</span><span class="s2">&quot;Internal error: &quot;</span> <span class="o">..</span> <span class="n">dump</span><span class="p">(</span><span class="n">val</span><span class="p">)</span> <span class="o">..</span> <span class="s2">&quot; is not a string.&quot;</span><span class="p">)</span> </span><span id="L-602"><a href="#L-602"><span class="linenos" data-line="602"></span></a> <span class="kr">end</span> </span><span id="L-603"><a href="#L-603"><span class="linenos" data-line="603"></span></a> <span class="kr">if</span> <span class="n">param</span><span class="p">.</span><span class="n">convert</span> <span class="kr">then</span> </span><span id="L-604"><a href="#L-604"><span class="linenos" data-line="604"></span></a> <span class="kd">local</span> <span class="n">thisval</span><span class="p">,</span> <span class="n">insval</span> </span><span id="L-605"><a href="#L-605"><span class="linenos" data-line="605"></span></a> <span class="kd">local</span> <span class="n">thisindex</span> <span class="o">=</span> <span class="mi">0</span> </span><span id="L-606"><a href="#L-606"><span class="linenos" data-line="606"></span></a> <span class="kd">local</span> <span class="n">parse_err</span> </span><span id="L-607"><a href="#L-607"><span class="linenos" data-line="607"></span></a> <span class="kr">if</span> <span class="n">is_callable</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-608"><a href="#L-608"><span class="linenos" data-line="608"></span></a> <span class="c1">-- We assume the passed-in error function in `name` already shows the parameter name and raw value.</span> </span><span id="L-609"><a href="#L-609"><span class="linenos" data-line="609"></span></a> <span class="n">parse_err</span> <span class="o">=</span> <span class="kr">function</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span> </span><span id="L-610"><a href="#L-610"><span class="linenos" data-line="610"></span></a> <span class="n">name</span><span class="p">((</span><span class="s2">&quot;%s: item #%s=%s&quot;</span><span class="p">):</span><span class="n">format</span><span class="p">(</span><span class="n">msg_with_processed</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">thisval</span><span class="p">,</span> <span class="n">insval</span><span class="p">),</span> <span class="n">thisindex</span><span class="p">,</span> </span><span id="L-611"><a href="#L-611"><span class="linenos" data-line="611"></span></a> <span class="n">thisval</span><span class="p">))</span> </span><span id="L-612"><a href="#L-612"><span class="linenos" data-line="612"></span></a> <span class="kr">end</span> </span><span id="L-613"><a href="#L-613"><span class="linenos" data-line="613"></span></a> <span class="kr">else</span> </span><span id="L-614"><a href="#L-614"><span class="linenos" data-line="614"></span></a> <span class="n">parse_err</span> <span class="o">=</span> <span class="kr">function</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span> </span><span id="L-615"><a href="#L-615"><span class="linenos" data-line="615"></span></a> <span class="nb">error</span><span class="p">((</span><span class="s2">&quot;%s: item #%s=%s of parameter %s=%s&quot;</span><span class="p">):</span><span class="n">format</span><span class="p">(</span><span class="n">msg_with_processed</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">thisval</span><span class="p">,</span> <span class="n">insval</span><span class="p">),</span> </span><span id="L-616"><a href="#L-616"><span class="linenos" data-line="616"></span></a> <span class="n">thisindex</span><span class="p">,</span> <span class="n">thisval</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">val</span><span class="p">))</span> </span><span id="L-617"><a href="#L-617"><span class="linenos" data-line="617"></span></a> <span class="kr">end</span> </span><span id="L-618"><a href="#L-618"><span class="linenos" data-line="618"></span></a> <span class="kr">end</span> </span><span id="L-619"><a href="#L-619"><span class="linenos" data-line="619"></span></a> <span class="kr">for</span> <span class="n">v</span> <span class="kr">in</span> <span class="n">split_sublist</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">sublist</span><span class="p">)</span> <span class="kr">do</span> </span><span id="L-620"><a href="#L-620"><span class="linenos" data-line="620"></span></a> <span class="n">thisval</span> <span class="o">=</span> <span class="n">v</span> </span><span id="L-621"><a href="#L-621"><span class="linenos" data-line="621"></span></a> <span class="n">thisindex</span> <span class="o">=</span> <span class="n">thisindex</span> <span class="o">+</span> <span class="mi">1</span> </span><span id="L-622"><a href="#L-622"><span class="linenos" data-line="622"></span></a> <span class="kr">if</span> <span class="n">param</span><span class="p">.</span><span class="n">set</span> <span class="kr">then</span> </span><span id="L-623"><a href="#L-623"><span class="linenos" data-line="623"></span></a> <span class="n">check_set</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">param</span><span class="p">,</span> <span class="n">typ</span><span class="p">)</span> </span><span id="L-624"><a href="#L-624"><span class="linenos" data-line="624"></span></a> <span class="kr">end</span> </span><span id="L-625"><a href="#L-625"><span class="linenos" data-line="625"></span></a> <span class="n">insval</span> <span class="o">=</span> <span class="n">func</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">param</span><span class="p">)</span> </span><span id="L-626"><a href="#L-626"><span class="linenos" data-line="626"></span></a> <span class="n">insert</span><span class="p">(</span><span class="n">retlist</span><span class="p">,</span> <span class="n">param</span><span class="p">.</span><span class="n">convert</span><span class="p">(</span><span class="n">insval</span><span class="p">,</span> <span class="n">parse_err</span><span class="p">))</span> </span><span id="L-627"><a href="#L-627"><span class="linenos" data-line="627"></span></a> <span class="kr">end</span> </span><span id="L-628"><a href="#L-628"><span class="linenos" data-line="628"></span></a> <span class="kr">else</span> </span><span id="L-629"><a href="#L-629"><span class="linenos" data-line="629"></span></a> <span class="kr">for</span> <span class="n">v</span> <span class="kr">in</span> <span class="n">split_sublist</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">sublist</span><span class="p">)</span> <span class="kr">do</span> </span><span id="L-630"><a href="#L-630"><span class="linenos" data-line="630"></span></a> <span class="kr">if</span> <span class="n">param</span><span class="p">.</span><span class="n">set</span> <span class="kr">then</span> </span><span id="L-631"><a href="#L-631"><span class="linenos" data-line="631"></span></a> <span class="n">check_set</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">param</span><span class="p">,</span> <span class="n">typ</span><span class="p">)</span> </span><span id="L-632"><a href="#L-632"><span class="linenos" data-line="632"></span></a> <span class="kr">end</span> </span><span id="L-633"><a href="#L-633"><span class="linenos" data-line="633"></span></a> <span class="n">insert</span><span class="p">(</span><span class="n">retlist</span><span class="p">,</span> <span class="n">func</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">param</span><span class="p">))</span> </span><span id="L-634"><a href="#L-634"><span class="linenos" data-line="634"></span></a> <span class="kr">end</span> </span><span id="L-635"><a href="#L-635"><span class="linenos" data-line="635"></span></a> <span class="kr">end</span> </span><span id="L-636"><a href="#L-636"><span class="linenos" data-line="636"></span></a> <span class="kr">return</span> <span class="n">retlist</span> </span><span id="L-637"><a href="#L-637"><span class="linenos" data-line="637"></span></a> <span class="kr">else</span> </span><span id="L-638"><a href="#L-638"><span class="linenos" data-line="638"></span></a> <span class="kr">if</span> <span class="n">param</span><span class="p">.</span><span class="n">set</span> <span class="kr">then</span> </span><span id="L-639"><a href="#L-639"><span class="linenos" data-line="639"></span></a> <span class="n">check_set</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">param</span><span class="p">,</span> <span class="n">typ</span><span class="p">)</span> </span><span id="L-640"><a href="#L-640"><span class="linenos" data-line="640"></span></a> <span class="kr">end</span> </span><span id="L-641"><a href="#L-641"><span class="linenos" data-line="641"></span></a> <span class="kd">local</span> <span class="n">retval</span> <span class="o">=</span> <span class="n">func</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">param</span><span class="p">)</span> </span><span id="L-642"><a href="#L-642"><span class="linenos" data-line="642"></span></a> <span class="kr">if</span> <span class="n">param</span><span class="p">.</span><span class="n">convert</span> <span class="kr">then</span> </span><span id="L-643"><a href="#L-643"><span class="linenos" data-line="643"></span></a> <span class="kd">local</span> <span class="n">parse_err</span> </span><span id="L-644"><a href="#L-644"><span class="linenos" data-line="644"></span></a> <span class="kr">if</span> <span class="n">is_callable</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-645"><a href="#L-645"><span class="linenos" data-line="645"></span></a> <span class="c1">-- We assume the passed-in error function in `name` already shows the parameter name and raw value.</span> </span><span id="L-646"><a href="#L-646"><span class="linenos" data-line="646"></span></a> <span class="kr">if</span> <span class="n">retval</span> <span class="o">==</span> <span class="n">val</span> <span class="kr">then</span> </span><span id="L-647"><a href="#L-647"><span class="linenos" data-line="647"></span></a> <span class="c1">-- This is an optimization to avoid creating a closure. The second arm works correctly even</span> </span><span id="L-648"><a href="#L-648"><span class="linenos" data-line="648"></span></a> <span class="c1">-- when retval == val.</span> </span><span id="L-649"><a href="#L-649"><span class="linenos" data-line="649"></span></a> <span class="n">parse_err</span> <span class="o">=</span> <span class="n">name</span> </span><span id="L-650"><a href="#L-650"><span class="linenos" data-line="650"></span></a> <span class="kr">else</span> </span><span id="L-651"><a href="#L-651"><span class="linenos" data-line="651"></span></a> <span class="n">parse_err</span> <span class="o">=</span> <span class="kr">function</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span> </span><span id="L-652"><a href="#L-652"><span class="linenos" data-line="652"></span></a> <span class="n">name</span><span class="p">(</span><span class="n">msg_with_processed</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">val</span><span class="p">,</span> <span class="n">retval</span><span class="p">))</span> </span><span id="L-653"><a href="#L-653"><span class="linenos" data-line="653"></span></a> <span class="kr">end</span> </span><span id="L-654"><a href="#L-654"><span class="linenos" data-line="654"></span></a> <span class="kr">end</span> </span><span id="L-655"><a href="#L-655"><span class="linenos" data-line="655"></span></a> <span class="kr">else</span> </span><span id="L-656"><a href="#L-656"><span class="linenos" data-line="656"></span></a> <span class="n">parse_err</span> <span class="o">=</span> <span class="kr">function</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span> </span><span id="L-657"><a href="#L-657"><span class="linenos" data-line="657"></span></a> <span class="nb">error</span><span class="p">((</span><span class="s2">&quot;%s: parameter %s=%s&quot;</span><span class="p">):</span><span class="n">format</span><span class="p">(</span><span class="n">msg_with_processed</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">val</span><span class="p">,</span> <span class="n">retval</span><span class="p">),</span> <span class="n">name</span><span class="p">,</span> <span class="n">val</span><span class="p">))</span> </span><span id="L-658"><a href="#L-658"><span class="linenos" data-line="658"></span></a> <span class="kr">end</span> </span><span id="L-659"><a href="#L-659"><span class="linenos" data-line="659"></span></a> <span class="kr">end</span> </span><span id="L-660"><a href="#L-660"><span class="linenos" data-line="660"></span></a> <span class="n">retval</span> <span class="o">=</span> <span class="n">param</span><span class="p">.</span><span class="n">convert</span><span class="p">(</span><span class="n">retval</span><span class="p">,</span> <span class="n">parse_err</span><span class="p">)</span> </span><span id="L-661"><a href="#L-661"><span class="linenos" data-line="661"></span></a> <span class="kr">end</span> </span><span id="L-662"><a href="#L-662"><span class="linenos" data-line="662"></span></a> <span class="kr">return</span> <span class="n">retval</span> </span><span id="L-663"><a href="#L-663"><span class="linenos" data-line="663"></span></a> <span class="kr">end</span> </span><span id="L-664"><a href="#L-664"><span class="linenos" data-line="664"></span></a> <span class="kr">end</span> </span><span id="L-665"><a href="#L-665"><span class="linenos" data-line="665"></span></a><span class="p">})</span> </span><span id="L-666"><a href="#L-666"><span class="linenos" data-line="666"></span></a><span class="n">export</span><span class="p">.</span><span class="n">convert_val</span> <span class="o">=</span> <span class="n">convert_val</span> <span class="c1">-- used by [[Module:parameter utilities]]</span> </span><span id="L-667"><a href="#L-667"><span class="linenos" data-line="667"></span></a> </span><span id="L-668"><a href="#L-668"><span class="linenos" data-line="668"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">unknown_param</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">val</span><span class="p">,</span> <span class="n">args_unknown</span><span class="p">,</span> <span class="n">return_unknown</span><span class="p">)</span> </span><span id="L-669"><a href="#L-669"><span class="linenos" data-line="669"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">return_unknown</span> <span class="kr">then</span> </span><span id="L-670"><a href="#L-670"><span class="linenos" data-line="670"></span></a> <span class="n">process_error</span><span class="p">(</span><span class="s2">&quot;Parameter %s is not used by this template.&quot;</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span> </span><span id="L-671"><a href="#L-671"><span class="linenos" data-line="671"></span></a> <span class="kr">end</span> </span><span id="L-672"><a href="#L-672"><span class="linenos" data-line="672"></span></a> <span class="n">args_unknown</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">val</span> </span><span id="L-673"><a href="#L-673"><span class="linenos" data-line="673"></span></a> <span class="n">track</span><span class="p">(</span><span class="s2">&quot;unknown&quot;</span><span class="p">)</span> </span><span id="L-674"><a href="#L-674"><span class="linenos" data-line="674"></span></a><span class="kr">end</span> </span><span id="L-675"><a href="#L-675"><span class="linenos" data-line="675"></span></a> </span><span id="L-676"><a href="#L-676"><span class="linenos" data-line="676"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">check_demo_param</span><span class="p">()</span> </span><span id="L-677"><a href="#L-677"><span class="linenos" data-line="677"></span></a> <span class="kr">if</span> <span class="n">current_namespace</span> <span class="o">==</span> <span class="mi">2</span> <span class="ow">or</span> <span class="n">is_invoke_page</span> <span class="kr">then</span> </span><span id="L-678"><a href="#L-678"><span class="linenos" data-line="678"></span></a> <span class="kr">return</span> <span class="kc">true</span> </span><span id="L-679"><a href="#L-679"><span class="linenos" data-line="679"></span></a> <span class="kr">elseif</span> <span class="n">current_namespace</span> <span class="o">~=</span> <span class="mi">10</span> <span class="ow">and</span> <span class="n">current_namespace</span> <span class="o">~=</span> <span class="mi">828</span> <span class="kr">then</span> <span class="c1">-- Template: and Module:</span> </span><span id="L-680"><a href="#L-680"><span class="linenos" data-line="680"></span></a> <span class="kr">return</span> <span class="kc">false</span> </span><span id="L-681"><a href="#L-681"><span class="linenos" data-line="681"></span></a> <span class="kr">elseif</span> <span class="p">(</span> <span class="c1">-- Template or module documentation page.</span> </span><span id="L-682"><a href="#L-682"><span class="linenos" data-line="682"></span></a> <span class="n">current_title</span> <span class="o">==</span> <span class="n">frame_title</span> <span class="o">..</span> <span class="s2">&quot;/documentation&quot;</span> <span class="ow">or</span> </span><span id="L-683"><a href="#L-683"><span class="linenos" data-line="683"></span></a> <span class="n">parent_frame_title</span> <span class="ow">and</span> <span class="n">current_title</span> <span class="o">==</span> <span class="n">parent_frame_title</span> <span class="o">..</span> <span class="s2">&quot;/documentation&quot;</span> </span><span id="L-684"><a href="#L-684"><span class="linenos" data-line="684"></span></a> <span class="p">)</span> <span class="kr">then</span> </span><span id="L-685"><a href="#L-685"><span class="linenos" data-line="685"></span></a> <span class="kr">return</span> <span class="kc">true</span> </span><span id="L-686"><a href="#L-686"><span class="linenos" data-line="686"></span></a> <span class="kr">end</span> </span><span id="L-687"><a href="#L-687"><span class="linenos" data-line="687"></span></a> <span class="kr">return</span> <span class="kc">false</span> </span><span id="L-688"><a href="#L-688"><span class="linenos" data-line="688"></span></a><span class="kr">end</span> </span><span id="L-689"><a href="#L-689"><span class="linenos" data-line="689"></span></a> </span><span id="L-690"><a href="#L-690"><span class="linenos" data-line="690"></span></a><span class="kd">local</span> <span class="kr">function</span> <span class="nf">check_string_param</span><span class="p">(</span><span class="n">typ</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">tag</span><span class="p">)</span> </span><span id="L-691"><a href="#L-691"><span class="linenos" data-line="691"></span></a> <span class="kr">if</span> <span class="n">typ</span> <span class="ow">and</span> <span class="n">typ</span> <span class="o">~=</span> <span class="s2">&quot;string&quot;</span> <span class="kr">then</span> </span><span id="L-692"><a href="#L-692"><span class="linenos" data-line="692"></span></a> <span class="n">internal_process_error</span><span class="p">(</span> </span><span id="L-693"><a href="#L-693"><span class="linenos" data-line="693"></span></a> <span class="s2">&quot;%s cannot be set unless the parameter has the type %s (the default): parameter %s has the type %s.&quot;</span><span class="p">,</span> </span><span id="L-694"><a href="#L-694"><span class="linenos" data-line="694"></span></a> <span class="n">tag</span><span class="p">,</span> <span class="s2">&quot;string&quot;</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">typ</span><span class="p">)</span> </span><span id="L-695"><a href="#L-695"><span class="linenos" data-line="695"></span></a> <span class="kr">end</span> </span><span id="L-696"><a href="#L-696"><span class="linenos" data-line="696"></span></a><span class="kr">end</span> </span><span id="L-697"><a href="#L-697"><span class="linenos" data-line="697"></span></a> </span><span id="L-698"><a href="#L-698"><span class="linenos" data-line="698"></span></a><span class="cm">--[==[</span> </span><span id="L-699"><a href="#L-699"><span class="linenos" data-line="699"></span></a><span class="cm">Process arguments with a given list of parameters. Return a table containing the processed arguments. The `args`</span> </span><span id="L-700"><a href="#L-700"><span class="linenos" data-line="700"></span></a><span class="cm">parameter specifies the arguments to be processed; they are the arguments you might retrieve from</span> </span><span id="L-701"><a href="#L-701"><span class="linenos" data-line="701"></span></a><span class="cm">{frame:getParent().args} (the template arguments) or in some cases {frame.args} (the invocation arguments). The `params`</span> </span><span id="L-702"><a href="#L-702"><span class="linenos" data-line="702"></span></a><span class="cm">parameter specifies a list of valid parameters, and consists of a table. If an argument is encountered that is not in</span> </span><span id="L-703"><a href="#L-703"><span class="linenos" data-line="703"></span></a><span class="cm">the parameter table, an error is thrown.</span> </span><span id="L-704"><a href="#L-704"><span class="linenos" data-line="704"></span></a> </span><span id="L-705"><a href="#L-705"><span class="linenos" data-line="705"></span></a><span class="cm">The structure of the `params` table is as described above in the intro comment.</span> </span><span id="L-706"><a href="#L-706"><span class="linenos" data-line="706"></span></a> </span><span id="L-707"><a href="#L-707"><span class="linenos" data-line="707"></span></a><span class="cm">&#39;&#39;&#39;WARNING:&#39;&#39;&#39; The `params` table is destructively modified to save memory. Nonetheless, different keys can share the</span> </span><span id="L-708"><a href="#L-708"><span class="linenos" data-line="708"></span></a><span class="cm">same value objects in memory without causing problems.</span> </span><span id="L-709"><a href="#L-709"><span class="linenos" data-line="709"></span></a> </span><span id="L-710"><a href="#L-710"><span class="linenos" data-line="710"></span></a><span class="cm">The `return_unknown` parameter, if set to {true}, prevents the function from triggering an error when it comes across an</span> </span><span id="L-711"><a href="#L-711"><span class="linenos" data-line="711"></span></a><span class="cm">argument with a name that it doesn&#39;t recognise. Instead, the return value is a pair of values: the first is the</span> </span><span id="L-712"><a href="#L-712"><span class="linenos" data-line="712"></span></a><span class="cm">processed arguments as usual, while the second contains all the unrecognised arguments that were left unprocessed. This</span> </span><span id="L-713"><a href="#L-713"><span class="linenos" data-line="713"></span></a><span class="cm">allows you to do multi-stage processing, where the entire set of arguments that a template should accept is not known at</span> </span><span id="L-714"><a href="#L-714"><span class="linenos" data-line="714"></span></a><span class="cm">once. For example, an inflection-table might do some generic processing on some arguments, but then defer processing of</span> </span><span id="L-715"><a href="#L-715"><span class="linenos" data-line="715"></span></a><span class="cm">the remainder to the function that handles a specific inflectional type.</span> </span><span id="L-716"><a href="#L-716"><span class="linenos" data-line="716"></span></a><span class="cm">]==]</span> </span><span id="L-717"><a href="#L-717"><span class="linenos" data-line="717"></span></a><span class="kr">function</span> <span class="nc">export</span><span class="p">.</span><span class="nf">process</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">params</span><span class="p">,</span> <span class="n">return_unknown</span><span class="p">)</span> </span><span id="L-718"><a href="#L-718"><span class="linenos" data-line="718"></span></a> <span class="c1">-- Process parameters for specific properties</span> </span><span id="L-719"><a href="#L-719"><span class="linenos" data-line="719"></span></a> <span class="kd">local</span> <span class="n">args_new</span> <span class="o">=</span> <span class="p">{}</span> </span><span id="L-720"><a href="#L-720"><span class="linenos" data-line="720"></span></a> <span class="kd">local</span> <span class="n">param_types</span> <span class="o">=</span> <span class="p">{}</span> </span><span id="L-721"><a href="#L-721"><span class="linenos" data-line="721"></span></a> <span class="kd">local</span> <span class="n">required</span> <span class="o">=</span> <span class="p">{}</span> </span><span id="L-722"><a href="#L-722"><span class="linenos" data-line="722"></span></a> <span class="kd">local</span> <span class="n">patterns</span> <span class="o">=</span> <span class="p">{}</span> </span><span id="L-723"><a href="#L-723"><span class="linenos" data-line="723"></span></a> <span class="kd">local</span> <span class="n">has_placeholder</span> <span class="o">=</span> <span class="p">{}</span> </span><span id="L-724"><a href="#L-724"><span class="linenos" data-line="724"></span></a> <span class="kd">local</span> <span class="n">list_from_index</span> </span><span id="L-725"><a href="#L-725"><span class="linenos" data-line="725"></span></a> </span><span id="L-726"><a href="#L-726"><span class="linenos" data-line="726"></span></a> <span class="kr">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">param</span> <span class="kr">in</span> <span class="nb">pairs</span><span class="p">(</span><span class="n">params</span><span class="p">)</span> <span class="kr">do</span> </span><span id="L-727"><a href="#L-727"><span class="linenos" data-line="727"></span></a> <span class="kd">local</span> <span class="n">param_type</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="n">param</span><span class="p">)</span> </span><span id="L-728"><a href="#L-728"><span class="linenos" data-line="728"></span></a> <span class="n">param_types</span><span class="p">[</span><span class="n">param</span><span class="p">]</span> <span class="o">=</span> <span class="n">param_type</span> </span><span id="L-729"><a href="#L-729"><span class="linenos" data-line="729"></span></a> <span class="kr">if</span> <span class="n">param_type</span> <span class="o">==</span> <span class="s2">&quot;table&quot;</span> <span class="kr">then</span> </span><span id="L-730"><a href="#L-730"><span class="linenos" data-line="730"></span></a> <span class="c1">-- Populate required table, and make sure aliases aren&#39;t set to required.</span> </span><span id="L-731"><a href="#L-731"><span class="linenos" data-line="731"></span></a> <span class="kr">if</span> <span class="n">param</span><span class="p">.</span><span class="n">required</span> <span class="kr">then</span> </span><span id="L-732"><a href="#L-732"><span class="linenos" data-line="732"></span></a> <span class="kr">if</span> <span class="n">param</span><span class="p">.</span><span class="n">alias_of</span> <span class="kr">then</span> </span><span id="L-733"><a href="#L-733"><span class="linenos" data-line="733"></span></a> <span class="n">internal_process_error</span><span class="p">(</span> </span><span id="L-734"><a href="#L-734"><span class="linenos" data-line="734"></span></a> <span class="s2">&quot;Parameter %s is an alias of %s, but is also set as a required parameter. Only %s should be set as required.&quot;</span><span class="p">,</span> </span><span id="L-735"><a href="#L-735"><span class="linenos" data-line="735"></span></a> <span class="n">name</span><span class="p">,</span> <span class="n">param</span><span class="p">.</span><span class="n">alias_of</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span> </span><span id="L-736"><a href="#L-736"><span class="linenos" data-line="736"></span></a> <span class="kr">end</span> </span><span id="L-737"><a href="#L-737"><span class="linenos" data-line="737"></span></a> <span class="n">required</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="kc">true</span> </span><span id="L-738"><a href="#L-738"><span class="linenos" data-line="738"></span></a> <span class="kr">end</span> </span><span id="L-739"><a href="#L-739"><span class="linenos" data-line="739"></span></a> </span><span id="L-740"><a href="#L-740"><span class="linenos" data-line="740"></span></a> <span class="c1">-- Convert param.set from a list into a set.</span> </span><span id="L-741"><a href="#L-741"><span class="linenos" data-line="741"></span></a> <span class="c1">-- `converted_set` prevents double-conversion if multiple parameter keys share the same param table.</span> </span><span id="L-742"><a href="#L-742"><span class="linenos" data-line="742"></span></a> <span class="c1">-- rawset avoids errors if param has been loaded via mw.loadData; however, it&#39;s probably more efficient to preconvert them, and set the `converted_set` key in advance.</span> </span><span id="L-743"><a href="#L-743"><span class="linenos" data-line="743"></span></a> <span class="kd">local</span> <span class="n">set</span> <span class="o">=</span> <span class="n">param</span><span class="p">.</span><span class="n">set</span> </span><span id="L-744"><a href="#L-744"><span class="linenos" data-line="744"></span></a> <span class="kr">if</span> <span class="n">set</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">param</span><span class="p">.</span><span class="n">converted_set</span> <span class="kr">then</span> </span><span id="L-745"><a href="#L-745"><span class="linenos" data-line="745"></span></a> <span class="nb">rawset</span><span class="p">(</span><span class="n">param</span><span class="p">,</span> <span class="s2">&quot;set&quot;</span><span class="p">,</span> <span class="n">list_to_set</span><span class="p">(</span><span class="n">set</span><span class="p">))</span> </span><span id="L-746"><a href="#L-746"><span class="linenos" data-line="746"></span></a> <span class="nb">rawset</span><span class="p">(</span><span class="n">param</span><span class="p">,</span> <span class="s2">&quot;converted_set&quot;</span><span class="p">,</span> <span class="kc">true</span><span class="p">)</span> </span><span id="L-747"><a href="#L-747"><span class="linenos" data-line="747"></span></a> <span class="kr">end</span> </span><span id="L-748"><a href="#L-748"><span class="linenos" data-line="748"></span></a> </span><span id="L-749"><a href="#L-749"><span class="linenos" data-line="749"></span></a> <span class="kd">local</span> <span class="n">alias</span> <span class="o">=</span> <span class="n">param</span><span class="p">.</span><span class="n">alias_of</span> </span><span id="L-750"><a href="#L-750"><span class="linenos" data-line="750"></span></a> <span class="kr">if</span> <span class="n">alias</span> <span class="kr">then</span> </span><span id="L-751"><a href="#L-751"><span class="linenos" data-line="751"></span></a> <span class="c1">-- Check that the alias_of is set to a valid parameter.</span> </span><span id="L-752"><a href="#L-752"><span class="linenos" data-line="752"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">params</span><span class="p">[</span><span class="n">alias</span><span class="p">]</span> <span class="kr">then</span> </span><span id="L-753"><a href="#L-753"><span class="linenos" data-line="753"></span></a> <span class="n">internal_process_error</span><span class="p">(</span><span class="s2">&quot;Parameter %s is an alias of an invalid parameter.&quot;</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span> </span><span id="L-754"><a href="#L-754"><span class="linenos" data-line="754"></span></a> <span class="kr">end</span> </span><span id="L-755"><a href="#L-755"><span class="linenos" data-line="755"></span></a> <span class="c1">-- Check that all the parameters in params are in the form Scribunto normalizes input argument keys into (e.g. 1 not &quot;1&quot;, &quot;foo&quot; not &quot; foo &quot;). Otherwise, this function won&#39;t be able to normalize the input arguments in the expected way.</span> </span><span id="L-756"><a href="#L-756"><span class="linenos" data-line="756"></span></a> <span class="kd">local</span> <span class="n">normalized</span> <span class="o">=</span> <span class="n">scribunto_param_key</span><span class="p">(</span><span class="n">alias</span><span class="p">)</span> </span><span id="L-757"><a href="#L-757"><span class="linenos" data-line="757"></span></a> <span class="kr">if</span> <span class="n">alias</span> <span class="o">~=</span> <span class="n">normalized</span> <span class="kr">then</span> </span><span id="L-758"><a href="#L-758"><span class="linenos" data-line="758"></span></a> <span class="n">internal_process_error</span><span class="p">(</span> </span><span id="L-759"><a href="#L-759"><span class="linenos" data-line="759"></span></a> <span class="s2">&quot;Parameter %s (a &quot;</span> <span class="o">..</span> <span class="nb">type</span><span class="p">(</span><span class="n">alias</span><span class="p">)</span> <span class="o">..</span> <span class="s2">&quot;) given in the alias_of field of parameter %s is not a normalized Scribunto parameter. Should be %s (a &quot;</span> <span class="o">..</span> <span class="nb">type</span><span class="p">(</span><span class="n">normalized</span><span class="p">)</span> <span class="o">..</span> <span class="s2">&quot;).&quot;</span><span class="p">,</span> </span><span id="L-760"><a href="#L-760"><span class="linenos" data-line="760"></span></a> <span class="n">alias</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">normalized</span><span class="p">)</span> </span><span id="L-761"><a href="#L-761"><span class="linenos" data-line="761"></span></a> <span class="kr">end</span> </span><span id="L-762"><a href="#L-762"><span class="linenos" data-line="762"></span></a> <span class="kd">local</span> <span class="n">main_param</span> <span class="o">=</span> <span class="n">params</span><span class="p">[</span><span class="n">alias</span><span class="p">]</span> </span><span id="L-763"><a href="#L-763"><span class="linenos" data-line="763"></span></a> <span class="kd">local</span> <span class="n">main_type</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="n">main_param</span><span class="p">)</span> <span class="c1">-- Might not yet be memoized.</span> </span><span id="L-764"><a href="#L-764"><span class="linenos" data-line="764"></span></a> <span class="c1">-- Aliases can&#39;t be lists unless the canonical parameter is also a list.</span> </span><span id="L-765"><a href="#L-765"><span class="linenos" data-line="765"></span></a> <span class="kr">if</span> <span class="n">param</span><span class="p">.</span><span class="n">list</span> <span class="ow">and</span> <span class="ow">not</span> <span class="p">(</span><span class="n">main_type</span> <span class="o">==</span> <span class="s2">&quot;table&quot;</span> <span class="ow">and</span> <span class="n">main_param</span><span class="p">.</span><span class="n">list</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-766"><a href="#L-766"><span class="linenos" data-line="766"></span></a> <span class="n">internal_process_error</span><span class="p">(</span> </span><span id="L-767"><a href="#L-767"><span class="linenos" data-line="767"></span></a> <span class="s2">&quot;The list parameter %s is set as an alias of %s, which is not a list parameter.&quot;</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">alias</span><span class="p">)</span> </span><span id="L-768"><a href="#L-768"><span class="linenos" data-line="768"></span></a> <span class="c1">-- Aliases can&#39;t be aliases of other aliases.</span> </span><span id="L-769"><a href="#L-769"><span class="linenos" data-line="769"></span></a> <span class="kr">elseif</span> <span class="n">main_type</span> <span class="o">==</span> <span class="s2">&quot;table&quot;</span> <span class="ow">and</span> <span class="n">main_param</span><span class="p">.</span><span class="n">alias_of</span> <span class="kr">then</span> </span><span id="L-770"><a href="#L-770"><span class="linenos" data-line="770"></span></a> <span class="n">internal_process_error</span><span class="p">(</span> </span><span id="L-771"><a href="#L-771"><span class="linenos" data-line="771"></span></a> <span class="s2">&quot;alias_of cannot be set to another alias: parameter %s is set as an alias of %s, which is in turn an alias of %s. Set alias_of for %s to %s.&quot;</span><span class="p">,</span> </span><span id="L-772"><a href="#L-772"><span class="linenos" data-line="772"></span></a> <span class="n">name</span><span class="p">,</span> <span class="n">alias</span><span class="p">,</span> <span class="n">params</span><span class="p">[</span><span class="n">alias</span><span class="p">].</span><span class="n">alias_of</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">params</span><span class="p">[</span><span class="n">alias</span><span class="p">].</span><span class="n">alias_of</span><span class="p">)</span> </span><span id="L-773"><a href="#L-773"><span class="linenos" data-line="773"></span></a> <span class="kr">end</span> </span><span id="L-774"><a href="#L-774"><span class="linenos" data-line="774"></span></a> <span class="kr">end</span> </span><span id="L-775"><a href="#L-775"><span class="linenos" data-line="775"></span></a> </span><span id="L-776"><a href="#L-776"><span class="linenos" data-line="776"></span></a> <span class="kd">local</span> <span class="n">normalized</span> <span class="o">=</span> <span class="n">scribunto_param_key</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> </span><span id="L-777"><a href="#L-777"><span class="linenos" data-line="777"></span></a> <span class="kr">if</span> <span class="n">name</span> <span class="o">~=</span> <span class="n">normalized</span> <span class="kr">then</span> </span><span id="L-778"><a href="#L-778"><span class="linenos" data-line="778"></span></a> <span class="n">internal_process_error</span><span class="p">(</span> </span><span id="L-779"><a href="#L-779"><span class="linenos" data-line="779"></span></a> <span class="s2">&quot;Parameter %s (a &quot;</span> <span class="o">..</span> <span class="nb">type</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="o">..</span> <span class="s2">&quot;) is not a normalized Scribunto parameter. Should be %s (a &quot;</span> <span class="o">..</span> </span><span id="L-780"><a href="#L-780"><span class="linenos" data-line="780"></span></a> <span class="nb">type</span><span class="p">(</span><span class="n">normalized</span><span class="p">)</span> <span class="o">..</span> <span class="s2">&quot;).&quot;</span><span class="p">,</span> </span><span id="L-781"><a href="#L-781"><span class="linenos" data-line="781"></span></a> <span class="n">name</span><span class="p">,</span> <span class="n">normalized</span><span class="p">)</span> </span><span id="L-782"><a href="#L-782"><span class="linenos" data-line="782"></span></a> <span class="kr">end</span> </span><span id="L-783"><a href="#L-783"><span class="linenos" data-line="783"></span></a> </span><span id="L-784"><a href="#L-784"><span class="linenos" data-line="784"></span></a> <span class="kr">if</span> <span class="n">param</span><span class="p">.</span><span class="n">list</span> <span class="kr">then</span> </span><span id="L-785"><a href="#L-785"><span class="linenos" data-line="785"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">param</span><span class="p">.</span><span class="n">alias_of</span> <span class="kr">then</span> </span><span id="L-786"><a href="#L-786"><span class="linenos" data-line="786"></span></a> <span class="kd">local</span> <span class="n">key</span> <span class="o">=</span> <span class="n">name</span> </span><span id="L-787"><a href="#L-787"><span class="linenos" data-line="787"></span></a> <span class="kr">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&quot;string&quot;</span> <span class="kr">then</span> </span><span id="L-788"><a href="#L-788"><span class="linenos" data-line="788"></span></a> <span class="n">key</span> <span class="o">=</span> <span class="n">gsub</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="s2">&quot;</span><span class="se">\1</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span> </span><span id="L-789"><a href="#L-789"><span class="linenos" data-line="789"></span></a> <span class="kr">end</span> </span><span id="L-790"><a href="#L-790"><span class="linenos" data-line="790"></span></a> <span class="c1">-- _list is used as a temporary flag.</span> </span><span id="L-791"><a href="#L-791"><span class="linenos" data-line="791"></span></a> <span class="n">args_new</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="n">maxindex</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">_list</span> <span class="o">=</span> <span class="n">param</span><span class="p">.</span><span class="n">list</span><span class="p">}</span> </span><span id="L-792"><a href="#L-792"><span class="linenos" data-line="792"></span></a> <span class="kr">end</span> </span><span id="L-793"><a href="#L-793"><span class="linenos" data-line="793"></span></a> </span><span id="L-794"><a href="#L-794"><span class="linenos" data-line="794"></span></a> <span class="kr">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">param</span><span class="p">.</span><span class="n">list</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&quot;string&quot;</span> <span class="kr">then</span> </span><span id="L-795"><a href="#L-795"><span class="linenos" data-line="795"></span></a> <span class="c1">-- If the list property is a string, then it represents the name</span> </span><span id="L-796"><a href="#L-796"><span class="linenos" data-line="796"></span></a> <span class="c1">-- to be used as the prefix for list items. This is for use with lists</span> </span><span id="L-797"><a href="#L-797"><span class="linenos" data-line="797"></span></a> <span class="c1">-- where the first item is a numbered parameter and the</span> </span><span id="L-798"><a href="#L-798"><span class="linenos" data-line="798"></span></a> <span class="c1">-- subsequent ones are named, such as 1, pl2, pl3.</span> </span><span id="L-799"><a href="#L-799"><span class="linenos" data-line="799"></span></a> <span class="n">save_pattern</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">param</span><span class="p">.</span><span class="n">list</span><span class="p">,</span> <span class="n">patterns</span><span class="p">)</span> </span><span id="L-800"><a href="#L-800"><span class="linenos" data-line="800"></span></a> <span class="kr">elseif</span> <span class="nb">type</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&quot;number&quot;</span> <span class="kr">then</span> </span><span id="L-801"><a href="#L-801"><span class="linenos" data-line="801"></span></a> <span class="kr">if</span> <span class="n">list_from_index</span> <span class="kr">then</span> </span><span id="L-802"><a href="#L-802"><span class="linenos" data-line="802"></span></a> <span class="n">internal_process_error</span><span class="p">(</span> </span><span id="L-803"><a href="#L-803"><span class="linenos" data-line="803"></span></a> <span class="s2">&quot;Only one numeric parameter can be a list, unless the list property is a string.&quot;</span><span class="p">)</span> </span><span id="L-804"><a href="#L-804"><span class="linenos" data-line="804"></span></a> <span class="kr">end</span> </span><span id="L-805"><a href="#L-805"><span class="linenos" data-line="805"></span></a> <span class="c1">-- If the name is a number, then all indexed parameters from</span> </span><span id="L-806"><a href="#L-806"><span class="linenos" data-line="806"></span></a> <span class="c1">-- this number onwards go in the list.</span> </span><span id="L-807"><a href="#L-807"><span class="linenos" data-line="807"></span></a> <span class="n">list_from_index</span> <span class="o">=</span> <span class="n">name</span> </span><span id="L-808"><a href="#L-808"><span class="linenos" data-line="808"></span></a> <span class="kr">else</span> </span><span id="L-809"><a href="#L-809"><span class="linenos" data-line="809"></span></a> <span class="n">save_pattern</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">patterns</span><span class="p">)</span> </span><span id="L-810"><a href="#L-810"><span class="linenos" data-line="810"></span></a> <span class="kr">end</span> </span><span id="L-811"><a href="#L-811"><span class="linenos" data-line="811"></span></a> </span><span id="L-812"><a href="#L-812"><span class="linenos" data-line="812"></span></a> <span class="kr">if</span> <span class="n">match</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="s2">&quot;</span><span class="se">\1</span><span class="s2">&quot;</span><span class="p">)</span> <span class="kr">then</span> </span><span id="L-813"><a href="#L-813"><span class="linenos" data-line="813"></span></a> <span class="n">insert</span><span class="p">(</span><span class="n">has_placeholder</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span> </span><span id="L-814"><a href="#L-814"><span class="linenos" data-line="814"></span></a> <span class="kr">end</span> </span><span id="L-815"><a href="#L-815"><span class="linenos" data-line="815"></span></a> <span class="kr">end</span> </span><span id="L-816"><a href="#L-816"><span class="linenos" data-line="816"></span></a> <span class="kr">elseif</span> <span class="n">param</span> <span class="o">~=</span> <span class="kc">true</span> <span class="kr">then</span> </span><span id="L-817"><a href="#L-817"><span class="linenos" data-line="817"></span></a> <span class="n">internal_process_error</span><span class="p">(</span><span class="s2">&quot;Spec for parameter %s must be a table of specs or the value true, but found %s.&quot;</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">param_type</span> <span class="o">~=</span> <span class="s2">&quot;boolean&quot;</span> <span class="ow">and</span> <span class="n">param_type</span> <span class="ow">or</span> <span class="n">param</span><span class="p">)</span> </span><span id="L-818"><a href="#L-818"><span class="linenos" data-line="818"></span></a> <span class="kr">end</span> </span><span id="L-819"><a href="#L-819"><span class="linenos" data-line="819"></span></a> <span class="kr">end</span> </span><span id="L-820"><a href="#L-820"><span class="linenos" data-line="820"></span></a> </span><span id="L-821"><a href="#L-821"><span class="linenos" data-line="821"></span></a> <span class="c1">--Process required changes to `params`.</span> </span><span id="L-822"><a href="#L-822"><span class="linenos" data-line="822"></span></a> <span class="kr">for</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="o">#</span><span class="n">has_placeholder</span> <span class="kr">do</span> </span><span id="L-823"><a href="#L-823"><span class="linenos" data-line="823"></span></a> <span class="kd">local</span> <span class="n">name</span> <span class="o">=</span> <span class="n">has_placeholder</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> </span><span id="L-824"><a href="#L-824"><span class="linenos" data-line="824"></span></a> <span class="n">params</span><span class="p">[</span><span class="n">gsub</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="s2">&quot;</span><span class="se">\1</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)]</span> <span class="o">=</span> <span class="n">params</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> </span><span id="L-825"><a href="#L-825"><span class="linenos" data-line="825"></span></a> <span class="n">params</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="kc">nil</span> </span><span id="L-826"><a href="#L-826"><span class="linenos" data-line="826"></span></a> <span class="kr">end</span> </span><span id="L-827"><a href="#L-827"><span class="linenos" data-line="827"></span></a> </span><span id="L-828"><a href="#L-828"><span class="linenos" data-line="828"></span></a> <span class="c1">-- Process the arguments</span> </span><span id="L-829"><a href="#L-829"><span class="linenos" data-line="829"></span></a> <span class="kd">local</span> <span class="n">args_unknown</span> <span class="o">=</span> <span class="p">{}</span> </span><span id="L-830"><a href="#L-830"><span class="linenos" data-line="830"></span></a> </span><span id="L-831"><a href="#L-831"><span class="linenos" data-line="831"></span></a> <span class="kr">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">val</span> <span class="kr">in</span> <span class="nb">pairs</span><span class="p">(</span><span class="n">args</span><span class="p">)</span> <span class="kr">do</span> </span><span id="L-832"><a href="#L-832"><span class="linenos" data-line="832"></span></a> <span class="kd">local</span> <span class="n">orig_name</span><span class="p">,</span> <span class="n">raw_type</span><span class="p">,</span> <span class="n">index</span><span class="p">,</span> <span class="n">normalized</span> <span class="o">=</span> <span class="n">name</span><span class="p">,</span> <span class="nb">type</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> </span><span id="L-833"><a href="#L-833"><span class="linenos" data-line="833"></span></a> </span><span id="L-834"><a href="#L-834"><span class="linenos" data-line="834"></span></a> <span class="kr">if</span> <span class="n">raw_type</span> <span class="o">==</span> <span class="s2">&quot;number&quot;</span> <span class="kr">then</span> </span><span id="L-835"><a href="#L-835"><span class="linenos" data-line="835"></span></a> <span class="kr">if</span> <span class="n">list_from_index</span> <span class="o">~=</span> <span class="kc">nil</span> <span class="ow">and</span> <span class="n">name</span> <span class="o">&gt;=</span> <span class="n">list_from_index</span> <span class="kr">then</span> </span><span id="L-836"><a href="#L-836"><span class="linenos" data-line="836"></span></a> <span class="n">index</span> <span class="o">=</span> <span class="n">name</span> <span class="o">-</span> <span class="n">list_from_index</span> <span class="o">+</span> <span class="mi">1</span> </span><span id="L-837"><a href="#L-837"><span class="linenos" data-line="837"></span></a> <span class="n">name</span> <span class="o">=</span> <span class="n">list_from_index</span> </span><span id="L-838"><a href="#L-838"><span class="linenos" data-line="838"></span></a> <span class="kr">end</span> </span><span id="L-839"><a href="#L-839"><span class="linenos" data-line="839"></span></a> <span class="kr">else</span> </span><span id="L-840"><a href="#L-840"><span class="linenos" data-line="840"></span></a> <span class="c1">-- Does this argument name match a pattern?</span> </span><span id="L-841"><a href="#L-841"><span class="linenos" data-line="841"></span></a> <span class="kr">for</span> <span class="n">pattern</span><span class="p">,</span> <span class="n">pname</span> <span class="kr">in</span> <span class="nb">pairs</span><span class="p">(</span><span class="n">patterns</span><span class="p">)</span> <span class="kr">do</span> </span><span id="L-842"><a href="#L-842"><span class="linenos" data-line="842"></span></a> <span class="n">index</span> <span class="o">=</span> <span class="n">match</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">pattern</span><span class="p">)</span> </span><span id="L-843"><a href="#L-843"><span class="linenos" data-line="843"></span></a> <span class="c1">-- It matches, so store the parameter name and the</span> </span><span id="L-844"><a href="#L-844"><span class="linenos" data-line="844"></span></a> <span class="c1">-- numeric index extracted from the argument name.</span> </span><span id="L-845"><a href="#L-845"><span class="linenos" data-line="845"></span></a> <span class="kr">if</span> <span class="n">index</span> <span class="kr">then</span> </span><span id="L-846"><a href="#L-846"><span class="linenos" data-line="846"></span></a> <span class="n">index</span> <span class="o">=</span> <span class="nb">tonumber</span><span class="p">(</span><span class="n">index</span><span class="p">)</span> </span><span id="L-847"><a href="#L-847"><span class="linenos" data-line="847"></span></a> <span class="n">name</span> <span class="o">=</span> <span class="n">pname</span> </span><span id="L-848"><a href="#L-848"><span class="linenos" data-line="848"></span></a> <span class="kr">break</span> </span><span id="L-849"><a href="#L-849"><span class="linenos" data-line="849"></span></a> <span class="kr">end</span> </span><span id="L-850"><a href="#L-850"><span class="linenos" data-line="850"></span></a> <span class="kr">end</span> </span><span id="L-851"><a href="#L-851"><span class="linenos" data-line="851"></span></a> <span class="kr">end</span> </span><span id="L-852"><a href="#L-852"><span class="linenos" data-line="852"></span></a> </span><span id="L-853"><a href="#L-853"><span class="linenos" data-line="853"></span></a> <span class="kd">local</span> <span class="n">param</span> <span class="o">=</span> <span class="n">params</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> </span><span id="L-854"><a href="#L-854"><span class="linenos" data-line="854"></span></a> </span><span id="L-855"><a href="#L-855"><span class="linenos" data-line="855"></span></a> <span class="c1">-- If the argument is not in the list of parameters, trigger an error.</span> </span><span id="L-856"><a href="#L-856"><span class="linenos" data-line="856"></span></a> <span class="c1">-- return_unknown suppresses the error, and stores it in a separate list instead.</span> </span><span id="L-857"><a href="#L-857"><span class="linenos" data-line="857"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">param</span> <span class="kr">then</span> </span><span id="L-858"><a href="#L-858"><span class="linenos" data-line="858"></span></a> <span class="n">unknown_param</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">val</span><span class="p">,</span> <span class="n">args_unknown</span><span class="p">,</span> <span class="n">return_unknown</span><span class="p">)</span> </span><span id="L-859"><a href="#L-859"><span class="linenos" data-line="859"></span></a> <span class="kr">elseif</span> <span class="n">param</span> <span class="o">==</span> <span class="kc">true</span> <span class="kr">then</span> </span><span id="L-860"><a href="#L-860"><span class="linenos" data-line="860"></span></a> <span class="n">normalized</span> <span class="o">=</span> <span class="n">orig_name</span> </span><span id="L-861"><a href="#L-861"><span class="linenos" data-line="861"></span></a> <span class="n">val</span> <span class="o">=</span> <span class="n">trim</span><span class="p">(</span><span class="n">val</span><span class="p">)</span> </span><span id="L-862"><a href="#L-862"><span class="linenos" data-line="862"></span></a> <span class="kr">if</span> <span class="n">val</span> <span class="o">~=</span> <span class="s2">&quot;&quot;</span> <span class="kr">then</span> </span><span id="L-863"><a href="#L-863"><span class="linenos" data-line="863"></span></a> <span class="c1">-- If the parameter is duplicated, throw an error.</span> </span><span id="L-864"><a href="#L-864"><span class="linenos" data-line="864"></span></a> <span class="kr">if</span> <span class="n">args_new</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">~=</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-865"><a href="#L-865"><span class="linenos" data-line="865"></span></a> <span class="n">process_error</span><span class="p">(</span> </span><span id="L-866"><a href="#L-866"><span class="linenos" data-line="866"></span></a> <span class="s2">&quot;Parameter %s has been entered more than once. This is probably because a parameter alias has been used.&quot;</span><span class="p">,</span> </span><span id="L-867"><a href="#L-867"><span class="linenos" data-line="867"></span></a> <span class="n">normalized</span><span class="p">)</span> </span><span id="L-868"><a href="#L-868"><span class="linenos" data-line="868"></span></a> <span class="kr">end</span> </span><span id="L-869"><a href="#L-869"><span class="linenos" data-line="869"></span></a> <span class="n">args_new</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">val</span> </span><span id="L-870"><a href="#L-870"><span class="linenos" data-line="870"></span></a> <span class="kr">end</span> </span><span id="L-871"><a href="#L-871"><span class="linenos" data-line="871"></span></a> <span class="kr">else</span> </span><span id="L-872"><a href="#L-872"><span class="linenos" data-line="872"></span></a> <span class="kr">if</span> <span class="n">param</span><span class="p">.</span><span class="n">require_index</span> <span class="kr">then</span> </span><span id="L-873"><a href="#L-873"><span class="linenos" data-line="873"></span></a> <span class="c1">-- Disallow require_index for numeric parameter names, as this doesn&#39;t make sense.</span> </span><span id="L-874"><a href="#L-874"><span class="linenos" data-line="874"></span></a> <span class="kr">if</span> <span class="n">raw_type</span> <span class="o">==</span> <span class="s2">&quot;number&quot;</span> <span class="kr">then</span> </span><span id="L-875"><a href="#L-875"><span class="linenos" data-line="875"></span></a> <span class="n">internal_process_error</span><span class="p">(</span><span class="s2">&quot;Cannot set require_index for numeric parameter %s.&quot;</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span> </span><span id="L-876"><a href="#L-876"><span class="linenos" data-line="876"></span></a> <span class="c1">-- If a parameter without the trailing index was found, and</span> </span><span id="L-877"><a href="#L-877"><span class="linenos" data-line="877"></span></a> <span class="c1">-- require_index is set on the param, treat it</span> </span><span id="L-878"><a href="#L-878"><span class="linenos" data-line="878"></span></a> <span class="c1">-- as if it isn&#39;t recognized.</span> </span><span id="L-879"><a href="#L-879"><span class="linenos" data-line="879"></span></a> <span class="kr">elseif</span> <span class="ow">not</span> <span class="n">index</span> <span class="kr">then</span> </span><span id="L-880"><a href="#L-880"><span class="linenos" data-line="880"></span></a> <span class="n">unknown_param</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">val</span><span class="p">,</span> <span class="n">args_unknown</span><span class="p">,</span> <span class="n">return_unknown</span><span class="p">)</span> </span><span id="L-881"><a href="#L-881"><span class="linenos" data-line="881"></span></a> <span class="kr">end</span> </span><span id="L-882"><a href="#L-882"><span class="linenos" data-line="882"></span></a> <span class="kr">end</span> </span><span id="L-883"><a href="#L-883"><span class="linenos" data-line="883"></span></a> </span><span id="L-884"><a href="#L-884"><span class="linenos" data-line="884"></span></a> <span class="c1">-- Check that separate_no_index is not being used with a numeric parameter.</span> </span><span id="L-885"><a href="#L-885"><span class="linenos" data-line="885"></span></a> <span class="kr">if</span> <span class="n">param</span><span class="p">.</span><span class="n">separate_no_index</span> <span class="kr">then</span> </span><span id="L-886"><a href="#L-886"><span class="linenos" data-line="886"></span></a> <span class="kr">if</span> <span class="n">raw_type</span> <span class="o">==</span> <span class="s2">&quot;number&quot;</span> <span class="kr">then</span> </span><span id="L-887"><a href="#L-887"><span class="linenos" data-line="887"></span></a> <span class="n">internal_process_error</span><span class="p">(</span><span class="s2">&quot;Cannot set separate_no_index for numeric parameter %s.&quot;</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span> </span><span id="L-888"><a href="#L-888"><span class="linenos" data-line="888"></span></a> <span class="kr">elseif</span> <span class="nb">type</span><span class="p">(</span><span class="n">param</span><span class="p">.</span><span class="n">alias_of</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&quot;number&quot;</span> <span class="kr">then</span> </span><span id="L-889"><a href="#L-889"><span class="linenos" data-line="889"></span></a> <span class="n">internal_process_error</span><span class="p">(</span> </span><span id="L-890"><a href="#L-890"><span class="linenos" data-line="890"></span></a> <span class="s2">&quot;Cannot set separate_no_index for parameter %s, as it is an alias of numeric parameter %s.&quot;</span><span class="p">,</span> </span><span id="L-891"><a href="#L-891"><span class="linenos" data-line="891"></span></a> <span class="n">name</span><span class="p">,</span> <span class="n">param</span><span class="p">.</span><span class="n">alias_of</span><span class="p">)</span> </span><span id="L-892"><a href="#L-892"><span class="linenos" data-line="892"></span></a> <span class="kr">end</span> </span><span id="L-893"><a href="#L-893"><span class="linenos" data-line="893"></span></a> <span class="kr">end</span> </span><span id="L-894"><a href="#L-894"><span class="linenos" data-line="894"></span></a> </span><span id="L-895"><a href="#L-895"><span class="linenos" data-line="895"></span></a> <span class="c1">-- If no index was found, use 1 as the default index.</span> </span><span id="L-896"><a href="#L-896"><span class="linenos" data-line="896"></span></a> <span class="c1">-- This makes list parameters like g, g2, g3 put g at index 1.</span> </span><span id="L-897"><a href="#L-897"><span class="linenos" data-line="897"></span></a> <span class="c1">-- If `separate_no_index` is set, then use 0 as the default instead.</span> </span><span id="L-898"><a href="#L-898"><span class="linenos" data-line="898"></span></a> <span class="kr">if</span> <span class="n">param</span><span class="p">.</span><span class="n">list</span> <span class="kr">then</span> </span><span id="L-899"><a href="#L-899"><span class="linenos" data-line="899"></span></a> <span class="n">index</span> <span class="o">=</span> <span class="n">index</span> <span class="ow">or</span> <span class="n">param</span><span class="p">.</span><span class="n">separate_no_index</span> <span class="ow">and</span> <span class="mi">0</span> <span class="ow">or</span> <span class="mi">1</span> </span><span id="L-900"><a href="#L-900"><span class="linenos" data-line="900"></span></a> <span class="kr">end</span> </span><span id="L-901"><a href="#L-901"><span class="linenos" data-line="901"></span></a> </span><span id="L-902"><a href="#L-902"><span class="linenos" data-line="902"></span></a> <span class="c1">-- Normalize to the canonical parameter name. If it&#39;s a list, but the alias is not, then determine the index.</span> </span><span id="L-903"><a href="#L-903"><span class="linenos" data-line="903"></span></a> <span class="kd">local</span> <span class="n">raw_name</span> <span class="o">=</span> <span class="n">param</span><span class="p">.</span><span class="n">alias_of</span> </span><span id="L-904"><a href="#L-904"><span class="linenos" data-line="904"></span></a> <span class="kr">if</span> <span class="n">param</span><span class="p">.</span><span class="n">alias_of</span> <span class="kr">then</span> </span><span id="L-905"><a href="#L-905"><span class="linenos" data-line="905"></span></a> <span class="n">raw_type</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="n">raw_name</span><span class="p">)</span> </span><span id="L-906"><a href="#L-906"><span class="linenos" data-line="906"></span></a> <span class="kr">if</span> <span class="n">raw_type</span> <span class="o">==</span> <span class="s2">&quot;number&quot;</span> <span class="kr">then</span> </span><span id="L-907"><a href="#L-907"><span class="linenos" data-line="907"></span></a> <span class="kd">local</span> <span class="n">main_param</span> <span class="o">=</span> <span class="n">params</span><span class="p">[</span><span class="n">raw_name</span><span class="p">]</span> </span><span id="L-908"><a href="#L-908"><span class="linenos" data-line="908"></span></a> <span class="kr">if</span> <span class="n">param_types</span><span class="p">[</span><span class="n">main_param</span><span class="p">]</span> <span class="o">==</span> <span class="s2">&quot;table&quot;</span> <span class="ow">and</span> <span class="n">main_param</span><span class="p">.</span><span class="n">list</span> <span class="kr">then</span> </span><span id="L-909"><a href="#L-909"><span class="linenos" data-line="909"></span></a> <span class="n">index</span> <span class="o">=</span> <span class="n">index</span> <span class="ow">or</span> <span class="n">param</span><span class="p">.</span><span class="n">separate_no_index</span> <span class="ow">and</span> <span class="mi">0</span> <span class="ow">or</span> <span class="mi">1</span> </span><span id="L-910"><a href="#L-910"><span class="linenos" data-line="910"></span></a> <span class="n">normalized</span> <span class="o">=</span> <span class="n">raw_name</span> <span class="o">+</span> <span class="n">index</span> <span class="o">-</span> <span class="mi">1</span> </span><span id="L-911"><a href="#L-911"><span class="linenos" data-line="911"></span></a> <span class="kr">else</span> </span><span id="L-912"><a href="#L-912"><span class="linenos" data-line="912"></span></a> <span class="n">normalized</span> <span class="o">=</span> <span class="n">raw_name</span> </span><span id="L-913"><a href="#L-913"><span class="linenos" data-line="913"></span></a> <span class="kr">end</span> </span><span id="L-914"><a href="#L-914"><span class="linenos" data-line="914"></span></a> <span class="n">name</span> <span class="o">=</span> <span class="n">raw_name</span> </span><span id="L-915"><a href="#L-915"><span class="linenos" data-line="915"></span></a> <span class="kr">else</span> </span><span id="L-916"><a href="#L-916"><span class="linenos" data-line="916"></span></a> <span class="n">name</span> <span class="o">=</span> <span class="n">gsub</span><span class="p">(</span><span class="n">raw_name</span><span class="p">,</span> <span class="s2">&quot;</span><span class="se">\1</span><span class="s2">&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span> </span><span id="L-917"><a href="#L-917"><span class="linenos" data-line="917"></span></a> <span class="kd">local</span> <span class="n">main_param</span> <span class="o">=</span> <span class="n">params</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> </span><span id="L-918"><a href="#L-918"><span class="linenos" data-line="918"></span></a> <span class="kr">if</span> <span class="n">param_types</span><span class="p">[</span><span class="n">main_param</span><span class="p">]</span> <span class="o">==</span> <span class="s2">&quot;table&quot;</span> <span class="ow">and</span> <span class="n">main_param</span><span class="p">.</span><span class="n">list</span> <span class="kr">then</span> </span><span id="L-919"><a href="#L-919"><span class="linenos" data-line="919"></span></a> <span class="n">index</span> <span class="o">=</span> <span class="n">index</span> <span class="ow">or</span> <span class="n">param</span><span class="p">.</span><span class="n">separate_no_index</span> <span class="ow">and</span> <span class="mi">0</span> <span class="ow">or</span> <span class="mi">1</span> </span><span id="L-920"><a href="#L-920"><span class="linenos" data-line="920"></span></a> <span class="kr">end</span> </span><span id="L-921"><a href="#L-921"><span class="linenos" data-line="921"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">index</span> <span class="ow">or</span> <span class="n">index</span> <span class="o">==</span> <span class="mi">0</span> <span class="kr">then</span> </span><span id="L-922"><a href="#L-922"><span class="linenos" data-line="922"></span></a> <span class="n">normalized</span> <span class="o">=</span> <span class="n">name</span> </span><span id="L-923"><a href="#L-923"><span class="linenos" data-line="923"></span></a> <span class="kr">elseif</span> <span class="n">name</span> <span class="o">==</span> <span class="n">raw_name</span> <span class="kr">then</span> </span><span id="L-924"><a href="#L-924"><span class="linenos" data-line="924"></span></a> <span class="n">normalized</span> <span class="o">=</span> <span class="n">name</span> <span class="o">..</span> <span class="n">index</span> </span><span id="L-925"><a href="#L-925"><span class="linenos" data-line="925"></span></a> <span class="kr">else</span> </span><span id="L-926"><a href="#L-926"><span class="linenos" data-line="926"></span></a> <span class="n">normalized</span> <span class="o">=</span> <span class="n">gsub</span><span class="p">(</span><span class="n">raw_name</span><span class="p">,</span> <span class="s2">&quot;</span><span class="se">\1</span><span class="s2">&quot;</span><span class="p">,</span> <span class="n">index</span><span class="p">)</span> </span><span id="L-927"><a href="#L-927"><span class="linenos" data-line="927"></span></a> <span class="kr">end</span> </span><span id="L-928"><a href="#L-928"><span class="linenos" data-line="928"></span></a> <span class="kr">end</span> </span><span id="L-929"><a href="#L-929"><span class="linenos" data-line="929"></span></a> <span class="kr">else</span> </span><span id="L-930"><a href="#L-930"><span class="linenos" data-line="930"></span></a> <span class="n">normalized</span> <span class="o">=</span> <span class="n">orig_name</span> </span><span id="L-931"><a href="#L-931"><span class="linenos" data-line="931"></span></a> <span class="kr">end</span> </span><span id="L-932"><a href="#L-932"><span class="linenos" data-line="932"></span></a> </span><span id="L-933"><a href="#L-933"><span class="linenos" data-line="933"></span></a> <span class="c1">-- Only allow demo parameters if the current page contains the originating</span> </span><span id="L-934"><a href="#L-934"><span class="linenos" data-line="934"></span></a> <span class="c1">-- {{#invoke:}}, or this is the User: namespace.</span> </span><span id="L-935"><a href="#L-935"><span class="linenos" data-line="935"></span></a> <span class="kr">if</span> <span class="n">param</span><span class="p">.</span><span class="n">demo</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">check_demo_param</span><span class="p">()</span> <span class="kr">then</span> </span><span id="L-936"><a href="#L-936"><span class="linenos" data-line="936"></span></a> <span class="n">unknown_param</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">val</span><span class="p">,</span> <span class="n">args_unknown</span><span class="p">,</span> <span class="n">return_unknown</span><span class="p">)</span> </span><span id="L-937"><a href="#L-937"><span class="linenos" data-line="937"></span></a> <span class="kr">end</span> </span><span id="L-938"><a href="#L-938"><span class="linenos" data-line="938"></span></a> </span><span id="L-939"><a href="#L-939"><span class="linenos" data-line="939"></span></a> <span class="c1">-- Remove leading and trailing whitespace unless no_trim is true.</span> </span><span id="L-940"><a href="#L-940"><span class="linenos" data-line="940"></span></a> <span class="kr">if</span> <span class="n">param</span><span class="p">.</span><span class="n">no_trim</span> <span class="kr">then</span> </span><span id="L-941"><a href="#L-941"><span class="linenos" data-line="941"></span></a> <span class="n">check_string_param</span><span class="p">(</span><span class="n">param</span><span class="p">.</span><span class="n">type</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="s2">&quot;no_trim&quot;</span><span class="p">)</span> </span><span id="L-942"><a href="#L-942"><span class="linenos" data-line="942"></span></a> <span class="kr">else</span> </span><span id="L-943"><a href="#L-943"><span class="linenos" data-line="943"></span></a> <span class="n">val</span> <span class="o">=</span> <span class="n">trim</span><span class="p">(</span><span class="n">val</span><span class="p">)</span> </span><span id="L-944"><a href="#L-944"><span class="linenos" data-line="944"></span></a> <span class="kr">end</span> </span><span id="L-945"><a href="#L-945"><span class="linenos" data-line="945"></span></a> </span><span id="L-946"><a href="#L-946"><span class="linenos" data-line="946"></span></a> <span class="c1">-- Empty string is equivalent to nil unless allow_empty is true.</span> </span><span id="L-947"><a href="#L-947"><span class="linenos" data-line="947"></span></a> <span class="kr">if</span> <span class="n">param</span><span class="p">.</span><span class="n">allow_empty</span> <span class="kr">then</span> </span><span id="L-948"><a href="#L-948"><span class="linenos" data-line="948"></span></a> <span class="n">check_string_param</span><span class="p">(</span><span class="n">param</span><span class="p">.</span><span class="n">type</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="s2">&quot;allow_empty&quot;</span><span class="p">)</span> </span><span id="L-949"><a href="#L-949"><span class="linenos" data-line="949"></span></a> <span class="kr">elseif</span> <span class="n">val</span> <span class="o">==</span> <span class="s2">&quot;&quot;</span> <span class="kr">then</span> </span><span id="L-950"><a href="#L-950"><span class="linenos" data-line="950"></span></a> <span class="n">val</span> <span class="o">=</span> <span class="kc">nil</span> </span><span id="L-951"><a href="#L-951"><span class="linenos" data-line="951"></span></a> <span class="kr">end</span> </span><span id="L-952"><a href="#L-952"><span class="linenos" data-line="952"></span></a> </span><span id="L-953"><a href="#L-953"><span class="linenos" data-line="953"></span></a> <span class="c1">-- Can&#39;t use &quot;if val&quot; alone, because val may be a boolean false.</span> </span><span id="L-954"><a href="#L-954"><span class="linenos" data-line="954"></span></a> <span class="kr">if</span> <span class="n">val</span> <span class="o">~=</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-955"><a href="#L-955"><span class="linenos" data-line="955"></span></a> <span class="c1">-- Convert to proper type if necessary.</span> </span><span id="L-956"><a href="#L-956"><span class="linenos" data-line="956"></span></a> <span class="kd">local</span> <span class="n">main_param</span> <span class="o">=</span> <span class="n">params</span><span class="p">[</span><span class="n">raw_name</span><span class="p">]</span> </span><span id="L-957"><a href="#L-957"><span class="linenos" data-line="957"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">main_param</span> <span class="ow">or</span> <span class="n">param_types</span><span class="p">[</span><span class="n">main_param</span><span class="p">]</span> <span class="o">==</span> <span class="s2">&quot;table&quot;</span> <span class="kr">then</span> </span><span id="L-958"><a href="#L-958"><span class="linenos" data-line="958"></span></a> <span class="n">val</span> <span class="o">=</span> <span class="n">convert_val</span><span class="p">(</span><span class="n">val</span><span class="p">,</span> <span class="n">orig_name</span><span class="p">,</span> <span class="n">main_param</span> <span class="ow">or</span> <span class="n">param</span><span class="p">)</span> </span><span id="L-959"><a href="#L-959"><span class="linenos" data-line="959"></span></a> <span class="kr">end</span> </span><span id="L-960"><a href="#L-960"><span class="linenos" data-line="960"></span></a> </span><span id="L-961"><a href="#L-961"><span class="linenos" data-line="961"></span></a> <span class="c1">-- Mark it as no longer required, as it is present.</span> </span><span id="L-962"><a href="#L-962"><span class="linenos" data-line="962"></span></a> <span class="n">required</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="kc">nil</span> </span><span id="L-963"><a href="#L-963"><span class="linenos" data-line="963"></span></a> </span><span id="L-964"><a href="#L-964"><span class="linenos" data-line="964"></span></a> <span class="c1">-- Store the argument value.</span> </span><span id="L-965"><a href="#L-965"><span class="linenos" data-line="965"></span></a> <span class="kr">if</span> <span class="n">index</span> <span class="kr">then</span> </span><span id="L-966"><a href="#L-966"><span class="linenos" data-line="966"></span></a> <span class="c1">-- If the parameter is duplicated, throw an error.</span> </span><span id="L-967"><a href="#L-967"><span class="linenos" data-line="967"></span></a> <span class="kr">if</span> <span class="n">args_new</span><span class="p">[</span><span class="n">name</span><span class="p">][</span><span class="n">index</span><span class="p">]</span> <span class="o">~=</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-968"><a href="#L-968"><span class="linenos" data-line="968"></span></a> <span class="n">process_error</span><span class="p">(</span> </span><span id="L-969"><a href="#L-969"><span class="linenos" data-line="969"></span></a> <span class="s2">&quot;Parameter %s has been entered more than once. This is probably because a list parameter has been entered without an index and with index 1 at the same time, or because a parameter alias has been used.&quot;</span><span class="p">,</span> </span><span id="L-970"><a href="#L-970"><span class="linenos" data-line="970"></span></a> <span class="n">normalized</span><span class="p">)</span> </span><span id="L-971"><a href="#L-971"><span class="linenos" data-line="971"></span></a> <span class="kr">end</span> </span><span id="L-972"><a href="#L-972"><span class="linenos" data-line="972"></span></a> <span class="n">args_new</span><span class="p">[</span><span class="n">name</span><span class="p">][</span><span class="n">index</span><span class="p">]</span> <span class="o">=</span> <span class="n">val</span> </span><span id="L-973"><a href="#L-973"><span class="linenos" data-line="973"></span></a> </span><span id="L-974"><a href="#L-974"><span class="linenos" data-line="974"></span></a> <span class="c1">-- Store the highest index we find.</span> </span><span id="L-975"><a href="#L-975"><span class="linenos" data-line="975"></span></a> <span class="n">args_new</span><span class="p">[</span><span class="n">name</span><span class="p">].</span><span class="n">maxindex</span> <span class="o">=</span> <span class="n">max</span><span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="n">args_new</span><span class="p">[</span><span class="n">name</span><span class="p">].</span><span class="n">maxindex</span><span class="p">)</span> </span><span id="L-976"><a href="#L-976"><span class="linenos" data-line="976"></span></a> <span class="kr">if</span> <span class="n">args_new</span><span class="p">[</span><span class="n">name</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">~=</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-977"><a href="#L-977"><span class="linenos" data-line="977"></span></a> <span class="n">args_new</span><span class="p">[</span><span class="n">name</span><span class="p">].</span><span class="n">default</span> <span class="o">=</span> <span class="n">args_new</span><span class="p">[</span><span class="n">name</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> </span><span id="L-978"><a href="#L-978"><span class="linenos" data-line="978"></span></a> <span class="kr">if</span> <span class="n">args_new</span><span class="p">[</span><span class="n">name</span><span class="p">].</span><span class="n">maxindex</span> <span class="o">==</span> <span class="mi">0</span> <span class="kr">then</span> </span><span id="L-979"><a href="#L-979"><span class="linenos" data-line="979"></span></a> <span class="n">args_new</span><span class="p">[</span><span class="n">name</span><span class="p">].</span><span class="n">maxindex</span> <span class="o">=</span> <span class="mi">1</span> </span><span id="L-980"><a href="#L-980"><span class="linenos" data-line="980"></span></a> <span class="kr">end</span> </span><span id="L-981"><a href="#L-981"><span class="linenos" data-line="981"></span></a> <span class="n">args_new</span><span class="p">[</span><span class="n">name</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="kc">nil</span> </span><span id="L-982"><a href="#L-982"><span class="linenos" data-line="982"></span></a> </span><span id="L-983"><a href="#L-983"><span class="linenos" data-line="983"></span></a> <span class="kr">end</span> </span><span id="L-984"><a href="#L-984"><span class="linenos" data-line="984"></span></a> </span><span id="L-985"><a href="#L-985"><span class="linenos" data-line="985"></span></a> <span class="kr">if</span> <span class="n">params</span><span class="p">[</span><span class="n">name</span><span class="p">].</span><span class="n">list</span> <span class="kr">then</span> </span><span id="L-986"><a href="#L-986"><span class="linenos" data-line="986"></span></a> <span class="c1">-- Don&#39;t store index 0, as it&#39;s a proxy for the default.</span> </span><span id="L-987"><a href="#L-987"><span class="linenos" data-line="987"></span></a> <span class="kr">if</span> <span class="n">index</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="kr">then</span> </span><span id="L-988"><a href="#L-988"><span class="linenos" data-line="988"></span></a> <span class="n">args_new</span><span class="p">[</span><span class="n">name</span><span class="p">][</span><span class="n">index</span><span class="p">]</span> <span class="o">=</span> <span class="n">val</span> </span><span id="L-989"><a href="#L-989"><span class="linenos" data-line="989"></span></a> <span class="c1">-- Store the highest index we find.</span> </span><span id="L-990"><a href="#L-990"><span class="linenos" data-line="990"></span></a> <span class="n">args_new</span><span class="p">[</span><span class="n">name</span><span class="p">].</span><span class="n">maxindex</span> <span class="o">=</span> <span class="n">max</span><span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="n">args_new</span><span class="p">[</span><span class="n">name</span><span class="p">].</span><span class="n">maxindex</span><span class="p">)</span> </span><span id="L-991"><a href="#L-991"><span class="linenos" data-line="991"></span></a> <span class="kr">end</span> </span><span id="L-992"><a href="#L-992"><span class="linenos" data-line="992"></span></a> <span class="kr">else</span> </span><span id="L-993"><a href="#L-993"><span class="linenos" data-line="993"></span></a> <span class="n">args_new</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">val</span> </span><span id="L-994"><a href="#L-994"><span class="linenos" data-line="994"></span></a> <span class="kr">end</span> </span><span id="L-995"><a href="#L-995"><span class="linenos" data-line="995"></span></a> <span class="kr">else</span> </span><span id="L-996"><a href="#L-996"><span class="linenos" data-line="996"></span></a> <span class="c1">-- If the parameter is duplicated, throw an error.</span> </span><span id="L-997"><a href="#L-997"><span class="linenos" data-line="997"></span></a> <span class="kr">if</span> <span class="n">args_new</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">~=</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-998"><a href="#L-998"><span class="linenos" data-line="998"></span></a> <span class="n">process_error</span><span class="p">(</span> </span><span id="L-999"><a href="#L-999"><span class="linenos" data-line="999"></span></a> <span class="s2">&quot;Parameter %s has been entered more than once. This is probably because a parameter alias has been used.&quot;</span><span class="p">,</span> </span><span id="L-1000"><a href="#L-1000"><span class="linenos" data-line="1000"></span></a> <span class="n">normalized</span><span class="p">)</span> </span><span id="L-1001"><a href="#L-1001"><span class="linenos" data-line="1001"></span></a> <span class="kr">end</span> </span><span id="L-1002"><a href="#L-1002"><span class="linenos" data-line="1002"></span></a> </span><span id="L-1003"><a href="#L-1003"><span class="linenos" data-line="1003"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">param</span><span class="p">.</span><span class="n">alias_of</span> <span class="kr">then</span> </span><span id="L-1004"><a href="#L-1004"><span class="linenos" data-line="1004"></span></a> <span class="n">args_new</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">val</span> </span><span id="L-1005"><a href="#L-1005"><span class="linenos" data-line="1005"></span></a> <span class="kr">else</span> </span><span id="L-1006"><a href="#L-1006"><span class="linenos" data-line="1006"></span></a> <span class="kd">local</span> <span class="n">main_param</span> <span class="o">=</span> <span class="n">params</span><span class="p">[</span><span class="n">param</span><span class="p">.</span><span class="n">alias_of</span><span class="p">]</span> </span><span id="L-1007"><a href="#L-1007"><span class="linenos" data-line="1007"></span></a> <span class="kr">if</span> <span class="n">param_types</span><span class="p">[</span><span class="n">main_param</span><span class="p">]</span> <span class="o">==</span> <span class="s2">&quot;table&quot;</span> <span class="ow">and</span> <span class="n">main_param</span><span class="p">.</span><span class="n">list</span> <span class="kr">then</span> </span><span id="L-1008"><a href="#L-1008"><span class="linenos" data-line="1008"></span></a> <span class="n">args_new</span><span class="p">[</span><span class="n">param</span><span class="p">.</span><span class="n">alias_of</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">val</span> </span><span id="L-1009"><a href="#L-1009"><span class="linenos" data-line="1009"></span></a> <span class="c1">-- Store the highest index we find.</span> </span><span id="L-1010"><a href="#L-1010"><span class="linenos" data-line="1010"></span></a> <span class="n">args_new</span><span class="p">[</span><span class="n">param</span><span class="p">.</span><span class="n">alias_of</span><span class="p">].</span><span class="n">maxindex</span> <span class="o">=</span> <span class="n">max</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">args_new</span><span class="p">[</span><span class="n">param</span><span class="p">.</span><span class="n">alias_of</span><span class="p">].</span><span class="n">maxindex</span><span class="p">)</span> </span><span id="L-1011"><a href="#L-1011"><span class="linenos" data-line="1011"></span></a> <span class="kr">else</span> </span><span id="L-1012"><a href="#L-1012"><span class="linenos" data-line="1012"></span></a> <span class="n">args_new</span><span class="p">[</span><span class="n">param</span><span class="p">.</span><span class="n">alias_of</span><span class="p">]</span> <span class="o">=</span> <span class="n">val</span> </span><span id="L-1013"><a href="#L-1013"><span class="linenos" data-line="1013"></span></a> <span class="kr">end</span> </span><span id="L-1014"><a href="#L-1014"><span class="linenos" data-line="1014"></span></a> <span class="kr">end</span> </span><span id="L-1015"><a href="#L-1015"><span class="linenos" data-line="1015"></span></a> <span class="kr">end</span> </span><span id="L-1016"><a href="#L-1016"><span class="linenos" data-line="1016"></span></a> <span class="kr">end</span> </span><span id="L-1017"><a href="#L-1017"><span class="linenos" data-line="1017"></span></a> <span class="kr">end</span> </span><span id="L-1018"><a href="#L-1018"><span class="linenos" data-line="1018"></span></a> <span class="kr">end</span> </span><span id="L-1019"><a href="#L-1019"><span class="linenos" data-line="1019"></span></a> </span><span id="L-1020"><a href="#L-1020"><span class="linenos" data-line="1020"></span></a> <span class="c1">-- Remove holes in any list parameters if needed.</span> </span><span id="L-1021"><a href="#L-1021"><span class="linenos" data-line="1021"></span></a> <span class="kr">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">val</span> <span class="kr">in</span> <span class="nb">pairs</span><span class="p">(</span><span class="n">args_new</span><span class="p">)</span> <span class="kr">do</span> </span><span id="L-1022"><a href="#L-1022"><span class="linenos" data-line="1022"></span></a> <span class="kr">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">val</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&quot;table&quot;</span> <span class="kr">then</span> </span><span id="L-1023"><a href="#L-1023"><span class="linenos" data-line="1023"></span></a> <span class="kd">local</span> <span class="n">listname</span> <span class="o">=</span> <span class="n">val</span><span class="p">.</span><span class="n">_list</span> </span><span id="L-1024"><a href="#L-1024"><span class="linenos" data-line="1024"></span></a> <span class="kr">if</span> <span class="n">listname</span> <span class="kr">then</span> </span><span id="L-1025"><a href="#L-1025"><span class="linenos" data-line="1025"></span></a> <span class="kr">if</span> <span class="n">params</span><span class="p">[</span><span class="n">name</span><span class="p">].</span><span class="n">disallow_holes</span> <span class="kr">then</span> </span><span id="L-1026"><a href="#L-1026"><span class="linenos" data-line="1026"></span></a> <span class="kd">local</span> <span class="n">highest</span> <span class="o">=</span> <span class="mi">0</span> </span><span id="L-1027"><a href="#L-1027"><span class="linenos" data-line="1027"></span></a> <span class="kr">for</span> <span class="n">num</span><span class="p">,</span> <span class="n">_</span> <span class="kr">in</span> <span class="nb">pairs</span><span class="p">(</span><span class="n">val</span><span class="p">)</span> <span class="kr">do</span> </span><span id="L-1028"><a href="#L-1028"><span class="linenos" data-line="1028"></span></a> <span class="kr">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">num</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&quot;number&quot;</span> <span class="ow">and</span> <span class="n">num</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">num</span> <span class="o">&lt;</span> <span class="n">huge</span> <span class="ow">and</span> <span class="n">floor</span><span class="p">(</span><span class="n">num</span><span class="p">)</span> <span class="o">==</span> <span class="n">num</span> <span class="kr">then</span> </span><span id="L-1029"><a href="#L-1029"><span class="linenos" data-line="1029"></span></a> <span class="n">highest</span> <span class="o">=</span> <span class="n">max</span><span class="p">(</span><span class="n">highest</span><span class="p">,</span> <span class="n">num</span><span class="p">)</span> </span><span id="L-1030"><a href="#L-1030"><span class="linenos" data-line="1030"></span></a> <span class="kr">end</span> </span><span id="L-1031"><a href="#L-1031"><span class="linenos" data-line="1031"></span></a> <span class="kr">end</span> </span><span id="L-1032"><a href="#L-1032"><span class="linenos" data-line="1032"></span></a> <span class="kr">for</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="n">highest</span> <span class="kr">do</span> </span><span id="L-1033"><a href="#L-1033"><span class="linenos" data-line="1033"></span></a> <span class="kr">if</span> <span class="n">val</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">==</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-1034"><a href="#L-1034"><span class="linenos" data-line="1034"></span></a> <span class="kr">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">listname</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&quot;string&quot;</span> <span class="kr">then</span> </span><span id="L-1035"><a href="#L-1035"><span class="linenos" data-line="1035"></span></a> <span class="n">listname</span> <span class="o">=</span> <span class="n">dump</span><span class="p">(</span><span class="n">listname</span><span class="p">)</span> </span><span id="L-1036"><a href="#L-1036"><span class="linenos" data-line="1036"></span></a> <span class="kr">elseif</span> <span class="nb">type</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&quot;number&quot;</span> <span class="kr">then</span> </span><span id="L-1037"><a href="#L-1037"><span class="linenos" data-line="1037"></span></a> <span class="n">i</span> <span class="o">=</span> <span class="n">i</span> <span class="o">+</span> <span class="n">name</span> <span class="o">-</span> <span class="mi">1</span> <span class="c1">-- Absolute index.</span> </span><span id="L-1038"><a href="#L-1038"><span class="linenos" data-line="1038"></span></a> <span class="n">listname</span> <span class="o">=</span> <span class="s2">&quot;numeric&quot;</span> </span><span id="L-1039"><a href="#L-1039"><span class="linenos" data-line="1039"></span></a> <span class="kr">else</span> </span><span id="L-1040"><a href="#L-1040"><span class="linenos" data-line="1040"></span></a> <span class="n">listname</span> <span class="o">=</span> <span class="n">dump</span><span class="p">(</span><span class="n">name</span><span class="p">)</span> </span><span id="L-1041"><a href="#L-1041"><span class="linenos" data-line="1041"></span></a> <span class="kr">end</span> </span><span id="L-1042"><a href="#L-1042"><span class="linenos" data-line="1042"></span></a> <span class="n">process_error</span><span class="p">(</span> </span><span id="L-1043"><a href="#L-1043"><span class="linenos" data-line="1043"></span></a> <span class="s2">&quot;Item %s in the list of &quot;</span> <span class="o">..</span> <span class="n">listname</span> <span class="o">..</span> <span class="s2">&quot; parameters cannot be empty, because the list must be contiguous.&quot;</span><span class="p">,</span> </span><span id="L-1044"><a href="#L-1044"><span class="linenos" data-line="1044"></span></a> <span class="n">i</span><span class="p">)</span> </span><span id="L-1045"><a href="#L-1045"><span class="linenos" data-line="1045"></span></a> <span class="kr">end</span> </span><span id="L-1046"><a href="#L-1046"><span class="linenos" data-line="1046"></span></a> <span class="kr">end</span> </span><span id="L-1047"><a href="#L-1047"><span class="linenos" data-line="1047"></span></a> <span class="c1">-- Some code depends on only numeric params being present</span> </span><span id="L-1048"><a href="#L-1048"><span class="linenos" data-line="1048"></span></a> <span class="c1">-- when no holes are allowed (e.g. by checking for the</span> </span><span id="L-1049"><a href="#L-1049"><span class="linenos" data-line="1049"></span></a> <span class="c1">-- presence of arguments using next()), so remove</span> </span><span id="L-1050"><a href="#L-1050"><span class="linenos" data-line="1050"></span></a> <span class="c1">-- `maxindex`.</span> </span><span id="L-1051"><a href="#L-1051"><span class="linenos" data-line="1051"></span></a> <span class="n">val</span><span class="p">.</span><span class="n">maxindex</span> <span class="o">=</span> <span class="kc">nil</span> </span><span id="L-1052"><a href="#L-1052"><span class="linenos" data-line="1052"></span></a> <span class="kr">elseif</span> <span class="ow">not</span> <span class="n">params</span><span class="p">[</span><span class="n">name</span><span class="p">].</span><span class="n">allow_holes</span> <span class="kr">then</span> </span><span id="L-1053"><a href="#L-1053"><span class="linenos" data-line="1053"></span></a> <span class="n">args_new</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">remove_holes</span><span class="p">(</span><span class="n">val</span><span class="p">)</span> </span><span id="L-1054"><a href="#L-1054"><span class="linenos" data-line="1054"></span></a> <span class="kr">end</span> </span><span id="L-1055"><a href="#L-1055"><span class="linenos" data-line="1055"></span></a> <span class="kr">end</span> </span><span id="L-1056"><a href="#L-1056"><span class="linenos" data-line="1056"></span></a> <span class="kr">end</span> </span><span id="L-1057"><a href="#L-1057"><span class="linenos" data-line="1057"></span></a> <span class="kr">end</span> </span><span id="L-1058"><a href="#L-1058"><span class="linenos" data-line="1058"></span></a> </span><span id="L-1059"><a href="#L-1059"><span class="linenos" data-line="1059"></span></a> <span class="c1">-- If the current page is the template which invoked this Lua instance, then ignore the `require` flag, as it</span> </span><span id="L-1060"><a href="#L-1060"><span class="linenos" data-line="1060"></span></a> <span class="c1">-- means we&#39;re viewing the template directly. Required parameters sometimes have a `template_default` key set,</span> </span><span id="L-1061"><a href="#L-1061"><span class="linenos" data-line="1061"></span></a> <span class="c1">-- which gets used in such cases as a demo.</span> </span><span id="L-1062"><a href="#L-1062"><span class="linenos" data-line="1062"></span></a> <span class="c1">-- Note: this won&#39;t work on other pages in the Template: namespace (including the /documentation subpage),</span> </span><span id="L-1063"><a href="#L-1063"><span class="linenos" data-line="1063"></span></a> <span class="c1">-- or if the #invoke: is on a page in another namespace.</span> </span><span id="L-1064"><a href="#L-1064"><span class="linenos" data-line="1064"></span></a> <span class="kd">local</span> <span class="n">is_template_page</span> <span class="o">=</span> <span class="n">current_namespace</span> <span class="o">==</span> <span class="mi">10</span> <span class="ow">and</span> <span class="n">is_invoke_page</span> </span><span id="L-1065"><a href="#L-1065"><span class="linenos" data-line="1065"></span></a> <span class="kd">local</span> <span class="n">pagename_set</span> <span class="o">=</span> <span class="n">args_new</span><span class="p">.</span><span class="n">pagename</span> </span><span id="L-1066"><a href="#L-1066"><span class="linenos" data-line="1066"></span></a> </span><span id="L-1067"><a href="#L-1067"><span class="linenos" data-line="1067"></span></a> <span class="c1">-- Handle defaults.</span> </span><span id="L-1068"><a href="#L-1068"><span class="linenos" data-line="1068"></span></a> <span class="kr">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">param</span> <span class="kr">in</span> <span class="nb">pairs</span><span class="p">(</span><span class="n">params</span><span class="p">)</span> <span class="kr">do</span> </span><span id="L-1069"><a href="#L-1069"><span class="linenos" data-line="1069"></span></a> <span class="kr">if</span> <span class="n">param_types</span><span class="p">[</span><span class="n">param</span><span class="p">]</span> <span class="o">==</span> <span class="s2">&quot;table&quot;</span> <span class="kr">then</span> </span><span id="L-1070"><a href="#L-1070"><span class="linenos" data-line="1070"></span></a> <span class="kd">local</span> <span class="n">default_val</span> </span><span id="L-1071"><a href="#L-1071"><span class="linenos" data-line="1071"></span></a> <span class="c1">-- If both `template_default` and `default` are given, `template_default` takes precedence, but only on</span> </span><span id="L-1072"><a href="#L-1072"><span class="linenos" data-line="1072"></span></a> <span class="c1">-- template pages. This lets you specify a different default as the template page example.</span> </span><span id="L-1073"><a href="#L-1073"><span class="linenos" data-line="1073"></span></a> <span class="c1">-- HACK: We still run into problems on documentation pages transcluded into the template page when pagename= is</span> </span><span id="L-1074"><a href="#L-1074"><span class="linenos" data-line="1074"></span></a> <span class="c1">-- set. Check this on the assumption that pagename= is fairly standard.</span> </span><span id="L-1075"><a href="#L-1075"><span class="linenos" data-line="1075"></span></a> <span class="kr">if</span> <span class="n">is_template_page</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">pagename_set</span> <span class="kr">then</span> </span><span id="L-1076"><a href="#L-1076"><span class="linenos" data-line="1076"></span></a> <span class="n">default_val</span> <span class="o">=</span> <span class="n">param</span><span class="p">.</span><span class="n">template_default</span> </span><span id="L-1077"><a href="#L-1077"><span class="linenos" data-line="1077"></span></a> <span class="kr">end</span> </span><span id="L-1078"><a href="#L-1078"><span class="linenos" data-line="1078"></span></a> <span class="kr">if</span> <span class="n">default_val</span> <span class="o">==</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-1079"><a href="#L-1079"><span class="linenos" data-line="1079"></span></a> <span class="n">default_val</span> <span class="o">=</span> <span class="n">param</span><span class="p">.</span><span class="n">default</span> </span><span id="L-1080"><a href="#L-1080"><span class="linenos" data-line="1080"></span></a> <span class="kr">end</span> </span><span id="L-1081"><a href="#L-1081"><span class="linenos" data-line="1081"></span></a> <span class="kr">if</span> <span class="n">default_val</span> <span class="o">~=</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-1082"><a href="#L-1082"><span class="linenos" data-line="1082"></span></a> <span class="kd">local</span> <span class="n">arg_new</span> <span class="o">=</span> <span class="n">args_new</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> </span><span id="L-1083"><a href="#L-1083"><span class="linenos" data-line="1083"></span></a> <span class="kr">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">arg_new</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&quot;table&quot;</span> <span class="ow">and</span> <span class="n">arg_new</span><span class="p">.</span><span class="n">_list</span> <span class="kr">then</span> </span><span id="L-1084"><a href="#L-1084"><span class="linenos" data-line="1084"></span></a> <span class="kr">if</span> <span class="n">arg_new</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-1085"><a href="#L-1085"><span class="linenos" data-line="1085"></span></a> <span class="n">arg_new</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">convert_val</span><span class="p">(</span><span class="n">default_val</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">param</span><span class="p">)</span> </span><span id="L-1086"><a href="#L-1086"><span class="linenos" data-line="1086"></span></a> <span class="kr">end</span> </span><span id="L-1087"><a href="#L-1087"><span class="linenos" data-line="1087"></span></a> <span class="kr">if</span> <span class="n">arg_new</span><span class="p">.</span><span class="n">maxindex</span> <span class="o">==</span> <span class="mi">0</span> <span class="kr">then</span> </span><span id="L-1088"><a href="#L-1088"><span class="linenos" data-line="1088"></span></a> <span class="n">arg_new</span><span class="p">.</span><span class="n">maxindex</span> <span class="o">=</span> <span class="mi">1</span> </span><span id="L-1089"><a href="#L-1089"><span class="linenos" data-line="1089"></span></a> <span class="kr">end</span> </span><span id="L-1090"><a href="#L-1090"><span class="linenos" data-line="1090"></span></a> <span class="n">arg_new</span><span class="p">.</span><span class="n">_list</span> <span class="o">=</span> <span class="kc">nil</span> </span><span id="L-1091"><a href="#L-1091"><span class="linenos" data-line="1091"></span></a> <span class="kr">elseif</span> <span class="n">arg_new</span> <span class="o">==</span> <span class="kc">nil</span> <span class="kr">then</span> </span><span id="L-1092"><a href="#L-1092"><span class="linenos" data-line="1092"></span></a> <span class="n">args_new</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">convert_val</span><span class="p">(</span><span class="n">default_val</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">param</span><span class="p">)</span> </span><span id="L-1093"><a href="#L-1093"><span class="linenos" data-line="1093"></span></a> <span class="kr">end</span> </span><span id="L-1094"><a href="#L-1094"><span class="linenos" data-line="1094"></span></a> <span class="kr">end</span> </span><span id="L-1095"><a href="#L-1095"><span class="linenos" data-line="1095"></span></a> <span class="kr">end</span> </span><span id="L-1096"><a href="#L-1096"><span class="linenos" data-line="1096"></span></a> <span class="kr">end</span> </span><span id="L-1097"><a href="#L-1097"><span class="linenos" data-line="1097"></span></a> </span><span id="L-1098"><a href="#L-1098"><span class="linenos" data-line="1098"></span></a> <span class="c1">-- The required table should now be empty.</span> </span><span id="L-1099"><a href="#L-1099"><span class="linenos" data-line="1099"></span></a> <span class="c1">-- If any entry remains, trigger an error, unless we&#39;re on a template page.</span> </span><span id="L-1100"><a href="#L-1100"><span class="linenos" data-line="1100"></span></a> <span class="kr">if</span> <span class="ow">not</span> <span class="n">is_template_page</span> <span class="kr">then</span> </span><span id="L-1101"><a href="#L-1101"><span class="linenos" data-line="1101"></span></a> <span class="kd">local</span> <span class="n">list</span> <span class="o">=</span> <span class="p">{}</span> </span><span id="L-1102"><a href="#L-1102"><span class="linenos" data-line="1102"></span></a> <span class="kr">for</span> <span class="n">name</span> <span class="kr">in</span> <span class="nb">pairs</span><span class="p">(</span><span class="n">required</span><span class="p">)</span> <span class="kr">do</span> </span><span id="L-1103"><a href="#L-1103"><span class="linenos" data-line="1103"></span></a> <span class="n">insert</span><span class="p">(</span><span class="n">list</span><span class="p">,</span> <span class="n">dump</span><span class="p">(</span><span class="n">name</span><span class="p">))</span> </span><span id="L-1104"><a href="#L-1104"><span class="linenos" data-line="1104"></span></a> <span class="kr">end</span> </span><span id="L-1105"><a href="#L-1105"><span class="linenos" data-line="1105"></span></a> <span class="kd">local</span> <span class="n">n</span> <span class="o">=</span> <span class="o">#</span><span class="n">list</span> </span><span id="L-1106"><a href="#L-1106"><span class="linenos" data-line="1106"></span></a> <span class="kr">if</span> <span class="n">n</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="kr">then</span> </span><span id="L-1107"><a href="#L-1107"><span class="linenos" data-line="1107"></span></a> <span class="n">process_error</span><span class="p">(</span><span class="s2">&quot;Parameter&quot;</span> <span class="o">..</span> <span class="p">(</span> </span><span id="L-1108"><a href="#L-1108"><span class="linenos" data-line="1108"></span></a> <span class="n">n</span> <span class="o">==</span> <span class="mi">1</span> <span class="ow">and</span> <span class="p">(</span><span class="s2">&quot; &quot;</span> <span class="o">..</span> <span class="n">list</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">..</span> <span class="s2">&quot; is&quot;</span><span class="p">)</span> <span class="ow">or</span> </span><span id="L-1109"><a href="#L-1109"><span class="linenos" data-line="1109"></span></a> <span class="p">(</span><span class="s2">&quot;s &quot;</span> <span class="o">..</span> <span class="n">concat_list</span><span class="p">(</span><span class="n">list</span><span class="p">,</span> <span class="s2">&quot; and &quot;</span><span class="p">,</span> <span class="kc">true</span><span class="p">)</span> <span class="o">..</span> <span class="s2">&quot; are&quot;</span><span class="p">)</span> </span><span id="L-1110"><a href="#L-1110"><span class="linenos" data-line="1110"></span></a> <span class="p">)</span> <span class="o">..</span> <span class="s2">&quot; required.&quot;</span><span class="p">)</span> </span><span id="L-1111"><a href="#L-1111"><span class="linenos" data-line="1111"></span></a> <span class="kr">end</span> </span><span id="L-1112"><a href="#L-1112"><span class="linenos" data-line="1112"></span></a> <span class="kr">end</span> </span><span id="L-1113"><a href="#L-1113"><span class="linenos" data-line="1113"></span></a> </span><span id="L-1114"><a href="#L-1114"><span class="linenos" data-line="1114"></span></a> <span class="c1">-- Remove the temporary _list flag.</span> </span><span id="L-1115"><a href="#L-1115"><span class="linenos" data-line="1115"></span></a> <span class="kr">for</span> <span class="n">_</span><span class="p">,</span> <span class="n">arg_new</span> <span class="kr">in</span> <span class="nb">pairs</span><span class="p">(</span><span class="n">args_new</span><span class="p">)</span> <span class="kr">do</span> </span><span id="L-1116"><a href="#L-1116"><span class="linenos" data-line="1116"></span></a> <span class="kr">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">arg_new</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&quot;table&quot;</span> <span class="kr">then</span> </span><span id="L-1117"><a href="#L-1117"><span class="linenos" data-line="1117"></span></a> <span class="n">arg_new</span><span class="p">.</span><span class="n">_list</span> <span class="o">=</span> <span class="kc">nil</span> </span><span id="L-1118"><a href="#L-1118"><span class="linenos" data-line="1118"></span></a> <span class="kr">end</span> </span><span id="L-1119"><a href="#L-1119"><span class="linenos" data-line="1119"></span></a> <span class="kr">end</span> </span><span id="L-1120"><a href="#L-1120"><span class="linenos" data-line="1120"></span></a> </span><span id="L-1121"><a href="#L-1121"><span class="linenos" data-line="1121"></span></a> <span class="kr">if</span> <span class="n">return_unknown</span> <span class="kr">then</span> </span><span id="L-1122"><a href="#L-1122"><span class="linenos" data-line="1122"></span></a> <span class="kr">return</span> <span class="n">args_new</span><span class="p">,</span> <span class="n">args_unknown</span> </span><span id="L-1123"><a href="#L-1123"><span class="linenos" data-line="1123"></span></a> <span class="kr">else</span> </span><span id="L-1124"><a href="#L-1124"><span class="linenos" data-line="1124"></span></a> <span class="kr">return</span> <span class="n">args_new</span> </span><span id="L-1125"><a href="#L-1125"><span class="linenos" data-line="1125"></span></a> <span class="kr">end</span> </span><span id="L-1126"><a href="#L-1126"><span class="linenos" data-line="1126"></span></a><span class="kr">end</span> </span><span id="L-1127"><a href="#L-1127"><span class="linenos" data-line="1127"></span></a> </span><span id="L-1128"><a href="#L-1128"><span class="linenos" data-line="1128"></span></a><span class="kr">return</span> <span class="n">export</span> </span></pre></div> <!-- NewPP limit report Parsed by mw‐web.codfw.main‐f69cdc8f6‐znn46 Cached time: 20241125003506 Cache expiry: 2592000 Reduced expiry: false Complications: [vary‐revision‐sha1] CPU time usage: 0.148 seconds Real time usage: 0.256 seconds Preprocessor visited node count: 943/1000000 Post‐expand include size: 99135/2097152 bytes Template argument size: 222/2097152 bytes Highest expansion depth: 9/100 Expensive parser function count: 111/500 Unstrip recursion depth: 0/20 Unstrip post‐expand size: 19893/5000000 bytes Lua time usage: 0.103/10.000 seconds Lua memory usage: 2522069/104857600 bytes Number of Wikibase entities loaded: 0/400 --> <!-- Transclusion expansion time report (%,ms,calls,template) 100.00% 220.874 1 Template:documentation 100.00% 220.874 1 -total 69.50% 153.497 1 Template:module_documentation 11.88% 26.238 8 Template:tl 3.58% 7.916 31 Template:para 2.98% 6.591 1 Template:module_cat --> </div><!--esi <esi:include src="/esitest-fa8a495983347898/content" /> --><noscript><img src="https://login.wikimedia.org/wiki/Special:CentralAutoLogin/start?type=1x1" alt="" width="1" height="1" style="border: none; position: absolute;"></noscript> <div class="printfooter" data-nosnippet="">Retrieved from "<a dir="ltr" href="https://en.wiktionary.org/w/index.php?title=Module:parameters&amp;oldid=82639508">https://en.wiktionary.org/w/index.php?title=Module:parameters&amp;oldid=82639508</a>"</div></div> <div id="catlinks" class="catlinks" data-mw="interface"><div id="mw-normal-catlinks" class="mw-normal-catlinks"><a href="/wiki/Special:Categories" title="Special:Categories">Category</a>: <ul><li><a href="/wiki/Category:Parameter_parsing_modules" title="Category:Parameter parsing modules">Parameter parsing modules</a></li></ul></div></div> </div> </div> <div id="mw-navigation"> <h2>Navigation menu</h2> <div id="mw-head"> <nav id="p-personal" class="mw-portlet mw-portlet-personal vector-user-menu-legacy vector-menu" aria-labelledby="p-personal-label" > <h3 id="p-personal-label" class="vector-menu-heading " > <span class="vector-menu-heading-label">Personal tools</span> </h3> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-anonuserpage" class="mw-list-item"><span title="The user page for the IP address you are editing as">Not logged in</span></li><li id="pt-anontalk" class="mw-list-item"><a href="/wiki/Special:MyTalk" title="Discussion about edits from this IP address [n]" accesskey="n"><span>Talk</span></a></li><li id="pt-anoncontribs" class="mw-list-item"><a href="/wiki/Special:MyContributions" title="A list of edits made from this IP address [y]" accesskey="y"><span>Contributions</span></a></li><li id="pt-createaccount" class="mw-list-item"><a href="/w/index.php?title=Special:CreateAccount&amp;returnto=Module%3Aparameters" title="You are encouraged to create an account and log in; however, it is not mandatory"><span>Create account</span></a></li><li id="pt-login" class="mw-list-item"><a href="/w/index.php?title=Special:UserLogin&amp;returnto=Module%3Aparameters" title="You are encouraged to log in; however, it is not mandatory [o]" accesskey="o"><span>Log in</span></a></li> </ul> </div> </nav> <div id="left-navigation"> <nav id="p-namespaces" class="mw-portlet mw-portlet-namespaces vector-menu-tabs vector-menu-tabs-legacy vector-menu" aria-labelledby="p-namespaces-label" > <h3 id="p-namespaces-label" class="vector-menu-heading " > <span class="vector-menu-heading-label">Namespaces</span> </h3> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-nstab-module" class="selected mw-list-item"><a href="/wiki/Module:parameters" title="View the module page [c]" accesskey="c"><span>Module</span></a></li><li id="ca-talk" class="mw-list-item"><a href="/wiki/Module_talk:parameters" rel="discussion" title="Discussion about the content page [t]" accesskey="t"><span>Discussion</span></a></li> </ul> </div> </nav> <nav id="p-variants" class="mw-portlet mw-portlet-variants emptyPortlet vector-menu-dropdown vector-menu" aria-labelledby="p-variants-label" > <input type="checkbox" id="p-variants-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-p-variants" class="vector-menu-checkbox" aria-labelledby="p-variants-label" > <label id="p-variants-label" class="vector-menu-heading " > <span class="vector-menu-heading-label">English</span> </label> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </nav> </div> <div id="right-navigation"> <nav id="p-views" class="mw-portlet mw-portlet-views vector-menu-tabs vector-menu-tabs-legacy vector-menu" aria-labelledby="p-views-label" > <h3 id="p-views-label" class="vector-menu-heading " > <span class="vector-menu-heading-label">Views</span> </h3> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-view" class="selected mw-list-item"><a href="/wiki/Module:parameters"><span>Read</span></a></li><li id="ca-viewsource" class="mw-list-item"><a href="/w/index.php?title=Module:parameters&amp;action=edit" title="This page is protected.&#10;You can view its source [e]" accesskey="e"><span>View source</span></a></li><li id="ca-history" class="mw-list-item"><a href="/w/index.php?title=Module:parameters&amp;action=history" title="Past revisions of this page [h]" accesskey="h"><span>History</span></a></li> </ul> </div> </nav> <nav id="p-cactions" class="mw-portlet mw-portlet-cactions emptyPortlet vector-menu-dropdown vector-menu" aria-labelledby="p-cactions-label" title="More options" > <input type="checkbox" id="p-cactions-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-p-cactions" class="vector-menu-checkbox" aria-labelledby="p-cactions-label" > <label id="p-cactions-label" class="vector-menu-heading " > <span class="vector-menu-heading-label">More</span> </label> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </nav> <div id="p-search" role="search" class="vector-search-box-vue vector-search-box-show-thumbnail vector-search-box-auto-expand-width vector-search-box"> <h3 >Search</h3> <form action="/w/index.php" id="searchform" class="vector-search-box-form"> <div id="simpleSearch" class="vector-search-box-inner" data-search-loc="header-navigation"> <input class="vector-search-box-input" type="search" name="search" placeholder="Search Wiktionary" aria-label="Search Wiktionary" autocapitalize="none" title="Search Wiktionary [f]" accesskey="f" id="searchInput" > <input type="hidden" name="title" value="Special:Search"> <input id="mw-searchButton" class="searchButton mw-fallbackSearchButton" type="submit" name="fulltext" title="Search the pages for this text" value="Search"> <input id="searchButton" class="searchButton" type="submit" name="go" title="Go to a page with this exact name if it exists" value="Go"> </div> </form> </div> </div> </div> <div id="mw-panel" class="vector-legacy-sidebar"> <div id="p-logo" role="banner"> <a class="mw-wiki-logo" href="/wiki/Wiktionary:Main_Page" title="Visit the main page"></a> </div> <nav id="p-navigation" class="mw-portlet mw-portlet-navigation vector-menu-portal portal vector-menu" aria-labelledby="p-navigation-label" > <h3 id="p-navigation-label" class="vector-menu-heading " > <span class="vector-menu-heading-label">Navigation</span> </h3> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="n-mainpage-text" class="mw-list-item"><a href="/wiki/Wiktionary:Main_Page"><span>Main Page</span></a></li><li id="n-portal" class="mw-list-item"><a href="/wiki/Wiktionary:Community_portal" title="About the project, what you can do, where to find things"><span>Community portal</span></a></li><li id="n-requestedarticles" class="mw-list-item"><a href="/wiki/Wiktionary:Requested_entries"><span>Requested entries</span></a></li><li id="n-recentchanges" class="mw-list-item"><a href="/wiki/Special:RecentChanges" title="A list of recent changes in the wiki [r]" accesskey="r"><span>Recent changes</span></a></li><li id="n-randompage" class="mw-list-item"><a href="/wiki/Special:Random" title="Load a random page [x]" accesskey="x"><span>Random entry</span></a></li><li id="n-help" class="mw-list-item"><a href="https://en.wiktionary.org/wiki/Help:Contents" title="The place to find out"><span>Help</span></a></li><li id="n-Glossary" class="mw-list-item"><a href="/wiki/Appendix:Glossary"><span>Glossary</span></a></li><li id="n-sitesupport" class="mw-list-item"><a href="//donate.wikimedia.org/wiki/Special:FundraiserRedirector?utm_source=donate&amp;utm_medium=sidebar&amp;utm_campaign=C13_en.wiktionary.org&amp;uselang=en" title="Support us"><span>Donations</span></a></li><li id="n-contact" class="mw-list-item"><a href="/wiki/Wiktionary:Contact_us"><span>Contact us</span></a></li> </ul> </div> </nav> <nav id="p-tb" class="mw-portlet mw-portlet-tb vector-menu-portal portal vector-menu" aria-labelledby="p-tb-label" > <h3 id="p-tb-label" class="vector-menu-heading " > <span class="vector-menu-heading-label">Tools</span> </h3> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="t-whatlinkshere" class="mw-list-item"><a href="/wiki/Special:WhatLinksHere/Module:parameters" title="A list of all wiki pages that link here [j]" accesskey="j"><span>What links here</span></a></li><li id="t-recentchangeslinked" class="mw-list-item"><a href="/wiki/Special:RecentChangesLinked/Module:parameters" rel="nofollow" title="Recent changes in pages linked from this page [k]" accesskey="k"><span>Related changes</span></a></li><li id="t-upload" class="mw-list-item"><a href="//commons.wikimedia.org/wiki/Special:UploadWizard?uselang=en" title="Upload files [u]" accesskey="u"><span>Upload file</span></a></li><li id="t-specialpages" class="mw-list-item"><a href="/wiki/Special:SpecialPages" title="A list of all special pages [q]" accesskey="q"><span>Special pages</span></a></li><li id="t-permalink" class="mw-list-item"><a href="/w/index.php?title=Module:parameters&amp;oldid=82639508" title="Permanent link to this revision of this page"><span>Permanent link</span></a></li><li id="t-info" class="mw-list-item"><a href="/w/index.php?title=Module:parameters&amp;action=info" title="More information about this page"><span>Page information</span></a></li><li id="t-urlshortener" class="mw-list-item"><a href="/w/index.php?title=Special:UrlShortener&amp;url=https%3A%2F%2Fen.wiktionary.org%2Fwiki%2FModule%3Aparameters"><span>Get shortened URL</span></a></li><li id="t-urlshortener-qrcode" class="mw-list-item"><a href="/w/index.php?title=Special:QrCode&amp;url=https%3A%2F%2Fen.wiktionary.org%2Fwiki%2FModule%3Aparameters"><span>Download QR code</span></a></li> </ul> </div> </nav> <nav id="p-electronpdfservice-sidebar-portlet-heading" class="mw-portlet mw-portlet-electronpdfservice-sidebar-portlet-heading vector-menu-portal portal vector-menu" aria-labelledby="p-electronpdfservice-sidebar-portlet-heading-label" > <h3 id="p-electronpdfservice-sidebar-portlet-heading-label" class="vector-menu-heading " > <span class="vector-menu-heading-label">Print/export</span> </h3> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="electron-print_pdf" class="mw-list-item"><a href="/w/index.php?title=Special:DownloadAsPdf&amp;page=Module%3Aparameters&amp;action=show-download-screen"><span>Download as PDF</span></a></li><li id="t-print" class="mw-list-item"><a href="javascript:print();" rel="alternate" title="Printable version of this page [p]" accesskey="p"><span>Printable version</span></a></li> </ul> </div> </nav> <nav id="p-wikibase-otherprojects" class="mw-portlet mw-portlet-wikibase-otherprojects vector-menu-portal portal vector-menu" aria-labelledby="p-wikibase-otherprojects-label" > <h3 id="p-wikibase-otherprojects-label" class="vector-menu-heading " > <span class="vector-menu-heading-label">In other projects</span> </h3> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="t-wikibase" class="wb-otherproject-link wb-otherproject-wikibase-dataitem mw-list-item"><a href="https://www.wikidata.org/wiki/Special:EntityPage/Q33083227" title="Link to connected data repository item [g]" accesskey="g"><span>Wikidata item</span></a></li> </ul> </div> </nav> <nav id="p-lang" class="mw-portlet mw-portlet-lang vector-menu-portal portal vector-menu" aria-labelledby="p-lang-label" > <h3 id="p-lang-label" class="vector-menu-heading " > <span class="vector-menu-heading-label">In other languages</span> </h3> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li class="interlanguage-link interwiki-af mw-list-item"><a href="https://af.wiktionary.org/wiki/Module:parameters" title="Module:parameters – Afrikaans" lang="af" hreflang="af" data-title="Module:parameters" data-language-autonym="Afrikaans" data-language-local-name="Afrikaans" class="interlanguage-link-target"><span>Afrikaans</span></a></li><li class="interlanguage-link interwiki-ang mw-list-item"><a href="https://ang.wiktionary.org/wiki/Module:parameters" title="Module:parameters – Old English" lang="ang" hreflang="ang" data-title="Module:parameters" data-language-autonym="Ænglisc" data-language-local-name="Old English" class="interlanguage-link-target"><span>Ænglisc</span></a></li><li class="interlanguage-link interwiki-ar mw-list-item"><a href="https://ar.wiktionary.org/wiki/%D9%88%D8%AD%D8%AF%D8%A9:parameters" title="وحدة:parameters – Arabic" lang="ar" hreflang="ar" data-title="وحدة:parameters" data-language-autonym="العربية" data-language-local-name="Arabic" class="interlanguage-link-target"><span>العربية</span></a></li><li class="interlanguage-link interwiki-az mw-list-item"><a href="https://az.wiktionary.org/wiki/Modul:parameters" title="Modul:parameters – Azerbaijani" lang="az" hreflang="az" data-title="Modul:parameters" data-language-autonym="Azərbaycanca" data-language-local-name="Azerbaijani" class="interlanguage-link-target"><span>Azərbaycanca</span></a></li><li class="interlanguage-link interwiki-bn mw-list-item"><a href="https://bn.wiktionary.org/wiki/%E0%A6%AE%E0%A6%A1%E0%A6%BF%E0%A6%89%E0%A6%B2:parameters" title="মডিউল:parameters – Bangla" lang="bn" hreflang="bn" data-title="মডিউল:parameters" data-language-autonym="বাংলা" data-language-local-name="Bangla" class="interlanguage-link-target"><span>বাংলা</span></a></li><li class="interlanguage-link interwiki-bjn mw-list-item"><a href="https://bjn.wiktionary.org/wiki/Modul:parameters" title="Modul:parameters – Banjar" lang="bjn" hreflang="bjn" data-title="Modul:parameters" data-language-autonym="Banjar" data-language-local-name="Banjar" class="interlanguage-link-target"><span>Banjar</span></a></li><li class="interlanguage-link interwiki-zh-min-nan mw-list-item"><a href="https://zh-min-nan.wiktionary.org/wiki/%E6%A8%A1%E7%B5%84:parameters" title="模組:parameters – Minnan" lang="nan" hreflang="nan" data-title="模組:parameters" data-language-autonym="閩南語 / Bân-lâm-gú" data-language-local-name="Minnan" class="interlanguage-link-target"><span>閩南語 / Bân-lâm-gú</span></a></li><li class="interlanguage-link interwiki-dv mw-list-item"><a href="https://dv.wiktionary.org/wiki/%DE%89%DE%AE%DE%91%DE%A8%DE%87%DE%AA%DE%8D%DE%B0:parameters" title="މޮޑިއުލް:parameters – Divehi" lang="dv" hreflang="dv" data-title="މޮޑިއުލް:parameters" data-language-autonym="ދިވެހިބަސް" data-language-local-name="Divehi" class="interlanguage-link-target"><span>ދިވެހިބަސް</span></a></li><li class="interlanguage-link interwiki-et mw-list-item"><a href="https://et.wiktionary.org/wiki/Moodul:parameters" title="Moodul:parameters – Estonian" lang="et" hreflang="et" data-title="Moodul:parameters" data-language-autonym="Eesti" data-language-local-name="Estonian" class="interlanguage-link-target"><span>Eesti</span></a></li><li class="interlanguage-link interwiki-es mw-list-item"><a href="https://es.wiktionary.org/wiki/M%C3%B3dulo:par%C3%A1metros" title="Módulo:parámetros – Spanish" lang="es" hreflang="es" data-title="Módulo:parámetros" data-language-autonym="Español" data-language-local-name="Spanish" class="interlanguage-link-target"><span>Español</span></a></li><li class="interlanguage-link interwiki-fa mw-list-item"><a href="https://fa.wiktionary.org/wiki/%D9%BE%D9%88%D8%AF%D9%85%D8%A7%D9%86:parameters" title="پودمان:parameters – Persian" lang="fa" hreflang="fa" data-title="پودمان:parameters" data-language-autonym="فارسی" data-language-local-name="Persian" class="interlanguage-link-target"><span>فارسی</span></a></li><li class="interlanguage-link interwiki-fr mw-list-item"><a href="https://fr.wiktionary.org/wiki/Module:parameters" title="Module:parameters – French" lang="fr" hreflang="fr" data-title="Module:parameters" data-language-autonym="Français" data-language-local-name="French" class="interlanguage-link-target"><span>Français</span></a></li><li class="interlanguage-link interwiki-fy mw-list-item"><a href="https://fy.wiktionary.org/wiki/Module:parameters" title="Module:parameters – Western Frisian" lang="fy" hreflang="fy" data-title="Module:parameters" data-language-autonym="Frysk" data-language-local-name="Western Frisian" class="interlanguage-link-target"><span>Frysk</span></a></li><li class="interlanguage-link interwiki-gu mw-list-item"><a href="https://gu.wiktionary.org/wiki/%E0%AA%B5%E0%AA%BF%E0%AA%AD%E0%AA%BE%E0%AA%97:parameters" title="વિભાગ:parameters – Gujarati" lang="gu" hreflang="gu" data-title="વિભાગ:parameters" data-language-autonym="ગુજરાતી" data-language-local-name="Gujarati" class="interlanguage-link-target"><span>ગુજરાતી</span></a></li><li class="interlanguage-link interwiki-ko mw-list-item"><a href="https://ko.wiktionary.org/wiki/%EB%AA%A8%EB%93%88:parameters" title="모듈:parameters – Korean" lang="ko" hreflang="ko" data-title="모듈:parameters" data-language-autonym="한국어" data-language-local-name="Korean" class="interlanguage-link-target"><span>한국어</span></a></li><li class="interlanguage-link interwiki-hi mw-list-item"><a href="https://hi.wiktionary.org/wiki/%E0%A4%85%E0%A4%A8%E0%A5%81%E0%A4%96%E0%A4%82%E0%A4%A1:parameters" title="अनुखंड:parameters – Hindi" lang="hi" hreflang="hi" data-title="अनुखंड:parameters" data-language-autonym="हिन्दी" data-language-local-name="Hindi" class="interlanguage-link-target"><span>हिन्दी</span></a></li><li class="interlanguage-link interwiki-hsb mw-list-item"><a href="https://hsb.wiktionary.org/wiki/Modul:parameters" title="Modul:parameters – Upper Sorbian" lang="hsb" hreflang="hsb" data-title="Modul:parameters" data-language-autonym="Hornjoserbsce" data-language-local-name="Upper Sorbian" class="interlanguage-link-target"><span>Hornjoserbsce</span></a></li><li class="interlanguage-link interwiki-id mw-list-item"><a href="https://id.wiktionary.org/wiki/Modul:parameters" title="Modul:parameters – Indonesian" lang="id" hreflang="id" data-title="Modul:parameters" data-language-autonym="Bahasa Indonesia" data-language-local-name="Indonesian" class="interlanguage-link-target"><span>Bahasa Indonesia</span></a></li><li class="interlanguage-link interwiki-he mw-list-item"><a href="https://he.wiktionary.org/wiki/%D7%99%D7%97%D7%99%D7%93%D7%94:parameters" title="יחידה:parameters – Hebrew" lang="he" hreflang="he" data-title="יחידה:parameters" data-language-autonym="עברית" data-language-local-name="Hebrew" class="interlanguage-link-target"><span>עברית</span></a></li><li class="interlanguage-link interwiki-jv mw-list-item"><a href="https://jv.wiktionary.org/wiki/Modhul:parameters" title="Modhul:parameters – Javanese" lang="jv" hreflang="jv" data-title="Modhul:parameters" data-language-autonym="Jawa" data-language-local-name="Javanese" class="interlanguage-link-target"><span>Jawa</span></a></li><li class="interlanguage-link interwiki-ku mw-list-item"><a href="https://ku.wiktionary.org/wiki/Modul:parameters" title="Modul:parameters – Kurdish" lang="ku" hreflang="ku" data-title="Modul:parameters" data-language-autonym="Kurdî" data-language-local-name="Kurdish" class="interlanguage-link-target"><span>Kurdî</span></a></li><li class="interlanguage-link interwiki-ky mw-list-item"><a href="https://ky.wiktionary.org/wiki/%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:parameters" title="Модуль:parameters – Kyrgyz" lang="ky" hreflang="ky" data-title="Модуль:parameters" data-language-autonym="Кыргызча" data-language-local-name="Kyrgyz" class="interlanguage-link-target"><span>Кыргызча</span></a></li><li class="interlanguage-link interwiki-lo mw-list-item"><a href="https://lo.wiktionary.org/wiki/Module:parameters" title="Module:parameters – Lao" lang="lo" hreflang="lo" data-title="Module:parameters" data-language-autonym="ລາວ" data-language-local-name="Lao" class="interlanguage-link-target"><span>ລາວ</span></a></li><li class="interlanguage-link interwiki-la mw-list-item"><a href="https://la.wiktionary.org/wiki/Modulus:parameters" title="Modulus:parameters – Latin" lang="la" hreflang="la" data-title="Modulus:parameters" data-language-autonym="Latina" data-language-local-name="Latin" class="interlanguage-link-target"><span>Latina</span></a></li><li class="interlanguage-link interwiki-hu mw-list-item"><a href="https://hu.wiktionary.org/wiki/Modul:parameters" title="Modul:parameters – Hungarian" lang="hu" hreflang="hu" data-title="Modul:parameters" data-language-autonym="Magyar" data-language-local-name="Hungarian" class="interlanguage-link-target"><span>Magyar</span></a></li><li class="interlanguage-link interwiki-mg mw-list-item"><a href="https://mg.wiktionary.org/wiki/Module:parameters" title="Module:parameters – Malagasy" lang="mg" hreflang="mg" data-title="Module:parameters" data-language-autonym="Malagasy" data-language-local-name="Malagasy" class="interlanguage-link-target"><span>Malagasy</span></a></li><li class="interlanguage-link interwiki-ml mw-list-item"><a href="https://ml.wiktionary.org/wiki/%E0%B4%98%E0%B4%9F%E0%B4%95%E0%B4%82:parameters" title="ഘടകം:parameters – Malayalam" lang="ml" hreflang="ml" data-title="ഘടകം:parameters" data-language-autonym="മലയാളം" data-language-local-name="Malayalam" class="interlanguage-link-target"><span>മലയാളം</span></a></li><li class="interlanguage-link interwiki-mt mw-list-item"><a href="https://mt.wiktionary.org/wiki/Module:parameters" title="Module:parameters – Maltese" lang="mt" hreflang="mt" data-title="Module:parameters" data-language-autonym="Malti" data-language-local-name="Maltese" class="interlanguage-link-target"><span>Malti</span></a></li><li class="interlanguage-link interwiki-mnw mw-list-item"><a href="https://mnw.wiktionary.org/wiki/%E1%80%99%E1%80%9D%E1%80%BA%E1%80%82%E1%80%BB%E1%80%B0:parameters" title="မဝ်ဂျူ:parameters – Mon" lang="mnw" hreflang="mnw" data-title="မဝ်ဂျူ:parameters" data-language-autonym="ဘာသာမန်" data-language-local-name="Mon" class="interlanguage-link-target"><span>ဘာသာမန်</span></a></li><li class="interlanguage-link interwiki-ms mw-list-item"><a href="https://ms.wiktionary.org/wiki/Modul:parameters" title="Modul:parameters – Malay" lang="ms" hreflang="ms" data-title="Modul:parameters" data-language-autonym="Bahasa Melayu" data-language-local-name="Malay" class="interlanguage-link-target"><span>Bahasa Melayu</span></a></li><li class="interlanguage-link interwiki-mni mw-list-item"><a href="https://mni.wiktionary.org/wiki/Module:parameters" title="Module:parameters – Manipuri" lang="mni" hreflang="mni" data-title="Module:parameters" data-language-autonym="ꯃꯤꯇꯩ ꯂꯣꯟ" data-language-local-name="Manipuri" class="interlanguage-link-target"><span>ꯃꯤꯇꯩ ꯂꯣꯟ</span></a></li><li class="interlanguage-link interwiki-my mw-list-item"><a href="https://my.wiktionary.org/wiki/%E1%80%99%E1%80%B1%E1%80%AC%E1%80%BA%E1%80%82%E1%80%BB%E1%80%B0%E1%80%B8:parameters" title="မော်ဂျူး:parameters – Burmese" lang="my" hreflang="my" data-title="မော်ဂျူး:parameters" data-language-autonym="မြန်မာဘာသာ" data-language-local-name="Burmese" class="interlanguage-link-target"><span>မြန်မာဘာသာ</span></a></li><li class="interlanguage-link interwiki-ja mw-list-item"><a href="https://ja.wiktionary.org/wiki/%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:parameters" title="モジュール:parameters – Japanese" lang="ja" hreflang="ja" data-title="モジュール:parameters" data-language-autonym="日本語" data-language-local-name="Japanese" class="interlanguage-link-target"><span>日本語</span></a></li><li class="interlanguage-link interwiki-nn mw-list-item"><a href="https://nn.wiktionary.org/wiki/Modul:parameters" title="Modul:parameters – Norwegian Nynorsk" lang="nn" hreflang="nn" data-title="Modul:parameters" data-language-autonym="Norsk nynorsk" data-language-local-name="Norwegian Nynorsk" class="interlanguage-link-target"><span>Norsk nynorsk</span></a></li><li class="interlanguage-link interwiki-uz mw-list-item"><a href="https://uz.wiktionary.org/wiki/Modul:parameters" title="Modul:parameters – Uzbek" lang="uz" hreflang="uz" data-title="Modul:parameters" data-language-autonym="Oʻzbekcha / ўзбекча" data-language-local-name="Uzbek" class="interlanguage-link-target"><span>Oʻzbekcha / ўзбекча</span></a></li><li class="interlanguage-link interwiki-pa mw-list-item"><a href="https://pa.wiktionary.org/wiki/%E0%A8%AE%E0%A9%8C%E0%A8%A1%E0%A8%BF%E0%A8%8A%E0%A8%B2:parameters" title="ਮੌਡਿਊਲ:parameters – Punjabi" lang="pa" hreflang="pa" data-title="ਮੌਡਿਊਲ:parameters" data-language-autonym="ਪੰਜਾਬੀ" data-language-local-name="Punjabi" class="interlanguage-link-target"><span>ਪੰਜਾਬੀ</span></a></li><li class="interlanguage-link interwiki-blk mw-list-item"><a href="https://blk.wiktionary.org/wiki/%E1%80%99%E1%80%B1%E1%80%AC%E1%80%BA%E1%80%82%E1%80%BB%E1%80%B0%E1%80%B8:parameters" title="မော်ဂျူး:parameters – Pa&#039;O" lang="blk" hreflang="blk" data-title="မော်ဂျူး:parameters" data-language-autonym="ပအိုဝ်ႏဘာႏသာႏ" data-language-local-name="Pa&#039;O" class="interlanguage-link-target"><span>ပအိုဝ်ႏဘာႏသာႏ</span></a></li><li class="interlanguage-link interwiki-km mw-list-item"><a href="https://km.wiktionary.org/wiki/Module:parameters" title="Module:parameters – Khmer" lang="km" hreflang="km" data-title="Module:parameters" data-language-autonym="ភាសាខ្មែរ" data-language-local-name="Khmer" class="interlanguage-link-target"><span>ភាសាខ្មែរ</span></a></li><li class="interlanguage-link interwiki-tpi mw-list-item"><a href="https://tpi.wiktionary.org/wiki/Module:parameters" title="Module:parameters – Tok Pisin" lang="tpi" hreflang="tpi" data-title="Module:parameters" data-language-autonym="Tok Pisin" data-language-local-name="Tok Pisin" class="interlanguage-link-target"><span>Tok Pisin</span></a></li><li class="interlanguage-link interwiki-pt mw-list-item"><a href="https://pt.wiktionary.org/wiki/M%C3%B3dulo:parameters" title="Módulo:parameters – Portuguese" lang="pt" hreflang="pt" data-title="Módulo:parameters" data-language-autonym="Português" data-language-local-name="Portuguese" class="interlanguage-link-target"><span>Português</span></a></li><li class="interlanguage-link interwiki-skr mw-list-item"><a href="https://skr.wiktionary.org/wiki/%D9%85%D8%A7%DA%88%DB%8C%D9%88%D9%84:parameters" title="ماڈیول:parameters – Saraiki" lang="skr" hreflang="skr" data-title="ماڈیول:parameters" data-language-autonym="سرائیکی" data-language-local-name="Saraiki" class="interlanguage-link-target"><span>سرائیکی</span></a></li><li class="interlanguage-link interwiki-simple mw-list-item"><a href="https://simple.wiktionary.org/wiki/Module:parameters" title="Module:parameters – Simple English" lang="en-simple" hreflang="en-simple" data-title="Module:parameters" data-language-autonym="Simple English" data-language-local-name="Simple English" class="interlanguage-link-target"><span>Simple English</span></a></li><li class="interlanguage-link interwiki-sd mw-list-item"><a href="https://sd.wiktionary.org/wiki/%D9%85%D8%A7%DA%8A%D9%8A%D9%88%D9%84:parameters" title="ماڊيول:parameters – Sindhi" lang="sd" hreflang="sd" data-title="ماڊيول:parameters" data-language-autonym="سنڌي" data-language-local-name="Sindhi" class="interlanguage-link-target"><span>سنڌي</span></a></li><li class="interlanguage-link interwiki-sk mw-list-item"><a href="https://sk.wiktionary.org/wiki/Modul:Vlastnosti" title="Modul:Vlastnosti – Slovak" lang="sk" hreflang="sk" data-title="Modul:Vlastnosti" data-language-autonym="Slovenčina" data-language-local-name="Slovak" class="interlanguage-link-target"><span>Slovenčina</span></a></li><li class="interlanguage-link interwiki-ckb mw-list-item"><a href="https://ckb.wiktionary.org/wiki/%D9%85%DB%86%D8%AF%DB%8C%D9%88%D9%88%D9%84:parameters" title="مۆدیوول:parameters – Central Kurdish" lang="ckb" hreflang="ckb" data-title="مۆدیوول:parameters" data-language-autonym="کوردی" data-language-local-name="Central Kurdish" class="interlanguage-link-target"><span>کوردی</span></a></li><li class="interlanguage-link interwiki-sr mw-list-item"><a href="https://sr.wiktionary.org/wiki/%D0%9C%D0%BE%D0%B4%D1%83%D0%BB:parameters" title="Модул:parameters – Serbian" lang="sr" hreflang="sr" data-title="Модул:parameters" data-language-autonym="Српски / srpski" data-language-local-name="Serbian" class="interlanguage-link-target"><span>Српски / srpski</span></a></li><li class="interlanguage-link interwiki-ta mw-list-item"><a href="https://ta.wiktionary.org/wiki/Module:parameters" title="Module:parameters – Tamil" lang="ta" hreflang="ta" data-title="Module:parameters" data-language-autonym="தமிழ்" data-language-local-name="Tamil" class="interlanguage-link-target"><span>தமிழ்</span></a></li><li class="interlanguage-link interwiki-shn mw-list-item"><a href="https://shn.wiktionary.org/wiki/%E1%80%99%E1%80%B1%E1%82%83%E1%82%87%E1%81%B5%E1%80%BB%E1%80%B0%E1%80%B8:parameters" title="မေႃႇၵျူး:parameters – Shan" lang="shn" hreflang="shn" data-title="မေႃႇၵျူး:parameters" data-language-autonym="ၽႃႇသႃႇတႆး " data-language-local-name="Shan" class="interlanguage-link-target"><span>ၽႃႇသႃႇတႆး </span></a></li><li class="interlanguage-link interwiki-th mw-list-item"><a href="https://th.wiktionary.org/wiki/%E0%B8%A1%E0%B8%AD%E0%B8%94%E0%B8%B9%E0%B8%A5:parameters" title="มอดูล:parameters – Thai" lang="th" hreflang="th" data-title="มอดูล:parameters" data-language-autonym="ไทย" data-language-local-name="Thai" class="interlanguage-link-target"><span>ไทย</span></a></li><li class="interlanguage-link interwiki-tg mw-list-item"><a href="https://tg.wiktionary.org/wiki/%D0%9C%D0%BE%D0%B4%D1%83%D0%BB:parameters" title="Модул:parameters – Tajik" lang="tg" hreflang="tg" data-title="Модул:parameters" data-language-autonym="Тоҷикӣ" data-language-local-name="Tajik" class="interlanguage-link-target"><span>Тоҷикӣ</span></a></li><li class="interlanguage-link interwiki-tr mw-list-item"><a href="https://tr.wiktionary.org/wiki/Mod%C3%BCl:parameters" title="Modül:parameters – Turkish" lang="tr" hreflang="tr" data-title="Modül:parameters" data-language-autonym="Türkçe" data-language-local-name="Turkish" class="interlanguage-link-target"><span>Türkçe</span></a></li><li class="interlanguage-link interwiki-uk mw-list-item"><a href="https://uk.wiktionary.org/wiki/%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:parameters" title="Модуль:parameters – Ukrainian" lang="uk" hreflang="uk" data-title="Модуль:parameters" data-language-autonym="Українська" data-language-local-name="Ukrainian" class="interlanguage-link-target"><span>Українська</span></a></li><li class="interlanguage-link interwiki-ur mw-list-item"><a href="https://ur.wiktionary.org/wiki/%D9%85%D8%A7%DA%88%DB%8C%D9%88%D9%84:parameters" title="ماڈیول:parameters – Urdu" lang="ur" hreflang="ur" data-title="ماڈیول:parameters" data-language-autonym="اردو" data-language-local-name="Urdu" class="interlanguage-link-target"><span>اردو</span></a></li><li class="interlanguage-link interwiki-vi mw-list-item"><a href="https://vi.wiktionary.org/wiki/M%C3%B4_%C4%91un:parameters" title="Mô đun:parameters – Vietnamese" lang="vi" hreflang="vi" data-title="Mô đun:parameters" data-language-autonym="Tiếng Việt" data-language-local-name="Vietnamese" class="interlanguage-link-target"><span>Tiếng Việt</span></a></li><li class="interlanguage-link interwiki-yue mw-list-item"><a href="https://yue.wiktionary.org/wiki/%E6%A8%A1%E7%B5%84:parameters" title="模組:parameters – Cantonese" lang="yue" hreflang="yue" data-title="模組:parameters" data-language-autonym="粵語" data-language-local-name="Cantonese" class="interlanguage-link-target"><span>粵語</span></a></li><li class="interlanguage-link interwiki-zh mw-list-item"><a href="https://zh.wiktionary.org/wiki/Module:Parameters" title="Module:Parameters – Chinese" lang="zh" hreflang="zh" data-title="Module:Parameters" data-language-autonym="中文" data-language-local-name="Chinese" class="interlanguage-link-target"><span>中文</span></a></li> </ul> <div class="after-portlet after-portlet-lang"><span class="wb-langlinks-edit wb-langlinks-link"><a href="https://www.wikidata.org/wiki/Special:EntityPage/Q33083227#sitelinks-wiktionary" title="Edit interlanguage links" class="wbc-editpage">Edit links</a></span></div> </div> </nav> </div> </div> <footer id="footer" class="mw-footer" > <ul id="footer-info"> <li id="footer-info-lastmod"> This page was last edited on 14 November 2024, at 09:50.</li> <li id="footer-info-copyright">Definitions and other text are available under the <a rel="nofollow" class="external text" href="//creativecommons.org/licenses/by-sa/4.0/">Creative Commons Attribution-ShareAlike License</a>; additional terms may apply. By using this site, you agree to the <a class="external text" href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Terms_of_Use">Terms of Use</a> and <a class="external text" href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Privacy_policy">Privacy Policy.</a></li> </ul> <ul id="footer-places"> <li id="footer-places-privacy"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Privacy_policy">Privacy policy</a></li> <li id="footer-places-about"><a href="/wiki/Wiktionary:About">About Wiktionary</a></li> <li id="footer-places-disclaimers"><a href="/wiki/Wiktionary:General_disclaimer">Disclaimers</a></li> <li id="footer-places-wm-codeofconduct"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Universal_Code_of_Conduct">Code of Conduct</a></li> <li id="footer-places-developers"><a href="https://developer.wikimedia.org">Developers</a></li> <li id="footer-places-statslink"><a href="https://stats.wikimedia.org/#/en.wiktionary.org">Statistics</a></li> <li id="footer-places-cookiestatement"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Cookie_statement">Cookie statement</a></li> <li id="footer-places-mobileview"><a href="//en.m.wiktionary.org/w/index.php?title=Module:parameters&amp;mobileaction=toggle_view_mobile" class="noprint stopMobileRedirectToggle">Mobile view</a></li> </ul> <ul id="footer-icons" class="noprint"> <li id="footer-copyrightico"><a href="https://wikimediafoundation.org/" class="cdx-button cdx-button--fake-button cdx-button--size-large cdx-button--fake-button--enabled"><img src="/static/images/footer/wikimedia-button.svg" width="84" height="29" alt="Wikimedia Foundation" loading="lazy"></a></li> <li id="footer-poweredbyico"><a href="https://www.mediawiki.org/" class="cdx-button cdx-button--fake-button cdx-button--size-large cdx-button--fake-button--enabled"><img src="/w/resources/assets/poweredby_mediawiki.svg" alt="Powered by MediaWiki" width="88" height="31" loading="lazy"></a></li> </ul> </footer> <script>(RLQ=window.RLQ||[]).push(function(){mw.log.warn("This page is using the deprecated ResourceLoader module \"codex-search-styles\".\n[1.43] Use a CodexModule with codexComponents to set your specific components used: https://www.mediawiki.org/wiki/Codex#Using_a_limited_subset_of_components");mw.config.set({"wgHostname":"mw-web.codfw.main-f69cdc8f6-znn46","wgBackendResponseTime":395,"wgPageParseReport":{"limitreport":{"cputime":"0.148","walltime":"0.256","ppvisitednodes":{"value":943,"limit":1000000},"postexpandincludesize":{"value":99135,"limit":2097152},"templateargumentsize":{"value":222,"limit":2097152},"expansiondepth":{"value":9,"limit":100},"expensivefunctioncount":{"value":111,"limit":500},"unstrip-depth":{"value":0,"limit":20},"unstrip-size":{"value":19893,"limit":5000000},"entityaccesscount":{"value":0,"limit":400},"timingprofile":["100.00% 220.874 1 Template:documentation","100.00% 220.874 1 -total"," 69.50% 153.497 1 Template:module_documentation"," 11.88% 26.238 8 Template:tl"," 3.58% 7.916 31 Template:para"," 2.98% 6.591 1 Template:module_cat"]},"scribunto":{"limitreport-timeusage":{"value":"0.103","limit":"10.000"},"limitreport-memusage":{"value":2522069,"limit":104857600}},"cachereport":{"origin":"mw-web.codfw.main-f69cdc8f6-znn46","timestamp":"20241125003506","ttl":2592000,"transientcontent":false}}});});</script> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10