跳转到内容

模組:PrevalenceData

被永久保护的模块
维基百科,自由的百科全书
-- This module is specifically the Wikidata property "prevalence" (P1193), due
-- to its particular need for ranges and area-based qualifiers, and the lack of
-- support for these in the main Wikidata module.

-- Completely untested.
local p = {}

--local wikidata = require( 'Module:Wikidata' )

p.main = function ( frame )
	--local entity = mw.wikibase.getEntity( 'Q133087' )
	local entity = mw.wikibase.getEntity( frame.args.qId or nil )
	if entity then
		local prevalenceClaims = entity.claims and entity.claims.P1193
		-- TODO: Get best claim, not always just the first one.
		-- Probably use getBestStatements.
		if prevalenceClaims then
			local pRange = ''
			-- Run through all prevalence claims
			for i, prevalenceClaim in pairs( prevalenceClaims ) do
				local prevalenceValue = prevalenceClaim.mainsnak.datavalue.value
				if ((prevalenceValue) and (prevalenceValue.lowerBound) and (prevalenceValue.upperBound)) then
					if string.len( pRange ) > 0 then
						-- Split multiple claims
						-- Maybe line break instead?
						pRange = pRange .. ', '
					end
					local lowerBound = prevalenceValue.lowerBound * 100
					local upperBound = prevalenceValue.upperBound * 100
					pRange = pRange .. lowerBound
					if lowerBound ~= upperBound then
						pRange = pRange .. ' to ' .. upperBound
					end
					
					pRange = pRange .. '%'
					if prevalenceClaim.qualifiers then
						-- Qualifiers for prevalence are currently unstandardized.
						-- Keep guessing until the right one is found.
						local quals = prevalenceClaim.qualifiers.P276 or -- location
							prevalenceClaim.qualifiers.P1001 or          -- applies to jurisdiction
							prevalenceClaim.qualifiers.P17               -- country
						if quals then
							pRange = pRange .. ' ('
							for k, qual in pairs(quals) do
								if k > 1 then
									pRange = pRange .. ', '
								end
								local qualId = qual.datavalue.value[ 'numeric-id' ]
								local link = mw.wikibase.sitelink( 'Q' .. qualId )
								local label = ({
									-- Certain geographic locales might need a
									-- manual-ish override for labels. 
									[ 132453 ] = 'developed world'
								})[ qualId ] or mw.wikibase.label( 'Q' .. qualId )
								if link then
									label = '[[' .. link .. '|' .. label .. ']]'
								end
								pRange = pRange .. label
								
							end
							pRange = pRange .. ')'
						end
					end
				end
				--[[
				-- Todo: References
				if prevalenceClaim.references then 
					
				end
				]]--
				
			end
			return pRange
		end
	end
	return ''
end

return p