Modul:Befolkningstetthet

Moduldokumentasjon
local wd = require('Modul:Wd-norsk')

local p = {}

local function comma_to_dots(x)
	if x then
		res, _ = string.gsub(x, "%,", ".")
		return tonumber(res) or x
	end
	return ''
end

local function find(f, l)
  for _, v in pairs(l) do
    if v == f then
      return true
    end
  end
  return false
end

local function get_unit(result)
	local allowed_lang = {"nb", "nn", "en"}
	local lang = {}

	for index, type_unit in pairs(mw.wikibase.getBestStatements( result, 'P5061' )) do
    	if find(type_unit["mainsnak"]["datavalue"]["value"]["language"], allowed_lang) then
    		lang[type_unit["mainsnak"]["datavalue"]["value"]["language"]] = type_unit["mainsnak"]["datavalue"]["value"]["text"]
		end
	end

	if lang["nb"] then
    	return lang["nb"]
	elseif lang["nn"] then
    	return lang["nn"]
	elseif lang["en"] then
    	return lang["en"]
	else
    	return mw.wikibase.getLabel( result )
	end
end

local function round(num, numDecimalPlaces)
  return tonumber(string.format("%." .. (numDecimalPlaces or 0) .. "f", num))
end

local function find_population_density(popu, area, item_p)
	local population_density = round(popu/area, 2)
	local type_SI
	if item_p then
		claims = mw.wikibase.getBestStatements( item_p, 'P2046' )
		result = claims[1].mainsnak.datavalue.value.unit
		result = mw.ustring.sub(result, mw.ustring.find(result, "Q"), -1)
		type_SI = '[[' .. mw.wikibase.getSitelink( result ) .. '|' .. get_unit(result) .. ']]'
	else
		type_SI = "[[kvadratkilometer|km²]]"
	end
		
	return mw.language.getContentLanguage():formatNum(population_density) .. " [[Innbygger|innb.]]/" .. type_SI
end

local function wd_match(item_p, pid, last_val)
	
	if wd._egenskap{item_p, pid} ~= "" then
		if pid == "P2046" then
			return find_population_density(last_val, tonumber(wd._egenskap{'rå','normal+', item_p, 'P2046'}), item_p)
		elseif pid == "P1082" then
			return find_population_density(tonumber(wd._egenskap{'rå','normal+', item_p, 'P1082'}), last_val)
		end
	end
	
	if wd._egenskap{item_p,'P1082'} ~= "" and wd._egenskap{item_p,'P2046'} ~= "" then
		return find_population_density(tonumber(wd._egenskap{'rå','normal+', item_p, 'P1082'}), tonumber(wd._egenskap{'rå','normal+', item_p, 'P2046'}), item_p)
	end
	
	return ''
end

function p.main(frame)
	local area = comma_to_dots(frame.args[1]) --P2046
	local population = comma_to_dots(frame.args[2]) --P1082
	local population_density = comma_to_dots(frame.args[3])
	local item_p = mw.wikibase.getEntityIdForCurrentPage() or nil
	--local item_p = "Q55" --DEBUG
	
	if population_density == "uten" then
		return ''
	end
	
	if area == '' and population == '' and population_density == '' then
		return wd_match(item_p)
	end
	
	if population_density ~= '' then
		if type(population_density) == "number" then
			return mw.language.getContentLanguage():formatNum(population_density) .. " [[Innbygger|innb.]]/[[kvadratkilometer|km²]]"
		else
			return population_density .. " [[Innbygger|innb.]]/[[kvadratkilometer|km²]]"
		end
	end
	
	if type(area) == "number" and type(population) == "number" then
		return find_population_density(population, area)
	end
	
	if type(area) == "number" and population == '' then
		return wd_match(item_p, 'P1082', area)
	end
	
	if type(population) == "number" and area == '' then
		return wd_match(item_p, 'P2046', population)
	end
	
	return "[[Kategori:Sider med feil i befolkningstetthet]]"
	
end

return p