Module:Italian municipality

local e = {}

e.publisher="[[Italian National Institute of Statistics|ISTAT]]"
e.countryofbirth_countries_index=2
e.countryofbirth_text_head="As of %s, of the known countries of birth of %s residents, the most numerous are: "
e.countryofbirth_and=" and "
e.countryofbirth_procent_yes_up="0.5%"

local function lround(number, decimals)
	local full=string.format("%.1f", number)
	local length=#full
	local i_start
	local i_end
	local full_l
	local tail
	
	i_start, _=string.find(full, "%.")
	if i_start then
		while 1 do
			full_l=string.len(full)
			
			tail=string.sub(full, full_l-1)
			if tail == ".0" then
				full=string.sub(full, 1, full_l-2)
				break
			end
			
			tail=string.sub(full, full_l)
			if tail == "0" then
				full=string.sub(full, 1, full_l-1)
			else
				break
			end
		end
	end
	
	return full
end

function e.get_place_codes()
	local code=mw.wikibase.getEntityIdForCurrentPage()
	local code2
	local place_info
	
	if code == nil then
		return nil
	end
	
	codes={}
	place_info=mw.wikibase.getAllStatements(code,"P635")
	if place_info then
		for i,v in ipairs(place_info) do
			code=v["mainsnak"]['datavalue']['value']
			table.insert(codes, code)
		end
	end
	
	if #codes == 0 then
		return nil
	end
	return codes
end

local function percent(now, full, lang)
	if now == 0 or full == 0 then
		return "0%"
	end
	
	local rate=now/(full/100)
	
	return lang:formatNum(tonumber(lround(rate, 1))).."%"
end

function e.get_line_data(data, id)
	index=1
	while 1 do
		item=data.data[index]
		if item == nil then
			break
		end
		if item[1] == id then
			break
		end
		index=index+1
	end
	
	return item
end

function e.percent(now, full, lang)
	if now == 0 or full == 0 then
		return "0%"
	end
	
	local rate=now/(full/100)
	
	return lang:formatNum(tonumber(lround(rate))).."%"
end

function e.popstructure()
	local data=mw.ext.data.get("Italian municipality populations.tab")
	local record
	local code=nil
	
	if code == nil or code == "" then
		code=e.get_place_codes()
		if code == nil then
			return ""
		end
	else
		code={code}
	end
	
	record = e.get_line_data(data, code[1])
	if record == nil then
		record = e.get_line_data(data, code[2])
	end
	
	local year=e.year(data)
	local ref=e.get_ref(data)
	
	local all_count=record[2]
	local male_count=record[3]
	local female_count=record[4]
	
	local lang=mw.language.getContentLanguage()
	
	local percent_male=e.percent(male_count, all_count, lang)
	local percent_female=e.percent(female_count, all_count, lang)
	
	local percent_immature=e.percent(record[5], all_count, lang)
	local percent_old_age=e.percent(record[6], all_count, lang)
	
	return "As of "..year..", the population is "..lang:formatNum(all_count)..", of which "
		..percent_male.." are male, and "
		..percent_female.." are female. "..
		"Minors make up "..percent_immature.." of the population, and seniors make up "..percent_old_age.."."
end

function e.population_ref()
	local data=mw.ext.data.get("Italian municipality populations.tab")
	
	return e.get_ref(data)
end

function e.population_dref()
	local data=mw.ext.data.get("Italian municipality populations.tab")
	
	return e.get_ref_dataset(data)
end

function e.population(data, code)
	local record
	
	if code == nil or code == "" then
		code=e.get_place_codes()
		if code == nil then
			return nil
		end
	else
		if type(code) == "string" then
			code={code}
		end
	end
	
	for i,c in ipairs(code) do
		record = e.get_line_data(data, c)
		if record then
			return record[2]
		end
	end
	
	return ""
end

function e.year(data)
	local i_start
	local i_end
	local start
	
	local description=data.description.en
	if description == nil then
		description=data.description
	end
	i_start, i_end=string.find(description, "%(")
	start=i_start+1
	return string.sub(description, start, start+3)
end

function e.public_date(data)
	local i_start
	local i_end
	local start
	
	local description=data.description.en
	if description == nil then
		description=data.description
	end
	i_start, i_end=string.find(description, "%(")
	start=i_start+1
	return string.sub(description, start, start+9)
end

function e.year_h()
	local data=mw.ext.data.get("Italian municipality populations.tab")
	
	return e.year(data)
end

function e.density_old(args)
	local area=args.args[1]
	local code=args.args[2]
	
	local data=mw.ext.data.get("Italian municipality populations.tab")
	local population = e.population(data, code)
	
	if area == nil or population == nil then return "" end
	if area == "" then return "" end
	if area == 0 then return 0 end
	if population == 0 then return 0 end
	
	-- hr to "C" format
	local i_start
	i_start, _=string.find(area, ",")
	if i_start then
		area=string.gsub(area, "%.", "")
		area=string.gsub(area, "%,", ".")
	end
	
	local area_pop=tonumber(area)
	if area_pop == nil then return "" end
	
	local result = population/area_pop
	
	local lang=mw.language.getContentLanguage()
	return lang:formatNum(tonumber(lround(result, 0)))
end

function e.density(args)
	local code=args.args[1]
	local data=mw.ext.data.get("Italian municipality populations.tab")
	
	local area_pop
	
	if code == nil or code == "" then
		code=e.get_place_codes()
		if code == nil then
			return ""
		end
	else
		
		code={code}
	end
	
	local population = e.population(data, code)
	
	area_pop=e.area_value(code)
	
	if area_pop == nil or population == nil then return "" end
	if population == 0 then return "0" end
	
	local result = population/area_pop
	
	local lang=mw.language.getContentLanguage()
	return lang:formatNum(tonumber(lround(result, 0)))
end

function e.population_h(args)
	local code=args.args[1]
	local original=args.args[2]
	local data=mw.ext.data.get("Italian municipality populations.tab")
	
	local population = e.population(data, code)
	
	if original == nil then original = "" end
	
	if population == nil then return original end
	if population == "" then return original end
	if population == 0 then return "0" end
	
	local lang=mw.language.getContentLanguage()
	
	return lang:formatNum(population)
end

function e.get_ref(data)
	local source=data.sources
	
	local i_start
	local i_end
	
	local start
	local title
	local url

	-- title
	i_start, i_end=string.find(source, "''")
	start=i_start+2
	i_start, i_end=string.find(source, "''", start)
	title=string.sub(data.sources, start, i_start-1)
	title=string.gsub(title, "''", "")
	
	-- url
	i_start, i_end=string.find(source, "%(")
	start=i_start+1
	i_start, i_end=string.find(source, ",", start)
	url=string.sub(data.sources, start, i_start-1)
	
	-- website
	i_start, i_end=string.find(source, "//")
	start=i_start+2
	i_start, i_end=string.find(source, "/", start)
	local website=string.sub(data.sources, start, i_start-1)
	
	-- access date
	i_start, i_end=string.find(source, "downloaded: ")
	start=i_start+12
	local acces_date=string.sub(data.sources, start, start+9)
	
	local year=e.year(data)
	
	local pdate=e.public_date(data)
	
	return "{{Cite web |date="..pdate.." |title= "..title.." |url="..url.." |website="..website.." |publisher="..e.publisher.." |access-date="..acces_date.."}}"
end

function e.get_ref_dataset(data)
	local source=data.sources
	
	local i_start
	local i_end
	
	local start
	local title
	local url
	
	-- title
	i_start, i_end=string.find(source, "''")
	start=i_start+2
	i_start, i_end=string.find(source, "''", start)
	title=string.sub(data.sources, start, i_start-1)
	title=string.gsub(title, "''", "")
	
	-- url
	i_start, i_end=string.find(source, ": ")
	start=i_start+1
	i_start, i_end=string.find(source, ": ", start)
	start=i_start+1
	i_start, i_end=string.find(source, ",", start)
	url=string.sub(data.sources, start, i_start-1)
	
	-- website
	i_start, i_end=string.find(source, "//")
	start=i_start+2
	i_start, i_end=string.find(source, "/", start)
	local website=string.sub(data.sources, start, i_start-1)
	
	-- access date
	i_start, i_end=string.find(source, "downloaded: ")
	start=i_start+12
	local acces_date=string.sub(data.sources, start, start+9)
	
	local year=e.year(data)
	
	local pdate=e.public_date(data)
	
	return "{{Cite web |date="..pdate.." |title= "..title.." |url="..url.." |website="..website.." |publisher="..e.publisher.." |access-date="..acces_date.."}}"
end

function e.countryofbirth_ref()
	local data=mw.ext.data.get("Italian municipality birthday countries – supmunicipalies.tab") -- identic for municipalies/supmunicipalies
	local ref=e.get_ref(data)
	return ref
end

function e.countryofbirth_dref()
	local data=mw.ext.data.get("Italian municipality birthday countries – supmunicipalies.tab") -- identic for municipalies/supmunicipalies
	local ref=e.get_ref_dataset(data)
	return ref
end

function e.str_implode(middle, array) --middle is unused
	local count=#array
	local stop=count-1
	local ret=""
	
	if count == 1 then
		return array[1]
	end
	
	for i=1,stop do
		ret=ret..array[i].." "
	end
	
	ret=ret..array[count]
	return ret
end

function e.d0cmf_to_table(text)
	local items=mw.text.split(text, "%s")
	local values={}
	local values_index=1
	local zeros
	local count=#items
	
	for i=1,count do
		if text.sub(items[i], 1,1) == "^" then
			zeros=tonumber(string.sub(items[i], 2))
			for j=1,zeros do
				values[values_index]="0"
				values_index=values_index+1
			end
		else
			values[values_index]=items[i]
			values_index=values_index+1
		end
		
	end
	
	return values
end

function e.array_without_first(array)
	local ret={}
	local count=#array
	
	for i=2,count do
		table.insert(ret, array[i])
	end
	
	return ret
end

function e.countryofbirth()
	local data_countries=mw.ext.data.get("Italian municipality – country list.tab")
	local code
	local data
	local values
	local ethnicity={}
	local ethnicity_name
	local ethnicity_tail_minus
	local place_population
	local procent
	local ret
	local i_start
	local start
	local year
	
	local record
	
	if code == nil or code == "" then
		code=e.get_place_codes()
		if code == nil then
			return ""
		end
	else
		do return "" end
	end
	
	if #code[1] == 6 then
		data=mw.ext.data.get("Italian municipality birthday countries – municipalies.tab")
	else
		data=mw.ext.data.get("Italian municipality birthday countries – supmunicipalies.tab")
	end
	
	record = e.get_line_data(data, code[1])
	
	if record == nil then
		record = e.get_line_data(data, code[2])
	end
	if record == nil then return "" end
	
	values=e.d0cmf_to_table(e.str_implode(" ", e.array_without_first(record)))
	
	place_population=0;
	for index, population in ipairs(values) do
		if population ~= "0" then
			population=tonumber(population)
			ethnicity_name=data_countries.data[index][e.countryofbirth_countries_index]
			table.insert(ethnicity, {ethnicity_name,population})
			
			place_population=place_population+population
		end
	end
	
	table.sort(ethnicity, function (v, w) if v[2] == w[2] then return v[1]>w[1] end return v[2]>w[2] end)
	
	local lang=mw.language.getContentLanguage()
	
	-- The year of date
	i_start, _=string.find(data.sources, ", year ")
	start=i_start+7
	year=string.sub(data.sources, start, start+3)
	
	-- Render output
	ret=string.format(e.countryofbirth_text_head, year, lang:formatNum(place_population))
	
	ethnicity_tail_minus=#ethnicity-1
	local index_now=1
	for index, cols in ipairs(ethnicity) do
		
		procent=percent(cols[2], place_population, lang)
		
		if procent > e.countryofbirth_procent_yes_up then
			ret=ret..cols[1].." ".."("..lang:formatNum(tonumber(cols[2])).." – "..procent.."), "
		else
			do break end
			-- ret=ret..cols[1].." ".."("..lang:formatNum(tonumber(cols[2])).."), "
		end
		index_now=index_now+1
		
		if index == ethnicity_tail_minus  then
			ret=string.sub(ret, 1, #ret-2)
			ret=ret..e.countryofbirth_and
		end
	end
	ret=string.sub(ret, 1, #ret-2)
	
	ret=ret.."."
	
	return ret
end

function e.geo(data, code)
	local record
	
	if code == nil then
		code=e.get_place_codes()
		if code == nil then
			return nil
		end
	else
		if type(code) == "string" then
			code={code}
		end
	end
	
	for i,c in ipairs(code) do
		record = e.get_line_data(data, c)
		if record then
			return record
		end
	end
	
	return ""
end

function e.area_value(code)
	local area
	local record
	local data=mw.ext.data.get("Italian municipalities – geological data.tab")
	
	if not code then
		return ""
	end
			
	record = e.get_line_data(data, code[1])
	if record == nil then
		record = e.get_line_data(data, code[2])
	end
	
	if record ~= nil then
		area=record[2]
	else
		return nil
	end
	
	-- if original == nil then original = "" end -- if none dataset value then it return the value from original_template_call.
	
	if area == nil then return original end
	if area == "" then return original end
	if area == 0 then return "0" end
	
	return area
end

function e.area(args)
	local code=args.args[1]
	local original=args.args[2]
	local area
	
	if code == nil or code == "" then
		code=e.get_place_codes()
	else
		code={code}
	end
	
	area=e.area_value(code)
	
	if original == nil then original = "" end
	
	if area == nil then return original end
	if area == "" then return original end
	if area == 0 then return "0" end
	
	local lang=mw.language.getContentLanguage()
	
	return lang:formatNum(tonumber(lround(area, 1)))
end

function e.area_ref()
	local data=mw.ext.data.get("Italian municipalities – geological data.tab")
	
	return e.get_ref(data)
end

function e.area_dref()
	local data=mw.ext.data.get("Italian municipalities – geological data.tab")
	
	return e.get_ref_dataset(data)
end

function e.alti(args)
	local code=args.args[1]
	local original=args.args[2]
	local area
	local record
	local data=mw.ext.data.get("Italian municipalities – geological data.tab")
	
	if code == nil or code == "" then
		code=e.get_place_codes()
		if code == nil then
			return ""
		end
	else
		if type(code) == "string" then
			code={code}
		end
	end
	
	for i,c in ipairs(code) do
		record = e.get_line_data(data, c)
		if record then
			break
		end
	end

	area=record[3]
	
	do return area end
	
	if original == nil then original = "" end
	
	if area == nil then return original end
	if area == "" then return original end
	if area == 0 then return "0" end
	
	local lang=mw.language.getContentLanguage()
	
	return lang:formatNum(lang:formatNum(tonumber(lround(area, 1))))
end

function e.table_list(args)
	local encoded=args.args[1]
	local ret=""
	
	local data_popul=mw.ext.data.get("Italian municipality populations.tab")
	local data_geo=mw.ext.data.get("Italian municipalities – geological data.tab")
	
	local lang=mw.language.getContentLanguage()
	
	local popul
	local area
	local area_record
	
	local records=mw.text.split(encoded, ";", true)
	
	for _,cols in ipairs(records) do
		ret=ret.."<tr>"
		
		local columns=mw.text.split(cols, "::", true)
		
		if columns[2] then ret=ret.."<td>"..columns[2].."</td>" else ret=ret.."<td></td>" end
		if columns[3] then ret=ret.."<td>"..columns[3].."</td>" else ret=ret.."<td></td>" end
		
		local codes=mw.text.split(columns[1], ",", true)

		area=nil
		popul=nil
		
		for _,code in ipairs(codes) do
			popul=e.population(data_popul, code)
			if popul then
				break
			end
		end
		
		for _,code in ipairs(codes) do
			area_record=e.geo(data_geo, code)
			if area_record then
				area=area_record[2]
			end
		end
		
		if area then
			ret=ret.."<td>"..lang:formatNum(tonumber(lround(area))).."</td>"
		else
			ret=ret.."<td></td>"
		end
		
		if popul then
			ret=ret.."<td>"..lang:formatNum(popul).."</td>"
			--ret=ret.."<td>"..lang:formatNum(tonumber(lround(popul))).."</td>"
		else
			ret=ret.."<td></td>"
		end
		
		ret=ret.."</tr>"
	end
	
	return ret
end

return e

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.