UWAGA
Strona jest ponownie oddana do uzytku po zabiegach konfiguracyjnych. Jeśli zobaczą Państwo na niej jakieś błedy techniczne, prosimy o ich zgłoszenie.

Większość artykułów w portalu to nasze własne teksty z kluczowych dziedzin związanych z naszą misją. Spora część materiałów pochodzi też z polskiej wersji Wikipedii, gdzie były odrzucone ze względu na politykę redaktorów (przeczytaj o krytyce Wikipedii). Są też i takie, które zostały przeniesione na nasze strony, gdyż stanowią istotne uzupełnienie merytorycznej treści naszego serwisu. Wszystkie artykuły podlegają edycji przez naszych Użytkowników, dlatego ich wersje mogą się różnić od prezentowanych na innych witrynach.

Moduł:Wikidane/select

Z Wedapedia
Przejdź do nawigacji Przejdź do wyszukiwania

Dokumentacja dla tego modułu może zostać utworzona pod nazwą Moduł:Wikidane/select/opis

local moduleData = mw.loadData("Module:Wikidane/data")
local function loadArg(frame,id)
	local result = frame.args[id]
	if not result or (#result == 0) then
		result = frame:getParent().args[id]
		if not result or (#result == 0) then
			return nil
		end
	end
 
	return result
end
 
local function checkFilters(item, filters)
	for k, v in pairs(filters) do
		local qualifiers = item.qualifiers and item.qualifiers[k]
		if not qualifiers and not v.missing then
			--mw.log("missing not available")
			return false
		end
		
		local accepted = false
		for _, w in ipairs(qualifiers) do
			if (w.snaktype == "novalue") and v.novalue then
				accepted = true
				break
			end
			
			if (w.snaktype == "somevalue") and v.somevalue then
				accepted = true
				break
			end
			
			if w.snaktype == "value" then
				if (w.datatype == "wikibase-item") and (w.datavalue.type == "wikibase-entityid") and (w.datavalue.value["entity-type"] == "item") and v["Q"..w.datavalue.value["numeric-id"]] then
					accepted = true
					break
				elseif (w.datatype == "globe-coordinate") and (w.datavalue.type == "globecoordinate") and v.globe then
					accepted = true
					break
				end
			end
		end
	
		if not accepted then
			return false
		end
	end

	return true
end

local function take(sequence, maxCount)
	if not maxCount or (type(sequence) ~= "table") or (maxCount < 1) or (#sequence < maxCount) then
		return sequence
	end
	
	local result = {}
	for i = 1, maxCount do
		result[i] = sequence[i]
	end
	
	return result
end

local rankLoaders =
{
	["najlepsza"] = {
		get = mw.wikibase.getBestStatements,
	},
	["preferowana lub zwykła"] = {
		get = mw.wikibase.getAllStatements,
		group = function(rank) return ((rank == "preferred") or (rank == "normal")) and 1 or false end,
	},
	["dowolna"] = {
		get = mw.wikibase.getAllStatements,
		group = function(rank) if rank == "preferred" then return 1 elseif rank == "normal" then return 2 else return 3 end end,
	},
	["preferowana"] = {
		get = mw.wikibase.getAllStatements,
		group = function(rank) return rank == "preferred" and 1 or false end,
	},
	["zwykła"] = {
		get = mw.wikibase.getAllStatements,
		group = function(rank) return rank == "normal" and 1 or false end,
	},
	["przestarzała"] = {
		get = mw.wikibase.getAllStatements,
		group = function(rank) return rank == "deprecated" and 1 or false end,
	},
	["wszystkie"] = {
		get = mw.wikibase.getAllStatements,
	},
}

return {
	
prepareFilters = function(frame)
	local result = {}
	for i, v in ipairs(moduleData.qualifiedFilters) do
		local selectors = frame.args[v]
		if selectors and (#selectors > 0) then
			local map = {}
			local any = false
			for _, w in ipairs(mw.text.split(selectors, "%s")) do
				map[w] = true
				any = true
			end
			
			if any then
				result[v] = map
			end
		end
	end
	
	return result
end,

selectProperty = function(pid, filters, qid, maximumNumberOfItems, rank)
	qid = qid or mw.wikibase.getEntityIdForCurrentPage()
	if not qid then
		mw.log(moduleData.warnNoEntity)
		return pid, false
	end

	local P, ddd = pid:match"^([Pp]?)(%d%d?%d?%d?%d?%d?%d?%d?%d?%d?%d?%d?)$"
	if not P then
		mw.log(string.format(moduleData.warnPropertyByName, pid))
		P = mw.wikibase.resolvePropertyId(pid)
		if not P then
			return pid, false
		end
		pid = P
	elseif #P == 0 then
		pid = "P" .. pid
	elseif P == "p" then
		pid = "P" .. ddd
	end
	
	local loader = rankLoaders[rank or "najlepsza"]
	if not loader then
		return pid, false
	end
	
	mw.log("\n== selectProperty ==")
	mw.logObject(rank, "rank")
	mw.logObject(loader, "loader")
	mw.logObject(filters, "filters")
	
	local prop = loader.get( qid, pid )
	if not prop or (#prop == 0) then
		mw.log(string.format(moduleData.warnNoStatements, pid))
		return pid, false
	end
	
	mw.logObject(#prop, "#prop A")
	local hasFilters = false
	for _, _ in pairs(filters) do
		hasFilters = true
		break
	end
	
	if loader.group or hasFilters then
		local group = loader.group or function() return 1 end
		local results = {{},{},{},{},{}}
		for _, p in ipairs(prop) do
			local g = group(p.rank)
			if g and results[g] and checkFilters(p, filters) then
				table.insert(results[g], p)
			end
		end
		
		for i, v in ipairs(results) do
			prop = results[i]
			if #prop > 0 then
				break
			end
		end
		
		mw.logObject(#prop, "#prop B")
	end

	if #prop > 0 then
		return pid, qid, take(prop, tonumber(maximumNumberOfItems))
	end
	
	return pid, false
end,

}