Modulo:WLM

Da Wikipedia, l'enciclopedia libera.
Vai alla navigazione Vai alla ricerca
-- Modulo per gestire le liste di monumenti di Wiki Loves Monuments

require('strict')

local getArgs = require('Module:Arguments').getArgs
local mWikidata = require('Modulo:Wikidata')

local p = {}

local root_category = 'Images from Wiki Loves Monuments 2023 in Italy'

-- Associa il nome della regione (come usato nelle sottopagine di
-- [[Progetto:Wiki Loves Monuments 2023/Monumenti]] con il nome (inglese)
-- usato nelle categorie su Commons e la presenza o meno di un concorso regionale
local regioni = {
    ['Abruzzo'] = {'Abruzzo', true},
    ['Basilicata'] = {'Basilicata', false},
    ['Calabria'] = {'Calabria', false},
    ['Campania'] = {'Campania', false},
    ['Emilia-Romagna'] = {'Emilia-Romagna', false},
    ['Friuli-Venezia Giulia'] = {'Friuli-Venezia Giulia', true},
    ['Lazio'] = {'Lazio', false},
    ['Liguria'] = {'Liguria', true},
    ['Lombardia'] = {'Lombardy', true},
    ['Marche'] = {'Marche', true},
    ['Molise'] = {'Molise', false},
    ['Piemonte'] = {'Piedmont', true},
    ['Puglia'] = {'Apulia', true},
    ['Sardegna'] = {'Sardinia', false},
    ['Sicilia'] = {'Sicily', false},
    ['Toscana'] = {'Tuscany', true}, 
    ['Trentino-Alto Adige'] = {'Trentino-South Tyrol', false},
    ['Umbria'] = {'Umbria', true},
    ['Valle d\'Aosta'] = {'Aosta Valley', true},
    ['Veneto'] = {'Veneto', false},
}

-- Monumenti nelle province di Como e Lecco che non partecipano al concorso
-- locale del lago di Como
local lakecomo_exclude = {
	'Q28375375', -- Faro Voltiano (Brunate)
	'Q24937411', -- Fontana di Camerlata (Como)
	'Q21592570', -- The Life Electric (Como)
	'Q3862651', -- Monumento ai caduti (Como)
	'Q3517634', -- Tempio voltiano (Como)
	'Q24052892', -- Via Crucis (Esino Lario)
	'Q533156' -- Villa Carlotta (Tremezzina)
}

-- Comuni da includere nel concorso locale Valle del primo presepe
local primopresepe_include = {
    'Q223423', -- Accumoli
    'Q223427', -- Amatrice
    'Q223434', -- Antrodoco
    'Q223459', -- Borbona
    'Q223472', -- Borgo Velino
    'Q223476', -- Cantalice
    'Q223509', -- Castel S. Angelo
    'Q224039', -- Cittaducale
    'Q224043', -- Cittareale
    'Q118085', -- Colli sul Velino
    'Q224109', -- Contigliano
    'Q224144', -- Greccio
    'Q224149', -- Labro
    'Q224172', -- Leonessa
    'Q224211', -- Micigliano
    'Q224264', -- Morro Reatino
    'Q224300', -- Poggio Bustone
    'Q224333', -- Posta
    'Q13396',  -- Rieti
    'Q224405'  -- Rivodutri
}

local function titleparts(inputstr)
    local t = {}
    for str in mw.ustring.gmatch(inputstr, "([^/]+)") do
        table.insert(t, str)
    end
    return t
end

-- Restituisce il valore della proprietà P361 (parte di), purché sia istanza del tipo specificato
local function part_of_type(qid, part_type)
	local statements = mWikidata._getProperty({ 'P361', from = qid, formatting = 'raw' }, true)
	if statements then
		for _, statement in ipairs(statements) do
            if mWikidata._instanceOf({part_type, from = statement}) then
                return statement
            end
		end 
    end
end

-- Verifica se le immagini da caricare per questo elemento devono essere viste.
local function is_municipality(qid)
	-- Sì quando si tratta di comuni o comuni sparsi
	return mWikidata._instanceOf({'Q747074', from = qid}) or mWikidata._instanceOf({'Q954172', from = qid})
end

-- Verifica se si tratta di un albero monumentale.
local function is_tree(qid)
	return mWikidata._instanceOf({'Q811534', from = qid})
end

-- Verifica se si tratta di un edificio religioso patrocinato (P8001) dal Dicastero per la cultura.
-- Nota: possono esserci 0 , 1 , n patrocinatori. Nel primo caso enti vale nil dopo la chiamata a Wikidata.
local function is_religiousbuilding(qid) 
       local enti     = mWikidata._getQualifier( { 'P2186', 'P8001', from = qid } )
       if enti then 
--             return string.match( enti, 'Dicastero per la cultura') == 'Dicastero per la cultura'
             return true
       else
       	     return false
       end
end

-- Se il monumento ha una categoria associata, restituisce quella.
-- Altrimenti, quella di un'area più vasta, come il comune di appartenenza.
local function get_main_category(qid, comcat)
	-- La categoria associata su Wikidata o, in assenza, passata come parametro
	local category = mWikidata._getProperty({'P373', from = qid, snaktype = 'value'}) or comcat
    if category then
    	if is_municipality(qid) then
    		return {category, 'Foto del comune'}
    	else
			return {category, 'Foto del monumento'}
		end
	end
	-- Scavi archeologici di Ercolano
	if mWikidata._propertyHasEntity('P361', {'Q178813', from = qid}) then
		category = mWikidata._getProperty({'P373', from = 'Q178813', snaktype = 'value'})
		return {category, 'Foto dell\'area archeologica'}
	end
	-- Scavi archeologici di Pompei
    local insula = part_of_type(qid, 'Q26960982')
    if insula then
    	category = mWikidata._getProperty({'P373', from = insula, snaktype = 'value'})
    	if not category then
	        local regio = part_of_type(insula, 'Q26912005')
		    if regio then
    			category = mWikidata._getProperty({'P373', from = regio, snaktype = 'value'})
			end
    	end
		if category then
			return {category, 'Foto dell\'area archeologica'}
		end
    end
	-- luogo (P276)
	category = mWikidata._getProperty({'P276', from = qid, showprop = 'P373', snaktype = 'value'})
	if not category or category == '' then
		-- unità amministrativa in cui è situato (P131)
		category = mWikidata._getProperty({'P131', from = qid, showprop = 'P373', snaktype = 'value'})
	end
	return {category, 'Foto nel comune'}
end

function p.main_category(frame)
	local args = getArgs(frame)
	local cat = get_main_category(args[1], args.comcat)
	return '[[c:Category:' .. cat[1] .. '|' .. cat[2] .. ']]'
end

-- Restituisce la lista di categorie in cui tutte le foto del monumento
-- devono essere caricate.
-- Argomenti:
--  1: l'id Q del monumento
--  comcat: categoria aggiuntiva da inserire
function p._categories(args)
	local qid = args[1]
	local categories = {}
	local concorsosubregionale = false
        local edificioreligioso = false

-- Parsing del titolo della pagina per "localizzare" il monumento
-- Casistica pagine concorsi subregionali: Progetto:Wiki Loves Monuments 2022/EDIZIONELOCALE/qualcosa_se_serve
-- Casistica pagine concorsi regionale e nazionale: Progetto:Wiki_Loves_Monuments_2022/Monumenti/REGIONE/PROVINCIA/qualcosa_se_serve
    local tp = titleparts(mw.title.getCurrentTitle().fullText)
    local edizionelocale = tp[2]
    local regione = tp[3]
    local provincia = tp[4]
    
    -- categoria principale
	table.insert(categories, get_main_category(qid, args.comcat)[1])

    -- alberi monumentali
	if is_tree(qid) then
		table.insert(categories, root_category .. ' - veteran trees')
	end

    -- viste
	if is_municipality(qid) then
		table.insert(categories, root_category .. ' - cityscapes')
	end

    -- edificioreligioso (memorizza il risultato del test per usarlo anche per la classificazione regionale piu avanti)
	if is_religiousbuilding(qid) then
		table.insert(categories, root_category .. ' - religious buildings')
                edificioreligioso = true  
        else
		table.insert(categories, root_category .. ' - traditional contest')
	end

    -- Wiki Loves Lake Como (lo identica tramite la provincia in 4' posizione nelle pagine del concorso nazionale o il nome in 2' posizione nelle pagine del concorso locale.)

    if provincia == 'Provincia di Como' or provincia == 'Provincia di Lecco' or edizionelocale == "Lake Como" then
        concorsosubregionale = true
        for _, x in pairs(lakecomo_exclude) do
        	if qid == x then
        		concorsosubregionale = false
        	end
        end
		if concorsosubregionale then
        	table.insert(categories, root_category .. ' - Lake Como')
		end
    end

    -- Wiki Loves Avellino (lo identica tramite la provincia in 4' posizione nelle pagine del concorso nazionale o il nome in 2' posizione nelle pagine del concorso locale.)

    if provincia == 'Provincia di Avellino' or edizionelocale == "Avellino" then
        concorsosubregionale = true
        table.insert(categories, root_category .. ' - Avellino')
    end
    
    -- Wiki Loves Valle del Primo Presepe
    if provincia == 'Provincia di Rieti' or edizionelocale == "Valle del Primo Presepe" then
        for _, x in pairs(primopresepe_include) do
        	local municipality = mWikidata._getProperty({'P131', from = qid, snaktype = 'value', n = 1, formatting = 'raw'})
        	if qid == x or municipality == x then
        		concorsosubregionale = true
                        table.insert(categories, root_category .. ' - Valle del Primo Presepe')
        		break
        	end
        end
    end

    -- foto per regione (se il Modulo è invocato dalle pagine di un'edizione locale, imposta la regione in modo forzoso)
    if edizionelocale == "Lake Como" then regione = "Lombardia" end
    if edizionelocale == "Avellino" then regione = "Campania" end
    if edizionelocale == "Valle del Primo Presepe" then regione = "Lazio" end
    if regioni[regione] then
        if edificioreligioso then
            table.insert(categories, root_category .. ' - ' .. regioni[regione][1] .. ' - religious buildings')
        else
            table.insert(categories, root_category .. ' - ' .. regioni[regione][1])
        end
        if not regioni[regione][2] and not concorsosubregionale then
            table.insert(categories, root_category .. ' - without local award')
        end
    else
        table.insert(categories, root_category .. ' - unknown region')
    end

	return categories
end

function p.categories(frame)
	local args = getArgs(frame)
	return table.concat(p._categories(args), '|')
end

-- Genera l'URL per il caricamento di un'immagine
function p._upload_url(qid, comcat)
    local parameters = {}
    parameters['campaign'] = 'wlm-it'
    parameters['uselang'] = 'it'
    parameters['descriptionlang'] = 'it'
    parameters['id'] = mWikidata._getProperty({'P2186', from = qid, n = 1, snaktype = 'value'})
    parameters['description'] = mWikidata._getLabel({qid})
    if not is_municipality(qid) then
	    parameters['lat'] = mWikidata._getProperty({'P625', from = qid, n = 1, coord = 'latitude', snaktype = 'value'})
    	parameters['lon'] = mWikidata._getProperty({'P625', from = qid, n = 1, coord = 'longitude', snaktype = 'value'})
    end
    parameters['categories'] = table.concat(p._categories({qid, comcat = comcat}), '|')
    return mw.uri.fullUrl('c:Special:UploadWizard', parameters)
end

function p.upload_url(frame)
	local args = getArgs(frame)
	return p._upload_url(args[1], args['comcat'])
end

-- Genera l'immagine di esempio da mostrare nelle liste
function p._image(qid)
	local image
	if is_municipality(qid) then
		image = mWikidata._getProperty({'P4291', from = qid, n = 1, snaktype = 'value'})
		if image == nil then
			image = mWikidata._getProperty({'P8592', from = qid, n = 1, snaktype = 'value'})
		end
		if image == nil then
			image = 'Italian traffic signs - città.svg'
		end
	else
		image = mWikidata._getProperty({'P18', from = qid, n = 1, snaktype = 'value'})
		if image == nil then
			if is_tree(qid) then
				image = 'Maki-park-11.svg'
			else
				if is_religiousbuilding(qid) then
				    image = 'BSicon_ARCH2.svg'
			    else
				    image = 'BSicon_CITY.svg'	
				end
			end
		end
	end
	
	return '[[File:' .. image .. '|128px|centro]]'
end

function p.image(frame)
	local args = getArgs(frame)
	return p._image(args[1])
end

return p