Extension:TemplateData

The TemplateData extension introduces a  tag and an API which together allow editors to specify how templates should be invoked. This information is available as a nicely-formatted table for end-users, and as a JSON API, which enables other systems (e.g. VisualEditor) to build interfaces for working with templates and their parameters. See for in-depth help.

Editing data
The TemplateData extension works through having a  tag defined in the wikitext of a template page (optionally it can be transcluded from a different page as well). This is designed to be compatible with the common layout many wikis have of transcluding template documentation from a separate page (but is not required). This content of the  tag must be valid JSON using the format described below; note that all descriptions must be in plain text (no wikitext is accepted inside the template data).

When a  block is included on a page, the TemplateData extension performs the following checks when the page is being saved:


 * 1) The contents must be valid JSON;
 * 2) Each item within the JSON structure must be of the expected type as specified below (e.g. object, array, or a primitive); and
 * 1) For those items which have a specified list of possible values (e.g.  ), the value in the JSON object must match one of those values.

If any of these checks fails, the server will not be permitted saving and an error message will be displayed above the edit page.

For autovalue items, 1>bugzilla:2700|bug 2700 prevents   from working in any template that is added inside a , including </> and <tvar|5></> tags. The TemplateData block will save correctly, but the resulting wikitext will not be parsed correctly when the template is used.

Note that  you cannot use <tvar|1> </> in lieu of <tvar|2></>.

Format
The below is a visualised version of the JSON data as defined on the template page enclosed by <tvar|tags> </> tags. The formal specification is available in the <tvar|repo>TemplateData</> repository. Refer to <tvar|spe>Specification.md</> for the latest version.

TemplateData object
The TemplateData object is a JSON root element enclosed in a <tvar|tpd> </> element on the template page.

InterfaceText (string or object)
A free-form plain-text string (i.e. no wikitext or HTML) in the content-language of the wiki, or an object containing those strings keyed by language code.

The default value for all InterfaceText fields is <tvar|1> </>.

String type
If it is a string, it must contain a non-localized string in the content language of the local wiki.

Object type
If it is an object, the object must have this mapping:

TemplateData object
The TemplateData object is a JSON root element enclosed in a <tvar|tpd> </> element on the template page.

InterfaceText (string or object)
A free-form plain-text string (i.e. no wikitext or HTML) in the content-language of the wiki, or an object containing those strings keyed by language code.

The default value for all InterfaceText fields is <tvar|1> </>.

String type
If it is a string, it must contain a non-localized string in the content language of the local wiki.

Object type
If it is an object, the object must have this mapping:

Example
An example <tvar|td>TemplateData</> structure as specified within wikitext on a template page.

Below is how the above example would be displayed on the template page: {   "description": "Label unsigned comments in a conversation.", "params": { "user": { "label": "User's name", "type": "wiki-user-name", "required": true, "description": "User name of person who forgot to sign their comment.", "aliases": ["1"] },       "date": { "label": "Date", "suggested": true, "description": { "en": "Timestamp of when the comment was posted, in YYYY-MM-DD format." },           "aliases": ["2"], "autovalue": "" },       "year": { "label": "Year", "type": "number" },       "month": { "label": "Month", "inherits": "year" },       "day": { "label": "Day", "inherits": "year" },       "comment": { "required": false }   },    "sets": [ {           "label": "Date", "params": ["year", "month", "day"] }   ],    "maps": { "ExampleConsumer": { "foo": "user", "bar": ["year", "month", "day"], "quux": [ "date", ["day", "month"], ["month", "year"], "year" ]       }    } }

API
See the generated help at <tvar|1>Special:ApiHelp/templatedata</>. A sample invocation (formatted for human readability) is:

This returns the template data for Template:Cite web. The <tvar|tpd> ... </> block for this template is on its transcluded template documentation page, en:Template:Cite web/doc.

Additions and changes to JSON as received from the API
The JSON structure provided in response to an API HTTP get request is significantly different than that which is defined in the <tvar|1> ... </> block. In response to the API request, extension <tvar|td>TemplateData</> makes the following changes to the JSON object:


 * Adds two 1>#Wrapper Objects from API</>|wrapping objects:
 * An overall 1>#Pages Object</>|Pages Object containing one or more po>#Page Object</>|Page Objects
 * An object with a numeric key: a po>#Page Object</>|Page Object


 * Additions/changes to the actual tpdo>#TemplateData Object</>|TemplateData Object
 * Add the <tvar|title> </> key with the name of the page from which the data was requested (e.g. "<tvar|xmp>Template:Cite web</>").
 * Add the <tvar|prmo> </> key and array using the order in which the parameters occur in the <tvar|prm> </> key within the tmpdo>#TemplateData Object</>|TemplateData Object on the template page.
 * Add the <tvar|set> </> key
 * Change all <tvar|tpltxt>TemplateText</> occurrences that are just strings to objects with a single key for the current wiki's Wikipedia language code
 * Remove all <tvar|inh> </> keys.
 * Add all properties from parameter from which an inheritance is defined which are not superseded by explicitly defined keys in the inheritor's prmo>#Param object</>|Parameter Object.
 * Add default values for all keys in each prmo>#Param object</>|Parameter Object which have not been explicitly defined or inherited.

Example of JSON object provided by API
The response to an API request for the TemplateData structure in the 1>#example</>|Example section (above) can be seen:


 * In HTML format: <tvar|1>https://www.mediawiki.org/w/api.php?action=templatedata&titles=Extension:TemplateData&format=jsonfm</>


 * As delivered by the API: <tvar|2>https://www.mediawiki.org/w/api.php?action=templatedata&titles=Extension:TemplateData</>