Modul:Wikidata/Medals

Vikipediya saytından
Naviqasiyaya keç Axtarışa keç

Bu modulun sənədləşdirmə səhifəsi Modul:Wikidata/Medals/doc səhifəsində yaradıla bilər

local WDS = require('Module:WikidataSelectors')
local moduleDate = require('Module:Wikidata/date')
local awardsOrder = mw.ext.data.get("Wikidata/awards order.tab")
local p = {}

local config = {
    -- Bura həm medalı, həm də fəxri adı olan Vikiverilənlər elementləri
    -- İkisi də əlavə edildikdə həmin mükafatın iki dəfə göstərilməsinin qarşısını alır
    absorption = {
        Q16675272 = 'Q654471', -- "Qızıl ulduz" medalı = RF Qəhrəmanı
        Q16481808 = 'Q8706404', -- "RF Əmək Qəhrəmanı" medalı = RF Əmək Qəhrəmanı
        Q1948730 = 'Q178473', -- "Qızıl Ulduz" medalı (SSRİ) = Sovet İttifaqı Qəhrəmanı
        Q1980962 = 'Q208167', -- "Oraq və Çəkic" medalı = Sosialist Əməyi Qəhrəmanı
        Q2032399 = 'Q2046996', -- "Qızıl ulduz" medalı = Azərbaycanın Milli Qəhrəmanı
        Q102183407 = 'Q103819965', -- "Vətən Müharibəsi Qəhrəmanı" medalı = Vətən Müharibəsi Qəhrəmanı
        Q1262166 = 'Q80589', -- "Xalq Qəhrəmanı" ordeni = Yuqoslaviyanın Xalq Qəhrəmanı
        Q749849 = 'Q1358055', -- "Qızıl ulduz" ordeni = Ukrayna Qəhrəmanı
        Q4335914 = 'Q1358055', -- "Dövlət" ordeni = Ukrayna Qəhrəmanı
        Q4287121 = 'Q4137462', -- "Altın ay" medalı = Türkmənistan Qəhrəmanı
    }
}

-- Həm piktoqramı (P2910), həm də lenti (P2425) olan mükafatlarda piktoqramı əsas götürülənlər:
local prioritizeP2910 = {
    "Q2046996",  -- Azərbaycanın Milli Qəhrəmanı
    "Q1358055",  -- Ukrayna Qəhrəmanı
    "Q28975206",  -- 3-cü dərəcəli "Şaxtaçı şöhrəti" döş nişanı
    "Q28975205",  -- 2-ci dərəcəli "Şaxtaçı şöhrəti" döş nişanı
    "Q28975203",  -- 1-ci dərəcəli "Şaxtaçı şöhrəti" döş nişanı
}

local function getImageFromClaims(claims, property)
    local imageClaims = WDS.filter(claims, property)
    if imageClaims and #imageClaims then
        for i, claim in pairs(imageClaims) do
            if claim.type == 'statement' and claim.mainsnak.snaktype == 'value' then
                return claim.mainsnak.datavalue.value
            end
        end
    end
    return nil
end

local function isPrioritizedQItem(entityId)
    for _, qItem in ipairs(prioritizeP2910) do
        if entityId == qItem then
            return true
        end
    end
    return false
end

local function getPrioritizedImage(entity)
    local claims = entity.claims
    local image, size, border = nil, 'x15px', false
    local entityId = entity.id

    if isPrioritizedQItem(entityId) then
        image = getImageFromClaims(claims, 'P2910')
        if image then
            size = 'x37px'
        else
            image = getImageFromClaims(claims, 'P2425')
            if image then
                border = true
            end
        end
    else
        image = getImageFromClaims(claims, 'P2425')
        if image then
            border = true
        else
            image = getImageFromClaims(claims, 'P2910')
            if image then
                size = 'x37px'
            end
        end
    end

    return image, size, border
end

function p.formatProperty(context, options)
    if not context then error('context not specified'); end
    if not options then error('options not specified'); end
    if not options.entity then error('options.entity missing'); end

    local claims
    if options.property then
        claims = context.selectClaims(options, options.property)
    end
    if claims == nil then
        return ''
    end

    local formattedData = {}

    for i, claim in ipairs(claims) do
        if claim.mainsnak and claim.mainsnak.datavalue and claim.mainsnak.datavalue.type == 'wikibase-entityid' then
            local valueId = claim.mainsnak.datavalue.value.id
            local formattedStatement = context.formatStatement(options, claim)
            if formattedStatement and formattedStatement ~= '' then
                formattedStatement = '<span class="wikidata-claim" data-wikidata-property-id="' .. string.upper(options.property) .. '" data-wikidata-claim-id="' .. claim.id .. '">' .. formattedStatement .. '</span>'
                table.insert(formattedData, {
                    id = valueId,
                    html = formattedStatement,
                })
            end
        end
    end

    for i, awardData in ipairs(formattedData) do
        local isAbsorptionFound = false
        if config.absorption[awardData.id] then
            local absorptionAwardId = config.absorption[awardData.id]
            for _, absorptionAwardData in ipairs(formattedData) do
                if absorptionAwardData.id == absorptionAwardId then
                    isAbsorptionFound = true
                    break
                end
            end
        end
        if isAbsorptionFound then
            table.remove(formattedData, i)
        end
    end
    
    local orderedData = {}
    local lastValue
    
    if type(awardsOrder) == 'table' then
        for i, awardFields in ipairs(awardsOrder.data) do
            local awardOrder = awardFields[1]
            if awardOrder == '-' then
                if lastValue ~= '-' then
                    table.insert(orderedData, '<br>')
                    lastHeight = nil
                end
            else
                for k, awardData in ipairs(formattedData) do
                    if awardOrder == awardData.id and not awardData.used then
                        table.insert(orderedData, awardData.html)
                        formattedData[k].used = true
                    end
                end
            end
        end
    end

    for i, awardData in ipairs(formattedData) do
        if not awardData.used then
            table.insert(orderedData, awardData.html)
        end
    end

    local lastHeight
    for i, awardHtml in ipairs(orderedData) do
        local height = mw.ustring.match(awardHtml, 'x%d+px')
        if height and lastHeight and height ~= lastHeight then
            table.insert(orderedData, i, '<br>')
        end
        lastHeight = height
    end

    local out = mw.text.listToText(orderedData, options.separator, options.conjunction)
    if out ~= '' then
        if options.before then
            out = options.before .. out
        end
        if options.after then
            out = out .. options.after
        end
    end

    return out
end

function p.getImageFromEntity(entityOrId, actualDate)
    local entity = type(entityOrId) == "string" and mw.wikibase.getEntity(entityOrId) or entityOrId

    local image, size, border = getPrioritizedImage(entity)

    return image, size, border
end

function p.formatValue(context, options, statement)
    local entityId = statement.id
    if not entityId then
        return statement
    end

    local entity = mw.wikibase.getEntity(entityId)
    local label = entity:getLabel()
    
    local image, size, border = p.getImageFromEntity(entity)

    local recipientCategory = ''
    if not options.nocat and options.nocat ~= '' then
        recipientCategory = context.extractCategory({ category = 'P7084[P4224:Q24571879]' }, entity)
        if recipientCategory == '' then
            recipientCategory = context.extractCategory({ category = 'P2517' }, entity)
        end
    end

    if options.qualifiers then
        
        if options.qualifiers.P27 then
            for _, claim in ipairs(options.qualifiers.P27) do
                if claim and claim.datavalue and claim.datavalue.value and claim.datavalue.value.id then
                    recipientCategory = recipientCategory .. context.extractCategory(
                        { category = 'P7084[P27:' .. claim.datavalue.value.id .. ']' }, entity)
                end
            end 
        end
    end

    if image then
        local link = mw.wikibase.getSitelink(entityId)
        local out = '[[Fayl:' .. image
        if border == true then
            out = out .. '|border'
        end
        out = out .. '|' .. size .. '|link='

        if not link then
            local partOfClaims = WDS.filter(entity.claims, 'P361')
            if not partOfClaims or #partOfClaims == 0 then
                partOfClaims = WDS.filter(entity.claims, 'P279')
            end
            if partOfClaims and #partOfClaims then
                for i, claim in pairs(partOfClaims) do
                    if claim.type == 'statement' and claim.mainsnak.snaktype == 'value' then
                        link = mw.wikibase.getSitelink(claim.mainsnak.datavalue.value.id)
                        if link then
                            break
                        end
                    end
                end
            end
        end
        
        if link then
            out = out .. link .. '|' .. label
        else
            out = out .. 'd:' .. entityId
        end
        if label then
            out = out .. '|' .. label
        end
        out = out .. ']]'
        out = out .. recipientCategory

        return out
    else
        return nil
    end

    local out = context.formatValueDefault(context, options, statement)
    if out and out ~= '' then
        return '<span style="display:inline-block; text-align:left">' .. out .. recipientCategory .. '</span>'
    end
    
    return ''
end

return p