Modül:Türkiye nüfus

Modül belgelemesi[oluştur]
local p = {}

-- Helper function to fetch populations from Wikidata
local function fetchPopulations(entity)
    local claims = mw.wikibase.getAllStatements(entity, 'P1082')
    if not claims then
        return {}, {}, {}, {}, false, false
    end

    local populations = {}
    local ruralPopulations = {}
    local urbanPopulations = {}
    local determinationMethods = {}
    local hasRural = false
    local hasUrban = false

    for _, statement in ipairs(claims) do
        local qualifiers = statement.qualifiers and statement.qualifiers.P585
        if qualifiers then
            for _, qualifier in ipairs(qualifiers) do
                local time = qualifier.datavalue and qualifier.datavalue.value and qualifier.datavalue.value.time
                if time then
                    local year = tonumber(mw.ustring.match(time, "%d+"))
                    local value = statement.mainsnak and statement.mainsnak.datavalue and statement.mainsnak.datavalue.value
                    if value then
                        populations[year] = tonumber(value.amount)
                        
                        -- Fetch rural and urban populations
                        local ruralQualifier = statement.qualifiers.P6344
                        if ruralQualifier then
                            ruralPopulations[year] = tonumber(ruralQualifier[1].datavalue.value.amount)
                            hasRural = true
                        end
                        local urbanQualifier = statement.qualifiers.P6343
                        if urbanQualifier then
                            urbanPopulations[year] = tonumber(urbanQualifier[1].datavalue.value.amount)
                            hasUrban = true
                        end

                        -- Fetch determination method
                        local methodQualifier = statement.qualifiers.P459
                        if methodQualifier then
                            local methodId = methodQualifier[1].datavalue and methodQualifier[1].datavalue.value and methodQualifier[1].datavalue.value.id
                            if methodId then
                                local methodLabel = mw.wikibase.getLabel(methodId)
                                determinationMethods[year] = methodLabel
                            end
                        end
                    end
                end
            end
        end
    end

    -- Sort years
    local sortedYears = {}
    for year in pairs(populations) do
        table.insert(sortedYears, year)
    end
    table.sort(sortedYears)

    return sortedYears, populations, ruralPopulations, urbanPopulations, determinationMethods, hasRural, hasUrban
end

-- Helper function to format numbers
local function formatNumber(num)
    return mw.language.getContentLanguage():formatNum(num)
end

-- Helper function to calculate percentage change
local function calculateChange(current, previous)
    if not current or not previous then
        return ''
    end
    local change = ((current - previous) / previous) * 100
    local changeIcon = change >= 0 and '[[File:Dark Green Arrow Up.svg|11px|link=]]' or '[[File:Red Arrow Down.svg|11px|link=]]'
    return string.format('%s %d%%', changeIcon, math.floor(math.abs(change) + 0.5))
end

-- Helper function to generate year link
local function generateYearLink(year)
    local pageTitle
    if year >= 2007 then
        pageTitle = string.format('%d Türkiye adrese dayalı nüfus kayıt sistemi sonuçları', year)
    else
        pageTitle = string.format('%d Türkiye nüfus sayımı', year)
    end
    
    local title = mw.title.new(pageTitle)
    if title and title.exists then
        return string.format('[[%s|%d]]', pageTitle, year)
    else
        return tostring(year)
    end
end

-- Helper function to generate determination method link
local function generateMethodLink(method, isFirstADNKS, isFirstCensus)
    if method == "Adrese Dayalı Nüfus Kayıt Sistemi" then
        if isFirstADNKS then
            return '[[Adrese Dayalı Nüfus Kayıt Sistemi|ADNKS]]'
        else
            return 'ADNKS'
        end
    elseif method == "Türkiye'de genel nüfus sayımı" then
        if isFirstCensus then
            return '[[Türkiye\'de genel nüfus sayımı|Genel nüfus sayımı]]'
        else
            return 'Genel nüfus sayımı'
        end
    else
        return method
    end
end

-- Eksik yılları kontrol eden fonksiyon
local function checkMissingYears(sortedYears)
    if #sortedYears == 0 then
        return true -- Hiç yıl yoksa eksiklik var demektir.
    end

    for i = sortedYears[1], sortedYears[#sortedYears] do
        if not mw.ustring.find(table.concat(sortedYears, " "), tostring(i)) then
            return true -- Bir yıl eksikse eksiklik var demektir.
        end
    end

    return false -- Eğer hiçbir yıl eksik değilse eksiklik yok.
end

-- Main function to generate the table
function p.populationTable(frame)
    local entity = frame.args.entity or mw.wikibase.getEntityIdForCurrentPage()
    if not entity then
        return "'''Bu şablon yalnızca Vikiveri'de nüfus değeri girilmiş maddelerde kullanılabilir.'''"
    end

    local sortedYears, populations, ruralPopulations, urbanPopulations, determinationMethods, hasRural, hasUrban = fetchPopulations(entity)
    local rows = {}
    local previousPopulation
    local isFirstADNKS = true
    local isFirstCensus = true

    table.insert(rows, '{| class="wikitable sortable" style="font-size:0.90em; text-align:center;"')
    table.insert(rows, '! style="padding-left:15px;padding-right:15px;" | Yıl')
    table.insert(rows, '! style="padding-left:15px;padding-right:15px;" | Değişim')
    table.insert(rows, '! style="padding-left:15px;padding-right:15px;" | Nüfus')

    if hasRural or hasUrban then
        table.insert(rows, '! style="padding-left:15px;padding-right:15px;" | Kırsal Nüfus')
        table.insert(rows, '! style="padding-left:15px;padding-right:15px;" | Kentsel Nüfus')
    end
    
    table.insert(rows, '! style="padding-left:15px;padding-right:15px;" | Tespit Yöntemi')

    for _, year in ipairs(sortedYears) do
        local population = populations[year]
        local ruralPopulation = ruralPopulations[year]
        local urbanPopulation = urbanPopulations[year]
        local determinationMethod = determinationMethods[year]

        if population then
            local change = calculateChange(population, previousPopulation)
            local yearLink = generateYearLink(year)
            local methodDisplay = determinationMethod and generateMethodLink(determinationMethod, isFirstADNKS, isFirstCensus) or '<span style="color: grey;">Veri yok</span>'
            
            if determinationMethod == "Adrese Dayalı Nüfus Kayıt Sistemi" then
                isFirstADNKS = false
            end

            if determinationMethod == "Türkiye'de genel nüfus sayımı" then
                isFirstCensus = false
            end

            local row = string.format('|-\n| %s || %s || %s', yearLink, change, formatNumber(population))
            
            if hasRural or hasUrban then
                local ruralDisplay = ruralPopulation and formatNumber(ruralPopulation) or '<span style="color: grey;">Veri yok</span>'
                local urbanDisplay = urbanPopulation and formatNumber(urbanPopulation) or '<span style="color: grey;">Veri yok</span>'
                row = row .. string.format(' || %s || %s', ruralDisplay, urbanDisplay)
            end
            
            row = row .. string.format(' || %s', methodDisplay)
            
            table.insert(rows, row)
            previousPopulation = population
        end
    end

    table.insert(rows, '|}')

    -- Eksik yılları kontrol et ve kategori ekle
    if checkMissingYears(sortedYears) then
        table.insert(rows, '[[Kategori:Vikiveri\'de nüfus değeri eksik maddeler]]')
    end

    return table.concat(rows, '\n')
end

return p