Jump to content

Module:Is located in: Difference between revisions

From Humanipedia
hp>MSGJ
create based on Module:Is instance
 
m 1 revision imported
 
(No difference)

Latest revision as of 20:15, 3 February 2025

Lua error in package.lua at line 80: module 'Module:Yesno' not found.

Usage[edit source]

{{#invoke:Is located in|main|qid=|value=}}

This module will use Wikidata property Template:Q to determine whether or not an entity is located in a particular area or not.

Example[edit source]

For example:

To know that Template:Q is located in Template:Q, you can use:

{{#invoke:Is located in|main|qid=Q6374700|value=Q132705}} = Lua error at line 7: attempt to index field 'wikibase' (a nil value).

The output number indicates the minimum recursion depth to find the value required. An output of zero indicates that the item is not located there.

Maximum depth[edit source]

For performance considerations, the module will not go on searching indefinitely. The default maximum recursion depth is 5. If you want to change this, use the |maxdepth= parameter.


local p = {};

local function checklayer(depth) -- check P131 of items at current depth
	checklist[depth+1] = {} -- setup next layer of table
	local j = 0
	for j = 1,#checklist[depth] do -- loop over items at current depth
		local subclasses = mw.wikibase.getBestStatements(checklist[depth][j],"P131") -- get P131 statements
		for i,statement in ipairs(subclasses) do -- loop through items at next depth
			if statement.mainsnak.snaktype == 'value' then
				local newitem = statement.mainsnak.datavalue.value.id
				if newitem == value then
					isLocated = true
				else
					checklist[depth+1][#checklist[depth+1]+1] = newitem -- add item to next depth of checklist table
				end
			end
		end
	end
	return isLocated
end

function p.main(frame)
	local args = frame.args
	local pargs = frame:getParent().args
	value = args.value or pargs.value
	local qid = args.qid or pargs.qid or ""
	if qid == "" then
		qid = mw.wikibase.getEntityIdForCurrentPage()
	end
	if not qid then
		return 0
	end
	checklist = {{qid}}
	local md = args.maxdepth or pargs.maxdepth
	if md then
		maxdepth = tonumber(md)
	else
		maxdepth = 5
	end
	depth = 0 -- current depth
	isLocated = false -- assume false until match found
	while not isLocated and depth<maxdepth do
		depth = depth+1
		checklayer(depth)
	end
	if not isLocated then
		depth = 0 -- indicates not isLocated
	end
	return depth -- return depth that item was found
end

return p