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