Module:Gemeente in Nederland: verschil tussen versies

Uit Wikipedia, de vrije encyclopedie
Verwijderde inhoud Toegevoegde inhoud
Onderdrukking van foutmelding als page_id geen geldige waarde heeft
Betere namen van variabelen, beginnetje met sortering op plaatsnaam (hoofdplaatsen boven), benodigde credits toegevoegd, bron bij totaal inwoneraantal
Regel 4: Regel 4:
--Functie "settlements_table", maakt een tabel met alle woonplaatsen in een gemeente en de bijbehorende inwoneraantallen en markeert de hoofdplaats(en)
--Functie "settlements_table", maakt een tabel met alle woonplaatsen in een gemeente en de bijbehorende inwoneraantallen en markeert de hoofdplaats(en)
function p.settlements_table(frame)
function p.settlements_table(frame)
result = ''
local result = ''
--Argumenten ophalen
--Argumenten ophalen
local args = frame.args
local args = frame.args
--Als het argument "gemeente_id" gegeven is, wordt die gemeente gebruikt
--Als het argument "wikidata_id" gegeven is, wordt de Wikidata-pagina met dat ID gebruikt
if args.gemeente_id then
if args.wikidata_id then
page_id = args.gemeente_id
municipality_id = args.wikidata_id
--Anders wordt het Wikidata-ID van de pagina zelf gebruikt
--Anders wordt het Wikidata-ID van de pagina zelf gebruikt
else
else
page_id = mw.wikibase.getEntityIdForCurrentPage()
municipality_id = mw.wikibase.getEntityIdForCurrentPage()
end
end
--Als de pagina geen Wikidata-ID heeft en ook geen Wikidata-ID is opgegeven, wordt een foutmelding geretourneerd
if page_id == '' then
if municipality_id == '' then
return result
return frame:expandTemplate{ title = 'Tekstkleur', args = {'red', '\nEr kon geen tabel gemaakt worden omdat deze pagina geen Wikidata-ID heeft en er geen Wikidata-ID is opgegeven als parameter (zie [[Sjabloon:Tabel woonplaatsen Nederlandse gemeente|hier]] welke parameters gebruikt kunnen worden).'} }
end
end


--De hoofdsteden van, kernen in en totale bevolking van de gemeente worden opgehaald uit Wikidata
--De hoofdsteden van, kernen in en het totale inwoneraantal van de gemeente worden opgehaald uit Wikidata
local capitals = mw.wikibase.getBestStatements(page_id, 'P36')
local capitals = mw.wikibase.getBestStatements(municipality_id, 'P36')
local settlements = mw.wikibase.getBestStatements(page_id, 'P1383')
local settlements = mw.wikibase.getBestStatements(municipality_id, 'P1383')
local total_population_wd = tonumber(mw.wikibase.getBestStatements(page_id, 'P1082')[1].mainsnak.datavalue.value.amount)
local total_population_wd = tonumber(mw.wikibase.getBestStatements(municipality_id, 'P1082')[1].mainsnak.datavalue.value.amount)


--De ID's van de hoofdsteden worden in een table gezet
--De ID's van de hoofdsteden worden in een table gezet
capital_ids = {}
local capital_ids = {}
for k in pairs(capitals) do
for k in pairs(capitals) do
capital_ids[k] = capitals[k].mainsnak.datavalue.value.id
capital_ids[k] = capitals[k].mainsnak.datavalue.value.id
Regel 33: Regel 34:
local total_population_sum = 0
local total_population_sum = 0
for k in pairs(settlements) do
for k in pairs(settlements) do
local settlement_id = settlements[k].mainsnak.datavalue.value.id
local id = settlements[k].mainsnak.datavalue.value.id
--Het inwoneraantal wordt opgehaald, alsmede het inwoneraantal met bron erachter
--Het inwoneraantal wordt opgehaald, alsmede het inwoneraantal met bron erachter
local population_number = frame:expandTemplate{ title = 'Inwonertal', args = {id=settlement_id, soort='waardepuur'} }
local population = frame:expandTemplate{ title = 'Inwonertal', args = {id=id, soort='waardepuur'} }
local population_date = frame:expandTemplate{ title = 'Inwonertal', args = {id=settlement_id, soort='datum'} }
local population_with_source = frame:expandTemplate{ title = 'Inwonertal', args = {id=id} }
local population = frame:expandTemplate{ title = 'Inwonertal', args = {id=settlement_id} }
local population_date = frame:expandTemplate{ title = 'Inwonertal', args = {id=id, soort='datum'} }

--De naam van de kern wordt opgehaald
--De naam van de kern wordt opgehaald
local settlement_name = mw.wikibase.getLabelByLang(settlement_id, 'nl')
local name = mw.wikibase.getLabelByLang(id, 'nl')

--Voor de kernnamen worden links naar artikelen gemaakt
local sitelink = mw.wikibase.getSitelink(id)
local table_name = '[[' .. sitelink .. '|' .. name .. ']]'

--Als de kern een hoofdstad van de gemeente is, wordt hij gemarkeerd
--Als de kern een hoofdstad van de gemeente is, wordt hij gemarkeerd
if contains(capital_ids, settlement_id) then
local is_capital = contains(capital_ids, id)
if is_capital then
table_settlement_name = '\'\'\'' .. settlement_name .. '\'\'\''
table_name = '\'\'\'' .. table_name .. '\'\'\''
else
table_settlement_name = settlement_name
end
end


--Gegevens over de kern worden opgeslagen in een table
--Gegevens over de kern worden opgeslagen in een table
rows[k] = {name=table_settlement_name, id=settlement_id, population_number=population_number, population=population, population_date=population_date}
rows[k] = {name=name, table_name=table_name, id=id, population=population, population_with_source=population_with_source, population_date=population_date, is_capital=is_capital}

--De som van alle inwoneraantallen wordt berekend
--De som van alle inwoneraantallen wordt berekend
total_population_sum = total_population_sum + (population_number ~= nil and tonumber(population_number:gsub('%.', ''), 10) or 0)
total_population_sum = total_population_sum + (population ~= nil and tonumber(population:gsub('%.', ''), 10) or 0)
end
end


--De table wordt gesorteerd op aflopende volgorde van inwoneraantallen
--De table wordt gesorteerd op alfabetische volgorde van kernnamen, waarbij de hoofdplaatsen bovenaan staan (alfabetisch gesorteerd indien meer dan één)
table.sort(rows, compare_population)
table.sort(rows, compare_rows)


--De tabel wordt gemaakt met de gegevens uit de table "rows". Merk op dat hier "row.population" wordt gebruikt, het inwoneraantal mét bron erachter
--De tabel wordt gemaakt met de gegevens uit de table "rows". Merk op dat hier "row.population_with_source" wordt gebruikt, het inwoneraantal mét bron erachter
for k, row in pairs(rows) do
for k, row in pairs(rows) do
result = result .. '\n|-\n|' .. row.name .. '||' .. (row.population_number ~= '' and row.population or '?') .. '||' .. (row.population_date ~= nil and row.population_date)
result = result .. '\n|-\n|' .. row.table_name .. '||' .. (row.population ~= '' and row.population_with_source or '?') .. '||' .. (row.population_date ~= nil and row.population_date)
end
end

result = '{| class="wikitable sortable"\n|-\n!Kern!!Inwoneraantal!!Peildatum' .. result .. '\n|-\n|Totaal:||' .. format_thousand(total_population_sum) .. '\n|}'
--Als de som van de inwoneraantallen niet gelijk is aan de waarde gegeven op Wikidata, wordt het verschil toegevoegd aan de tabel als "Overig"
local population_difference = total_population_wd - total_population_sum
--Als de som van de inwoneraantallen niet gelijk is aan de waarde gegeven op Wikidata, wordt een foutmelding getoond
if total_population_wd ~= total_population_sum then
if population_difference ~= 0 then
result = result .. '\n|-\n|Overig||' .. format_thousand(population_difference) .. '||'
error = frame:expandTemplate{ title = 'Tekstkleur', args = {'red', '\nDe optelsom van de inwoneraantallen komt niet overeen met '.. format_thousand(total_population_wd) .. ', het aantal gegeven op [[:d:' .. page_id .. '|Wikidata]]!'} }
result = result .. error
end
end

--Het totale inwoneraantal van de gemeente uit Wikidata wordt onderaan de tabel gezet. Merk op dat hier "total_population_wd_with_source" wordt gebruikt, het inwoneraantal mét bron erachter
local total_population_wd_date = frame:expandTemplate{ title = 'Inwonertal', args = {id=municipality_id, soort='datum'} }
local total_population_wd_with_source = frame:expandTemplate{ title = 'Inwonertal', args = {id=municipality_id} }
result = '{| class="wikitable sortable"\n|-\n!Kern!!Inwoneraantal!!Peildatum' .. result .. '\n|-\n|Totaal:||' .. total_population_wd_with_source .. '||' .. (total_population_wd_date ~= nil and total_population_wd_date) .. '\n|}'


--Het resultaat wordt geretourneerd
--Het resultaat wordt geretourneerd
Regel 82: Regel 93:
end
end


--Functie "compare_rows", retourneert welke rij boven en welke onder de andere staat: op alfabetische volgorde van kernnamen, waarbij de hoofdplaatsen bovenaan staan (alfabetisch gesorteerd indien meer dan één)
--Functie "compare_population", vergelijkt twee inwoneraantallen en retourneert of de een groter is dan de ander
function compare_population(a, b)
function compare_rows(a, b)
return a.is_capital and not b.is_capital
if (a.population_number == '') then
--[[WAAROM WERKT DIT NIET :(
return false
return a.is_capital and not b.is_capital or a.name <= b.name]]
elseif (b.population_number == '') then
return true
else
--Het inwoneraantal moet worden ontdaan van scheidingstekens voor duizendtallen (punten) en wordt vervolgens omgezet naar een getal. "10" geeft aan dat het decimale getallen betreft
return tonumber(a.population_number:gsub('%.', ''), 10) > tonumber(b.population_number:gsub('%.', ''), 10)
end
end
end


--Functie "format_thousand", voegt scheidingstekens voor duizendtallen (punten) toe aan een getal
--Functie "format_thousand", voegt scheidingstekens voor duizendtallen (punten) toe aan een getal
--Credits: remiX (04-01-2013), van http://www.computercraft.info/forums2/index.php?/topic/8065-lua-thousand-separator/
function format_thousand(v)
function format_thousand(v)
local s = string.format("%d", math.floor(v))
local s = string.format("%d", math.floor(v))
Regel 103: Regel 110:


return p
return p

--Buiten gebruik gesteld, vervangen door tabelwaarde "Overig"
--Als de som van de inwoneraantallen niet gelijk is aan de waarde gegeven op Wikidata, wordt een foutmelding getoond
--if total_population_wd ~= total_population_sum then
-- error = frame:expandTemplate{ title = 'Tekstkleur', args = {'red', '\nDe optelsom van de inwoneraantallen komt niet overeen met '.. format_thousand(total_population_wd) .. ', het aantal gegeven op [[:d:' .. municipality_id .. '#P1082|Wikidata]]!'} }
-- result = result .. error
--end

Versie van 11 jun 2022 18:34

Moduledocumentatie​[bekijk] [bewerk] [ververs] [geschiedenis]

Deze module maakt een tabel aan met de woonplaatsen in een Nederlandse gemeente, inclusief inwoneraantallen, peildatums en de hoofdplaats(en) van de gemeente gemarkeerd. Deze module is onderdeel van het Wikiproject WikidataOpWikipedia/Inwoneraantal en valt onder het deelproject "Tabel woonplaatsen Nederlandse gemeente".

Parameters

Sjabloonparameters

  • wikidataid (optioneel): Wikidata-ID van de gemeente.
  • wikidatalinks (optioneel): Indien "ja" zal de tabel links bevatten naar de Wikidata-items van de woonplaatsen. Gebruik dit alleen in de "Toon bewerking ter controle"-modus.

Moduleparameters

  • reference_date: De gewenste peildatum.

Werking

  • De module probeert een tabel te maken voor de gemeente behorend bij het opgegeven Wikidata-ID. Als die niet gegeven is, wordt geprobeerd een tabel te maken voor de pagina waarin het sjabloon wordt aangeroepen. In beide gevallen werkt het pas als het bijbehorende Wikidata-item als is een (P31) een Nederlandse gemeente (Q2039348) is. Wanneer een foutieve waarde als Wikidata-ID is opgegeven, wordt niet in plaats daarvan geprobeerd het Wikidata-item behorend bij de Wikipedia-pagina te gebruiken.
  • Voor de hoofdplaatsen wordt hoofdplaats (P36) gebruikt, de woonplaatsen komen van omvat plaats (P1383). Alleen woonplaatsen met een is een (P31) van woonplaats in Nederland (Q1852859) worden gebruikt.
  • Voor de naam van de gemeente en de naam van de woonplaatsen worden de Nederlandse labels uit Wikidata gebruikt.
  • Voor het verkrijgen van de inwoneraantallen, inwoneraantallen met bron en bijbehorende peildatums van de gemeente en woonplaatsen wordt het sjabloon {{Inwonertal}} gebruikt, namelijk {{Inwonertal|id=...|soort=waardepuur}}, {{Inwonertal|id=...}} en {{Inwonertal|id=...|soort=datum}}. Als er een inwonertal (P1082) staat met als van toepassing op deel (P518) de gemeente, dan wordt dat inwoneraantal gebruikt en de daarbij behorende bron.
  • Indien de tabel links moet bevatten naar de Wikidata-items, wordt daarvoor {{Inwonertal|id=...|soort=wdlink}} gebruikt.
  • De sortering van de woonplaatsen is als volgt: bovenaan staan de hoofdplaatsen op alfabetische volgorde en dikgedrukt, daaronder staan de overige woonplaatsen op alfabetische volgorde. De sortering kan door de lezer veranderd worden met de pijltjes boven in de tabel.

Beheercategorieën

Deze module kan pagina's toevoegen aan vier beheercategorieën. Zie voor extra uitleg de documentatie in de beheercategorie:

--Variabele die de module bevat
local p = {};

--Functie "settlements_table", maakt een tabel met alle woonplaatsen in een gemeente en de bijbehorende inwoneraantallen en markeert de hoofdplaats(en)
function p.settlements_table(frame)
	local result = ''
	--Argumenten ophalen
	local args = frame.args
	--Als het argument "wikidata_id" gegeven is, wordt de Wikidata-pagina met dat ID gebruikt
	if args.wikidata_id then
		municipality_id = args.wikidata_id
	--Anders wordt het Wikidata-ID van de pagina zelf gebruikt
	else
		municipality_id = mw.wikibase.getEntityIdForCurrentPage()
	end
	--Als de pagina geen Wikidata-ID heeft en ook geen Wikidata-ID is opgegeven, wordt een foutmelding geretourneerd
	if municipality_id == '' then
		return frame:expandTemplate{ title = 'Tekstkleur', args = {'red', '\nEr kon geen tabel gemaakt worden omdat deze pagina geen Wikidata-ID heeft en er geen Wikidata-ID is opgegeven als parameter (zie [[Sjabloon:Tabel woonplaatsen Nederlandse gemeente|hier]] welke parameters gebruikt kunnen worden).'} }
	end

	--De hoofdsteden van, kernen in en het totale inwoneraantal van de gemeente worden opgehaald uit Wikidata
	local capitals = mw.wikibase.getBestStatements(municipality_id, 'P36')
	local settlements = mw.wikibase.getBestStatements(municipality_id, 'P1383')
	local total_population_wd = tonumber(mw.wikibase.getBestStatements(municipality_id, 'P1082')[1].mainsnak.datavalue.value.amount)

	--De ID's van de hoofdsteden worden in een table gezet
	local capital_ids = {}
	for k in pairs(capitals) do
		capital_ids[k] = capitals[k].mainsnak.datavalue.value.id
	end

	--Voor iedere kern in de gemeente worden gegevens opgehaald
	local rows = {}
	local total_population_sum = 0
	for k in pairs(settlements) do
		local id = settlements[k].mainsnak.datavalue.value.id
		--Het inwoneraantal wordt opgehaald, alsmede het inwoneraantal met bron erachter
		local population = frame:expandTemplate{ title = 'Inwonertal', args = {id=id, soort='waardepuur'} }
		local population_with_source = frame:expandTemplate{ title = 'Inwonertal', args = {id=id} }
		local population_date = frame:expandTemplate{ title = 'Inwonertal', args = {id=id, soort='datum'} }

		--De naam van de kern wordt opgehaald
		local name = mw.wikibase.getLabelByLang(id, 'nl')

		--Voor de kernnamen worden links naar artikelen gemaakt
		local sitelink = mw.wikibase.getSitelink(id)
		local table_name = '[[' .. sitelink .. '|' .. name .. ']]'

		--Als de kern een hoofdstad van de gemeente is, wordt hij gemarkeerd
		local is_capital = contains(capital_ids, id)
		if is_capital then
			table_name = '\'\'\'' .. table_name .. '\'\'\''
		end

		--Gegevens over de kern worden opgeslagen in een table
		rows[k] = {name=name, table_name=table_name, id=id, population=population, population_with_source=population_with_source, population_date=population_date, is_capital=is_capital}

		--De som van alle inwoneraantallen wordt berekend
		total_population_sum = total_population_sum + (population ~= nil and tonumber(population:gsub('%.', ''), 10) or 0)
	end

	--De table wordt gesorteerd op alfabetische volgorde van kernnamen, waarbij de hoofdplaatsen bovenaan staan (alfabetisch gesorteerd indien meer dan één)
	table.sort(rows, compare_rows)

	--De tabel wordt gemaakt met de gegevens uit de table "rows". Merk op dat hier "row.population_with_source" wordt gebruikt, het inwoneraantal mét bron erachter
	for k, row in pairs(rows) do
		result = result .. '\n|-\n|' .. row.table_name .. '||' .. (row.population ~= '' and row.population_with_source or '?') .. '||' .. (row.population_date ~= nil and row.population_date)
	end

	--Als de som van de inwoneraantallen niet gelijk is aan de waarde gegeven op Wikidata, wordt het verschil toegevoegd aan de tabel als "Overig"
	local population_difference = total_population_wd - total_population_sum
	if population_difference ~= 0 then
		result = result .. '\n|-\n|Overig||' .. format_thousand(population_difference) .. '||'
	end

	--Het totale inwoneraantal van de gemeente uit Wikidata wordt onderaan de tabel gezet. Merk op dat hier "total_population_wd_with_source" wordt gebruikt, het inwoneraantal mét bron erachter
	local total_population_wd_date = frame:expandTemplate{ title = 'Inwonertal', args = {id=municipality_id, soort='datum'} }
	local total_population_wd_with_source = frame:expandTemplate{ title = 'Inwonertal', args = {id=municipality_id} }
	result = '{| class="wikitable sortable"\n|-\n!Kern!!Inwoneraantal!!Peildatum' .. result .. '\n|-\n|Totaal:||' .. total_population_wd_with_source .. '||' .. (total_population_wd_date ~= nil and total_population_wd_date) .. '\n|}'

	--Het resultaat wordt geretourneerd
	return result
end

--Functie "contains", kijkt of een table een bepaalde waarde bevat
function contains(tab, val)
	for index, value in pairs(tab) do
		if value == val then
			return true
		end
	end
	return false
end

--Functie "compare_rows", retourneert welke rij boven en welke onder de andere staat: op alfabetische volgorde van kernnamen, waarbij de hoofdplaatsen bovenaan staan (alfabetisch gesorteerd indien meer dan één)
function compare_rows(a, b)
	return a.is_capital and not b.is_capital
	--[[WAAROM WERKT DIT NIET :(
	return a.is_capital and not b.is_capital or a.name <= b.name]]
end

--Functie "format_thousand", voegt scheidingstekens voor duizendtallen (punten) toe aan een getal
--Credits: remiX (04-01-2013), van http://www.computercraft.info/forums2/index.php?/topic/8065-lua-thousand-separator/
function format_thousand(v)
	local s = string.format("%d", math.floor(v))
	local pos = string.len(s) % 3
	if pos == 0 then pos = 3 end
	return string.sub(s, 1, pos) .. string.gsub(string.sub(s, pos+1), "(...)", ".%1")
end

return p

--Buiten gebruik gesteld, vervangen door tabelwaarde "Overig"
--Als de som van de inwoneraantallen niet gelijk is aan de waarde gegeven op Wikidata, wordt een foutmelding getoond
--if total_population_wd ~= total_population_sum then
--	error = frame:expandTemplate{ title = 'Tekstkleur', args = {'red', '\nDe optelsom van de inwoneraantallen komt niet overeen met '.. format_thousand(total_population_wd) .. ', het aantal gegeven op [[:d:' .. municipality_id .. '#P1082|Wikidata]]!'} }
--	result = result .. error
--end