Help:Advanced templates
From The Scuba Wiki
MediaWiki Handbook: Contents, Readers, Editors, Moderators, System admins +/- |
This page covers advanced template techniques, in particular the use of variable template names and parameter names in templates. Readers should be thoroughly familiar with the standard template techniques found in Help:Template. Some techniques described below may be outdated or of limited use; for example, ParserFunctions may be more convenient than some of the branching techniques discussed.
In general, these techniques rely on the recursive (inside-out) processing of templates. When a template is processed, it translates template code into string values. These are often sent directly to the web browser for display, but they can be treated as code themselves. By enclosing the text strings in double-curly-brackets ( {{}} ), for instance, they can be reprocessed as template names or variable names, producing different results as the string values are changed.
Notes:
- This document refers to features currently only available in the Mediawiki software starting with version 1.6 and later.
- The term "variable" has two uses in this document:
- It is sometimes used as a synonym for magic words, which are system-based variables that can be accessed in the same manner as templates (thus {{NAMESPACE}} will return the name of the current namespace, depending on the page).
- Otherwise, it is used to indicate that something may vary with context (thus, "Variable template names" means that the name of the template being called can change according to parameters or other variables).
- Using "subst:" with manual recursion gives a stepwise replacement, useful for analyzing and explaining the working of templates calling other templates. For instance, compare {{{{tctc}} }} (discussed below) with {{{{subst:tctc}} }} on a sandbox page. though both produce the same visible result, the first will will remain as the full code {{{{tctc}} }}, while the second will replace the inner template {{tctc}} with its value, leaving the code {{tc }}. See, e.g., Template talk:Lop.
Contents |
Variable templates
In some cases, it may be useful for a template to call different templates depending on a variable or a passed parameter. This allows a type of branching that can be simpler than Parser functions, though they are generally less versatile.
Examples:
- Using a variable to choose a template -
{{ {{NAMESPACE}} }}
- The Magic Word {{NAMESPACE}} returns the current namespace, like so: {{NAMESPACE}} = Help. The outer brackets then process this result as a template in its own right - in this case Template:Help - which produces This phrase is the contents of Template:Help.
- Using a template to choose a template -
{{{{tctc}} }}
- the template {{Tctc}} contains the text "tc". This text is processed by the outer brackets as Template:tc which contains the word "in".
The extra spaces in the above examples are needed: without them, the code is not processed as a template or a magic word, but just as a plain text string like so: {{{{NAMESPACE}}}}.
- Using a variable to choose a template, and passing it a parameter -
{{{{{2}}}x|{{{1}}}}}
- The second parameter passed becomes part of the template name to which the first parameter is passed. In this case
{{2x|{{{1}}}}}
would produce{{{1}}}{{{1}}}
,{{3x|{{{1}}}}}
would produce{{{1}}}{{{1}}}{{{1}}}
, and etc. Template:Histogram uses this technique repeatedly in {{histogram|X|4|7|3|2|9}} to produce the following 5 line histogram:
Template:4x
Template:7x
Template:3x
Template:2x
Template:9x
Since there is no convenient way to test substring values (even using parser functions), these techniques work best if the variable template has only a limited number of possible values. For example, the variable {{CURRENTDAYNAME}}
has only seven possible values, so all cases can be handled with seven templates (or fewer, if some are redirects), and the variable {{NAMESPACE}}
currently has 18 possible values. On the other hand, {{CURRENTTIME}}
has 1440 possible values, which would require the creation of 1440 template pages or redirects, which would be impractical. Even with parser functions, all 1440 values would have to be listed (see template:hour ( talk edit history links ) and template:minute ( talk edit history links )). In cases like that, it would be better to construct the template with multiple parameters that each only take a few values, rather than trying to account for all possibilities in a single parameter.
If a template depends on PAGENAME, then the many possible values of PAGENAME may not be a problem. Only the pagenames of the pages that call the template apply, and these can be limited to a small, enumerable set.
Templates passed as parameters
Templates can be passed as parameters to other templates. This can mean either that the template is evaluated and the result is passed as a parameter or that the template name is passed and evaluated as part of the other template.
- Passing a template result - {{3x|{{tc}}}}
- Template:3x contains {{{1}}}{{{1}}}{{{1}}}. {{3x|{{tc}}}} first evaluates {{tc}} (which yields the word in), and passes that to template {{3x}}, to give Template:3x
- Passing a template result recursively - {{3x|{{5x|{{tc}}}}}}
- Just as above except {{tc}} (in) is first passed to {{5x}} and the result of that is passed to {{3x}}, to give Template:3x.
- Passing a template name -
{{tt|t|V}}
- Template:tt -
{{{{{1}}}|a{{{2}}}b{{{2}}}c{{{2}}}d}}
- takes the value V (passed as the second parameter) and produces aVbVcVd. This value is then passed to template:t (which was passed by name as the first parameter), producing "start-aVbVcVd-end"
Variable parameters
A parameter name in a template can be a variable. This is useful if you want the behavior of a template to change based on the information that is provided to it.
Choosing parameters contextually - {{t pnd|parameter name}}
Template:t p contains{{{capital}}} is the capital of {{{country}}}
, with two parameters - "capital" and "country". Template:t pnd containing "{{t p|{{{1}}}=abc}}
" can be used to select which parameter is used in a particular case. Thus:
This... Produces this {{t pnd|capital}} abc is the capital of {{{country}}}. {{t pnd|country}} {{{capital}}} is the capital of abc. {{t pnd|something else}} {{{capital}}} is the capital of {{{country}}}. This applies to integer parameters as well, since integer parameters can be specified using the "#=" notation. Passing the integer value N to {{t pnd}} as its parameter will make it look for the Nth unnamed parameter.
- Parameter name from another parameter in the same template -
{{tvv|parameter=foo|foo=bar}}
- Using Template:tvv, which contains {{{{{{parameter}}}}}}, the code
bar
will first set the parameter named "foo" to the value "bar", and then set the parameter named "parameter" to the value of foo, yielding bar. The order in which the parameters appear in the code does not matter, but the technique cannot be applied multiple times—e.g., {{foo}}—and it may fail if substituted rather than transcoded.
The following branching methods are generally obsolete; Parser Functions give easier forms of control. However, they may be useful in particular situations, and point out some unintuitive features of template behavior.
- Blank parameter branch - {{t pdc|abc}}, {{t pdc}}, {{t pdc}}
- Template {{tts}} contains Template:tts containing "{{{{{}}}}}", which takes a parameter with a blank name (i.e., {{tts}}) and processes it as a template, but ignores any other parameter. Template:T pdc, which contains Template:T pdc containing "{{tts|=do if parameter is not empty|{{{1}}}=do if parameter is empty}}", will produce Template:Do if parameter is not empty in the first and last cases, {{t pdc}} will give Template:Do if parameter is empty because a blank parameter name is explicitly passed.
- If-defined branches -
{{{test{{{test|}}}|{{{then}}}}}}
- If no value is passed for the parameter test, then {{{test{{{test|}}}|{{{then}}}}}} resolves to {{{test|{{{then}}}}}} and returns a blank entry (since test is defined as blank). If the parameter "test" is assigned the value "boo", however, {{{test{{{test|}}}|{{{then}}}}}} resolves to {{{testboo|{{{then}}}}}}, and so long as no parameter "testboo" exists, then this will return the value of the parameter "then".
Variable variables (Magic Words)
Variables (Magic Words) names can also be generated as variables.
- Magic word generated as a variable -
{{t curr}}
- Template:t curr containing "
{{CURRENT{{{1|DAY}}} }}<noinclude>[[Category:Test pages]]</noinclude>
" gives the text 27 without parameters, since it defaults to {{CURRENTDAY}}, but {{t curr|DAYNAME}} gives Wednesday while {{t curr|MONTHNAME}} gives November. Any magic word that begins with "CURRENT" can be accessed this way.
- Namespace generated as a variable -
{{ns:{{{1}}}}}
- In Template:Namespace, which contains namespace number:{{{1}}} - name: {{ns:{{{1}}}}}, the last use of the parameter evaluates to a number #, and the entire phrase ns:# is evaluated as a template. Thus, {{namespace|4}} gives namespace number:4 - name: The Scuba Wiki, where Meta is the name of Namespace 4.
External examples
- VARIABLE MAGIC WORDS
- Template:H:h and Template:H:f (see edit pages, MediaWiki help policy, and list)
- Template:Nsn - namespace number (see also below)
- Template:Gns - generic namespace name, useful for linking to the corresponding page on another project
- de:MediaWiki:Newarticletext and de:MediaWiki:Noarticletext (see edit pages and list)
- w:en:Template:H:f - for project-specific content on all help pages of the English Wikipedia (requires a blank template on all pages that do not have this content)
- VARIABLE PARAMETER NAMES
- en:template:Reg polyhedra db ( talk edit history links ), which contains a 2D array in the form {{{{{1}}}|{{{2}}}|1-1=a11|..|m-n=amn}}. The first parameter is the name of a template that provides a particular selection and presentation of a selected row of the array, e.g., en:template:Reg polyhedron stat table ( talk edit history links ), the second parameter (which is the first parameter of the latter template) specifies the row. The latter template references element j of the row concerned by a tag of the form {{{{{{1}}}-j}}}
See also
- ParserFunctions (Syntax for #if:, #expr: etc.)
- Meta_talk:Templates_for_translating_language_names
- Help:Array
Links to other help pages
- Help contents
- Meta | Wikinews | Wikipedia | Wikiquote | Wiktionary | commons: | mw: | b: | s: | mw:Manual | google
- Versions of this help page (for other languages see below)
- Meta | Wikinews | Wikipedia | Wikiquote | Wiktionary
- What links here on Meta or from Meta | Wikipedia | MediaWiki
- Reading
- Go | Search | Stop words | URL | Namespace | Page name | Section
- Backlinks | Link | Piped link | Interwiki link | Redirect | Category | Image page
- Logging in and preferences
- Logging in | Preferences | User style
- Editing
- Advanced editing | Editing FAQ | Edit toolbar | Export | Import | Shortcuts
- Tracking changes
- Recent changes (enhanced) | Related changes | Watching pages | Diff
- Page history | Edit summary | User contributions | Minor edit | Patrolled edit
- Style & formatting
- Wikitext examples | Reference card | HTML in wikitext | List | Table | Sorting | Colors
- Special input and output
- Inputbox | Special characters | Displaying a formula | Images (uploads) | EasyTimeline
- Advanced functioning
- Template | Advanced templates | Parser function | ParserFunctions | Parameter default
- Variable | Magic word | System message | Substitution | Array | Calculation
- Page management
- Starting a new page | Renaming (moving) a page | Protecting pages | Deleting a page
- Special pages
- Talk page | Testing | Sandbox | CentralNotice