Module:Gemeente in Nederland: verschil tussen versies
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 " |
--Als het argument "wikidata_id" gegeven is, wordt de Wikidata-pagina met dat ID gebruikt |
||
if args. |
if args.wikidata_id then |
||
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 |
||
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 |
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 |
--De hoofdsteden van, kernen in en het totale inwoneraantal van de gemeente worden opgehaald uit Wikidata |
||
local capitals = mw.wikibase.getBestStatements( |
local capitals = mw.wikibase.getBestStatements(municipality_id, 'P36') |
||
local settlements = mw.wikibase.getBestStatements( |
local settlements = mw.wikibase.getBestStatements(municipality_id, 'P1383') |
||
local total_population_wd = tonumber(mw.wikibase.getBestStatements( |
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 |
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 |
local population = frame:expandTemplate{ title = 'Inwonertal', args = {id=id, soort='waardepuur'} } |
||
local |
local population_with_source = frame:expandTemplate{ title = 'Inwonertal', args = {id=id} } |
||
local |
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 |
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 |
||
local is_capital = contains(capital_ids, id) |
|||
if is_capital then |
|||
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= |
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 + ( |
total_population_sum = total_population_sum + (population ~= nil and tonumber(population:gsub('%.', ''), 10) or 0) |
||
end |
end |
||
--De table wordt gesorteerd op |
--De table wordt gesorteerd op alfabetische volgorde van kernnamen, waarbij de hoofdplaatsen bovenaan staan (alfabetisch gesorteerd indien meer dan één) |
||
table.sort(rows, |
table.sort(rows, compare_rows) |
||
--De tabel wordt gemaakt met de gegevens uit de table "rows". Merk op dat hier "row. |
--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. |
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 |
||
⚫ | |||
⚫ | |||
local population_difference = total_population_wd - total_population_sum |
|||
⚫ | |||
if |
if population_difference ~= 0 then |
||
result = result .. '\n|-\n|Overig||' .. format_thousand(population_difference) .. '||' |
|||
⚫ | |||
⚫ | |||
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} } |
|||
⚫ | |||
--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 |
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 |
||
--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 |
|||
⚫ | |||
⚫ | |||
⚫ |
Versie van 11 jun 2022 18:34
Deze module gebruikt de volgende sjablonen: |
Deze module maakt gebruik van de Wikidata-eigenschappen:
|
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:
- Categorie:Wikipedia:Tabel woonplaatsen Nederlandse gemeente/Directe actie nodig
- Categorie:Wikipedia:Tabel woonplaatsen Nederlandse gemeente/Onjuiste peildatum
- Categorie:Wikipedia:Tabel woonplaatsen Nederlandse gemeente/Ontbrekend inwoneraantal
- Categorie:Wikipedia:Tabel woonplaatsen Nederlandse gemeente/Te veel overig
--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