T400318 Create a new parameter to choose a preferred image (original) (raw)

Comment Actions

Original code is at the bottom here in wikidata: https://www.wikidata.org/wiki/Module:Databox

New template code, for review:
{{#invoke:Databox|databox|useImage={{{useImage|}}}}}

New module code, for review:

-- A more extensive version is stored and documented at the Swedish Wikipedia site, sv.wikipedia.org/wiki/Modul:Databox -- It is supposed to work for any language.

local property_blacklist = { 'P360', --is a list of 'P4224', --category contains 'P935', -- Commons gallery 'P1472', -- Commons Creator page 'P1612', -- Commons Institution page 'P373', -- Commons category 'P3722', -- Commons maps category 'P1151', -- topic's main Wikimedia portal 'P1424', -- topic's main template 'P910', -- topic's main category 'P1200', -- bodies of water basin category 'P1792', -- category of associated people 'P1464', -- category for people born here 'P1465', -- category for people who died here 'P1791', -- category of people buried here 'P1740', -- category for films shot at this location 'P2033', -- Category for pictures taken with camera 'P2517', -- category for recipients of this award 'P4195', -- category for employees of the organization 'P1754', -- category related to list 'P301', -- category's main topic 'P971', -- category combines topics 'P3876', -- category for alumni of educational institution 'P1753', -- list related to category 'P3921', -- Wikidata SPARQL query equivalent 'P1204', -- Wikimedia portal's main topic 'P1423', -- template's main topic 'P1709', -- equivalent class 'P3950', -- narrower external class 'P2888', -- exact match 'P1382', -- coincident with 'P527', -- has part 'P2670', -- has parts of the class 'P3113', -- does not have part 'P2737', -- union of 'P2738', -- disjoint union of 'P2445', -- metasubclass of 'P1963', -- properties for this type 'P3176', -- uses property 'P1889', -- different from 'P460', -- said to be the same as 'P2959', -- permanent duplicated item 'P2860', -- cites 'P5125', -- wikimedia outline 'P5008', -- on focus list of Wikimedia project 'P2559', -- Wikidata usage instructions 'P1343', -- described by source 'P972', -- catalogu 'P1282', -- OSM tag or key 'P4839', -- Wolfram Language entity code 'P6104', -- Maintained by Wikiproject 'P5996' -- Category for films in this language }

function valuesToKeys(array) local result = {} for _, v in pairs(array) do result[v] = true end return result end

local p = {}

function p.databox(frame) local args = frame:getParent().args local argsLocal = frame.args

local itemId = nil
if args.item then
    itemId = args.item
end

local argsLocal = frame.args
local useImage = nil
if argsLocal.useImage then
    useImage = argsLocal["useImage"]
end

local lang = mw.language.getContentLanguage()
local item = mw.wikibase.getEntity(itemId)

if item == nil then
    mw.addWarning("Wikidata item not found")
    return ""
end

local databoxRoot = mw.html.create('div')
    :addClass('infobox')
    :css({
        float = 'right',
        border = '1px solid #aaa',
        ['max-width'] = '300px',
        padding = '0 0.4em',
        margin = '0 0 0.4em 0.4em',
    })

--Title
databoxRoot:tag('div')
    :css({
        ['text-align'] = 'center',
        ['background-color'] = '#f5f5f5',
        padding = '0.5em 0',
        margin = '0.5em 0',
        ['font-size'] = '120%',
        ['font-weight'] = 'bold',
    })
    :wikitext(item:getLabel() or mw.title.getCurrentTitle().text)

--Image
local databoxImage = nil
if useImage and useImage ~= "" then
    local allWikidataImages = item:getAllStatements('P6')
    if #allWikidataImages >= 1 then
        for _, image in ipairs( allWikidataImages ) do
            if image.mainsnak.datavalue.value == useImage then
                databoxImage = useImage
                break
            end
        end
    end
end
if databoxImage == nil then
    local bestWikidataImages = item:getBestStatements('P6')
    if #bestWikidataImages >= 1 then
        databoxImage = bestWikidataImages[1].mainsnak.datavalue.value
    end
end

if databoxImage then
    databoxRoot
        :tag('div')
        :wikitext('[[File:' .. databoxImage .. '|frameless|300px]]')
end

--Table
local dataTable = databoxRoot
    :tag('table')
    :css({
        ['text-align'] = 'left',
        ['font-size'] = '90%',
        ['word-break'] = 'break-word',
        ['width'] = '100%',
        ['table-layout'] = 'fixed',
    })

dataTable:tag('caption')
         :css({
             ['background-color'] = '#f5f5f5',
             ['font-weight'] = 'bold',
             ['margin-top'] = '0.2em',
         })
         :wikitext(item:formatStatements('P31').value)

local properties = mw.wikibase.orderProperties(item:getProperties())
local property_blacklist_hash = valuesToKeys(property_blacklist)
property_blacklist_hash['P31'] = true --Special property

local edit_message = mw.message.new('vector-view-edit'):plain()
for _, property in pairs(properties) do
    local datatype = item.claims[property][1].mainsnak.datatype
    local valueCount = #item:getBestStatements(property)
    if datatype ~= 'commonsMedia' and datatype ~= 'external-id' and datatype ~= 'quantity' and datatype ~= 'wikibase-property' and datatype ~= 'geo-shape' and datatype ~= 'tabular-data' and not property_blacklist_hash[property] and valueCount > 0 and valueCount <= 5 then
        local propertyValue = item:formatStatements(property)
        dataTable:tag('tr')
            :tag('th')
                :attr('scope', 'row')
                :wikitext(lang:ucfirst(propertyValue.label)):done()
            :tag('td')
                :wikitext(frame:preprocess(propertyValue.value))
                :wikitext('&nbsp;[[File:OOjs UI icon edit-ltr.svg|' .. edit_message .. '|12px|baseline|class=noviewer|link=https://www.wikidata.org/wiki/' .. item.id .. '#' .. property .. ']]')
    end
end

 --Map
local coordinates_statements = item:getBestStatements('P625')
if #coordinates_statements >= 1 and coordinates_statements[1].mainsnak.datavalue and coordinates_statements[1].mainsnak.datavalue.value.globe == 'http://www.wikidata.org/entity/Q2' then
    --We build the call to mapframe
    local latitude = coordinates_statements[1].mainsnak.datavalue.value.latitude
    local longitude = coordinates_statements[1].mainsnak.datavalue.value.longitude
    local geojson = {
        type = 'Feature',
        geometry = {
            type = 'Point',
            coordinates = { longitude, latitude }
        },
        properties = {
            title = item:getLabel() or mw.title.getCurrentTitle().text,
            ['marker-symbol'] = 'marker',
            ['marker-color'] =  '#224422',
        }
    }
    databoxRoot:wikitext(frame:extensionTag('mapframe', mw.text.jsonEncode(geojson), {
        height = 300,
        width = 300,
        frameless = 'frameless',
        align = 'center',
        latitude = latitude,
        longitude = longitude,
        zoom = zoom
    }))
 end

 return tostring(databoxRoot)

end

return p