[go: up one dir, main page]

Jump to content

Module:WikidataListe

د ويکيپېډيا، وړیا پوهنغونډ له خوا

لاسوند لپاره ددې موډيول کېدای سی په Module:WikidataListe/لاسوند کي وي

local WikidataDato = require( 'Module:WikidataDato' )
local p = {}

function dump( out )
	if type( out ) == 'table' then
		local s = '{ '
		for k,v in pairs( out ) do
			if type( k ) ~= 'number' then k = '"'..k..'"' end
			s = s .. '['..k..'] = ' .. dump( v ) .. ','
		end
		return s .. '} '
	else
		return tostring( out )
	end
end

-- filter(function, table)
function filter(func, tbl)
	local newtbl= {}
	for i, v in pairs(tbl) do
		if func(v) then
			table.insert(newtbl, v)
		end
	end
	return newtbl
 end

-- Returns an array of non-deprecated claims for the given property.
-- If there's no Wikidata entity or no claims, an empty array is returned.
function getNonDeprecatedClaims( property )
	assert( property )

	local entity = mw.wikibase.getEntity()
	if not entity then
		return {}
	end

	local propertyId =  mw.wikibase.resolvePropertyId( property ) or 'none'
	local claims = ( entity.claims or {} )[propertyId] or {}

	claims = filter( function( claim ) return claim.mainsnak end, claims )
	claims = filter( function( claim ) return claim.rank ~= 'deprecated' end, claims )

	return claims
end

function hasQualifer( claim, qualifier )
	assert( claim )
	assert( qualifier )

	local extracted = ( claim.qualifiers or {} )[qualifier] or {}
	return #extracted > 0
end

function formatYearQualifier(claim, qualifier)
	assert( claim )
	assert( qualifier )

	local extracted = ( claim.qualifiers or {} )[qualifier] or {}
	if #extracted == 0 then
		return ''
	end
	
	if extracted[1].snaktype ~= 'value' then
		return ''
	end

	return WikidataDato.aarFraClaim(extracted[1])
end

-- Returns either "ingen", "ukjent", "" or "Qxxxxxx"
function getValue(claim)
	assert( claim )

	-- map snak type
	local mainsnak = claim.mainsnak or {}
	if mainsnak.snaktype == 'novalue' then
		return "ingen"
	elseif mainsnak.snaktype == 'somevalue' then
		return "ukjent"
	elseif mainsnak.snaktype ~= 'value' then
		-- just in case
		return ""
	end

	-- check datatype
	if mainsnak.datatype ~= 'wikibase-item' then
		return ""
	end
	
	local datavalue = mainsnak.datavalue or {}
	if datavalue.type ~= 'wikibase-entityid' then
		return ""
	end
	
	local value = datavalue.value or {}
	if value['entity-type'] ~= 'item' then
		return ""
	end

	-- at this point there should be an ordinary value, but be safe
	return 'Q' .. ( value["numeric-id"] or 'xxxx')
end

function formatValue(value, first, link)
	assert( value )
	--assert( first )

	-- setter link til true som default hvis ingen verdi er angitt
	link = link or true

	if string.sub(value, 1, 1) ~= "Q" then
		-- Verdien er enten "ukjent" eller "ingen"
		return string.format("''%s''", value)
	end

	local label = mw.wikibase.label( value )
	local sitelink = mw.wikibase.sitelink( value )
	if first and label then
		local lang = mw.language.getContentLanguage()
		label = lang:ucfirst( label )
	end

	if not link then
		-- Vi ønsker kun tekst, ikke wikilenke
		if label then
			return label
		end
		return ''
	end

	if label and sitelink then
		return '[[' .. sitelink .. '|' .. label .. ']]'
	end
	if label and not sitelink then
		return label
	end
	if sitelink and not label then
		return '[[' .. sitelink .. ']]'
	end

	return ''
end

-- Returns all values from Wikidata for the given property
-- If no values are found, an empty string is returned.
function getFormattedValues(frame, prop, param, link)
	local claims = getNonDeprecatedClaims(prop)

	local i = 0
	local manglerOversettelse = false
	local formattedValues = {}
	
	for i, claim in ipairs(claims) do
		local value = getValue(claim)
		if value ~= '' then
			local formattedValue = formatValue(value, i == 1, link)

			if formattedValue == '' then
				-- Målet har ikke en etikett på norsk bokmål, ei heller en artikkel på nowiki.
				-- Vi skriver ut en lenke til Wikidata for å gjøre det enkelt å legge til en etikett.
				-- For vanlige lesere kan det imidlertid være forvirrende med en Wikidata-lenke,
				-- så det er ikke helt optimalt. Vi marker derfor også at artikkelen skal legges til
				--  i en vedlikeholdskategori.
				manglerOversettelse = true
				formattedValue = "[[d:" .. value .. '|' .. value .. ']]'
			end

			if hasQualifer(claim, 'P582') then
				local startYear = formatYearQualifier(claim, 'P580')  -- fra dato
				local endYear = formatYearQualifier(claim, 'P582')  -- til dato
				if endYear == '' then
					-- Ukjent sluttdato, vi skjuler hele oppføringen. Tenk avsluttede ekteskap.
					-- Men kan være vi burde finne en mer generell løsning i fremtiden.
					formattedValue = ''
				else
					formattedValue = string.format('%s (%s–%s)', formattedValue, startYear, endYear)
				end
			end

			if formattedValue ~= '' then
				table.insert(formattedValues, formattedValue)
			end
		end
	end

	local resultat = table.concat(formattedValues, ", ")

	if #formattedValues > 5 then
		resultat = string.format([[
			<div class="mw-collapsible mw-collapsed">
				<div class="sentrert">%s oppføringer</div>
				<div class="mw-collapsible-content">%s</div>
			</div>
		]], #formattedValues, resultat)
	end

	if manglerOversettelse then
		resultat = resultat .. "[[وېشنيزه:Artikler hvor " .. param .. " mangler oversettelse]]"
	end

	return resultat
end

function getFrameValue(frame,param)
	local args = frame.args
	if args[1] == nil then
		local pFrame = frame:getParent();
		args = pFrame.args;
		for k,v in pairs( frame.args ) do
			args[k] = v;
		end
	 end
	 if args[param] then
		return mw.text.trim( args[param] )
	 end
	 return ""
end

function p.grenserTil(frame)
	assert( frame )
	return getFormattedValues(frame,'P47',"grenser til")
end

function p.yrker(frame)
	assert( frame )
	return getFormattedValues(frame,'P106',"دنده", false)
end

function velg(frame, prop, param, link)
	local lang = mw.language.getContentLanguage()
	local verdiFraFrame = getFrameValue(frame, param)
	local verdiFraWikidata = getFormattedValues(frame, prop, param, link)

	if verdiFraFrame == "uten" then
		-- Hvis malargumentet er satt til "uten" betyr det at det ikke er ønskelig at feltet vises,
		-- selv om det finnes data på Wikidata
		return "[[وېشنيزه:Artikler hvor " .. param .. " spesifisert som uten]]"
	end

	if verdiFraWikidata == "" then
		-- No value at Wikidata.
		if verdiFraFrame == "" then
			return ""
		end
		return verdiFraFrame .. "[[وېشنيزه:Artikler hvor " .. param .. " mangler på Wikidata]]"
	end

	if verdiFraFrame == "" then
		if verdiFraWikidata == "" then
			return ""
		end
		return verdiFraWikidata .. "[[وېشنيزه:Artikler hvor " .. param .. " hentes fra Wikidata]]"
	end

	if lang:uc(verdiFraFrame) == lang:uc(verdiFraWikidata) then
		-- Den lokale verdien er helt lik Wikidata-verdien
		return verdiFraFrame .. "[[وېشنيزه:Artikler hvor " .. param .. " samme som på Wikidata]]"
	end

	-- Den lokale verdien er ikke *helt* lik Wikidata-verdien, men vi vet ikke om det er
	-- snakk om betydningsforskjeller.
	return verdiFraFrame .. "[[وېشنيزه:Artikler hvor " .. param .. " forskjellig fra Wikidata]]"
end

function rad( frame, prop, param, link )
	assert( frame )
	local lang = mw.language.getContentLanguage()
	local value = velg( frame, prop, param, link )
	local verdiFraFrame = getFrameValue( frame, param )
	if verdiFraFrame == "uten" then
		return value  -- Dette returnerer kategorien som så vil bli brukt der ellers en infoboks rad hadde vært.
	end
	if value == "" then
		return ""
	end
	return string.format([[
		<tr class="rad" valign="top">
			<th colspan="2" class="nowrap">%s</th>
			<td colspan="2">%s</td>
		</tr>
	]], lang:ucfirst(param), value)
end

function p.nasjonalitet(frame)
	assert( frame )
	return rad(frame,'P27','هېواد غړيتوب')
end

function p.radYrke(frame)
	assert( frame )
	return rad(frame,'P106','دنده', false)
end

function p.velgYrke(frame)
	assert( frame )
	return velg(frame,'P106','دنده', false)
end
function p.radUtdannet_ved(frame)
	assert( frame )
	return rad(frame,'P69','زده کړې')
end
function p.radUtdannelse(frame)
	assert( frame )
	return rad(frame,'P512','akademisk grad')
end
function p.radDoktorgradsveileder(frame)
	assert( frame )
	return rad(frame,'P184','doktorgradsveileder')
end
function p.radEktefelle(frame)
	assert( frame )
	return rad(frame,'P26','ژوند ملګری', true)
end
function p.radMor(frame)
	assert( frame )
	return rad(frame,'P25','مور')
end
function p.radFar(frame)
	assert( frame )
	return rad(frame,'P22','پلار')
end
function p.radBarn(frame)
	assert( frame )
	return rad(frame,'P40','اولاد')
end
function p.radSoesken(frame)
	assert( frame )
	return rad(frame,'P3373','ورونه/خويندې')
end
function p.radParti(frame)
	assert( frame )
	return rad(frame,'P102','ګوند')
end
function p.radBarn(frame)
	assert( frame )
	return rad(frame,'P40','اولاد')
end
function p.rad(frame)
	assert( frame )
	return rad(frame, frame.args['wdp'], frame.args['param'])
end

return p