Extension:Wikibase Client/Lua
Lua was introduced as a scripting language for MediaWiki end users, including Wikipedia editors. Lua scripting was rolled it out to all WMF wikis on 13 March 2013. An introductory tutorial to the language and its use on Mediawiki is available.
The WikibaseClient extension that provides the access to wikidata.org from the client wikis (i.e. Wikipedias that can pull data from Wikidata) introduced several functions for Lua scripting with Wikidata.
Available functions
Functions are available under the mw.wikibase namespace in Lua.
These functions are available with the most recent install:
- mw.wikibase.getEntity()
- gets entity data of the Wikidata item connected with the current page. See the section Entity table and data structure for an example of the structure returned.
- mw.wikibase.label( id )
- takes an item ID and returns the label in the language of the local wiki.
- mw.wikibase.sitelink( id )
- takes an item ID and returns the title of the corresponding page on the local wiki.
Functions that take id as a parameter will check if that id is a valid id (i.e. "Q" or "P" followed by numbers). An invalid id will cause an internal Scribunto error that cannot be caught by Lua.
Examples
In order to get Ada Lovelace's father, you'd access the property p107 in the claims table. This is the property ID of "father".
local entity = mw.wikibase.getEntity()
local father = mw.wikibase.label( "Q" .. entity.claims.p107[0].mainsnak.datavalue.value["numeric-id"])
-- father == "Lord Byron"
Note the use of mw.wikibase.label to return the name of her father rendered in the language and script of the local wiki. The return value would be "Lord Byron" on enwiki, "George Gordon Byron" on dewiki, and "조지 고든 바이런" on kowiki.
Note also that lists in claim tables start at index 0, rather than 1. Thus, if you iterate over the table using ipairs()
, the loop will skip the first claim associated with the property. Instead, iterate over the table manually, e.g. for i = 0, #entity.claims.p107 do
.
In order to use code like this in your wiki, it needs to be wrapped in a Scribunto module and put in the respective module namespace on the client wiki. Below is a basic example of this:
-- Module:Wikibase
local p = {}
-- Return the item ID of the item linked to the current page.
function p.id(frame)
if not mw.wikibase then
return "wikibase module not found"
end
entity = mw.wikibase.getEntity()
if entity == nil then
return "(no item connected)"
end
return entity.id
end
-- Return the label of a given data item.
function p.label(frame)
if frame.args[1] == nil then
entity = mw.wikibase.getEntity()
if not entity then return nil end
id = entity.id
else
id = frame.args[1]
end
return mw.wikibase.label( id )
end
-- Return the local page about a given data item.
function p.page(frame)
if frame.args[1] == nil then
entity = mw.wikibase.getEntity()
if not entity then return nil end
id = entity.id
else
id = frame.args[1]
end
return mw.wikibase.sitelink( id )
end
return p
A page on the client wiki may use wikitext to invoke the functions in Module:Wikibase like this:
== Lua Test == * ID: {{#invoke:Wikibase|id}} * Label(): {{#invoke:Wikibase|label}} * Label(Q2099): {{#invoke:Wikibase|label|Q7259}} * Label(q555555): {{#invoke:Wikibase|label|q555555}} <!-- Unknown or missing entity. Will result in empty output. --> * Label(xyz): {{#invoke:Wikibase|label|xyz}} <!-- Invalid entity. Will result in "Script error". --> * Page(): {{#invoke:Wikibase|page}} * Page(Q7259): {{#invoke:Wikibase|page|Q7259}} * Page(q555555): {{#invoke:Wikibase|page|q555555}} <!-- Unknown or missing entity. Will result in empty output. --> * Page(xyz): {{#invoke:Wikibase|page|xyz}} <!-- Invalid entity. Will result in "Script error". -->
Entity table and data structure
Calling mw.wikibase.getEntity() returns a table of serialized data from the Wikibase repository (i.e. Wikidata) that can be accessed and traversed. The entity returned is always the one connected to the current page. A call to mw.wikibase.getEntity() from Ada Lovelace will thus return data from Q7259.
The table returned to Lua may look like this internally (formatted and abridged for readability):
aliases: de: 1: language: de value: Augusta Ada Byron 2: language: de value: Ada Byron 3: language: de value: Ada King 4: language: de value: Augusta Ada King 5: language: de value: Augusta Ada King, Countess of Lovelace en: 1: language: en value: Augusta Ada Byron 2: language: en value: Lady Ada 3: language: en value: Augusta Ada King, Countess of Lovelace 4: language: en value: Ada Byron 5: language: en value: Augusta Ada King 6: language: en value: Ada King fr: 1: language: fr value: Augusta Ada King, comtesse Lovelace 2: language: fr value: Anna Byron claims: p107: 1: id: q7259$FEE5069C-DF8E-4355-A973-2B0B8BC339A8 mainsnak: datavalue: type: wikibase-entityid value: entity-type: item numeric-id: 215627 property: p107 snaktype: value rank: normal type: statement p18: 1: id: q7259$A78C2B21-2A10-4E77-B6ED-CC278204F55A mainsnak: datavalue: type: string value: Ada lovelace.jpg property: p18 snaktype: value rank: normal type: statement 2: id: q7259$21DC3BE7-1BFB-4835-A5AF-95A4C81BA99B mainsnak: datavalue: type: string value: Ada Lovelace 1838.jpg property: p18 snaktype: value rank: normal type: statement p19: 1: id: q7259$F0E062F0-3D91-42FB-A3E2-5AE99BA489F6 mainsnak: datavalue: type: wikibase-entityid value: entity-type: item numeric-id: 84 property: p19 snaktype: value rank: normal type: statement p20: 1: id: q7259$24690922-EC83-4EA0-88AF-1918E72B2CF6 mainsnak: datavalue: type: wikibase-entityid value: entity-type: item numeric-id: 1633759 property: p20 snaktype: value rank: normal type: statement p21: 1: id: q7259$E032DC24-810D-41EA-9777-0961A2AEFC3A mainsnak: datavalue: type: wikibase-entityid value: entity-type: item numeric-id: 43445 property: p21 snaktype: value rank: normal type: statement p22: 1: id: q7259$DB006E49-122B-4238-981C-5C1D7AF63CE9 mainsnak: datavalue: type: wikibase-entityid value: entity-type: item numeric-id: 5679 property: p22 snaktype: value rank: normal type: statement p25: 1: id: q7259$F0E0A2C1-76DC-43F0-8DA0-D0E0A5FF39BE mainsnak: datavalue: type: wikibase-entityid value: entity-type: item numeric-id: 272161 property: p25 snaktype: value rank: normal type: statement p26: 1: id: q7259$ECE4FB4E-A402-42FA-939C-109FF2838FA2 mainsnak: datavalue: type: wikibase-entityid value: entity-type: item numeric-id: 4426480 property: p26 snaktype: value rank: normal type: statement p9: 1: id: q7259$8D78EC59-0C49-47A3-B603-A9C61A6FD6CC mainsnak: datavalue: type: wikibase-entityid value: entity-type: item numeric-id: 2837843 property: p9 snaktype: value rank: normal type: statement descriptions: de: language: de value: englische Mathematikerin en: language: en value: English mathematician, considered the first computer programmer fr: language: fr value: Mathématicienne britannique id: q7259 labels: de: language: de value: Ada Lovelace en: language: en value: Ada Lovelace fr: language: fr value: Ada Lovelace sitelinks: dewiki: site: dewiki title: Ada Lovelace enwiki: site: enwiki title: Ada Lovelace frwiki: site: frwiki title: Ada Lovelace title: Q7259 type: item