Movatterモバイル変換


[0]ホーム

URL:


Jump to content
WikipediaThe Free Encyclopedia
Search

Module:Wd

Permanently protected module
From Wikipedia, the free encyclopedia
Module documentation[view] [edit] [history] [purge]
Ready for useThis module is rated asready for general use. It has reached a mature form and is thought to be relatively bug-free and ready for use wherever appropriate. It is ready to mention on help pages and other Wikipedia resources as an option for new users to learn. To reduce server load and bad output, it should be improved bysandbox testing rather than repeated trial-and-error editing.
ProtectedThis module issubject to page protection. It is ahighly visible module in use by a very large number of pages, or issubstituted very frequently. Because vandalism or mistakes would affect many pages, and even trivial editing might cause substantial load on the servers, it isprotected from editing.
WarningThis Lua module is used onapproximately 1,750,000 pages, or roughly 3% of all pages.
To avoid major disruption and server load, any changes should be tested in the module's/sandbox or/testcases subpages, or in your ownmodule sandbox. The tested changes can be added to this page in a single edit. Consider discussing changes on thetalk page before implementing them.
You might want to use one of the user-friendly wrapper templates{{Wikidata}} and{{WikidataOI}} instead of invoking this module directly.
For the module that should be used in|datax= parameters of infobox templates instead of this module, seeModule:WikidataIB.
For a version of this template with an opt-in toggle, see{{WikidataOI}}.


This module is intended to fetch data fromWikidata with or without a link to the connected Wikipedia article and with many other features.

Usage

The general structure of a call to this module is as follows. Note that the basic structure consists of positional commands, flags and arguments, which all have a fixed position.

{{#invoke:wd|command1|flag1a|flag1b|flag1c|command2|flag2a|flag2b|flag2c|flag0a|flag0b|flag0c|arg1|arg2|arg3}}

Use differentcommands to get different kinds of values from Wikidata. At least one command must be given and multiple commands can be combined into one call as shown above (in any order, more than two is also possible), but this only applies to commands from theclaim class; calls containing a command from thegeneral class cannot contain any other command. Each command can be followed by any number ofcommand flags, which are optional and can be used to tweak the output generated by that command.

The commands and their flags may be followed by any number ofconfiguration flags, which are also optional and affect the selection of data and the module's behaviour in general. The call is closed with thepositional arguments, which may be required depending on the given command(s). Somenamed arguments (i.e. name-value pairs) also exist, as well as a set of named flags foradvanced usage that can be used to change the way the fetched values are merged together into the output.

This module was designed to provide the basic needs for fetching data from Wikidata, but a lot can be achieved through different combinations of calls. For convenience, such combinations could be wrapped into new templates that serve a specific need. See also the section oncommon use cases below for some examples of useful "building blocks". Likewise, the functionality of this module can be extended by creating wrapper templates that use themain command provided by this module (just like{{WikidataOI}} does).

Common use cases

Below follows a list of common use cases. In the future, shortcut commands may be implemented that are equivalent to these calls for convenience.

CallUse case
{{#invoke:wd|label|raw}}Returns the Q-identifier of the Wikidata item connected to the current page (e.g. "Q55").
{{#if:{{#invoke:wd|label|raw}}|...}}Performs a check to determine if the current page has a Wikidata item.

Note that this statement relies on a returned value that is either empty or non-empty and that theraw flag is important to include. Without this flag, an existing item's regular label would be returned which could be empty, giving an undesired result. If the flag is given on the other hand, then a non-empty Q-identifier is always returned if an item exists and an empty value if an item does not exist.

Commands

The commands (command1,command2, ...) determine what kind of values are returned. One call can only contain commands from a single class.

Claim class

The claim class commands can be combined, meaning that multiple commands of different types from this class can be given at one time (see above for usage).

Combine multiple commands into one call to this module, instead of making multiple calls to this module with one command each, to be sure that all the returned pieces of information belong to each other (see also the examples below).

TypeCommandReturnsBasic usageDescription
Ipropertyfirst match[a]{{#invoke:wd|property|P1}}Returns the requested property – or list of properties – from the current item-entity or from a given entity.

This command can be given only once in one call.

propertiesall matches{{#invoke:wd|properties|P1}}
IIqualifierfirst match[b]{{#invoke:wd|qualifier|P1|P2}}Returns the requested qualifier – or list of qualifiers – from the given property of the current item-entity or of a given entity.

Unlike the other claim class commands, this command can be given multiple times to retrieve different qualifiers in one call.

qualifiersall matches{{#invoke:wd|qualifiers|P1|P2}}
IIIreferencefirst match[b]{{#invoke:wd|reference|P1}}Returns a reference – or list of references – from the given property of the current item-entity or of a given entity.[c]

This command can be given only once in one call.

referencesall matches{{#invoke:wd|references|P1}}
  1. ^Returns only a single value instead of multiple (if multiple claims or statements match). The returned value isthe first match found from the best-ranked claims.
  2. ^abReturns only a single value instead of multiple for each matching claim. To get at most one value in total in case theproperty command is not also used, additionally use thesingle configuration flag.
  3. ^Seethe section on references for details.

General class

The general class commands cannot be combined.

TypeCommandReturnsBasic usageDescription
Ilabel{{#invoke:wd|label}}Returns the label of the current item-entity or of a given entity if present.
IItitle{{#invoke:wd|title}}Returns the title of the page connected to the current item-entity or to a given item-entity if such page exists.
IIIdescription{{#invoke:wd|description}}Returns the description of the current item-entity or of a given entity if present.
IValiasfirst match[a]{{#invoke:wd|alias}}Returns an alias – or list of aliases – of the current item-entity or of a given entity if present.
aliasesall matches{{#invoke:wd|aliases}}
Vbadgefirst match[a]{{#invoke:wd|badge}}Returns a badge – or list of badges – for the page connected to the current item-entity or to a given item-entity if such page exists.
badgesall matches{{#invoke:wd|badges}}
  1. ^abReturns only a single value instead of multiple (if multiple values are present).

Flags

The following (optional) flags are available which can be used to alter this module's behaviour. They must be given after the (first)command and before thepositional arguments. For convenience, empty flags (i.e.||) are allowed and will simply be ignored.

Command flags

These flags (flag1*,flag2*, ...) apply to the command that precedes them directly.

FlagDescription
rawReturns the raw value if applicable.

If this flag is used with item or property datatypes, then this will return the Q-identifier or P-identifier instead of the regular label.

For quantity datatypes, this flag will strip off any units of measurement, unless theunit flag is also given in which case the raw unit of measurement (its Q-identifier) will be returned.

If this flag is used with time datatypes, then the returned date will be in the format ofyyyy-mm-dd (e.g.1731-02-11), oryyyy-mm, oryyyy depending on the date's precision. Dates in the Julian calendar stored with a precision of days through millenniums will have/Julian attached to the output (e.g.1731-02-11/Julian, which may be split off using the{{#titleparts}} parser function).

If it is used with globe coordinate datatypes, then it replaces the various symbols with forward slashes in the returned value (e.g.52/5/3/N/4/19/3/E, which may be split into parts using the{{#titleparts}} parser function).

linkedCreates a link to the Wikipedia article that is connected to the property or qualifier if it exists. Also links units of measurement that may be appended to values.

If this parameter is omitted, then the plain property or qualifier value will be returned.

short[EXPENSIVE] Returns theshort name(P1813) of any entity returned if they have one attached. If that is not the case, then the default behaviour of returning the entity's label will occur.
multilanguageReturns monolingual text values in any available language, not just the current wiki's language.
unitReturns only the unit of measurement for quantity datatypes.

Configuration flags

These flags (flag0*) are general configuration flags and can be given anywhere after the firstcommand (but before thepositional arguments).

FlagDescriptionCommand class
Combination of:preferredSets a rank constraint for the selected claim(s).

The first three set the ranks for which claim(s) will be selected. They can optionally be followed by a+ or a-, e.g.normal+ orpreferred-, where the first selects claims with a 'normal' rankor higher and the second selects claims with a 'preferred' rankor lower. To get claims of all ranks, usepreferred- ordeprecated+.

If thebest flag is given additionally, then only the claims that have the highest rank amongst the selected claims will be returned.

The default isnormal+|best (so by default claims with a 'deprecated' rank are never returned).

Output is always sorted from highest rank to lowest (regardless of any of these flags being set).

claim
normal
deprecated
best
Combination of:futureSets a time constraint for the selected claim(s). Uses the claims' qualifiers ofstart time(P580) andend time(P582) to determine if the claim is valid for the selected time period(s).

The default isfuture|current|former (so by default claims that are valid for any time period are returned), except whendate= is given (see below) in which case the default iscurrent.

claim
current
former
mdyReturns date values in month-day-year order instead of day-month-year order.claim
singleReturns only a single claim instead of multiple (if multiple claims match). Has no effect if theproperty/properties command is given, in which case this flag would be redundant.claim
sourcedOnly returns claims that have at least one non-empty reference. (References having onlyignored parameters are considered empty.)claim
One of:editAdds a clickable icon after the output that may be used by readers to edit the returned claim on Wikidata.

Ifedit@end is used, then the icon will be placed at the end of the line for neat alignment in infoboxes.

claim,general
edit@end

Arguments

The arguments determine the sources from which all the returned values are fetched.

Positional arguments

The following table shows the available positional arguments (arg*) in their fixed order. For each command, the applicable set of arguments is marked. If multiple commands are given, then the applicable set is the union of the individual sets. For instance, if the commandsproperties andqualifiers have been given, then at least both the argumentsproperty_id andqualifier_id should be given as well.

More than onequalifier/qualifiers command can be given. The order in which these commands with their flags are given matches the order in which the respectivequalifier_id arguments are given.

(required)(optional)(optional)(required)(optional)(required)(required)
{{#invoke:wdcommandsflagsentity_idproperty_idraw_valuequalifier_idqualifier_id}}
label,title,
description,
alias/aliases,
badge/badges
property/properties
reference/references
qualifier/qualifiers
qualifier/qualifiers(optional 2nd, 3rd, etc.)

Below follows a description of all positional arguments.

ArgumentDescription
entity_id

(optional)

[EXPENSIVE]Q-identifier of the item-entity to be accessed (e.g.Q55),P-identifier (or an availablealias) of the property-entity to be accessed preceded by theProperty: prefix (e.g.Property:P38), orpage title of the Wikipedia article whose connected item-entity is to be accessed preceded by:, a prefixed colon (e.g.:Netherlands).

In case of thegeneral class commands, theProperty: prefix may be omitted for P-identifiers (e.g.P38).

If this parameter is omitted, then the item-entity connected to the current page will be used (except wheneid= orpage= is given,see below). If this parameter is given, but empty (i.e.||), then due to its position it will be interpreted as anempty flag and thus be ignored, giving the same result as if it were omitted. See also thenamed argumentseid= andpage= below that can be used to give an entity-ID or page title too, but without the item-entity connected to the current page being used as a default.

property_idP-identifier (or an availablealias) of the property within the entity to be accessed, without theProperty: prefix (e.g.P35).
raw_value

(optional)

Either theQ-identifier equal to the property value (e.g.Q29574) or aliteral value (i.e. string or quantity etc.,no entity label) equal to the raw property value of the particular claim to be accessed.

Dates as literal values must be formattedyyyy-mm-dd (e.g.1731-02-11) for dates with a precision of days,yyyy-mm (e.g.1731-02) for dates with a precision of months, andyyyy (e.g.1731) for dates of lesser precision. Dates BCE require a minus sign in front of the year (e.g.-2950-01-31). Dates stored in the Julian calendar must have/Julian attached to the end (e.g.1731-02-11/Julian). Decades like the 2010s must be given as2010 (but the 2010s BCE as-2019), centuries like the 20th century as1901 (but the 20th century BCE as-2000), and millenniums like the 3rd millennium as2001 (but the 3rd millennium BCE as-3000).

Globe coordinates as literal values must be formatted with forward slashes (i.e./) between the parts and no symbols (e.g.52/5/3/N/4/19/3/E)without any spaces or leading zeros.

The special type 'no value' can be given by entering the empty string (i.e.||) and the special type 'unknown value' can be given by entering a single underscore (i.e.|_|). To get a literal underscore, escape it by placing a backslash\ directly in front of it (i.e.\_); the same holds for a literal backslash (i.e.\\).

To get a literal vertical bar|, use{{!}} or|.

If this parameter is omitted, then all claims (matching any other constraints) within the property will be accessed.

qualifier_idP-identifier (or an availablealias) of the qualifier within the entity to be accessed, without theProperty: prefix (e.g.P580).


Named arguments

Below follows a description of all named arguments, which are name-value pairs (i.e.|name=value). These are all optional and can be given anywhere after the first command.

ArgumentDescriptionCommand class
eid=[EXPENSIVE] This argument can be used to give theQ-identifier (e.g.|eid=Q55) orP-identifier (or an availablealias) of the entity to be accessed. It offers the same functionality as thepositional argumententity_id, with one difference: if the argument is given but its value is left empty (i.e.|eid=), then no entity is accessed at all instead of the item-entity connected to the current page. This is useful in some cases where a variable entity-ID is expected, but where the item-entity connected to the current page should not be accessed as the default.

Also, theProperty: prefix may be omitted for P-identifiers (e.g.|eid=P38) for all commands.

This argument only has effect if the positional argumententity_id is omitted.

claim,general
page=[EXPENSIVE] This argument can be used to give thepage title (e.g.|page=Netherlands) of the Wikipedia article whose connected item-entity is to be accessed. It behaves similar to the named argumenteid= and can be used instead of thepositional argumententity_id (note that no prefixed colon,:, is required). If the argument is given but its value is left empty (i.e.|page=), then no entity is accessed at all instead of the item-entity connected to the current page.

This argument only has effect if the positional argumententity_id and the named argumenteid= are omitted.

claim, general
date=This argument can be used to set a particular date (e.g.|date=1731-02-11) relative to which claim matching using thefuture,current andformer flags is done, instead of relative to today. It overrides the default of these flags tocurrent so that by default only claims that were valid at the given date are returned (based on the claims' qualifiers ofstart time(P580) andend time(P582)).

The date value must be formattedyyyy-mm-dd (e.g.1731-02-11),yyyy-mm (e.g.1731-02) oryyyy (e.g.1731).

claim
<qualifier>=The<qualifier> is a placeholder for a set of arguments that determine which claims should be accessed based on qualifier value, analogous to the pair ofpositional argumentsproperty_id andraw_value (that determine access based on property value).

As such,<qualifier> is any qualifier'sP-identifier (or an availablealias) without theProperty: prefix (e.g.P518). Its value is either theQ-identifier equal to one of the qualifier values (e.g.Q27561) or aliteral value (i.e. string or quantity etc.,no entity label) equal to one of the raw qualifier values of the particular claim to be accessed. The value format is the same as for the positional argumentraw_value. The special type 'no value' given by the empty string also matches the total absence within the claim of the particular qualifier.

Example:|P518=Q27561

Multiple arguments of this type can be given to match multiple qualifier values simultaneously for each claim.

claim

Property aliases

Property aliases are other names for P-identifiers that can be used instead. The following property aliases (which arecase-sensitive) are currently available:

Aliastranslates
to
P-identifier
coordP625
imageP18
authorP50
authorNameStringP2093
publisherP123
importedFromP143
wikimediaImportURLP4656
statedInP248
pagesP304
languageP407
hasPartP527
publicationDateP577
startTimeP580
endTimeP582
chapterP792
retrievedP813
referenceURLP854
sectionVerseOrParagraphP958
archiveURLP1065
titleP1476
formatterURLP1630
quoteP1683
shortNameP1813
definingFormulaP2534
archiveDateP2960
inferredFromP3452
typeOfReferenceP3865
columnP3903
subjectNamedAsP1810
wikidataPropertyP1687

References

When either thereference or thereferences command is used and a reference is encountered (in Wikidata), the module checks if the reference contains animported from Wikimedia project(P143),inferred from(P3452) orWikimedia import URL(P4656) property. In the case one of these properties is present, the whole reference is ignored (i.e. it is treated as if it wasn't present).

Else, the module attempts to display the reference using the{{Cite web}} template. The reference has to have areference URL(P854) property. The below table shows the mapping of Wikidata properties to parameters of Cite web.

Wikidata propertyParameter of Cite webNotes
archive date(P2960)archive-date
archive URL(P1065)archive-url
author(P50)author/authorNN can be 1, 2, 3...
author name string(P2093)
language of work or name(P407)languageIgnored when the same as the local language.
page(s)(P304)pages
publication date(P577)date
publisher(P123)publisher
quotation(P1683)quote
reference URL(P854)url
retrieved(P813)access-date
section, verse, paragraph, or clause(P958)at
stated in(P248)website
subject named as(P1810)titleUsed only whentitle(P1476) is not present, but a URL (either fromreference URL(P854) or from an external identifier, as described below) is, otherwise ignored.
title(P1476)title

The following properties are ignored:image(P18),type of reference(P3865).

If there is noreference URL(P854) property present in the reference, but a property of the "External identifier"data type is present both in the reference and in theWikidata property(P1687) of the item instated in(P248), a URL is generated from its content and is used in the same manner as a URL given inreference URL(P854).

If there is noreference URL(P854) property, or the reference has unknown properties, the module attempts to display it using the{{Cite Q}} template. Thestated in(P248) property is mandatory. The below table shows the mapping of properties to Cite Q parameters.

Wikidata propertyParameter of Cite QNotes
stated in(P248)1Value supplied to the parameter israw, i.e. it is just the plain QID.
chapter(P792)chapter
column(P3903)at
page(s)(P304)pages
publication date(P577)date
retrieved(P813)access-date
section, verse, paragraph, or clause(P958)section
title(P1476)title
any property of the "External identifier" data typeidThe label ("name") of the property is prepended before its content.

The properties listedunder the first table (in this section) are also ignored when using Cite Q.

A reference could be displayed using Cite Q only if the reference has astated in(P248) property and has only properties listed in the table above. If neither Cite web nor Cite Q could be used to display a reference, the following an error message with an explanation is returned.

To fix this error, check if the reference has the required properties and doesn't have any unknown properties, as described above. TheWikidata help page on references can also be helpful when sourcing statements.

Advanced usage

The layout of the output from (a combination of) commands that have both a singular and a plural form (e.g.property/properties) can be customized by using a number of named flags, which are name-value pairs (i.e.|flag=value), that can be given anywhere after the first command. The table below shows the available named flags.

To insert a space at the beginning or end of avalue, use an underscore_. To get a literal underscore, escape it by placing a backslash\ directly in front of it (i.e.\_); the same holds for a literal backslash (i.e.\\). To get a literal vertical bar|, use{{!}} or&#124;.

Named flagDefault valueDefault conditionDescription
format=%p[%s][%r]if theproperty/properties commandwas given and thequalifier/qualifiers commandwas not givenThe format of a single claim. The available parameters are as follows.
ParameterDescription
%pThe claim's property value applied by theproperty/properties command.
%q1,%q2,%q3, ...The claim's qualifier value or list of qualifier values applied by the correspondingqualifier/qualifiers command.
%qThe collection of the qualifier values applied by eachqualifier/qualifiers command (i.e.%q1 +%q2 +%q3 + ...). If only onequalifier/qualifiers command was given, then this parameter is equivalent to%q1.
%rThe claim's reference value or list of reference values applied by thereference/references command.
%aThe entity's alias applied by thealias/aliases command.
%bThe entity's page badge applied by thebadge/badges command.
%sThe movable separator placeholder. This is a special parameter that is not applied by a command, but instead is filled automatically between each pair of claims, aliases or badges (if a list of claims, aliases or badges is returned). This is particularly handy in case a claim's reference is returned as well, since it allows the reference to be placed after the punctuation mark as prescribed byWikipedia's manual of style. The default value is a comma (,) and can be overridden with thesep%s flag (see below).

Optional parameters can be given by encapsulating them between square brackets:[...]. All content between the square brackets is only displayed if a value for each optional parameter that has been defined between the same brackets has been found. Optional content can also be nested.

To use two opening square brackets that directly follow each other (i.e.[[), use{{!((}}.

At least one parameter must be given that is not optional, while the%s parameter must always be defined as optional.

To get a literal[,],% or\, escape the character by placing a backslash\ directly in front of it (e.g.\%). See also the description directly above this table for more.

%q[%s][%r]if theproperty/properties commandwas not given and thequalifier/qualifiers commandwas given
%rifonly thereference/references command was given
%p[<spanstyle="font-size:85\%">(%q)</span>][%s][%r]
if theproperty/properties commandwas given and thequalifier/qualifiers commandwas given
%a[%s]if thealias/aliases command was given
%b[%s]if thebadge/badges command was given
sep=_defaultThe fixed separator between each pair of claims, aliases or badges.
ifonly thereference/references command was givenwithout theraw flag
sep%s=,defaultThe movable separator between each pair of claims, aliases or badges. This will be the value of the%s parameter applied to all claims, aliases or badges, except for the last in the list (which can be set with thepunc flag).
;if theproperty/properties commandwas not given and thequalifier/qualifiers commandwas given
sep%q1=,sep%q2=,sep%q3=, ...,_defaultThe separator between each pair of qualifiers of a single claim. These are the value separators for the%q1,%q2,%q3, ... parameters.

If only onequalifier/qualifiers command was given, then thesep%q1 flag is equivalent tosep%q.

sep%q=,_ifexactly onequalifier/qualifiers command was givenThe separator between each set of qualifiers of a single claim. This is the value separator for the%q parameter.

If only onequalifier/qualifiers command was given, then this flag is equivalent tosep%q1.

;_ifmore than onequalifier/qualifiers command was given
sep%r=defaultThe separator between each pair of references of a single claim. This is the value separator for the%r parameter.
_if theraw flagwas given for thereference/references command
punc=defaultA punctuation mark placed at the end of the output. This will be placed on the%s parameter applied to the last claim (or alias or badge) in the list.

This allows the last claim's references to be placed after the punctuation mark when the output is used as part of a sentence.

Examples

Parameters and output typesExampleDescription
Q55 = "Netherlands",P395 = "licence plate code"

[string]

{{#invoke:wd|property|Q55|P395}}

NL
Gets a literal string value.
P395 = "licence plate code"

[string]

{{#invoke:wd|property|P395}}

NL
If the module is transcluded on theNetherlands page (which is linked to Q55), then theQ55 can be omitted.
Q55 = "Netherlands", P395 = "NL"

[string]

{{#invoke:wd|property|eid=Q55|P395}}

NL
An entity-ID can also be given using theeid= argument.
P395 = "NL"

[string]

{{#invoke:wd|property|page=Netherlands|P395}}

NL
A page title can be given instead of an entity-ID using thepage= argument.
Q55 = "Netherlands", P395 = "licence plate code"

[string]

{{#invoke:wd|property|edit|Q55|P395}}

NL Edit this on Wikidata
Adds a clickable icon that may be used to edit the returned value on Wikidata.
Q55 = "Netherlands", P395 = "licence plate code"

[string]

{{#invoke:wd|property|edit@end|Q55|P395}}

NLEdit this on Wikidata
Places the edit icon at the end of the line.
Q55 = "Netherlands",P1082 = "population"

[quantity]

{{#invoke:wd|property|normal+|Q55|P1082}}

17,590,672
Gets a single property value from claims with a 'normal' rank or higher.
Q55 = "Netherlands", P1082 = "population"

[quantity]

{{#invoke:wd|properties|normal+|Q55|P1082}}

17,590,672, 10,026,773, 16,779,575, 16,829,289, 17,000,000, 17,081,507, 17,181,084, 17,282,163, 17,407,585
Gets multiple property values from claims with a 'normal' rank or higher.
Q55 = "Netherlands", P1082 = "population",P585 = "point in time"

[quantity], [time]

{{#invoke:wd|properties|qualifier|normal+|Q55|P1082|P585}}

17,590,672(1 January 2022), 10,026,773(1950), 16,779,575(2013), 16,829,289(26 August 2014), 17,000,000(21 March 2016), 17,081,507(1 January 2017), 17,181,084(1 January 2018), 17,282,163(1 January 2019), 17,407,585(1 January 2020)
Gets a single qualifier value for each claim, additional to the property value.
Q55 = "Netherlands", P1082 = "population", P585 = "point in time"

[quantity], [time], [reference]

{{#invoke:wd|properties|qualifier|references|normal+|Q55|P1082|P585}}

17,590,672(1 January 2022),[1] 10,026,773(1950),[2] 16,779,575(2013),[2] 16,829,289(26 August 2014),[3] 17,000,000(21 March 2016),[4] 17,081,507(1 January 2017),[5] 17,181,084(1 January 2018),[1] 17,282,163(1 January 2019),[1] 17,407,585(1 January 2020)[1]
Gets references for each claim.
Q55 = "Netherlands", P1082 = "population"

[quantity], [reference]

A total of{{#invoke:wd|property|references|Q55|P1082}} people live in the Netherlands.

A total of 17,590,672[1] people live in the Netherlands.
Gets a property with its references.
Q55 = "Netherlands", P1082 = "population"

[quantity], [reference]

The Netherlands has a population of{{#invoke:wd|property|references|Q55|P1082|punc=.}}

The Netherlands has a population of 17,590,672.[1]
Adds a punctuation mark at the end of the output, in front of the references.
Q55 = "Netherlands", P1082 = "population", P585 = "point in time"

[quantity], [time], [reference]

<ul>{{#invoke:wd|properties|qualifier|references|normal+|Q55|P1082|P585|format=<li>%p[%r][<ul><li>%q</li></ul>]</li>}}</ul>

  • 17,590,672[1]
    • 1 January 2022
  • 10,026,773[2]
    • 1950
  • 16,779,575[2]
    • 2013
  • 16,829,289[3]
    • 26 August 2014
  • 17,000,000[4]
    • 21 March 2016
  • 17,081,507[5]
    • 1 January 2017
  • 17,181,084[1]
    • 1 January 2018
  • 17,282,163[1]
    • 1 January 2019
  • 17,407,585[1]
    • 1 January 2020
Returns the output in a custom format.
Q55 = "Netherlands", P1082 = "population", P585 = "point in time"

[time]

{{#invoke:wd|qualifier|normal+|Q55|P1082|P585}}

1 January 2022; 1950; 2013; 26 August 2014; 21 March 2016; 1 January 2017; 1 January 2018; 1 January 2019; 1 January 2020
Gets a single qualifier per claim, by default for multiple matching claims.
Q55 = "Netherlands", P1082 = "population", P585 = "point in time"

[time]

{{#invoke:wd|qualifier|normal+|single|Q55|P1082|P585}}

1 January 2022
To get a single qualifier for only a single claim, give thesingle flag too so that only a single claim will be accessed.
Q55 = "Netherlands", P1082 = "population", P585 = "point in time"

[time]

{{#invoke:wd|qualifier|Q55|P1082|10026773|P585}}

1950
Gets a qualifier from claims for which the (raw) property value matches a given literal value.
Q55 = "Netherlands", P1082 = "population", P585 = "point in time"

[time]

{{#invoke:wd|qualifier|mdy|Q55|P1082|10026773|P585}}

1950
Gets dates in month-day-year order.
Q55 = "Netherlands", P1082 = "population", P585 = "point in time"

[time]

{{#invoke:wd|qualifier|raw|Q55|P1082|10026773|P585}}

1950
Gets a raw date value.
Q55 = "Netherlands", P1082 = "population"

[reference]

{{#invoke:wd|references|Q55|P1082|10026773}}

[2]
Gets the references from a particular claim.
Q55 = "Netherlands", P1082 = "population"

[reference]

{{#invoke:wd|references|raw|Q55|P1082|10026773}}

"CBS StatLine - Bevolking; kerncijfers". Statistics Netherlands. Archived fromthe original on 27 August 2015. Retrieved22 August 2015.
Gets references from a particular claim in their raw form.
Q55 = "Netherlands",P1081 = "Human Development Index"

[quantity], [reference]

{{#invoke:wd|properties|references|normal+|Q55|P1081}}

0.931,[6] 0.787, 0.799, 0.829,[7][6] 0.861,[6] 0.877,[7] 0.891,[6] 0.909,[7] 0.919,[7] 0.920,[7] 0.920,[7] 0.922,[7] 0.834,[6] 0.835,[6] 0.839,[6] 0.864,[6] 0.866,[6] 0.865,[6] 0.867,[6] 0.870,[6] 0.876,[6] 0.879,[6] 0.878,[6] 0.883,[6] 0.886,[6] 0.897,[6] 0.904,[6] 0.906,[6] 0.906,[6] 0.910,[6] 0.921,[6] 0.921,[6] 0.923,[6] 0.924,[6] 0.926,[6] 0.928[6]
Gets properties from each claim with any references they have.
Q55 = "Netherlands", P1081 = "Human Development Index"

[quantity], [reference]

{{#invoke:wd|properties|references|normal+|sourced|Q55|P1081}}

0.931,[6] 0.829,[7][6] 0.861,[6] 0.877,[7] 0.891,[6] 0.909,[7] 0.919,[7] 0.920,[7] 0.920,[7] 0.922,[7] 0.834,[6] 0.835,[6] 0.839,[6] 0.864,[6] 0.866,[6] 0.865,[6] 0.867,[6] 0.870,[6] 0.876,[6] 0.879,[6] 0.878,[6] 0.883,[6] 0.886,[6] 0.897,[6] 0.904,[6] 0.906,[6] 0.906,[6] 0.910,[6] 0.921,[6] 0.921,[6] 0.923,[6] 0.924,[6] 0.926,[6] 0.928[6]
Only gets properties from claims that have at least one reference.
Q55 = "Netherlands",P2855 = "VAT rate",P518 = "applies to part"

[entity label]

{{#invoke:wd|qualifier|Q55|P2855|P518}}

food
Gets a single qualifier value (for each matching claim).
Q55 = "Netherlands", P2855 = "VAT rate", P518 = "applies to part"

[entity label]

{{#invoke:wd|qualifiers|Q55|P2855|P518}}

food, medication, assistive technology, magazine, book, art, antique, hairdresser, hotel, campsite, recreation, sport, water
Gets multiple qualifier values (for each matching claim).
Q55 = "Netherlands", P2855 = "VAT rate", P518 = "applies to part"

[quantity], [entity label]

{{#invoke:wd|properties|qualifiers|Q55|P2855|P518}}

21%, 6%(food, medication, assistive technology, magazine, book, art, antique, hairdresser, hotel, campsite, recreation, sport, water)
Gets multiple property values along with multiple qualifier values.
Q55 = "Netherlands", P2855 = "VAT rate", P518 = "applies to part"

[quantity], [entity label]

{{#invoke:wd|properties|qualifiers|Q55|P2855|P518|sep=_+_|sep%s=|sep%q=_/_}}

21% + 6%(food / medication / assistive technology / magazine / book / art / antique / hairdresser / hotel / campsite / recreation / sport / water)
Returns the output with custom separators.
Q55 = "Netherlands",P35 = "head of state",P580 = "start time",P582 = "end time"

[entity label], [time]

{{#invoke:wd|properties|qualifier|qualifier|normal+|Q55|P35|P580|P582}}

Willem-Alexander of the Netherlands(30 April 2013), Beatrix of the Netherlands(30 April 1980; 30 April 2013), Juliana of the Netherlands(4 September 1948; 30 April 1980), Wilhelmina of the Netherlands(23 November 1890; 4 September 1948), Willem III of the Netherlands(17 March 1849; 23 November 1890), Willem II of the Netherlands(7 October 1840; 17 March 1849), William I of the Netherlands(16 March 1815; 7 October 1840)
Gets two different qualifier values for each claim.
Q55 = "Netherlands", P35 = "head of state", P580 = "start time", P582 = "end time"

[entity label], [time]

{{#invoke:wd|properties|qualifier|qualifier|normal+|Q55|P35|P580|P582|sep%q=_–_}}

Willem-Alexander of the Netherlands(30 April 2013), Beatrix of the Netherlands(30 April 1980 – 30 April 2013), Juliana of the Netherlands(4 September 1948 – 30 April 1980), Wilhelmina of the Netherlands(23 November 1890 – 4 September 1948), Willem III of the Netherlands(17 March 1849 – 23 November 1890), Willem II of the Netherlands(7 October 1840 – 17 March 1849), William I of the Netherlands(16 March 1815 – 7 October 1840)
Returns the output with a custom separator.
Q55 = "Netherlands", P35 = "head of state", P580 = "start time", P582 = "end time"

[entity label], [time]

{{#invoke:wd|properties|qualifier|qualifier|normal+|Q55|P35|P580|P582|format=%p[ <span>(%q1[ – %q2])</span>][%s][%r]}}

Willem-Alexander of the Netherlands(30 April 2013), Beatrix of the Netherlands(30 April 1980 – 30 April 2013), Juliana of the Netherlands(4 September 1948 – 30 April 1980), Wilhelmina of the Netherlands(23 November 1890 – 4 September 1948), Willem III of the Netherlands(17 March 1849 – 23 November 1890), Willem II of the Netherlands(7 October 1840 – 17 March 1849), William I of the Netherlands(16 March 1815 – 7 October 1840)
Returns the output in a custom format instead of with a custom separator.
Q55 = "Netherlands", P35 = "head of state", P580 = "start time", P582 = "end time"

[entity label], [time]

{{#invoke:wd|properties|qualifier|qualifier|normal+|Q55|P35|P580|P582|format=%p[ <span>([<![]--%q2]since [%q2--[]>]%q1[ – %q2])</span>][%s][%r]}}

Willem-Alexander of the Netherlands(since 30 April 2013), Beatrix of the Netherlands(30 April 1980 – 30 April 2013), Juliana of the Netherlands(4 September 1948 – 30 April 1980), Wilhelmina of the Netherlands(23 November 1890 – 4 September 1948), Willem III of the Netherlands(17 March 1849 – 23 November 1890), Willem II of the Netherlands(7 October 1840 – 17 March 1849), William I of the Netherlands(16 March 1815 – 7 October 1840)
To add text only when a certain value is not present, like adding the wordsince if there is no end time, wrap it in between two optional blocks containing HTML comment tags and the relevant parameter (this also prevents the text from being added to the page source).
Q55 = "Netherlands", P35 = "head of state",Q29574 = "Beatrix of the Netherlands", P580 = "start time", P582 = "end time"

[entity label], [time]

{{#invoke:wd|properties|qualifier|raw|qualifier|normal+|Q55|P35|Q29574|P580|P582|format=%p[ <span>(%q1[ – %q2])</span>][%s][%r]}}

Beatrix of the Netherlands(1980-04-30 – 30 April 2013)
Gets a property with qualifiers from claims for which the property matches a given Q-identifier, with one of the qualifier values in its raw form.
Q55 = "Netherlands",P38 = "currency", P518 = "applies to part"

[entity label]

{{#invoke:wd|properties|qualifiers|normal+|current|Q55|P38|P518}}

euro(European Netherlands), United States dollar(Caribbean Netherlands)
Gets claims that are currently valid.
Q55 = "Netherlands", P38 = currency", P518 = "applies to part"

[entity label]

{{#invoke:wd|properties|linked|qualifiers|normal+|current|Q55|P38|P518}}

euro(European Netherlands),United States dollar(Caribbean Netherlands)
Gets claims with linked property values.
Q55 = "Netherlands", P38 = currency", P518 = "applies to part"

[entity label]

{{#invoke:wd|properties|qualifiers|linked|normal+|current|Q55|P38|P518}}

euro(European Netherlands), United States dollar(Caribbean Netherlands)
Gets claims with linked qualifier values.
Q55 = "Netherlands", P38 = currency", P518 = "applies to part"

[entity label]

{{#invoke:wd|properties|linked|short|qualifiers|linked|normal+|current|Q55|P38|P518}}

euro(European Netherlands),US dollar(Caribbean Netherlands)
Gets claims with linked property and qualifier values, with short property values wherever available.
Q55 = "Netherlands", P38 = currency",Q4917 = "United States dollar", P518 = "applies to part"

[entity label]

{{#invoke:wd|qualifiers|normal+|current|Q55|P38|Q4917|P518}}

Caribbean Netherlands
Gets qualifiers from claims for which the (raw) property value matches a given Q-identifier.
Q55 = "Netherlands", P38 = currency", P518 = "applies to part",Q27561 = "Caribbean Netherlands"

[entity label]

{{#invoke:wd|properties|normal+|current|Q55|P38|P518=Q27561}}

United States dollar
Gets properties from claims for which a (raw) qualifier value matches a given Q-identifier.
Q55 = "Netherlands", P38 = currency"

[entity label]

{{#invoke:wd|properties|normal+|former|Q55|P38}}

Dutch guilder
Gets claims that were valid in the past.
Q55 = "Netherlands", P38 = currency"

[entity label]

{{#invoke:wd|properties|raw|normal+|former|Q55|P38}}

Q788472
Gets raw property values.
Q55 = "Netherlands", P38 = currency"

[entity label]

{{#invoke:wd|properties|raw|linked|normal+|former|Q55|P38}}

Q788472
Gets raw property values that are linked to Wikidata.
Q55 = "Netherlands",P1549 = "demonym"

[monolingual text]

{{#invoke:wd|property|Q55|P1549}}

Dutch
Gets a monolingual text value in the current wiki's language.
Q55 = "Netherlands", P1549 = "demonym",P407 = "language of work or name",Q36846 = "Toki Pona"

[monolingual text]

{{#invoke:wd|property|multilanguage|Q55|P1549|P407=Q36846}}

Gets a monolingual text value in any available language.
Q55 = "Netherlands",P2884 = "mains voltage"

[quantity]

{{#invoke:wd|property|Q55|P2884}}

230 volt
Gets a quantity value with its associated unit of measurement.
Q55 = "Netherlands", P2884 = "mains voltage"

[quantity]

{{#invoke:wd|property|linked|Q55|P2884}}

230volt
Gets a quantity value with a linked unit of measurement.
Q55 = "Netherlands", P2884 = "mains voltage"

[quantity]

{{#invoke:wd|property|raw|Q55|P2884}}

230
Gets a raw quantity value.
Q55 = "Netherlands", P2884 = "mains voltage"

[quantity]

{{#invoke:wd|property|unit|Q55|P2884}}

volt
Gets only the unit of measurement.
Q55 = "Netherlands", P2884 = "mains voltage"

[quantity]

{{#invoke:wd|property|unit|raw|Q55|P2884}}

Q25250
Gets the raw unit of measurement.
Q55 = "Netherlands",P625 = "coordinate location"

[globe coordinate]

{{#invoke:wd|property|Q55|P625}}

52°19'N, 5°33'E
Gets a globe coordinate value.
Q55 = "Netherlands", P625 = "coordinate location"

[globe coordinate]

{{#invoke:wd|property|linked|Q55|P625}}

52°19'N, 5°33'E
Gets a linked globe coordinate value.
Q55 = "Netherlands", P625 = "coordinate location"

[globe coordinate]

{{#invoke:wd|property|raw|Q55|P625}}

52/19/N/5/33/E
Gets a raw globe coordinate value.
Q55 = "Netherlands", P625 = "coordinate location"

[globe coordinate]

{{#invoke:wd|property|Q55|coord}}

52°19'N, 5°33'E
A property alias can be used instead of the P-identifier.
Q55 = "Netherlands",P41 = "flag image"

[commons media]

{{#invoke:wd|property|linked|Q55|P41}}

Flag of the Netherlands.svg
Gets a media file name and links to it on Commons.
Q55 = "Netherlands", P41 = "flag image"

[commons media]

{{#invoke:wd|property|raw|Q55|P41|format=\[\[File:%p {{!}} thumb {{!}} left\]\]}}

A Commons media file can be included on the page as-is by omitting thelinked andraw flags, but by using theraw flag it can be freely formatted.
Q55 = "Netherlands", P41 = "flag image"

[commons media]

{{#invoke:wd|property|raw|date=1700-05-06|Q55|P41|format=\[\[File:%p {{!}} thumb {{!}} left\]\]}}

To get the value of a property that was valid at a given time, thedate= argument can be used.
Q55 = "Netherlands", P41 = "flag image"

[commons media]

{{#invoke:wd|property|raw|date=1700-05-06|former|Q55|P41|format=\[\[File:%p {{!}} thumb {{!}} left\]\]}}

The time constraint flags work relatively to the date value given for thedate= argument.
Q915684 = "Lorentz–Lorenz equation",P2534 = "defining formula"

[math]

{{#invoke:wd|property|Q915684|P2534}}

n21n2+2=4π3Nα{\displaystyle {\frac {n^{2}-1}{n^{2}+2}}={\frac {4\pi }{3}}N\alpha }
Gets a mathematical expression.
Q915684 = "Lorentz–Lorenz equation",P7235 = "in defining formula",P9758 = "symbol represents"

[entity label], [math]

<ul>{{#invoke:wd|properties|qualifier|linked|Q915684|P7235|P9758|format=<li>%q[ (%p)]</li>}}</ul>

Mathematical expressions can be combined with regular text as usual.
Q6256 = "country",P3896 = "geoshape"

[geographic shape]

{{#invoke:wd|property|linked|Q6256|P3896}}

Data:Naturalearthdata.com/admin-0-countries-no-antarctica.map
Gets a geographic shape data file name and links to it on Commons.
Q4917 = "United States dollar"

[entity label]

{{#invoke:wd|label|Q4917}}

United States dollar
Gets an item's label.
Q4917 = "United States dollar"

[entity label]

{{#invoke:wd|label|short|linked|Q4917}}

US dollar
Gets an item's short and linked label.
P38 = currency"

[entity label]

{{#invoke:wd|label|P38}}

currency
Gets a property's label.
P38 = currency"

[entity label]

{{#invoke:wd|label|linked|P38}}

currency
Gets a property's label that is linked to Wikidata.
Q776 = "Utrecht"

[entity label]

{{#invoke:wd|label|Q776}}

Utrecht
Gets an item's label.
Q776 = "Utrecht"

[entity label]

{{#invoke:wd|label|linked|Q776}}

Utrecht
Gets an item's linked label.


[entity label]

{{#invoke:wd|label}}

Utrecht
If the module is transcluded on theUtrecht (province) page (which is linked to Q776), then theQ776 can be omitted.


[entity label]

{{#invoke:wd|label|raw}}

Q776
If just thelabel command with theraw flag is given, then the Q-identifier of the item connected to the current page is returned.


[entity label]

{{#invoke:wd|label|raw|linked}}

Q776
If additionally thelinked flag is given, then the Q-identifier of the item connected to the current page is linked to Wikidata.
Q776 = "Utrecht"

[page title]

{{#invoke:wd|title|Q776}}

Utrecht (province)
Gets the title of the page on the current wiki that is linked to the given item.
Q776 = "Utrecht"

[page title]

{{#invoke:wd|title|linked|Q776}}

Utrecht (province)
Gets the linked title of the page on the current wiki that is linked to the given item.


[page title]

{{#invoke:wd|title}}

Utrecht (province)
If the module is transcluded on theUtrecht (province) page (which is linked to Q776), then theQ776 can be omitted.
Q55 = "Netherlands"

[entity description]

{{#invoke:wd|description|Q55}}

country in Northwestern Europe with territories in the Caribbean
Gets an item's description.


[entity description]

{{#invoke:wd|description}}

country in Northwestern Europe with territories in the Caribbean
If the module is transcluded on theNetherlands page (which is linked to Q55), then theQ55 can be omitted.
Q55 = "Netherlands"

[entity alias]

{{#invoke:wd|alias|Q55}}

Holland
Gets one of an item's aliases.
Q55 = "Netherlands"

[entity alias]

{{#invoke:wd|aliases|Q55}}

Holland, the Netherlands, NL, NED, Nederland, nl, 🇳🇱, Netherlands (after 1945)
Gets all of an item's aliases.
Q55 = "Netherlands"

[entity alias]

{{#invoke:wd|alias|linked|Q55}}

Holland
Gets a linked alias from an item.


[entity alias]

{{#invoke:wd|alias}}

Holland
If the module is transcluded on theNetherlands page (which is linked to Q55), then theQ55 can be omitted.
Q2 = "Earth"

[page badge]

{{#invoke:wd|badges|Q2}}

featured article badge
Gets the badges for the page on the current wiki that is linked to the given item.
Q2 = "Earth"

[page badge]

{{#invoke:wd|badges|raw|Q2}}

Q17437796
Gets the raw badges for the page on the current wiki that is linked to the given item.


[page badge]

{{#invoke:wd|badges}}

featured article badge
If the module is transcluded on theEarth page (which is linked to Q2), then theQ2 can be omitted.
Q28865 = "Python",P548 = "version type",P348 = "software version identifier",

[version], [reference]

{{#invoke:wd|property|reference|edit|Q28865|P548=Q2804309|P348}}

3.11.3[8] Edit this on Wikidata
GetPython's latest stable release version with its references. You may want to useP548=Q2122918 to get the latest preview release version.

Example references

  1. ^abcdefghij"Bevolking; kerncijfers, 1950-2022".
  2. ^abcde"CBS StatLine - Bevolking; kerncijfers". Statistics Netherlands. Archived fromthe original on 27 August 2015. Retrieved22 August 2015.
  3. ^ab"CBS StatLine - Bevolking; kerncijfers". Archived fromthe original on 3 September 2014. Retrieved26 August 2014.
  4. ^ab"Nederland telt 17 miljoen inwoners". 21 March 2016.
  5. ^ab"Bevolking; kerncijfers, 1950-2022". Retrieved18 March 2023.
  6. ^abcdefghijklmnopqrstuvwxyzaaabacadaeafagahaiajakalamanaoapaqarasatauavawaxayazbabbbcbd"Human Development Data (1990-2017)".Human Development Report. Archived fromthe original on 30 December 2018.
  7. ^abcdefghijklmn"Netherlands". Archived fromthe original on 2 February 2017.
  8. ^"It's time for another set of Python releases! Python 3.11.3, 3.10.11 and 3.12 alpha 7 are now available". 5 April 2023. Retrieved6 April 2023.

TemplateData

This template fetches data from the centralized knowledge base Wikidata. To edit the data, click on "Wikidata item" in the left sidebar.

Template parameters[Edit template data]

ParameterDescriptionTypeStatus
No parameters specified

See also

  • {{Wikidata}}, a user-friendly wrapper template for this module.
  • {{WikidataOI}}, a wrapper template for this module that adds an opt-in toggle.
  • {{Pageid to title}}, to get a page title using its local page id, rather than Wikidata
The abovedocumentation istranscluded fromModule:Wd/doc.(edit |history)
Editors can experiment in this module'ssandbox(edit |diff) andtestcases(edit) pages.
Subpages of this module.

-- Original module located at [[:en:Module:Wd]] and [[:en:Module:Wd/i18n]].require("strict")localp={}localmodule_arg=...locali18nlocali18nPathlocalfunctionloadI18n(aliasesP,frame)localtitleifframethen-- current module invoked by page/template, get its title from frametitle=frame:getTitle()else-- current module included by other module, get its title from ...title=module_argendifnoti18ntheni18nPath=title.."/i18n"i18n=require(i18nPath).init(aliasesP)endendp.claimCommands={property="property",properties="properties",qualifier="qualifier",qualifiers="qualifiers",reference="reference",references="references"}p.generalCommands={label="label",title="title",description="description",alias="alias",aliases="aliases",badge="badge",badges="badges"}p.flags={linked="linked",short="short",raw="raw",multilanguage="multilanguage",unit="unit",-------------preferred="preferred",normal="normal",deprecated="deprecated",best="best",future="future",current="current",former="former",edit="edit",editAtEnd="edit@end",mdy="mdy",single="single",sourced="sourced"}p.args={eid="eid",page="page",date="date",globalSiteId="globalSiteId"}localaliasesP={coord="P625",-----------------------image="P18",author="P50",authorNameString="P2093",publisher="P123",importedFrom="P143",wikimediaImportURL="P4656",statedIn="P248",pages="P304",language="P407",hasPart="P527",publicationDate="P577",startTime="P580",endTime="P582",chapter="P792",retrieved="P813",referenceURL="P854",sectionVerseOrParagraph="P958",archiveURL="P1065",title="P1476",formatterURL="P1630",quote="P1683",shortName="P1813",definingFormula="P2534",archiveDate="P2960",inferredFrom="P3452",typeOfReference="P3865",column="P3903",subjectNamedAs="P1810",wikidataProperty="P1687",publishedIn="P1433"}localaliasesQ={percentage="Q11229",prolepticJulianCalendar="Q1985786",citeWeb="Q5637226",citeQ="Q22321052"}localparameters={property="%p",qualifier="%q",reference="%r",alias="%a",badge="%b",separator="%s",general="%x"}localformats={property="%p[%s][%r]",qualifier="%q[%s][%r]",reference="%r",propertyWithQualifier="%p[ <span style=\"font-size:85\\%\">(%q)</span>][%s][%r]",alias="%a[%s]",badge="%b[%s]"}localhookNames={-- {level_1, level_2}[parameters.property]={"getProperty"},[parameters.reference]={"getReferences","getReference"},[parameters.qualifier]={"getAllQualifiers"},[parameters.qualifier.."\\d"]={"getQualifiers","getQualifier"},[parameters.alias]={"getAlias"},[parameters.badge]={"getBadge"}}-- default value objects, should NOT be mutated but instead copiedlocaldefaultSeparators={["sep"]={" "},["sep%s"]={","},["sep%q"]={"; "},["sep%q\\d"]={", "},["sep%r"]=nil,-- none["punc"]=nil-- none}localrankTable={["preferred"]=1,["normal"]=2,["deprecated"]=3}localfunctionreplaceAlias(id)ifaliasesP[id]thenid=aliasesP[id]endreturnidendlocalfunctionerrorText(code,...)localtext=i18n["errors"][code]ifargthentext=mw.ustring.format(text,unpack(arg))endreturntextendlocalfunctionthrowError(errorMessage,...)error(errorText(errorMessage,unpack(arg)))endlocalfunctionreplaceDecimalMark(num)returnmw.ustring.gsub(num,"[.]",i18n['numeric']['decimal-mark'],1)endlocalfunctionpadZeros(num,numDigits)localnumZeroslocalnegative=falseifnum<0thennegative=truenum=num*-1endnum=tostring(num)numZeros=numDigits-num:len()for_=1,numZerosdonum="0"..numendifnegativethennum="-"..numendreturnnumendlocalfunctionreplaceSpecialChar(chr)ifchr=='_'then-- replace underscores with spacesreturn' 'elsereturnchrendendlocalfunctionreplaceSpecialChars(str)localchrlocalesc=falselocalstrOut=""fori=1,#strdochr=str:sub(i,i)ifnotescthenifchr=='\\'thenesc=trueelsestrOut=strOut..replaceSpecialChar(chr)endelsestrOut=strOut..chresc=falseendendreturnstrOutendlocalfunctionbuildWikilink(target,label)ifnotlabelortarget==labelthenreturn"[["..target.."]]"elsereturn"[["..target.."|"..label.."]]"endend-- used to make frame.args mutable, to replace #frame.args (which is always 0)-- with the actual amount and to simply copy tableslocalfunctioncopyTable(tIn)ifnottInthenreturnnilendlocaltOut={}fori,vinpairs(tIn)dotOut[i]=vendreturntOutend-- used to merge output arrays together;-- note that it currently mutates the first input arraylocalfunctionmergeArrays(a1,a2)fori=1,#a2doa1[#a1+1]=a2[i]endreturna1endlocalfunctionsplit(str,del)localout={}locali,j=str:find(del)ifiandjthenout[1]=str:sub(1,i-1)out[2]=str:sub(j+1)elseout[1]=strendreturnoutendlocalfunctionparseWikidataURL(url)localidifurl:match('^http[s]?://')thenid=split(url,"Q")ifid[2]thenreturn"Q"..id[2]endendreturnnilendlocalfunctionparseDate(dateStr,precision)precision=precisionor"d"locali,j,index,ptrlocalparts={nil,nil,nil}ifdateStr==nilthenreturnparts[1],parts[2],parts[3]-- year, month, dayend-- 'T' for snak values, '/' for outputs with '/Julian' attachedi,j=dateStr:find("[T/]")ifithendateStr=dateStr:sub(1,i-1)endlocalfrom=1ifdateStr:sub(1,1)=="-"then-- this is a negative number, look further aheadfrom=2endindex=1ptr=1i,j=dateStr:find("-",from)ifithen-- yearparts[index]=tonumber(dateStr:sub(ptr,i-1),10)-- explicitly give base 10 to prevent errorifparts[index]==-0thenparts[index]=tonumber("0")-- for some reason, 'parts[index] = 0' may actually store '-0', so parse from string insteadendifprecision=="y"then-- we're donereturnparts[1],parts[2],parts[3]-- year, month, dayendindex=index+1ptr=i+1i,j=dateStr:find("-",ptr)ifithen-- monthparts[index]=tonumber(dateStr:sub(ptr,i-1),10)ifprecision=="m"then-- we're donereturnparts[1],parts[2],parts[3]-- year, month, dayendindex=index+1ptr=i+1endendifdateStr:sub(ptr)~=""then-- day if we have month, month if we have year, or yearparts[index]=tonumber(dateStr:sub(ptr),10)endreturnparts[1],parts[2],parts[3]-- year, month, dayendlocalfunctiondatePrecedesDate(aY,aM,aD,bY,bM,bD)ifaY==nilorbY==nilthenreturnnilendaM=aMor1aD=aDor1bM=bMor1bD=bDor1ifaY<bYthenreturntrueendifaY>bYthenreturnfalseendifaM<bMthenreturntrueendifaM>bMthenreturnfalseendifaD<bDthenreturntrueendreturnfalseendlocalfunctiongetHookName(param,index)ifhookNames[param]thenreturnhookNames[param][index]elseifparam:len()>2thenreturnhookNames[param:sub(1,2).."\\d"][index]elsereturnnilendendlocalfunctionalwaysTrue()returntrueend-- The following function parses a format string.---- The example below shows how a parsed string is structured in memory.-- Variables other than 'str' and 'child' are left out for clarity's sake.---- Example:-- "A %p B [%s[%q1]] C [%r] D"---- Structure:-- [--   {--     str = "A "--   },--   {--     str = "%p"--   },--   {--     str = " B ",--     child =--     [--       {--         str = "%s",--         child =--         [--           {--             str = "%q1"--           }--         ]--       }--     ]--   },--   {--     str = " C ",--     child =--     [--       {--         str = "%r"--       }--     ]--   },--   {--     str = " D"--   }-- ]--localfunctionparseFormat(str)localchr,esc,param,root,cur,prev,newlocalparams={}localfunctionnewObject(array)localobj={}-- new objectobj.str=""array[#array+1]=obj-- array{object}obj.parent=arrayreturnobjendlocalfunctionendParam()ifparam>0thenifcur.str~=""thencur.str="%"..cur.strcur.param=trueparams[cur.str]=truecur.parent.req[cur.str]=trueprev=curcur=newObject(cur.parent)endparam=0endendroot={}-- arrayroot.req={}cur=newObject(root)prev=nilesc=falseparam=0fori=1,#strdochr=str:sub(i,i)ifnotescthenifchr=='\\'thenendParam()esc=trueelseifchr=='%'thenendParam()ifcur.str~=""thencur=newObject(cur.parent)endparam=2elseifchr=='['thenendParam()ifprevandcur.str==""thentable.remove(cur.parent)cur=prevendcur.child={}-- new arraycur.child.req={}cur.child.parent=curcur=newObject(cur.child)elseifchr==']'thenendParam()ifcur.parent.parentthennew=newObject(cur.parent.parent.parent)ifcur.str==""thentable.remove(cur.parent)endcur=newendelseifparam>1thenparam=param-1elseifparam==1thenifnotchr:match('%d')thenendParam()endendcur.str=cur.str..replaceSpecialChar(chr)endelsecur.str=cur.str..chresc=falseendprev=nilendendParam()-- make sure that at least one required parameter has been definedifnotnext(root.req)thenthrowError("missing-required-parameter")end-- make sure that the separator parameter "%s" is not amongst the required parametersifroot.req[parameters.separator]thenthrowError("extra-required-parameter",parameters.separator)endreturnroot,paramsendlocalfunctionsortOnRank(claims)localrankPoslocalranks={{},{},{},{}}-- preferred, normal, deprecated, (default)localsorted={}for_,vinipairs(claims)dorankPos=rankTable[v.rank]or4ranks[rankPos][#ranks[rankPos]+1]=vendsorted=ranks[1]sorted=mergeArrays(sorted,ranks[2])sorted=mergeArrays(sorted,ranks[3])returnsortedendlocalfunctionisValueInTable(searchedItem,inputTable)for_,iteminpairs(inputTable)doifitem==searchedItemthenreturntrueendendreturnfalseendlocalConfig={}-- allows for recursive callsfunctionConfig:new()localcfg={}setmetatable(cfg,self)self.__index=selfcfg.separators={-- single value objects wrapped in arrays so that we can pass by reference["sep"]={copyTable(defaultSeparators["sep"])},["sep%s"]={copyTable(defaultSeparators["sep%s"])},["sep%q"]={copyTable(defaultSeparators["sep%q"])},["sep%r"]={copyTable(defaultSeparators["sep%r"])},["punc"]={copyTable(defaultSeparators["punc"])}}cfg.entity=nilcfg.entityID=nilcfg.propertyID=nilcfg.propertyValue=nilcfg.qualifierIDs={}cfg.qualifierIDsAndValues={}cfg.bestRank=truecfg.ranks={true,true,false}-- preferred = true, normal = true, deprecated = falsecfg.foundRank=#cfg.rankscfg.flagBest=falsecfg.flagRank=falsecfg.periods={true,true,true}-- future = true, current = true, former = truecfg.flagPeriod=falsecfg.atDate={parseDate(os.date('!%Y-%m-%d'))}-- today as {year, month, day}cfg.mdyDate=falsecfg.singleClaim=falsecfg.sourcedOnly=falsecfg.editable=falsecfg.editAtEnd=falsecfg.inSitelinks=falsecfg.langCode=mw.language.getContentLanguage().codecfg.langName=mw.language.fetchLanguageName(cfg.langCode,cfg.langCode)cfg.langObj=mw.language.new(cfg.langCode)cfg.siteID=mw.wikibase.getGlobalSiteId()cfg.states={}cfg.states.qualifiersCount=0cfg.curState=nilcfg.prefetchedRefs=nilreturncfgendlocalState={}functionState:new(cfg,type)localstt={}setmetatable(stt,self)self.__index=selfstt.conf=cfgstt.type=typestt.results={}stt.parsedFormat={}stt.separator={}stt.movSeparator={}stt.puncMark={}stt.linked=falsestt.rawValue=falsestt.shortName=falsestt.anyLanguage=falsestt.unitOnly=falsestt.singleValue=falsereturnsttend-- if id == nil then item connected to current page is usedfunctionConfig:getLabel(id,raw,link,short)locallabel=nillocalprefix,title="",nilifnotidthenid=mw.wikibase.getEntityIdForCurrentPage()ifnotidthenreturn""endendid=id:upper()-- just to be sureifrawthen-- check if given id actually existsifmw.wikibase.isValidEntityId(id)andmw.wikibase.entityExists(id)thenlabel=idendprefix,title="d:Special:EntityPage/",label-- may be nilelse-- try short name first if requestedifshortthenlabel=p._property{aliasesP.shortName,[p.args.eid]=id}-- get short nameiflabel==""thenlabel=nilendend-- get labelifnotlabelthenlabel=mw.wikibase.getLabel(id)endendifnotlabelthenlabel=""elseiflinkthen-- build a link if requestedifnottitlethenifid:sub(1,1)=="Q"thentitle=mw.wikibase.getSitelink(id)elseifid:sub(1,1)=="P"then-- properties have no sitelink, link to Wikidata insteadprefix,title="d:Special:EntityPage/",idendendlabel=mw.text.nowiki(label)-- escape raw label text so it cannot be wikitext markupiftitlethenlabel=buildWikilink(prefix..title,label)endendreturnlabelendfunctionConfig:getEditIcon()localvalue=""localprefix=""localfront="&nbsp;"localback=""ifself.entityID:sub(1,1)=="P"thenprefix="Property:"endifself.editAtEndthenfront='<span style="float:'ifself.langObj:isRTL()thenfront=front..'left'elsefront=front..'right'endfront=front..'">'back='</span>'endvalue="[[File:OOjs UI icon edit-ltr-progressive.svg|frameless|text-top|10px|alt="..i18n['info']['edit-on-wikidata'].."|link=https://www.wikidata.org/wiki/"..prefix..self.entityID.."?uselang="..self.langCodeifself.propertyIDthenvalue=value.."#"..self.propertyIDelseifself.inSitelinksthenvalue=value.."#sitelinks-wikipedia"endvalue=value.."|"..i18n['info']['edit-on-wikidata'].."]]"returnfront..value..backend-- used to create the final output string when it's all done, so that for references the-- function extensionTag("ref", ...) is only called when they really ended up in the final outputfunctionConfig:concatValues(valuesArray)localoutString=""localj,skipfori=1,#valuesArraydo-- check if this is a referenceifvaluesArray[i].refHashthenj=i-1skip=false-- skip this reference if it is part of a continuous row of references that already contains the exact same referencewhilevaluesArray[j]andvaluesArray[j].refHashdoifvaluesArray[i].refHash==valuesArray[j].refHashthenskip=truebreakendj=j-1endifnotskipthen-- add <ref> tag with the reference's hash as its name (to deduplicate references)outString=outString..mw.getCurrentFrame():extensionTag("ref",valuesArray[i][1],{name=valuesArray[i].refHash})endelseoutString=outString..valuesArray[i][1]endendreturnoutStringendfunctionConfig:convertUnit(unit,raw,link,short,unitOnly)localspace=" "locallabel=""localitemIDifunit==""orunit=="1"thenreturnnilendifunitOnlythenspace=""enditemID=parseWikidataURL(unit)ifitemIDthenifitemID==aliasesQ.percentagethenreturn"%"elselabel=self:getLabel(itemID,raw,link,short)iflabel~=""thenreturnspace..labelendendendreturn""endfunctionState:getValue(snak)returnself.conf:getValue(snak,self.rawValue,self.linked,self.shortName,self.anyLanguage,self.unitOnly,false,self.type:sub(1,2))endfunctionConfig:getValue(snak,raw,link,short,anyLang,unitOnly,noSpecial,type)ifsnak.snaktype=='value'thenlocaldatatype=snak.datavalue.typelocalsubtype=snak.datatypelocaldatavalue=snak.datavalue.valueifdatatype=='string'thenifsubtype=='url'andlinkthen-- create link explicitlyifrawthen-- will render as a linked number like [1]return"["..datavalue.."]"elsereturn"["..datavalue.." "..datavalue.."]"endelseifsubtype=='commonsMedia'theniflinkthenreturnbuildWikilink("c:File:"..datavalue,datavalue)elseifnotrawthenreturn"[[File:"..datavalue.."]]"elsereturndatavalueendelseifsubtype=='geo-shape'andlinkthenreturnbuildWikilink("c:"..datavalue,datavalue)elseifsubtype=='math'andnotrawthenlocalattribute=nilif(type==parameters.propertyor(type==parameters.qualifierandself.propertyID==aliasesP.hasPart))andsnak.property==aliasesP.definingFormulathenattribute={qid=self.entityID}endreturnmw.getCurrentFrame():extensionTag("math",datavalue,attribute)elseifsubtype=='external-id'andlinkthenlocalurl=p._property{aliasesP.formatterURL,[p.args.eid]=snak.property}-- get formatter URLifurl~=""thenurl=mw.ustring.gsub(url,"$1",datavalue)return"["..url.." "..datavalue.."]"elsereturndatavalueendelsereturndatavalueendelseifdatatype=='monolingualtext'thenifanyLangordatavalue['language']==self.langCodethenreturndatavalue['text']elsereturnnilendelseifdatatype=='quantity'thenlocalvalue=""localunitifnotunitOnlythen-- get value and strip + signs from frontvalue=mw.ustring.gsub(datavalue['amount'],"^%+(.+)$","%1")ifrawthenreturnvalueend-- replace decimal mark based on localevalue=replaceDecimalMark(value)-- add delimiters for readabilityvalue=i18n.addDelimiters(value)endunit=self:convertUnit(datavalue['unit'],raw,link,short,unitOnly)ifunitthenvalue=value..unitendreturnvalueelseifdatatype=='time'thenlocaly,m,d,p,yDiv,yRound,yFull,value,calendarID,dateStrlocalyFactor=1localsign=1localprefix=""localsuffix=""localmayAddCalendar=falselocalcalendar=""localprecision=datavalue['precision']ifprecision==11thenp="d"elseifprecision==10thenp="m"elsep="y"yFactor=10^(9-precision)endy,m,d=parseDate(datavalue['time'],p)ify<0thensign=-1y=y*signend-- if precision is tens/hundreds/thousands/millions/billions of yearsifprecision<=8thenyDiv=y/yFactor-- if precision is tens/hundreds/thousands of yearsifprecision>=6thenmayAddCalendar=trueifprecision<=7then-- round centuries/millenniums up (e.g. 20th century or 3rd millennium)yRound=math.ceil(yDiv)ifnotrawthenifprecision==6thensuffix=i18n['datetime']['suffixes']['millennium']elsesuffix=i18n['datetime']['suffixes']['century']endsuffix=i18n.getOrdinalSuffix(yRound)..suffixelse-- if not verbose, take the first year of the century/millennium-- (e.g. 1901 for 20th century or 2001 for 3rd millennium)yRound=(yRound-1)*yFactor+1endelse-- precision == 8-- round decades down (e.g. 2010s)yRound=math.floor(yDiv)*yFactorifnotrawthenprefix=i18n['datetime']['prefixes']['decade-period']suffix=i18n['datetime']['suffixes']['decade-period']endendifrawandsign<0then-- if BCE then compensate for "counting backwards"-- (e.g. -2019 for 2010s BCE, -2000 for 20th century BCE or -3000 for 3rd millennium BCE)yRound=yRound+yFactor-1endelselocalyReFactor,yReDiv,yReRound-- round to nearest for tens of thousands of years or moreyRound=math.floor(yDiv+0.5)ifyRound==0thenifprecision<=2andy~=0thenyReFactor=1e6yReDiv=y/yReFactoryReRound=math.floor(yReDiv+0.5)ifyReDiv==yReRoundthen-- change precision to millions of years only if we have a whole number of themprecision=3yFactor=yReFactoryRound=yReRoundendendifyRound==0then-- otherwise, take the unrounded (original) number of yearsprecision=5yFactor=1yRound=ymayAddCalendar=trueendendifprecision>=1andy~=0thenyFull=yRound*yFactoryReFactor=1e9yReDiv=yFull/yReFactoryReRound=math.floor(yReDiv+0.5)ifyReDiv==yReRoundthen-- change precision to billions of years if we're in that rangeprecision=0yFactor=yReFactoryRound=yReRoundelseyReFactor=1e6yReDiv=yFull/yReFactoryReRound=math.floor(yReDiv+0.5)ifyReDiv==yReRoundthen-- change precision to millions of years if we're in that rangeprecision=3yFactor=yReFactoryRound=yReRoundendendendifnotrawthenifprecision==3thensuffix=i18n['datetime']['suffixes']['million-years']elseifprecision==0thensuffix=i18n['datetime']['suffixes']['billion-years']elseyRound=yRound*yFactorifyRound==1thensuffix=i18n['datetime']['suffixes']['year']elsesuffix=i18n['datetime']['suffixes']['years']endendelseyRound=yRound*yFactorendendelseyRound=ymayAddCalendar=trueendifmayAddCalendarthencalendarID=parseWikidataURL(datavalue['calendarmodel'])ifcalendarIDandcalendarID==aliasesQ.prolepticJulianCalendarthenifnotrawtheniflinkthencalendar=" ("..buildWikilink(i18n['datetime']['julian-calendar'],i18n['datetime']['julian'])..")"elsecalendar=" ("..i18n['datetime']['julian']..")"endelsecalendar="/"..i18n['datetime']['julian']endendendifnotrawthenlocalce=nilifsign<0thence=i18n['datetime']['BCE']elseifprecision<=5thence=i18n['datetime']['CE']endifcetheniflinkthence=buildWikilink(i18n['datetime']['common-era'],ce)endsuffix=suffix.." "..ceendvalue=tostring(yRound)ifmthendateStr=self.langObj:formatDate("F","1-"..m.."-1")ifdthenifself.mdyDatethendateStr=dateStr.." "..d..","elsedateStr=d.." "..dateStrendendvalue=dateStr.." "..valueendvalue=prefix..value..suffix..calendarelsevalue=padZeros(yRound*sign,4)ifmthenvalue=value.."-"..padZeros(m,2)ifdthenvalue=value.."-"..padZeros(d,2)endendvalue=value..calendarendreturnvalueelseifdatatype=='globecoordinate'then-- logic from https://github.com/DataValues/Geo (v4.0.1)localprecision,unitsPerDegree,numDigits,strFormat,value,globelocallatitude,latConv,latValue,latLinklocallongitude,lonConv,lonValue,lonLinklocallatDirection,latDirectionN,latDirectionS,latDirectionENlocallonDirection,lonDirectionE,lonDirectionW,lonDirectionENlocaldegSymbol,minSymbol,secSymbol,separatorlocallatDegrees=nillocallatMinutes=nillocallatSeconds=nillocallonDegrees=nillocallonMinutes=nillocallonSeconds=nillocallatDegSym=""locallatMinSym=""locallatSecSym=""locallonDegSym=""locallonMinSym=""locallonSecSym=""locallatDirectionEN_N="N"locallatDirectionEN_S="S"locallonDirectionEN_E="E"locallonDirectionEN_W="W"ifnotrawthenlatDirectionN=i18n['coord']['latitude-north']latDirectionS=i18n['coord']['latitude-south']lonDirectionE=i18n['coord']['longitude-east']lonDirectionW=i18n['coord']['longitude-west']degSymbol=i18n['coord']['degrees']minSymbol=i18n['coord']['minutes']secSymbol=i18n['coord']['seconds']separator=i18n['coord']['separator']elselatDirectionN=latDirectionEN_NlatDirectionS=latDirectionEN_SlonDirectionE=lonDirectionEN_ElonDirectionW=lonDirectionEN_WdegSymbol="/"minSymbol="/"secSymbol="/"separator="/"endlatitude=datavalue['latitude']longitude=datavalue['longitude']iflatitude<0thenlatDirection=latDirectionSlatDirectionEN=latDirectionEN_Slatitude=math.abs(latitude)elselatDirection=latDirectionNlatDirectionEN=latDirectionEN_Nendiflongitude<0thenlonDirection=lonDirectionWlonDirectionEN=lonDirectionEN_Wlongitude=math.abs(longitude)elselonDirection=lonDirectionElonDirectionEN=lonDirectionEN_Eendprecision=datavalue['precision']ifnotprecisionorprecision<=0thenprecision=1/3600-- precision not set (correctly), set to arcsecondend-- remove insignificant detaillatitude=math.floor(latitude/precision+0.5)*precisionlongitude=math.floor(longitude/precision+0.5)*precisionifprecision>=1-(1/60)andprecision<1thenprecision=1elseifprecision>=(1/60)-(1/3600)andprecision<(1/60)thenprecision=1/60endifprecision>=1thenunitsPerDegree=1elseifprecision>=(1/60)thenunitsPerDegree=60elseunitsPerDegree=3600endnumDigits=math.ceil(-math.log10(unitsPerDegree*precision))ifnumDigits<=0thennumDigits=tonumber("0")-- for some reason, 'numDigits = 0' may actually store '-0', so parse from string insteadendstrFormat="%."..numDigits.."f"ifprecision>=1thenlatDegrees=strFormat:format(latitude)lonDegrees=strFormat:format(longitude)ifnotrawthenlatDegSym=replaceDecimalMark(latDegrees)..degSymbollonDegSym=replaceDecimalMark(lonDegrees)..degSymbolelselatDegSym=latDegrees..degSymbollonDegSym=lonDegrees..degSymbolendelselatConv=math.floor(latitude*unitsPerDegree*10^numDigits+0.5)/10^numDigitslonConv=math.floor(longitude*unitsPerDegree*10^numDigits+0.5)/10^numDigitsifprecision>=(1/60)thenlatMinutes=latConvlonMinutes=lonConvelselatSeconds=latConvlonSeconds=lonConvlatMinutes=math.floor(latSeconds/60)lonMinutes=math.floor(lonSeconds/60)latSeconds=strFormat:format(latSeconds-(latMinutes*60))lonSeconds=strFormat:format(lonSeconds-(lonMinutes*60))ifnotrawthenlatSecSym=replaceDecimalMark(latSeconds)..secSymbollonSecSym=replaceDecimalMark(lonSeconds)..secSymbolelselatSecSym=latSeconds..secSymbollonSecSym=lonSeconds..secSymbolendendlatDegrees=math.floor(latMinutes/60)lonDegrees=math.floor(lonMinutes/60)latDegSym=latDegrees..degSymbollonDegSym=lonDegrees..degSymbollatMinutes=latMinutes-(latDegrees*60)lonMinutes=lonMinutes-(lonDegrees*60)ifprecision>=(1/60)thenlatMinutes=strFormat:format(latMinutes)lonMinutes=strFormat:format(lonMinutes)ifnotrawthenlatMinSym=replaceDecimalMark(latMinutes)..minSymbollonMinSym=replaceDecimalMark(lonMinutes)..minSymbolelselatMinSym=latMinutes..minSymbollonMinSym=lonMinutes..minSymbolendelselatMinSym=latMinutes..minSymbollonMinSym=lonMinutes..minSymbolendendlatValue=latDegSym..latMinSym..latSecSym..latDirectionlonValue=lonDegSym..lonMinSym..lonSecSym..lonDirectionvalue=latValue..separator..lonValueiflinkthenglobe=parseWikidataURL(datavalue['globe'])ifglobethenglobe=mw.wikibase.getLabelByLang(globe,"en"):lower()elseglobe="earth"endlatLink=table.concat({latDegrees,latMinutes,latSeconds},"_")lonLink=table.concat({lonDegrees,lonMinutes,lonSeconds},"_")value="[https://geohack.toolforge.org/geohack.php?language="..self.langCode.."&params="..latLink.."_"..latDirectionEN.."_"..lonLink.."_"..lonDirectionEN.."_globe:"..globe.." "..value.."]"endreturnvalueelseifdatatype=='wikibase-entityid'thenlocallabellocalitemID=datavalue['numeric-id']ifsubtype=='wikibase-item'thenitemID="Q"..itemIDelseifsubtype=='wikibase-property'thenitemID="P"..itemIDelsereturn'<strong class="error">'..errorText('unknown-data-type',subtype)..'</strong>'endlabel=self:getLabel(itemID,raw,link,short)iflabel==""thenlabel=nilendreturnlabelelsereturn'<strong class="error">'..errorText('unknown-data-type',datatype)..'</strong>'endelseifsnak.snaktype=='somevalue'andnotnoSpecialthenifrawthenreturn" "-- single space represents 'somevalue'elsereturni18n['values']['unknown']endelseifsnak.snaktype=='novalue'andnotnoSpecialthenifrawthenreturn""-- empty string represents 'novalue'elsereturni18n['values']['none']endelsereturnnilendendfunctionConfig:getSingleRawQualifier(claim,qualifierID)localqualifiersifclaim.qualifiersthenqualifiers=claim.qualifiers[qualifierID]endifqualifiersandqualifiers[1]thenreturnself:getValue(qualifiers[1],true)-- raw = trueelsereturnnilendendfunctionConfig:snakEqualsValue(snak,value)localsnakValue=self:getValue(snak,true)-- raw = trueifsnakValueandsnak.snaktype=='value'andsnak.datavalue.type=='wikibase-entityid'thenvalue=value:upper()endreturnsnakValue==valueendfunctionConfig:setRank(rank)localrankPosifrank==p.flags.bestthenself.bestRank=trueself.flagBest=true-- mark that 'best' flag was givenreturnendifrank:sub(1,9)==p.flags.preferredthenrankPos=1elseifrank:sub(1,6)==p.flags.normalthenrankPos=2elseifrank:sub(1,10)==p.flags.deprecatedthenrankPos=3elsereturnend-- one of the rank flags was given, check if another one was given beforeifnotself.flagRankthenself.ranks={false,false,false}-- no other rank flag given before, so unset ranksself.bestRank=self.flagBest-- unsets bestRank only if 'best' flag was not given beforeself.flagRank=true-- mark that a rank flag was givenendifrank:sub(-1)=="+"thenfori=rankPos,1,-1doself.ranks[i]=trueendelseifrank:sub(-1)=="-"thenfori=rankPos,#self.ranksdoself.ranks[i]=trueendelseself.ranks[rankPos]=trueendendfunctionConfig:setPeriod(period)localperiodPosifperiod==p.flags.futurethenperiodPos=1elseifperiod==p.flags.currentthenperiodPos=2elseifperiod==p.flags.formerthenperiodPos=3elsereturnend-- one of the period flags was given, check if another one was given beforeifnotself.flagPeriodthenself.periods={false,false,false}-- no other period flag given before, so unset periodsself.flagPeriod=true-- mark that a period flag was givenendself.periods[periodPos]=trueendfunctionConfig:qualifierMatches(claim,id,value)localqualifiersifclaim.qualifiersthenqualifiers=claim.qualifiers[id]endifqualifiersthenfor_,vinpairs(qualifiers)doifself:snakEqualsValue(v,value)thenreturntrueendendelseifvalue==""then-- if the qualifier is not present then treat it the same as the special value 'novalue'returntrueendreturnfalseendfunctionConfig:rankMatches(rankPos)ifself.bestRankthenreturn(self.ranks[rankPos]andself.foundRank>=rankPos)elsereturnself.ranks[rankPos]endendfunctionConfig:timeMatches(claim)localstartTime=nillocalstartTimeY=nillocalstartTimeM=nillocalstartTimeD=nillocalendTime=nillocalendTimeY=nillocalendTimeM=nillocalendTimeD=nilifself.periods[1]andself.periods[2]andself.periods[3]then-- any timereturntrueendstartTime=self:getSingleRawQualifier(claim,aliasesP.startTime)ifstartTimeandstartTime~=""andstartTime~=" "thenstartTimeY,startTimeM,startTimeD=parseDate(startTime)endendTime=self:getSingleRawQualifier(claim,aliasesP.endTime)ifendTimeandendTime~=""andendTime~=" "thenendTimeY,endTimeM,endTimeD=parseDate(endTime)endifstartTimeY~=nilandendTimeY~=nilanddatePrecedesDate(endTimeY,endTimeM,endTimeD,startTimeY,startTimeM,startTimeD)then-- invalidate end time if it precedes start timeendTimeY=nilendTimeM=nilendTimeD=nilendifself.periods[1]then-- futureifstartTimeYanddatePrecedesDate(self.atDate[1],self.atDate[2],self.atDate[3],startTimeY,startTimeM,startTimeD)thenreturntrueendendifself.periods[2]then-- currentif(startTimeY==nilornotdatePrecedesDate(self.atDate[1],self.atDate[2],self.atDate[3],startTimeY,startTimeM,startTimeD))and(endTimeY==nilordatePrecedesDate(self.atDate[1],self.atDate[2],self.atDate[3],endTimeY,endTimeM,endTimeD))thenreturntrueendendifself.periods[3]then-- formerifendTimeYandnotdatePrecedesDate(self.atDate[1],self.atDate[2],self.atDate[3],endTimeY,endTimeM,endTimeD)thenreturntrueendendreturnfalseendfunctionConfig:processFlag(flag)ifnotflagthenreturnfalseendifflag==p.flags.linkedthenself.curState.linked=truereturntrueelseifflag==p.flags.rawthenself.curState.rawValue=trueifself.curState==self.states[parameters.reference]then-- raw reference values end with periods and require a separator (other than none)self.separators["sep%r"][1]={" "}endreturntrueelseifflag==p.flags.shortthenself.curState.shortName=truereturntrueelseifflag==p.flags.multilanguagethenself.curState.anyLanguage=truereturntrueelseifflag==p.flags.unitthenself.curState.unitOnly=truereturntrueelseifflag==p.flags.mdythenself.mdyDate=truereturntrueelseifflag==p.flags.singlethenself.singleClaim=truereturntrueelseifflag==p.flags.sourcedthenself.sourcedOnly=truereturntrueelseifflag==p.flags.editthenself.editable=truereturntrueelseifflag==p.flags.editAtEndthenself.editable=trueself.editAtEnd=truereturntrueelseifflag==p.flags.bestorflag:match('^'..p.flags.preferred..'[+-]?$')orflag:match('^'..p.flags.normal..'[+-]?$')orflag:match('^'..p.flags.deprecated..'[+-]?$')thenself:setRank(flag)returntrueelseifflag==p.flags.futureorflag==p.flags.currentorflag==p.flags.formerthenself:setPeriod(flag)returntrueelseifflag==""then-- ignore empty flags and carry onreturntrueelsereturnfalseendendfunctionConfig:processFlagOrCommand(flag)localparam=""ifnotflagthenreturnfalseendifflag==p.claimCommands.propertyorflag==p.claimCommands.propertiesthenparam=parameters.propertyelseifflag==p.claimCommands.qualifierorflag==p.claimCommands.qualifiersthenself.states.qualifiersCount=self.states.qualifiersCount+1param=parameters.qualifier..self.states.qualifiersCountself.separators["sep"..param]={copyTable(defaultSeparators["sep%q\\d"])}elseifflag==p.claimCommands.referenceorflag==p.claimCommands.referencesthenparam=parameters.referenceelsereturnself:processFlag(flag)endifself.states[param]thenreturnfalseend-- create a new state for each commandself.states[param]=State:new(self,param)-- use "%x" as the general parameter nameself.states[param].parsedFormat=parseFormat(parameters.general)-- will be overwritten for param=="%p"-- set the separatorself.states[param].separator=self.separators["sep"..param]-- will be nil for param=="%p", which will be set separatelyifflag==p.claimCommands.propertyorflag==p.claimCommands.qualifierorflag==p.claimCommands.referencethenself.states[param].singleValue=trueendself.curState=self.states[param]returntrueendfunctionConfig:processSeparators(args)localsepfori,vinpairs(self.separators)doifargs[i]thensep=replaceSpecialChars(args[i])ifsep~=""thenself.separators[i][1]={sep}elseself.separators[i][1]=nilendendendendfunctionConfig:setFormatAndSeparators(state,parsedFormat)state.parsedFormat=parsedFormatstate.separator=self.separators["sep"]state.movSeparator=self.separators["sep"..parameters.separator]state.puncMark=self.separators["punc"]end-- determines if a claim has references by prefetching them from the claim using getReferences,-- which applies some filtering that determines if a reference is actually returned,-- and caches the references for later usefunctionState:isSourced(claim)self.conf.prefetchedRefs=self:getReferences(claim)return(#self.conf.prefetchedRefs>0)endfunctionState:resetCaches()-- any prefetched references of the previous claim must not be usedself.conf.prefetchedRefs=nilendfunctionState:claimMatches(claim)localmatches,rankPos-- first of all, reset any cached values used for the previous claimself:resetCaches()-- if a property value was given, check if it matches the claim's property valueifself.conf.propertyValuethenmatches=self.conf:snakEqualsValue(claim.mainsnak,self.conf.propertyValue)elsematches=trueend-- if any qualifier values were given, check if each matches one of the claim's qualifier valuesfori,vinpairs(self.conf.qualifierIDsAndValues)domatches=(matchesandself.conf:qualifierMatches(claim,i,v))end-- check if the claim's rank and time period matchrankPos=rankTable[claim.rank]or4matches=(matchesandself.conf:rankMatches(rankPos)andself.conf:timeMatches(claim))-- if only claims with references must be returned, check if this one has anyifself.conf.sourcedOnlythenmatches=(matchesandself:isSourced(claim))-- prefetches and caches referencesendreturnmatches,rankPosendfunctionState:out()localresult-- collection of arrays with value objectslocalvaluesArray-- array with value objectslocalsep=nil-- value objectlocalout={}-- array with value objectslocalfunctionwalk(formatTable,result)localvaluesArray={}-- array with value objectsfori,vinpairs(formatTable.req)doifnotresult[i]ornotresult[i][1]then-- we've got no result for a parameter that is required on this level,-- so skip this level (and its children) by returning an empty resultreturn{}endendfor_,vinipairs(formatTable)doifv.paramthenvaluesArray=mergeArrays(valuesArray,result[v.str])elseifv.str~=""thenvaluesArray[#valuesArray+1]={v.str}endifv.childthenvaluesArray=mergeArrays(valuesArray,walk(v.child,result))endendreturnvaluesArrayend-- iterate through the results from back to front, so that we know when to add separatorsfori=#self.results,1,-1doresult=self.results[i]-- if there is already some output, then add the separatorsif#out>0thensep=self.separator[1]-- fixed separatorresult[parameters.separator]={self.movSeparator[1]}-- movable separatorelsesep=nilresult[parameters.separator]={self.puncMark[1]}-- optional punctuation markendvaluesArray=walk(self.parsedFormat,result)if#valuesArray>0thenifsepthenvaluesArray[#valuesArray+1]=sependout=mergeArrays(valuesArray,out)endend-- reset state before next iterationself.results={}returnoutend-- level 1 hookfunctionState:getProperty(claim)localvalue={self:getValue(claim.mainsnak)}-- create one value objectif#value>0thenreturn{value}-- wrap the value object in an array and return itelsereturn{}-- return empty array if there was no valueendend-- level 1 hookfunctionState:getQualifiers(claim,param)localqualifiersifclaim.qualifiersthenqualifiers=claim.qualifiers[self.conf.qualifierIDs[param]]endifqualifiersthen-- iterate through claim's qualifier statements to collect their values;-- return array with multiple value objectsreturnself.conf.states[param]:iterate(qualifiers,{[parameters.general]=hookNames[parameters.qualifier.."\\d"][2],count=1})-- pass qualifier state with level 2 hookelsereturn{}-- return empty arrayendend-- level 2 hookfunctionState:getQualifier(snak)localvalue={self:getValue(snak)}-- create one value objectif#value>0thenreturn{value}-- wrap the value object in an array and return itelsereturn{}-- return empty array if there was no valueendend-- level 1 hookfunctionState:getAllQualifiers(claim,param,result,hooks)localout={}-- array with value objectslocalsep=self.conf.separators["sep"..parameters.qualifier][1]-- value object-- iterate through the output of the separate "qualifier(s)" commandsfori=1,self.conf.states.qualifiersCountdo-- if a hook has not been called yet, call it nowifnotresult[parameters.qualifier..i]thenself:callHook(parameters.qualifier..i,hooks,claim,result)end-- if there is output for this particular "qualifier(s)" command, then add itifresult[parameters.qualifier..i]andresult[parameters.qualifier..i][1]then-- if there is already some output, then add the separatorif#out>0andsepthenout[#out+1]=sependout=mergeArrays(out,result[parameters.qualifier..i])endendreturnoutend-- level 1 hookfunctionState:getReferences(claim)ifself.conf.prefetchedRefsthen-- return references that have been prefetched by isSourcedreturnself.conf.prefetchedRefsendifclaim.referencesthen-- iterate through claim's reference statements to collect their values;-- return array with multiple value objectsreturnself.conf.states[parameters.reference]:iterate(claim.references,{[parameters.general]=hookNames[parameters.reference][2],count=1})-- pass reference state with level 2 hookelsereturn{}-- return empty arrayendend-- level 2 hookfunctionState:getReference(statement)localciteParamMapping=i18n['cite']['param-mapping']localciteConfig=i18n['cite']['config']localciteTypes=i18n['cite']['output-types']-- will hold rendered properties of the reference which are not directly from statement.snaks,-- Namely, these are a backup title from "subject named as" and a URL generated from an external ID.localadditionalProcessedProperties={}-- for each citation type, there will be an associative array that associates lists of rendered properties-- to citation-template parameterslocalgroupedProcessedProperties={}-- like above, but only associates one rendered property to each parameter; if the above variable-- contains more strings for a parameter, the strings will be assigned to numbered params (e.g. "author1")localciteParams={}localciteErrors={}localreferenceEmpty=true-- will be set to false if at least one parameter is left unremovedlocalversion=11-- increment this each time the below logic is changed to avoid conflict errorsifnotstatement.snaksthenreturn{}end-- don't use bot-added references referencing Wikimedia projects or containing "inferred from" (such references are not usable on Wikipedia)ifstatement.snaks[aliasesP.importedFrom]orstatement.snaks[aliasesP.wikimediaImportURL]orstatement.snaks[aliasesP.inferredFrom]thenreturn{}end-- don't include "type of reference"ifstatement.snaks[aliasesP.typeOfReference]thenstatement.snaks[aliasesP.typeOfReference]=nilend-- don't include "image" to prevent litteringifstatement.snaks[aliasesP.image]thenstatement.snaks[aliasesP.image]=nilend-- don't include "language" if it is equal to the local oneifself:getReferenceDetail(statement.snaks,aliasesP.language)==self.conf.langNamethenstatement.snaks[aliasesP.language]=nilendifstatement.snaks[aliasesP.statedIn]andnotstatement.snaks[aliasesP.referenceURL]then-- "stated in" was given but "reference URL" was not.-- get "Wikidata property" properties from the item in "stated in"-- if any of the returned properties of the external-id datatype is in statement.snaks, generate a link from it and use the link in the reference-- find the "Wikidata property" properties in the item from "stated in"localwikidataPropertiesOfSource=mw.text.split(p._properties{p.flags.raw,aliasesP.wikidataProperty,[p.args.eid]=self.conf:getValue(statement.snaks[aliasesP.statedIn][1],true,false)},", ",true)fori,wikidataPropertyOfSourceinpairs(wikidataPropertiesOfSource)doifstatement.snaks[wikidataPropertyOfSource]andstatement.snaks[wikidataPropertyOfSource][1].datatype=="external-id"thenlocaltempLink=self:getReferenceDetail(statement.snaks,wikidataPropertyOfSource,false,true)-- not raw, linkedifmw.ustring.match(tempLink,"^%[%Z- %Z+%]$")then-- getValue returned a URL in square brackets.-- the link is in wiki markup, so strip the square brackets and the display text-- gsub also returns another, discarted value, therefore the result is assigned to tempLink firsttempLink=mw.ustring.gsub(tempLink,"^%[(%Z-) %Z+%]$","%1")additionalProcessedProperties[aliasesP.referenceURL]={tempLink}statement.snaks[wikidataPropertyOfSource]=nilbreakendendendend-- don't include "subject named as", but use it as the title when "title" is not present but a URL isifstatement.snaks[aliasesP.subjectNamedAs]thenifnotstatement.snaks[aliasesP.title]and(statement.snaks[aliasesP.referenceURL]oradditionalProcessedProperties[aliasesP.referenceURL])thenadditionalProcessedProperties[aliasesP.title]={self:getReferenceDetail(statement.snaks,aliasesP.subjectNamedAs,false,false,true)}-- not raw, not linked, anyLangendstatement.snaks[aliasesP.subjectNamedAs]=nilend-- initialize groupedProcessedProperties and citeParamsfor_,citeTypeinipairs(citeTypes)dogroupedProcessedProperties[citeType]={}citeParams[citeType]={}end-- fill groupedProcessedPropertiesforrefPropertyinpairs(statement.snaks)do-- add the parameter to each matching type of citationfor_,citeTypeinipairs(citeTypes)dorepeat-- just a simple wrapper to emulate "continue"-- skip if there already have been errorsifciteErrors[citeType]thenbreakend-- set mappingKey and prefixlocalmappingKeylocalprefix=""ifstatement.snaks[refProperty][1].datatype=='external-id'thenmappingKey="external-id"prefix=self.conf:getLabel(refProperty)ifprefix~=""thenprefix=prefix.." "endelsemappingKey=refPropertyendlocalparamName=citeParamMapping[citeType][mappingKey]-- skip properties with empty parameter nameifparamName==""thenbreakendreferenceEmpty=false-- handle unknown properties in the referenceifnotparamNamethenlocalerror_message=errorText("unknown-property-in-ref",refProperty)assert(error_message)-- Should not be nilciteErrors[citeType]=error_messagebreakend-- set processedPropertylocalprocessedPropertylocalraw=false-- if the value is wanted rawifisValueInTable(paramName,citeConfig[citeType]["raw-value-params"]or{})thenraw=trueendifisValueInTable(paramName,citeConfig[citeType]["numbered-params"]or{})then-- Multiple values may be given.processedProperty=self:getReferenceDetails(statement.snaks,refProperty,raw,self.linked,true)-- anyLang = trueelse-- If multiple values are given, all but the first suitable one are discarted.processedProperty={self:getReferenceDetail(statement.snaks,refProperty,raw,self.linkedand(statement.snaks[refProperty][1].datatype~='url'),true)}-- link = true/false, anyLang = trueendif#processedProperty==0thenbreakend-- add an entry to groupedProcessedPropertiesifnotgroupedProcessedProperties[citeType][paramName]thengroupedProcessedProperties[citeType][paramName]={}endfor_,propertyValueinpairs(processedProperty)dotable.insert(groupedProcessedProperties[citeType][paramName],prefix..propertyValue)enduntiltrueendend-- handle additional propertiesforrefPropertyinpairs(additionalProcessedProperties)dofor_,citeTypeinipairs(citeTypes)dorepeat-- skip if there already have been errorsifciteErrors[citeType]thenbreakendlocalparamName=citeParamMapping[citeType][refProperty]-- handle unknown properties in the referenceifnotparamNamethen-- Skip this additional property, but do not cause an error.breakendifparamName==""thenbreakendreferenceEmpty=falseifnotgroupedProcessedProperties[citeType][paramName]thengroupedProcessedProperties[citeType][paramName]={}endfor_,propertyValueinpairs(additionalProcessedProperties[refProperty])dotable.insert(groupedProcessedProperties[citeType][paramName],propertyValue)enduntiltrueendend-- fill citeParamsfor_,citeTypeinipairs(citeTypes)doforparamName,paramValuesinpairs(groupedProcessedProperties[citeType])doif#paramValues==1ornotisValueInTable(paramName,citeConfig[citeType]["numbered-params"]or{})thenciteParams[citeType][paramName]=paramValues[1]else-- There is more than one value for this parameter - the values will-- go into separate numbered parameters (e.g. "author1", "author2")forparamNum,paramValueinpairs(paramValues)dociteParams[citeType][paramName..paramNum]=paramValueendendendend-- handle missing mandatory parameters for the templatesfor_,citeTypeinipairs(citeTypes)dofor_,requiredCiteParaminpairs(citeConfig[citeType]["mandatory-params"]or{})doifnotciteParams[citeType][requiredCiteParam]then-- The required param is not present.ifciteErrors[citeType]then-- Do not override the previous error, if it exists.breakendlocalerror_message=errorText("missing-mandatory-param",requiredCiteParam)assert(error_message)-- Should not be nilciteErrors[citeType]=error_messageendendendlocalciteTypeToUse=nil-- choose the output templatefor_,citeTypeinipairs(citeTypes)doifnotciteErrors[citeType]thenciteTypeToUse=citeTypebreakendend-- set refContentlocalrefContent=""ifciteTypeToUsethenlocaltemplateToUse=citeConfig[citeTypeToUse]["template"]localparamsToUse=citeParams[citeTypeToUse]ifnottemplateToUseortemplateToUse==""thenthrowError("no-such-reference-template",tostring(templateToUse),i18nPath,citeTypeToUse)end-- if this module is being substituted then build a regular template call, otherwise expand the templateifmw.isSubsting()thenfori,vinpairs(paramsToUse)dorefContent=refContent.."|"..i.."="..vendrefContent="{{"..templateToUse..refContent.."}}"elsexpcall(function()refContent=mw.getCurrentFrame():expandTemplate{title=templateToUse,args=paramsToUse}end,function()throwError("no-such-reference-template",templateToUse,i18nPath,citeTypeToUse)end)end-- If the citation couldn't be displayed using any template, but is not empty (barring ignored propeties), throw an error.elseifnotreferenceEmptythenrefContent=errorText("malformed-reference-header")for_,citeTypeinipairs(citeTypes)dorefContent=refContent..errorText("template-failure-reason",citeConfig[citeType]["template"],citeErrors[citeType])endrefContent=refContent..errorText("malformed-reference-footer")end-- wrap refContentlocalref={}ifrefContent~=""thenref={refContent}ifnotself.rawValuethen-- this should become a <ref> tag, so save the reference's hash for laterref.refHash="wikidata-"..statement.hash.."-v"..(tonumber(i18n['version'])+version)endreturn{ref}elsereturn{}endend-- gets a detail of one particular type for a referencefunctionState:getReferenceDetail(snaks,dType,raw,link,anyLang)localswitchLang=anyLanglocalvalue=nilifnotsnaks[dType]thenreturnnilend-- if anyLang, first try the local language and otherwise any languagerepeatfor_,vinipairs(snaks[dType])dovalue=self.conf:getValue(v,raw,link,false,anyLangandnotswitchLang,false,true)-- noSpecial = trueifvaluethenbreakendendifvalueornotanyLangthenbreakendswitchLang=notswitchLanguntilanyLangandswitchLangreturnvalueend-- gets the details of one particular type for a referencefunctionState:getReferenceDetails(snaks,dType,raw,link,anyLang)localvalues={}ifnotsnaks[dType]thenreturn{}endfor_,vinipairs(snaks[dType])do-- if nil is returned then it will not be added to the tablevalues[#values+1]=self.conf:getValue(v,raw,link,false,anyLang,false,true)-- noSpecial = trueendreturnvaluesend-- level 1 hookfunctionState:getAlias(object)localvalue=object.valuelocaltitle=nilifvalueandself.linkedthenifself.conf.entityID:sub(1,1)=="Q"thentitle=mw.wikibase.getSitelink(self.conf.entityID)elseifself.conf.entityID:sub(1,1)=="P"thentitle="d:Property:"..self.conf.entityIDendiftitlethenvalue=buildWikilink(title,value)endendvalue={value}-- create one value objectif#value>0thenreturn{value}-- wrap the value object in an array and return itelsereturn{}-- return empty array if there was no valueendend-- level 1 hookfunctionState:getBadge(value)value=self.conf:getLabel(value,self.rawValue,self.linked,self.shortName)ifvalue==""thenvalue=nilendvalue={value}-- create one value objectif#value>0thenreturn{value}-- wrap the value object in an array and return itelsereturn{}-- return empty array if there was no valueendendfunctionState:callHook(param,hooks,statement,result)-- call a parameter's hook if it has been defined and if it has not been called beforeifnotresult[param]andhooks[param]thenlocalvaluesArray=self[hooks[param]](self,statement,param,result,hooks)-- array with value objects-- add to the resultif#valuesArray>0thenresult[param]=valuesArrayresult.count=result.count+1elseresult[param]={}-- an empty array to indicate that we've tried this hook alreadyreturntrue-- miss == trueendendreturnfalseend-- iterate through claims, claim's qualifiers or claim's references to collect valuesfunctionState:iterate(statements,hooks,matchHook)matchHook=matchHookoralwaysTruelocalmatches=falselocalrankPos=nillocalresult,gotRequiredfor_,vinipairs(statements)do-- rankPos will be nil for non-claim statements (e.g. qualifiers, references, etc.)matches,rankPos=matchHook(self,v)ifmatchesthenresult={count=0}-- collection of arrays with value objectslocalfunctionwalk(formatTable)localmissfori2,v2inpairs(formatTable.req)do-- call a hook, adding its return value to the resultmiss=self:callHook(i2,hooks,v,result)ifmissthen-- we miss a required value for this level, so return falsereturnfalseendifresult.count==hooks.countthen-- we're done if all hooks have been called;-- returning at this point breaks the loopreturntrueendendfor_,v2inipairs(formatTable)doifresult.count==hooks.countthen-- we're done if all hooks have been called;-- returning at this point prevents further childs from being processedreturntrueendifv2.childthenwalk(v2.child)endendreturntrueendgotRequired=walk(self.parsedFormat)-- only append the result if we got values for all required parameters on the root levelifgotRequiredthen-- if we have a rankPos (only with matchHook() for complete claims), then update the foundRankifrankPosandself.conf.foundRank>rankPosthenself.conf.foundRank=rankPosend-- append the resultself.results[#self.results+1]=result-- break if we only need a single valueifself.singleValuethenbreakendendendendreturnself:out()endlocalfunctiongetEntityId(arg,eid,page,allowOmitPropPrefix,globalSiteId)localid=nillocalprop=nilifargthenifarg:sub(1,1)==":"thenpage=argeid=nilelseifarg:sub(1,1):upper()=="Q"orarg:sub(1,9):lower()=="property:"orallowOmitPropPrefixtheneid=argpage=nilelseprop=argendendifeidthenifeid:sub(1,9):lower()=="property:"thenid=replaceAlias(mw.text.trim(eid:sub(10)))ifid:sub(1,1):upper()~="P"thenid=""endelseid=replaceAlias(eid)endelseifpagethenifpage:sub(1,1)==":"thenpage=mw.text.trim(page:sub(2))endid=mw.wikibase.getEntityIdForTitle(page,globalSiteId)or""endifnotidthenid=mw.wikibase.getEntityIdForCurrentPage()or""endid=id:upper()ifnotmw.wikibase.isValidEntityId(id)thenid=""endreturnid,propendlocalfunctionnextArg(args)localarg=args[args.pointer]ifargthenargs.pointer=args.pointer+1returnmw.text.trim(arg)elsereturnnilendendlocalfunctionclaimCommand(args,funcName)localcfg=Config:new()cfg:processFlagOrCommand(funcName)-- process first command (== function name)locallastArg,parsedFormat,formatParams,claims,valuelocalhooks={count=0}-- set the date if given;-- must come BEFORE processing the flagsifargs[p.args.date]thencfg.atDate={parseDate(args[p.args.date])}cfg.periods={false,true,false}-- change default time constraint to 'current'end-- process flags and commandsrepeatlastArg=nextArg(args)untilnotcfg:processFlagOrCommand(lastArg)-- get the entity ID from either the positional argument, the eid argument or the page argumentcfg.entityID,cfg.propertyID=getEntityId(lastArg,args[p.args.eid],args[p.args.page],false,args[p.args.globalSiteId])ifcfg.entityID==""thenreturn""-- we cannot continue without a valid entity IDendcfg.entity=mw.wikibase.getEntity(cfg.entityID)ifnotcfg.propertyIDthencfg.propertyID=nextArg(args)endcfg.propertyID=replaceAlias(cfg.propertyID)ifnotcfg.entityornotcfg.propertyIDthenreturn""-- we cannot continue without an entity or a property IDendcfg.propertyID=cfg.propertyID:upper()ifnotcfg.entity.claimsornotcfg.entity.claims[cfg.propertyID]thenreturn""-- there is no use to continue without any claimsendclaims=cfg.entity.claims[cfg.propertyID]ifcfg.states.qualifiersCount>0then-- do further processing if "qualifier(s)" command was givenif#args-args.pointer+1>cfg.states.qualifiersCountthen-- claim ID or literal value has been givencfg.propertyValue=nextArg(args)endfori=1,cfg.states.qualifiersCountdo-- check if given qualifier ID is an alias and add itcfg.qualifierIDs[parameters.qualifier..i]=replaceAlias(nextArg(args)or""):upper()endelseifcfg.states[parameters.reference]then-- do further processing if "reference(s)" command was givencfg.propertyValue=nextArg(args)end-- check for special property value 'somevalue' or 'novalue'ifcfg.propertyValuethencfg.propertyValue=replaceSpecialChars(cfg.propertyValue)ifcfg.propertyValue~=""andmw.text.trim(cfg.propertyValue)==""thencfg.propertyValue=" "-- single space represents 'somevalue', whereas empty string represents 'novalue'elsecfg.propertyValue=mw.text.trim(cfg.propertyValue)endend-- parse the desired format, or choose an appropriate formatifargs["format"]thenparsedFormat,formatParams=parseFormat(args["format"])elseifcfg.states.qualifiersCount>0then-- "qualifier(s)" command givenifcfg.states[parameters.property]then-- "propert(y|ies)" command givenparsedFormat,formatParams=parseFormat(formats.propertyWithQualifier)elseparsedFormat,formatParams=parseFormat(formats.qualifier)endelseifcfg.states[parameters.property]then-- "propert(y|ies)" command givenparsedFormat,formatParams=parseFormat(formats.property)else-- "reference(s)" command givenparsedFormat,formatParams=parseFormat(formats.reference)end-- if a "qualifier(s)" command and no "propert(y|ies)" command has been given, make the movable separator a semicolonifcfg.states.qualifiersCount>0andnotcfg.states[parameters.property]thencfg.separators["sep"..parameters.separator][1]={";"}end-- if only "reference(s)" has been given, set the default separator to none (except when raw)ifcfg.states[parameters.reference]andnotcfg.states[parameters.property]andcfg.states.qualifiersCount==0andnotcfg.states[parameters.reference].rawValuethencfg.separators["sep"][1]=nilend-- if exactly one "qualifier(s)" command has been given, make "sep%q" point to "sep%q1" to make them equivalentifcfg.states.qualifiersCount==1thencfg.separators["sep"..parameters.qualifier]=cfg.separators["sep"..parameters.qualifier.."1"]end-- process overridden separator values;-- must come AFTER tweaking the default separatorscfg:processSeparators(args)-- define the hooks that should be called (getProperty, getQualifiers, getReferences);-- only define a hook if both its command ("propert(y|ies)", "reference(s)", "qualifier(s)") and its parameter ("%p", "%r", "%q1", "%q2", "%q3") have been givenfori,vinpairs(cfg.states)do-- e.g. 'formatParams["%q1"] or formatParams["%q"]' to define hook even if "%q1" was not defined to be able to build a complete value for "%q"ifformatParams[i]orformatParams[i:sub(1,2)]thenhooks[i]=getHookName(i,1)hooks.count=hooks.count+1endend-- the "%q" parameter is not attached to a state, but is a collection of the results of multiple states (attached to "%q1", "%q2", "%q3", ...);-- so if this parameter is given then this hook must be defined separately, but only if at least one "qualifier(s)" command has been givenifformatParams[parameters.qualifier]andcfg.states.qualifiersCount>0thenhooks[parameters.qualifier]=getHookName(parameters.qualifier,1)hooks.count=hooks.count+1end-- create a state for "properties" if it doesn't exist yet, which will be used as a base configuration for each claim iteration;-- must come AFTER defining the hooksifnotcfg.states[parameters.property]thencfg.states[parameters.property]=State:new(cfg,parameters.property)-- if the "single" flag has been given then this state should be equivalent to "property" (singular)ifcfg.singleClaimthencfg.states[parameters.property].singleValue=trueendend-- if the "sourced" flag has been given then create a state for "reference" if it doesn't exist yet, using default values,-- which must exist in order to be able to determine if a claim has any references;-- must come AFTER defining the hooksifcfg.sourcedOnlyandnotcfg.states[parameters.reference]thencfg:processFlagOrCommand(p.claimCommands.reference)-- use singular "reference" to minimize overheadend-- set the parsed format and the separators (and optional punctuation mark);-- must come AFTER creating the additonal statescfg:setFormatAndSeparators(cfg.states[parameters.property],parsedFormat)-- process qualifier matching values, analogous to cfg.propertyValuefori,vinpairs(args)doi=tostring(i)ifi:match('^[Pp]%d+$')oraliasesP[i]thenv=replaceSpecialChars(v)-- check for special qualifier value 'somevalue'ifv~=""andmw.text.trim(v)==""thenv=" "-- single space represents 'somevalue'endcfg.qualifierIDsAndValues[replaceAlias(i):upper()]=vendend-- first sort the claims on rank to pre-define the order of output (preferred first, then normal, then deprecated)claims=sortOnRank(claims)-- then iterate through the claims to collect valuesvalue=cfg:concatValues(cfg.states[parameters.property]:iterate(claims,hooks,State.claimMatches))-- pass property state with level 1 hooks and matchHook-- if desired, add a clickable icon that may be used to edit the returned values on Wikidataifcfg.editableandvalue~=""thenvalue=value..cfg:getEditIcon()endreturnvalueendlocalfunctiongeneralCommand(args,funcName)localcfg=Config:new()cfg.curState=State:new(cfg)locallastArglocalvalue=nilrepeatlastArg=nextArg(args)untilnotcfg:processFlag(lastArg)-- get the entity ID from either the positional argument, the eid argument or the page argumentcfg.entityID=getEntityId(lastArg,args[p.args.eid],args[p.args.page],true,args[p.args.globalSiteId])ifcfg.entityID==""ornotmw.wikibase.entityExists(cfg.entityID)thenreturn""-- we cannot continue without an entityend-- serve according to the given commandiffuncName==p.generalCommands.labelthenvalue=cfg:getLabel(cfg.entityID,cfg.curState.rawValue,cfg.curState.linked,cfg.curState.shortName)elseiffuncName==p.generalCommands.titlethencfg.inSitelinks=trueifcfg.entityID:sub(1,1)=="Q"thenvalue=mw.wikibase.getSitelink(cfg.entityID)endifcfg.curState.linkedandvaluethenvalue=buildWikilink(value)endelseiffuncName==p.generalCommands.descriptionthenvalue=mw.wikibase.getDescription(cfg.entityID)elselocalparsedFormat,formatParamslocalhooks={count=0}cfg.entity=mw.wikibase.getEntity(cfg.entityID)iffuncName==p.generalCommands.aliasorfuncName==p.generalCommands.badgethencfg.curState.singleValue=trueendiffuncName==p.generalCommands.aliasorfuncName==p.generalCommands.aliasesthenifnotcfg.entity.aliasesornotcfg.entity.aliases[cfg.langCode]thenreturn""-- there is no use to continue without any aliassesendlocalaliases=cfg.entity.aliases[cfg.langCode]-- parse the desired format, or parse the default aliases formatifargs["format"]thenparsedFormat,formatParams=parseFormat(args["format"])elseparsedFormat,formatParams=parseFormat(formats.alias)end-- process overridden separator values;-- must come AFTER tweaking the default separatorscfg:processSeparators(args)-- define the hook that should be called (getAlias);-- only define the hook if the parameter ("%a") has been givenifformatParams[parameters.alias]thenhooks[parameters.alias]=getHookName(parameters.alias,1)hooks.count=hooks.count+1end-- set the parsed format and the separators (and optional punctuation mark)cfg:setFormatAndSeparators(cfg.curState,parsedFormat)-- iterate to collect valuesvalue=cfg:concatValues(cfg.curState:iterate(aliases,hooks))elseiffuncName==p.generalCommands.badgeorfuncName==p.generalCommands.badgesthenifnotcfg.entity.sitelinksornotcfg.entity.sitelinks[cfg.siteID]ornotcfg.entity.sitelinks[cfg.siteID].badgesthenreturn""-- there is no use to continue without any badgesendlocalbadges=cfg.entity.sitelinks[cfg.siteID].badgescfg.inSitelinks=true-- parse the desired format, or parse the default aliases formatifargs["format"]thenparsedFormat,formatParams=parseFormat(args["format"])elseparsedFormat,formatParams=parseFormat(formats.badge)end-- process overridden separator values;-- must come AFTER tweaking the default separatorscfg:processSeparators(args)-- define the hook that should be called (getBadge);-- only define the hook if the parameter ("%b") has been givenifformatParams[parameters.badge]thenhooks[parameters.badge]=getHookName(parameters.badge,1)hooks.count=hooks.count+1end-- set the parsed format and the separators (and optional punctuation mark)cfg:setFormatAndSeparators(cfg.curState,parsedFormat)-- iterate to collect valuesvalue=cfg:concatValues(cfg.curState:iterate(badges,hooks))endendvalue=valueor""ifcfg.editableandvalue~=""then-- if desired, add a clickable icon that may be used to edit the returned value on Wikidatavalue=value..cfg:getEditIcon()endreturnvalueend-- modules that include this module should call the functions with an underscore prepended, e.g.: p._property(args)localfunctionestablishCommands(commandList,commandFunc)for_,commandNameinpairs(commandList)dolocalfunctionwikitextWrapper(frame)localargs=copyTable(frame.args)args.pointer=1loadI18n(aliasesP,frame)returncommandFunc(args,commandName)endp[commandName]=wikitextWrapperlocalfunctionluaWrapper(args)args=copyTable(args)args.pointer=1loadI18n(aliasesP)returncommandFunc(args,commandName)endp["_"..commandName]=luaWrapperendendestablishCommands(p.claimCommands,claimCommand)establishCommands(p.generalCommands,generalCommand)-- main function that is supposed to be used by wrapper templatesfunctionp.main(frame)ifnotmw.wikibasethenreturnnilendlocalf,argsloadI18n(aliasesP,frame)-- get the parent frame to take the arguments that were passed to the wrapper templateframe=frame:getParent()orframeifnotframe.args[1]thenthrowError("no-function-specified")endf=mw.text.trim(frame.args[1])iff=="main"thenthrowError("main-called-twice")endassert(p["_"..f],errorText('no-such-function',f))-- copy arguments from immutable to mutable tableargs=copyTable(frame.args)-- remove the function name from the listtable.remove(args,1)returnp["_"..f](args)endreturnp
Retrieved from "https://en.wikipedia.org/w/index.php?title=Module:Wd&oldid=1258646059"
Categories:
Hidden category:

[8]ページ先頭

©2009-2025 Movatter.jp