Module:wikibase-list
From Rhizome Artbase
Documentation for this module may be created at Module:wikibase-list/doc
local p = {}
p.columns = {
['artwork'] = {
'P29', -- creator
'P26', -- inception
'P85', -- accession
},
['collective'] = {
'P43', -- has member
},
['person'] = {
'P20', -- member of
'P21', -- date of birth
'P19', -- country of citizenship
},
['File Format'] = {
'P79', -- mime type
'P4', -- equivalent item
}
}
-- function that creates tables with items
-- first parameter is the desired label for "instance of" that should be shown
-- TEST IN CONSOLE: =p.items({['args']={}})
function p.items(frame)
local requested_type = frame.args[1] or 'artwork'
local rows = {}
local table_headers = {}
for item_number=1,5000 do
local item_id = 'Q' .. item_number
local entity = mw.wikibase.getEntity( item_id )
if entity then
local instance_of = entity:formatPropertyValues( "P3" )
-- only continue if the item is of the desired type
if instance_of.value == requested_type then
local row = {}
-- first get the basics
table.insert(row, string.format('| [[Item:%s|%s]]\n', item_id, item_id) )
table.insert(row, string.format('| %s\n', mw.text.nowiki( entity:getLabel('en') or '') ) )
-- get other property values based on configuration table
-- if no desired properties are defined, create empty table
if not p.columns[requested_type] then
p.columns[requested_type] = {}
end
for i,property_id in ipairs(p.columns[requested_type]) do
table.insert(row, string.format('| %s\n', p.renderProperty(entity, property_id)))
end
table.insert(rows, table.concat(row, ''))
end
end
end
-- create table headers from configuration table
for i,property_id in ipairs(p.columns[requested_type]) do
table.insert(table_headers, string.format('! [[Property:%s|%s]]', property_id, mw.wikibase.label(property_id)) )
end
local wikitable = [[
{| class="wikitable sortable"
! id
! label
%s
|-
%s|}
]]
return string.format(wikitable, table.concat(table_headers, '\n') , table.concat(rows, '|-\n') )
end
-- function that creates table of properties
function p.properties(frame)
local rows = ''
for property_number=1,500 do
local row = {}
local property_id = 'P' .. property_number
local entity = mw.wikibase.getEntity( property_id )
if entity then
row['label'] = entity:getLabel('en') or ''
row['label'] = '[[Property:' .. property_id .. '|' .. row['label'] .. ']]'
row['description'] = entity:getDescription('en') or ''
row['aliases'] = p.strucToString(entity.aliases, 'en') or ''
-- need to abstract this!!
row['inverse of'] = p.renderProperty(entity, 'P5')
row['equivalent property'] = p.renderProperty(entity, 'P2')
rows = rows .. '<tr><td>[[Property:' .. property_id .. '|'.. property_id ..']]</td><td>' .. row['label'] .. '</td><td><small>' .. row['aliases'] .. '</small></td><td>' .. row['description'] .. '</td><td>' .. row['inverse of'] .. '</td><td>' .. row['equivalent property'] .. '</td></tr>\n'
end
end
return "<table class=\"wikitable sortable\">\n<tr><th>id</th><th>label</th><th>aliases</th><th>description</th><th>inverse of</th><th>equivalent property</th></tr>\n" .. rows .. "</table>"
end
-- render a property as a string
function p.renderProperty(entity, property_id)
local prop = false
if entity.claims then
if entity.claims[property_id] then
prop = entity.claims[property_id]
end
end
if prop then
local l = {} -- list that will hold renderings for each snak
-- iterate over all statements for the property
for k,statement in pairs(prop) do
local snak = statement.mainsnak
if snak.datatype == 'url' then
local url = mw.uri.new(snak.datavalue.value)
table.insert(l, '[' .. snak.datavalue.value .. ' ' .. url.host .. ']')
elseif snak.datatype == 'wikibase-property' then
table.insert(l, '[[Property:' .. snak.datavalue.value.id .. '|' .. mw.text.nowiki( mw.wikibase.label(snak.datavalue.value.id) ) .. ']]')
elseif snak.datatype == 'wikibase-item' then
table.insert(l, '[[Item:' .. snak.datavalue.value.id .. '|' .. mw.text.nowiki( mw.wikibase.label(snak.datavalue.value.id) ) .. ']]')
elseif snak.datatype == 'time' then
table.insert(l, entity:formatPropertyValues(snak.property).value)
elseif snak.datatype == 'string' then
table.insert(l, mw.text.nowiki( snak.datavalue.value ) )
end
end
return table.concat(l, ', ')
else
return ''
end
end
-- render a simple multi-lang string into a comma separated string
function p.strucToString(snak, lang)
if snak then
local l = {}
for k,v in pairs(snak[lang]) do
table.insert(l, v.value)
end
return table.concat(l, ', ')
else
return ''
end
end
return p