Module:ResolveEntityId

From Hârn
Jump to navigation Jump to search

Usage[edit source]

Functions similarly to mw.wikibase.resolvePropertyId, but for Wikidata entities instead of properties.

Returns an entity id for the given label or id. This allows using the entity's labels instead of ids in all places. If no entitiy was found for the label or id, or if the label is ambiguous, a nil value is returned.

Call from within a module[edit source]

An example call within a module might look like the following:

local resolve = require( "Module:ResolveEntityId" )
id = resolve._entityid(frame, 'Q42')

which would result in id = Lua error at line 8: attempt to index field 'wikibase' (a nil value).

local resolve = require( "Module:ResolveEntityId" )
id = resolve._entityid(frame, 'Q0')

which would result in id = Lua error at line 8: attempt to index field 'wikibase' (a nil value).

local resolve = require( "Module:ResolveEntityId" )
id = resolve._entityid(frame, 'Q404')

which would result in id = Lua error at line 8: attempt to index field 'wikibase' (a nil value).

local resolve = require( "Module:ResolveEntityId" )
id = resolve._entityid(frame, 'Q151384451555')

which would result in id = Lua error at line 8: attempt to index field 'wikibase' (a nil value).

local resolve = require( "Module:ResolveEntityId" )
id = resolve._entityid(frame, 'Douglas Adams')

which would result in id = Lua error at line 17: attempt to index field 'wikibase' (a nil value).

local resolve = require( "Module:ResolveEntityId" )
id = resolve._entityid(frame, 'ThisIsNotARealWikidataItem')

which would result in id = Lua error at line 17: attempt to index field 'wikibase' (a nil value).


local resolve = require( "Module:ResolveEntityId" )
id = resolve._entityid(frame, 'ThisIsNotARealWikidataItem', 'Wikidata ID not found!')

which would result in id = Lua error at line 17: attempt to index field 'wikibase' (a nil value).

Use from within a template[edit source]

The following will return the entity id (or nil if the ID doesn't exist): {{#invoke:ResolveEntityId|entityid|id}}

The following will return the entity id (or the alternate text if the ID doesn't exist): {{#invoke:ResolveEntityId|entityid|id|alternate text if id is nil}}

External links[edit source]


local p = {}

function p._entityid(frame,id,alt)
	if type(id) == 'string' then
		id = mw.ustring.upper(mw.ustring.sub(id,1,1))..mw.ustring.sub(id,2)
		if mw.ustring.match(id,'^Q%d+$') then
			-- id is in the proper format for a Wikidata entity
			if mw.wikibase.isValidEntityId(id) then
				-- id is valid
				id = mw.wikibase.getEntity(id)
				if id then
					-- entity exists
					return id.id
				end
			end
		else
			id = mw.wikibase.getEntityIdForTitle(id)
			if id then
				-- id is a title that matches a Wikidata entity
				local instanceOf = mw.wikibase.getBestStatements(id, 'P31')[1] --instance of
				if instanceOf and instanceOf.mainsnak.datavalue.value.id ~= 'Q4167410' then
					-- not disambiguation
					return mw.wikibase.getEntity(id).id
				elseif instanceOf == nil then
					-- id is a title, but is missing an instance-of value
					return mw.wikibase.getEntity(id).id
				end
			end
		end
	end
	return alt or nil
end

function p.entityid(frame)
	return p._entityid(frame, frame.args[1], frame.args[2])
end

return p