Modul:SignatureList

Fra Wikipedia, den frie encyklopedi
Moduldokumentasjon

SignatureList er et bibliotek for å hente ut en liste av signaturer for refererte elementer. Signaturen til et element er identifikatoren, etiketten og beskrivelsen. I tillegg tas med nettstedlenker for elementet.

Dataene hentes ut ved hjelp av de spesifikke metodene, dermed unngår en spørringer etter hele entiteten, og (gitt at dokumentasjonen er riktig) så unngår en å trekke på lastbudsjettet. Det gjør at en tabell på mer enn 500 elementer kan bygges opp.

Bruk[rediger kilde]

Det angis i kallet hvilken egenskap som skal benyttes

-- Example 1
local lib1 = require 'Module:SignatureList'
local data1 = lib1:parts('P527')
-- Example 2
local lib2 = require 'Module:SignatureList'
local data2,indexes2 = lib1('P527')
-- Example 3
local data3,indexes3 = require 'Module:SignatureList'('P527')

De to første eksemplene viser lasting av biblioteket, og separat innhenting av datasettet. I det andre settet blir oppføringene sortert. I det tredje eksempelet blir biblioteket lastet og datasettet hentet inn via chaining.

local lib = {}

function exist( a, b )
	if not(a) then
		return true
	end

	if b == '' or type(b) == 'nil' then
		return false
	end

	return true
end

function getLabel( id, languageCode )
	local label = nil

	if languageCode then
		label = mw.wikibase.getLabelByLang( id, languageCode)
	else
		label = mw.wikibase.getLabel( id )
	end

	return label or ''
end

function getDescription( id, languageCode )
	local description = nil

	if languageCode then
		description = mw.wikibase.getDescriptionByLang( id, languageCode)
	else
		description = mw.wikibase.getDescription( id )
	end

	return description
end

function lib:parts( entityId, propertyId, languageCode, mustHaveLabel, mustHaveDescription, mustHaveSitelink )
	local parts = {}
	local statements = {}

	if entityId then
		statements = mw.wikibase.getBestStatements( entityId, propertyId )
	end
	
	mustHaveLabel = type( mustHaveLabel ) == 'boolean' and mustHaveLabel or false
	mustHaveDescription = type( mustHaveDescription ) == 'boolean' and mustHaveDescription or false
	mustHaveSitelink = type( mustHaveSitelink ) == 'boolean' and mustHaveSitelink or false

	for i,claim in ipairs( statements ) do
		local mainsnak = claim.mainsnak

		if mainsnak.snaktype == 'value' and mainsnak.datatype == 'wikibase-item' then
			local datavalue = mainsnak.datavalue

			if datavalue.type == 'wikibase-entityid' then
				local value = datavalue.value

				if value['entity-type'] == 'item' then
					local id = value.id

					local sitelink = mw.wikibase.getSitelink( id )
					local label = getLabel( id, languageCode )
					local description = getDescription( id, languageCode )

					if exist( mustHaveLabel, label )
						and exist( mustHaveDescription, description )
						and exist( mustHaveSitelink, sitelink ) then
						table.insert( parts, { id, label, description, sitelink } )
					end
				end
			end
		end
	end

	return parts
end

setmetatable( lib, {
	__call = function( self, entityId, propertyId, languageCode, mustHaveLabel, mustHaveDescription, mustHaveSitelink )
		entityId = entityId or mw.wikibase.getEntityIdForCurrentPage()
		local parts = self:parts( entityId, propertyId, nil, nil, nil, nil )
		table.sort( parts, function( a, b ) return mw.ustring.upper( a[2] ) < mw.ustring.upper( b[2] ) end)
		
		local indexes = {}
		for i,part in ipairs( parts ) do
			indexes[part[1]] = i
		end
		
		return parts, indexes
	end })

return lib